1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-28 08:59:09 +00:00

Compare commits

...

94 Commits

Author SHA1 Message Date
Patric Stout
79dc634d41 Doc: Prepare for 12.0-RC1 release (#9574) 2021-09-25 15:58:41 +02:00
dP
39662aabef Add: allow gamescripts to build neutral objects (#9568) 2021-09-25 13:39:40 +02:00
translators
66c7d9b8ed Update: Translations from eints
dutch: 4 changes by Afoklala
spanish: 4 changes by MontyMontana
polish: 9 changes by pAter-exe
2021-09-24 18:48:15 +00:00
Tyler Trahan
4aa63ce8f3 Fix: Changing raw industry funding method redraws GUI (#9572) 2021-09-23 21:07:54 +02:00
Danny de Bruijne
753b1d7e15 Feature: Add selected toolbar buttons to MacBook Pro Touch Bar 2021-09-23 21:03:00 +02:00
translators
16aac9c341 Update: Translations from eints
english (us): 1 change by 2TallTyler
2021-09-23 18:48:02 +00:00
translators
909a83758c Update: Translations from eints
spanish (mexican): 8 changes by absay
portuguese (brazilian): 14 changes by Vimerum
2021-09-22 18:47:46 +00:00
translators
7c6b39e189 Update: Translations from eints
korean: 4 changes by telk5093
greek: 1 change by dionisis84
russian: 2 changes by Ln-Wolf
finnish: 1 change by hpiirai
portuguese: 1 change by azulcosta
2021-09-21 18:50:15 +00:00
translators
b5e8b36b5b Update: Translations from eints
chinese (traditional): 19 changes by benny30111
german: 3 changes by Wuzzy2
catalan: 3 changes by J0anJosep
2021-09-20 18:47:59 +00:00
SamuXarick
45edd9f326 Fix: Incorrect error messages on placing water on scenario editor (#9560)
Additionally changes the behaviour of placing sea on sea/river/canal and placing canal/river on canal to (over)build, instead of disallowing it
2021-09-19 23:14:07 +02:00
dP
31cf9e888b Add: [Network] external chat messages for remote admins (#9563) 2021-09-19 23:09:06 +02:00
Patric Stout
d9f8ed7bdf Add: [Network] On join, log the ClientID + IP + Name clearly (#9558)
Additionally, reword the disconnect to match connect / join messages.

Co-authored-by: Berbe <4251220+Berbe@users.noreply.github.com>
2021-09-19 21:52:46 +01:00
7e70ead396 Fix #9562: Handle case of invalid action2 with zero results. (#9564) 2021-09-19 21:52:08 +01:00
Patric Stout
b8f9e24189 Fix #9484: update locale currencies settings mapping (#9559) 2021-09-19 22:44:28 +02:00
translators
0babadfbe4 Update: Translations from eints
english (us): 3 changes by 2TallTyler
greek: 3 changes by dionisis84
finnish: 3 changes by hpiirai
french: 3 changes by glx22
portuguese: 4 changes by azulcosta
2021-09-19 18:47:36 +00:00
translators
28d9181d5d Update: Translations from eints
korean: 4 changes by telk5093
finnish: 4 changes by hpiirai
irish: 151 changes by temuchie
french: 11 changes by glx22
2021-09-18 18:46:53 +00:00
Patric Stout
cd03bac3dd Fix: add back 'Spectate' option to company toolbar menu (#9556)
This was removed in ce7406f88b, but people used this to quickly
mark themselves as away.

Co-authored-by: dP <dp@dpointer.org>
2021-09-18 20:27:56 +02:00
Patric Stout
7acdaaaf2f Fix: Prevent train reversing when wholly inside a train depot (#9557)
Co-authored-by: Jonathan G Rennison <j.g.rennison@gmail.com>
2021-09-18 15:56:23 +02:00
SamuXarick
18247bb3b8 Fix #9521: Don't load at just removed docks that were part of a multi-dock station (#9524) 2021-09-18 13:25:07 +02:00
SamuXarick
b335b0501c Fix: wrong error message when building canals over ship depots / locks
IsTileType() also considers ship depots and locks water. IsWaterTile() does the right thing.
2021-09-18 13:24:49 +02:00
SamuXarick
6ce74b2a1b Fix: reduce cost of building canals over objects on sea
It is not like we will drain the sea first, to put water back in it after.
Besides, the cost for draining the sea isn't calculated for all other cases either.
2021-09-18 13:24:49 +02:00
Bernard Teo
20717ededf Feature: Button to open order window from VL_SHARED_ORDERS window 2021-09-18 11:17:49 +02:00
Bernard Teo
6a6dbbaad2 Feature: Ctrl-Clicking GB_SHARED_ORDERS vehicle list opens order window 2021-09-18 11:17:49 +02:00
translators
ff6c934916 Update: Translations from eints
english (us): 4 changes by 2TallTyler
greek: 10 changes by dionisis84
german: 4 changes by MagnumSociety
dutch: 4 changes by Afoklala
spanish: 66 changes by MontyMontana
polish: 10 changes by pAter-exe
2021-09-17 18:45:40 +00:00
translators
a53c4f0fb7 Update: Translations from eints
japanese: 30 changes by scabtert
russian: 4 changes by Ln-Wolf
finnish: 4 changes by hpiirai
catalan: 4 changes by J0anJosep
portuguese: 4 changes by azulcosta
2021-09-16 18:47:49 +00:00
translators
19a6513607 Update: Translations from eints 2021-09-15 18:49:54 +00:00
SamuXarick
a57c2b073a Feature: Display icon/text whether vehicle is lost in vehicle (list) window (#9543) 2021-09-14 22:10:00 +02:00
SamuXarick
37de878129 Feature: [AI/GS] Missing water related functions and objects (#8390) 2021-09-14 22:06:55 +02:00
translators
c6035158ca Update: Translations from eints
german: 5 changes by Wuzzy2
2021-09-14 18:47:07 +00:00
translators
c8ab5e58f9 Update: Translations from eints
portuguese: 6 changes by azulcosta
2021-09-13 18:49:03 +00:00
Patric Stout
928e6a04e2 Doc: update multiplayer documentation with latest changes (#9552)
Although several places were fixed during the PR making the change,
not all made it in this document.

While at it, removed all kinds of Markdown warnings by an excessive
usage of spacebar in this document.
2021-09-12 22:26:04 +02:00
translators
d757aa7591 Update: Translations from eints
swedish: 5 changes by joeax910
finnish: 5 changes by hpiirai
latvian: 67 changes by lexuslatvia
2021-09-12 18:48:50 +00:00
Niels Martin Hansen
6bd3106681 Feature: Multiple rotating views on title screen 2021-09-12 19:46:48 +02:00
Vít Šefl
710b758b81 Fix #9241: Grove and forest tree brushes also create rainforests (#9542) 2021-09-12 08:42:24 +02:00
Charles Pigott
d4588df9f9 Fix #9527: Crash when trying to place multitile objects at map edge 2021-09-11 23:10:50 +01:00
Charles Pigott
16dca0d7bc Codechange: Object non-zero dimension check was not logically correct 2021-09-11 23:10:50 +01:00
translators
ceaff9c9f2 Update: Translations from eints
korean: 6 changes by telk5093
2021-09-11 18:48:07 +00:00
Michael Lutz
ee57afc285 Fix #9463: [Win32] Try to work around XAudio2 crashes by catching SEH exceptions.
If an exceptions is thrown during context creation, just declare the XAudio
driver as unusable. The driver logic will try to find an alternative for us.
2021-09-11 15:42:34 +02:00
Patric Stout
a8641ea44a Add: support filtering content entries for patchpacks (#9541)
This changes nothing for us, but allows patchpacks to add the
right pieces of code to start filtering content entries on patchpack
only entries.
2021-09-11 15:34:46 +02:00
translators
9e85f40733 Update: Translations from eints
spanish (mexican): 4 changes by absay
english (us): 6 changes by 2TallTyler
russian: 6 changes by Ln-Wolf
catalan: 6 changes by J0anJosep
dutch: 6 changes by Afoklala
2021-09-10 18:47:58 +00:00
translators
7107e63f8c Update: Translations from eints
korean: 6 changes by telk5093
hungarian: 34 changes by pnpBrumi
indonesian: 16 changes by dimaspaf14
latvian: 94 changes by lexuslatvia
polish: 2 changes by pAter-exe
2021-09-09 18:49:31 +00:00
Tyler Trahan
66620b497b Fix #8603: Don't give focus to text filter when opening Object GUI (#9547) 2021-09-09 18:30:03 +02:00
Jonathan G Rennison
6e3d023e69 Fix #9535: Maintain a reverse dependency map of network content (#9538)
Fixes performance issues with dependency lookup when retrieving
content list from the content server.
2021-09-09 18:06:00 +02:00
Tyler Trahan
7469f00c5b Feature: Hide block signals in GUI by default (#8688) 2021-09-05 20:22:27 +02:00
Patric Stout
f656b0ae96 Fix: use-after-free after ClientNetworkCoordinatorSocketHandler::CloseAllConnections() (#9534)
The function clears all stun-handlers. This causes all of those
objects to be destroyed.
A handler can have a pending connecter, which was only killed in
case CloseConnection() was called. This is never the case when
the object is destroyed. In result, the connecter could finish
and cause a use-after-free by calling into the (now deleted)
handler.
2021-09-05 18:17:39 +02:00
Patric Stout
9c74dc2468 Codechange: validate that all STR_NNN strings are defined and used (#9518) 2021-09-02 22:32:10 +02:00
Rubidium
92559e6f3a Fix #9388: thread unsafe use of NetworkAdminConsole/IConsolePrint 2021-09-01 22:40:44 +02:00
Patric Stout
63116bd59f Fix a2051bad: SendCmdNames only sent one name per packet (#9528) 2021-08-31 21:40:38 +02:00
Patric Stout
2c05412d72 Fix #9407: desync when founding a town nearby a station (#9526)
"stations_near" wasn't updated when founding a town near
a station. As this variable is not saved, any client joining
after the town is founded has a different value for
"stations_near", potentially causing desyncs.

As the intention of this if() statement was to skip an expensive
calculation when there are clearly no stations, better to move
that check inside the function, so other places also enjoy
the speedup.
2021-08-31 14:31:37 +02:00
Niels Martin Hansen
69e9acd702 Add: Larger size renderings of the logo/icon (#8961) 2021-08-31 10:25:51 +02:00
Patric Stout
f87fe395a7 Fix: pathfinders always tried to avoid docking tiles (even if nothing was on them) (#9522)
When coming across any docking tile (for example, all tiles around
an oilrig are docking tiles), it always at least added a penalty
of 3 times a normal tile, even when there are no ships on them.

In result, the pathfinder got suggested to always go around docking
tiles. This was most likely not the intention of the change made in
31db4f8d5e.
2021-08-31 09:57:44 +02:00
translators
219598a90b Update: Translations from eints
vietnamese: 6 changes by myquartz
2021-08-30 18:51:16 +00:00
translators
80231975e5 Update: Translations from eints
greek: 121 changes by dionisis84
2021-08-29 18:48:25 +00:00
Patric Stout
d8e870c50c Fix: when DNS didn't resolve any IPs, the debug message was misleading (#9519) 2021-08-28 21:19:53 +02:00
Patric Stout
13b53e1290 Codechange: remove unused strings (#9516) 2021-08-28 21:09:07 +02:00
translators
20ff6fd3f1 Update: Translations from eints
arabic (egypt): 21 changes by AviationGamerX
finnish: 2 changes by hpiirai
turkish: 59 changes by ahmetlii
2021-08-28 18:47:10 +00:00
Patric Stout
8ab267496b Codechange: reference a string by its name, not with "another + 1" (#9517)
It is wrong anyway, as "TINY" normally is at -1. Just weird code.
2021-08-28 17:08:01 +02:00
Loïc Guilloux
8d2162ba2d Fix b6a116a: convert server_advertise to server_game_type in config file (#9515) 2021-08-28 14:41:07 +02:00
translators
aa83488fde Update: Translations from eints
swedish: 2 changes by joeax910
spanish (mexican): 7 changes by absay
slovenian: 2 changes by Yeznick
greek: 60 changes by dionisis84
german: 7 changes by Wuzzy2
dutch: 2 changes by Afoklala
2021-08-27 18:48:25 +00:00
translators
56d4749ac9 Update: Translations from eints
norwegian (bokmal): 5 changes by buzzCraft, 2 changes by Anolitt
english (us): 7 changes by 2TallTyler
russian: 2 changes by Ln-Wolf
2021-08-26 18:50:32 +00:00
translators
e9f3ddb6ba Update: Translations from eints
greek: 28 changes by dionisis84
portuguese: 2 changes by azulcosta
2021-08-25 18:49:22 +00:00
translators
ef3c4a8737 Update: Translations from eints
greek: 17 changes by dionisis84
catalan: 4 changes by J0anJosep
portuguese (brazilian): 2 changes by Vimerum
2021-08-24 18:48:45 +00:00
translators
52d57b17b0 Update: Translations from eints
swedish: 8 changes by joeax910
2021-08-23 18:50:19 +00:00
Patric Stout
dc5b7b996c Fix: [Network] show query errors in the server listing instead of error popup (#9506)
When you are query several servers at once, it is rather unclear
for which server you got a popup. Instead, show any errors on the
server itself.

This is only true for the query-part. Joining a server still gives
an error popup to tell you about any issue.
2021-08-23 20:16:22 +02:00
Patric Stout
e31b5d3870 Fix #9490: [Network] a full server couldn't be queried either (#9508)
You can now still query a full server, as long as the maximum
amount of allowed connections isn't reached. This means that as
long as there are not 255 clients connected to a server, you can
always connect to query.
2021-08-23 19:38:02 +02:00
Patric Stout
b2f0491a90 Fix #9501: [Network] crash when more than one game-info query was pending (#9502) 2021-08-23 19:37:51 +02:00
Patric Stout
47ce306085 Fix c4b700f1: remove left-over debug statement (#9510) 2021-08-23 14:05:37 +02:00
Patric Stout
0d26359b5b Fix: [Network] don't show GameScript " (v0)" for old servers (#9507)
Old servers don't tell the GameScript they are running, so nothing
should be shown.
All values in NetworkGameInfo initialize as 0/empty, except for GS
version. Someone has to be different from the rest, I guess.
2021-08-23 12:41:20 +02:00
frosch
93fd42b0c3 Doc: guidelines on english.txt or translation changes in PRs. (#9505) 2021-08-22 14:27:48 +02:00
translators
f939f48cd2 Update: Translations from eints
indonesian: 32 changes by dimaspaf14
russian: 2 changes by Ln-Wolf
2021-08-21 18:48:45 +00:00
Patric Stout
4066a07d8f Fix: [Network] crash when last-joined server that is no longer available (#9503)
If you update the server-list while not having last-joined selected
and it is no longer available, the game crashed.
2021-08-21 11:56:29 +02:00
Nicolas Chappe
b83820e723 Change: [Linkgraph] Delete links only served by vehicles stopped in depot
A stale link is not deleted if the link refresher finds a vehicle that still serves it.
This commit excludes vehicles stopped in depot for a very long time from the link refresher,
so that their stale links can be deleted.
2021-08-20 22:37:03 +02:00
translators
dd3acccb1b Update: Translations from eints
korean: 5 changes by telk5093
dutch: 5 changes by Afoklala
portuguese (brazilian): 3 changes by AKANexus
polish: 5 changes by pAter-exe
2021-08-20 18:49:51 +00:00
Patric Stout
778e196b55 Doc: Prepare for 12.0-beta2 release (#9489) 2021-08-19 21:21:37 +02:00
translators
07f98f9234 Update: Translations from eints
italian: 13 changes by CoderLel
russian: 1 change by Ln-Wolf
french: 2 changes by glx22
2021-08-19 18:46:20 +00:00
Michael Lutz
fff09a4af2 Fix d9c1d18f2: Wrong format string for console disconnect message. 2021-08-19 19:56:00 +02:00
translators
a7fe82c646 Update: Translations from eints
finnish: 3 changes by hpiirai
portuguese: 2 changes by azulcosta
2021-08-18 18:53:42 +00:00
Joan Josep
cc38a42b07 Fix 659989af45: Set appropriate town window dirty when building/removing airports. (#9497) 2021-08-18 14:33:32 +02:00
Joan Josep
b38712a302 Fix a18188a: "Meaningful" is misspelled in landscape grid documentation. (#9498) 2021-08-18 13:15:01 +01:00
translators
335a2392e7 Update: Translations from eints
finnish: 2 changes by hpiirai
portuguese: 1 change by azulcosta
2021-08-18 10:13:13 +00:00
Patric Stout
c4b700f1b0 Fix #9492: show for what server a relay session is being created (#9494)
Currently it says "the server" which is a bit ambigious. Be more
specific.
2021-08-18 12:06:14 +02:00
Patric Stout
996ae28989 Fix #9491: reword "no connection" error message (#9495) 2021-08-18 12:00:36 +02:00
Patric Stout
5da60cef46 Fix: typo in the word "spectator" (tnx Heiki) (#9496) 2021-08-18 12:00:17 +02:00
Nicolas Chappe
de28817d9f Fix 977604ef: [Linkgraph] Add a special case for unknown travel times on link update 2021-08-18 01:48:11 +02:00
translators
325d031082 Update: Translations from eints
catalan: 2 changes by J0anJosep
french: 1 change by glx22
2021-08-17 18:54:07 +00:00
Patric Stout
5c776f21e7 Fix 6acf204d: crash when showing coordinator-error-messages (#9488) 2021-08-17 19:42:46 +02:00
translators
04e9df47d9 Update: Translations from eints
russian: 1 change by Ln-Wolf
2021-08-17 13:47:15 +00:00
Nicolas Chappe
977604ef08 Feature: [Linkgraph] Prioritize faster routes for passengers, mail and express cargo
Passengers usually prefer fast paths to short paths.
Average travel times of links are updated in real-time for use in Dijkstra's algorithm,
and newer travel times weigh more, just like capacities.
2021-08-17 14:57:59 +02:00
Patric Stout
6acf204d14 Fix: report reuse of invite-code and switch to local game-type (#9487)
This prevents two servers battling for the same invite-code. Now
the last one wins.
2021-08-17 13:35:29 +02:00
translators
b531a0c1cf Update: Translations from eints
chinese (simplified): 1 change by goodspeed34
2021-08-16 18:55:59 +00:00
Frédéric Simonis
ac4a7d02c7 Codechange: Improve LineCache queries (#9417)
Adds the support to query the linecache without copying the string.
This uses a custom transparent comparator in conjunction with
a query type using a std::string_view.
2021-08-16 11:18:47 +02:00
dP
2e6a77a78a Fix: connecting with the same name thrice hangs the server (#9485) 2021-08-16 11:09:54 +02:00
translators
d212505dcf Update: Translations from eints
chinese (simplified): 82 changes by goodspeed34
french: 2 changes by glx22
portuguese: 1 change by azulcosta
portuguese (brazilian): 2 changes by Vimerum
2021-08-15 18:48:50 +00:00
Patric Stout
b2eafcc720 Fix: [Actions] changelog assumed major.minor.patch versioning (#9482)
We now use major.minor versioning, so it failed to pick up the
correct information.
2021-08-15 14:14:13 +02:00
184 changed files with 31367 additions and 9577 deletions

View File

@@ -39,6 +39,7 @@ Describe here
Some things are not automated, and forgotten often. This list is a reminder for the reviewers.
* The bug fix is important enough to be backported? (label: 'backport requested')
* This PR touches english.txt or translations? Check the [guidelines](https://github.com/OpenTTD/OpenTTD/blob/master/docs/eints.md)
* This PR affects the save game format? (label 'savegame upgrade')
* This PR affects the GS/AI API? (label 'needs review: Script API')
* ai_changelog.hpp, gs_changelog.hpp need updating.

View File

@@ -4,9 +4,9 @@ tag=$(git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed 's@\
# If we are a tag, show the part of the changelog till (but excluding) the last stable
if [ -n "$tag" ]; then
grep='^[0-9]\+\.[0-9]\+\.[0-9]\+[^-]'
grep='^[0-9]\+\.[0-9]\+[^-]'
next=$(cat changelog.txt | grep '^[0-9]' | awk 'BEGIN { show="false" } // { if (show=="true") print $0; if ($1=="'$tag'") show="true"} ' | grep "$grep" | head -n1 | sed 's/ .*//')
cat changelog.txt | awk 'BEGIN { show="false" } /^[0-9]+.[0-9]+.[0-9]+/ { if ($1=="'$next'") show="false"; if ($1=="'$tag'") show="true";} // { if (show=="true") print $0 }'
cat changelog.txt | awk 'BEGIN { show="false" } /^[0-9]+.[0-9]+/ { if ($1=="'$next'") show="false"; if ($1=="'$tag'") show="true";} // { if (show=="true") print $0 }'
exit 0
fi

221
.github/unused-strings.py vendored Normal file
View File

@@ -0,0 +1,221 @@
"""
Script to scan the OpenTTD source-tree for STR_ entries that are defined but
no longer used.
This is not completely trivial, as OpenTTD references a lot of strings in
relation to another string. The most obvious example of this is a list. OpenTTD
only references the first entry in the list, and does "+ <var>" to get to the
correct string.
There are other ways OpenTTD does use relative values. This script tries to
account for all of them, to give the best approximation we have for "this
string is unused".
"""
import glob
import os
import re
import subprocess
import sys
from enum import Enum
LENGTH_NAME_LOOKUP = {
"VEHICLE_TYPES": 4,
}
class SkipType(Enum):
NONE = 1
LENGTH = 2
EXTERNAL = 3
ZERO_IS_SPECIAL = 4
EXPECT_NEWLINE = 5
def read_language_file(filename, strings_found, errors):
strings_defined = []
skip = SkipType.NONE
length = 0
common_prefix = ""
last_tiny_string = ""
with open(filename) as fp:
for line in fp.readlines():
if not line.strip():
if skip == SkipType.EXPECT_NEWLINE:
skip = SkipType.NONE
continue
line = line.strip()
if skip == SkipType.EXPECT_NEWLINE:
# The only thing allowed after a list, is this next marker, or a newline.
if line == "###next-name-looks-similar":
# "###next-name-looks-similar"
# Indicates the common prefix of the last list has a very
# similar name to the next entry, but isn't part of the
# list. So do not emit a warning about them looking very
# similar.
if length != 0:
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
common_prefix = ""
else:
errors.append(f"ERROR: expected a newline after a list, but didn't find any around {name}. Did you add an entry to the list without increasing the length?")
skip = SkipType.NONE
if line[0] == "#":
if line.startswith("###length "):
# "###length <count>"
# Indicates the next few entries are part of a list. Only
# the first entry is possibly referenced, and the rest are
# indirectly.
if length != 0:
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
length = line.split(" ")[1].strip()
if length.isnumeric():
length = int(length)
else:
length = LENGTH_NAME_LOOKUP[length]
skip = SkipType.LENGTH
elif line.startswith("###external "):
# "###external <count>"
# Indicates the next few entries are used outside the
# source and will not be referenced.
if length != 0:
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
length = line.split(" ")[1].strip()
length = int(length)
skip = SkipType.EXTERNAL
elif line.startswith("###setting-zero-is-special"):
# "###setting-zero-is-special"
# Indicates the next entry is part of the "zero is special"
# flag of settings. These entries are not referenced
# directly in the code.
if length != 0:
errors.append(f"ERROR: list around {name} is shorted than indicated by ###length")
skip = SkipType.ZERO_IS_SPECIAL
continue
name = line.split(":")[0].strip()
strings_defined.append(name)
# If a string ends on _TINY or _SMALL, it can be the {TINY} variant.
# Check for this by some fuzzy matching.
if name.endswith(("_SMALL", "_TINY")):
last_tiny_string = name
elif last_tiny_string:
matching_name = "_".join(last_tiny_string.split("_")[:-1])
if name == matching_name:
strings_found.add(last_tiny_string)
else:
last_tiny_string = ""
if skip == SkipType.EXTERNAL:
strings_found.add(name)
skip = SkipType.LENGTH
if skip == SkipType.LENGTH:
skip = SkipType.NONE
length -= 1
common_prefix = name
elif skip == SkipType.ZERO_IS_SPECIAL:
strings_found.add(name)
elif length > 0:
strings_found.add(name)
length -= 1
# Find the common prefix of these strings
for i in range(len(common_prefix)):
if common_prefix[0 : i + 1] != name[0 : i + 1]:
common_prefix = common_prefix[0:i]
break
if length == 0:
skip = SkipType.EXPECT_NEWLINE
if len(common_prefix) < 6:
errors.append(f"ERROR: common prefix of block including {name} was reduced to {common_prefix}. This means the names in the list are not consistent.")
elif common_prefix:
if name.startswith(common_prefix):
errors.append(f"ERROR: {name} looks a lot like block above with prefix {common_prefix}. This mostly means that the list length was too short. Use '###next-name-looks-similar' if it is not.")
common_prefix = ""
return strings_defined
def scan_source_files(path, strings_found):
for new_path in glob.glob(f"{path}/*"):
if os.path.isdir(new_path):
scan_source_files(new_path, strings_found)
continue
if not new_path.endswith((".c", ".h", ".cpp", ".hpp", ".ini")):
continue
# Most files we can just open, but some use magic, that requires the
# G++ preprocessor before we can make sense out of it.
if new_path == "src/table/cargo_const.h":
p = subprocess.run(["g++", "-E", new_path], stdout=subprocess.PIPE)
output = p.stdout.decode()
else:
with open(new_path) as fp:
output = fp.read()
# Find all the string references.
matches = re.findall(r"[^A-Z_](STR_[A-Z0-9_]*)", output)
strings_found.update(matches)
def main():
strings_found = set()
errors = []
scan_source_files("src", strings_found)
strings_defined = read_language_file("src/lang/english.txt", strings_found, errors)
# STR_LAST_STRINGID is special, and not really a string.
strings_found.remove("STR_LAST_STRINGID")
# These are mentioned in comments, not really a string.
strings_found.remove("STR_XXX")
strings_found.remove("STR_NEWS")
strings_found.remove("STR_CONTENT_TYPE_")
# This string is added for completion, but never used.
strings_defined.remove("STR_JUST_DATE_SHORT")
strings_defined = sorted(strings_defined)
strings_found = sorted(list(strings_found))
for string in strings_found:
if string not in strings_defined:
errors.append(f"ERROR: {string} found but never defined.")
for string in strings_defined:
if string not in strings_found:
errors.append(f"ERROR: {string} is (possibly) no longer needed.")
if errors:
for error in errors:
print(error)
sys.exit(1)
else:
print("OK")
if __name__ == "__main__":
main()

18
.github/workflows/unused-strings.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Unused strings
on:
pull_request:
jobs:
unused-strings:
name: Unused strings
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Check for unused strings
run: |
set -ex
python3 .github/unused-strings.py

View File

@@ -1,3 +1,49 @@
12.0-RC1 (2021-09-25)
------------------------------------------------------------------------
Feature: Display icon/text whether vehicle is lost in vehicle (list) window (#9543)
Feature: [MacOS] Add selected toolbar buttons to MacBook Pro Touch Bar (#9511)
Feature: Button to open order window from vehicle shared orders window (#9325)
Feature: Ctrl-Clicking shared order vehicle list opens order window (#9325)
Feature: Multiple rotating views on title screen (#8980)
Feature: Hide block signals in GUI by default (#8688)
Add: [Script] Allow GameScripts to build neutral objects (#9568)
Add: [Network] Allow sending chat messages via admin port (#9563)
Add: [AI/GS] Missing water related functions and objects (#8390)
Fix: Industry funding window did not update when changing funding method (#9572)
Fix #9562: [NewGRF] Handle case of invalid Action2 with zero results (#9564)
Fix: Incorrect error messages when placing water in scenario editor (#9560)
Fix #9484: Update locale currencies settings config map (#9559)
Fix: Prevent train reversing when entirely inside a train depot (#9557)
Fix: [Network] Add back 'Spectate' option to company toolbar menu (#9556)
Fix #9463: [Win32] Work around XAudio2 crashes (#9549)
Fix #8603: Don't give focus to text filter when opening Object GUI (#9547)
Fix #9241: Grove and forest tree brushes did not also create rainforest terrain (#9542)
Fix: [Network] Several crashes in our network code (#9534, #9456)
Fix #9527: Crash when trying to place multi-tile objects at map edge (#9529)
Fix: [Network] SendCmdNames only sent one name per packet (#9528)
Fix #9407: Desync when founding a town nearby a station (#9526)
Fix #9521: Don't load at just removed docks that were part of a multi-dock station (#9524)
Fix: Ships always tried to avoid docking tiles when pathfinding (even if nothing was on them) (#9522)
Fix: [Network] Convert server_advertise to server_game_type in config file (#9515)
Fix #9490: [Network] A full server couldn't be queried (#9508)
Fix: [Network] Don't show GameScript " (v0)" for old servers (#9507)
Fix: [Network] Show query errors in the server listing instead of error popup (#9506)
Fix: [Network] Crash when last-joined server was no longer available (#9503)
Fix #9501: [Network] Crash when more than one game-info query was pending (#9502)
Fix: Wrong error message when building canals over ship depots / locks (#9410)
Fix: Reduce cost of building canals over objects on sea (#9410)
Change: [Linkgraph] Delete links only served by vehicles stopped in depot (#9499)
12.0-beta2 (2021-08-19)
------------------------------------------------------------------------
Feature: [Linkgraph] Prioritize faster routes for passengers, mail and express cargo (#9457)
Fix: Wrong town window refreshed when building an airport with noise levels enabled (#9497)
Fix: Improve wording of network-related messages (#9494, #9495, #9500)
Fix: [Network] Report reuse of invite-code (#9487)
Fix: [Network] Connecting with the same client name thrice hangs the server (#9485)
12.0-beta1 (2021-08-15)
------------------------------------------------------------------------
Feature: [Network] Remove lobby window; pressing "Join Game" now immediately joins a server (#9467)

117
docs/eints.md Normal file
View File

@@ -0,0 +1,117 @@
# Translations for OpenTTD
Eints is [OpenTTD's WebTranslator](https://translator.openttd.org/).
- Registered translators translate from English to their language.
- Eints validates the translations syntactically and that parameter usage matches the English base language.
- Eints synchronises translations to OpenTTD's repository every day, shortly before the nightly build.
When adding or altering strings in english.txt, you should stick to some rules, so translations are handled smoothly by Eints and translators.
This document gives some guidelines.
## I want to change a translation.
### I want to become a regular translator.
Just [sign up](https://github.com/OpenTTD/team/issues/new/choose) as a translator.
### I only want to point out some issues / typos in the current translation, or suggest a change.
[Open an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose), so it can be assigned to the translation team of the language.
The translators will decide whether, where and how to apply your suggestion.
### I want to submit translations via PR.
Sorry, we don't offer this option.
### I want to change the language definition (plural form, genders, cases) of a translation.
Please [create an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose) for this.
### I want to add an entirely new translation language.
OpenTTD has more than 4000 strings, translating all of them is a lot of work.
Despite the initial enthusiasm, only few people have the endurance to get to even 20% translation progress.
As such, starting a new translation requires the prospect that there is also translation interest in the future.
And, frankly, OpenTTD probably already covers all languages to which this applies, and a few more.
If you still want to make the case, that your language is spoken by several 100 million people, please [create an issue](https://github.com/OpenTTD/OpenTTD/issues/new/choose) for adding a new language.
## I want to change the English base language (english.txt).
### I want to change the wording / fix a typo in an English string, without changing the meaning (drastically).
Just change it in your PR.
Translators will be notified that their translation became "outdated", so they can double-check whether the translation needs updating.
### I want to add/change/remove parameters from an English string.
Just change the parameters in english.txt in your PR.
Don't touch the translations, please ignore compile warnings about them.
Translators will be notified that their translation became "invalid", so they can adjust the translation.
Eints will remember the old translations for translators to view, but remove them from the git repository, while they are "invalid"; so there won't be any compile warnings after the nightly sync.
### I want to change the meaning of an English string, so that no existing translation makes any sense anymore.
In this case, please change the STR_xxx string identifier of the string; basically: remove the old string, add a new one.
Don't touch the translations, please ignore compile warnings about them.
Eints will discard all memory of the old strings in the nightly sync, and translators can start fresh with a new string.
### I want to add a new string.
Add the new string somewhere in english.txt, where it fits with the neighbouring strings.
Don't touch the translations, even if you can speak some of the languages.
### I want to remove an unused string.
Remove the string from english.txt.
Don't touch the translations, please ignore compile warnings about them.
Eints will remove the translations from the git repository in the nightly sync.
### I want to reorder strings in english.txt without changing them.
Reorder english.txt as you like. Don't touch the translations.
Eints will reorder all translations to match english.txt in the nightly sync.
### I want to add/change '#' comments.
Change comments in english.txt as you like. Don't touch the translations.
Eints will replicate comments into all translations in the nightly sync. Comments are not translated.
### I want to change the STR_xxx string identifier for code style reasons, without changing the English text.
This is the only case, where your PR should also edit translations.
The STR_xxx string identifier is used by Eints as key value to track strings and translations. If you change it, that's the same as deleting a string and adding an unrelated new one.
So, to keep translations, you have to replace the STR_xxx for all translations in the PR as well.
However, you will only be able to keep the translations which are part of the git repository.
Translation history and information about translations being "outdated" will be lost.
So, keep your code style OCD to a minimum :)
## I want to fight a bot and lose.
Here are some things, people sometimes want to do, but which won't work.
### I want to enforce re-translation by clearing current translations.
You have to change the STR_xxx string identifier, that's the only option.
You cannot "clear" translations by removing them via PR; eints will reinstall the previous "syntactically perfect valid" translation.
### I want to revert a broken change, some translator just did via eints.
You have to revert the translations via the WebTranslator interface.
If there are many changes, ask someone with Admin access to eints, so they can manually upload a fixed translation file to eints.
You cannot revert translations changes via PR. Eints merges translations from git and from web by keeping a translation history, and committing the newest translation to git.
If you revert to an old translation in git, eints will simply think git did not yet get the newer translation, and commit it again.

View File

@@ -79,7 +79,7 @@ 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" 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 type">XXXX</span> <span class="used" title="Presence and direction of bridge above">XX</span> <span class="used" title="Tropic Zone: only meaningful 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>

View File

@@ -1,225 +1,207 @@
# Multiplayer manual for OpenTTD
Last updated: 2011-02-16
## Table of contents
- 1.0) [Starting a server](#10-starting-a-server)
- 2.0) [Connecting to a server](#20-connecting-to-a-server)
- 2.1) [Connecting to a server over the console](#21-connecting-to-a-server-over-the-console)
- 2.1) [Connecting to a server over the console](#21-connecting-to-a-server-over-the-console)
- 3.0) [Playing internet games](#30-playing-internet-games)
- 4.0) [Tips for servers](#40-tips-for-servers)
- 4.1)[Imposing landscaping limits](#41-imposing-landscaping-limits)
- 4.1)[Imposing landscaping limits](#41-imposing-landscaping-limits)
- 5.0) [Some useful things](#50-some-useful-things)
- 6.0) [Troubleshooting](#60-troubleshooting)
## 1.0) Starting a server
- Make sure that you have your firewall of the computer as well as possible
routers or modems of the server configured such that:
- port 3979 is free for both UDP and TCP connections in- and outgoing
- port 3978 is free outbound for UDP in order to advertise with the master
server (if desired). Otherwise you'll have to tell players your IP.
- port 3977 if use of the admin interface is desired (see admin_network.txt)
- Click "multiplayer" on the startup screen
- Click "start server"
- Type in a game name
- Select the type of game ('LAN/Internet' or 'Internet (advertise)'. With the
last one other people are able to see you online. Else they need your IP and
port to join)
- Click "start game", "load game" or "load scenario"
- Start playing
- Click on "Multiplayer" in the Start Menu.
- Click on "Start Server".
- Give your server a name.
- Select the visibility of your server:
- "Public": your server will be publicly listed.
- "Invite Only": only players who have the invite code for your server can
join.
- "Local": only players on your local network can join.
- (optional) Set a password for your server.
- Click "New Game", "Load Game", or "Play Scenario".
- Start playing.
## 2.0) Connecting to a server
- Click "multiplayer" on the startup screen
- If you want to connect to any network game in your LAN click on 'LAN', then
on 'Find Server'
- If you want to see which servers all online on the Internet, click on
'Internet' and 'Find Server'
- If there were more than one server
- select one in the list below the buttons
- click on 'join game'
- If you want to play and you have the ip or hostname of the game server you
want connect to.
- click add server
- type in the ip address or hostname
- if you want to add a port use :<port>
- If you want to play and you have the invite code of the game server you
want connect to.
- click add server
- type in the invite code
- Now you can select a company and press: "Join company", to help that company
- Or you can press "Spectate game", to spectate the game
- Or you can press "New company", and start your own company (if there are
slots free)
- You see a progressbar how far you are with joining the server.
- Happy playing
- Click on "Multiplayer" in the Start Menu.
- There are three ways to join a server:
- If you want to connect to a local server, click "Search LAN".
- If you want to connect to a public game, click "Search internet".
- If the server-owner shared an invite code with you:
- Click "Add Server".
- Fill in the invite code, which always starts with a `+`.
- Click "OK".
- Click on the server you want to join.
- Click "Join Game".
- If the server has a password, it will ask you for this.
- You see a progressbar how far you are with joining the server.
- Happy playing.
## 2.1) Connecting to a server over the console
- Open the console and type in the following command:
connect `<ip/host>:<port>#<company-no>`
- Open the console and type `connect` for help how to connect via the console.
## 3.0) Playing internet games
- Servers with a red dot behind it have a different version then you have. You
will not be able to join those servers.
- Servers with a red dot behind it have a different version then you have. You
will not be able to join those servers.
- Servers with a yellow dot behind it have NewGRFs that you do not have. You
will not be able to join those servers. However, via "NewGRF Settings" and
"Find missing content online" you might be able to download the needed
NewGRFs after which you can join the server.
- Servers with a yellow dot behind it have NewGRFs that you do not have. You
will not be able to join those servers. However, via "NewGRF Settings" and
"Find missing content online" you might be able to download the needed
NewGRFs after which you can join the server.
- It can happen that a connection is that slow, or you have that many clients
connected to your server, that your clients start to loose their connection.
Some things you can do about it:
- [network] frame_freq:
change it in console with: 'set network.frame_freq <number>'
the number should be between the 0 and 10, not much higher. It indicates
the delay between clicking and showing up. The higher, the more you notice
it, but the less bandwidth you use.
A good value for Internet-games is 2 or 3.
- It can happen that a connection is that slow, or you have that many clients
connected to your server, that your clients start to loose their connection.
Some things you can do about it:
- `[network] frame_freq`:
change it in console with: `set network.frame_freq <number>`
the number should be between the 0 and 10, not much higher. It indicates
the delay between clicking and showing up. The higher, the more you notice
it, but the less bandwidth you use.
A good value for Internet-games is 2 or 3.
- [network] sync_freq:
change it in console with: 'set network.sync_freq <number>'
the number should be between the 50 and 1000, not much lower, not much
higher. It indicates the time between sync-frames. A sync-frame is a frame
which checks if all clients are still in sync. When the value it too high,
clients can desync in 1960, but the server detects it in 1970. Not really
handy. The lower the value, the more bandwidth it uses.
NB: changing frame_freq has more effect on the bandwidth then sync_freq.
- `[network] sync_freq`:
change it in console with: `set network.sync_freq <number>`
the number should be between the 50 and 1000, not much lower, not much
higher. It indicates the time between sync-frames. A sync-frame is a frame
which checks if all clients are still in sync. When the value it too high,
clients can desync in 1960, but the server detects it in 1970. Not really
handy. The lower the value, the more bandwidth it uses.
NB: changing `frame_freq` has more effect on the bandwidth then `sync_freq`.
## 4.0) Tips for servers
- You can launch a dedicated server by adding -D as parameter.
- In UNIX like systems, you can fork your dedicated server by adding -f as
parameter.
- You can launch a dedicated server by adding `-D` as parameter.
- In UNIX like systems, you can fork your dedicated server by adding `-f` as
parameter.
- You can automatically clean companies that do not have a client connected to
them, for, let's say, 3 years. You can do this via: 'set autoclean_companies'
and 'set autoclean_protected' and 'set autoclean_unprotected'. Unprotected
removes a password from a company when it is not used for more then the
defined amount of months. 'set autoclean_novehicles' can be used to remove
companies without any vehicles quickly.
- You can automatically clean companies that do not have a client connected to
them, for, let's say, 3 years. You can do this via: `set autoclean_companies`
and `set autoclean_protected` and `set autoclean_unprotected`. Unprotected
removes a password from a company when it is not used for more then the
defined amount of months. `set autoclean_novehicles` can be used to remove
companies without any vehicles quickly.
- You can also do this manually via the console: 'reset_company'.
- You can also do this manually via the console: `reset_company`.
- You can let your server automatically restart a map when, let's say, year 2030
is reached. See 'set restart_game_date' for detail.
- You can let your server automatically restart a map when, let's say,
year 2030 is reached. See `set restart_game_date` for detail.
- If you want to be on the server-list, make your server public. You can do
this either from the Start Server GUI, via the in-game Online Players GUI,
or by typing in the console:
'set server_game_type public'.
- If you want to be on the server-list, make your server public. You can do
this either from the Start Server window, via the in-game Online Players
window, or by typing in the console: `set server_game_type public`.
- You can protect your server with a password via the console: 'set server_pw',
or via the Start Server menu.
- You can protect your server with a password via the console: `set server_pw`,
or via the Start Server menu.
- When you have many clients connected to your server via Internet, watch your
bandwidth (if you have any limit on it, set by your ISP). One client uses
about 1.5 kilobytes per second up and down. To decrease this amount, setting
'frame_freq' to 1 will reduce it to roughly 1 kilobyte per second per client.
- When you have many clients connected to your server via Internet, watch your
bandwidth (if you have any limit on it, set by your ISP). One client uses
about 1.5 kilobytes per second up and down. To decrease this amount, setting
`frame_freq` to 1 will reduce it to roughly 1 kilobyte per second per client.
- OpenTTD's default settings for maximum number of clients, and amount of data
from clients to process are chosen to not influence the normal playing of
people, but to prevent or at least make it less likely that someone can
perform a (distributed) denial-of-service attack on your server by causing
an out-of-memory event by flooding the server with data to send to all
clients. The major factor in this is the maximum number of clients; with
32 clients "only" sending one chat message causes 1024 messages to be
distributed in total, with 64 clients that already quadruples to 4096. Given
that upstream bandwidth is usually the limiting factor, a queue of packets
that need to be sent will be created.
To prevent clients from exploiting this "explosion" of packets to send we
limit the number of incoming data, resulting in effectively limiting the
amount of data that OpenTTD will send to the clients. Even with the default
limits it is possible to generate about 70.000 packets per second, or about
7 megabit per second of traffic.
Given that OpenTTD kicks clients after they have not reacted within about 9
seconds from sending a frame update packet it would be possible that OpenTTD
keeps about 600.000 packets in memory, using about 50 megabytes of memory.
Given that OpenTTD allows short bursts of packets, you can have slightly
more packets in memory in case of a distributed denial of service attack.
When increasing the amount of incoming data, or the maximum number of
clients the amount of memory OpenTTD needs in case of a distributed denial
of service attack is linearly related to the amount of incoming data and
quadratic to the amount of clients. In short, a rule of thumb for, the
maximum memory usage for packets is:
#max_clients * #max_clients * bytes_per_frame * 10 KiB.
- OpenTTD's default settings for maximum number of clients, and amount of data
from clients to process are chosen to not influence the normal playing of
people, but to prevent or at least make it less likely that someone can
perform a (distributed) denial-of-service attack on your server by causing
an out-of-memory event by flooding the server with data to send to all
clients. The major factor in this is the maximum number of clients; with
32 clients "only" sending one chat message causes 1024 messages to be
distributed in total, with 64 clients that already quadruples to 4096. Given
that upstream bandwidth is usually the limiting factor, a queue of packets
that need to be sent will be created.
To prevent clients from exploiting this "explosion" of packets to send we
limit the number of incoming data, resulting in effectively limiting the
amount of data that OpenTTD will send to the clients. Even with the default
limits it is possible to generate about 70.000 packets per second, or about
7 megabit per second of traffic.
Given that OpenTTD kicks clients after they have not reacted within about 9
seconds from sending a frame update packet it would be possible that OpenTTD
keeps about 600.000 packets in memory, using about 50 megabytes of memory.
Given that OpenTTD allows short bursts of packets, you can have slightly
more packets in memory in case of a distributed denial of service attack.
When increasing the amount of incoming data, or the maximum number of
clients the amount of memory OpenTTD needs in case of a distributed denial
of service attack is linearly related to the amount of incoming data and
quadratic to the amount of clients. In short, a rule of thumb for, the
maximum memory usage for packets is:
`#max_clients * #max_clients * bytes_per_frame * 10 KiB`.
### 4.1) Imposing landscaping limits
- You can impose limits on companies by the following 4 settings:
- terraform_per_64k_frames
- terraform_frame_burst
- clear_per_64k_frames
- clear_frame_burst
- You can impose limits on companies by the following 4 settings:
- `terraform_per_64k_frames`
- `terraform_frame_burst`
- `clear_per_64k_frames`
- `clear_frame_burst`
- Explaining 'per_64K_frames' and 'burst'
- 'burst' defines 3 things, the maximum limit, the limit of a single action,
and the initial value for the limit assigned to a new company.
This setting is fairly simple and requires no math.
- Explaining `NNN_burst` and `NNN_per_64K_frames`
- `NNN_burst` defines 3 things, the maximum limit, the limit of a single
action, and the initial value for the limit assigned to a new company.
This setting is fairly simple and requires no math.
A value of 1 means a single tile can be affected by a single action.
This results in having to click 400 times when wanting to cover an area
of 20 x 20 tiles.
A value of 1 means a single tile can be affected by a single action.
This results in having to click 400 times when wanting to cover an area
of 20 x 20 tiles.
The default value 4096 covers an area of 64 x 64 tiles.
The default value 4096 covers an area of 64 x 64 tiles.
- 'per_64k_frames' defines the number of tiles added to each companies limit
per frame (however not past the possible maximum value,the 'burst').
64k rather resembles the exact number of 65536 frames. So setting this
variable to 65536 means: 65536 / 65536 = 1 tile per frame.
As a day consists of 74 frames, a company's limit is increased by 74
tiles during the course of a single day (2.22 seconds).
- `NNN_per_64K_frames` defines the number of tiles added to each companies
limit per frame (however not past the possible maximum value,the
`NNN_burst`). 64k rather resembles the exact number of 65536 frames. So
setting this variable to 65536 means: `65536 / 65536 = 1 tile per frame`.
To achieve a 1 tile per day increase the following calculation is needed:
1 / 74 (frames per day) * 65536 (per_64k_frames) = 885.62...
after rounding: a value of 886 means adding a bit over 1 tile per day.
As a day consists of 74 frames, a company's limit is increased by 74
tiles during the course of a single day (2.22 seconds).
To achieve a 1 tile per day increase the following calculation is needed:
`1 / 74 (frames per day) * 65536 (per_64k_frames) = 885.62...`.
After rounding: a value of 886 means adding a bit over 1 tile per day.
There is still enough space to scale this value downwards:
decreasing this value to 127 results in a bit over 1 tile added to the
allowance per week (7 days).
There is still enough space to scale this value downwards:
decreasing this value to 127 results in a bit over 1 tile added to the
allowance per week (7 days).
To create a setup in which a company gets an initial allowance only,
set the value to 0 - no increase of the allowance per frame.
- Even though construction actions include a clear tile action, they are not
affected by the above settings.
To create a setup in which a company gets an initial allowance only,
set the value to 0 - no increase of the allowance per frame.
- Even though construction actions include a clear tile action, they are not
affected by the above settings.
## 5.0) Some useful things
- You can protect your company so nobody else can join uninvited. To do this,
set a password in your Company Screen
- You can protect your company so nobody else can join uninvited. To do this,
set a password in your Company window.
- You can give other players some money via the ClientList (under the 'head'
in the mainbar).
- You can chat with other players via ENTER or via SHIFT+T or via the ClientList
- Servers can now kick players, so don't make them use it!
- You can chat with other players via ENTER or via SHIFT+T or via the Online
Players window
- Servers can kick players, so don't make them use it!
## 6.0) Troubleshooting
- My advertising server does not show up in list at servers.openttd.org
Run openttd with the '-d net=2' parameter. That will show which incoming
communication is received, whether the replies from the master server or
communication from an admin tool reach the programme. See section 1
'Starting a server' further up for the ports and protocols used by OpenTTD.
The ports can be configured in the config file.
### My server does not show up in the serverlist
- My advertising server warns a lot about getaddrinfo taking N seconds
This could be a transient issue with your (local) DNS server, but if the
problem persists there is likely a configuration issue in DNS resolving
on your computer. This seems to be a common configuration issue for
Docker instances, where the DNS resolving waits for a time out of usually
5 seconds.
Check if the visibility of your server is set to `public`.
If it is, and your server still isn't showing up, start OpenTTD with
`-d net=4` as extra argument. This will show debug message related to the
network, including communication to/from the Game Coordinator.
### My server warns a lot about getaddrinfo taking N seconds
This could be a transient issue with your (local) DNS server, but if the
problem persists there is likely a configuration issue in DNS resolving on
your computer.
#### Running OpenTTD in a Docker container?
This is an issue with dual-stack Docker containers. If there is no default
IPv6 resolver and IPv6 traffic is preferred, DNS requests will time out after
5 seconds. To resolve this, use an IPv4 DNS server for your Docker container,
for example by adding `--dns 1.1.1.1` to your `docker run` command.

BIN
media/openttd.1024.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

BIN
media/openttd.2048.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
media/openttd.512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -547,6 +547,8 @@ function Regression::Prices()
print(" BT_DOCK: " + AIMarine.GetBuildCost(AIMarine.BT_DOCK));
print(" BT_DEPOT: " + AIMarine.GetBuildCost(AIMarine.BT_DEPOT));
print(" BT_BUOY: " + AIMarine.GetBuildCost(AIMarine.BT_BUOY));
print(" BT_LOCK: " + AIMarine.GetBuildCost(AIMarine.BT_LOCK));
print(" BT_CANAL: " + AIMarine.GetBuildCost(AIMarine.BT_CANAL));
print(" -Tile-");
print(" BT_FOUNDATION: " + AITile.GetBuildCost(AITile.BT_FOUNDATION));
print(" BT_TERRAFORM: " + AITile.GetBuildCost(AITile.BT_TERRAFORM));
@@ -556,6 +558,7 @@ function Regression::Prices()
print(" BT_CLEAR_ROCKY: " + AITile.GetBuildCost(AITile.BT_CLEAR_ROCKY));
print(" BT_CLEAR_FIELDS: " + AITile.GetBuildCost(AITile.BT_CLEAR_FIELDS));
print(" BT_CLEAR_HOUSE: " + AITile.GetBuildCost(AITile.BT_CLEAR_HOUSE));
print(" BT_CLEAR_WATER: " + AITile.GetBuildCost(AITile.BT_CLEAR_WATER));
}
function cost_callback(old_path, new_tile, new_direction, self) { if (old_path == null) return 0; return old_path.GetCost() + 1; }
@@ -919,6 +922,9 @@ function Regression::Marine()
print(" BuildWaterDepot(): " + AIMarine.BuildWaterDepot(28479, 28480));
print(" BuildDock(): " + AIMarine.BuildDock(29253, AIStation.STATION_JOIN_ADJACENT));
print(" BuildBuoy(): " + AIMarine.BuildBuoy(28481));
print(" BuildLock(): " + AIMarine.BuildLock(28487));
print(" BuildCanal(): " + AIMarine.BuildCanal(28744));
}
function Regression::Order()
@@ -1470,9 +1476,41 @@ function Regression::TileList()
print(" " + i + " => " + list.GetValue(i));
}
list.AddRectangle(54421 - 256 * 2, 256 * 2 + 54421 + 8);
list.AddRectangle(0x6F3F, 0x7248);
list.Valuate(AITile.IsWaterTile);
print(" Water(): done");
print(" IsWaterTile(): done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AITile.IsSeaTile);
print(" IsSeaTile(): done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AITile.IsRiverTile);
print(" IsRiverTile() done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AIMarine.IsCanalTile);
print(" IsCanalTile() done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AITile.IsCoastTile);
print(" IsCoastTile() done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {

View File

@@ -7365,6 +7365,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetBankBalance(): 1999959285
BuildWaterDepot(): true
BuildDock(): true
BuildBuoy(): true
BuildLock(): true
BuildCanal(): true
--Prices--
-Rail-
@@ -7391,6 +7394,8 @@ ERROR: IsEnd() is invalid as Begin() is never called
BT_DOCK: 262
BT_DEPOT: 525
BT_BUOY: 262
BT_LOCK: 5625
BT_CANAL: 3750
-Tile-
BT_FOUNDATION: 187
BT_TERRAFORM: 187
@@ -7400,6 +7405,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
BT_CLEAR_ROCKY: 150
BT_CLEAR_FIELDS: 375
BT_CLEAR_HOUSE: 1200
BT_CLEAR_WATER: 7500
--Rail--
IsRailTile(): false
@@ -8450,54 +8456,221 @@ ERROR: IsEnd() is invalid as Begin() is never called
KeepValue(1): done
Count(): 0
ListDump:
Water(): done
Count(): 45
IsWaterTile(): done
Count(): 40
ListDump:
54941 => 1
54940 => 1
54939 => 1
54938 => 1
54937 => 1
54936 => 1
54935 => 1
54934 => 1
54933 => 1
54685 => 1
54684 => 1
54683 => 1
54682 => 1
54681 => 1
54680 => 1
54679 => 1
54678 => 1
54677 => 1
54429 => 1
54428 => 1
54427 => 1
54426 => 1
54425 => 1
54424 => 1
54423 => 1
54422 => 1
54421 => 1
54173 => 1
54172 => 1
54171 => 1
54170 => 1
54169 => 1
54168 => 0
54167 => 0
54166 => 0
54165 => 0
53917 => 0
53916 => 0
53915 => 0
53914 => 0
53913 => 0
53912 => 0
53911 => 0
53910 => 0
53909 => 0
29251 => 1
29250 => 1
29249 => 1
29248 => 1
29247 => 1
28996 => 1
28995 => 1
28994 => 1
28993 => 1
28992 => 1
28991 => 1
28744 => 1
28741 => 1
28740 => 1
28739 => 1
28738 => 1
28737 => 1
28736 => 1
28735 => 1
28488 => 1
28487 => 1
28486 => 1
28485 => 1
28484 => 1
28483 => 1
28482 => 1
28480 => 1
28479 => 1
29256 => 0
29255 => 0
29254 => 0
29253 => 0
29252 => 0
29000 => 0
28999 => 0
28998 => 0
28997 => 0
28743 => 0
28742 => 0
28481 => 0
IsSeaTile(): done
Count(): 40
ListDump:
29251 => 1
29250 => 1
29249 => 1
29248 => 1
29247 => 1
28996 => 1
28995 => 1
28994 => 1
28993 => 1
28992 => 1
28991 => 1
28741 => 1
28740 => 1
28739 => 1
28738 => 1
28737 => 1
28736 => 1
28735 => 1
28485 => 1
28484 => 1
28483 => 1
28482 => 1
29256 => 0
29255 => 0
29254 => 0
29253 => 0
29252 => 0
29000 => 0
28999 => 0
28998 => 0
28997 => 0
28744 => 0
28743 => 0
28742 => 0
28488 => 0
28487 => 0
28486 => 0
28481 => 0
28480 => 0
28479 => 0
IsRiverTile() done
Count(): 40
ListDump:
29256 => 0
29255 => 0
29254 => 0
29253 => 0
29252 => 0
29251 => 0
29250 => 0
29249 => 0
29248 => 0
29247 => 0
29000 => 0
28999 => 0
28998 => 0
28997 => 0
28996 => 0
28995 => 0
28994 => 0
28993 => 0
28992 => 0
28991 => 0
28744 => 0
28743 => 0
28742 => 0
28741 => 0
28740 => 0
28739 => 0
28738 => 0
28737 => 0
28736 => 0
28735 => 0
28488 => 0
28487 => 0
28486 => 0
28485 => 0
28484 => 0
28483 => 0
28482 => 0
28481 => 0
28480 => 0
28479 => 0
IsCanalTile() done
Count(): 40
ListDump:
28744 => 1
29256 => 0
29255 => 0
29254 => 0
29253 => 0
29252 => 0
29251 => 0
29250 => 0
29249 => 0
29248 => 0
29247 => 0
29000 => 0
28999 => 0
28998 => 0
28997 => 0
28996 => 0
28995 => 0
28994 => 0
28993 => 0
28992 => 0
28991 => 0
28743 => 0
28742 => 0
28741 => 0
28740 => 0
28739 => 0
28738 => 0
28737 => 0
28736 => 0
28735 => 0
28488 => 0
28487 => 0
28486 => 0
28485 => 0
28484 => 0
28483 => 0
28482 => 0
28481 => 0
28480 => 0
28479 => 0
IsCoastTile() done
Count(): 40
ListDump:
28998 => 1
28997 => 1
28743 => 1
28742 => 1
29256 => 0
29255 => 0
29254 => 0
29253 => 0
29252 => 0
29251 => 0
29250 => 0
29249 => 0
29248 => 0
29247 => 0
29000 => 0
28999 => 0
28996 => 0
28995 => 0
28994 => 0
28993 => 0
28992 => 0
28991 => 0
28744 => 0
28741 => 0
28740 => 0
28739 => 0
28738 => 0
28737 => 0
28736 => 0
28735 => 0
28488 => 0
28487 => 0
28486 => 0
28485 => 0
28484 => 0
28483 => 0
28482 => 0
28481 => 0
28480 => 0
28479 => 0
--TileList_IndustryAccepting--
Count(): 47
@@ -9099,12 +9272,12 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetLocation(): 33417
GetEngineType(): 153
GetUnitNumber(): 1
GetAge(): 0
GetAge(): 1
GetMaxAge(): 5490
GetAgeLeft(): 5490
GetAgeLeft(): 5489
GetCurrentSpeed(): 7
GetRunningCost(): 421
GetProfitThisYear(): 0
GetProfitThisYear(): -1
GetProfitLastYear(): 0
GetCurrentValue(): 5947
GetVehicleType(): 1
@@ -9114,7 +9287,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsInDepot(): false
GetNumWagons(): 1
GetWagonEngineType(): 153
GetWagonAge(): 0
GetWagonAge(): 1
GetLength(): 8
GetOwner(): 1
BuildVehicle(): 14
@@ -9139,9 +9312,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetNumWagons(): 3
GetLength(): 24
GetWagonEngineType(): 9
GetWagonAge(): 1
GetWagonAge(): 0
GetWagonEngineType(): 27
GetWagonAge(): 1
GetWagonAge(): 0
GetWagonEngineType(): 27
GetWagonAge(): 0
GetWagonEngineType(): 65535
@@ -9187,11 +9360,11 @@ ERROR: IsEnd() is invalid as Begin() is never called
14 => 1
12 => 1
Age ListDump:
17 => 1
16 => 1
14 => 1
13 => 1
12 => 1
17 => 0
16 => 0
14 => 0
MaxAge ListDump:
16 => 10980
14 => 10980
@@ -9199,9 +9372,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
13 => 5490
12 => 5490
AgeLeft ListDump:
16 => 10979
14 => 10979
17 => 7319
16 => 10980
14 => 10980
17 => 7320
13 => 5489
12 => 5489
CurrentSpeed ListDump:

View File

@@ -225,7 +225,7 @@ static const Command _command_proc_table[] = {
DEF_CMD(CmdBuildSingleSignal, CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_SIGNALS
DEF_CMD(CmdRemoveSingleSignal, CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_SIGNALS
DEF_CMD(CmdTerraformLand, CMD_ALL_TILES | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_TERRAFORM_LAND
DEF_CMD(CmdBuildObject, CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_OBJECT
DEF_CMD(CmdBuildObject, CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_OBJECT
DEF_CMD(CmdBuildTunnel, CMD_DEITY | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_TUNNEL
DEF_CMD(CmdRemoveFromRailStation, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_FROM_RAIL_STATION
DEF_CMD(CmdConvertRail, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_CONVERT_RAILD

View File

@@ -14,6 +14,7 @@
#include "string_func.h"
#include "fileio_func.h"
#include "settings_type.h"
#include <mutex>
#if defined(_WIN32)
#include "os/windows/win32.h"
@@ -26,6 +27,16 @@ SOCKET _debug_socket = INVALID_SOCKET;
#include "safeguards.h"
/** Element in the queue of debug messages that have to be passed to either NetworkAdminConsole or IConsolePrint.*/
struct QueuedDebugItem {
std::string level; ///< The used debug level.
std::string message; ///< The actual formatted message.
};
std::atomic<bool> _debug_remote_console; ///< Whether we need to send data to either NetworkAdminConsole or IConsolePrint.
std::mutex _debug_remote_console_mutex; ///< Mutex to guard the queue of debug messages for either NetworkAdminConsole or IConsolePrint.
std::vector<QueuedDebugItem> _debug_remote_console_queue; ///< Queue for debug messages to be passed to NetworkAdminConsole or IConsolePrint.
std::vector<QueuedDebugItem> _debug_remote_console_queue_spare; ///< Spare queue to swap with _debug_remote_console_queue.
int _debug_driver_level;
int _debug_grf_level;
int _debug_map_level;
@@ -107,6 +118,11 @@ void DebugPrint(const char *level, const std::string &message)
{
if (_debug_socket != INVALID_SOCKET) {
std::string msg = fmt::format("{}dbg: [{}] {}\n", GetLogPrefix(), level, message);
/* Prevent sending a message concurrently, as that might cause interleaved messages. */
static std::mutex _debug_socket_mutex;
std::lock_guard<std::mutex> lock(_debug_socket_mutex);
/* Sending out an error when this fails would be nice, however... the error
* would have to be send over this failing socket which won't work. */
send(_debug_socket, msg.c_str(), (int)msg.size(), 0);
@@ -130,8 +146,11 @@ void DebugPrint(const char *level, const std::string &message)
std::string msg = fmt::format("{}dbg: [{}] {}\n", GetLogPrefix(), level, message);
fputs(msg.c_str(), stderr);
NetworkAdminConsole(level, message);
if (_settings_client.gui.developer >= 2) IConsolePrint(CC_DEBUG, "dbg: [{}] {}", level, message);
if (_debug_remote_console.load()) {
/* Only add to the queue when there is at least one consumer of the data. */
std::lock_guard<std::mutex> lock(_debug_remote_console_mutex);
_debug_remote_console_queue.push_back({ level, message });
}
}
}
@@ -229,3 +248,47 @@ const char *GetLogPrefix()
return _log_prefix;
}
/**
* Send the queued Debug messages to either NetworkAdminConsole or IConsolePrint from the
* GameLoop thread to prevent concurrent accesses to both the NetworkAdmin's packet queue
* as well as IConsolePrint's buffers.
*
* This is to be called from the GameLoop thread.
*/
void DebugSendRemoteMessages()
{
if (!_debug_remote_console.load()) return;
{
std::lock_guard<std::mutex> lock(_debug_remote_console_mutex);
std::swap(_debug_remote_console_queue, _debug_remote_console_queue_spare);
}
for (auto &item : _debug_remote_console_queue_spare) {
NetworkAdminConsole(item.level, item.message);
if (_settings_client.gui.developer >= 2) IConsolePrint(CC_DEBUG, "dbg: [{}] {}", item.level, item.message);
}
_debug_remote_console_queue_spare.clear();
}
/**
* Reconsider whether we need to send debug messages to either NetworkAdminConsole
* or IConsolePrint. The former is when they have enabled console handling whereas
* the latter depends on the gui.developer setting's value.
*
* This is to be called from the GameLoop thread.
*/
void DebugReconsiderSendRemoteMessages()
{
bool enable = _settings_client.gui.developer >= 2;
for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::IterateActive()) {
if (as->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) {
enable = true;
break;
}
}
_debug_remote_console.store(enable);
}

View File

@@ -122,4 +122,7 @@ void CDECL ShowInfoF(const char *str, ...) WARN_FORMAT(1, 2);
const char *GetLogPrefix();
void DebugSendRemoteMessages();
void DebugReconsiderSendRemoteMessages();
#endif /* DEBUG_H */

View File

@@ -1059,18 +1059,19 @@ void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub,
/**
* The code for setting up the blitter mode and sprite information before finally drawing the sprite.
* @param sprite The sprite to draw.
* @param x The X location to draw.
* @param y The Y location to draw.
* @param mode The settings for the blitter to pass.
* @param sub Whether to only draw a sub set of the sprite.
* @param zoom The zoom level at which to draw the sprites.
* @param x The X location to draw.
* @param y The Y location to draw.
* @param mode The settings for the blitter to pass.
* @param sub Whether to only draw a sub set of the sprite.
* @param zoom The zoom level at which to draw the sprites.
* @param dst Optional parameter for a different blitting destination.
* @tparam ZOOM_BASE The factor required to get the sub sprite information into the right size.
* @tparam SCALED_XY Whether the X and Y are scaled or unscaled.
*/
template <int ZOOM_BASE, bool SCALED_XY>
static void GfxBlitter(const Sprite * const sprite, int x, int y, BlitterMode mode, const SubSprite * const sub, SpriteID sprite_id, ZoomLevel zoom)
static void GfxBlitter(const Sprite * const sprite, int x, int y, BlitterMode mode, const SubSprite * const sub, SpriteID sprite_id, ZoomLevel zoom, const DrawPixelInfo *dst = nullptr)
{
const DrawPixelInfo *dpi = _cur_dpi;
const DrawPixelInfo *dpi = (dst != nullptr) ? dst : _cur_dpi;
Blitter::BlitterParams bp;
if (SCALED_XY) {
@@ -1185,6 +1186,47 @@ static void GfxBlitter(const Sprite * const sprite, int x, int y, BlitterMode mo
BlitterFactory::GetCurrentBlitter()->Draw(&bp, mode, zoom);
}
/**
* Draws a sprite to a new RGBA buffer (see Colour union) instead of drawing to the screen.
*
* @param spriteId The sprite to draw.
* @return Pixel buffer, or nullptr if an 8bpp blitter is being used.
*/
std::unique_ptr<uint32[]> DrawSpriteToRgbaBuffer(SpriteID spriteId)
{
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
if (!blitter->Is32BppSupported()) return nullptr;
/* Gather information about the sprite to write, reserve memory */
const SpriteID real_sprite = GB(spriteId, 0, SPRITE_WIDTH);
const Sprite *sprite = GetSprite(real_sprite, ST_NORMAL);
std::unique_ptr<uint32[]> result(new uint32[sprite->width * sprite->height]);
/* Prepare new DrawPixelInfo - Normally this would be the screen but we want to draw to another buffer here.
* Normally, pitch would be scaled screen width, but in our case our "screen" is only the sprite width wide. */
DrawPixelInfo dpi;
dpi.dst_ptr = result.get();
dpi.pitch = sprite->width;
dpi.left = 0;
dpi.top = 0;
dpi.width = sprite->width;
dpi.height = sprite->height;
dpi.zoom = ZOOM_LVL_NORMAL;
/* Zero out the allocated memory, there may be garbage present. */
uint32 *writeHead = (uint32*)result.get();
for (int i = 0; i < sprite->width * sprite->height; i++) {
writeHead[i] = 0;
}
/* Temporarily disable screen animations while blitting - This prevents 40bpp_anim from writing to the animation buffer. */
_screen_disable_anim = true;
GfxBlitter<1, false>(sprite, 0, 0, BM_NORMAL, nullptr, real_sprite, ZOOM_LVL_NORMAL, &dpi);
_screen_disable_anim = false;
return result;
}
static void GfxMainBlitterViewport(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub, SpriteID sprite_id)
{
GfxBlitter<ZOOM_LVL_BASE, false>(sprite, x, y, mode, sub, sprite_id, _cur_dpi->zoom);

View File

@@ -68,6 +68,7 @@ extern std::vector<Dimension> _resolutions;
extern Dimension _cur_resolution;
extern Palette _cur_palette; ///< Current palette
void HandleToolbarHotkey(int hotkey);
void HandleKeypress(uint keycode, WChar key);
void HandleTextInput(const char *str, bool marked = false, const char *caret = nullptr, const char *insert_location = nullptr, const char *replacement_end = nullptr);
void HandleCtrlChanged();
@@ -90,6 +91,7 @@ void GfxScroll(int left, int top, int width, int height, int xo, int yo);
Dimension GetSpriteSize(SpriteID sprid, Point *offset = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI);
void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr);
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = nullptr, ZoomLevel zoom = ZOOM_LVL_GUI);
std::unique_ptr<uint32[]> DrawSpriteToRgbaBuffer(SpriteID spriteId);
int DrawString(int left, int right, int top, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
int DrawString(int left, int right, int top, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);

View File

@@ -888,6 +888,12 @@ Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(const char *str, siz
linecache = new LineCache();
}
if (auto match = linecache->find(LineCacheQuery{state, std::string_view{str, len}});
match != linecache->end()) {
return match->second;
}
/* Create missing entry */
LineCacheKey key;
key.state_before = state;
key.str.assign(str, len);

View File

@@ -17,6 +17,8 @@
#include <map>
#include <string>
#include <stack>
#include <string_view>
#include <type_traits>
#include <vector>
#ifdef WITH_ICU_LX
@@ -155,14 +157,25 @@ class Layouter : public std::vector<std::unique_ptr<const ParagraphLayouter::Lin
struct LineCacheKey {
FontState state_before; ///< Font state at the beginning of the line.
std::string str; ///< Source string of the line (including colour and font size codes).
};
/** Comparison operator for std::map */
bool operator<(const LineCacheKey &other) const
struct LineCacheQuery {
FontState state_before; ///< Font state at the beginning of the line.
std::string_view str; ///< Source string of the line (including colour and font size codes).
};
/** Comparator for std::map */
struct LineCacheCompare {
using is_transparent = void; ///< Enable map queries with various key types
/** Comparison operator for LineCacheKey and LineCacheQuery */
template<typename Key1, typename Key2>
bool operator()(const Key1 &lhs, const Key2 &rhs) const
{
if (this->state_before.fontsize != other.state_before.fontsize) return this->state_before.fontsize < other.state_before.fontsize;
if (this->state_before.cur_colour != other.state_before.cur_colour) return this->state_before.cur_colour < other.state_before.cur_colour;
if (this->state_before.colour_stack != other.state_before.colour_stack) return this->state_before.colour_stack < other.state_before.colour_stack;
return this->str < other.str;
if (lhs.state_before.fontsize != rhs.state_before.fontsize) return lhs.state_before.fontsize < rhs.state_before.fontsize;
if (lhs.state_before.cur_colour != rhs.state_before.cur_colour) return lhs.state_before.cur_colour < rhs.state_before.cur_colour;
if (lhs.state_before.colour_stack != rhs.state_before.colour_stack) return lhs.state_before.colour_stack < rhs.state_before.colour_stack;
return lhs.str < rhs.str;
}
};
public:
@@ -179,7 +192,7 @@ public:
~LineCacheItem() { delete layout; free(buffer); }
};
private:
typedef std::map<LineCacheKey, LineCacheItem> LineCache;
typedef std::map<LineCacheKey, LineCacheItem, LineCacheCompare> LineCache;
static LineCache *linecache;
static LineCacheItem &GetCachedParagraphLayout(const char *str, size_t len, const FontState &state);

View File

@@ -24,6 +24,7 @@
#include "core/geometry_func.hpp"
#include "company_base.h"
#include "company_gui.h"
#include "gui.h"
#include "widgets/group_widget.h"
@@ -745,17 +746,19 @@ public:
NOT_REACHED();
}
if (v) {
this->vehicle_sel = v->index;
if (_ctrl_pressed) {
this->SelectGroup(v->group_id);
if (this->grouping == GB_NONE) {
this->SelectGroup(v->group_id);
} else {
ShowOrdersWindow(v);
}
} else {
this->vehicle_sel = v->index;
SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this);
SetMouseCursorVehicle(v, EIT_IN_LIST);
_cursor.vehchain = true;
this->SetDirty();
}
SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this);
SetMouseCursorVehicle(v, EIT_IN_LIST);
_cursor.vehchain = true;
this->SetDirty();
}
break;

View File

@@ -769,6 +769,7 @@ public:
const IndustrySpec *indsp = (this->selected_type == INVALID_INDUSTRYTYPE) ? nullptr : GetIndustrySpec(this->selected_type);
if (indsp == nullptr) this->enabled[this->selected_index] = _settings_game.difficulty.industry_density != ID_FUND_ONLY;
this->SetButtons();
this->SetDirty();
}
};

View File

@@ -11,12 +11,14 @@
#include "error.h"
#include "gui.h"
#include "window_gui.h"
#include "window_func.h"
#include "textbuf_gui.h"
#include "network/network.h"
#include "genworld.h"
#include "network/network_gui.h"
#include "network/network_content.h"
#include "landscape_type.h"
#include "landscape.h"
#include "strings_func.h"
#include "fios.h"
#include "ai/ai_gui.hpp"
@@ -25,6 +27,10 @@
#include "language.h"
#include "rev.h"
#include "highscore.h"
#include "signs_base.h"
#include "viewport_func.h"
#include "vehicle_base.h"
#include <regex>
#include "widgets/intro_widget.h"
@@ -33,13 +39,203 @@
#include "safeguards.h"
/**
* A viewport command for the main menu background (intro game).
*/
struct IntroGameViewportCommand {
/** Horizontal alignment value. */
enum AlignmentH : byte {
LEFT,
CENTRE,
RIGHT,
};
/** Vertical alignment value. */
enum AlignmentV : byte {
TOP,
MIDDLE,
BOTTOM,
};
int command_index = 0; ///< Sequence number of the command (order they are performed in).
Point position{ 0, 0 }; ///< Calculated world coordinate to position viewport top-left at.
VehicleID vehicle = INVALID_VEHICLE; ///< Vehicle to follow, or INVALID_VEHICLE if not following a vehicle.
uint delay = 0; ///< Delay until next command.
int zoom_adjust = 0; ///< Adjustment to zoom level from base zoom level.
bool pan_to_next = false; ///< If true, do a smooth pan from this position to the next.
AlignmentH align_h = CENTRE; ///< Horizontal alignment.
AlignmentV align_v = MIDDLE; ///< Vertical alignment.
/**
* Calculate effective position.
* This will update the position field if a vehicle is followed.
* @param vp Viewport to calculate position for.
* @return Calculated position in the viewport.
*/
Point PositionForViewport(const Viewport *vp)
{
if (this->vehicle != INVALID_VEHICLE) {
const Vehicle *v = Vehicle::Get(this->vehicle);
this->position = RemapCoords(v->x_pos, v->y_pos, v->z_pos);
}
Point p;
switch (this->align_h) {
case LEFT: p.x = this->position.x; break;
case CENTRE: p.x = this->position.x - vp->virtual_width / 2; break;
case RIGHT: p.x = this->position.x - vp->virtual_width; break;
}
switch (this->align_v) {
case TOP: p.y = this->position.y; break;
case MIDDLE: p.y = this->position.y - vp->virtual_height / 2; break;
case BOTTOM: p.y = this->position.y - vp->virtual_height; break;
}
return p;
}
};
struct SelectGameWindow : public Window {
/** Vector of viewport commands parsed. */
std::vector<IntroGameViewportCommand> intro_viewport_commands;
/** Index of currently active viewport command. */
size_t cur_viewport_command_index;
/** Time spent (milliseconds) on current viewport command. */
uint cur_viewport_command_time;
/**
* Find and parse all viewport command signs.
* Fills the intro_viewport_commands vector and deletes parsed signs from the world.
*/
void ReadIntroGameViewportCommands()
{
intro_viewport_commands.clear();
/* Regular expression matching the commands: T, spaces, integer, spaces, flags, spaces, integer */
const char *sign_langauge = "^T\\s*([0-9]+)\\s*([-+A-Z0-9]+)\\s*([0-9]+)";
std::regex re(sign_langauge, std::regex_constants::icase);
/* List of signs successfully parsed to delete afterwards. */
std::vector<SignID> signs_to_delete;
for (const Sign *sign : Sign::Iterate()) {
std::smatch match;
if (std::regex_search(sign->name, match, re)) {
IntroGameViewportCommand vc;
/* Sequence index from the first matching group. */
vc.command_index = std::stoi(match[1].str());
/* Sign coordinates for positioning. */
vc.position = RemapCoords(sign->x, sign->y, sign->z);
/* Delay from the third matching group. */
vc.delay = std::stoi(match[3].str()) * 1000; // milliseconds
/* Parse flags from second matching group. */
enum IdType {
ID_NONE, ID_VEHICLE
} id_type = ID_NONE;
for (char c : match[2].str()) {
if (isdigit(c)) {
if (id_type == ID_VEHICLE) {
vc.vehicle = vc.vehicle * 10 + (c - '0');
}
} else {
id_type = ID_NONE;
switch (toupper(c)) {
case '-': vc.zoom_adjust = +1; break;
case '+': vc.zoom_adjust = -1; break;
case 'T': vc.align_v = IntroGameViewportCommand::TOP; break;
case 'M': vc.align_v = IntroGameViewportCommand::MIDDLE; break;
case 'B': vc.align_v = IntroGameViewportCommand::BOTTOM; break;
case 'L': vc.align_h = IntroGameViewportCommand::LEFT; break;
case 'C': vc.align_h = IntroGameViewportCommand::CENTRE; break;
case 'R': vc.align_h = IntroGameViewportCommand::RIGHT; break;
case 'P': vc.pan_to_next = true; break;
case 'V': id_type = ID_VEHICLE; vc.vehicle = 0; break;
}
}
}
/* Successfully parsed, store. */
intro_viewport_commands.push_back(vc);
signs_to_delete.push_back(sign->index);
}
}
/* Sort the commands by sequence index. */
std::sort(intro_viewport_commands.begin(), intro_viewport_commands.end(), [](const IntroGameViewportCommand &a, const IntroGameViewportCommand &b) { return a.command_index < b.command_index; });
/* Delete all the consumed signs, from last ID to first ID. */
std::sort(signs_to_delete.begin(), signs_to_delete.end(), [](SignID a, SignID b) { return a > b; });
for (SignID sign_id : signs_to_delete) {
delete Sign::Get(sign_id);
}
}
SelectGameWindow(WindowDesc *desc) : Window(desc)
{
this->CreateNestedTree();
this->FinishInitNested(0);
this->OnInvalidateData();
this->ReadIntroGameViewportCommands();
this->cur_viewport_command_index = (size_t)-1;
this->cur_viewport_command_time = 0;
}
void OnRealtimeTick(uint delta_ms) override
{
/* Move the main game viewport according to intro viewport commands. */
if (intro_viewport_commands.empty()) return;
/* Determine whether to move to the next command or stay at current. */
bool changed_command = false;
if (this->cur_viewport_command_index >= intro_viewport_commands.size()) {
/* Reached last, rotate back to start of the list. */
this->cur_viewport_command_index = 0;
changed_command = true;
} else {
/* Check if current command has elapsed and switch to next. */
this->cur_viewport_command_time += delta_ms;
if (this->cur_viewport_command_time >= intro_viewport_commands[this->cur_viewport_command_index].delay) {
this->cur_viewport_command_index = (this->cur_viewport_command_index + 1) % intro_viewport_commands.size();
this->cur_viewport_command_time = 0;
changed_command = true;
}
}
IntroGameViewportCommand &vc = intro_viewport_commands[this->cur_viewport_command_index];
Window *mw = FindWindowByClass(WC_MAIN_WINDOW);
Viewport *vp = mw->viewport;
/* Early exit if the current command hasn't elapsed and isn't animated. */
if (!changed_command && !vc.pan_to_next && vc.vehicle == INVALID_VEHICLE) return;
/* Reset the zoom level. */
if (changed_command) FixTitleGameZoom(vc.zoom_adjust);
/* Calculate current command position (updates followed vehicle coordinates). */
Point pos = vc.PositionForViewport(vp);
/* Calculate panning (linear interpolation between current and next command position). */
if (vc.pan_to_next) {
size_t next_command_index = (this->cur_viewport_command_index + 1) % intro_viewport_commands.size();
IntroGameViewportCommand &nvc = intro_viewport_commands[next_command_index];
Point pos2 = nvc.PositionForViewport(vp);
const double t = this->cur_viewport_command_time / (double)vc.delay;
pos.x = pos.x + (int)(t * (pos2.x - pos.x));
pos.y = pos.y + (int)(t * (pos2.y - pos.y));
}
/* Update the viewport position. */
mw->viewport->dest_scrollpos_x = mw->viewport->scrollpos_x = pos.x;
mw->viewport->dest_scrollpos_y = mw->viewport->scrollpos_y = pos.y;
UpdateViewportPosition(mw);
mw->SetDirty(); // Required during panning, otherwise logo graphics disappears
/* If there is only one command, we just executed it and don't need to do any more */
if (intro_viewport_commands.size() == 1 && vc.vehicle == INVALID_VEHICLE) intro_viewport_commands.clear();
}
/**

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -134,7 +134,7 @@ STR_ABBREV_ALL :{TINY_FONT}ПӖ
# 'Mode' of transport for cargoes
STR_PASSENGERS :{COMMA} пассажир{P "" сем}
# Colours, do not shuffle
###length 17
STR_COLOUR_DARK_BLUE :Тӗттӗм кӑвак
STR_COLOUR_PALE_GREEN :Шупка симӗс
STR_COLOUR_PINK :Кӗрен
@@ -169,7 +169,9 @@ STR_UNITS_POWER_SI :{COMMA}кВт
STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Чӳречене хуп
# Show engines button
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Query window
STR_BUTTON_DEFAULT :{BLACK}Пӳрнӗ пек
@@ -204,7 +206,10 @@ STR_SORT_BY_POPULATION :Ҫынисем
# Group by options for vehicle list
# Order button in shared orders vehicle list
# Tooltips for the main toolbar
###length 31
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Вӑййи тӑхтав
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Вӑййи хӑвӑртлат
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Майлаштару
@@ -214,69 +219,71 @@ STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Аэро
STR_SCENEDIT_TOOLBAR_OPENTTD :{YELLOW}OpenTTD
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Объект вырӑнӗ
############ range for SE file menu starts
# Scenario editor file menu
###length 7
STR_SCENEDIT_FILE_MENU_SEPARATOR :
STR_SCENEDIT_FILE_MENU_QUIT :Вӗҫле
############ range for SE file menu starts
############ range for settings menu starts
# Settings menu
###length 14
STR_SETTINGS_MENU_GAME_OPTIONS :Вӑййи майлаштару
STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF майлаштару
############ range ends here
############ range for file menu starts
# File menu
###length 5
STR_FILE_MENU_SEPARATOR :
STR_FILE_MENU_EXIT :Тух
############ range ends here
# map menu
# Map menu
###length 4
############ range for town menu starts
############ range ends here
# Town menu
###length 2
############ range for subsidies menu starts
# Subsidies menu
###length 1
STR_SUBSIDIES_MENU_SUBSIDIES :Грантсем
############ range ends here
############ range for graph menu starts
############ range ends here
# Graph menu
###length 6
############ range for company league menu starts
############ range ends here
# Company league menu
###length 3
############ range for industry menu starts
############ range ends here
# Industry menu
###length 3
############ range for railway construction menu starts
############ range ends here
# URailway construction menu
###length 4
############ range for road construction menu starts
############ range ends here
# Road construction menu
###length 2
############ range for waterways construction menu starts
############ range ends here
# Waterways construction menu
###length 1
############ range for airport construction menu starts
# Aairport construction menu
###length 1
STR_AIRCRAFT_MENU_AIRPORT_CONSTRUCTION :Аэропорт ҫурт
############ range ends here
############ range for landscaping menu starts
############ range ends here
# Landscaping menu
###length 3
############ range for music menu starts
# Music menu
###length 1
STR_TOOLBAR_SOUND_MUSIC :Сасӑ/Юрӑ-кӗвӗ
############ range ends here
############ range for message menu starts
############ range ends here
# Message menu
###length 3
############ range for about menu starts
# About menu
###length 10
STR_ABOUT_MENU_SEPARATOR :
STR_ABOUT_MENU_SCREENSHOT :Экран сӑнӗ
STR_ABOUT_MENU_ABOUT_OPENTTD :'OpenTTD' çинчен
############ range ends here
############ range for ordinal numbers used for the place in the highscore window
# Place in highscore window
###length 15
STR_ORDINAL_NUMBER_1ST :1мӗш
STR_ORDINAL_NUMBER_2ND :2мӗш
STR_ORDINAL_NUMBER_3RD :3-мӗш
@@ -292,9 +299,8 @@ STR_ORDINAL_NUMBER_12TH :12-мӗш
STR_ORDINAL_NUMBER_13TH :13-мӗш
STR_ORDINAL_NUMBER_14TH :14-мӗш
STR_ORDINAL_NUMBER_15TH :15-мӗш
############ range for ordinal numbers ends
############ range for days starts
###length 31
STR_DAY_NUMBER_1ST :1мӗш
STR_DAY_NUMBER_2ND :2мӗш
STR_DAY_NUMBER_3RD :3-мӗш
@@ -326,9 +332,8 @@ STR_DAY_NUMBER_28TH :28-мӗш
STR_DAY_NUMBER_29TH :29-мӗш
STR_DAY_NUMBER_30TH :30-мӗш
STR_DAY_NUMBER_31ST :31-мӗш
############ range for days ends
############ range for months starts
###length 12
STR_MONTH_ABBREV_JAN :Кӑр
STR_MONTH_ABBREV_FEB :Нар
STR_MONTH_ABBREV_MAR :Пуш
@@ -342,6 +347,7 @@ STR_MONTH_ABBREV_OCT :Юпа
STR_MONTH_ABBREV_NOV :Чӳк
STR_MONTH_ABBREV_DEC :Раш
###length 12
STR_MONTH_JAN :Кӑрлач
STR_MONTH_FEB :Нарӑс
STR_MONTH_MAR :Пуш
@@ -354,7 +360,6 @@ STR_MONTH_SEP :Авӑн
STR_MONTH_OCT :Юпа
STR_MONTH_NOV :Чӳк
STR_MONTH_DEC :Раштав
############ range for months ends
# Graph window
STR_GRAPH_KEY_BUTTON :{BLACK}Уҫӑ
@@ -381,14 +386,16 @@ STR_PERFORMANCE_DETAIL_KEY :{BLACK}Вакк
STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY :{BLACK}({CURRENCY_SHORT}/{CURRENCY_SHORT})
STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA}/{COMMA})
STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}%
############ Those following lines need to be in this order!!
###length 10
STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}Ҫул-йӗр:
STR_PERFORMANCE_DETAIL_STATIONS :{BLACK}Станцисем:
STR_PERFORMANCE_DETAIL_CARGO :{BLACK}Тиев:
STR_PERFORMANCE_DETAIL_MONEY :{BLACK}Укҫӑ:
STR_PERFORMANCE_DETAIL_LOAN :{BLACK}Кивҫен:
STR_PERFORMANCE_DETAIL_TOTAL :{BLACK}Пурӗ:
############ End of order list
###length 10
# Music window
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
@@ -410,10 +417,12 @@ STR_HIGHSCORE_STATS :{BIG_FONT}'{STR
# Smallmap window
STR_SMALLMAP_CAPTION :{WHITE}Карттӑ - {STRING}
###length 7
STR_SMALLMAP_TYPE_VEHICLES :Ҫул-йӗр
STR_SMALLMAP_TYPE_VEGETATION :Йывăç-курӑк
STR_SMALLMAP_TYPE_OWNERS :Хуҫасем
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Ҫулсем
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Чукун ҫулсем
STR_SMALLMAP_LEGENDA_STATIONS_AIRPORTS_DOCKS :{TINY_FONT}{BLACK}Станцисем/Аэропортсем/Портсем
@@ -455,6 +464,8 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Пӗлт
###length VEHICLE_TYPES
###next-name-looks-similar
# Order review system / warnings
@@ -463,19 +474,20 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Пӗлт
###length 4
# Extra view window
# Game options window
############ start of currency region
###length 42
STR_GAME_OPTIONS_CURRENCY_RUR :Вырӑсла тенкӗ (RUR)
############ end of currency region
###length 2
############ start of townname region
###length 21
STR_GAME_OPTIONS_TOWN_NAME_ORIGINAL_ENGLISH :Акӑлчан
STR_GAME_OPTIONS_TOWN_NAME_FRENCH :Францири
STR_GAME_OPTIONS_TOWN_NAME_GERMAN :Нимӗҫ
@@ -495,13 +507,12 @@ STR_GAME_OPTIONS_TOWN_NAME_DANISH :Датчан
STR_GAME_OPTIONS_TOWN_NAME_TURKISH :Турккӑла
STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :Итали
STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Катталун
############ end of townname region
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Хӑй управ
############ start of autosave dropdown
# Autosave dropdown
###length 5
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Сӳнтер
############ end of autosave dropdown
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Чӗлхи
@@ -539,66 +550,232 @@ STR_NUM_CUSTOM_NUMBER :Харпӑр х
STR_VARIETY_NONE :Ҫук
###length 5
###length 6
STR_SEA_LEVEL_CUSTOM :Харпӑр хӑй
STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Харпӑр хӑй ({NUM}%)
###length 4
###length 3
STR_DISASTER_NONE :Ҫук
###length 4
STR_SUBSIDY_X1_5 :x1.5
STR_SUBSIDY_X2 :x2
STR_SUBSIDY_X3 :x3
STR_SUBSIDY_X4 :x4
###length 7
###length 3
# Settings tree window
###length 3
###length 3
STR_CONFIG_SETTING_OFF :Сӳнтер
STR_CONFIG_SETTING_ON :Ҫут
STR_CONFIG_SETTING_DISABLED :хастар мар
###length 3
STR_CONFIG_SETTING_COMPANIES_OFF :Сӳнтер
###length 3
STR_CONFIG_SETTING_NONE :Ҫук
STR_CONFIG_SETTING_ORIGINAL :Чӑн
STR_CONFIG_SETTING_REALISTIC :Реалисмлӑ
###length 3
STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :Сулахайра
STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :Варринче
STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :Сылтӑмра
###setting-zero-is-special
###setting-zero-is-special
###length 3
STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :ҫук
###length 3
###length 3
###length 4
###length 3
STR_CONFIG_SETTING_PLANE_CRASHES_NONE :ҫук
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Аэропорт кивел мар: {STRING}
###length 3
###length 2
###setting-zero-is-special
###length 2
STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Чӑн
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
###length 4
###length 3
STR_CONFIG_SETTING_TREE_PLACER_NONE :Ҫук
STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Чӑн
###length 2
###length 2
###length 3
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Симĕс
###length 4
###length 3
STR_CONFIG_SETTING_LIVERIES_NONE :Ҫук
###length 3
STR_CONFIG_SETTING_SCROLLWHEEL_OFF :Сӳнтер
###length 4
###length 3
###length 3
STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Сӳнтер
###length 3
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :вӑрӑм (2008 раш 31меш)
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :кӗске (2008-12-31)
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31)
###length 4
###length 3
###setting-zero-is-special
###length 3
###setting-zero-is-special
@@ -607,28 +784,71 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31
STR_CONFIG_SETTING_NEWS_SUBSIDIES :Грантсем: {STRING}
###length 3
STR_CONFIG_SETTING_NEWS_MESSAGES_OFF :Сӳнтер
STR_CONFIG_SETTING_NEWS_MESSAGES_SUMMARY :Кӗске
STR_CONFIG_SETTING_NEWS_MESSAGES_FULL :Тулли
###setting-zero-is-special
###length 3
###length 2
###length 2
###length 5
STR_CONFIG_SETTING_TOWN_LAYOUT_DEFAULT :чӑн
STR_CONFIG_SETTING_TOWN_LAYOUT_2X2_GRID :2x2
STR_CONFIG_SETTING_TOWN_LAYOUT_3X3_GRID :3x3
###length 3
###length 2
###length 4
###setting-zero-is-special
###setting-zero-is-special
###length 6
###length 3
###length 5
STR_CONFIG_SETTING_TOWN_GROWTH_NONE :Ҫук
STR_CONFIG_SETTING_TOWN_GROWTH_SLOW :Вӑрах
STR_CONFIG_SETTING_TOWN_GROWTH_NORMAL :Виҫеллӗ
STR_CONFIG_SETTING_TOWN_GROWTH_FAST :Хӑвӑрт
STR_CONFIG_SETTING_TOWN_GROWTH_VERY_FAST :Питӗ хӑвӑрт
###setting-zero-is-special
###length 3
###length 4
###length 3
###length 3
###length 3
###length 3
###length 3
STR_CONFIG_SETTING_INTERFACE :{ORANGE}Интерфейс
STR_CONFIG_SETTING_INTERFACE_CONSTRUCTION :{ORANGE}Лартӑм
@@ -636,10 +856,10 @@ STR_CONFIG_SETTING_VEHICLES :{ORANGE}Ҫул-
STR_CONFIG_SETTING_ENVIRONMENT_TOWNS :{ORANGE}Хуласем
STR_CONFIG_SETTING_AI :{ORANGE}Ӑмӑртуҫӑсем
###length 2
STR_CONFIG_SETTING_PATHFINDER_NPF :NPF
# Config errors
# Video initalization errors
@@ -666,15 +886,18 @@ STR_QUIT_NO :{BLACK}Ҫук
STR_ABANDON_GAME_CAPTION :{WHITE}Вӑййи ан килӗш
# Cheat window
STR_CHEAT_CHANGE_DATE :{LTBLUE}Тӳрлет кун: {ORANGE}{DATE_SHORT}
###length 4
STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Виҫеллӗ климат
STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Сивӗ климат
STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Тропик климат
STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :Вӑйӑ пахчи
STR_CHEAT_CHANGE_DATE :{LTBLUE}Тӳрлет кун: {ORANGE}{DATE_SHORT}
# Livery window
###length 23
STR_LIVERY_DEFAULT :Яланхи тӗс
STR_LIVERY_STEAM :Пӑравус
STR_LIVERY_DIESEL :Ӑшӑвус(Diesel Engine)
@@ -728,8 +951,8 @@ STR_FACE_COLLAR :Ҫуха:
STR_FACE_TIE :Галстук:
STR_FACE_EARRING :Алка:
############ Next lines match ServerGameType
############ End of leave-in-this-order
# Matches ServerGameType
###length 3
# Network server list
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Вӑйӑҫӑ ят:
@@ -748,7 +971,6 @@ STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP :{BLACK}Чӗлх
STR_NETWORK_SERVER_LIST_GAME_INFO :{SILVER}ВӐЙЙИ ИНФОРМАЦИ
STR_NETWORK_SERVER_LIST_CLIENTS :{SILVER}Вӑйӑҫӑсем: {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
STR_NETWORK_SERVER_LIST_LANGUAGE :{SILVER}Чӗлхи: {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Ҫӗр пичӗ: {WHITE}{STRING}
STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Виҫе картти: {WHITE}{COMMA}x{COMMA}
STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Сервер версиӗ: {WHITE}{STRING}
@@ -776,9 +998,8 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Вырн
# Network connecting window
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 8
@@ -786,8 +1007,8 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Вырн
# Network client list
############ Begin of ConnectionType
############ End of ConnectionType
# Matches ConnectionType
###length 5
@@ -802,17 +1023,20 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Вырн
# Network messages
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 21
# Network related errors
STR_NETWORK_SERVER_MESSAGE :*** {1:STRING}
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 12
# Content downloading window
###length 5
STR_CONTENT_DETAIL_VERSION :{SILVER}Верси: {WHITE}{STRING}
# Order of these is important!
@@ -966,10 +1190,10 @@ STR_LAI_OBJECT_DESCRIPTION_LIGHTHOUSE :Маяк
STR_ABOUT_VERSION :{BLACK}OpenTTD верси {REV}
# Framerate display window
############ Leave those lines in this order!!
############ End of leave-in-this-order
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 15
###length 15
# Save/load game/scenario
@@ -1022,6 +1246,7 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING
# NewGRF status
STR_NEWGRF_LIST_NONE :Ҫук
###length 3
# NewGRF 'it's broken' warnings
@@ -1049,15 +1274,17 @@ STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
# Town local authority window
STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING}
###length 8
###length 8
# Goal window
STR_GOALS_TEXT :{ORANGE}{STRING}
# Goal question window
############ Start of Goal Question button list
############ End of Goal Question button list
# Goal Question button list
###length 18
# Subsidies window
STR_SUBSIDIES_NONE :{ORANGE}- Ҫук -
@@ -1078,8 +1305,7 @@ STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_L
############ range for rating starts
############ range for rating ends
###length 8
@@ -1091,6 +1317,9 @@ STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOIN
# Finances window
STR_FINANCES_YEAR :{WHITE}{NUM}
###length 13
STR_FINANCES_NEGATIVE_INCOME :{BLACK}-{CURRENCY_LONG}
STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG}
@@ -1114,16 +1343,20 @@ STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ҫу
# Vehicle lists
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Group window
###length VEHICLE_TYPES
###length VEHICLE_TYPES
@@ -1132,22 +1365,34 @@ STR_INDUSTRY_DIRECTORY_NONE :{ORANGE}- Ҫу
# Build vehicle window
###length 4
############ range for vehicle availability starts
############ range for vehicle availability ends
# Vehicle availability
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Depot window
STR_DEPOT_CAPTION :{WHITE}{DEPOT}
@@ -1157,18 +1402,29 @@ STR_DEPOT_NO_ENGINE :{BLACK}-
STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE}{STRING}
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Engine preview window
@@ -1180,34 +1436,48 @@ STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG}
# Autoreplace window
###length VEHICLE_TYPES
###length 2
###next-name-looks-similar
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Messages in the start stop button in the vehicle view
# Vehicle stopped/started animations
###length 2
###length 2
# Vehicle details
###length VEHICLE_TYPES
# The next two need to stay in this order
@@ -1216,6 +1486,7 @@ STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Савӑ
###length VEHICLE_TYPES
# Extra buttons for train details windows
@@ -1225,8 +1496,11 @@ STR_VEHICLE_INFO_NO_CAPACITY :{BLACK}Савӑ
# Vehicle refit
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Order view
@@ -1242,6 +1516,8 @@ STR_ORDER_TEXT :{STRING} {STRIN
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
###next-name-looks-similar
@@ -1252,6 +1528,9 @@ STR_ORDER_TEXT :{STRING} {STRIN
# String parts to build the order string
###length 3
###next-name-looks-similar
STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING}
STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT}
@@ -1262,6 +1541,7 @@ STR_ORDER_GO_TO_STATION :{STRING} {STATI
###length 3
@@ -1305,6 +1585,7 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN
# Textfile window
###length 3
# Vehicle loading indicators
@@ -1386,13 +1667,23 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Ҫул
# Generic vehicle errors
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
@@ -1409,8 +1700,10 @@ STR_ERROR_OBJECT_IN_THE_WAY :{WHITE}Ҫул
# Sign related errors
# Translatable comment for OpenTTD's desktop shortcut
###external 1
# Translatable descriptions in media/baseset/*.ob* files
###external 10
##id 0x2000
# Town building names
@@ -1423,19 +1716,29 @@ STR_TOWN_BUILDING_NAME_STATUE_1 :Палӑк
############ WARNING, using range 0x6000 for strings that are stored in the savegame
############ These strings may never get a new id, or savegames will break!
##id 0x6000
STR_SV_EMPTY :
###length 27
STR_SV_STNAME :{STRING}
STR_SV_STNAME_AIRPORT :{STRING} Аэропорт
STR_SV_STNAME_BUOY :{STRING}
STR_SV_STNAME_WAYPOINT :{STRING}
##id 0x6020
############ end of savegame specific region!
##id 0x8000
###length 116
# Vehicle names
###length 88
###length 11
###length 41
##id 0x8800
# Formatting of some strings
STR_FORMAT_DATE_TINY :{STRING}.{STRING}.{NUM}
@@ -1444,6 +1747,14 @@ STR_FORMAT_DATE_LONG :{STRING} {STRIN
STR_FORMAT_DATE_ISO :{2:NUM}-{1:STRING}-{0:STRING}
###length 2
###length 2
###length 6
###next-name-looks-similar
# _SERIAL version of AIRACRAFT doesn't exist
STR_SAVEGAME_NAME_DEFAULT :{COMPANY}, {STRING}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -57,7 +57,7 @@ STR_ABBREV_COAL :{TINY_FONT}क
# 'Mode' of transport for cargoes
# Colours, do not shuffle
###length 17
STR_COLOUR_PINK :गुलाबी
STR_COLOUR_RED :लाल
@@ -77,7 +77,9 @@ STR_UNITS_POWER_METRIC :{COMMA}{NBSP}hp
STR_TOOLTIP_RESIZE :{BLACK}खिड़की का आकार बदलने के लिये क्लिक करके खींचें
# Show engines button
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Query window
@@ -97,86 +99,89 @@ STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :पिछले
# Group by options for vehicle list
# Order button in shared orders vehicle list
# Tooltips for the main toolbar
###length 31
STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}ध्वनि/संगीत विकल्प
# Extra tooltips for the scenario editor toolbar
STR_SCENEDIT_TOOLBAR_TOOLTIP_DISPLAY_MAP_TOWN_DIRECTORY :{BLACK}मानचित्र, नगर निर्देशिका दिखायें
############ range for SE file menu starts
# Scenario editor file menu
###length 7
STR_SCENEDIT_FILE_MENU_SEPARATOR :
STR_SCENEDIT_FILE_MENU_QUIT :निकास
############ range for SE file menu starts
############ range for settings menu starts
# Settings menu
###length 14
STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :समायोजन
STR_SETTINGS_MENU_WAYPOINTS_DISPLAYED :पथ-संकेतों के नाम दिखायें
############ range ends here
############ range for file menu starts
# File menu
###length 5
STR_FILE_MENU_SEPARATOR :
############ range ends here
# map menu
# Map menu
###length 4
############ range for town menu starts
############ range ends here
# Town menu
###length 2
############ range for subsidies menu starts
############ range ends here
# Subsidies menu
###length 1
############ range for graph menu starts
############ range ends here
# Graph menu
###length 6
############ range for company league menu starts
############ range ends here
# Company league menu
###length 3
############ range for industry menu starts
# Industry menu
###length 3
STR_INDUSTRY_MENU_INDUSTRY_CHAIN :औद्योगिक शृंखला
############ range ends here
############ range for railway construction menu starts
# URailway construction menu
###length 4
STR_RAIL_MENU_ELRAIL_CONSTRUCTION :विद्युतिकृत रेलवे निर्माण
############ range ends here
############ range for road construction menu starts
############ range ends here
# Road construction menu
###length 2
############ range for waterways construction menu starts
############ range ends here
# Waterways construction menu
###length 1
############ range for airport construction menu starts
############ range ends here
# Aairport construction menu
###length 1
############ range for landscaping menu starts
############ range ends here
# Landscaping menu
###length 3
############ range for music menu starts
############ range ends here
# Music menu
###length 1
############ range for message menu starts
############ range ends here
# Message menu
###length 3
############ range for about menu starts
# About menu
###length 10
STR_ABOUT_MENU_SEPARATOR :
############ range ends here
############ range for ordinal numbers used for the place in the highscore window
# Place in highscore window
###length 15
STR_ORDINAL_NUMBER_2ND :द्वितीय
############ range for ordinal numbers ends
############ range for days starts
###length 31
STR_DAY_NUMBER_14TH :१४
STR_DAY_NUMBER_15TH :१५
STR_DAY_NUMBER_23RD :२३
############ range for days ends
############ range for months starts
###length 12
STR_MONTH_ABBREV_JAN :जन
STR_MONTH_ABBREV_NOV :नव
###length 12
STR_MONTH_AUG :अगस्त
############ range for months ends
# Graph window
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
@@ -193,10 +198,12 @@ STR_GRAPH_CARGO_PAYMENT_CARGO :{TINY_FONT}{BLA
STR_COMPANY_LEAGUE_COMPANY_NAME :{ORANGE}{COMPANY} {BLACK}{COMPANY_NUM} '{STRING}'
# Performance detail window
############ Those following lines need to be in this order!!
###length 10
STR_PERFORMANCE_DETAIL_VEHICLES :{BLACK}वाहन:
STR_PERFORMANCE_DETAIL_CARGO :{BLACK}माल :
############ End of order list
###length 10
# Music window
STR_MUSIC_TRACK_DIGIT :{TINY_FONT}{DKGREEN}{ZEROFILL_NUM}
@@ -208,6 +215,8 @@ STR_HIGHSCORE_PRESIDENT_OF_COMPANY_ACHIEVES_STATUS :{BIG_FONT}{WHIT
# Smallmap window
###length 7
STR_SMALLMAP_LEGENDA_TRUCK_LOADING_BAY :{TINY_FONT}{BLACK}ट्रक लदान वीथी
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}रिक्त भूमि
@@ -237,6 +246,8 @@ STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLAC
STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH :{BIG_FONT}{BLACK}{STRING}{INDUSTRY} के उत्पादन में {COMMA}% कमी आयी!
###length VEHICLE_TYPES
###next-name-looks-similar
# Order review system / warnings
@@ -246,32 +257,32 @@ STR_NEWS_NEW_VEHICLE_TYPE :{BIG_FONT}{BLAC
###length 4
# Extra view window
# Game options window
############ start of currency region
###length 42
STR_GAME_OPTIONS_CURRENCY_FIM :फिनलैंड मार्का (FIM)
STR_GAME_OPTIONS_CURRENCY_ISK :आइसलैंडिक क्रोना (ISK)
STR_GAME_OPTIONS_CURRENCY_HKD :हाँग काँग डॉलर (एचकेडी)
############ end of currency region
###length 2
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :दाईं ओर वाहन चलाएँ
############ start of townname region
###length 21
STR_GAME_OPTIONS_TOWN_NAME_FRENCH :फ़्रेंच
STR_GAME_OPTIONS_TOWN_NAME_POLISH :पोलिश
STR_GAME_OPTIONS_TOWN_NAME_TURKISH :तुर्की
STR_GAME_OPTIONS_TOWN_NAME_ITALIAN :इटैलियन
############ end of townname region
############ start of autosave dropdown
# Autosave dropdown
###length 5
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :प्रत्येक माह
############ end of autosave dropdown
STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} ({NUM}% पूर्ण)
@@ -302,51 +313,185 @@ STR_CURRENCY_DECREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}एक
STR_VARIETY_MEDIUM :मध्यम
###length 5
STR_AI_SPEED_SLOW :धीमा
###length 6
###length 4
###length 3
###length 4
###length 7
###length 3
# Settings tree window
###length 3
###length 3
###length 3
STR_CONFIG_SETTING_COMPANIES_OFF :बन्द
###length 3
###length 3
###setting-zero-is-special
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :मानचित्र के भूभाग की अधिकतम ऊंचाई निर्धारित करें। "(स्वतः)" चुनने पर भूभाग जनन के बाद एक उपयुक्त संख्या चुन ली जायेगी।
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM}
###setting-zero-is-special
STR_CONFIG_SETTING_TRAIN_SLOPE_STEEPNESS_HELPTEXT :ट्रेन के लिये ढलान की तेजी की स्थापना। ऊँची संख्या से चढ़ान पर चढ़ना अधिक कठिन हो जाता है।
###length 3
###length 3
STR_CONFIG_SETTING_STOP_LOCATION_HELPTEXT :निर्दिष्ट करें कि ट्रेनों को स्टेशन पर कहाँ रुकना चाहिये। स्टेशन में प्रवेश के पास 'समीप का छोर', स्टेशन के बीच में 'मध्य', और प्रवेश की उलटी ओर 'दूर का छोर' है। ध्यान दें कि यह विन्यास केवल नये निर्देशों के लिये मानक स्थापित करता है। प्रत्येक निर्देश को अलग से किसी अन्य व्यवहार के लिये स्थापित किया जा सकता है।
###length 3
STR_CONFIG_SETTING_STOP_LOCATION_NEAR_END :समीप का छोर
STR_CONFIG_SETTING_STOP_LOCATION_MIDDLE :मध्य
STR_CONFIG_SETTING_STOP_LOCATION_FAR_END :दूर का छोर
###length 4
STR_CONFIG_SETTING_BRIBE_HELPTEXT :कंपनियों को स्थानीय नगर प्रशासन को रिश्वत देने की अनुमति दें। यदि रिश्वत पर किसी निरीक्षक की दृष्टि पड़ती है तो कंपनी छः महीने के लिये नगर में काम नहीं कर पायेगी।
###length 3
STR_CONFIG_SETTING_ORDER_REVIEW_HELPTEXT :सक्षम होने पर वाहनों के निर्देशों की आवधिक जाँच की जाती है, और कुछ सुस्पष्ट मामलों का पता चलते ही एक संदेश द्वारा बताया जाता है।
###length 3
STR_CONFIG_SETTING_ORDER_REVIEW_OFF :नहीं
###length 2
###setting-zero-is-special
###length 2
###length 4
###length 3
###length 2
###length 2
STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :एक स्टेशन के हिस्सों के विस्तार हेतु अधिकतम क्षेत्र निर्धारित करें। ऊंची संख्या खेल को धीमा कर सकती है।
###length 3
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :बैंगनी
###length 4
###length 3
###length 3
###length 4
STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :अक्षम
###length 3
###length 3
###length 3
###length 4
###length 3
###setting-zero-is-special
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :सीमाहीन (आपके कंप्यूटर द्वारा सीमित)
STR_CONFIG_SETTING_SOUND_NEWS :समाचार पत्र: {STRING}
@@ -354,29 +499,104 @@ STR_CONFIG_SETTING_SOUND_NEWS :समाचा
###length 3
###setting-zero-is-special
STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :दुर्घटनायें / आपदायें : {STRING}
###length 3
STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM}
###setting-zero-is-special
###length 3
###length 2
###length 2
###length 5
###length 3
STR_CONFIG_SETTING_TOWN_CARGOGENMODE :नगर में माल उत्पादन: {STRING}
###length 2
###length 4
###setting-zero-is-special
STR_CONFIG_SETTING_SOFT_LIMIT_VALUE :{COMMA}
###setting-zero-is-special
###length 6
###length 3
STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :२x
###length 5
###setting-zero-is-special
###length 3
###length 4
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :अंतर्राष्ट्रीय मानक (m/s)
###length 3
###length 3
###length 3
###length 3
###length 3
STR_CONFIG_SETTING_INTERFACE_GENERAL :{ORANGE}सामान्य
STR_CONFIG_SETTING_PATHFINDER_FOR_SHIPS_HELPTEXT :नौकाओं द्वारा उपयोग किया जाने वाला पथान्वेषी
###length 2
# Config errors
@@ -405,17 +625,20 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}क्
# Cheat window
###length 4
# Livery window
###length 23
# Face selection window
STR_FACE_LOAD_DONE :{WHITE}ओपनटीटीडी प्रारूप पत्र से आपका प्रिय चेहरा भर लिया गया है
STR_FACE_COLLAR_TOOLTIP :{BLACK}कॉलर बदलें
############ Next lines match ServerGameType
############ End of leave-in-this-order
# Matches ServerGameType
###length 3
# Network server list
@@ -434,9 +657,8 @@ STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}सर
# Network connecting window
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 8
@@ -444,8 +666,8 @@ STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}सर
# Network client list
############ Begin of ConnectionType
############ End of ConnectionType
# Matches ConnectionType
###length 5
@@ -460,23 +682,26 @@ STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}सर
# Network messages
############ Leave those lines in this order!!
############ End of leave-in-this-order
STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}संपर्क विच्छेद संभावित
###length 21
# Network related errors
############ Leave those lines in this order!!
###length 12
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :खेल अभी भी ठहरा हुआ है ({STRING}, {STRING}, {STRING})
############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :छोड़ रहा है
# Content downloading window
STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}खोजी गयी सामग्री OpenTTD की सामग्री सेवा में उपलब्ध नहीं है, आप OpenTTD से असंबद्ध वेबसाइटों पर खोज सकते हैं
###length 5
STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}यह आपके पास पहले से मौजूद है
STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}यह सामग्री अज्ञात है और इसे ओपनटीटीडी में प्राप्त नहीं किया जा सकता है
# Order of these is important!
# Content downloading progress window
@@ -596,13 +821,11 @@ STR_LAI_BRIDGE_DESCRIPTION_RAIL_CANTILEVER_STEEL :इस्पा
STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms
STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms
STR_FRAMERATE_BYTES_GOOD :{LTBLUE}{BYTES}
STR_FRAMERATE_BYTES_WARN :{YELLOW}{BYTES}
STR_FRAMERATE_BYTES_BAD :{RED}{BYTES}
############ Leave those lines in this order!!
############ End of leave-in-this-order
############ Leave those lines in this order!!
###length 15
###length 15
STR_FRAMETIME_CAPTION_GL_ECONOMY :माल प्रबंधन
############ End of leave-in-this-order
# Save/load game/scenario
@@ -649,6 +872,7 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING
# NewGRF status
###length 3
# NewGRF 'it's broken' warnings
@@ -678,8 +902,10 @@ STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}फै
# Town local authority window
###length 8
STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :लघु विज्ञापन अभियान
###length 8
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW}नगरों के सड़क तंत्र के पुनर्निर्माण में निवेश करें।{}इससे अधिकतम ६ महीने तक यातायात में बहुत विघ्न पड़ता है।{}मूल्य : {CURRENCY_LONG}
# Goal window
@@ -689,8 +915,8 @@ STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
# Goal question window
############ Start of Goal Question button list
############ End of Goal Question button list
# Goal Question button list
###length 18
# Subsidies window
STR_SUBSIDIES_OFFERED_TITLE :{BLACK}इन सेवाओं के लिये अनुदान प्रस्तावित :
@@ -714,8 +940,7 @@ STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_L
STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT} {STATION} द्वारा
############ range for rating starts
############ range for rating ends
###length 8
@@ -727,7 +952,10 @@ STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOIN
# Finances window
STR_FINANCES_YEAR :{WHITE}{NUM}
###length 13
STR_FINANCES_SECTION_PROPERTY_MAINTENANCE :{GOLD}संपत्ति का रखरखाव
STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG}
STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENCY_LONG}
STR_FINANCES_BORROW_BUTTON :{BLACK}{CURRENCY_LONG} उधार
@@ -759,16 +987,20 @@ STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING
# Vehicle lists
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Group window
###length VEHICLE_TYPES
###length VEHICLE_TYPES
@@ -777,27 +1009,39 @@ STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING
# Build vehicle window
###length 4
############ range for vehicle availability starts
# Vehicle availability
###length VEHICLE_TYPES
STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :नई ट्रेनें
############ range for vehicle availability ends
STR_PURCHASE_INFO_COST_WEIGHT :{BLACK}मूल्य : {GOLD}{CURRENCY_LONG}{BLACK} भार : {GOLD}{WEIGHT_SHORT}
STR_PURCHASE_INFO_WEIGHT_CWEIGHT :{BLACK}भार : {GOLD}{WEIGHT_SHORT} ({WEIGHT_SHORT})
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
STR_BUY_VEHICLE_ROAD_VEHICLE_HIDE_TOGGLE_BUTTON :{BLACK}छिपायें
###length VEHICLE_TYPES
###length VEHICLE_TYPES
STR_BUY_VEHICLE_SHIP_HIDE_SHOW_TOGGLE_TOOLTIP :{BLACK}नौका प्रकार को छिपायें/दिखायें
###length VEHICLE_TYPES
# Depot window
STR_DEPOT_CAPTION :{WHITE}{DEPOT}
@@ -805,18 +1049,29 @@ STR_DEPOT_CAPTION :{WHITE}{DEPOT}
STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE}{STRING}
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Engine preview window
@@ -829,36 +1084,49 @@ STR_ENGINE_PREVIEW_SHIP :जहाज
# Autoreplace window
###length VEHICLE_TYPES
STR_REPLACE_VEHICLES_STOP :वाहन प्रतिस्थापित करना बन्द करें
###length 2
###next-name-looks-similar
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}वर्तमान ट्रेन व्यवहार - ट्रेन रोकने/चलाने के लिये क्लिक करें
# Messages in the start stop button in the vehicle view
# Vehicle stopped/started animations
###length 2
###length 2
# Vehicle details
# The next two need to stay in this order
###length VEHICLE_TYPES
@@ -867,6 +1135,8 @@ STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}वर
###length VEHICLE_TYPES
# Extra buttons for train details windows
STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE}{BLACK} निर्माण: {LTBLUE}{NUM}{BLACK} मूल्य: {LTBLUE}{CURRENCY_LONG}
@@ -876,8 +1146,11 @@ STR_VEHICLE_DETAILS_TRAIN_ENGINE_BUILT_AND_VALUE :{LTBLUE}{ENGINE
# Vehicle refit
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Order view
@@ -894,6 +1167,8 @@ STR_ORDER_REFIT_TOOLTIP :{BLACK}इस
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
###next-name-looks-similar
STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :के बराबर है
@@ -906,6 +1181,9 @@ STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :के बर
STR_ORDER_NEAREST_DEPOT :निकटतम
###length 3
###next-name-looks-similar
STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING}
STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT}
@@ -916,6 +1194,7 @@ STR_ORDER_GO_TO_STATION :{STRING} {STATI
###length 3
@@ -960,6 +1239,7 @@ STR_AI_CONFIG_CHANGE_NONE :
# Textfile window
###length 3
# Vehicle loading indicators
@@ -1030,7 +1310,6 @@ STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}पट
# Road construction errors
STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... असंगत ट्रामवे
# Waterway construction errors
STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... पानी पर बनाया जाना चाहिये।
@@ -1047,19 +1326,29 @@ STR_ERROR_MUST_BE_BUILT_ON_WATER :{WHITE}... प
# Generic vehicle errors
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
STR_ERROR_CAN_T_RENAME_SHIP :{WHITE}जहाज का नामकरण नहीं कर सकते...
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}रेल वाहन नहीं बेच सकते...
# Specific vehicle errors
@@ -1073,8 +1362,10 @@ STR_ERROR_CAN_T_COPY_SHARE_ORDER :{WHITE}... व
# Sign related errors
# Translatable comment for OpenTTD's desktop shortcut
###external 1
# Translatable descriptions in media/baseset/*.ob* files
###external 10
STR_BASESOUNDS_WIN_DESCRIPTION :ट्रांस्पोर्ट टायिकून डीलक्स के विंडोज संस्करण की मूल ध्वनियां।
##id 0x2000
@@ -1088,9 +1379,11 @@ STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC :बैंक
############ WARNING, using range 0x6000 for strings that are stored in the savegame
############ These strings may never get a new id, or savegames will break!
##id 0x6000
STR_SV_EMPTY :
###length 27
STR_SV_STNAME :{STRING}
STR_SV_STNAME_NORTH :{STRING} उत्तर
STR_SV_STNAME_CENTRAL :{STRING} केंद्रीय
@@ -1098,9 +1391,11 @@ STR_SV_STNAME_AIRPORT :{STRING} हव
STR_SV_STNAME_BUOY :{STRING}
STR_SV_STNAME_WAYPOINT :{STRING}
##id 0x6020
############ end of savegame specific region!
##id 0x8000
###length 116
# Vehicle names
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COAL_CAR :कोयला वाहन
STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :फल वाहन
@@ -1108,10 +1403,16 @@ STR_VEHICLE_NAME_TRAIN_ENGINE_MONORAIL_X2001_ELECTRIC :'X2001' (वि
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :खिलौनों का डब्बा
STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WATER_TANKER :पानी का टैंकर
STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :बबल वैन
###length 88
STR_VEHICLE_NAME_ROAD_VEHICLE_PLODDYPHUT_MKIII_BUS :प्लॉडीपीहट एमके३ बस
STR_VEHICLE_NAME_ROAD_VEHICLE_MORELAND_WOOD_TRUCK :मोरलैंड काष्ठ ट्रक
STR_VEHICLE_NAME_ROAD_VEHICLE_FOSTER_ARMORED_TRUCK :फोस्टर कवचयुक्त ट्रक
STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :पावरनोट मिष्ठान्न ट्रक
###length 11
###length 41
STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_COTSWALD_LB_3 :बेकवेल कॉट्सवॉल्ड एलबी-३
STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB_9 :बेकवेल लकेट एलबी-९
STR_VEHICLE_NAME_AIRCRAFT_BAKEWELL_LUCKETT_LB80 :बेकवेल लकेट एलबी८०
@@ -1126,6 +1427,14 @@ STR_FORMAT_DATE_LONG :{STRING} {STRIN
STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING}
###length 2
###length 2
###length 6
###next-name-looks-similar
# _SERIAL version of AIRACRAFT doesn't exist

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -169,7 +169,7 @@ STR_LITERS :{COMMA} litri
STR_ITEMS :{COMMA} artikli
STR_CRATES :{COMMA} kesti
# Colours, do not shuffle
###length 17
STR_COLOUR_DARK_BLUE :Obskur-blua
STR_COLOUR_PALE_GREEN :Pal-verda
STR_COLOUR_PINK :Rozea
@@ -221,7 +221,9 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Klozas f
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Baskulas granda/mikra fenestro grandeso
# Show engines button
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Query window
STR_BUTTON_CANCEL :{BLACK}Anular
@@ -255,7 +257,10 @@ STR_SORT_BY_POPULATION :Populo
# Group by options for vehicle list
# Order button in shared orders vehicle list
# Tooltips for the main toolbar
###length 31
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Pauzas ludo
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Selekti
STR_TOOLBAR_TOOLTIP_SAVE_GAME_ABANDON_GAME :{BLACK}Salvas ludo, abandonas ludo, ekiras
@@ -276,77 +281,77 @@ STR_SCENEDIT_TOOLBAR_PLANT_TREES :{BLACK}Plantaca
STR_SCENEDIT_TOOLBAR_PLACE_SIGN :{BLACK}Situas signalo
STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Pozez objekto
############ range for SE file menu starts
# Scenario editor file menu
###length 7
STR_SCENEDIT_FILE_MENU_SEPARATOR :
############ range for SE file menu starts
############ range for settings menu starts
# Settings menu
###length 14
STR_SETTINGS_MENU_FULL_DETAIL :Plene detaloza
STR_SETTINGS_MENU_TRANSPARENT_BUILDINGS :Diafana konstrukturi
############ range ends here
############ range for file menu starts
# File menu
###length 5
STR_FILE_MENU_SAVE_GAME :Salvas ludo
STR_FILE_MENU_LOAD_GAME :Kargas ludo
STR_FILE_MENU_QUIT_GAME :Abandonas ludo
STR_FILE_MENU_SEPARATOR :
STR_FILE_MENU_EXIT :Ekiras
############ range ends here
# map menu
# Map menu
###length 4
STR_MAP_MENU_MAP_OF_WORLD :Mapo di mondo
STR_MAP_MENU_SIGN_LIST :Listo di signi
############ range for town menu starts
############ range ends here
# Town menu
###length 2
############ range for subsidies menu starts
############ range ends here
# Subsidies menu
###length 1
############ range for graph menu starts
# Graph menu
###length 6
STR_GRAPH_MENU_INCOME_GRAPH :Revenuo grafiko
STR_GRAPH_MENU_DELIVERED_CARGO_GRAPH :Livrita kargajo grafiko
############ range ends here
############ range for company league menu starts
############ range ends here
# Company league menu
###length 3
############ range for industry menu starts
############ range ends here
# Industry menu
###length 3
############ range for railway construction menu starts
############ range ends here
# URailway construction menu
###length 4
############ range for road construction menu starts
############ range ends here
# Road construction menu
###length 2
############ range for waterways construction menu starts
############ range ends here
# Waterways construction menu
###length 1
############ range for airport construction menu starts
############ range ends here
# Aairport construction menu
###length 1
############ range for landscaping menu starts
############ range ends here
# Landscaping menu
###length 3
############ range for music menu starts
############ range ends here
# Music menu
###length 1
############ range for message menu starts
############ range ends here
# Message menu
###length 3
############ range for about menu starts
############ range ends here
# About menu
###length 10
############ range for ordinal numbers used for the place in the highscore window
############ range for ordinal numbers ends
# Place in highscore window
###length 15
############ range for days starts
############ range for days ends
###length 31
############ range for months starts
###length 12
############ range for months ends
###length 12
# Graph window
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
@@ -365,8 +370,10 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM
STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY :{BLACK}({CURRENCY_SHORT}/{CURRENCY_SHORT})
STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA}/{COMMA})
STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}%
############ Those following lines need to be in this order!!
############ End of order list
###length 10
###length 10
# Music window
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
@@ -384,12 +391,14 @@ STR_HIGHSCORE_STATS :{BIG_FONT}'{STR
# Smallmap window
STR_SMALLMAP_CAPTION :{WHITE}Mapo - {STRING}
###length 7
STR_SMALLMAP_TYPE_CONTOURS :Konturi
STR_SMALLMAP_TYPE_VEHICLES :Vehili
STR_SMALLMAP_TYPE_INDUSTRIES :Industrii
STR_SMALLMAP_TYPE_ROUTES :Voyi
STR_SMALLMAP_TYPE_VEGETATION :Vejetado
STR_SMALLMAP_TYPE_OWNERS :Proprietanto
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Montras transport-voyi sur la mapo
STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Montrar vejetado ad la mapo
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Montrar proprietanti ad la mapo
@@ -443,6 +452,8 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Sendajo
###length VEHICLE_TYPES
###next-name-looks-similar
# Order review system / warnings
@@ -451,6 +462,7 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Sendajo
###length 4
# Extra view window
@@ -458,17 +470,16 @@ STR_NEWS_MESSAGE_CAPTION :{WHITE}Sendajo
# Game options window
STR_GAME_OPTIONS_CAPTION :{WHITE}Ludo Selekti
############ start of currency region
############ end of currency region
###length 42
###length 2
############ start of townname region
############ end of townname region
###length 21
############ start of autosave dropdown
############ end of autosave dropdown
# Autosave dropdown
###length 5
@@ -506,32 +517,96 @@ STR_VARIETY_MEDIUM :Mezgrada
STR_VARIETY_HIGH :Alta
STR_VARIETY_VERY_HIGH :Tre Alta
###length 5
STR_AI_SPEED_SLOW :Lenta
STR_AI_SPEED_MEDIUM :Meza
STR_AI_SPEED_FAST :Rapida
###length 6
STR_SEA_LEVEL_LOW :Basa
STR_SEA_LEVEL_MEDIUM :Meza
STR_SEA_LEVEL_HIGH :Alta
STR_SEA_LEVEL_CUSTOM :Kustumigita
STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Kustumigita ({NUM}%)
###length 4
###length 3
###length 4
###length 7
###length 3
# Settings tree window
###length 3
###length 3
###length 3
###length 3
STR_CONFIG_SETTING_NONE :Nulo
###length 3
###setting-zero-is-special
###setting-zero-is-special
###length 3
###length 3
###length 3
###length 4
###length 3
STR_CONFIG_SETTING_PLANE_CRASHES_NONE :nulo
STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :normala
@@ -539,10 +614,107 @@ STR_CONFIG_SETTING_PLANE_CRASHES_NORMAL :normala
###length 3
###length 2
###setting-zero-is-special
###length 2
###length 4
###length 3
###length 2
###length 2
###length 3
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_GREEN :Verda
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_DARK_GREEN :Obskur-verda
STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora
###length 4
###length 3
###length 3
###length 4
###length 3
###length 3
###length 3
###length 4
###length 3
###setting-zero-is-special
###length 3
###setting-zero-is-special
@@ -561,15 +733,63 @@ STR_CONFIG_SETTING_SMALLMAP_LAND_COLOUR_VIOLET :Violkolora
###length 3
###setting-zero-is-special
###length 3
###length 2
###length 2
###length 5
###length 3
###length 2
###length 4
###setting-zero-is-special
###setting-zero-is-special
###length 6
###length 3
###length 5
###setting-zero-is-special
###length 3
###length 4
###length 3
###length 3
###length 3
###length 3
###length 3
###length 2
# Config errors
@@ -597,15 +817,18 @@ STR_QUIT_NO :{BLACK}Ne
# Cheat window
###length 4
# Livery window
###length 23
# Face selection window
############ Next lines match ServerGameType
############ End of leave-in-this-order
# Matches ServerGameType
###length 3
# Network server list
@@ -624,9 +847,8 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x
# Network connecting window
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 8
@@ -634,8 +856,8 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x
# Network client list
############ Begin of ConnectionType
############ End of ConnectionType
# Matches ConnectionType
###length 5
@@ -651,19 +873,22 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x
# Network messages
STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Tu sendis tro multa imperi ad la servero
############ Leave those lines in this order!!
STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS :sendinta tro multa imperi
############ End of leave-in-this-order
###length 21
STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS :sendinta tro multa imperi
# Network related errors
STR_NETWORK_SERVER_MESSAGE :*** {1:STRING}
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 12
# Content downloading window
###length 5
# Order of these is important!
# Content downloading progress window
@@ -786,10 +1011,10 @@ STR_ABOUT_VERSION :{BLACK}OpenTTD
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-{STRING} La kruo OpenTTD
# Framerate display window
############ Leave those lines in this order!!
############ End of leave-in-this-order
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 15
###length 15
# Save/load game/scenario
@@ -845,6 +1070,7 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING
# NewGRF status
STR_NEWGRF_LIST_NONE :Nulo
###length 3
# NewGRF 'it's broken' warnings
@@ -872,15 +1098,17 @@ STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
# Town local authority window
STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING}
###length 8
###length 8
# Goal window
STR_GOALS_TEXT :{ORANGE}{STRING}
# Goal question window
############ Start of Goal Question button list
############ End of Goal Question button list
# Goal Question button list
###length 18
# Subsidies window
@@ -900,8 +1128,7 @@ STR_STATION_VIEW_ACCEPTS_CARGO :{BLACK}Aceptas:
############ range for rating starts
############ range for rating ends
###length 8
@@ -913,6 +1140,9 @@ STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOIN
# Finances window
STR_FINANCES_YEAR :{WHITE}{NUM}
###length 13
STR_FINANCES_NEGATIVE_INCOME :{BLACK}-{CURRENCY_LONG}
STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG}
STR_FINANCES_LOAN_TITLE :{WHITE}Prest-ajo
@@ -936,23 +1166,25 @@ STR_COMPANY_VIEW_VEHICLES_TITLE :{GOLD}Vehili:
# Vehicle lists
###length VEHICLE_TYPES
STR_VEHICLE_LIST_TRAIN_CAPTION :{WHITE}{STRING} - {COMMA} Tren{P o i}
STR_VEHICLE_LIST_ROAD_VEHICLE_CAPTION :{WHITE}{STRING} - {COMMA} Voyo-Vehil{P o i}
STR_VEHICLE_LIST_SHIP_CAPTION :{WHITE}{STRING} - {COMMA} Nav{P o i}
STR_VEHICLE_LIST_AIRCRAFT_CAPTION :{WHITE}{STRING} - {COMMA} Aeronavo
###length VEHICLE_TYPES
STR_VEHICLE_LIST_TRAIN_LIST_TOOLTIP :{BLACK}Treni - klikigas sur treno por informeso
STR_VEHICLE_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Voy-vehili - klikigas sur vehilo por informeso
STR_VEHICLE_LIST_SHIP_TOOLTIP :{BLACK}Navi - klikigas sur navo por informeso
STR_VEHICLE_LIST_AIRCRAFT_TOOLTIP :{BLACK}Aeronavi - klikigas sur aeronavo por informeso
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profito to yaro: {CURRENCY_LONG} (lasta yaro: {CURRENCY_LONG})
###length VEHICLE_TYPES
STR_VEHICLE_LIST_AVAILABLE_TRAINS :Disponebla Treni
STR_VEHICLE_LIST_AVAILABLE_ROAD_VEHICLES :Disponebla Vehili
STR_VEHICLE_LIST_AVAILABLE_SHIPS :Disponebla Navi
STR_VEHICLE_LIST_AVAILABLE_AIRCRAFT :Disponebla Aeronavi
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profito to yaro: {CURRENCY_LONG} (lasta yaro: {CURRENCY_LONG})
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Sendas ad Depozeyo
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Sendas ad Depozeyo
@@ -962,11 +1194,13 @@ STR_VEHICLE_LIST_SEND_AIRCRAFT_TO_HANGAR :Sendas ad Hanga
# Group window
###length VEHICLE_TYPES
STR_GROUP_ALL_TRAINS :Omna treni
STR_GROUP_ALL_ROAD_VEHICLES :Omna voy-vehili
STR_GROUP_ALL_SHIPS :Omna navi
STR_GROUP_ALL_AIRCRAFTS :Omna aeronavi
###length VEHICLE_TYPES
STR_GROUP_DEFAULT_TRAINS :Negrupigita treni
STR_GROUP_DEFAULT_ROAD_VEHICLES :Negrupigita voy-vehili
STR_GROUP_DEFAULT_SHIPS :Negrupigita navi
@@ -979,22 +1213,34 @@ STR_GROUP_DEFAULT_AIRCRAFTS :Negrupigita aer
# Build vehicle window
###length 4
############ range for vehicle availability starts
############ range for vehicle availability ends
# Vehicle availability
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Depot window
STR_DEPOT_CAPTION :{WHITE}{DEPOT}
@@ -1006,18 +1252,29 @@ STR_DEPOT_NO_ENGINE :{BLACK}-
STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE}{STRING}
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Engine preview window
@@ -1027,6 +1284,9 @@ STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG}
# Autoreplace window
###length VEHICLE_TYPES
STR_REPLACE_VEHICLE_TRAIN :Treno
STR_REPLACE_VEHICLE_ROAD_VEHICLE :Voy-vehilo
STR_REPLACE_VEHICLE_SHIP :Navo
@@ -1035,6 +1295,8 @@ STR_REPLACE_VEHICLE_AIRCRAFT :Aeronavo
###length 2
###next-name-looks-similar
@@ -1042,30 +1304,38 @@ STR_REPLACE_VEHICLE_AIRCRAFT :Aeronavo
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_HEADING_FOR_DEPOT_SERVICE_VEL :{LTBLUE}Servado ad {DEPOT}, {VELOCITY}
# Vehicle stopped/started animations
###length 2
STR_VEHICLE_COMMAND_STOPPED_SMALL :{TINY_FONT}{RED}Haltinta
STR_VEHICLE_COMMAND_STOPPED :{RED}Haltinta
###length 2
STR_VEHICLE_COMMAND_STARTED_SMALL :{TINY_FONT}{GREEN}Komencinta
STR_VEHICLE_COMMAND_STARTED :{GREEN}Komencinta
# Vehicle details
# The next two need to stay in this order
###length VEHICLE_TYPES
@@ -1074,6 +1344,8 @@ STR_VEHICLE_COMMAND_STARTED :{GREEN}Komencin
###length VEHICLE_TYPES
# Extra buttons for train details windows
@@ -1085,8 +1357,11 @@ STR_VEHICLE_DETAIL_TAB_CAPACITIES :{BLACK}Kapacesi
# Vehicle refit
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Order view
@@ -1102,6 +1377,8 @@ STR_ORDER_TEXT :{STRING} {STRIN
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
###next-name-looks-similar
@@ -1112,6 +1389,9 @@ STR_ORDER_TEXT :{STRING} {STRIN
# String parts to build the order string
###length 3
###next-name-looks-similar
STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING}
STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT}
@@ -1122,6 +1402,7 @@ STR_ORDER_GO_TO_STATION :{STRING} {STATI
###length 3
@@ -1165,6 +1446,7 @@ STR_AI_SETTINGS_SETTING :{STRING}: {ORAN
# Textfile window
###length 3
# Vehicle loading indicators
@@ -1258,13 +1540,23 @@ STR_ERROR_CAN_T_BUILD_OBJECT :{WHITE}Ne povas
# Generic vehicle errors
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Tro multa vehili en la ludo
@@ -1282,8 +1574,10 @@ STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Tro mult
# Sign related errors
# Translatable comment for OpenTTD's desktop shortcut
###external 1
# Translatable descriptions in media/baseset/*.ob* files
###external 10
##id 0x2000
# Town building names
@@ -1293,18 +1587,28 @@ STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Tro mult
############ WARNING, using range 0x6000 for strings that are stored in the savegame
############ These strings may never get a new id, or savegames will break!
##id 0x6000
STR_SV_EMPTY :
###length 27
STR_SV_STNAME :{STRING}
STR_SV_STNAME_BUOY :{STRING}
STR_SV_STNAME_WAYPOINT :{STRING}
##id 0x6020
############ end of savegame specific region!
##id 0x8000
###length 116
# Vehicle names
###length 88
###length 11
###length 41
##id 0x8800
# Formatting of some strings
STR_FORMAT_DATE_TINY :{STRING}-{STRING}-{NUM}
@@ -1313,11 +1617,19 @@ STR_FORMAT_DATE_LONG :{STRING} {STRIN
STR_FORMAT_DATE_ISO :{2:NUM}-{1:STRING}-{0:STRING}
###length 2
###length 2
###length 6
STR_FORMAT_DEPOT_NAME_TRAIN :{TOWN} Treno-Depozeyo
STR_FORMAT_DEPOT_NAME_TRAIN_SERIAL :{TOWN} Treno-Depozeyo #{COMMA}
STR_FORMAT_DEPOT_NAME_SHIP :{TOWN} Navo-Depozeyo
STR_FORMAT_DEPOT_NAME_SHIP_SERIAL :{TOWN} Navo-Depozeyo #{COMMA}
###next-name-looks-similar
STR_FORMAT_DEPOT_NAME_AIRCRAFT :{STATION} Hangaro
# _SERIAL version of AIRACRAFT doesn't exist
STR_COMPANY_SOMEONE :ulu

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -123,7 +123,7 @@ STR_LITERS :{COMMA} litr{P
STR_ITEMS :{COMMA} oġġett{P "" i i i}
STR_CRATES :{COMMA} kaxx{P a i i i}
# Colours, do not shuffle
###length 17
STR_COLOUR_DARK_BLUE :Blu Skur
STR_COLOUR_PALE_GREEN :Aħdar ċar
STR_COLOUR_PINK :Roża
@@ -188,7 +188,9 @@ STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Faxxa bi
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Waqqa bini, etc.., Ctrl tagħzel zona dijagonali. Shift taqleb bejn bini/turija ta' stima ta' l-ispiza
# Show engines button
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Query window
STR_BUTTON_DEFAULT :{BLACK}Default
@@ -241,7 +243,10 @@ STR_SORT_BY_POPULATION :Popolazzjoni
# Group by options for vehicle list
# Order button in shared orders vehicle list
# Tooltips for the main toolbar
###length 31
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Waqfa temporanja mil-logħba
STR_TOOLBAR_TOOLTIP_FORWARD :{BLACK}Għaġġel il-loghba
STR_TOOLBAR_TOOLTIP_OPTIONS :{BLACK}Preferenzi
@@ -255,67 +260,67 @@ STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Ibni ind
# Extra tooltips for the scenario editor toolbar
############ range for SE file menu starts
# Scenario editor file menu
###length 7
STR_SCENEDIT_FILE_MENU_SEPARATOR :
############ range for SE file menu starts
############ range for settings menu starts
############ range ends here
# Settings menu
###length 14
############ range for file menu starts
# File menu
###length 5
STR_FILE_MENU_SEPARATOR :
############ range ends here
# map menu
# Map menu
###length 4
############ range for town menu starts
############ range ends here
# Town menu
###length 2
############ range for subsidies menu starts
############ range ends here
# Subsidies menu
###length 1
############ range for graph menu starts
############ range ends here
# Graph menu
###length 6
############ range for company league menu starts
############ range ends here
# Company league menu
###length 3
############ range for industry menu starts
############ range ends here
# Industry menu
###length 3
############ range for railway construction menu starts
############ range ends here
# URailway construction menu
###length 4
############ range for road construction menu starts
############ range ends here
# Road construction menu
###length 2
############ range for waterways construction menu starts
############ range ends here
# Waterways construction menu
###length 1
############ range for airport construction menu starts
############ range ends here
# Aairport construction menu
###length 1
############ range for landscaping menu starts
############ range ends here
# Landscaping menu
###length 3
############ range for music menu starts
############ range ends here
# Music menu
###length 1
############ range for message menu starts
############ range ends here
# Message menu
###length 3
############ range for about menu starts
############ range ends here
# About menu
###length 10
############ range for ordinal numbers used for the place in the highscore window
############ range for ordinal numbers ends
# Place in highscore window
###length 15
############ range for days starts
############ range for days ends
###length 31
############ range for months starts
###length 12
############ range for months ends
###length 12
# Graph window
STR_GRAPH_X_LABEL_MONTH :{TINY_FONT}{STRING}
@@ -334,8 +339,10 @@ STR_GRAPH_Y_LABEL_NUMBER :{TINY_FONT}{COM
STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY :{BLACK}({CURRENCY_SHORT}/{CURRENCY_SHORT})
STR_PERFORMANCE_DETAIL_AMOUNT_INT :{BLACK}({COMMA}/{COMMA})
STR_PERFORMANCE_DETAIL_PERCENT :{WHITE}{NUM}%
############ Those following lines need to be in this order!!
############ End of order list
###length 10
###length 10
# Music window
STR_MUSIC_TRACK_NONE :{TINY_FONT}{DKGREEN}--
@@ -352,6 +359,8 @@ STR_HIGHSCORE_STATS :{BIG_FONT}'{STR
# Smallmap window
###length 7
STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY}
@@ -376,6 +385,8 @@ STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {C
###length VEHICLE_TYPES
###next-name-looks-similar
# Order review system / warnings
@@ -385,23 +396,23 @@ STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE
###length 4
# Extra view window
# Game options window
############ start of currency region
############ end of currency region
###length 42
###length 2
############ start of townname region
############ end of townname region
###length 21
############ start of autosave dropdown
############ end of autosave dropdown
# Autosave dropdown
###length 5
@@ -429,45 +440,127 @@ STR_GAME_OPTIONS_RESOLUTION_OTHER :oħrajn
###length 5
###length 6
###length 4
###length 3
###length 4
###length 7
###length 3
# Settings tree window
###length 3
###length 3
###length 3
###length 3
###length 3
STR_CONFIG_SETTING_RUNNING_COSTS_HELPTEXT :Stabbilixxi l-kosti għal manutenzjoni u servizzi fuq vetturi u infrastruttura
STR_CONFIG_SETTING_CONSTRUCTION_SPEED :Veloċita' tal-kostruzzjoni: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_SPEED_HELPTEXT :Illimita l-ammont massimu ta' kostruzzjonijiet għall-AI
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS :Ħsarat fil-vetturi: {STRING}
STR_CONFIG_SETTING_VEHICLE_BREAKDOWNS_HELPTEXT :Ikkontrolla kemm-il darba vettura li ma ingħatatx servizz riċentament tieqaf
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER :Multiplikatur tas-sussidju: {STRING}
STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Stabbilixxi kemm jiġi mħallas għal konnessjonijiet sussidjati
###setting-zero-is-special
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Kosti tal-kostruzzjoni: {STRING}
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Stabbilixxi l-livell ta' kostruzzjoni u l-prezz tax-xiri
STR_CONFIG_SETTING_RECESSIONS :Riċessjonijiet: {STRING}
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Jekk mixgħula kull ftit snin tista' sseħħ riċessjoni. Waqt riċessjoni, il-produzzjoni ta' kollox tonqos (tirritorna għal kemm kienet qabel kif tgħaddi r-riċessjoni)
STR_CONFIG_SETTING_TRAIN_REVERSING :Tħallix li ferrovija ddur lura fi stazzjon: {STRING}
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Jekk tinxtegħel, ferroviji ma jdurux lura fi stazzjonijiet li mhumiex fit-tarf, jekk teżisti rotta iqsar għad-destinazzjoni li jmiss
STR_CONFIG_SETTING_DISASTERS :Diżastri: {STRING}
STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Ixgħel jew itfi diżastri li xi drabi jistgħu jaffetwaw jew ikissru vetturi jew infrastrutturi
STR_CONFIG_SETTING_CITY_APPROVAL :L-attitudni tal-kunsill lokali lejn bidliet fil-viċinanzi: {STRING}
STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Iddeċiedi kemm l-ammont ta storbju u danni lill-ambjent ta' kumpanija jaffetwaw il-klassifikazzjoni tagħhom mar-raħal u proġetti oħra tal-futur
###setting-zero-is-special
###length 3
###length 3
###length 3
###length 4
###length 3
STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avza jekk jintilef il-vehikolu: {STRING}
###length 3
###length 2
###setting-zero-is-special
###length 2
@@ -475,8 +568,47 @@ STR_CONFIG_SETTING_WARN_LOST_VEHICLE :Avza jekk jinti
###length 4
###length 3
###length 2
###length 2
###length 3
###length 4
###length 3
###length 3
###length 4
###length 3
###length 3
###length 3
###length 4
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :L-ebda azzjoni
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :L-azzjonijiet kollha
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Uza l-lista avvanzata tal-vetturi: {STRING}
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ippermetti l-uzu tal-listi avvanzati tal-vetturi biex tghaqqad il-vetturi fi gruppi
@@ -484,6 +616,13 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ippermetti l-uz
###length 3
###setting-zero-is-special
@@ -501,6 +640,87 @@ STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ippermetti l-uz
###length 3
###setting-zero-is-special
###length 3
###setting-zero-is-special
###length 3
###length 2
###length 2
###length 5
###length 3
###length 2
###length 4
###setting-zero-is-special
###setting-zero-is-special
###length 6
###length 3
###length 5
###setting-zero-is-special
###length 3
###length 4
###length 3
###length 3
###length 3
###length 3
###length 3
###length 2
# Config errors
@@ -523,15 +743,18 @@ STR_INTRO_CAPTION :{WHITE}OpenTTD
# Cheat window
STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Ibdel is-sena
###length 4
# Livery window
###length 23
# Face selection window
############ Next lines match ServerGameType
############ End of leave-in-this-order
# Matches ServerGameType
###length 3
# Network server list
@@ -550,20 +773,19 @@ STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT :{BLACK}{COMMA}x
# Network connecting window
############ Leave those lines in this order!!
############ End of leave-in-this-order
STR_NETWORK_CONNECTING_DOWNLOADING_1 :{BLACK}{BYTES} imnizzlin s'issa
STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES} / {BYTES} imnizzlin s'issa
###length 8
# Network company list added strings
# Network client list
############ Begin of ConnectionType
############ End of ConnectionType
# Matches ConnectionType
###length 5
@@ -578,21 +800,24 @@ STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES}
# Network messages
############ Leave those lines in this order!!
###length 21
STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :reviżjoni ħażina
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :isem diġa qed jintuża
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :password ħażin
############ End of leave-in-this-order
# Network related errors
STR_NETWORK_SERVER_MESSAGE :*** {1:STRING}
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 12
# Content downloading window
###length 5
# Order of these is important!
# Content downloading progress window
@@ -693,10 +918,10 @@ STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Aghzel i
# About OpenTTD window
# Framerate display window
############ Leave those lines in this order!!
############ End of leave-in-this-order
############ Leave those lines in this order!!
############ End of leave-in-this-order
###length 15
###length 15
# Save/load game/scenario
@@ -746,6 +971,7 @@ STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING
# NewGRF status
###length 3
# NewGRF 'it's broken' warnings
@@ -774,15 +1000,17 @@ STR_TOWN_VIEW_TOWN_CAPTION :{WHITE}{TOWN}
# Town local authority window
STR_LOCAL_AUTHORITY_COMPANY_RATING :{YELLOW}{COMPANY} {COMPANY_NUM}: {ORANGE}{STRING}
###length 8
###length 8
# Goal window
STR_GOALS_TEXT :{ORANGE}{STRING}
# Goal question window
############ Start of Goal Question button list
############ End of Goal Question button list
# Goal Question button list
###length 18
# Subsidies window
@@ -801,8 +1029,7 @@ STR_STATION_VIEW_WAITING_CARGO :{WHITE}{CARGO_L
############ range for rating starts
############ range for rating ends
###length 8
@@ -814,6 +1041,9 @@ STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOIN
# Finances window
STR_FINANCES_YEAR :{WHITE}{NUM}
###length 13
STR_FINANCES_NEGATIVE_INCOME :{BLACK}-{CURRENCY_LONG}
STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURRENCY_LONG}
@@ -835,16 +1065,20 @@ STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURREN
# Vehicle lists
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Group window
###length VEHICLE_TYPES
###length VEHICLE_TYPES
@@ -853,22 +1087,34 @@ STR_FINANCES_POSITIVE_INCOME :{BLACK}+{CURREN
# Build vehicle window
###length 4
############ range for vehicle availability starts
############ range for vehicle availability ends
# Vehicle availability
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Depot window
STR_DEPOT_CAPTION :{WHITE}{DEPOT}
@@ -880,18 +1126,29 @@ STR_DEPOT_NO_ENGINE :{BLACK}-
STR_DEPOT_VEHICLE_TOOLTIP :{BLACK}{ENGINE}{STRING}
STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG} ({CARGO_SHORT})
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Engine preview window
@@ -903,34 +1160,47 @@ STR_DEPOT_VEHICLE_TOOLTIP_CARGO :{}{CARGO_LONG}
# Autoreplace window
###length VEHICLE_TYPES
###length 2
###next-name-looks-similar
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Messages in the start stop button in the vehicle view
# Vehicle stopped/started animations
###length 2
###length 2
# Vehicle details
# The next two need to stay in this order
###length VEHICLE_TYPES
@@ -939,6 +1209,8 @@ STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE
###length VEHICLE_TYPES
# Extra buttons for train details windows
@@ -947,8 +1219,11 @@ STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE
# Vehicle refit
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
# Order view
@@ -964,6 +1239,8 @@ STR_ORDER_TEXT :{STRING} {STRIN
# Conditional order variables, must follow order of OrderConditionVariable enum
###length 8
###next-name-looks-similar
@@ -975,6 +1252,9 @@ STR_ORDERS_DELETE_ALL_TOOLTIP :{BLACK}Hassar l
# String parts to build the order string
###length 3
###next-name-looks-similar
STR_ORDER_GO_TO_NEAREST_DEPOT_FORMAT :{STRING} {STRING} {STRING}
STR_ORDER_GO_TO_DEPOT_FORMAT :{STRING} {DEPOT}
@@ -986,6 +1266,7 @@ STR_ORDER_IMPLICIT :(Awtomatiku)
###length 3
@@ -1035,10 +1316,11 @@ STR_AI_CONFIG_CHANGE_NONE :
# Textfile window
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} лиценца за {STRING}
STR_TEXTFILE_VIEW_README :{BLACK}Прикажи ги чита-ми
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Промени се најавите
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Лиценца
###length 3
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} лиценца за {STRING}
# Vehicle loading indicators
@@ -1116,24 +1398,34 @@ STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Il-pont
# Generic vehicle errors
###length VEHICLE_TYPES
STR_ERROR_CAN_T_RENAME_SHIP_TYPE :{WHITE}Ma tistax tbiddel l-isem ta' dan it-tip ta' vapur...
STR_ERROR_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Ma tistax tbiddel l-isem ta' dan it-tip t' ajruplan...
STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}Ma tistax tbigħ din il-ferrovija...
STR_ERROR_CAN_T_SELL_ROAD_VEHICLE :{WHITE}Ma tistax tbigħ din il-karozza...
STR_ERROR_CAN_T_SELL_SHIP :{WHITE}Ma tistax tbigħ dan il-vapur...
STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Ma tistax tbigħ dan l-ajruplan...
###length VEHICLE_TYPES
STR_ERROR_RAIL_VEHICLE_NOT_AVAILABLE :{WHITE}Din il-vettura mhix disponibbli
STR_ERROR_ROAD_VEHICLE_NOT_AVAILABLE :{WHITE}Din il-vettura mhix disponibbli
STR_ERROR_SHIP_NOT_AVAILABLE :{WHITE}Dan il-vapur mhux disponibbli
STR_ERROR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Dan l-ajruplan mhux disponibbli
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
###length VEHICLE_TYPES
STR_ERROR_CAN_T_RENAME_SHIP_TYPE :{WHITE}Ma tistax tbiddel l-isem ta' dan it-tip ta' vapur...
STR_ERROR_CAN_T_RENAME_AIRCRAFT_TYPE :{WHITE}Ma tistax tbiddel l-isem ta' dan it-tip t' ajruplan...
###length VEHICLE_TYPES
STR_ERROR_CAN_T_SELL_TRAIN :{WHITE}Ma tistax tbigħ din il-ferrovija...
STR_ERROR_CAN_T_SELL_ROAD_VEHICLE :{WHITE}Ma tistax tbigħ din il-karozza...
STR_ERROR_CAN_T_SELL_SHIP :{WHITE}Ma tistax tbigħ dan il-vapur...
STR_ERROR_CAN_T_SELL_AIRCRAFT :{WHITE}Ma tistax tbigħ dan l-ajruplan...
STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}Hemm wisq vetturi fil-logħba
@@ -1159,9 +1451,11 @@ STR_ERROR_CAN_T_SKIP_ORDER :{WHITE}Ma tista
# Sign related errors
# Translatable comment for OpenTTD's desktop shortcut
###external 1
STR_DESKTOP_SHORTCUT_COMMENT :Logħba simulazzjoni bbażata fuq Transport Tycoon Deluxe
# Translatable descriptions in media/baseset/*.ob* files
###external 10
##id 0x2000
# Town building names
@@ -1207,6 +1501,7 @@ STR_INDUSTRY_NAME_SUGAR_MINE :Minjiera taz-zo
############ WARNING, using range 0x6000 for strings that are stored in the savegame
############ These strings may never get a new id, or savegames will break!
##id 0x6000
STR_SV_EMPTY :
STR_SV_UNNAMED :Bla isem
@@ -1215,6 +1510,7 @@ STR_SV_ROAD_VEHICLE_NAME :Vettura tat-tri
STR_SV_SHIP_NAME :Vapur {COMMA}
STR_SV_AIRCRAFT_NAME :Ajruplan {COMMA}
###length 27
STR_SV_STNAME :{STRING}
STR_SV_STNAME_NORTH :{STRING} Tramuntana
STR_SV_STNAME_SOUTH :{STRING} Nofsinhar
@@ -1241,9 +1537,11 @@ STR_SV_STNAME_LOWER :{STRING} t' isf
STR_SV_STNAME_HELIPORT :Ħeliport {STRING}
STR_SV_STNAME_FOREST :Foresta {STRING}
STR_SV_STNAME_FALLBACK :{STRING}, Stazzjon #{NUM}
############ end of savegame specific region!
##id 0x8000
###length 116
# Vehicle names
STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_KIRBY_PAUL_TANK_STEAM :Kirby Paul Tank (Fwar)
STR_VEHICLE_NAME_TRAIN_ENGINE_RAIL_MJS_250_DIESEL :MJS 250 (Diesel)
@@ -1297,6 +1595,10 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_PASSENGER_CAR :Karru għall-pa
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_MAIL_VAN :Karru għall-posta
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COAL_CAR :Karru għall-faħam
STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :Trakk tax-Xarbiet Karbonati
###length 88
###length 11
STR_VEHICLE_NAME_SHIP_MPS_OIL_TANKER :Tanker taż-żejt MPS
STR_VEHICLE_NAME_SHIP_CS_INC_OIL_TANKER :Tanker taż-żejt CS-Inc.
STR_VEHICLE_NAME_SHIP_MPS_PASSENGER_FERRY :Vapur tal-passiġġieri MPS
@@ -1308,6 +1610,8 @@ STR_VEHICLE_NAME_SHIP_YATE_CARGO_SHIP :Vapur tal-merka
STR_VEHICLE_NAME_SHIP_BAKEWELL_CARGO_SHIP :Vapur tal-merkanzija Bakewell
STR_VEHICLE_NAME_SHIP_MIGHTYMOVER_CARGO_SHIP :Vapur tal-merkanzija MightyMover
STR_VEHICLE_NAME_SHIP_POWERNAUT_CARGO_SHIP :Vapur tal-merkanzija Powernaut
###length 41
STR_VEHICLE_NAME_AIRCRAFT_SAMPSON_U52 :Sampson U52
STR_VEHICLE_NAME_AIRCRAFT_COLEMAN_COUNT :Coleman Count
STR_VEHICLE_NAME_AIRCRAFT_FFP_DART :FFP Dart
@@ -1359,6 +1663,14 @@ STR_FORMAT_DATE_ISO :{2:NUM}-{1:STRI
STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING}
###length 2
###length 2
###length 6
###next-name-looks-similar
# _SERIAL version of AIRACRAFT doesn't exist
STR_UNKNOWN_STATION :stazzjon mhux magħruf
STR_DEFAULT_SIGN_NAME :Sinjal

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -39,6 +39,7 @@ inline void LinkGraph::BaseEdge::Init()
{
this->capacity = 0;
this->usage = 0;
this->travel_time_sum = 0;
this->last_unrestricted_update = INVALID_DATE;
this->last_restricted_update = INVALID_DATE;
this->next_edge = INVALID_NODE;
@@ -74,6 +75,9 @@ void LinkGraph::Compress()
edge.capacity = std::max(1U, edge.capacity / 2);
edge.usage /= 2;
}
if (edge.travel_time_sum > 0) {
edge.travel_time_sum = std::max(1ULL, edge.travel_time_sum / 2);
}
}
}
}
@@ -100,9 +104,11 @@ void LinkGraph::Merge(LinkGraph *other)
backward = other->edges[node2][node1];
forward.capacity = LinkGraph::Scale(forward.capacity, age, other_age);
forward.usage = LinkGraph::Scale(forward.usage, age, other_age);
forward.travel_time_sum = LinkGraph::Scale(forward.travel_time_sum, age, other_age);
if (forward.next_edge != INVALID_NODE) forward.next_edge += first;
backward.capacity = LinkGraph::Scale(backward.capacity, age, other_age);
backward.usage = LinkGraph::Scale(backward.usage, age, other_age);
backward.travel_time_sum = LinkGraph::Scale(backward.travel_time_sum, age, other_age);
if (backward.next_edge != INVALID_NODE) backward.next_edge += first;
}
BaseEdge &new_start = this->edges[new_node][new_node];
@@ -188,13 +194,14 @@ NodeID LinkGraph::AddNode(const Station *st)
* @param usage Usage to be added.
* @param mode Update mode to be used.
*/
void LinkGraph::Node::AddEdge(NodeID to, uint capacity, uint usage, EdgeUpdateMode mode)
void LinkGraph::Node::AddEdge(NodeID to, uint capacity, uint usage, uint32 travel_time, EdgeUpdateMode mode)
{
assert(this->index != to);
BaseEdge &edge = this->edges[to];
BaseEdge &first = this->edges[this->index];
edge.capacity = capacity;
edge.usage = usage;
edge.travel_time_sum = travel_time * capacity;
edge.next_edge = first.next_edge;
first.next_edge = to;
if (mode & EUM_UNRESTRICTED) edge.last_unrestricted_update = _date;
@@ -208,14 +215,14 @@ void LinkGraph::Node::AddEdge(NodeID to, uint capacity, uint usage, EdgeUpdateMo
* @param usage Usage to be added.
* @param mode Update mode to be used.
*/
void LinkGraph::Node::UpdateEdge(NodeID to, uint capacity, uint usage, EdgeUpdateMode mode)
void LinkGraph::Node::UpdateEdge(NodeID to, uint capacity, uint usage, uint32 travel_time, EdgeUpdateMode mode)
{
assert(capacity > 0);
assert(usage <= capacity);
if (this->edges[to].capacity == 0) {
this->AddEdge(to, capacity, usage, mode);
this->AddEdge(to, capacity, usage, travel_time, mode);
} else {
(*this)[to].Update(capacity, usage, mode);
(*this)[to].Update(capacity, usage, travel_time, mode);
}
}
@@ -231,6 +238,7 @@ void LinkGraph::Node::RemoveEdge(NodeID to)
edge.last_unrestricted_update = INVALID_DATE;
edge.last_restricted_update = INVALID_DATE;
edge.usage = 0;
edge.travel_time_sum = 0;
NodeID prev = this->index;
NodeID next = this->edges[this->index].next_edge;
@@ -249,23 +257,37 @@ void LinkGraph::Node::RemoveEdge(NodeID to)
/**
* Update an edge. If mode contains UM_REFRESH refresh the edge to have at
* least the given capacity and usage, otherwise add the capacity and usage.
* least the given capacity and usage, otherwise add the capacity, usage and travel time.
* In any case set the respective update timestamp(s), according to the given
* mode.
* @param capacity Capacity to be added/updated.
* @param usage Usage to be added.
* @param travel_time Travel time to be added, in ticks.
* @param mode Update mode to be applied.
*/
void LinkGraph::Edge::Update(uint capacity, uint usage, EdgeUpdateMode mode)
void LinkGraph::Edge::Update(uint capacity, uint usage, uint32 travel_time, EdgeUpdateMode mode)
{
assert(this->edge.capacity > 0);
assert(capacity >= usage);
if (mode & EUM_INCREASE) {
if (this->edge.travel_time_sum == 0) {
this->edge.travel_time_sum = (this->edge.capacity + capacity) * travel_time;
} else if (travel_time == 0) {
this->edge.travel_time_sum += this->edge.travel_time_sum / this->edge.capacity * capacity;
} else {
this->edge.travel_time_sum += travel_time * capacity;
}
this->edge.capacity += capacity;
this->edge.usage += usage;
} else if (mode & EUM_REFRESH) {
this->edge.capacity = std::max(this->edge.capacity, capacity);
if (this->edge.travel_time_sum == 0) {
this->edge.capacity = std::max(this->edge.capacity, capacity);
this->edge.travel_time_sum = travel_time * this->edge.capacity;
} else if (capacity > this->edge.capacity) {
this->edge.travel_time_sum = this->edge.travel_time_sum / this->edge.capacity * capacity;
this->edge.capacity = capacity;
}
this->edge.usage = std::max(this->edge.usage, usage);
}
if (mode & EUM_UNRESTRICTED) this->edge.last_unrestricted_update = _date;

View File

@@ -62,6 +62,7 @@ public:
struct BaseEdge {
uint capacity; ///< Capacity of the link.
uint usage; ///< Usage of the link.
uint64 travel_time_sum; ///< Sum of the travel times of the link, in ticks.
Date last_unrestricted_update; ///< When the unrestricted part of the link was last updated.
Date last_restricted_update; ///< When the restricted part of the link was last updated.
NodeID next_edge; ///< Destination of next valid edge starting at the same source node.
@@ -97,6 +98,12 @@ public:
*/
uint Usage() const { return this->edge.usage; }
/**
* Get edge's average travel time.
* @return Travel time, in ticks.
*/
uint32 TravelTime() const { return this->edge.travel_time_sum / this->edge.capacity; }
/**
* Get the date of the last update to the edge's unrestricted capacity.
* @return Last update.
@@ -296,7 +303,7 @@ public:
* @param edge Edge to be wrapped.
*/
Edge(BaseEdge &edge) : EdgeWrapper<BaseEdge>(edge) {}
void Update(uint capacity, uint usage, EdgeUpdateMode mode);
void Update(uint capacity, uint usage, uint32 time, EdgeUpdateMode mode);
void Restrict() { this->edge.last_unrestricted_update = INVALID_DATE; }
void Release() { this->edge.last_restricted_update = INVALID_DATE; }
};
@@ -429,8 +436,8 @@ public:
this->node.demand = demand;
}
void AddEdge(NodeID to, uint capacity, uint usage, EdgeUpdateMode mode);
void UpdateEdge(NodeID to, uint capacity, uint usage, EdgeUpdateMode mode);
void AddEdge(NodeID to, uint capacity, uint usage, uint32 time, EdgeUpdateMode mode);
void UpdateEdge(NodeID to, uint capacity, uint usage, uint32 time, EdgeUpdateMode mode);
void RemoveEdge(NodeID to);
};
@@ -440,6 +447,9 @@ public:
/** Minimum effective distance for timeout calculation. */
static const uint MIN_TIMEOUT_DISTANCE = 32;
/** Number of days before deleting links served only by vehicles stopped in depot. */
static const uint STALE_LINK_DEPOT_TIMEOUT = 1024;
/** Minimum number of days between subsequent compressions of a LG. */
static const uint COMPRESSION_INTERVAL = 256;

View File

@@ -284,12 +284,21 @@ void MultiCommodityFlow::Dijkstra(NodeID source_node, PathVector &paths)
capacity /= 100;
if (capacity == 0) capacity = 1;
}
/* punish in-between stops a little */
/* Prioritize the fastest route for passengers, mail and express cargo,
* and the shortest route for other classes of cargo.
* In-between stops are punished with a 1 tile or 1 day penalty. */
bool express = IsCargoInClass(this->job.Cargo(), CC_PASSENGERS) ||
IsCargoInClass(this->job.Cargo(), CC_MAIL) ||
IsCargoInClass(this->job.Cargo(), CC_EXPRESS);
uint distance = DistanceMaxPlusManhattan(this->job[from].XY(), this->job[to].XY()) + 1;
/* Compute a default travel time from the distance and an average speed of 1 tile/day. */
uint time = (edge.TravelTime() != 0) ? edge.TravelTime() + DAY_TICKS : distance * DAY_TICKS;
uint distance_anno = express ? time : distance;
Tannotation *dest = static_cast<Tannotation *>(paths[to]);
if (dest->IsBetter(source, capacity, capacity - edge.Flow(), distance)) {
if (dest->IsBetter(source, capacity, capacity - edge.Flow(), distance_anno)) {
annos.erase(dest);
dest->Fork(source, capacity, capacity - edge.Flow(), distance);
dest->Fork(source, capacity, capacity - edge.Flow(), distance_anno);
dest->UpdateAnnotation();
annos.insert(dest);
}

View File

@@ -218,6 +218,12 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next)
/* A link is at least partly restricted if a vehicle can't load at its source. */
EdgeUpdateMode restricted_mode = (cur->GetLoadType() & OLFB_NO_LOAD) == 0 ?
EUM_UNRESTRICTED : EUM_RESTRICTED;
Station *st_to = Station::GetIfValid(next_station);
/* This estimates the travel time of the link as the time needed
* to travel between the stations at half the max speed of the consist.
* The result is in tiles/tick (= 2048 km-ish/h). */
uint32 time_estimate = (st_to != nullptr) ?
DistanceManhattan(st->xy, st_to->xy) * 4096U / this->vehicle->GetDisplayMaxSpeed() : 0;
/* If the vehicle is currently full loading, increase the capacities at the station
* where it is loading by an estimate of what it would have transported if it wasn't
@@ -231,15 +237,15 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next)
uint effective_capacity = cargo_quantity * this->vehicle->load_unload_ticks;
if (effective_capacity > (uint)this->vehicle->orders.list->GetTotalDuration()) {
IncreaseStats(st, c, next_station, effective_capacity /
this->vehicle->orders.list->GetTotalDuration(), 0,
this->vehicle->orders.list->GetTotalDuration(), 0, 0,
EUM_INCREASE | restricted_mode);
} else if (RandomRange(this->vehicle->orders.list->GetTotalDuration()) < effective_capacity) {
IncreaseStats(st, c, next_station, 1, 0, EUM_INCREASE | restricted_mode);
IncreaseStats(st, c, next_station, 1, 0, 0, EUM_INCREASE | restricted_mode);
} else {
IncreaseStats(st, c, next_station, cargo_quantity, 0, EUM_REFRESH | restricted_mode);
IncreaseStats(st, c, next_station, cargo_quantity, 0, time_estimate, EUM_REFRESH | restricted_mode);
}
} else {
IncreaseStats(st, c, next_station, cargo_quantity, 0, EUM_REFRESH | restricted_mode);
IncreaseStats(st, c, next_station, cargo_quantity, 0, time_estimate, EUM_REFRESH | restricted_mode);
}
}
}

View File

@@ -152,12 +152,24 @@ void ZoomInOrOutToCursorWindow(bool in, Window *w)
}
}
void FixTitleGameZoom()
void FixTitleGameZoom(int zoom_adjust)
{
if (_game_mode != GM_MENU) return;
Viewport *vp = FindWindowByClass(WC_MAIN_WINDOW)->viewport;
/* Adjust the zoom in/out.
* Can't simply add, since operator+ is not defined on the ZoomLevel type. */
vp->zoom = _gui_zoom;
while (zoom_adjust < 0 && vp->zoom != ZOOM_LVL_MIN) {
vp->zoom--;
zoom_adjust++;
}
while (zoom_adjust > 0 && vp->zoom != ZOOM_LVL_MAX) {
vp->zoom++;
zoom_adjust--;
}
vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
}

View File

@@ -22,6 +22,8 @@ add_files(
network_gui.cpp
network_gui.h
network_internal.h
network_query.cpp
network_query.h
network_server.cpp
network_server.h
network_stun.cpp

View File

@@ -50,7 +50,7 @@ static const uint16 COMPAT_MTU = 1460; ///< Numbe
static const byte NETWORK_GAME_ADMIN_VERSION = 1; ///< What version of the admin network do we use?
static const byte NETWORK_GAME_INFO_VERSION = 6; ///< What version of game-info do we use?
static const byte NETWORK_COMPANY_INFO_VERSION = 6; ///< What version of company info is this?
static const byte NETWORK_COORDINATOR_VERSION = 5; ///< What version of game-coordinator-protocol do we use?
static const byte NETWORK_COORDINATOR_VERSION = 6; ///< What version of game-coordinator-protocol do we use?
static const uint NETWORK_NAME_LENGTH = 80; ///< The maximum length of the server name and map name, in bytes including '\0'
static const uint NETWORK_COMPANY_NAME_LENGTH = 128; ///< The maximum length of the company name, in bytes including '\0'

View File

@@ -53,6 +53,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
case ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY: return this->Receive_ADMIN_UPDATE_FREQUENCY(p);
case ADMIN_PACKET_ADMIN_POLL: return this->Receive_ADMIN_POLL(p);
case ADMIN_PACKET_ADMIN_CHAT: return this->Receive_ADMIN_CHAT(p);
case ADMIN_PACKET_ADMIN_EXTERNAL_CHAT: return this->Receive_ADMIN_EXTERNAL_CHAT(p);
case ADMIN_PACKET_ADMIN_RCON: return this->Receive_ADMIN_RCON(p);
case ADMIN_PACKET_ADMIN_GAMESCRIPT: return this->Receive_ADMIN_GAMESCRIPT(p);
case ADMIN_PACKET_ADMIN_PING: return this->Receive_ADMIN_PING(p);
@@ -132,6 +133,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_QUIT(Packet *p) { ret
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENCY(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_UPDATE_FREQUENCY); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_POLL); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_EXTERNAL_CHAT(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_EXTERNAL_CHAT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_RCON); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_GAMESCRIPT); }
NetworkRecvStatus NetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_ADMIN_PING); }

View File

@@ -30,6 +30,7 @@ enum PacketAdminType {
ADMIN_PACKET_ADMIN_RCON, ///< The admin sends a remote console command.
ADMIN_PACKET_ADMIN_GAMESCRIPT, ///< The admin sends a JSON string for the GameScript.
ADMIN_PACKET_ADMIN_PING, ///< The admin sends a ping to the server, expecting a ping-reply (PONG) packet.
ADMIN_PACKET_ADMIN_EXTERNAL_CHAT, ///< The admin sends a chat message from external source.
ADMIN_PACKET_SERVER_FULL = 100, ///< The server tells the admin it cannot accept the admin.
ADMIN_PACKET_SERVER_BANNED, ///< The server tells the admin it is banned.
@@ -163,6 +164,17 @@ protected:
*/
virtual NetworkRecvStatus Receive_ADMIN_CHAT(Packet *p);
/**
* Send chat from the external source:
* string Name of the source this message came from.
* uint16 TextColour to use for the message.
* string Name of the user who sent the messsage.
* string Message.
* @param p The packet that was just received.
* @return The state the network should have.
*/
virtual NetworkRecvStatus Receive_ADMIN_EXTERNAL_CHAT(Packet *p);
/**
* Execute a command on the servers console:
* string Command to be executed.

View File

@@ -205,9 +205,13 @@ void TCPConnecter::OnResolved(addrinfo *ai)
}
if (_debug_net_level >= 6) {
Debug(net, 6, "{} resolved in:", this->connection_string);
for (const auto &address : this->addresses) {
Debug(net, 6, "- {}", NetworkAddress(address->ai_addr, (int)address->ai_addrlen).GetAddressAsString());
if (this->addresses.size() == 0) {
Debug(net, 6, "{} did not resolve", this->connection_string);
} else {
Debug(net, 6, "{} resolved in:", this->connection_string);
for (const auto &address : this->addresses) {
Debug(net, 6, "- {}", NetworkAddress(address->ai_addr, (int)address->ai_addrlen).GetAddressAsString());
}
}
}

View File

@@ -26,7 +26,11 @@ protected:
/**
* Client requesting a list of content info:
* byte type
* uint32 openttd version
* uint32 openttd version (or 0xFFFFFFFF if using a list)
* Only if the above value is 0xFFFFFFFF:
* uint8 count
* string branch-name ("vanilla" for upstream OpenTTD)
* string release version (like "12.0")
* @param p The packet that was just received.
* @return True upon success, otherwise false.
*/

View File

@@ -61,9 +61,10 @@ enum ConnectionType {
* The type of error from the Game Coordinator.
*/
enum NetworkCoordinatorErrorType {
NETWORK_COORDINATOR_ERROR_UNKNOWN, ///< There was an unknown error.
NETWORK_COORDINATOR_ERROR_REGISTRATION_FAILED, ///< Your request for registration failed.
NETWORK_COORDINATOR_ERROR_INVALID_INVITE_CODE, ///< The invite code given is invalid.
NETWORK_COORDINATOR_ERROR_UNKNOWN, ///< There was an unknown error.
NETWORK_COORDINATOR_ERROR_REGISTRATION_FAILED, ///< Your request for registration failed.
NETWORK_COORDINATOR_ERROR_INVALID_INVITE_CODE, ///< The invite code given is invalid.
NETWORK_COORDINATOR_ERROR_REUSE_OF_INVITE_CODE, ///< The invite code is used by another (newer) server.
};
/** Base socket handler for all Game Coordinator TCP sockets. */

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