Merge branch 'master' into jgrpp-beta

# Conflicts:
#	.github/workflows/ci-build.yml
#	src/lang/german.txt
#	src/lang/romanian.txt
#	src/lang/slovak.txt
#	src/lang/turkish.txt
#	src/network/core/address.cpp
#	src/network/core/tcp.h
#	src/network/core/udp.cpp
#	src/network/network.cpp
#	src/network/network_client.cpp
#	src/network/network_server.cpp
#	src/network/network_server.h
#	src/network/network_udp.cpp
#	src/openttd.cpp
#	src/saveload/newgrf_sl.cpp
#	src/tree_cmd.cpp
#	src/video/video_driver.hpp
#	src/window.cpp
#	src/window_gui.h
pull/332/head
Jonathan G Rennison 3 years ago
commit 0b0d154788

@ -314,3 +314,45 @@ jobs:
echo "::group::Build"
cmake --build .
echo "::endgroup::"
check_annotations:
name: Check Annotations
needs:
- emscripten
- linux
- macos
- windows
if: always() && github.event_name == 'pull_request'
runs-on: ubuntu-20.04
steps:
- name: Get check suite ID
id: check_suite_id
uses: octokit/request-action@v2.x
with:
route: GET /repos/{repository}/actions/runs/{run_id}
repository: ${{ github.repository }}
run_id: ${{ github.run_id }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Get check runs
id: check_runs
uses: octokit/request-action@v2.x
with:
route: GET /repos/{repository}/check-suites/{check_suite_id}/check-runs
repository: ${{ github.repository }}
check_suite_id: ${{ fromJson(steps.check_suite_id.outputs.data).check_suite_id }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Check annotations
shell: bash
run: |
echo '[
${{ toJson(fromJson(steps.check_runs.outputs.data).check_runs.*.output.title) }}, ${{ toJson(fromJson(steps.check_runs.outputs.data).check_runs.*.output.summary) }}
]' | jq '.[0] as $t | .[1] as $s | reduce range(.[0] | length) as $i ([]; . + [if $t[$i] then $t[$i] + ": " + $s[$i] else empty end]) | .[]'
exit $(echo '${{ toJson(fromJson(steps.check_runs.outputs.data).check_runs.*.output.annotations_count) }}' | jq 'add')

@ -26,8 +26,10 @@ macro(compile_flags)
add_compile_options(/Zc:rvalueCast)
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# Enable multi-threaded compilation.
add_compile_options(/MP)
add_compile_options(
/MP # Enable multi-threaded compilation.
/FC # Display the full path of source code files passed to the compiler in diagnostics.
)
endif()
endif()

@ -9,7 +9,15 @@ Module['websocket'] = { url: function(host, port, proto) {
* If you run your own server you can setup your own WebSocket proxy in
* front of it and let people connect to your server via the proxy. You
* are best to add another "if" statement as above for this. */
return null;
if (location.protocol === 'https:') {
/* Insecure WebSockets do not work over HTTPS, so we force
* secure ones. */
return 'wss://';
} else {
/* Use the default provided by Emscripten. */
return null;
}
} };
Module.preRun.push(function() {

@ -213,7 +213,8 @@ TrueTypeFontCache::TrueTypeFontCache(FontSize fs, int pixels) : FontCache(fs), r
*/
TrueTypeFontCache::~TrueTypeFontCache()
{
this->ClearFontCache();
/* Virtual functions get called statically in destructors, so make it explicit to remove any confusion. */
this->TrueTypeFontCache::ClearFontCache();
for (auto &iter : this->font_tables) {
free(iter.second.second);

@ -93,7 +93,7 @@ static void _GenerateWorld()
try {
_generating_world = true;
if (_network_dedicated) DEBUG(net, 1, "Generating map, please wait...");
if (_network_dedicated) DEBUG(net, 3, "Generating map, please wait...");
/* Set the Random() seed to generation_seed so we produce the same map with the same seed */
if (_settings_game.game_creation.generation_seed == GENERATE_NEW_SEED) _settings_game.game_creation.generation_seed = _settings_newgame.game_creation.generation_seed = InteractiveRandom();
_random.SetSeed(_settings_game.game_creation.generation_seed);
@ -197,7 +197,7 @@ static void _GenerateWorld()
ShowNewGRFError();
if (_network_dedicated) DEBUG(net, 1, "Map generated, starting game");
if (_network_dedicated) DEBUG(net, 3, "Map generated, starting game");
DEBUG(desync, 1, "new_map: %08x", _settings_game.game_creation.generation_seed);
if (_debug_desync_level > 0) {
@ -213,7 +213,7 @@ static void _GenerateWorld()
if (_network_dedicated) {
/* Exit the game to prevent a return to main menu. */
DEBUG(net, 0, "Generating map failed, aborting");
DEBUG(net, 0, "Generating map failed; closing server");
_exit_game = true;
} else {
SwitchToMode(_switch_mode);

@ -1610,7 +1610,7 @@ static void _SetGeneratingWorldProgress(GenWorldProgress cls, uint progress, uin
/* Never show steps smaller than 2%, even if it is a mod 5% */
if (_gws.percent <= last_percent + 2) return;
DEBUG(net, 1, "Map generation percentage complete: %d", _gws.percent);
DEBUG(net, 3, "Map generation percentage complete: %d", _gws.percent);
last_percent = _gws.percent;
return;

@ -150,7 +150,7 @@ Industry::~Industry()
const bool has_neutral_station = this->neutral_station != nullptr;
TILE_AREA_LOOP(tile_cur, this->location) {
for (TileIndex tile_cur : this->location) {
if (IsTileType(tile_cur, MP_INDUSTRY)) {
if (GetIndustryIndex(tile_cur) == this->index) {
DeleteNewGRFInspectWindow(GSF_INDUSTRYTILES, tile_cur);
@ -165,7 +165,7 @@ Industry::~Industry()
if (has_neutral_station) {
/* Remove possible docking tiles */
TILE_AREA_LOOP(tile_cur, this->location) {
for (TileIndex tile_cur : this->location) {
ClearDockingTilesCheckingNeighbours(tile_cur);
}
}
@ -174,7 +174,7 @@ Industry::~Industry()
TileArea ta = TileArea(this->location.tile, 0, 0).Expand(21);
/* Remove the farmland and convert it to regular tiles over time. */
TILE_AREA_LOOP(tile_cur, ta) {
for (TileIndex tile_cur : ta) {
if (IsTileType(tile_cur, MP_CLEAR) && IsClearGround(tile_cur, CLEAR_FIELDS) &&
GetIndustryIndexOfField(tile_cur) == this->index) {
SetIndustryIndexOfField(tile_cur, INVALID_INDUSTRY);
@ -1085,7 +1085,7 @@ static void PlantFarmField(TileIndex tile, IndustryID industry)
/* check the amount of bad tiles */
int count = 0;
TILE_AREA_LOOP(cur_tile, ta) {
for (TileIndex cur_tile : ta) {
assert(cur_tile < MapSize());
count += IsSuitableForFarmField(cur_tile, false);
}
@ -1097,7 +1097,7 @@ static void PlantFarmField(TileIndex tile, IndustryID industry)
uint field_type = GB(r, 8, 8) * 9 >> 8;
/* make field */
TILE_AREA_LOOP(cur_tile, ta) {
for (TileIndex cur_tile : ta) {
assert(cur_tile < MapSize());
if (IsSuitableForFarmField(cur_tile, true)) {
MakeField(cur_tile, field_type, industry);
@ -1159,7 +1159,7 @@ static bool SearchLumberMillTrees(TileIndex tile, void *user_data)
static void ChopLumberMillTrees(Industry *i)
{
/* We only want to cut trees if all tiles are completed. */
TILE_AREA_LOOP(tile_cur, i->location) {
for (TileIndex tile_cur : i->location) {
if (i->TileBelongsToIndustry(tile_cur)) {
if (!IsIndustryCompleted(tile_cur)) return;
}
@ -1604,7 +1604,7 @@ static bool CheckCanTerraformSurroundingTiles(TileIndex tile, uint height, int i
if (TileX(tile) == 0 || TileY(tile) == 0 || GetTileType(tile) == MP_VOID) return false;
TileArea ta(tile - TileDiffXY(1, 1), 2, 2);
TILE_AREA_LOOP(tile_walk, ta) {
for (TileIndex tile_walk : ta) {
uint curh = TileHeight(tile_walk);
/* Is the tile clear? */
if ((GetTileType(tile_walk) != MP_CLEAR) && (GetTileType(tile_walk) != MP_TREES)) return false;
@ -1659,7 +1659,7 @@ static bool CheckIfCanLevelIndustryPlatform(TileIndex tile, DoCommandFlag flags,
* Perform terraforming as OWNER_TOWN to disable autoslope and town ratings. */
Backup<CompanyID> cur_company(_current_company, OWNER_TOWN, FILE_LINE);
TILE_AREA_LOOP(tile_walk, ta) {
for (TileIndex tile_walk : ta) {
uint curh = TileHeight(tile_walk);
if (curh != h) {
/* This tile needs terraforming. Check if we can do that without
@ -1679,7 +1679,7 @@ static bool CheckIfCanLevelIndustryPlatform(TileIndex tile, DoCommandFlag flags,
if (flags & DC_EXEC) {
/* Terraform the land under the industry */
TILE_AREA_LOOP(tile_walk, ta) {
for (TileIndex tile_walk : ta) {
uint curh = TileHeight(tile_walk);
while (curh != h) {
/* We give the terraforming for free here, because we can't calculate
@ -1711,7 +1711,7 @@ static CommandCost CheckIfFarEnoughFromConflictingIndustry(TileIndex tile, int t
if (Industry::GetNumItems() > (size_t) (dmax * dmax * 2)) {
const Industry* i = nullptr;
TileArea tile_area = TileArea(tile, 1, 1).Expand(dmax);
TILE_AREA_LOOP(atile, tile_area) {
for (TileIndex atile : tile_area) {
if (GetTileType(atile) == MP_INDUSTRY) {
const Industry *i2 = Industry::GetByTile(atile);
if (i == i2) continue;

@ -2277,7 +2277,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} s'
STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} s'ha unit als espectadors
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} ha començat una nova companyia (#{2:NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} ha deixat la partida ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} ha canviat el seu nom a {STRING}
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} ha canviat el seu nom a {STRING}.
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} ha donat {2:CURRENCY_LONG} a {1:STRING}.
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}El servidor ha tancat la sessió
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}El servidor està reiniciant...{}Espera un moment...

@ -2224,6 +2224,7 @@ STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Uw compu
STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Uw computer deed er te lang over om de kaart te downloaden
STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Uw computer deed er te lang over om met de server te verbinden
STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}Je spelernaam is niet geldig
STR_NETWORK_ERROR_SERVER_TOO_OLD :{WHITE}De opgevraagde server is te oud voor deze client
############ Leave those lines in this order!!
STR_NETWORK_ERROR_CLIENT_GENERAL :algemene fout
@ -2275,7 +2276,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} he
STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} kijkt nu toe
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} heeft een nieuw bedrijf opgericht (nr. {2:NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} heeft het spel verlaten ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} heeft zijn/haar naam gewijzigd naar {STRING}
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} heeft diens naam gewijzigd in {STRING}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gaf {2:CURRENCY_LONG} aan {1:STRING}
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}De server heeft de sessie gesloten
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De server wordt opnieuw gestart...{}Wacht alstublieft...

@ -2299,7 +2299,7 @@ STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Etsi ulk
STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Etsi OpenTTD:n ulkopuolisilta verkkosivuilta sisältöä, jota ei ole saatavilla OpenTTD:n sisältöpalvelussa
STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Olet poistumassa OpenTTD:stä!
STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}Ulkopuolisilta verkkosivuilta ladattaessa käyttöehdot voivat vaihdella.{}Sinun on noudatettava ulkopuolisen sivuston ohjeita sisällön asentamiseksi OpenTTD:hen.{}Haluatko jatkaa?
STR_CONTENT_FILTER_TITLE :{BLACK}Avainsana/nimi suodatus:
STR_CONTENT_FILTER_TITLE :{BLACK}Suodata avainsanalla tai nimellä:
STR_CONTENT_OPEN_URL :{BLACK}Vieraile verkkosivulla
STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Vieraile sisällön verkkosivulla
STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Lataa

@ -2535,6 +2535,7 @@ STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Dieser C
STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Das Herunterladen der Karte dauerte zu lange
STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Der Beitritt zum Server dauerte zu lange
STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}Ihr Spielername ist ungültig
STR_NETWORK_ERROR_SERVER_TOO_OLD :{WHITE}Der angefragte Server ist für diesen Client zu alt
############ Leave those lines in this order!!
STR_NETWORK_ERROR_CLIENT_GENERAL :Allgemeiner Fehler
@ -2586,7 +2587,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} is
STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} ist den Zuschauern beigetreten
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} hat eine neue Firma gegründet (#{2:NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} hat das Spiel verlassen ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} hat seinen/ihren Namen in {STRING} geändert
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} hat den eigenen Namen zu {STRING} geändert
STR_NETWORK_MESSAGE_GIVE_MONEY_RECEIVE :*** {STRING} gab der eigenen Firma {2:CURRENCY_LONG}
STR_NETWORK_MESSAGE_GAVE_MONEY_AWAY :*** Die eigene Firma übergab {1:STRING} {2:CURRENCY_LONG}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} gab {2:CURRENCY_LONG} an {1:STRING}

@ -416,7 +416,7 @@ STR_SETTINGS_MENU_MONEY_TEXT_EFFECTS :수입/지출
############ range for file menu starts
STR_FILE_MENU_SAVE_GAME :게임 저장하기
STR_FILE_MENU_LOAD_GAME :불러오기
STR_FILE_MENU_LOAD_GAME :게임 불러오기
STR_FILE_MENU_QUIT_GAME :게임 그만두기
STR_FILE_MENU_SEPARATOR :
STR_FILE_MENU_EXIT :종료

@ -934,7 +934,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Ringgit Malaysi
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Pe partea stângă
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Pe partea dreaptă
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Numele oraşelor
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Numele orașelor:
STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor
############ start of townname region
@ -996,6 +996,7 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normală
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Mărime dublă
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Mărime împătrită
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Dimensiune font
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Alege dimensiunea fontului pentru interfață
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detecție)
@ -1004,7 +1005,9 @@ STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Mărime dublă
STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafică
STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}Afișează rata de reîmprospătare
STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :{BLACK}Alegeți rata de reîmprospătare dorită
STR_GAME_OPTIONS_REFRESH_RATE_OTHER :alta
STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz
STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}Ratele de împrospătare de peste 60Hz ar putea afecta performanța.
@ -1183,6 +1186,7 @@ STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Alege în ce m
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Înălțimea limită a hărții: {STRING}
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM}
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(auto)
STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Nu poți seta înălțimea maximă a hărții la această valoare. Cel puțin un munte de pe hartă este mai înalt de-atât.
STR_CONFIG_SETTING_AUTOSLOPE :Permite terra-formarea sub clădiri, şine, etc. (auto-pante): {STRING}
STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite terraformarea sub clădiri şi şine fără eliminarea acestora
@ -1436,6 +1440,7 @@ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Pastrează acti
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Menține barele de construcție pentru tunele, poduri șamd deschise după folosire
STR_CONFIG_SETTING_EXPENSES_LAYOUT :Grupează cheltuielile în raportul financiar al companiei: {STRING}
STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Definește stilul ferestrei care afișează cheltuielile companiei
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Elimină automat semnalele pe durata construcției șinelor: {STRING}
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Elimină automat semnalele când construiești căi ferate dacă ele îți vin în cale. Nu uita că asta ar putea conduce la accidente feroviare.
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :Limita de viteză pentru trecerea timpului: {STRING}
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% din viteza normală a jocului
@ -1556,6 +1561,8 @@ STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Lin
STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Înghețată
STR_CONFIG_SETTING_ALLOW_SHARES :Permite cumpărarea de acţiuni de la alte companii: {STRING}
STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Dacă este activată, se permite cumpărarea și vânzarea de acțiuni ale companiilor. Acțiunile devin disponibile doar când compania depășește o anumită vârstă
STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Vârsta minimă a companiilor pentru tranzacțiile cu acțiuni: {STRING}
STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES_HELPTEXT :Stabilește vechimea minimă a unei companii, ca alții să-i poată tranzacționa acțiunile.
STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE :Procentul din profitul pe secţiune care să fie plătit pentru alimentare: {STRING}
STR_CONFIG_SETTING_FEEDER_PAYMENT_SHARE_HELPTEXT :Procentul din câştig care este oferit legăturilor intermediare pentru alimentare, oferind mai mult control asupra încasărilor
STR_CONFIG_SETTING_DRAG_SIGNALS_DENSITY :Când se trage cu mouse-ul, plasează semnale la fiecare: {STRING}
@ -1807,6 +1814,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Sigur v
# Cheat window
STR_CHEATS :{WHITE}Cheat-uri
STR_CHEATS_TOOLTIP :{BLACK}Bifa vă indică dacă aţi folosit anterior acest cheat
STR_CHEATS_NOTE :{BLACK}Notă: utilizarea acestor setări va fi memorată în salvarea jocului
STR_CHEAT_MONEY :{LTBLUE}Măreşte fondurile cu {CURRENCY_LONG}
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Joacă drept compania: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Buldozer magic (demolează industrii şi lucruri amovibile): {ORANGE}{STRING}
@ -1916,6 +1924,7 @@ STR_FACE_TIE :Cravată:
STR_FACE_EARRING :Cercei:
STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Schimbă cravata sau cerceii
STR_NETWORK_SERVER_VISIBILITY_PRIVATE :Privat
# Network server list
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Multiplayer
@ -1979,6 +1988,8 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Numele j
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Pune parolă
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Protejează-ţi jocul cu o parolă dacă nu vrei să intre jucători neautorizaţi
STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Vizibilitate
STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Dacă alți oameni îți pot vedea serverul în lista publică
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Număr maxim de clienţi:
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Alege un număr maxim de clienţi. Nu trebuie ocupate toate locurile.
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Companii maxim:
@ -2038,12 +2049,22 @@ STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Server p
STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Companie protejată. Introdu parola
# Network company list added strings
STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Lista de clienţi
STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Jucători conectați
STR_NETWORK_COMPANY_LIST_SPECTATE :Observă
# Network client list
STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Server
STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Modifică numele serverului tău
STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Vizibilitate
STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Dacă alți oameni îți pot vedea serverul în lista publică
STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP :{BLACK}Modifică-ți numele
STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}Trimite un mesaj tuturor jucătorilor acestei companii
STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Trimite un mesaj tuturor spectatorilor
STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :Deblocare cu parolă
STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}Sigur vrei să dai afară jucătorul '{STRING}'?
STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Sigur vrei să blochezi jucătorul '{STRING}'?
STR_NETWORK_SERVER :Server
STR_NETWORK_CLIENT :Client
@ -2099,6 +2120,7 @@ STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}A expira
STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Calculatorul dvs. este prea lent pentru a se sincroniza cu serverul
STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}A expirat timpul pentru descărcarea hărţii
STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}A expirat timpul pentru conectarea la server
STR_NETWORK_ERROR_SERVER_TOO_OLD :{WHITE}Serverul solicitat este prea vechi pentru acest client
############ Leave those lines in this order!!
STR_NETWORK_ERROR_CLIENT_GENERAL :eroare generală
@ -2148,7 +2170,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN :*** {STRING} a
STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} a intrat ca spectator
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} a început o companie nouă (#{2:NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} a ieşit din joc ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} şi-a schimbat numele în {STRING}
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} și-a schimbat numele în {STRING}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} a dat {2:CURRENCY_LONG} către {1:STRING}
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Serverul a închis conexiunea
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Serverul este repornit...{}Vă rugăm aşteptaţi...
@ -2702,9 +2724,11 @@ STR_FRAMERATE_AI :{BLACK} IA {N
############ Leave those lines in this order!!
STR_FRAMETIME_CAPTION_GAMELOOP :Buclă de joc
STR_FRAMETIME_CAPTION_GL_ECONOMY :Manipularea încărcăturilor
STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Decalaj grafic de conexiuni
STR_FRAMETIME_CAPTION_DRAWING :Randare grafică
STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Randarea vizorului global
STR_FRAMETIME_CAPTION_SOUND :Mixaj de sunet
STR_FRAMETIME_CAPTION_ALLSCRIPTS :Totalul de scripturi GS/AI
STR_FRAMETIME_CAPTION_AI :IA {NUM} {STRING}
############ End of leave-in-this-order
@ -3321,6 +3345,7 @@ STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRI
STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necesită:
STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING}
STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} așteaptă{STRING}
STR_CONFIG_GAME_PRODUCTION :{WHITE}Schimba productia (multiplu de 8, până la 2040)
STR_CONFIG_GAME_PRODUCTION_LEVEL :{WHITE}Modifică nivelul producţiei (procent, până la 800%)
@ -3440,11 +3465,12 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Cumpăr
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}Cumpără și schimbă marfa transportată de aeronavă
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Cumpără vehiculul feroviar selectat. Shift+Click arată costul estimat fără să cumpere vehiculul
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Cumpără autovehiculul selectat. Shift+Click arată costul estimat fără să cumpere autovehiculul
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Cumpără autovehiculul selectat. Shift+clic arată costul estimat fără achiziția autovehiculului
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Cumpără nava selectată. Shift+Click arată costul estimativ fără a efectua achiziţia
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Cumpără aeronava selectată. Shift+Click arată costul estimativ fără a efectua achiziţia
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Cumpără și repară trenul selectat. Shift+Click arată costul estimat fără cumpărare
STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Cumpără și repară trenul selectat. Shift+clic arată costul estimat fără achiziție
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Cumpără și repară autovehiculul selectat. Shift+clic arată costul estimat fără achiziție
STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_TOOLTIP :{BLACK}Cumpără și repară aeronava selectată. Shift+clic afișează costul estimat fără achiziție
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Nume nou
@ -3556,6 +3582,7 @@ STR_ENGINE_PREVIEW_CAPTION :{WHITE}Mesaj de
STR_ENGINE_PREVIEW_MESSAGE :{GOLD}Am creat un nou tip de {STRING}. Aţi fi interesaţi de folosirea exclusivă pentru un an a acestui vehicul, astfel ca noi să-i putem observa performanţele înaintea lansării oficiale?
STR_ENGINE_PREVIEW_RAILROAD_LOCOMOTIVE :locomotivă
STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :locomotivă electrificată
STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :locomotivă monoşină
STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :locomotivă pernă magnetică
@ -3567,8 +3594,9 @@ STR_ENGINE_PREVIEW_SHIP :navă
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Cost: {CURRENCY_LONG} Greutate: {WEIGHT_SHORT}{}Vitezã: {VELOCITY} Putere: {POWER}{}Cost de rulare: {CURRENCY_LONG}/an{}Capacitate: {CARGO_LONG}
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Cost: {CURRENCY_LONG} Greutate: {WEIGHT_SHORT}{}Viteză: {VELOCITY} Putere: {POWER} Ef. T. Max.: {6:FORCE}{}Cost rulaj: {4:CURRENCY_LONG}/an{}Capacitate: {5:CARGO_LONG}
STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Capacitate: {CARGO_LONG}{}Mentenanţă: {CURRENCY_LONG}/an
STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteza maximă: {VELOCITY}{}Tip avion: {STRING} Rază: {COMMA} pătrățele{}Capacitate: {CARGO_LONG}, {CARGO_LONG}{}Cost întreținere: {CURRENCY_LONG}/an
STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Capacitate: {CARGO_LONG}{}Mentenanță: {CURRENCY_LONG}/an
STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteză max.: {VELOCITY}{}Tip avion: {STRING}{}Capacitate: {CARGO_LONG}, {CARGO_LONG}{}Mentenanță: {CURRENCY_LONG}/an
STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Cost: {CURRENCY_LONG} Viteza maximă: {VELOCITY}{}Tip avion: {STRING} Rază: {COMMA} pătrățele{}Capacitate: {CARGO_LONG}, {CARGO_LONG}{}Mentenanță: {CURRENCY_LONG}/an
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Înlocuieşte {STRING} - {STRING}
@ -3618,6 +3646,7 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Fă opti
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Centrează vizorul principal pe locația vehiculului. Dublu-clic va urmări vehiculul în vizorul principal. Ctrl+clic deschide un nou vizor cu locația vehiculului
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Centrează imaginea pe locația navei. Dublu clic va urmări nava în vizorul principal. Ctrl+Clic deschide un nou vizor pe locația navei
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Trimite trenul într-un depou
@ -3651,6 +3680,7 @@ STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Afişeaz
STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Afişează detaliile aeronavei
STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Acțiunea trenului curent - clic pentru oprirea/pornirea trenului
STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}Acțiunea vehiculului curent - clic pentru oprirea/pornirea vehiculului
STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Acțiunea avionului curent - clic pentru oprirea/pornirea avionului
@ -4205,7 +4235,7 @@ STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Nu se po
STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Nu se poate construi sediul companiei...
STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Nu se pot cumpăra 25% din acţiunile acestei companii...
STR_ERROR_CAN_T_SELL_25_SHARE_IN :{WHITE}Nu se pot vinde 25% din acţiunile acestei companii...
STR_ERROR_PROTECTED :{WHITE}Această companie încă nu vinde acţiuni...
STR_ERROR_PROTECTED :{WHITE}Compania nu are vechimea necesară pentru tranzacționarea de acțiuni...
# Town related errors
STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}Nu pot construi nici un oras

@ -481,7 +481,7 @@ STR_FILE_MENU_EXIT :Ukončiť
# map menu
STR_MAP_MENU_MAP_OF_WORLD :Mapa sveta
STR_MAP_MENU_EXTRA_VIEWPORT :Ďalší pohľad
STR_MAP_MENU_LINGRAPH_LEGEND :Legenka k smerovaniu nákladu
STR_MAP_MENU_LINGRAPH_LEGEND :Legenda k smerovaniu nákladu
STR_MAP_MENU_SIGN_LIST :Zoznam popisov
############ range for town menu starts
@ -632,7 +632,7 @@ STR_MONTH_ABBREV_DEC :Dec
STR_MONTH_JAN :Január
STR_MONTH_FEB :Február
STR_MONTH_MAR :Marec
STR_MONTH_APR :April
STR_MONTH_APR :Apríl
STR_MONTH_MAY :Máj
STR_MONTH_JUN :Jún
STR_MONTH_JUL :Júl
@ -883,8 +883,8 @@ STR_NEWS_DISASTER_ZEPPELIN :{BIG_FONT}{BLAC
STR_NEWS_DISASTER_SMALL_UFO :{BIG_FONT}{BLACK}Cestné vozidlo bolo zničené pri kolízii s 'UFO'
STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY :{BIG_FONT}{BLACK}Ropná rafinéria explodovala neďaleko mesta {TOWN}!
STR_NEWS_DISASTER_HELICOPTER_FACTORY :{BIG_FONT}{BLACK}Za nejasných okolností bola zničená továreň neďaleko mesta {TOWN}!
STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}'UFO' pristalo nedaleko mesta {TOWN}!
STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}Zaval v uholnej bani nedaleko mesta {TOWN}!
STR_NEWS_DISASTER_BIG_UFO :{BIG_FONT}{BLACK}'UFO' pristálo neďaleko mesta {TOWN}!
STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}Zával v uhoľnej bani neďaleko mesta {TOWN}!
STR_NEWS_DISASTER_FLOOD_VEHICLE :{BIG_FONT}{BLACK}Povodeň!{}Najmenej {COMMA} ľudí je nezvestných alebo mŕtvych po obrovských záplavách!
STR_NEWS_COMPANY_IN_TROUBLE_TITLE :{BIG_FONT}{BLACK}Dopravná spoločnosť má problémy!
@ -915,7 +915,7 @@ STR_NEWS_END_OF_RECESSION :{BIG_FONT}{BLAC
STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL :{BIG_FONT}{BLACK}{INDUSTRY} zvyšuje produkciu!
STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_COAL :{BIG_FONT}{BLACK}Nové nálezisko uhlia sa objavilo v {INDUSTRY}!{}Očakáva sa zdvojnásobenie produkcie!
STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_OIL :{BIG_FONT}{BLACK}Nové nálezisko ropy sa objavilo na {INDUSTRY}!{}Očakáva sa zdvojnásobenie produkcie!
STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM :{BIG_FONT}{BLACK}Na {INDUSTRY} zlepsili pouzivane metody!Ocakava sa zdvojnasobenie produkcie!
STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM :{BIG_FONT}{BLACK}Na {INDUSTRY} zlepšili používané metódy! Očakáva sa zdvojnásobenie produkcie!
STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_SMOOTH :{BIG_FONT}{BLACK}{1:INDUSTRY} zvyšuje produkciu {0:STRING.g} o {2:COMMA}%!
STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL :{BIG_FONT}{BLACK}{INDUSTRY} znižuje produkciu o 50%
STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM :{BIG_FONT}{BLACK}Premnoženie škodcov spôsobilo zničenie úrody na {INDUSTRY}!{}Produkcia sa zíižila o 50%
@ -963,7 +963,7 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Dotácia udelená spoločnosti {STRING}!{}{}Preprava {STRING.g} z {STRING} do {STRING} bude budúci rok 3x výnosnejšia!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Dotácia udelená spoločnosti {STRING}!{}{}Preprava {STRING.g} z {STRING} do {STRING} bude budúci rok 4x výnosnejšia!
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}V meste {TOWN} zavladol dopravny chaos!{}{}Rekonstrukcia ciest financovana {STRING} prinesie 6 mesiacov utrpenia pre motoristov!
STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}V meste {TOWN} zavládol dopravný chaos!{}{}Rekonštrukcia ciest financovaná {STRING} prinesie 6 mesiacov utrpenia pre motoristov!
STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Prepravné monopoly!
STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}Miestna samospráva mesta {TOWN} podpísala exkluzívnu zmluvu na prepravu so spoločnosťou {STRING} na 1 rok !!!
@ -1027,7 +1027,7 @@ STR_GAME_OPTIONS_CURRENCY_MYR :Malajzijský ri
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Jazdia naľavo
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Jazdia napravo
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Názvy miest
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Názvy miest:
STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Výber štýlu názvov miest
############ start of townname region
@ -1067,6 +1067,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :Každých 12 me
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Jazyk
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Výber jazyka rozhrania
STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} ({NUM}% hotovo)
STR_GAME_OPTIONS_FULLSCREEN :{BLACK}Celá obrazovka
STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Zaškrtnite, ak chcete hrať OpenTTD na celej obrazovke
@ -1080,6 +1081,8 @@ STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Hardvér
STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}Zaškrtnutím políčka dovolíte, aby sa OpenTTD pokúsilo použiť hardvérové zrýchlenie. Zmena nastavenia sa uplatní až po reštartovaní hry
STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Nastavenie sa uplatní až po reštartovaní hry
STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync
STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Zaškrtnite toto políčko, aby ste povolili vertikálnu synchronizáciu. Zmeny budú uplatnené až po reštarte hry. Funguje iba ak je zapnutá hardvérová akcelerácia.
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Veľkosť rozhrania
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Výber veľkosti prvkov rozhrania
@ -1168,9 +1171,9 @@ STR_VARIETY_HIGH :Vysoká
STR_VARIETY_VERY_HIGH :Veľmi vysoká
STR_AI_SPEED_VERY_SLOW :Veľmi pomalé
STR_AI_SPEED_SLOW :Pomale
STR_AI_SPEED_SLOW :Pomalé
STR_AI_SPEED_MEDIUM :Stredne
STR_AI_SPEED_FAST :Rychle
STR_AI_SPEED_FAST :Rýchle
STR_AI_SPEED_VERY_FAST :Veľmi rýchle
STR_SEA_LEVEL_VERY_LOW :Veľmi nízka
@ -1202,9 +1205,9 @@ STR_TERRAIN_TYPE_ALPINIST :Alpinista
STR_TERRAIN_TYPE_CUSTOM :Vlastná výška
STR_TERRAIN_TYPE_CUSTOM_VALUE :Vlastná výška ({NUM})
STR_CITY_APPROVAL_PERMISSIVE :Pozitivny
STR_CITY_APPROVAL_TOLERANT :Tolerantny
STR_CITY_APPROVAL_HOSTILE :Odmietavy
STR_CITY_APPROVAL_PERMISSIVE :Pozitívny
STR_CITY_APPROVAL_TOLERANT :Tolerantný
STR_CITY_APPROVAL_HOSTILE :Odmietavý
STR_WARNING_NO_SUITABLE_AI :{WHITE}Nieje dostupné žiadne použiteľné AI...{}Niekoľko AI je možné stiahnuť cez 'Online obsah'
@ -1213,6 +1216,7 @@ STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Nastaven
STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Filtrovací reťazec:
STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbaliť všetko
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Zabaliť všetko
STR_CONFIG_SETTING_RESET_ALL :Resetovať všetky hodnoty
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(nie je dostupné vysvetlenie)
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Predvolená hodnota: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE :{LTBLUE}Nastavenie typu: {ORANGE}{STRING}
@ -1221,6 +1225,8 @@ STR_CONFIG_SETTING_TYPE_GAME_MENU :Nastavenie hry
STR_CONFIG_SETTING_TYPE_GAME_INGAME :Nastavenie hry (ukladané v uložených hrách; ovplyvní iba aktuálnu hru)
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Nastavenie spoločnosti (ukladané v uložených hrách; ovplyvní iba nové hry)
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Nastavenie spoločnosti (ukladané v uložených hrách; ovplyvní iba aktuálnu spoločnosť)
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION :{WHITE}Pozor!
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}Táto akcia vráti všetky nastavenia hry do pôvodného stavu.{}Chcete naozaj pokračovať?
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Kategória:
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Typ:
@ -1255,7 +1261,7 @@ STR_CONFIG_SETTING_NONE :Žiadne
STR_CONFIG_SETTING_ORIGINAL :Pôvodné
STR_CONFIG_SETTING_REALISTIC :Realistické
STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :vlavo
STR_CONFIG_SETTING_HORIZONTAL_POS_LEFT :vľavo
STR_CONFIG_SETTING_HORIZONTAL_POS_CENTER :v strede
STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :vpravo
@ -1355,7 +1361,7 @@ STR_CONFIG_SETTING_BRIBE_HELPTEXT :Povolí podplá
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE :Povoliť zakúpenie exkluzívnych dopravných práv: {STRING}
STR_CONFIG_SETTING_ALLOW_EXCLUSIVE_HELPTEXT :Ak si spoločnosť zakúpi exkluzívne prepravné práva od mesta, stanice protihráčov (pasažieri a náklad) nebudú prijímať žiaden náklad po celý rok !
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS :Povoliť financovanie stavieb: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Povolí spoločnostiam finančne prispievať na rozvoj mesta a budovanie nových domov.
STR_CONFIG_SETTING_ALLOW_FUND_BUILDINGS_HELPTEXT :Povol spoločnostiam finančne prispievať na rozvoj mesta a budovanie nových domov.
STR_CONFIG_SETTING_ALLOW_FUND_ROAD :Povoliť financovanie rekonštrukcie miestných ciest: {STRING}
STR_CONFIG_SETTING_ALLOW_FUND_ROAD_HELPTEXT :Povolí spoločnostiam finančne prispievať mestu na rekonštrukciu ciest. To môže zapríčiniť sabotovanie prepráv založených na cestných komunikáciách
STR_CONFIG_SETTING_ALLOW_GIVE_MONEY :Umožniť posielanie peňazí ostatným spoločnostiam: {STRING}
@ -1488,7 +1494,7 @@ STR_CONFIG_SETTING_LIVERIES_NONE :Žiadne
STR_CONFIG_SETTING_LIVERIES_OWN :Vlastná spoločnosť
STR_CONFIG_SETTING_LIVERIES_ALL :Všetky spoločnosti
STR_CONFIG_SETTING_PREFER_TEAMCHAT :Preferovať tímový chat s klávesou <ENTER>: {STRING}
STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Prepni systém odosielania správ medzi interným a verejným chatom. <ENTER> respektíve <CTRL+ENTER>
STR_CONFIG_SETTING_PREFER_TEAMCHAT_HELPTEXT :Prepnúť systém odosielania správ medzi interným a verejným chatom. <ENTER> respektíve <CTRL+ENTER>
STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING :Funkcia rolovacieho kolieska myši: {STRING}
STR_CONFIG_SETTING_SCROLLWHEEL_SCROLLING_HELPTEXT :Povolí posúvanie pomocou dvoj-dimenzionálnych kolečiek myši
STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :Priblížovať mapu
@ -1538,7 +1544,7 @@ STR_CONFIG_SETTING_TIMETABLE_IN_TICKS_HELPTEXT :Zobrazí časy
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Zobraziť príchody a odchody v cestovných poriadkoch: {STRING}
STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Zobrazí predpokladané časy príchodov a odchodov v časových rozpisoch.
STR_CONFIG_SETTING_QUICKGOTO :Rýchla tvorba cestovného poriadku vozidla: {STRING}
STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Prednastav "Choď do" kurzor pri otvorení okna s príkazmi
STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Prednastav "Choď do" kurzor pri otvorení okna s príkazmi
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Predvolený typ koľají (v novej/nahranej hre): {STRING}
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Typ železnice zvolený po štarte alebo nahraní hry. 'prvé dostupné' zvolí najstarší typ koľají, 'posledný dostupný' zvolí najnovší typ koľají, a 'najpoužívanejší' vyberie typ ktorý je v danej dobe najviac používaný.
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :prvé dostupné
@ -1600,10 +1606,10 @@ STR_CONFIG_SETTING_AI_PROFILE_EASY :Ľahký
STR_CONFIG_SETTING_AI_PROFILE_MEDIUM :Stredný
STR_CONFIG_SETTING_AI_PROFILE_HARD :{G=m}Ťažký
STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Povoliť AI-ov v hre viacerých hráčov: {STRING}
STR_CONFIG_SETTING_AI_IN_MULTIPLAYER :Povoliť AI v hre viacerých hráčov: {STRING}
STR_CONFIG_SETTING_AI_IN_MULTIPLAYER_HELPTEXT :Povoliť AI počítačovým hráčom hrať "Hru viacerých hráčov".
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES :#op kódov pred uspaním skriptu: {STRING}
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maximálne počet krokov skriptu počas 1 ťahu.
STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES_HELPTEXT :Maximálny počet krokov skriptu počas 1 ťahu.
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY :Maximálne využitie pamäte na skript: {STRING}
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Koľko pamäte môže jeden skript spotrebovať pred násilným ukončením. Pri veľkých mapách bude možno potrebné túto hodnotu zvýšiť.
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} MiB
@ -1877,11 +1883,11 @@ STR_CONFIG_ERROR_INVALID_VALUE :{WHITE}... zlá
STR_CONFIG_ERROR_TRAILING_CHARACTERS :{WHITE}... staviam postavičky na koniec nastavení '{STRING}'
STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}... ignorujem NewGRF '{STRING}': duplikuj GRF ID s hodnotou '{STRING}'
STR_CONFIG_ERROR_INVALID_GRF :{WHITE}... ignorujem nevhodné NewGRF '{STRING}': {STRING}
STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :nenašiel som
STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :nenájdené
STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :nevhodné pre statické použitie
STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :systém NewGRF
STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :nekompatibilné s touto verziou OpenTTD
STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :také nepoznám
STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :neznáme
STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}... hodnota kompresie '{STRING}' je zle zadaná
STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... formát uloženej hry '{STRING}' je nedostupný. Zmeniť späť na '{STRING}'
STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... ignorujem základnú grafickú sadu '{STRING}': nenájdené
@ -1955,8 +1961,8 @@ STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Hrať z
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Magický buldozér (odstráni priemysel a nehnuteľnosti): {ORANGE}{STRING}
STR_CHEAT_CROSSINGTUNNELS :{LTBLUE}Tunely sa môžu navzájom krížiť: {ORANGE}{STRING}
STR_CHEAT_NO_JETCRASH :{LTBLUE}Prúdové lietadlá nehavarujú (tak často) na malých letiskách: {ORANGE} {STRING}
STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Zmeň maximálnu výšku mapy: {ORANGE}{NUM}
STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Zmeň maximálnu výšku hôr na mape
STR_CHEAT_EDIT_MAX_HL :{LTBLUE}Zmeniť maximálnu výšku mapy: {ORANGE}{NUM}
STR_CHEAT_EDIT_MAX_HL_QUERY_CAPT :{WHITE}Zmeniť maximálnu výšku hôr na mape
STR_CHEAT_SWITCH_CLIMATE_TEMPERATE_LANDSCAPE :Krajina mierneho pásma
STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subpolárna krajina
STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropická krajina
@ -2059,11 +2065,13 @@ STR_FACE_TIE :Kravata:
STR_FACE_EARRING :Náušnica:
STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Zmeniť kravatu alebo náušnicu
STR_NETWORK_SERVER_VISIBILITY_PRIVATE :Privátny
STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Verejný
# Network server list
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Hra pre viac hráčov
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Meno hráča:
STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Toto je meno podla ktoreho vas ostatny identifikuju
STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Toto je meno podľa ktorého vás ostatný identifikujú
STR_NETWORK_SERVER_LIST_GAME_NAME :{BLACK}Názov
STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP :{BLACK}Názov hry
@ -2095,12 +2103,12 @@ STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Aktuál
STR_NETWORK_SERVER_LIST_PASSWORD :{SILVER}Heslo:
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVER JE OFFLINE
STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVER JE PLNÝ
STR_NETWORK_SERVER_LIST_VERSION_MISMATCH :{SILVER}ROZNE VERZIE
STR_NETWORK_SERVER_LIST_VERSION_MISMATCH :{SILVER}RÔZNE VERZIE
STR_NETWORK_SERVER_LIST_GRF_MISMATCH :{SILVER}NEWGRF Chyba
STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Pripojit sa
STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Pripojiť sa
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Obnoviť server
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Obnovit info o serveri
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Obnoviť info o serveri
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}Prehľadať internet
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Prehľadať verejné servery na internete
@ -2122,6 +2130,8 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Názov h
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Nastaviť heslo
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Zabezpeč hru heslom, ak nechceš povoliť verejný prístup
STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Viditeľnosť
STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Aby ostatní hráči videli tento server v zozname verejných servrov
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} klient{P "" i ov}
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Maximálny počet klientov:
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Zvoľ maximálny počet klientov. Môže sa ich pripojiť aj menej.
@ -2142,17 +2152,17 @@ STR_NETWORK_GAME_LOBBY_CAPTION :{WHITE}Sieťov
STR_NETWORK_GAME_LOBBY_PREPARE_TO_JOIN :{BLACK}Pripravuje sa k vstupu: {ORANGE}{STRING}
STR_NETWORK_GAME_LOBBY_COMPANY_LIST_TOOLTIP :{BLACK}Aktuálny zoznam spoločností v tejto hre. Buď môžeš do jednej vstúpiť, alebo založiť novú spoločnosť.
STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFO O SPOLOCNOSTI
STR_NETWORK_GAME_LOBBY_COMPANY_INFO :{SILVER}INFO O SPOLOČNOSTI
STR_NETWORK_GAME_LOBBY_COMPANY_NAME :{SILVER}Názov spoločnosti: {WHITE}{STRING}
STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Zalozene: {WHITE}{NUM}
STR_NETWORK_GAME_LOBBY_INAUGURATION_YEAR :{SILVER}Založené: {WHITE}{NUM}
STR_NETWORK_GAME_LOBBY_VALUE :{SILVER}Hodnota spoločnosti: {WHITE}{CURRENCY_LONG}
STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Stav uctu: {WHITE}{CURRENCY_LONG}
STR_NETWORK_GAME_LOBBY_CURRENT_BALANCE :{SILVER}Stav účtu: {WHITE}{CURRENCY_LONG}
STR_NETWORK_GAME_LOBBY_LAST_YEARS_INCOME :{SILVER}Zisk v minulom roku: {WHITE}{CURRENCY_LONG}
STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Vykon: {WHITE}{NUM}
STR_NETWORK_GAME_LOBBY_PERFORMANCE :{SILVER}Výkon: {WHITE}{NUM}
STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vozidla: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE}
STR_NETWORK_GAME_LOBBY_VEHICLES :{SILVER}Vozidlá: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE}
STR_NETWORK_GAME_LOBBY_STATIONS :{SILVER}Stanice: {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {SHIP}, {NUM} {PLANE}
STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Hraci: {WHITE}{STRING}
STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Hráči: {WHITE}{STRING}
STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nová spoločnosť
STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Založiť novú spoločnosť
@ -2185,12 +2195,45 @@ STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Server j
STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Spoločnosť je chránená. Zadaj heslo
# Network company list added strings
STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Zoznam klientov
STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Zoznam pripojených klientov
STR_NETWORK_COMPANY_LIST_SPECTATE :Pozorovať
# Network client list
STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Hra pre viacerých hráčov
STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Server
STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}Meno
STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Názov servra, na ktorom práve hráte
STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Upraviť názov servra
STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Názov servra
STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Viditelnosť
STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Aby ostatní hráči videli váš server v zozname verejných servrov
STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Hráč
STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}Meno
STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}Meno vašeho hráča
STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP :{BLACK}Upraviť meno vašeho hráča
STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :Meno vašeho hráča
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_TOOLTIP :{BLACK}Administrátorské činnosti, ktoré môžete vykonačť pre tohoto klienta
STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP :{BLACK}Administrátorské činnosti, ktoré pre túto spoločnosť môžete vykonať
STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}Pripojiť sa k tejto spoločnosti
STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}Poslať správu tomuto hráčovi
STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}Poslať správu všetkým hráčom tejto spoločnosti
STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Poslať správu všetkým pozorovateľom
STR_NETWORK_CLIENT_LIST_SPECTATORS :Pozorovatelia
STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Nová spoločnosť)
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Založiť novú spoločnosť a pripojiť sa k nej
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Toto ste vy
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Toto je hosť hry
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :Vyhodiť
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Ban
STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET :Vymazať
STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :Odomknúť heslom
STR_NETWORK_CLIENT_LIST_ASK_CAPTION :{WHITE}Akcia administrátora
STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}Ste si istý, že chcete vyhodiť hráča '{STRING}'?
STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}Ste si istý, že chcete zabanovť hráča '{STRING}'?
STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}Ste si istý, že chcete vymazať spoločnosť '{COMPANY}'?
STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}Ste si istý, že chcete zresetovať heslo pre spoločnosť '{COMPANY}'?
STR_NETWORK_SERVER :Server
STR_NETWORK_CLIENT :Klient
@ -2225,50 +2268,54 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Zadajte
# Network messages
STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Nebolo nájdené žiadne sieťové zariadenie, alebo je hra kompilovaná bez ENABLE_NETWORK
STR_NETWORK_ERROR_NOSERVER :{WHITE}Nebola najdena ziadna sietova hra
STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Server neodpoveda na ziadost
STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Pripojenie zlyhalo kvoli nespravnemu NewGRF
STR_NETWORK_ERROR_NOSERVER :{WHITE}Nebola nájdená žiadna sieťová hra
STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Server neodpovedá na žiadosť
STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Pripojenie zlyhalo kvôli nesprávnemu NewGRF
STR_NETWORK_ERROR_DESYNC :{WHITE}Sieť - Chyba synchronizácie hry
STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Sieť - Stratené spojenie
STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Nedokážem nahrať hru zo servera
STR_NETWORK_ERROR_SERVER_START :{WHITE}Server nemôžem spustiť
STR_NETWORK_ERROR_CLIENT_START :{WHITE}Nemozem sa pripojit.
STR_NETWORK_ERROR_CLIENT_START :{WHITE}Nemožem sa pripojiť
STR_NETWORK_ERROR_TIMEOUT :{WHITE}Vypršal časový limit pre spojenie č. {NUM}
STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Chyba vznikla v protokole a spojenie je zatvorene.
STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Chyba vznikla v protokole a spojenie je zatvorené
STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}Meno vašeho hráča nebolo nastavené. Meno si môžete zmeniť v hlavičke okna Hry pre viacerých hráčov
STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}Revizia hry u tohto klienta nezodpoveda revizii hry na serveri.
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Nespravne heslo.
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Server je plny
STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Si zablokovany na tomto serveri
STR_NETWORK_ERROR_KICKED :{WHITE}Bol si vyhodeny z hry
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Nesprávne heslo
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Server je plný
STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Si zabanovaný na tomto serveri
STR_NETWORK_ERROR_KICKED :{WHITE}Bol si vyhodený z hry
STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}Dôvod: {STRING}
STR_NETWORK_ERROR_CHEATER :{WHITE}Cheatovanie nie je povolene na tomto serveri
STR_NETWORK_ERROR_CHEATER :{WHITE}Cheatovanie nie je povolené na tomto serveri
STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Posielali ste priveľa príkazov serveru
STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Príliš dlho si zadával heslo
STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Tvoj počítač sa príliš pomaly pripájal na server
STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Tvoj počítač sťahoval mapu príliš dlho
STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Tvoj počítač sa príliš dlho pripájal na server
STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}Meno vašeho hráča nieje platné
STR_NETWORK_ERROR_SERVER_TOO_OLD :{WHITE}Nájdený server je príliš starý pre vašeho klienta
############ Leave those lines in this order!!
STR_NETWORK_ERROR_CLIENT_GENERAL :generalna chyba
STR_NETWORK_ERROR_CLIENT_DESYNC :chyba synchronizacie
STR_NETWORK_ERROR_CLIENT_GENERAL :všeobecná chyba
STR_NETWORK_ERROR_CLIENT_DESYNC :chyba synchronizácie
STR_NETWORK_ERROR_CLIENT_SAVEGAME :nemôžem načítať mapu
STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST :spojenie prerušené
STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR :chyba protokolu
STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH :Nespravne NewGRF
STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED :overenie odmietnute
STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH :Nesprávne NewGRF
STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED :overenie odmietnuté
STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED :prijatý neplatný, alebo neočakávaný paket
STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :chybna revizia hry
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :meno sa uz pouziva
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :nespravne heslo
STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :chybná verzia hry
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :meno sa už používa
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :nesprávne heslo
STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH :zlá spoločnosť-id in DoCommand
STR_NETWORK_ERROR_CLIENT_KICKED :vyhodený zo servera
STR_NETWORK_ERROR_CLIENT_CHEATER :sa pokusal cheatovat
STR_NETWORK_ERROR_CLIENT_SERVER_FULL :server je plny
STR_NETWORK_ERROR_CLIENT_CHEATER :sa pokúšal cheatovať
STR_NETWORK_ERROR_CLIENT_SERVER_FULL :server je plný
STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS :posielal priveľa príkazov
STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD :nebolo včas obdržané heslo
STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :všeobecný timeout
STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :sťahovanie mapy trvalo príliš dlho
STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :spracovanie mapy trvalo príliš dlho
STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME :Neplatný názov klienta
############ End of leave-in-this-order
STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}Možná ztráta pripojenia
@ -2299,7 +2346,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} za
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} opustil hru ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} zmenil/-a svoje meno na {STRING}
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} dal {2:CURRENCY_LONG} spoločnosti {1:STRING}
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Server ukoncil relaciu
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Server ukončil reláciu
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Server sa reštartuje...{}Čakajte prosím...
STR_NETWORK_MESSAGE_KICKED :*** Hráč {STRING} bol vyhodený. Dôvod: ({STRING})
@ -2469,7 +2516,7 @@ STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Vyberte
STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Vyberte typ stanice pre vystavbu
STR_STATION_CLASS_DFLT :Pôvodná stanica
STR_STATION_CLASS_WAYP :Smerove body
STR_STATION_CLASS_WAYP :Smerové body
# Signal window
STR_BUILD_SIGNAL_CAPTION :{WHITE}Výber návestidla
@ -2487,7 +2534,7 @@ STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Trasové
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Jednosmerné trasové návestidlo (elektrické){}Trasové návestidlo povolí viac vlakov v jednom úseku súčasne, ak má vlak voľnú trasu, ktorú si rezervuje. Jednosmerné trasové návestidla môžu vlaky prechádzať iba z prednej strany
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Zameniť návestidlo{}Po vybratí, kliknutím na existujúce návestidlo dochádza k zámene na vybraný typ a variantu návestidla. Ctrl+klik prepne existujúcu variantu. Shift+klik zobrazí odhadovanú cenu zámeny
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Hustota návestidiel pri stavbe ťahaním
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Znižit hustotu návestidiel
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Znížiť hustotu návestidiel
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Zvýšit hustotu návestidiel
# Bridge selection window
@ -2558,7 +2605,7 @@ STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Postavi
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Umiestniť bóju na vyznačenie trasy. Shift zobrazí odhadovanú cenu
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Postaviť akvadukt. Shift zobrazí odhadovanú cenu
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Definovať oblasť vody.{}Vytvorí vodný kanál, pri stlacení CTRL na úrovni mora zaplaví okolie
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umiestniť rieku.
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Umiestniť rieku. Ctrl označí oblasť diagonálne
# Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Orientácia lodenice
@ -2627,16 +2674,16 @@ STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Sadiť v
# Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Generovanie územia
STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Umiestnit nahodne skaly
STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Umiestniť náhodne skaly
STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Vytvoriť oblasť púšte.{}Držaním Ctrl ju odstránite
STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Pre zvýšenie/zníženie oblasti je potrebné zväčšiť územie
STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Pre zvýšenie/zníženie oblasti je potrebné zmenšiť územie
STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Vygenerovať náhodné územie
STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Vytvoriť nový scenár
STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Zresetovat územie
STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Zresetovať územie
STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Odstrániť všetok majetok spoločnosti z mapy
STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Zresetovat Územie
STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Zresetovať Územie
STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Ste si istý, že chcete odstrániť všetok majetok spoločnosti?
# Town generation window (SE)
@ -2655,9 +2702,9 @@ STR_FOUND_TOWN_NAME_RANDOM_BUTTON :{BLACK}Náhodn
STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Vygenerovať nové náhodné meno
STR_FOUND_TOWN_INITIAL_SIZE_TITLE :{YELLOW}Veľkosť mesta:
STR_FOUND_TOWN_INITIAL_SIZE_SMALL_BUTTON :{BLACK}Male
STR_FOUND_TOWN_INITIAL_SIZE_SMALL_BUTTON :{BLACK}Malé
STR_FOUND_TOWN_INITIAL_SIZE_MEDIUM_BUTTON :{BLACK}Stredne
STR_FOUND_TOWN_INITIAL_SIZE_LARGE_BUTTON :{BLACK}Velke
STR_FOUND_TOWN_INITIAL_SIZE_LARGE_BUTTON :{BLACK}Veľké
STR_FOUND_TOWN_SIZE_RANDOM :{BLACK}Náhodný
STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Vyber veľkosť mesta
STR_FOUND_TOWN_CITY :{BLACK}Veľkomesto
@ -2679,7 +2726,7 @@ STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Pokryť
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Vytvoriť náhodný priemysel
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Ste si istý, že chcete vytvoriť veľké množstvo náhodného priemyslu?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Cena: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Vyhladat
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Vyhľadať
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}Postaviť
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Založiť
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Odstrániť všetok priemysel
@ -2784,7 +2831,7 @@ STR_LAI_TREE_NAME_CACTUS_PLANTS :Kaktusy
STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Železničná stanica
STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Letecký hangár
STR_LAI_STATION_DESCRIPTION_AIRPORT :Letisko
STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Vykladka
STR_LAI_STATION_DESCRIPTION_TRUCK_LOADING_AREA :Vykládka
STR_LAI_STATION_DESCRIPTION_BUS_STATION :Stanica
STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Prístav
STR_LAI_STATION_DESCRIPTION_BUOY :Bója
@ -2976,13 +3023,13 @@ STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Zmeniť
STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Zmeniť rok začiatku hry
# SE Map generation
STR_SE_MAPGEN_CAPTION :{WHITE}Typ scenara
STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Rovna krajina
STR_SE_MAPGEN_CAPTION :{WHITE}Typ scenára
STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Rovná krajina
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generovať rovnú krajinu
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Nahodna krajina
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Náhodná krajina
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Výška rovnej krajiny:
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Znizit vysku rovnej krajiny o jedno
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Zvysit vysku rovnej krajiny o jedno
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Zvýšiť výšku rovnej krajiny o jedno
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Zmeniť výšku rovnej krajiny
@ -3012,16 +3059,16 @@ STR_NEWGRF_SETTINGS_SELECT_PRESET :{ORANGE}Vybrať
STR_NEWGRF_FILTER_TITLE :{ORANGE}Filtrovací reťazec:
STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Nahrať vybraný zoznam
STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Uložit zoznam
STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Uložit aktuálne nastavenie ako zoznam
STR_NEWGRF_SETTINGS_PRESET_SAVE_TOOLTIP :{BLACK}Uložiť aktuálne nastavenie ako zoznam
STR_NEWGRF_SETTINGS_PRESET_SAVE_QUERY :{BLACK}Zadajte názov zoznamu
STR_NEWGRF_SETTINGS_PRESET_DELETE :{BLACK}Vymazat zoznam
STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Vymazat vybraný zoznam
STR_NEWGRF_SETTINGS_ADD :{BLACK}Pridat
STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Pridat vybraný NewGRF súbor do konfigurácie
STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Obnovit zoznam súborov
STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Obnovit zoznam dostupných NewGRF súborov
STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Odstránit
STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Odstránit vybraný NewGRF súbor zo zoznamu
STR_NEWGRF_SETTINGS_PRESET_DELETE :{BLACK}Vymazať zoznam
STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Vymazať vybraný zoznam
STR_NEWGRF_SETTINGS_ADD :{BLACK}Pridať
STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Pridať vybraný NewGRF súbor do konfigurácie
STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Obnoviť zoznam súborov
STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Obnoviť zoznam dostupných NewGRF súborov
STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Odstrániť
STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Odstrániť vybraný NewGRF súbor zo zoznamu
STR_NEWGRF_SETTINGS_MOVEUP :{BLACK}Vyššie
STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Posunút vybraný NewGRF súbor v zozname vyššie
STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Nižšie
@ -3030,11 +3077,11 @@ STR_NEWGRF_SETTINGS_UPGRADE :{BLACK}Aktualiz
STR_NEWGRF_SETTINGS_UPGRADE_TOOLTIP :{BLACK}Aktualizujte NewGRF súbory ktoré máte inštalované, na novšie verzie
STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Zoznam inštalovaných NewGRF súborov.
STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Nastavit parametre
STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Nastaviť parametre
STR_NEWGRF_SETTINGS_SHOW_PARAMETERS :{BLACK}Ukázať parametre
STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Prepnúť paletu
STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Prepnúť paletu na zvolené NewGRF.{}Vykonajte to ak grafika z tohoto NewGRF je v hre ružová
STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Potvrdit zmeny
STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Potvrdiť zmeny
STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Nájsť chýbajúci obsah online
STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP :{BLACK}Skontrolovať či je chýbajúci obsah dostupný online
@ -3112,6 +3159,7 @@ STR_NEWGRF_ERROR_MSG_WARNING :{RED}Upozorneni
STR_NEWGRF_ERROR_MSG_ERROR :{RED}Chyba: {SILVER}{STRING}
STR_NEWGRF_ERROR_MSG_FATAL :{RED}Kritická chyba: {SILVER}{STRING}
STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Nastala závažná chyba NewGRF:{}{STRING}
STR_NEWGRF_ERROR_POPUP :{WHITE}Vyskytla sa chyba NewGRF:{}{STRING}
STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} nebude fungovať s TTDPatch verziou nahlásenou OpenTTD.
STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} je pre verziu {STRING} TTD.
STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je navrhnutý pre použitie s {STRING}
@ -3223,7 +3271,7 @@ STR_TOWN_VIEW_LOCAL_AUTHORITY_BUTTON :{BLACK}Miestna
STR_TOWN_VIEW_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Zobraziť informácie o miestnej správe
STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Zmeniť názov mesta
STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Rozsirit
STR_TOWN_VIEW_EXPAND_BUTTON :{BLACK}Rozšíriť
STR_TOWN_VIEW_EXPAND_TOOLTIP :{BLACK}Zväčšiť veľkosť mesta
STR_TOWN_VIEW_DELETE_BUTTON :{BLACK}Vymazať
STR_TOWN_VIEW_DELETE_TOOLTIP :{BLACK}Kompletne vymazať toto mesto
@ -3329,7 +3377,7 @@ STR_STATION_LIST_CAPTION :{WHITE}{COMPANY
STR_STATION_LIST_STATION :{YELLOW}{STATION} {STATION_FEATURES}
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
STR_STATION_LIST_NONE :{YELLOW}- Žiadne -
STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Oznacit vsetky moznosti
STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}Označiť všetky možnosti
STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}Označiť všetky druhy nákladu (vrátane nečakajúceho na prepravu)
STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}Nečaká žiadny typ nákladu
@ -3614,7 +3662,7 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_CAPTION :Nové automobil
STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Nové električky
############ range for vehicle availability starts
STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Železnicne vozidlá
STR_BUY_VEHICLE_TRAIN_ALL_CAPTION :Železničné vozidlá
STR_BUY_VEHICLE_ROAD_VEHICLE_ALL_CAPTION :Nové cestné vozidlá
STR_BUY_VEHICLE_SHIP_CAPTION :Nové lode
STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nové lietadlá
@ -3730,10 +3778,10 @@ STR_DEPOT_SELL_ALL_BUTTON_ROAD_VEHICLE_TOOLTIP :{BLACK}Predať
STR_DEPOT_SELL_ALL_BUTTON_SHIP_TOOLTIP :{BLACK}Predať všetky lode v lodenici
STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TOOLTIP :{BLACK}Predať všetky lietadlá v hangári
STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}Automaticky nahradit všetky vlaky v depe
STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Automaticky nahradit všetky vozidlá v garáži
STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Automaticky nahradit všetky lode v lodenici
STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Automaticky nahradit všetky lietadlá v hangári
STR_DEPOT_AUTOREPLACE_TRAIN_TOOLTIP :{BLACK}Automaticky nahradiť všetky vlaky v depe
STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Automaticky nahradiť všetky vozidlá v garáži
STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Automaticky nahradiť všetky lode v lodenici
STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Automaticky nahradiť všetky lietadlá v hangári
STR_DEPOT_TRAIN_NEW_VEHICLES_BUTTON :{BLACK}Nové vlaky
STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_BUTTON :{BLACK}Nové vozidlá
@ -3897,7 +3945,7 @@ STR_VEHICLE_STATUS_CRASHED :{RED}Zničené!
STR_VEHICLE_STATUS_BROKEN_DOWN :{RED}Pokazený
STR_VEHICLE_STATUS_STOPPED :{RED}Zastavené
STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}Zastavuje, {VELOCITY}
STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}Nie je prud
STR_VEHICLE_STATUS_TRAIN_NO_POWER :{RED}Nie je prúd
STR_VEHICLE_STATUS_TRAIN_STUCK :{ORANGE}Čakám na uvoľnenie trate
STR_VEHICLE_STATUS_AIRCRAFT_TOO_FAR :{ORANGE}K ďalšej destinácii je to príliš ďaleko
@ -3991,7 +4039,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Nová ka
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Nová kapacita: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Príjem z prestavby: {GREEN}{CURRENCY_LONG}
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Vyber vozidlo k prestavbe. Ťah myšou umožní vybrať viacej vozidiel. Kliknutie do voľného mista vybere celé vozidlo. Ctrl+Klik vyberie vozidlo a následujúci reťaz
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Vybrat typ prepravovaneho nakladu
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Vybrať typ prepravovaného nákladu
STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Vyberte požadovaný typ nákladu pre cestné vozidlo
STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}Vybrať typ nákladu pre loď
STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Vybrať nový typ nákladu
@ -4284,7 +4332,7 @@ STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Nastavi
STR_AI_LIST_CAPTION :{WHITE}Dostupné {STRING}
STR_AI_LIST_CAPTION_AI :AI
STR_AI_LIST_CAPTION_GAMESCRIPT :Herné skripty
STR_AI_LIST_TOOLTIP :{BLACK}Klikni pre výber skriptu
STR_AI_LIST_TOOLTIP :{BLACK}Kliknite pre výber skriptu
STR_AI_LIST_AUTHOR :{LTBLUE}Autor: {ORANGE}{STRING}
STR_AI_LIST_VERSION :{LTBLUE}Verzia: {ORANGE}{NUM}
@ -4305,7 +4353,7 @@ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Snímka
# AI Parameters
STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre
STR_AI_SETTINGS_CAPTION_AI :Imelá inteligencia
STR_AI_SETTINGS_CAPTION_AI :Umelá inteligencia
STR_AI_SETTINGS_CAPTION_GAMESCRIPT :Skript
STR_AI_SETTINGS_CLOSE :{BLACK}Zavrieť
STR_AI_SETTINGS_RESET :{BLACK}Resetovať
@ -4350,7 +4398,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Odhadova
# Saveload messages
STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ukladanie hry este bezi,{}pockajte prosim na dokoncenie!
STR_ERROR_AUTOSAVE_FAILED :{WHITE}Autoulozenie zlyhalo
STR_ERROR_AUTOSAVE_FAILED :{WHITE}Automatické ukladanie zlyhalo
STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Zariadenie je nečitateľné
STR_ERROR_GAME_SAVE_FAILED :{WHITE}Uloženie hry zlyhalo{}{STRING}
STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Súbor sa nedá vymazať
@ -4424,9 +4472,9 @@ STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}{TOWN} m
STR_ERROR_BRIBE_FAILED :{WHITE}Tvoj pokus o podplácanie bol odhalený vyšetrovateľom
# Levelling errors
STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Nemôžeš tu zvýšiť terén...
STR_ERROR_CAN_T_LOWER_LAND_HERE :{WHITE}Nemôžeš tu znížiť terén...
STR_ERROR_CAN_T_LEVEL_LAND_HERE :{WHITE}Nemôžem tu upraviť terén...
STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Nemôžete tu zvýšiť terén...
STR_ERROR_CAN_T_LOWER_LAND_HERE :{WHITE}Nemôžete tu znížiť terén...
STR_ERROR_CAN_T_LEVEL_LAND_HERE :{WHITE}Nemôžete tu upraviť terén...
STR_ERROR_EXCAVATION_WOULD_DAMAGE :{WHITE}Vyhĺbenie by poškodilo tunel
STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... už na úrovni mora
STR_ERROR_TOO_HIGH :{WHITE}... príliš vysoko
@ -4440,25 +4488,25 @@ STR_ERROR_CAN_T_CHANGE_PRESIDENT :{WHITE}Meno pre
STR_ERROR_MAXIMUM_PERMITTED_LOAN :{WHITE}... úverovy limit je {CURRENCY_LONG}
STR_ERROR_CAN_T_BORROW_ANY_MORE_MONEY :{WHITE}Nemôžete si požičať viac peňazí...
STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... úver už bol splatený
STR_ERROR_CURRENCY_REQUIRED :{WHITE}... {CURRENCY_LONG} potrebuješ
STR_ERROR_CURRENCY_REQUIRED :{WHITE}... Potrebuješ {CURRENCY_LONG}
STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Úver sa nedá splatiť...
STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Nie je možné presunúť peniaze, ktoré sú požičané z banky...
STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}Nie je možné presunúť peniaze tejto spoločnosti...
STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Spoločnosť nie je možné kúpiť ...
STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Nemôžete tu postaviť sídlo spoločnosti...
STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Nemôžeš kúpiť 25% podiel v tejto spoločnosti...
STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Nemôžete kúpiť 25% podiel v tejto spoločnosti...
STR_ERROR_CAN_T_SELL_25_SHARE_IN :{WHITE}25% podiel v tejto spoločnosti sa nedá predať ...
STR_ERROR_PROTECTED :{WHITE}S akciami tejto spoločnosti nie je zatiaľ možné obchodovať...
# Town related errors
STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}Nie je možné postaviť viac miest
STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}Mesto nemôže byť odstránené...
STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}Nemôžeš tu postaviť mesto...
STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}Nemôžete tu založiť mesto...
STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}Nemožno rozšíriť mesto...
STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... príliš blízko okraja mapy
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... príliš blízko iného mesta
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... príliš veľa miest
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... nie je dalsie miesto na mape
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... nie je miesto na mape
STR_ERROR_TOWN_EXPAND_WARN_NO_ROADS :{WHITE}Mesto nebude stavať cesty. Môžete povoliť budovanie ciest cez Pokročilé nasvavenia->Ekonomika->Mestá.
STR_ERROR_ROAD_WORKS_IN_PROGRESS :{WHITE}Prebiehajú cestné práce
STR_ERROR_TOWN_CAN_T_DELETE :{WHITE}Toto mesto nie je možné odstrániť...{}Stanica alebo depo sa odvoláva na mesto, alebo parcela vo vlastníctve mesta nemôže byť odstránená
@ -4489,7 +4537,7 @@ STR_ERROR_NO_SUITABLE_PLACES_FOR_INDUSTRIES_EXPLANATION :{WHITE}Pre zís
# Station construction related errors
STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Nemôžete tu postaviť železničnú stanicu...
STR_ERROR_CAN_T_BUILD_BUS_STATION :{WHITE}Nemôžete tu postaviť autobusovú zastávku...
STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Nemôžeš tu postaviť vykládku...
STR_ERROR_CAN_T_BUILD_TRUCK_STATION :{WHITE}Nemôžete tu postaviť vykládku...
STR_ERROR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Nemôžete tu postaviť električkovú zastávku...
STR_ERROR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Nemôžete tu postaviť električkovú vykládku...
STR_ERROR_CAN_T_BUILD_DOCK_HERE :{WHITE}Nemôžete tu postaviť prístav...
@ -4532,7 +4580,7 @@ STR_ERROR_WAYPOINT_ADJOINS_MORE_THAN_ONE_EXISTING :{WHITE}Susedí
STR_ERROR_TOO_CLOSE_TO_ANOTHER_WAYPOINT :{WHITE}Príliš blízko iného smerovému bodu
STR_ERROR_CAN_T_BUILD_TRAIN_WAYPOINT :{WHITE}Tu nie je možné postaviť železničný smerový bod...
STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Nemôžeš tu postaviť bóju...
STR_ERROR_CAN_T_POSITION_BUOY_HERE :{WHITE}Nemôžete tu umiestniť bóju...
STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME :{WHITE}Názov smerového bodu sa nedá zmeniť...
STR_ERROR_CAN_T_REMOVE_TRAIN_WAYPOINT :{WHITE}Tu nie je možné odstrániť železničný smerový bod...
@ -4543,8 +4591,8 @@ STR_ERROR_BUOY_IS_IN_USE :{WHITE}... bój
# Depot related errors
STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Nemôžete tu postaviť vlakové depo...
STR_ERROR_CAN_T_BUILD_ROAD_DEPOT :{WHITE}Nemôžete tu postaviť garáž...
STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Nemôžeš tu postaviť električkové depo...
STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Nemôžeš tu postaviť lodenicu...
STR_ERROR_CAN_T_BUILD_TRAM_DEPOT :{WHITE}Nemôžete tu postaviť električkovú garáž...
STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Nemôžete tu postaviť lodenicu...
STR_ERROR_CAN_T_RENAME_DEPOT :{WHITE}Depo sa nedá premenovať...
@ -4581,7 +4629,7 @@ STR_ERROR_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Musíš
STR_ERROR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Cesta je jednosmerná alebo blokovaná.
STR_ERROR_CROSSING_DISALLOWED_RAIL :{WHITE}Nie sú povolené priecestia pre tento typ železnice
STR_ERROR_CROSSING_DISALLOWED_ROAD :{WHITE}Nie sú povolené priecestia pre tento typ cesty
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Nemôžeš tu umiestniť návestidlá...
STR_ERROR_CAN_T_BUILD_SIGNALS_HERE :{WHITE}Nemôžete tu umiestniť návestidlá...
STR_ERROR_CAN_T_BUILD_RAILROAD_TRACK :{WHITE}Nemôžete tu postaviť železničnú trať...
STR_ERROR_CAN_T_REMOVE_RAILROAD_TRACK :{WHITE}Nemôžeš tu odstrániť železničné koľaje...
STR_ERROR_CAN_T_REMOVE_SIGNALS_FROM :{WHITE}Nemôžeš tu odstrániť návestidlá...
@ -4589,19 +4637,19 @@ STR_ERROR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Tu nie j
STR_ERROR_THERE_IS_NO_RAILROAD_TRACK :{WHITE}...nenašli sa železničné koľaje
STR_ERROR_THERE_ARE_NO_SIGNALS :{WHITE}... nenašli sa návestidlá
STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Nemôžeš tu konvertovať železnicu...
STR_ERROR_CAN_T_CONVERT_RAIL :{WHITE}Nemôžete tu konvertovať železnicu...
# Road construction errors
STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Najprv treba odstrániť cestu
STR_ERROR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... na jednosmerných cestách nie sú dovolené križovatky
STR_ERROR_CAN_T_BUILD_ROAD_HERE :{WHITE}Nemôžete tu postaviť cestu...
STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Nemôžeš tu stavať električkovú trať...
STR_ERROR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Nemôžete tu postaviť električkovú trať...
STR_ERROR_CAN_T_REMOVE_ROAD_FROM :{WHITE}Nemôžeš tu odstrániť cestu...
STR_ERROR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Nemôžeš tu odstrániť električkovú trať...
STR_ERROR_THERE_IS_NO_ROAD :{WHITE}... nenašla sa cesta
STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}...nenašla sa električková trať
STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Nemôžeš tu konvertovať cestu...
STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Nemôžeš tu konvertovať električkovú trať...
STR_ERROR_CAN_T_CONVERT_ROAD :{WHITE}Nemôžete tu konvertovať cestu...
STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Nemôžete tu konvertovať električkovú trať...
STR_ERROR_NO_SUITABLE_ROAD :{WHITE}Žiadna použiteľná cesta
STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Žiadna použiteľná električková trať
STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... nekompatibilné električkové trate
@ -4621,7 +4669,7 @@ STR_ERROR_CAN_T_BUILD_AQUEDUCT_HERE :{WHITE}Nemôže
# Tree related errors
STR_ERROR_TREE_ALREADY_HERE :{WHITE}... strom tu už je
STR_ERROR_TREE_WRONG_TERRAIN_FOR_TREE_TYPE :{WHITE}... zlý terén pre tento typ stromov
STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}Nemôžeš tu zasadiť strom...
STR_ERROR_CAN_T_PLANT_TREE_HERE :{WHITE}Nemôžete tu zasadiť stromy...
# Bridge related errors
STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Nemôžete tu postaviť most...
@ -4636,7 +4684,7 @@ STR_ERROR_BRIDGE_TOO_LONG :{WHITE}... most
STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Most skončí za okrajom mapy
# Tunnel related errors
STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nemôžeš tu postaviť tunel...
STR_ERROR_CAN_T_BUILD_TUNNEL_HERE :{WHITE}Nemôžete tu postaviť tunel...
STR_ERROR_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Miesto nevhodné pre vjazd do tunela
STR_ERROR_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Tunel musi byť najskôr zbúraný
STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Iný tunel v ceste
@ -4709,7 +4757,7 @@ STR_ERROR_SHIP_NOT_AVAILABLE :{WHITE}Loď nie
STR_ERROR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Lietadlo nie je dostupné
STR_ERROR_TOO_MANY_VEHICLES_IN_GAME :{WHITE}V hre je príliš veľa dopravných prostriedkov
STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nie je možné zmenit servisný interval ...
STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Nemožno zmeniť servisný interval...
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... vozidlo je zničené
@ -4723,12 +4771,12 @@ STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Nemôže
STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Nemožno otočiť vlak naopak...
STR_ERROR_TRAIN_START_NO_POWER :Vlak nemá energiu
STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Nemôžem otočiť cestné vozidlo...
STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN :{WHITE}Nemožno otočiť cestné vozidlo...
STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Lietadlo je vo vzduchu
# Order related errors
STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Nemozno zadat dalsie prikazy
STR_ERROR_NO_MORE_SPACE_FOR_ORDERS :{WHITE}Nemožno zadať ďalšie príkazy
STR_ERROR_TOO_MANY_ORDERS :{WHITE}Príliš veľa príkazov
STR_ERROR_CAN_T_INSERT_NEW_ORDER :{WHITE}Nemožno vložiť nový príkaz...
STR_ERROR_CAN_T_DELETE_THIS_ORDER :{WHITE}Nemožno vymazať tento príkaz...
@ -4747,7 +4795,7 @@ STR_ERROR_TOO_FAR_FROM_PREVIOUS_DESTINATION :{WHITE}... prí
STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... lietadlo nemá dostatočný dosah
# Timetable related errors
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Vozidlu nie je možné zadat cestovný poriadok ...
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Vozidlu nie je možné zadať cestovný poriadok ...
STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Vozidlá možu cakat len v staniciach.
STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Toto vozidlo nezastavuje v tejto stanici.
@ -4755,7 +4803,7 @@ STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Toto voz
STR_ERROR_TOO_MANY_SIGNS :{WHITE}... príliš veľa popisov
STR_ERROR_CAN_T_PLACE_SIGN_HERE :{WHITE}Tu sa nedá umiestniť popis...
STR_ERROR_CAN_T_CHANGE_SIGN_NAME :{WHITE}Nemožno zmeniť text popisu...
STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Nemôžem zmazať popis...
STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Nemožno vymazať popis...
# Translatable comment for OpenTTD's desktop shortcut
STR_DESKTOP_SHORTCUT_COMMENT :Simulátor založený na hre Transport Tycoon Deluxe
@ -4789,21 +4837,21 @@ STR_TOWN_BUILDING_NAME_HOTEL_1 :{G=m}Hotel
STR_TOWN_BUILDING_NAME_STATUE_1 :{G=z}Socha
STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :{G=z}Fontána
STR_TOWN_BUILDING_NAME_PARK_1 :{G=m}Park
STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Kancelarie
STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2 :Kancelárie
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1 :Obchody a kancelárie
STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Moderná administratívna budova
STR_TOWN_BUILDING_NAME_WAREHOUSE_1 :{G=m}Sklad
STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Kancelárie
STR_TOWN_BUILDING_NAME_STADIUM_1 :{G=m}Stadión
STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Stare domy
STR_TOWN_BUILDING_NAME_STADIUM_1 :{G=m}Štadión
STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Staré domy
STR_TOWN_BUILDING_NAME_COTTAGES_1 :Chaty
STR_TOWN_BUILDING_NAME_HOUSES_1 :Domy
STR_TOWN_BUILDING_NAME_FLATS_1 :Byty
STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :{G=z}Administrativa
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Obchody a kancelarie
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Obchody a kancelarie
STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :{G=z}Administratíva
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Obchody a kancelárie
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Obchody a kancelárie
STR_TOWN_BUILDING_NAME_THEATER_1 :{G=s}Divadlo
STR_TOWN_BUILDING_NAME_STADIUM_2 :{G=m}Stadión
STR_TOWN_BUILDING_NAME_STADIUM_2 :{G=m}Štadión
STR_TOWN_BUILDING_NAME_OFFICES_1 :Kancelárie
STR_TOWN_BUILDING_NAME_HOUSES_2 :Domy
STR_TOWN_BUILDING_NAME_CINEMA_1 :{G=s}Kino

@ -195,6 +195,7 @@ STR_COLOUR_DEFAULT :Varsayılan
STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mil/s
STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/s
STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/s
STR_UNITS_VELOCITY_GAMEUNITS :{DECIMAL}{NBSP}karo/gün
STR_UNIT_NAME_VELOCITY_IMPERIAL :mil/s
STR_UNIT_NAME_VELOCITY_METRIC :km/h
@ -318,8 +319,15 @@ STR_SORT_BY_CARGO_CAPACITY :Kargo kapasites
STR_SORT_BY_RANGE :Menzil
STR_SORT_BY_POPULATION :Nüfus
STR_SORT_BY_RATING :Değerlendirme
STR_SORT_BY_NUM_VEHICLES :Araç sayısı
STR_SORT_BY_TOTAL_PROFIT_LAST_YEAR :Geçen yılki toplam kar
STR_SORT_BY_TOTAL_PROFIT_THIS_YEAR :Bu yılki toplam kar
STR_SORT_BY_AVERAGE_PROFIT_LAST_YEAR :Geçen yılki ortalama kar
STR_SORT_BY_AVERAGE_PROFIT_THIS_YEAR :Bu yılki ortalama kar
# Group by options for vehicle list
STR_GROUP_BY_NONE :Hiçbiri
STR_GROUP_BY_SHARED_ORDERS :Paylaşılan talimatlar
# Tooltips for the main toolbar
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Oyunu durdur
@ -693,7 +701,7 @@ STR_PLAYLIST_TOOLTIP_CLICK_TO_REMOVE_TRACK :{BLACK}Kullanı
STR_HIGHSCORE_TOP_COMPANIES_WHO_REACHED :{BIG_FONT}{BLACK} {NUM}
STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK} {NUM} senesindeki şirket ligi
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :İşadamı
STR_HIGHSCORE_PERFORMANCE_TITLE_BUSINESSMAN :İş insanı
STR_HIGHSCORE_PERFORMANCE_TITLE_ENTREPRENEUR :Girişimci
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Sanayici
STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Sermayedar
@ -745,6 +753,7 @@ STR_SMALLMAP_LEGENDA_DOCK :{TINY_FONT}{BLA
STR_SMALLMAP_LEGENDA_ROUGH_LAND :{TINY_FONT}{BLACK}Engebeli Alan
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Çim alan
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Çıplak Arazi
STR_SMALLMAP_LEGENDA_RAINFOREST :{TINY_FONT}{BLACK}Yağmur ormanı
STR_SMALLMAP_LEGENDA_FIELDS :{TINY_FONT}{BLACK}Meralar
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Ağaçlar
STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Kayalar
@ -776,6 +785,7 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Haritada
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Son mesajı ya da haberi göster
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
STR_STATUSBAR_PAUSED :{YELLOW}* * DURAKLATILDI * *
STR_STATUSBAR_PAUSED_LINK_GRAPH :{ORANGE}* * DURDU (bağlantı grafiğinin güncellenmesi bekleniyor) * *
STR_STATUSBAR_AUTOSAVE :{RED}OTOMATİK KAYDET
STR_STATUSBAR_SAVING_GAME :{RED}* * KAYDEDiYOR * *
@ -942,13 +952,14 @@ STR_GAME_OPTIONS_CURRENCY_NTD :Yeni Tayvan Dol
STR_GAME_OPTIONS_CURRENCY_CNY :Çin Yuanı (CNY)
STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Doları (HKD)
STR_GAME_OPTIONS_CURRENCY_INR :Hindistan Rupisi (INR)
STR_GAME_OPTIONS_CURRENCY_IDR :Endonezya Rupiahı (IDR)
STR_GAME_OPTIONS_CURRENCY_MYR :Malezya Ringgiti (MYR)
############ end of currency region
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Soldan trafik
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Sağdan trafik
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Şehir isimleri
STR_GAME_OPTIONS_TOWN_NAMES_FRAME :{BLACK}Şehir isimleri:
STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Şehir isimleri için bir tür seçin
############ start of townname region
@ -988,6 +999,7 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :Her oniki ayda
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Dil
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Görünen dili seçin
STR_GAME_OPTIONS_LANGUAGE_PERCENTAGE :{STRING} (%{NUM} tamamlandı)
STR_GAME_OPTIONS_FULLSCREEN :{BLACK}Tam ekran
STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Tam ekran oynamak için bunu isaretleyin
@ -997,11 +1009,17 @@ STR_GAME_OPTIONS_RESOLUTION_TOOLTIP :{BLACK}Kullanı
STR_GAME_OPTIONS_RESOLUTION_OTHER :diğer
STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM}
STR_GAME_OPTIONS_VIDEO_ACCELERATION :{BLACK}Donanım hızlandırma
STR_GAME_OPTIONS_VIDEO_ACCELERATION_TOOLTIP :{BLACK}OpenTTD'nin donanım ivmesini kullanmayı denemesine izin vermek için bu kutuyu işaretleyin. Değiştirilmiş bir ayar sadece oyun yeniden başlatıldığında uygulanır
STR_GAME_OPTIONS_VIDEO_ACCELERATION_RESTART :{WHITE}Ayar sadece oyun yeniden başlatıldığında uygulanır
STR_GAME_OPTIONS_VIDEO_VSYNC :{BLACK}VSync
STR_GAME_OPTIONS_VIDEO_VSYNC_TOOLTIP :{BLACK}Dikey senkronizasyon'u aktif etmek için bu kutuyu işaretleyin. Değiştirilmiş bir ayar sadece oyun yeniden başlatıldığında uygulanır. Yalnızca donanım ivmesi aktifken çalışır
STR_GAME_OPTIONS_GUI_ZOOM_FRAME :{BLACK}Arayüz boyutu
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Kullanmak üzere arayüz bileşen boyutunu seçin
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_AUTO :(otomatik-tespit)
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :İki kat büyük
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Dört kat büyük
@ -1009,11 +1027,18 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Dört kat büy
STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Yazı boyutu
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :Arayüz boyutunu seç
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(otomatik-tespit)
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Yazı iki kat büyük
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Dört kat büyük
STR_GAME_OPTIONS_GRAPHICS :{BLACK}Grafikler
STR_GAME_OPTIONS_REFRESH_RATE :{BLACK}Tazeleme oranını görüntüle
STR_GAME_OPTIONS_REFRESH_RATE_TOOLTIP :{BLACK}Kullanılacak tazeleme oranını seç
STR_GAME_OPTIONS_REFRESH_RATE_OTHER :diğer
STR_GAME_OPTIONS_REFRESH_RATE_ITEM :{NUM}Hz
STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}60Hz'den yüksek tazeleme oranları performansı etkileyebilir.
STR_GAME_OPTIONS_BASE_GRF :{BLACK}Temel grafik kümesi
STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Kullanılacak temel grafik kümesini seçin
@ -1109,6 +1134,8 @@ STR_TERRAIN_TYPE_FLAT :Düz
STR_TERRAIN_TYPE_HILLY :Engebeli
STR_TERRAIN_TYPE_MOUNTAINOUS :Dağlık
STR_TERRAIN_TYPE_ALPINIST :Alp Meraklısı
STR_TERRAIN_TYPE_CUSTOM :Özel yükseklik
STR_TERRAIN_TYPE_CUSTOM_VALUE :Özel yükseklik ({NUM})
STR_CITY_APPROVAL_PERMISSIVE :İzne tabi
STR_CITY_APPROVAL_TOLERANT :Töleranslı
@ -1121,6 +1148,7 @@ STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Ayarlar
STR_CONFIG_SETTING_FILTER_TITLE :{BLACK}Süzgeç metni:
STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Tümünü genişlet
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Tümünü kısalt
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Tüm değerleri sıfırla
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(açıklama bulunmamaktadır)
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Varsayılan değer: {ORANGE}{STRING}
STR_CONFIG_SETTING_TYPE :{LTBLUE}Ayar türü: {ORANGE}{STRING}
@ -1129,6 +1157,8 @@ STR_CONFIG_SETTING_TYPE_GAME_MENU :Kullanıcı aya
STR_CONFIG_SETTING_TYPE_GAME_INGAME :Oyun ayarları (kayıtlı dosyada saklanır; sadece mevcut oyunu etkilemektedir)
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Şirket ayarları (kayıtlı dosyada saklanır; sadece yeni oyunu etkilemektedir)
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Şirket ayarları (kayıtlı dosyada saklanır; sadece mevcut şirketi etkilemektedir)
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_CAPTION :{WHITE}Dikkat!
STR_CONFIG_SETTING_RESET_ALL_CONFIRMATION_DIALOG_TEXT :{WHITE}Bu eylem tüm oyun ayarlarını varsayılan değerlerine sıfırlayacaktır.{}Devam etmek istediğine emin misin?
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Kategori:
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tür:
@ -1190,6 +1220,10 @@ STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Araçları ya d
STR_CONFIG_SETTING_CITY_APPROVAL :Arazi şekillendirmeye karşı belediye meclisinin tavrı: {STRING}
STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Şirketlerin sebep olduğu gürültü ve çevreye zararın kasaba beğenilerini ve ilerideki inşaatlarını nasıl etkileyeceğini seçin
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT :Harita azami yükseklik limiti: {STRING}
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_HELPTEXT :Harita arazisinin azami yüksekliğini ayarlayın. "(otomatik)" ile arazi oluşturulduktan sonra güzel bir değer seçilecektir
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM}
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_AUTO :(otomatik)
STR_CONFIG_SETTING_TOO_HIGH_MOUNTAIN :{WHITE}Azami harita yüksekliğini bu değere ayarlayamazsınız. Haritadaki en az bir dağ bu değerden yüksek
STR_CONFIG_SETTING_AUTOSLOPE :Binaların, yolların vb. altındaki araziyi değiştirmeye izin ver: {STRING}
STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Binaları ve yolları kaldırmaksızın altlarında yeryüzü şekillendirmesi yapılmasına izin ver
@ -1334,7 +1368,13 @@ STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :Oyun boyunca ka
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Petrol rafinerilerinin kenarlardan azami uzaklığı: {STRING}
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Petrol rafinerileri sadece haritanın sınırlarında inşa edilir; ada haritalarında sahillere kurulurlar.
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Kar kalınlığı: {STRING}
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kutupsal arazide, karın ne kadar yükseklikten başlayacağını denetleyin. Kar aynı zamanda fabrika oluşumunu ve şehir gelişme gereksinimini de etkiler
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :Kutupsal arazide, karın ne kadar yükseklikten başlayacağını denetleyin. Kar aynı zamanda fabrika oluşumunu ve şehir gelişme gereksinimini de etkiler. Yalnızca Senerya Editörü ile değiştirilebilir veya "kar örtüsü" üzerinden hesaplanır
STR_CONFIG_SETTING_SNOW_COVERAGE :Kar örtüsü: {STRING}
STR_CONFIG_SETTING_SNOW_COVERAGE_HELPTEXT :Arktik altındaki yaklaşık kar miktarını kontrol eder. Kar, aynı zamanda endüstri üretimini ve kasaba büyüme gereksinimlerini de etkiler. Yalnızca harita oluşumu sırasında kullanılır. Deniz seviyesinin hemen üzerindeki arazi her zaman karsızdır
STR_CONFIG_SETTING_SNOW_COVERAGE_VALUE :%{NUM}
STR_CONFIG_SETTING_DESERT_COVERAGE :Çöl örtüsü: {STRING}
STR_CONFIG_SETTING_DESERT_COVERAGE_HELPTEXT :Tropikal arazideki yaklaşık çöl miktarını kontrol eder. Çöl ayrıca endüstri üretimini de etkiler. Yalnızca harita oluşturma sırasında kullanılır
STR_CONFIG_SETTING_DESERT_COVERAGE_VALUE :%{NUM}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Arazinin engebesi: {STRING}
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(Sadece TerraGenesis) Tepelerin sıklığını seçin: Yumuşak yerleşimler daha az, geniş alana yayılmış tepelere sahiptir. Sıkı yerleşimler tekrarlanmış gibi görülen çok sayıda tepeye sahip olacaklar.
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Dümdüz
@ -1448,6 +1488,11 @@ STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Yapı araçlar
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Köprü, tünel vb. için kullanılan inşa araçlarını kullanımdan sonra da açık tut
STR_CONFIG_SETTING_EXPENSES_LAYOUT :Şirket mali tablosunda grup harcamaları: {STRING}
STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Şirket harcamaları penceresinin nasıl düzenleneceğini belirle
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS :Ray yapımı sırasında sinyalleri otomatik olarak kaldır: {STRING}
STR_CONFIG_SETTING_AUTO_REMOVE_SIGNALS_HELPTEXT :Ray yapımı sırasında sinyaller yolun üzerinde ise otomatik kaldır. Bunun potansiyel olarak tren kazalarına yol açabileceğini unutmayın.
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT :İleri sarma hız limiti: {STRING}
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_HELPTEXT :Hızlı ileri sarma etkinleştirildiğinde oyunun ne kadar hızlı sarıldığını sınırlayın. 0 = sınır yok (bilgisayarın el verdiği kadar). %100'ün altındaki değerler oyunu yavaşlatır. Üst sınır bilgisayarının özelliklerine ve oyuna göre değişkenlik gösterebilir.
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :%{NUM} normal oyun hızı
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_ZERO :Limit yok (bilgisayarın izin verdiği maksimum hızda )
STR_CONFIG_SETTING_SOUND_TICKER :Kayan haber bandı: {STRING}
@ -1562,6 +1607,11 @@ STR_CONFIG_SETTING_ENDING_YEAR :Yıl sonu puan
STR_CONFIG_SETTING_ENDING_YEAR_HELPTEXT :Oyunun puan sonucuna göre bittiği yıl. Bu yılın sonunda, şirketin puanı kaydedilir ve yüksek puan ekranında gösterilir ama oyuncular oynamaya devam edebilir.{}Eğer bu başlama yılından önce ise, yüksek puan ekranı gösterilmez.
STR_CONFIG_SETTING_ENDING_YEAR_VALUE :{NUM}
STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Asla
STR_CONFIG_SETTING_ECONOMY_TYPE :Ekonomi türü: {STRING}
STR_CONFIG_SETTING_ECONOMY_TYPE_HELPTEXT :Sorunsuz ekonomi, üretim değişikliklerini daha sık ve daha küçük adımlarla yapar. Donuk ekonomi, üretim değişikliklerini ve endüstri kapanışlarını durdurur. Sektör türleri bir NewGRF tarafından sağlanırsa bu ayarın hiçbir etkisi olmayabilir.
STR_CONFIG_SETTING_ECONOMY_TYPE_ORIGINAL :Orijinal
STR_CONFIG_SETTING_ECONOMY_TYPE_SMOOTH :Pürüzsüz
STR_CONFIG_SETTING_ECONOMY_TYPE_FROZEN :Donuk
STR_CONFIG_SETTING_ALLOW_SHARES :Diğer şirketlerin hisseleri alınabilsin: {STRING}
STR_CONFIG_SETTING_ALLOW_SHARES_HELPTEXT :Etkinleştirildiğinde, şirketlerin hisse senetlerinin alınıp satılması mümkün olur. Hisse senetleri sadece belli bir yaşa ulaşan şirketler için geçerlidir
STR_CONFIG_SETTING_MIN_YEARS_FOR_SHARES :Hisse satmak için gerekli minimum şirket yaşı: {STRING}
@ -1613,6 +1663,10 @@ STR_CONFIG_SETTING_TOWN_CARGOGENMODE_BITCOUNT :Doğrusal
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Oyunda ağaç dikme: {STRING}
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Oyundaki rastgele ağaçların görünümünü kontrol eder. Bu, ağaçların büyümesine bağımlı olan endüstrileri etkileyebilir, örneğin keresteciler gibi
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_SPREAD :Büyü ama yayılma {RED}(kereste fabrikasını kırar)
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_RAINFOREST :Büyü ama sadece yağmur ormanlarında yayıl
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_SPREAD_ALL :Büyü ve her yere yayıl
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_NO_GROWTH_NO_SPREAD :Büyüme, yayılma {RED}(kereste fabrikasını kırar)
STR_CONFIG_SETTING_TOOLBAR_POS :Ana araç çubuğu konumu: {STRING}
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Ekranın üst kısmındaki ana araç çubuğunun yatay konumu
@ -1630,12 +1684,17 @@ STR_CONFIG_SETTING_ZOOM_MIN :Azami yaklaşma
STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT :Görüş alanları için azami yakınlaşma seviyesi. Daha yüksek uzaklaştırma ayarları oyunda gecikmelere sebep olabilir
STR_CONFIG_SETTING_ZOOM_MAX :Azami uzaklaşma seviyesi: {STRING}
STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT :Görüş alanları için azami uzaklaşma seviyesi. Daha yüksek uzaklaştırma ayarları oyunda gecikmelere sebep olabilir
STR_CONFIG_SETTING_SPRITE_ZOOM_MIN :Kullanılacak en yüksek çözünürlüklü sprite'lar: {STRING}
STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT :Sprite'lar için kullanılacak maksimum çözünürlüğü sınırlar. Sprite çözünürlüğünü sınırlamak, mevcut olunca bile yüksek çözünürlüklü grafikleri kullanmaktan kaçınacaktır. Bu, yüksek çözünürlüklü grafikleri içeren ve içermeyen GRF dosyalarının bir karşımı kullanılırken oyun görünümünü bir arada tutmaya yardımcı olabilir.
STR_CONFIG_SETTING_ZOOM_LVL_MIN :4x
STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :2x
STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal
STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :2x
STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :4x
STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :8x
STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN :4x
STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_IN_2X :2x
STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_NORMAL :1x
STR_CONFIG_SETTING_TOWN_GROWTH :Şehirlerin genişleme hızı: {STRING}
STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Şehir büyüme hızı
STR_CONFIG_SETTING_TOWN_GROWTH_NONE :Hiçbiri
@ -1679,6 +1738,7 @@ STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Kullanıcı ara
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (İngiliz ölçü birimleri) (mph)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrik (km/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (Uluslararası Ölçüm Sistemi) (m/s)
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_GAMEUNITS :Oyun birimleri (karo/gün)
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Araç gücü ölçü birimi: {STRING}
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Kullanıcı arayüzünde bir aracın gücü görüntülendiğinde, bunu seçili ölçü biriminde göster.
@ -1769,6 +1829,8 @@ STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Bellek y
STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}{BYTES} sprite-önbelleği ayırma işlemi başarısız. Sprite-önbelleği {BYTES}'a düşürüldü. Bu OpenTTD'nin performansını azaltacak. Bellek gereksinimini azaltmak için 32bpp grafikleri ve/veya yakınlaştırma seviyelerini kapatmayı deneyebilirsiniz
# Video initalization errors
STR_VIDEO_DRIVER_ERROR :{WHITE}Video ayarlarında hata...
STR_VIDEO_DRIVER_ERROR_NO_HARDWARE_ACCELERATION :{WHITE}... uyumlu GPU bulunamadı. Donanım hızlandırma devre dışı bırakıldı
# Intro window
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
@ -1813,6 +1875,7 @@ STR_INTRO_TRANSLATION :{BLACK}Bu çevi
# Quit window
STR_QUIT_CAPTION :{WHITE}Çıkış
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Oyundan çıkmak istediğinize emin misiniz?
STR_QUIT_YES :{BLACK}Evet
STR_QUIT_NO :{BLACK}Hayır
@ -1824,6 +1887,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Bu sena
# Cheat window
STR_CHEATS :{WHITE}Hileler
STR_CHEATS_TOOLTIP :{BLACK}Onay kutuları bu hilenin daha önce kullanılıp kullanmadığını bildirir.
STR_CHEATS_NOTE :{BLACK}Not: bu ayarların herhangi bir kullanımı kayıt oyunu tarafından kaydedilecektir
STR_CHEAT_MONEY :{LTBLUE}Parayı {CURRENCY_LONG} kadar arttır
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Oynanan şirket: {ORANGE}{COMMA}
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Sihirli buldozer (fabrikaları, silinemeyen nesneleri siler): {ORANGE}{STRING}
@ -1933,6 +1997,8 @@ STR_FACE_TIE :Kravat:
STR_FACE_EARRING :Küpe:
STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Kravatı veya küpeyi değiştir
STR_NETWORK_SERVER_VISIBILITY_PRIVATE :Özel
STR_NETWORK_SERVER_VISIBILITY_PUBLIC :Halka açık
# Network server list
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Çok Oyunculu
@ -1976,6 +2042,10 @@ STR_NETWORK_SERVER_LIST_JOIN_GAME :{BLACK}Oyuna gi
STR_NETWORK_SERVER_LIST_REFRESH :{BLACK}Sunucuyu tazele
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Sunucu bilgisini tazele
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET :{BLACK}İnterneti Ara
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}İnternette halka açık sunucu ara
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN :{BLACK}LAN ara
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_LAN_TOOLTIP :{BLACK}Yerel alan ağında sunucu ara
STR_NETWORK_SERVER_LIST_ADD_SERVER :{BLACK}Sunucu ekle
STR_NETWORK_SERVER_LIST_ADD_SERVER_TOOLTIP :{BLACK}Her zaman çalışan oyunlarına bakabilmek için bir sunucu ekle
STR_NETWORK_SERVER_LIST_START_SERVER :{BLACK}Sunucu başlat
@ -1992,6 +2062,8 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Bu oyun
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Parola koy
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Erişimi kısıtlamak için oyuna parola koy
STR_NETWORK_START_SERVER_VISIBILITY_LABEL :{BLACK}Görünürlük
STR_NETWORK_START_SERVER_VISIBILITY_TOOLTIP :{BLACK}Halka açık listelemede öbür oyuncuların sizin sunucunuzu görüp göremeyeceği
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} istemci
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Azami istemci sayısı:
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}İzin verilen en fazla oyuncu sayısını seç. Her yerin dolması gerekmez
@ -2055,12 +2127,45 @@ STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Sunucu k
STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Şirket korumalı. Parola girin
# Network company list added strings
STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Oyuncu listesi
STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Aktif oyuncular
STR_NETWORK_COMPANY_LIST_SPECTATE :Gözlemle
# Network client list
STR_NETWORK_CLIENT_LIST_CAPTION :{WHITE}Çok Oyunculu
STR_NETWORK_CLIENT_LIST_SERVER :{BLACK}Sunucu
STR_NETWORK_CLIENT_LIST_SERVER_NAME :{BLACK}İsim
STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP :{BLACK}Oynadığın sunucunun adı
STR_NETWORK_CLIENT_LIST_SERVER_NAME_EDIT_TOOLTIP :{BLACK}Sunucunun adını değiştir
STR_NETWORK_CLIENT_LIST_SERVER_NAME_QUERY_CAPTION :Sunucunun adı
STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY :{BLACK}Görünürlük
STR_NETWORK_CLIENT_LIST_SERVER_VISIBILITY_TOOLTIP :{BLACK}Halka açık listelemede öbür oyuncuların sizin sunucunuzu görüp göremeyeceği
STR_NETWORK_CLIENT_LIST_PLAYER :{BLACK}Oyuncu
STR_NETWORK_CLIENT_LIST_PLAYER_NAME :{BLACK}İsim
STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP :{BLACK}İsmin
STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP :{BLACK}İsmini değiştir
STR_NETWORK_CLIENT_LIST_PLAYER_NAME_QUERY_CAPTION :İsmin
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_TOOLTIP :{BLACK}Client için gerçekleştirilecek yönetici eylemleri
STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_TOOLTIP :{BLACK}Şirket için gerçekleştirilecek yönetici eylemleri
STR_NETWORK_CLIENT_LIST_JOIN_TOOLTIP :{BLACK}Bu şirkete katıl
STR_NETWORK_CLIENT_LIST_CHAT_CLIENT_TOOLTIP :{BLACK}Bu oyuncuya bir mesaj gönder
STR_NETWORK_CLIENT_LIST_CHAT_COMPANY_TOOLTIP :{BLACK}Bu şirketteki tüm oyunculara bir mesaj gönder
STR_NETWORK_CLIENT_LIST_CHAT_SPECTATOR_TOOLTIP :{BLACK}Bütün izleyicilere bir mesaj yolla
STR_NETWORK_CLIENT_LIST_SPECTATORS :İzleyiciler
STR_NETWORK_CLIENT_LIST_NEW_COMPANY :(Yeni şirket)
STR_NETWORK_CLIENT_LIST_NEW_COMPANY_TOOLTIP :{BLACK}Yeni bir şirket oluştur ve ona katıl
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP :{BLACK}Bu sensin
STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP :{BLACK}Bu, oyunun ev sahibi
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK :At
STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN :Yasakla
STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET :Sil
STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK :Parola ile kilit açma
STR_NETWORK_CLIENT_LIST_ASK_CAPTION :{WHITE}Yönetici eylemi
STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK :{YELLOW}'{STRING}' adlı oyuncuyu atmak istediğine emin misin?
STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN :{YELLOW}'{STRING}' adlı oyunucuyu yasaklamak istediğine emin misin?
STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET :{YELLOW}'{COMPANY}' şirketini silmek istediğine emin misin?
STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK :{YELLOW}'{COMPANY}' adlı şirketin şifresini sıfırlamak istediğine emin misin?
STR_NETWORK_SERVER :Sunucu
STR_NETWORK_CLIENT :İstemci
@ -2105,6 +2210,7 @@ STR_NETWORK_ERROR_SERVER_START :{WHITE}Sunucu b
STR_NETWORK_ERROR_CLIENT_START :{WHITE}Bağlanamadı
STR_NETWORK_ERROR_TIMEOUT :{WHITE}Bağlantı #{NUM} zaman aşımına uğradı
STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Protokol hatası yapıldı ve bağlantı koparıldı
STR_NETWORK_ERROR_BAD_PLAYER_NAME :{WHITE}İsmin ayarlanmamış. Çok Oyunculu penceresinin üstünden ayarlanabilir
STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}Bu istemcinin revizyonu sunucununki ile aynı değil
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Yanlış parola
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Sunucu dolu
@ -2117,6 +2223,8 @@ STR_NETWORK_ERROR_TIMEOUT_PASSWORD :{WHITE}Şifre g
STR_NETWORK_ERROR_TIMEOUT_COMPUTER :{WHITE}Bilgisayarınız sunucuyla haberleşmeyi sürdürmek için çok yavaş.
STR_NETWORK_ERROR_TIMEOUT_MAP :{WHITE}Bilgisayarınızın haritayı indirmesi çok uzun sürdü
STR_NETWORK_ERROR_TIMEOUT_JOIN :{WHITE}Bilgisayarınızın sunucuya katılması çok uzun sürdü
STR_NETWORK_ERROR_INVALID_CLIENT_NAME :{WHITE}İsminiz geçerli değil
STR_NETWORK_ERROR_SERVER_TOO_OLD :{WHITE}Sorgulanan sunucu bu istemci için çok eski
############ Leave those lines in this order!!
STR_NETWORK_ERROR_CLIENT_GENERAL :genel hata
@ -2139,6 +2247,7 @@ STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD :şifre zamanın
STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :genel zamanaşımı
STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :haritayı indirmek çok uzun sürdü
STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :haritayı işlemek çok uzun sürdü
STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME :Geçersiz ev sahibi ismi
############ End of leave-in-this-order
STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}Olası bağlantı kaybı
@ -2152,11 +2261,13 @@ STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 :Oyun hala durak
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_2 :Oyun hala duraklıyor ({STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_3 :Oyun hala duraklıyor ({STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_4 :Oyun hala duraklatılmış ({STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_5 :Oyun hala duraklatıldı ({STRING}, {STRING}, {STRING}, {STRING}, {STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED :Oyun devam ediyor ({STRING})
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :oyuncu sayısı
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS :istemcilere bağlanıyor
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :el ile
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_GAME_SCRIPT :oyun betiği
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_LINK_GRAPH :bağlantı grafiğinin güncellenmesi bekleniyor
############ End of leave-in-this-order
STR_NETWORK_MESSAGE_CLIENT_LEAVING :ayrılıyor
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} oyuna katıldı
@ -2166,6 +2277,7 @@ STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE :*** {STRING} g
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} yeni bir şirket kurdu (#{2:NUM})
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} oyunu terketti ({2:STRING})
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} adını {STRING} olarak değiştirdi
STR_NETWORK_MESSAGE_GIVE_MONEY :*** {STRING} {1:STRING} adlı şirkete {2:CURRENCY_LONG} verdi
STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}Sunucu kapandı
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Sunucu baştan başlatılıyor...{}Lütfen bekleyin...
STR_NETWORK_MESSAGE_KICKED :*** {STRING} atıldı. Sebep: ({STRING})
@ -2243,6 +2355,9 @@ STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD
STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Evet, grafikleri indir
STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Hayır, OpenTTD'den çık
STR_MISSING_GRAPHICS_ERROR_TITLE :{WHITE}İndirme başarısız
STR_MISSING_GRAPHICS_ERROR :{BLACK}Grafikleri indirme başarısız.{}Lütfen grafikleri manuel olarak indirin.
STR_MISSING_GRAPHICS_ERROR_QUIT :{BLACK}OpenTTD'den Çık
# Transparency settings window
STR_TRANSPARENCY_CAPTION :{WHITE}Şeffaflık Seçenekleri
@ -2286,6 +2401,7 @@ STR_JOIN_WAYPOINT_CAPTION :{WHITE}Yerimini
STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Ayrı bir yerimi yap
# Generic toolbar
STR_TOOLBAR_DISABLED_NO_VEHICLE_AVAILABLE :{BLACK}Şu anda bu altyapı için hiçbir araç bulunmadığından devre dışı bırakıldı
# Rail construction toolbar
STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Demiryolu Yapımı
@ -2421,7 +2537,7 @@ STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}İskele
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Yerimi olarak kullanilabilecek bir şamandıra yerlestir. Shift ile tıklama maliyet tahminini gösterir
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Su kemeri yap. Shift ile tıklama maliyet tahminini gösterir
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Su alanını belirle.{}Deniz seviyesinde CTRL tuşu basılı olmadığı sürece kanal yapar, basılıysa etraftakileri su altında bırakır
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Nehir yerleştir
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Nehir yerleştir. Ctrl tuşu alanı çapraz olarak seçer
# Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Tersane Yönü
@ -2481,6 +2597,12 @@ STR_TREES_RANDOM_TYPE :{BLACK}Rastgele
STR_TREES_RANDOM_TYPE_TOOLTIP :{BLACK}Rastgele türde ağaçlar koy. Shift ile ağaç koyma/maliyet gösterme tercihi yapılır
STR_TREES_RANDOM_TREES_BUTTON :{BLACK}Rastgele Ağaç
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Haritaya rastgele ağaç dik
STR_TREES_MODE_NORMAL_BUTTON :{BLACK}Normal
STR_TREES_MODE_NORMAL_TOOLTIP :{BLACK}Arazinin üzerine sürükleyerek tekli ağaçlar dikin.
STR_TREES_MODE_FOREST_SM_BUTTON :{BLACK}Koru
STR_TREES_MODE_FOREST_SM_TOOLTIP :{BLACK}Arazinin üzerine sürükleyerek küçük ormanlar dikin.
STR_TREES_MODE_FOREST_LG_BUTTON :{BLACK}Orman
STR_TREES_MODE_FOREST_LG_TOOLTIP :{BLACK}Arazinin üzerine sürükleyerek büyük ormanlar dikin.
# Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Arazi Yapımı
@ -2531,12 +2653,18 @@ STR_FOUND_TOWN_SELECT_LAYOUT_RANDOM :{BLACK}Rastgele
# Fund new industry window
STR_FUND_INDUSTRY_CAPTION :{WHITE}Yeni fabrika aç
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Bu listeden uygun fabrikayı seçin
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :Birçok rastgele fabrika
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES :{BLACK}Rastgele endüstriler oluştur
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP :{BLACK}Haritayı rastgele fabrikalarla doldur
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_CAPTION :{WHITE}Rastgele endüstriler oluştur
STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_QUERY :{YELLOW}Birçok sayıda rastgele endüstri oluşturmak istediğinize emin misiniz?
STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST :{BLACK}Fiyat: {YELLOW}{CURRENCY_LONG}
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Tetkik arama
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}İnşa et
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Parayla Yap
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Bütün endüstrileri kaldır
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_TOOLTIP :{BLACK}Şu anda haritada bulunan tüm endüstrileri kaldır
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_CAPTION :{WHITE}Bütün endüstrileri kaldır
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES_QUERY :{YELLOW}Bütün endüstrileri kaldırmak istediğinize emin misiniz?
# Industry cargoes window
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}{STRING} fabrikası için sanayi zinciri
@ -2557,6 +2685,7 @@ STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP :{BLACK}Gösterm
# Land area window
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Arazi Bilgisi
STR_LAND_AREA_INFORMATION_LOCATION_TOOLTIP :{BLACK}Ana görünümü karonun konumuna ortalar. Ctrl+Sol Tık karonun konumunu gösteren yeni bir pencere açar
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR_N_A :{BLACK}Temizleme fiyatı: {LTBLUE}Yok
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Temizleme fiyatı: {RED}{CURRENCY_LONG}
STR_LAND_AREA_INFORMATION_REVENUE_WHEN_CLEARED :{BLACK}Kaldırıldığında kazanılacak: {LTBLUE}{CURRENCY_LONG}
@ -2766,6 +2895,8 @@ STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF:
STR_SAVELOAD_FILTER_TITLE :{BLACK}Süzgeç dizgesi:
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Dosya Üzerine Yaz
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Mevcut dosyanın üzerine yazmak istediğinizden emin misiniz?
STR_SAVELOAD_DIRECTORY :{STRING} (Dizin)
STR_SAVELOAD_PARENT_DIRECTORY :{STRING} (Ana dizin)
STR_SAVELOAD_OSKTITLE :{BLACK}Kayıtlı oyun için bir isim girin
@ -2777,6 +2908,17 @@ STR_MAPGEN_BY :{BLACK}*
STR_MAPGEN_NUMBER_OF_TOWNS :{BLACK}Şehir sayısı:
STR_MAPGEN_DATE :{BLACK}Tarih:
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Fabrika sayısı:
STR_MAPGEN_HEIGHTMAP_HEIGHT :{BLACK}En yüksek tepe:
STR_MAPGEN_HEIGHTMAP_HEIGHT_UP :{BLACK}Haritadaki en yüksek tepenin azami yüksekliğini 1 arttırın
STR_MAPGEN_HEIGHTMAP_HEIGHT_DOWN :{BLACK}Haritadaki en yüksek tepenin azami yüksekliğini 1 düşürün
STR_MAPGEN_SNOW_COVERAGE :{BLACK}Kar örtüsü:
STR_MAPGEN_SNOW_COVERAGE_UP :{BLACK}Kar örtüsünü yüzde on arttır
STR_MAPGEN_SNOW_COVERAGE_DOWN :{BLACK}Kar örtüsünü yüzde on azalt
STR_MAPGEN_SNOW_COVERAGE_TEXT :{BLACK}%{NUM}
STR_MAPGEN_DESERT_COVERAGE :{BLACK}Çöl örtüsü:
STR_MAPGEN_DESERT_COVERAGE_UP :{BLACK}Çöl örtüsünü yüzde on arttır
STR_MAPGEN_DESERT_COVERAGE_DOWN :{BLACK}Çöl örtüsünü yüzde on azalt
STR_MAPGEN_DESERT_COVERAGE_TEXT :{BLACK}%{NUM}
STR_MAPGEN_SNOW_LINE_HEIGHT :{BLACK}Kar yüksekliği:
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Kar yüksekliğini bir arttır
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Kar yüksekliğini bir azalt
@ -2805,6 +2947,10 @@ STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Yüksekl
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Boyut:
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
STR_MAPGEN_TERRAIN_TYPE_QUERY_CAPT :{WHITE}Hedef zirve yüksekliği
STR_MAPGEN_HEIGHTMAP_HEIGHT_QUERY_CAPT :{WHITE}En yüksek tepe
STR_MAPGEN_SNOW_COVERAGE_QUERY_CAPT :{WHITE}Kar örtüsü (% olarak)
STR_MAPGEN_DESERT_COVERAGE_QUERY_CAPT :{WHITE}Çöl örtüsü (% olarak)
STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Kar yüksekliğini değiştir
STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Başlangıç yılını değiştir
@ -2945,6 +3091,7 @@ STR_NEWGRF_ERROR_MSG_WARNING :{RED}Uyarı: {S
STR_NEWGRF_ERROR_MSG_ERROR :{RED}Hata: {SILVER}{STRING}
STR_NEWGRF_ERROR_MSG_FATAL :{RED}Ölümcül hata: {SILVER}{STRING}
STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Ölümcül bir NewGRF hatası oluştu:{}{STRING}
STR_NEWGRF_ERROR_POPUP :{WHITE}NewGRF hatası oluştu:{}{STRING}
STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} OpenTTD tarafından belirtilen TTDPatch sürümüyle çalışmayacaktır
STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING}, TTD'nin {STRING} sürümü içindir
STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING}, {STRING} ile kullanılmak için tasarlanmıştır
@ -3022,6 +3169,7 @@ STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Tabela a
# Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Tabelayı değiştir
STR_EDIT_SIGN_LOCATION_TOOLTIP :{BLACK}Ana görünümü işaretin konumuna ortalar. Ctrl+Sol Tık ile işaretin konumunda yeni bir pencere açar
STR_EDIT_SIGN_NEXT_SIGN_TOOLTIP :{BLACK}Sonraki tabelaya git
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Önceki tabelaya git
@ -3082,20 +3230,23 @@ STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Yeni binalar ya
STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Ayrıcalıklı nakliyat haklarını satın al
STR_LOCAL_AUTHORITY_ACTION_BRIBE :Belediyeye rüşvet ver
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW} Müsteri çekmek için duvarlara poster yapıştır.{} Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW} Müsteri çekmek için radyoya reklam ver.{} Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW} Müsteri çekmek için televizyona reklam ver.{} Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW} Yol tamirleri için belediyeye bağış yap. 6 ay boyunca şehrin yolları kullanılamaz.{} Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Şirket sahibinin heykelini dik.{}Fiyatı: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Şehirde ticari binaların yapımı için bağış yap.{}Fiyatı: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW} Bir yıllık ayrıcalıklı nakliyat haklarını satın al. Belediye şehirde sadece senin şirketine yolcu ve kargo taşıma izni verir.{} Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_SMALL_ADVERTISING :{YELLOW} Müsteri çekmek için duvarlara poster yapıştır.{}Şehir merkezinin etrafında küçük bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_MEDIUM_ADVERTISING :{YELLOW} Müsteri çekmek için radyoya reklam ver.{}Şehir merkezinin etrafında orta bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_LARGE_ADVERTISING :{YELLOW} Müsteri çekmek için televizyona reklam ver.{}Şehir merkezinin etrafında büyük bir çapta istasyon derecelendirmesinde geçici bir yükseltme sağlar.{}Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_ROAD_RECONSTRUCTION :{YELLOW} Yol tamirleri için belediyeye bağış yap.{}6 ay boyunca şehrin yolları kullanılamaz.{}Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_STATUE_OF_COMPANY :{YELLOW}Şirket sahibinin heykelini dik.{}Şehirdeki istasyon derecelendirmesinde kalıcı bir yükseltme sağlar.{}Fiyatı: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_NEW_BUILDINGS :{YELLOW}Şehirde ticari binaların yapımı için bağış yap.{}Bu kasabanın büyümesine geçici bir yükseltme sağlar.{}Fiyatı: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW} Bir yıllık ayrıcalıklı nakliyat haklarını satın al.{} Belediye, rakip istasyonların yolcu ve kargo taşımasına izin vermez.{} Fiyat: {CURRENCY_LONG}
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Yakalanma riskini göze alarak belediyeye rüşvet ver.{}Fiyat: {CURRENCY_LONG}
# Goal window
STR_GOALS_CAPTION :{WHITE}{COMPANY} Hedefler
STR_GOALS_SPECTATOR_CAPTION :{WHITE}Evrensel Amaçlar
STR_GOALS_SPECTATOR :Evrensel Amaçlar
STR_GOALS_GLOBAL_BUTTON :{BLACK}Küresel
STR_GOALS_GLOBAL_BUTTON_HELPTEXT :{BLACK}Evrensel amaçları göster
STR_GOALS_COMPANY_BUTTON :{BLACK}Şirket
STR_GOALS_COMPANY_BUTTON_HELPTEXT :{BLACK}Şirket hedeflerini göster
STR_GOALS_TEXT :{ORANGE}{STRING}
STR_GOALS_NONE :{ORANGE}- Hiçbiri -
STR_GOALS_PROGRESS :{ORANGE}{STRING}
@ -3103,10 +3254,10 @@ STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Ana görünümü istenen fabrika/kasaba/kareye getirmek için hedefe tıklayın. Ctrl+Tıklama fabrika/kasaba/kare konumunda yeni bir pencerede görünüm açar
# Goal question window
STR_GOAL_QUESTION_CAPTION_QUESTION :Soru
STR_GOAL_QUESTION_CAPTION_INFORMATION :Bilgi
STR_GOAL_QUESTION_CAPTION_WARNING :Uyarı
STR_GOAL_QUESTION_CAPTION_ERROR :Hata
STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Soru
STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Bilgi
STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Uyarı
STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Hata
############ Start of Goal Question button list
STR_GOAL_QUESTION_BUTTON_CANCEL :İptal
@ -3297,6 +3448,7 @@ STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Şirket
STR_COMPANY_VIEW_INFRASTRUCTURE_BUTTON :{BLACK}Ayrıntılar
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ayrıntılı altyapı sayılarını göster
STR_COMPANY_VIEW_GIVE_MONEY_BUTTON :{BLACK}Para ver
STR_COMPANY_VIEW_GIVE_MONEY_TOOLTIP :{BLACK}Bu şirkete para ver
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Yeni Surat
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Müdür için yeni surat seç
@ -3314,7 +3466,7 @@ STR_COMPANY_VIEW_SELL_SHARE_TOOLTIP :{BLACK}Şirketi
STR_COMPANY_VIEW_COMPANY_NAME_QUERY_CAPTION :Şirketin ismi
STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Yöneticinin ismi
STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Vermek istediğiniz para miktarını girin
STR_COMPANY_VIEW_GIVE_MONEY_QUERY_CAPTION :Vermek istediğin para miktarını gir
STR_BUY_COMPANY_MESSAGE :{WHITE}Şirketimizi satın alacak birilerini arıyoruz.{}{} {COMPANY} şirketini şu fiyata almak ister misiniz: {CURRENCY_LONG}?
@ -3469,6 +3621,7 @@ STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Güç Ve
STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Dönüştürülebildiği kargolar: {GOLD}{STRING}
STR_PURCHASE_INFO_ALL_TYPES :Tüm kargo türleri
STR_PURCHASE_INFO_NONE :Hiçbiri
STR_PURCHASE_INFO_ENGINES_ONLY :Yalnızca lokomotifler
STR_PURCHASE_INFO_ALL_BUT :Şunlar hariç tümü: {CARGO_LIST}
STR_PURCHASE_INFO_MAX_TE :{BLACK}Aza. Çekim Gücü: {GOLD}{FORCE}
STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Menzil: {GOLD}{COMMA} kare
@ -3675,6 +3828,10 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Otomatik
# Vehicle view
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
STR_VEHICLE_VIEW_TRAIN_CENTER_TOOLTIP :{BLACK}Ana görünümü trenin konumuna ortalar. Çift tık ana görünümdeki treni takip eder. Ctrl+Sol Tık trenin konumunu gösteren yeni bir pencere açar
STR_VEHICLE_VIEW_ROAD_VEHICLE_CENTER_TOOLTIP :{BLACK}Ana görünümü aracın konumuna ortalayın. Çift tık ana görünümdeki aracı takip eder. Ctrl+Sol Tık uçağın konumunda yeni bir görünüm penceresi açar
STR_VEHICLE_VIEW_SHIP_CENTER_TOOLTIP :{BLACK}Ana görünümü geminin konumuna ortalar. Çift tık ana görünümdeki gemiyi takip eder. Ctrl+Sol Tık geminin konumunu gösteren yeni bir pencere açar
STR_VEHICLE_VIEW_AIRCRAFT_CENTER_TOOLTIP :{BLACK}Ana görünümü uçağın konumuna ortalayın. Çift tık ana görünümdeki uçağı takip eder. Ctrl+Sol Tık uçağın konumunda yeni bir görünüm penceresi açar
STR_VEHICLE_VIEW_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Treni garaja gönder
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Aracı garaja gönder
@ -3706,7 +3863,12 @@ STR_VEHICLE_VIEW_ROAD_VEHICLE_SHOW_DETAILS_TOOLTIP :{BLACK}Karayolu
STR_VEHICLE_VIEW_SHIP_SHOW_DETAILS_TOOLTIP :{BLACK}Gemi ayrıntılarını göster
STR_VEHICLE_VIEW_AIRCRAFT_SHOW_DETAILS_TOOLTIP :{BLACK}Uçak ayrıntılarını göster
STR_VEHICLE_VIEW_TRAIN_STATUS_START_STOP_TOOLTIP :{BLACK}Şu anki tren eylemi - treni durdurup/başlatmak için tıkla
STR_VEHICLE_VIEW_ROAD_VEHICLE_STATUS_START_STOP_TOOLTIP :{BLACK}Şu anki araç eylemi - aracı durdurup/başlatmak için tıkla
STR_VEHICLE_VIEW_SHIP_STATE_STATUS_STOP_TOOLTIP :{BLACK}Şu anki gemi eylemi - gemiyi durdurup/başlatmak için tıkla
STR_VEHICLE_VIEW_AIRCRAFT_STATUS_START_STOP_TOOLTIP :{BLACK}Şu anki uçak eylemi - uçağı durdurup/başlatmak için tıkla
STR_VEHICLE_VIEW_ORDER_LOCATION_TOOLTIP :{BLACK}Ana görünümü talimatın konumuna ortalar. Ctrl+Sol Tık ile talimatın konumunda yeni bir pencere açar
# Messages in the start stop button in the vehicle view
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Yükleme / Boşaltma
@ -3934,6 +4096,7 @@ STR_ORDER_REFIT_STOP_ORDER :(Kargo türün
STR_ORDER_STOP_ORDER :(Dur)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_GO_TO_STATION_CAN_T_USE_STATION :{PUSH_COLOUR}{RED}(İstasyon kullanılamıyor){POP_COLOUR} {STRING} {STATION} {STRING}
STR_ORDER_IMPLICIT :(Otomatik)
@ -4206,6 +4369,7 @@ STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Yalnız
STR_WARNING_SCREENSHOT_SIZE_CAPTION :{WHITE}Dev ekran görüntüsü
STR_WARNING_SCREENSHOT_SIZE_MESSAGE :{YELLOW}Ekran görüntüsünün çözünürlüğü {COMMA} x {COMMA} piksel. Görüntüyü kaydetmek biraz zaman alabilir. Devam etmek istiyor musunuz?
STR_MESSAGE_HEIGHTMAP_SUCCESSFULLY :{WHITE}Yükseklik haritası başarıyla '{STRING}' olarak kaydedildi. En yüksek tepe: {NUM}
STR_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Ekran görüntüsü '{STRING}' olarak kaydedildi
STR_ERROR_SCREENSHOT_FAILED :{WHITE}Ekran görüntüsü alınamadı!
@ -4259,6 +4423,7 @@ STR_ERROR_LOAN_ALREADY_REPAYED :{WHITE}... öde
STR_ERROR_CURRENCY_REQUIRED :{WHITE}... {CURRENCY_LONG} gerekli
STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Kredi ödenemiyor...
STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Bankadan borç alınan para verilemez...
STR_ERROR_CAN_T_GIVE_MONEY :{WHITE}Bu şirkete para veremezsin...
STR_ERROR_CAN_T_BUY_COMPANY :{WHITE}Şirket satın alınamaz...
STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Şirket binasi yapılamaz...
STR_ERROR_CAN_T_BUY_25_SHARE_IN_THIS :{WHITE}Şirketin %25'i alınamıyor...
@ -4385,6 +4550,8 @@ STR_ERROR_DEPOT_WRONG_DEPOT_TYPE :Yanlış gar t
STR_ERROR_TRAIN_TOO_LONG_AFTER_REPLACEMENT :{WHITE}{VEHICLE} değiştirmeden sonra çok uzun oldu
STR_ERROR_AUTOREPLACE_NOTHING_TO_DO :{WHITE}Hiçbir otomatik değiştirme/yenileme kuralı uygulanmadı
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(para yetmedi)
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_CARGO :{WHITE}Yeni araçlar bunu taşıyamıyor {STRING}
STR_ERROR_AUTOREPLACE_INCOMPATIBLE_REFIT :{WHITE}{NUM} numaralı talimattaki yeni araç yenilenemez.
# Rail construction errors
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}İmkansiz ray birleşimi
@ -4681,10 +4848,10 @@ STR_INDUSTRY_NAME_SUGAR_MINE :Şeker Madeni
##id 0x6000
STR_SV_EMPTY :
STR_SV_UNNAMED :İsimsiz
STR_SV_TRAIN_NAME :Tren {COMMA}
STR_SV_ROAD_VEHICLE_NAME :Karayolu Aracı {COMMA}
STR_SV_SHIP_NAME :Gemi {COMMA}
STR_SV_AIRCRAFT_NAME :Uçak {COMMA}
STR_SV_TRAIN_NAME :Tren #{COMMA}
STR_SV_ROAD_VEHICLE_NAME :Karayolu Aracı #{COMMA}
STR_SV_SHIP_NAME :Gemi #{COMMA}
STR_SV_AIRCRAFT_NAME :Uçak #{COMMA}
STR_SV_STNAME :{STRING}
STR_SV_STNAME_NORTH :{STRING} Kuzey
@ -4986,6 +5153,7 @@ STR_FORMAT_BUOY_NAME :{TOWN} Şamand
STR_FORMAT_BUOY_NAME_SERIAL :{TOWN} Şamandırası #{COMMA}
STR_FORMAT_COMPANY_NUM :(Company {COMMA})
STR_FORMAT_GROUP_NAME :Grup {COMMA}
STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA}
STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING.tamlanan}
STR_FORMAT_WAYPOINT_NAME :Yerimi {TOWN}
STR_FORMAT_WAYPOINT_NAME_SERIAL :Yerimi {TOWN} #{COMMA}

@ -14,8 +14,6 @@
#include "../../safeguards.h"
static const int DEFAULT_CONNECT_TIMEOUT_SECONDS = 3; ///< Allow connect() three seconds to connect.
/**
* Get the hostname; in case it wasn't given the
* IPv4 dotted representation is given.
@ -316,82 +314,6 @@ SOCKET NetworkAddress::Resolve(int family, int socktype, int flags, SocketList *
return sock;
}
/**
* Helper function to resolve a connected socket.
* @param runp information about the socket to try not
* @return the opened socket or INVALID_SOCKET
*/
static SOCKET ConnectLoopProc(addrinfo *runp)
{
const char *type = NetworkAddress::SocketTypeAsString(runp->ai_socktype);
const char *family = NetworkAddress::AddressFamilyAsString(runp->ai_family);
std::string address = NetworkAddress(runp->ai_addr, (int)runp->ai_addrlen).GetAddressAsString();
SOCKET sock = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol);
if (sock == INVALID_SOCKET) {
DEBUG(net, 1, "[%s] could not create %s socket: %s", type, family, NetworkError::GetLast().AsString());
return INVALID_SOCKET;
}
if (!SetNoDelay(sock)) DEBUG(net, 1, "[%s] setting TCP_NODELAY failed", type);
if (!SetNonBlocking(sock)) DEBUG(net, 0, "[%s] setting non-blocking mode failed", type);
int err = connect(sock, runp->ai_addr, (int)runp->ai_addrlen);
if (err != 0 && !NetworkError::GetLast().IsConnectInProgress()) {
DEBUG(net, 1, "[%s] could not connect to %s over %s: %s", type, address.c_str(), family, NetworkError::GetLast().AsString());
closesocket(sock);
return INVALID_SOCKET;
}
fd_set write_fd;
struct timeval tv;
FD_ZERO(&write_fd);
FD_SET(sock, &write_fd);
/* Wait for connect() to either connect, timeout or fail. */
tv.tv_usec = 0;
tv.tv_sec = DEFAULT_CONNECT_TIMEOUT_SECONDS;
int n = select(FD_SETSIZE, NULL, &write_fd, NULL, &tv);
if (n < 0) {
DEBUG(net, 1, "[%s] could not connect to %s: %s", type, address.c_str(), NetworkError::GetLast().AsString());
closesocket(sock);
return INVALID_SOCKET;
}
/* If no fd is selected, the timeout has been reached. */
if (n == 0) {
DEBUG(net, 1, "[%s] timed out while connecting to %s", type, address.c_str());
closesocket(sock);
return INVALID_SOCKET;
}
/* Retrieve last error, if any, on the socket. */
NetworkError socket_error = GetSocketError(sock);
if (socket_error.HasError()) {
DEBUG(net, 1, "[%s] could not connect to %s: %s", type, address.c_str(), socket_error.AsString());
closesocket(sock);
return INVALID_SOCKET;
}
/* Connection succeeded. */
DEBUG(net, 1, "[%s] connected to %s", type, address.c_str());
return sock;
}
/**
* Connect to the given address.
* @return the connected socket or INVALID_SOCKET.
*/
SOCKET NetworkAddress::Connect()
{
DEBUG(net, 1, "Connecting to %s", NetworkAddressDumper().GetAddressAsString(this));
return this->Resolve(AF_UNSPEC, SOCK_STREAM, AI_ADDRCONFIG, nullptr, ConnectLoopProc);
}
/**
* Helper function to resolve a listening.
* @param runp information about the socket to try not
@ -399,49 +321,52 @@ SOCKET NetworkAddress::Connect()
*/
static SOCKET ListenLoopProc(addrinfo *runp)
{
const char *type = NetworkAddress::SocketTypeAsString(runp->ai_socktype);
const char *family = NetworkAddress::AddressFamilyAsString(runp->ai_family);
std::string address = NetworkAddress(runp->ai_addr, (int)runp->ai_addrlen).GetAddressAsString();
SOCKET sock = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol);
if (sock == INVALID_SOCKET) {
DEBUG(net, 0, "[%s] could not create %s socket on port %s: %s", type, family, address.c_str(), NetworkError::GetLast().AsString());
const char *type = NetworkAddress::SocketTypeAsString(runp->ai_socktype);
const char *family = NetworkAddress::AddressFamilyAsString(runp->ai_family);
DEBUG(net, 0, "Could not create %s %s socket: %s", type, family, NetworkError::GetLast().AsString());
return INVALID_SOCKET;
}
if (runp->ai_socktype == SOCK_STREAM && !SetNoDelay(sock)) {
DEBUG(net, 3, "[%s] setting TCP_NODELAY failed for port %s", type, address.c_str());
DEBUG(net, 1, "Setting no-delay mode failed: %s", NetworkError::GetLast().AsString());
}
int on = 1;
/* The (const char*) cast is needed for windows!! */
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) == -1) {
DEBUG(net, 3, "[%s] could not set reusable %s sockets for port %s: %s", type, family, address.c_str(), NetworkError::GetLast().AsString());
DEBUG(net, 0, "Setting reuse-address mode failed: %s", NetworkError::GetLast().AsString());
}
#ifndef __OS2__
if (runp->ai_family == AF_INET6 &&
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&on, sizeof(on)) == -1) {
DEBUG(net, 3, "[%s] could not disable IPv4 over IPv6 on port %s: %s", type, address.c_str(), NetworkError::GetLast().AsString());
DEBUG(net, 3, "Could not disable IPv4 over IPv6: %s", NetworkError::GetLast().AsString());
}
#endif
if (bind(sock, runp->ai_addr, (int)runp->ai_addrlen) != 0) {
DEBUG(net, 1, "[%s] could not bind on %s port %s: %s", type, family, address.c_str(), NetworkError::GetLast().AsString());
DEBUG(net, 0, "Could not bind socket on %s: %s", address.c_str(), NetworkError::GetLast().AsString());
closesocket(sock);
return INVALID_SOCKET;
}
if (runp->ai_socktype != SOCK_DGRAM && listen(sock, 1) != 0) {
DEBUG(net, 1, "[%s] could not listen at %s port %s: %s", type, family, address.c_str(), NetworkError::GetLast().AsString());
DEBUG(net, 0, "Could not listen on socket: %s", NetworkError::GetLast().AsString());
closesocket(sock);
return INVALID_SOCKET;
}
/* Connection succeeded */
if (!SetNonBlocking(sock)) DEBUG(net, 0, "[%s] setting non-blocking mode failed for %s port %s", type, family, address.c_str());
DEBUG(net, 1, "[%s] listening on %s port %s", type, family, address.c_str());
if (!SetNonBlocking(sock)) {
DEBUG(net, 0, "Setting non-blocking mode failed: %s", NetworkError::GetLast().AsString());
}
DEBUG(net, 3, "Listening on %s", address.c_str());
return sock;
}
@ -496,3 +421,16 @@ void NetworkAddress::Listen(int socktype, SocketList *sockets)
default: return "unsupported";
}
}
/**
* Get the peer name of a socket in string format.
* @param sock The socket to get the peer name of.
* @return The string representation of the peer name.
*/
/* static */ const std::string NetworkAddress::GetPeerName(SOCKET sock)
{
sockaddr_storage addr;
socklen_t addr_len = sizeof(addr);
getpeername(sock, (sockaddr *)&addr, &addr_len);
return NetworkAddress(addr, addr_len).GetAddressAsString();
}

@ -171,11 +171,11 @@ public:
return this->CompareTo(address) < 0;
}
SOCKET Connect();
void Listen(int socktype, SocketList *sockets);
static const char *SocketTypeAsString(int socktype);
static const char *AddressFamilyAsString(int family);
static const std::string GetPeerName(SOCKET sock);
};
/**

@ -27,9 +27,9 @@ bool NetworkCoreInitialize()
#ifdef _WIN32
{
WSADATA wsa;
DEBUG(net, 3, "[core] loading windows socket library");
DEBUG(net, 5, "Loading windows socket library");
if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) {
DEBUG(net, 0, "[core] WSAStartup failed, network unavailable");
DEBUG(net, 0, "WSAStartup failed, network unavailable");
return false;
}
}

@ -20,16 +20,17 @@ void NetworkCoreShutdown();
/** Status of a network client; reasons why a client has quit */
enum NetworkRecvStatus {
NETWORK_RECV_STATUS_OKAY, ///< Everything is okay
NETWORK_RECV_STATUS_DESYNC, ///< A desync did occur
NETWORK_RECV_STATUS_NEWGRF_MISMATCH, ///< We did not have the required NewGRFs
NETWORK_RECV_STATUS_SAVEGAME, ///< Something went wrong (down)loading the savegame
NETWORK_RECV_STATUS_CONN_LOST, ///< The connection is 'just' lost
NETWORK_RECV_STATUS_MALFORMED_PACKET, ///< We apparently send a malformed packet
NETWORK_RECV_STATUS_SERVER_ERROR, ///< The server told us we made an error
NETWORK_RECV_STATUS_SERVER_FULL, ///< The server is full
NETWORK_RECV_STATUS_SERVER_BANNED, ///< The server has banned us
NETWORK_RECV_STATUS_CLOSE_QUERY, ///< Done querying the server
NETWORK_RECV_STATUS_OKAY, ///< Everything is okay.
NETWORK_RECV_STATUS_DESYNC, ///< A desync did occur.
NETWORK_RECV_STATUS_NEWGRF_MISMATCH, ///< We did not have the required NewGRFs.
NETWORK_RECV_STATUS_SAVEGAME, ///< Something went wrong (down)loading the savegame.
NETWORK_RECV_STATUS_CLIENT_QUIT, ///< The connection is lost gracefully. Other clients are already informed of this leaving client.
NETWORK_RECV_STATUS_MALFORMED_PACKET, ///< We apparently send a malformed packet.
NETWORK_RECV_STATUS_SERVER_ERROR, ///< The server told us we made an error.
NETWORK_RECV_STATUS_SERVER_FULL, ///< The server is full.
NETWORK_RECV_STATUS_SERVER_BANNED, ///< The server has banned us.
NETWORK_RECV_STATUS_CLOSE_QUERY, ///< Done querying the server.
NETWORK_RECV_STATUS_CONNECTION_LOST, ///< The connection is lost unexpectedly.
};
/** Forward declaration due to circular dependencies */
@ -45,10 +46,7 @@ public:
NetworkSocketHandler() { this->has_quit = false; }
/** Close the socket when destructing the socket handler */
virtual ~NetworkSocketHandler() { this->Close(); }
/** Really close the socket */
virtual void Close() {}
virtual ~NetworkSocketHandler() {}
/**
* Close the current connection; for TCP this will be mostly equivalent

@ -52,7 +52,7 @@ const char *GetNetworkRevisionString()
/* Tag names are not mangled further. */
if (_openttd_revision_tagged) {
DEBUG(net, 1, "Network revision name is '%s'", network_revision);
DEBUG(net, 3, "Network revision name: %s", network_revision);
return network_revision;
}
@ -72,7 +72,7 @@ const char *GetNetworkRevisionString()
/* Replace the git hash in revision string. */
strecpy(network_revision + hashofs, githash_suffix, network_revision + NETWORK_REVISION_LENGTH);
assert(strlen(network_revision) < NETWORK_REVISION_LENGTH); // strlen does not include terminator, constant does, hence strictly less than
DEBUG(net, 1, "Network revision name is '%s'", network_revision);
DEBUG(net, 3, "Network revision name: %s", network_revision);
}
return network_revision;

@ -39,14 +39,14 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // BE
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0) {
DEBUG(net, 0, "[core] error creating socket");
DEBUG(net, 0, "Could not create socket: %s", NetworkError::GetLast().AsString());
return;
}
char *output_pointer = nullptr;
int output_length = _netstat(sock, &output_pointer, 1);
if (output_length < 0) {
DEBUG(net, 0, "[core] error running _netstat");
DEBUG(net, 0, "Error running _netstat()");
return;
}
@ -205,6 +205,6 @@ void NetworkFindBroadcastIPs(NetworkAddressList *broadcast)
int i = 0;
for (NetworkAddress &addr : *broadcast) {
addr.SetPort(NETWORK_DEFAULT_PORT);
DEBUG(net, 3, "%d) %s", i++, addr.GetHostname());
DEBUG(net, 3, " %d) %s", i++, addr.GetHostname());
}
}

@ -28,7 +28,8 @@ NetworkTCPSocketHandler::NetworkTCPSocketHandler(SOCKET s) :
NetworkTCPSocketHandler::~NetworkTCPSocketHandler()
{
this->CloseConnection();
/* Virtual functions get called statically in destructors, so make it explicit to remove any confusion. */
this->NetworkTCPSocketHandler::CloseConnection();
if (this->sock != INVALID_SOCKET) closesocket(this->sock);
this->sock = INVALID_SOCKET;
@ -118,7 +119,7 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
if (!err.WouldBlock()) {
/* Something went wrong.. close client! */
if (!closing_down) {
DEBUG(net, 0, "send failed with error %s", err.AsString());
DEBUG(net, 0, "Send failed: %s", err.AsString());
this->CloseConnection();
}
return SPS_CLOSED;
@ -168,7 +169,7 @@ std::unique_ptr<Packet> NetworkTCPSocketHandler::ReceivePacket()
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
/* Something went wrong... */
if (!err.IsConnectionReset()) DEBUG(net, 0, "recv failed with error %s", err.AsString());
if (!err.IsConnectionReset()) DEBUG(net, 0, "Recv failed: %s", err.AsString());
this->CloseConnection();
return nullptr;
}
@ -197,7 +198,7 @@ std::unique_ptr<Packet> NetworkTCPSocketHandler::ReceivePacket()
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
/* Something went wrong... */
if (!err.IsConnectionReset()) DEBUG(net, 0, "recv failed with error %s", err.AsString());
if (!err.IsConnectionReset()) DEBUG(net, 0, "Recv failed: %s", err.AsString());
this->CloseConnection();
return nullptr;
}

@ -15,9 +15,12 @@
#include "address.h"
#include "packet.h"
#include <atomic>
#include <chrono>
#include <deque>
#include <map>
#include <memory>
#include <atomic>
#include <thread>
/** The states of sending the packets. */
enum SendPacketsState {
@ -73,23 +76,44 @@ public:
*/
class TCPConnecter {
private:
std::atomic<bool> connected;///< Whether we succeeded in making the connection
std::atomic<bool> aborted; ///< Whether we bailed out (i.e. connection making failed)
bool killed; ///< Whether we got killed
SOCKET sock; ///< The socket we're connecting with
/**
* The current status of the connecter.
*
* We track the status like this to ensure everything is executed from the
* game-thread, and not at another random time where we might not have the
* lock on the game-state.
*/
enum class Status {
INIT, ///< TCPConnecter is created but resolving hasn't started.
RESOLVING, ///< The hostname is being resolved (threaded).
FAILURE, ///< Resolving failed.
CONNECTING, ///< We are currently connecting.
};
std::thread resolve_thread; ///< Thread used during resolving.
std::atomic<Status> status = Status::INIT; ///< The current status of the connecter.
addrinfo *ai = nullptr; ///< getaddrinfo() allocated linked-list of resolved addresses.
std::vector<addrinfo *> addresses; ///< Addresses we can connect to.
std::map<SOCKET, NetworkAddress> sock_to_address; ///< Mapping of a socket to the real address it is connecting to. USed for DEBUG statements.
size_t current_address = 0; ///< Current index in addresses we are trying.
std::vector<SOCKET> sockets; ///< Pending connect() attempts.
std::chrono::steady_clock::time_point last_attempt; ///< Time we last tried to connect.
void Connect();
std::string connection_string; ///< Current address we are connecting to (before resolving).
static void ThreadEntry(TCPConnecter *param);
void Resolve();
void OnResolved(addrinfo *ai);
bool TryNextAddress();
void Connect(addrinfo *address);
bool CheckActivity();
protected:
/** Address we're connecting to */
NetworkAddress address;
static void ResolveThunk(TCPConnecter *connecter);
public:
TCPConnecter(const std::string &connection_string, uint16 default_port);
/** Silence the warnings */
virtual ~TCPConnecter() {}
virtual ~TCPConnecter();
/**
* Callback when the connection succeeded.

@ -41,7 +41,7 @@ NetworkAdminSocketHandler::~NetworkAdminSocketHandler()
NetworkRecvStatus NetworkAdminSocketHandler::CloseConnection(bool error)
{
delete this;
return NETWORK_RECV_STATUS_CONN_LOST;
return NETWORK_RECV_STATUS_CLIENT_QUIT;
}
/**
@ -93,9 +93,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
default:
if (this->HasClientQuit()) {
DEBUG(net, 0, "[tcp/admin] received invalid packet type %d from '%s' (%s)", type, this->admin_name, this->admin_version);
DEBUG(net, 0, "[tcp/admin] Received invalid packet type %d from '%s' (%s)", type, this->admin_name, this->admin_version);
} else {
DEBUG(net, 0, "[tcp/admin] received illegal packet from '%s' (%s)", this->admin_name, this->admin_version);
DEBUG(net, 0, "[tcp/admin] Received illegal packet from '%s' (%s)", this->admin_name, this->admin_version);
}
this->CloseConnection();
@ -128,7 +128,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::ReceivePackets()
*/
NetworkRecvStatus NetworkAdminSocketHandler::ReceiveInvalidPacket(PacketAdminType type)
{
DEBUG(net, 0, "[tcp/admin] received illegal packet type %d from admin %s (%s)", type, this->admin_name, this->admin_version);
DEBUG(net, 0, "[tcp/admin] Received illegal packet type %d from admin %s (%s)", type, this->admin_name, this->admin_version);
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}

@ -15,6 +15,8 @@
#include "tcp.h"
#include "../network_internal.h"
#include <deque>
#include "../../safeguards.h"
/** List of connections that are currently being created */
@ -24,38 +26,325 @@ static std::vector<TCPConnecter *> _tcp_connecters;
* Create a new connecter for the given address
* @param connection_string the address to connect to
*/
TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_port) :
connected(false),
aborted(false),
killed(false),
sock(INVALID_SOCKET)
TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_port)
{
this->address = ParseConnectionString(connection_string, default_port);
this->connection_string = NormalizeConnectionString(connection_string, default_port);
_tcp_connecters.push_back(this);
if (!StartNewThread(nullptr, "ottd:tcp", &TCPConnecter::ThreadEntry, this)) {
this->Connect();
}
TCPConnecter::~TCPConnecter()
{
if (this->resolve_thread.joinable()) {
this->resolve_thread.join();
}
for (const auto &socket : this->sockets) {
closesocket(socket);
}
this->sockets.clear();
this->sock_to_address.clear();
freeaddrinfo(this->ai);
}
/** The actual connection function */
void TCPConnecter::Connect()
/**
* Start a connection to the indicated address.
* @param address The address to connection to.
*/
void TCPConnecter::Connect(addrinfo *address)
{
this->sock = this->address.Connect();
if (this->sock == INVALID_SOCKET) {
this->aborted = true;
} else {
this->connected = true;
SOCKET sock = socket(address->ai_family, address->ai_socktype, address->ai_protocol);
if (sock == INVALID_SOCKET) {
DEBUG(net, 0, "Could not create %s %s socket: %s", NetworkAddress::SocketTypeAsString(address->ai_socktype), NetworkAddress::AddressFamilyAsString(address->ai_family), NetworkError::GetLast().AsString());
return;
}
if (!SetNoDelay(sock)) {
DEBUG(net, 1, "Setting TCP_NODELAY failed: %s", NetworkError::GetLast().AsString());
}
if (!SetNonBlocking(sock)) {
DEBUG(net, 0, "Setting non-blocking mode failed: %s", NetworkError::GetLast().AsString());
}
NetworkAddress network_address = NetworkAddress(address->ai_addr, (int)address->ai_addrlen);
DEBUG(net, 5, "Attempting to connect to %s", network_address.GetAddressAsString().c_str());
int err = connect(sock, address->ai_addr, (int)address->ai_addrlen);
if (err != 0 && !NetworkError::GetLast().IsConnectInProgress()) {
closesocket(sock);
DEBUG(net, 1, "Could not connect to %s: %s", network_address.GetAddressAsString().c_str(), NetworkError::GetLast().AsString());
return;
}
this->sock_to_address[sock] = network_address;
this->sockets.push_back(sock);
}
/**
* Start the connect() for the next address in the list.
* @return True iff a new connect() is attempted.
*/
bool TCPConnecter::TryNextAddress()
{
if (this->current_address >= this->addresses.size()) return false;
this->last_attempt = std::chrono::steady_clock::now();
this->Connect(this->addresses[this->current_address++]);
return true;
}
/**
* Callback when resolving is done.
* @param ai A linked-list of address information.
*/
void TCPConnecter::OnResolved(addrinfo *ai)
{
std::deque<addrinfo *> addresses_ipv4, addresses_ipv6;
/* Apply "Happy Eyeballs" if it is likely IPv6 is functional. */
/* Detect if IPv6 is likely to succeed or not. */
bool seen_ipv6 = false;
bool resort = true;
for (addrinfo *runp = ai; runp != nullptr; runp = runp->ai_next) {
if (runp->ai_family == AF_INET6) {
seen_ipv6 = true;
} else if (!seen_ipv6) {
/* We see an IPv4 before an IPv6; this most likely means there is
* no IPv6 available on the system, so keep the order of this
* list. */
resort = false;
break;
}
}
/* Convert the addrinfo into NetworkAddresses. */
for (addrinfo *runp = ai; runp != nullptr; runp = runp->ai_next) {
if (resort) {
if (runp->ai_family == AF_INET6) {
addresses_ipv6.emplace_back(runp);
} else {
addresses_ipv4.emplace_back(runp);
}
} else {
this->addresses.emplace_back(runp);
}
}
/* If we want to resort, make the list like IPv6 / IPv4 / IPv6 / IPv4 / ..
* for how ever many (round-robin) DNS entries we have. */
if (resort) {
while (!addresses_ipv4.empty() || !addresses_ipv6.empty()) {
if (!addresses_ipv6.empty()) {
this->addresses.push_back(addresses_ipv6.front());
addresses_ipv6.pop_front();
}
if (!addresses_ipv4.empty()) {
this->addresses.push_back(addresses_ipv4.front());
addresses_ipv4.pop_front();
}
}
}
if (_debug_net_level >= 6) {
DEBUG(net, 6, "%s resolved in:", this->connection_string.c_str());
for (const auto &address : this->addresses) {
DEBUG(net, 6, "- %s", NetworkAddress(address->ai_addr, (int)address->ai_addrlen).GetAddressAsString().c_str());
}
}
this->current_address = 0;
}
/**
* Start resolving the hostname.
*
* This function must change "status" to either Status::FAILURE
* or Status::CONNECTING before returning.
*/
void TCPConnecter::Resolve()
{
/* Port is already guaranteed part of the connection_string. */
NetworkAddress address = ParseConnectionString(this->connection_string, 0);
addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_ADDRCONFIG;
hints.ai_socktype = SOCK_STREAM;
char port_name[6];
seprintf(port_name, lastof(port_name), "%u", address.GetPort());
static bool getaddrinfo_timeout_error_shown = false;
auto start = std::chrono::steady_clock::now();
addrinfo *ai;
int error = getaddrinfo(address.GetHostname(), port_name, &hints, &ai);
auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::seconds>(end - start);
if (!getaddrinfo_timeout_error_shown && duration >= std::chrono::seconds(5)) {
DEBUG(net, 0, "getaddrinfo() for address \"%s\" took %i seconds", this->connection_string.c_str(), (int)duration.count());
DEBUG(net, 0, " This is likely an issue in the DNS name resolver's configuration causing it to time out");
getaddrinfo_timeout_error_shown = true;
}
if (error != 0) {
DEBUG(net, 0, "Failed to resolve DNS for %s", this->connection_string.c_str());
this->status = Status::FAILURE;
return;
}
this->ai = ai;
this->OnResolved(ai);
this->status = Status::CONNECTING;
}
/**
* Entry point for the new threads.
* @param param the TCPConnecter instance to call Connect on.
* Thunk to start Resolve() on the right instance.
*/
/* static */ void TCPConnecter::ThreadEntry(TCPConnecter *param)
/* static */ void TCPConnecter::ResolveThunk(TCPConnecter *connecter)
{
param->Connect();
connecter->Resolve();
}
/**
* Check if there was activity for this connecter.
* @return True iff the TCPConnecter is done and can be cleaned up.
*/
bool TCPConnecter::CheckActivity()
{
switch (this->status.load()) {
case Status::INIT:
/* Start the thread delayed, so the vtable is loaded. This allows classes
* to overload functions used by Resolve() (in case threading is disabled). */
if (StartNewThread(&this->resolve_thread, "ottd:resolve", &TCPConnecter::ResolveThunk, this)) {
this->status = Status::RESOLVING;
return false;
}
/* No threads, do a blocking resolve. */
this->Resolve();
/* Continue as we are either failed or can start the first
* connection. The rest of this function handles exactly that. */
break;
case Status::RESOLVING:
/* Wait till Resolve() comes back with an answer (in case it runs threaded). */
return false;
case Status::FAILURE:
/* Ensure the OnFailure() is called from the game-thread instead of the
* resolve-thread, as otherwise we can get into some threading issues. */
this->OnFailure();
return true;
case Status::CONNECTING:
break;
}
/* If there are no attempts pending, connect to the next. */
if (this->sockets.empty()) {
if (!this->TryNextAddress()) {
/* There were no more addresses to try, so we failed. */
this->OnFailure();
return true;
}
return false;
}
fd_set write_fd;
FD_ZERO(&write_fd);
for (const auto &socket : this->sockets) {
FD_SET(socket, &write_fd);
}
timeval tv;
tv.tv_usec = 0;
tv.tv_sec = 0;
int n = select(FD_SETSIZE, NULL, &write_fd, NULL, &tv);
/* select() failed; hopefully next try it doesn't. */
if (n < 0) {
/* select() normally never fails; so hopefully it works next try! */
DEBUG(net, 1, "select() failed: %s", NetworkError::GetLast().AsString());
return false;
}
/* No socket updates. */
if (n == 0) {
/* Wait 250ms between attempting another address. */
if (std::chrono::steady_clock::now() < this->last_attempt + std::chrono::milliseconds(250)) return false;
/* Try the next address in the list. */
if (this->TryNextAddress()) return false;
/* Wait up to 3 seconds since the last connection we started. */
if (std::chrono::steady_clock::now() < this->last_attempt + std::chrono::milliseconds(3000)) return false;
/* More than 3 seconds no socket reported activity, and there are no
* more address to try. Timeout the attempt. */
DEBUG(net, 0, "Timeout while connecting to %s", this->connection_string.c_str());
for (const auto &socket : this->sockets) {
closesocket(socket);
}
this->sockets.clear();
this->sock_to_address.clear();
this->OnFailure();
return true;
}
/* Check for errors on any of the sockets. */
for (auto it = this->sockets.begin(); it != this->sockets.end(); /* nothing */) {
NetworkError socket_error = GetSocketError(*it);
if (socket_error.HasError()) {
DEBUG(net, 1, "Could not connect to %s: %s", this->sock_to_address[*it].GetAddressAsString().c_str(), socket_error.AsString());
closesocket(*it);
this->sock_to_address.erase(*it);
it = this->sockets.erase(it);
} else {
it++;
}
}
/* In case all sockets had an error, queue a new one. */
if (this->sockets.empty()) {
if (!this->TryNextAddress()) {
/* There were no more addresses to try, so we failed. */
this->OnFailure();
return true;
}
return false;
}
/* At least one socket is connected. The first one that does is the one
* we will be using, and we close all other sockets. */
SOCKET connected_socket = INVALID_SOCKET;
for (auto it = this->sockets.begin(); it != this->sockets.end(); /* nothing */) {
if (connected_socket == INVALID_SOCKET && FD_ISSET(*it, &write_fd)) {
connected_socket = *it;
} else {
closesocket(*it);
}
this->sock_to_address.erase(*it);
it = this->sockets.erase(it);
}
assert(connected_socket != INVALID_SOCKET);
DEBUG(net, 3, "Connected to %s", this->connection_string.c_str());
if (_debug_net_level >= 5) {
DEBUG(net, 5, "- using %s", NetworkAddress::GetPeerName(connected_socket).c_str());
}
this->OnConnect(connected_socket);
return true;
}
/**
@ -68,32 +357,22 @@ void TCPConnecter::Connect()
{
for (auto iter = _tcp_connecters.begin(); iter < _tcp_connecters.end(); /* nothing */) {
TCPConnecter *cur = *iter;
const bool connected = cur->connected.load();
const bool aborted = cur->aborted.load();
if ((connected || aborted) && cur->killed) {
iter = _tcp_connecters.erase(iter);
if (cur->sock != INVALID_SOCKET) closesocket(cur->sock);
delete cur;
continue;
}
if (connected) {
iter = _tcp_connecters.erase(iter);
cur->OnConnect(cur->sock);
delete cur;
continue;
}
if (aborted) {
if (cur->CheckActivity()) {
iter = _tcp_connecters.erase(iter);
cur->OnFailure();
delete cur;
continue;
} else {
iter++;
}
iter++;
}
}
/** Kill all connection attempts. */
/* static */ void TCPConnecter::KillAll()
{
for (TCPConnecter *conn : _tcp_connecters) conn->killed = true;
for (auto iter = _tcp_connecters.begin(); iter < _tcp_connecters.end(); /* nothing */) {
TCPConnecter *cur = *iter;
iter = _tcp_connecters.erase(iter);
delete cur;
}
}

@ -137,9 +137,11 @@ const char *ContentInfo::GetTextfile(TextfileType type) const
return ::GetTextfile(type, GetContentInfoSubDir(this->type), tmp);
}
void NetworkContentSocketHandler::Close()
/**
* Close the actual socket.
*/
void NetworkContentSocketHandler::CloseSocket()
{
CloseConnection();
if (this->sock == INVALID_SOCKET) return;
closesocket(this->sock);
@ -167,9 +169,9 @@ bool NetworkContentSocketHandler::HandlePacket(Packet *p)
default:
if (this->HasClientQuit()) {
DEBUG(net, 0, "[tcp/content] received invalid packet type %d", type);
DEBUG(net, 0, "[tcp/content] Received invalid packet type %d", type);
} else {
DEBUG(net, 0, "[tcp/content] received illegal packet");
DEBUG(net, 0, "[tcp/content] Received illegal packet");
}
return false;
}
@ -219,7 +221,7 @@ bool NetworkContentSocketHandler::ReceivePackets()
*/
bool NetworkContentSocketHandler::ReceiveInvalidPacket(PacketContentType type)
{
DEBUG(net, 0, "[tcp/content] received illegal packet type %d", type);
DEBUG(net, 0, "[tcp/content] Received illegal packet type %d", type);
return false;
}

@ -21,7 +21,7 @@
/** Base socket handler for all Content TCP sockets */
class NetworkContentSocketHandler : public NetworkTCPSocketHandler {
protected:
void Close() override;
void CloseSocket();
bool ReceiveInvalidPacket(PacketContentType type);
@ -128,7 +128,11 @@ public:
}
/** On destructing of this class, the socket needs to be closed */
virtual ~NetworkContentSocketHandler() { this->Close(); }
virtual ~NetworkContentSocketHandler()
{
/* Virtual functions get called statically in destructors, so make it explicit to remove any confusion. */
this->CloseSocket();
}
bool ReceivePackets();
};

@ -102,7 +102,7 @@ NetworkGameSocketHandler::NetworkGameSocketHandler(SOCKET s) : info(nullptr), cl
*/
NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error)
{
if (this->ignore_close) return NETWORK_RECV_STATUS_CONN_LOST;
if (this->ignore_close) return NETWORK_RECV_STATUS_CLIENT_QUIT;
/* Clients drop back to the main menu */
if (!_network_server && _networking) {
@ -112,10 +112,10 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error)
_networking = false;
ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, WL_CRITICAL);
return NETWORK_RECV_STATUS_CONN_LOST;
return NETWORK_RECV_STATUS_CLIENT_QUIT;
}
return this->CloseConnection(error ? NETWORK_RECV_STATUS_SERVER_ERROR : NETWORK_RECV_STATUS_CONN_LOST);
return this->CloseConnection(NETWORK_RECV_STATUS_CONNECTION_LOST);
}
@ -190,9 +190,9 @@ NetworkRecvStatus NetworkGameSocketHandler::HandlePacket(Packet *p)
this->CloseConnection();
if (this->HasClientQuit()) {
DEBUG(net, 0, "[tcp/game] received invalid packet type %d from client %d", type, this->client_id);
DEBUG(net, 0, "[tcp/game] Received invalid packet type %d from client %d", type, this->client_id);
} else {
DEBUG(net, 0, "[tcp/game] received illegal packet from client %d", this->client_id);
DEBUG(net, 0, "[tcp/game] Received illegal packet from client %d", this->client_id);
}
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}
@ -223,7 +223,7 @@ NetworkRecvStatus NetworkGameSocketHandler::ReceivePackets()
*/
NetworkRecvStatus NetworkGameSocketHandler::ReceiveInvalidPacket(PacketGameType type)
{
DEBUG(net, 0, "[tcp/game] received illegal packet type %d from client %d", type, this->client_id);
DEBUG(net, 0, "[tcp/game] Received illegal packet type %d from client %d", type, this->client_id);
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}

@ -45,7 +45,7 @@ NetworkHTTPSocketHandler::NetworkHTTPSocketHandler(SOCKET s,
size_t bufferSize = strlen(url) + strlen(host) + strlen(_openttd_revision) + (data == nullptr ? 0 : strlen(data)) + 128;
char *buffer = AllocaM(char, bufferSize);
DEBUG(net, 7, "[tcp/http] requesting %s%s", host, url);
DEBUG(net, 5, "[tcp/http] Requesting %s%s", host, url);
if (data != nullptr) {
seprintf(buffer, buffer + bufferSize - 1, "POST %s HTTP/1.0\r\nHost: %s\r\nUser-Agent: OpenTTD/%s\r\nContent-Type: text/plain\r\nContent-Length: %d\r\n\r\n%s\r\n", url, host, _openttd_revision, (int)strlen(data), data);
} else {
@ -85,7 +85,7 @@ NetworkRecvStatus NetworkHTTPSocketHandler::CloseConnection(bool error)
* Helper to simplify the error handling.
* @param msg the error message to show.
*/
#define return_error(msg) { DEBUG(net, 0, msg); return -1; }
#define return_error(msg) { DEBUG(net, 1, msg); return -1; }
static const char * const NEWLINE = "\r\n"; ///< End of line marker
static const char * const END_OF_HEADER = "\r\n\r\n"; ///< End of header marker
@ -112,7 +112,7 @@ int NetworkHTTPSocketHandler::HandleHeader()
/* We expect a HTTP/1.[01] reply */
if (strncmp(this->recv_buffer, HTTP_1_0, strlen(HTTP_1_0)) != 0 &&
strncmp(this->recv_buffer, HTTP_1_1, strlen(HTTP_1_1)) != 0) {
return_error("[tcp/http] received invalid HTTP reply");
return_error("[tcp/http] Received invalid HTTP reply");
}
char *status = this->recv_buffer + strlen(HTTP_1_0);
@ -121,7 +121,7 @@ int NetworkHTTPSocketHandler::HandleHeader()
/* Get the length of the document to receive */
char *length = strcasestr(this->recv_buffer, CONTENT_LENGTH);
if (length == nullptr) return_error("[tcp/http] missing 'content-length' header");
if (length == nullptr) return_error("[tcp/http] Missing 'content-length' header");
/* Skip the header */
length += strlen(CONTENT_LENGTH);
@ -139,9 +139,9 @@ int NetworkHTTPSocketHandler::HandleHeader()
/* Make sure we're going to download at least something;
* zero sized files are, for OpenTTD's purposes, always
* wrong. You can't have gzips of 0 bytes! */
if (len == 0) return_error("[tcp/http] refusing to download 0 bytes");
if (len == 0) return_error("[tcp/http] Refusing to download 0 bytes");
DEBUG(net, 7, "[tcp/http] downloading %i bytes", len);
DEBUG(net, 7, "[tcp/http] Downloading %i bytes", len);
return len;
}
@ -154,15 +154,15 @@ int NetworkHTTPSocketHandler::HandleHeader()
/* Search the end of the line. This is safe because the header will
* always end with two newlines. */
*strstr(status, NEWLINE) = '\0';
DEBUG(net, 0, "[tcp/http] unhandled status reply %s", status);
DEBUG(net, 1, "[tcp/http] Unhandled status reply %s", status);
return -1;
}
if (this->redirect_depth == 5) return_error("[tcp/http] too many redirects, looping redirects?");
if (this->redirect_depth == 5) return_error("[tcp/http] Too many redirects, looping redirects?");
/* Redirect to other URL */
char *uri = strcasestr(this->recv_buffer, LOCATION);
if (uri == nullptr) return_error("[tcp/http] missing 'location' header for redirect");
if (uri == nullptr) return_error("[tcp/http] Missing 'location' header for redirect");
uri += strlen(LOCATION);
@ -171,7 +171,7 @@ int NetworkHTTPSocketHandler::HandleHeader()
char *end_of_line = strstr(uri, NEWLINE);
*end_of_line = '\0';
DEBUG(net, 6, "[tcp/http] redirecting to %s", uri);
DEBUG(net, 7, "[tcp/http] Redirecting to %s", uri);
int ret = NetworkHTTPSocketHandler::Connect(uri, this->callback, this->data, this->redirect_depth + 1);
if (ret != 0) return ret;
@ -194,18 +194,20 @@ int NetworkHTTPSocketHandler::HandleHeader()
/* static */ int NetworkHTTPSocketHandler::Connect(char *uri, HTTPCallback *callback, const char *data, int depth)
{
char *hname = strstr(uri, "://");
if (hname == nullptr) return_error("[tcp/http] invalid location");
if (hname == nullptr) return_error("[tcp/http] Invalid location");
hname += 3;
char *url = strchr(hname, '/');
if (url == nullptr) return_error("[tcp/http] invalid location");
if (url == nullptr) return_error("[tcp/http] Invalid location");
*url = '\0';
std::string hostname = std::string(hname);
/* Restore the URL. */
*url = '/';
new NetworkHTTPContentConnecter(hname, callback, url, data, depth);
new NetworkHTTPContentConnecter(hostname, callback, url, data, depth);
return 0;
}
@ -226,7 +228,7 @@ int NetworkHTTPSocketHandler::Receive()
NetworkError err = NetworkError::GetLast();
if (!err.WouldBlock()) {
/* Something went wrong... */
if (!err.IsConnectionReset()) DEBUG(net, 0, "recv failed with error %s", err.AsString());
if (!err.IsConnectionReset()) DEBUG(net, 0, "Recv failed: %s", err.AsString());
return -1;
}
/* Connection would block, so stop for now */
@ -254,7 +256,7 @@ int NetworkHTTPSocketHandler::Receive()
if (end_of_header == nullptr) {
if (read == lengthof(this->recv_buffer)) {
DEBUG(net, 0, "[tcp/http] header too big");
DEBUG(net, 1, "[tcp/http] Header too big");
return -1;
}
this->recv_pos = read;

@ -73,6 +73,7 @@ public:
/** Connect with a HTTP server and do ONE query. */
class NetworkHTTPContentConnecter : TCPConnecter {
std::string hostname; ///< Hostname we are connecting to.
HTTPCallback *callback; ///< Callback to tell that we received some data (or won't).
const char *url; ///< The URL we want to get at the server.
const char *data; ///< The data to send
@ -81,14 +82,15 @@ class NetworkHTTPContentConnecter : TCPConnecter {
public:
/**
* Start the connecting.
* @param connection_string The address to connect to.
* @param hostname The hostname to connect to.
* @param callback The callback for HTTP retrieval.
* @param url The url at the server.
* @param data The data to send.
* @param depth The depth (redirect recursion) of the queries.
*/
NetworkHTTPContentConnecter(const std::string &connection_string, HTTPCallback *callback, const char *url, const char *data = nullptr, int depth = 0) :
TCPConnecter(connection_string, 80),
NetworkHTTPContentConnecter(const std::string &hostname, HTTPCallback *callback, const char *url, const char *data = nullptr, int depth = 0) :
TCPConnecter(hostname, 80),
hostname(hostname),
callback(callback),
url(stredup(url)),
data(data),
@ -110,7 +112,7 @@ public:
void OnConnect(SOCKET s) override
{
new NetworkHTTPSocketHandler(s, this->callback, this->address.GetHostname(), this->url, this->data, this->depth);
new NetworkHTTPSocketHandler(s, this->callback, this->hostname.c_str(), this->url, this->data, this->depth);
/* We've relinquished control of data now. */
this->data = nullptr;
}

@ -49,7 +49,7 @@ public:
SetNonBlocking(s); // XXX error handling?
NetworkAddress address(sin, sin_len);
DEBUG(net, 1, "[%s] Client connected from %s on frame %d", Tsocket::GetName(), address.GetHostname(), _frame_counter);
DEBUG(net, 3, "[%s] Client connected from %s on frame %d", Tsocket::GetName(), address.GetHostname(), _frame_counter);
SetNoDelay(s); // XXX error handling?
@ -61,10 +61,10 @@ public:
Packet p(Tban_packet);
p.PrepareToSend();
DEBUG(net, 1, "[%s] Banned ip tried to join (%s), refused", Tsocket::GetName(), entry.c_str());
DEBUG(net, 2, "[%s] Banned ip tried to join (%s), refused", Tsocket::GetName(), entry.c_str());
if (p.TransferOut<int>(send, s, 0) < 0) {
DEBUG(net, 0, "send failed with error %s", NetworkError::GetLast().AsString());
DEBUG(net, 0, "[%s] send failed: %s", Tsocket::GetName(), NetworkError::GetLast().AsString());
}
closesocket(s);
break;
@ -81,7 +81,7 @@ public:
p.PrepareToSend();
if (p.TransferOut<int>(send, s, 0) < 0) {
DEBUG(net, 0, "send failed with error %s", NetworkError::GetLast().AsString());
DEBUG(net, 0, "[%s] send failed: %s", Tsocket::GetName(), NetworkError::GetLast().AsString());
}
closesocket(s);
@ -150,7 +150,7 @@ public:
}
if (sockets.size() == 0) {
DEBUG(net, 0, "[server] could not start network: could not create listening socket");
DEBUG(net, 0, "Could not start network: could not create listening socket");
ShowNetworkError(STR_NETWORK_ERROR_SERVER_START);
return false;
}
@ -165,7 +165,7 @@ public:
closesocket(s.second);
}
sockets.clear();
DEBUG(net, 1, "[%s] closed listeners", Tsocket::GetName());
DEBUG(net, 5, "[%s] Closed listeners", Tsocket::GetName());
}
};

@ -127,16 +127,16 @@ void NetworkUDPSocketHandler::SendPacket(Packet *p, NetworkAddress *recv, bool a
/* Enable broadcast */
unsigned long val = 1;
if (setsockopt(s.second, SOL_SOCKET, SO_BROADCAST, (char *) &val, sizeof(val)) < 0) {
DEBUG(net, 1, "[udp] setting broadcast failed with: %s", NetworkError::GetLast().AsString());
DEBUG(net, 1, "Setting broadcast mode failed: %s", NetworkError::GetLast().AsString());
}
}
/* Send the buffer */
ssize_t res = p->TransferOut<int>(sendto, s.second, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength());
DEBUG(net, 7, "[udp] sendto(%s)", NetworkAddressDumper().GetAddressAsString(&send));
DEBUG(net, 7, "sendto(%s)", NetworkAddressDumper().GetAddressAsString(&send));
/* Check for any errors, but ignore it otherwise */
if (res == -1) DEBUG(net, 1, "[udp] sendto(%s) failed with: %s", NetworkAddressDumper().GetAddressAsString(&send), NetworkError::GetLast().AsString());
if (res == -1) DEBUG(net, 1, "sendto(%s) failed with: %s", NetworkAddressDumper().GetAddressAsString(&send), NetworkError::GetLast().AsString());
if (!all) break;
}

@ -211,7 +211,7 @@ public:
virtual ~NetworkUDPSocketHandler() { this->Close(); }
bool Listen();
void Close() override;
void Close();
void SendPacket(Packet *p, NetworkAddress *recv, bool all = false, bool broadcast = false, bool short_mtu = false);
void ReceivePackets();

@ -288,7 +288,7 @@ void NetworkTextMessage(NetworkAction action, TextColour colour, bool self_send,
DEBUG(desync, 1, "msg: date{%08x; %02x; %02x}; %s", _date, _date_fract, _tick_skip_counter, message);
IConsolePrintF(colour, "%s", message);
NetworkAddChatMessage((TextColour)colour, _settings_client.gui.network_chat_timeout, "%s", message);
NetworkAddChatMessage((TextColour)colour, _settings_client.gui.network_chat_timeout, message);
}
/* Calculate the frame-lag of a client */
@ -527,6 +527,19 @@ std::string_view ParseFullConnectionString(const std::string &connection_string,
return ip;
}
/**
* Normalize a connection string. That is, ensure there is a port in the string.
* @param connection_string The connection string to normalize.
* @param default_port The port to use if none is given.
* @return The normalized connection string.
*/
std::string NormalizeConnectionString(const std::string &connection_string, uint16 default_port)
{
uint16 port = default_port;
std::string_view ip = ParseFullConnectionString(connection_string, port);
return std::string(ip) + ":" + std::to_string(port);
}
/**
* Convert a string containing either "hostname" or "hostname:ip" to a
* NetworkAddress.
@ -598,13 +611,13 @@ void NetworkClose(bool close_admins)
}
for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
cs->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
cs->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
ServerNetworkGameSocketHandler::CloseListeners();
ServerNetworkAdminSocketHandler::CloseListeners();
} else if (MyClient::my_client != nullptr) {
MyClient::SendQuit();
MyClient::my_client->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
MyClient::my_client->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
TCPConnecter::KillAll();
@ -636,41 +649,77 @@ static void NetworkInitialize(bool close_admins = true)
_last_sync_tick_skip_counter = 0;
}
/** Non blocking connection create to query servers */
/** Non blocking connection to query servers for their game info. */
class TCPQueryConnecter : TCPConnecter {
private:
bool request_company_info;
std::string connection_string;
public:
TCPQueryConnecter(const std::string &connection_string, bool request_company_info) : TCPConnecter(connection_string, NETWORK_DEFAULT_PORT), request_company_info(request_company_info), connection_string(connection_string) {}
TCPQueryConnecter(const std::string &connection_string) : TCPConnecter(connection_string, NETWORK_DEFAULT_PORT), connection_string(connection_string) {}
void OnFailure() override
{
NetworkDisconnect();
NetworkGameList *item = NetworkGameListAddItem(connection_string);
item->online = false;
UpdateNetworkGameWindow();
}
void OnConnect(SOCKET s) override
{
_networking = true;
new ClientNetworkGameSocketHandler(s, this->connection_string);
MyClient::SendInformationQuery(request_company_info);
MyClient::SendInformationQuery(false);
}
};
/**
* Query a server to fetch his game-info.
* Query a server to fetch the game-info.
* @param connection_string the address to query.
* @param request_company_info Whether to request company info too.
*/
void NetworkTCPQueryServer(const std::string &connection_string, bool request_company_info)
void NetworkQueryServer(const std::string &connection_string)
{
if (!_network_available) return;
NetworkInitialize();
new TCPQueryConnecter(connection_string);
}
/** Non blocking connection to query servers for their game and company info. */
class TCPLobbyQueryConnecter : TCPConnecter {
private:
std::string connection_string;
public:
TCPLobbyQueryConnecter(const std::string &connection_string) : TCPConnecter(connection_string, NETWORK_DEFAULT_PORT), connection_string(connection_string) {}
void OnFailure() override
{
DeleteWindowById(WC_NETWORK_WINDOW, WN_NETWORK_WINDOW_LOBBY);
ShowErrorMessage(STR_NETWORK_ERROR_NOCONNECTION, INVALID_STRING_ID, WL_ERROR);
}
void OnConnect(SOCKET s) override
{
_networking = true;
new ClientNetworkGameSocketHandler(s, this->connection_string);
MyClient::SendInformationQuery(true);
}
};
/**
* Query a server to fetch his game-info for the lobby.
* @param connection_string the address to query.
*/
void NetworkQueryLobbyServer(const std::string &connection_string)
{
if (!_network_available) return;
NetworkDisconnect();
NetworkInitialize();
new TCPQueryConnecter(connection_string, request_company_info);
new TCPLobbyQueryConnecter(connection_string);
}
/**
@ -680,7 +729,7 @@ void NetworkTCPQueryServer(const std::string &connection_string, bool request_co
* @param connection_string The IP:port of the server to add.
* @return The entry on the game list.
*/
NetworkGameList *NetworkAddServer(const std::string &connection_string)
NetworkGameList *NetworkAddServer(const std::string &connection_string, bool manually)
{
if (connection_string.empty()) return nullptr;
@ -689,13 +738,13 @@ NetworkGameList *NetworkAddServer(const std::string &connection_string)
if (item->info.server_name.empty()) {
ClearGRFConfigList(&item->info.grfconfig);
item->info.server_name = connection_string;
item->manually = true;
NetworkRebuildHostList();
UpdateNetworkGameWindow();
NetworkQueryServer(connection_string);
}
NetworkTCPQueryServer(connection_string);
if (manually) item->manually = true;
return item;
}
@ -840,13 +889,13 @@ static void CheckClientAndServerName()
{
static const char *fallback_client_name = "Unnamed Client";
if (StrEmpty(_settings_client.network.client_name) || strcmp(_settings_client.network.client_name, fallback_client_name) == 0) {
DEBUG(net, 0, "No \"client_name\" has been set, using \"%s\" instead. Please set this now using the \"name <new name>\" command.", fallback_client_name);
DEBUG(net, 1, "No \"client_name\" has been set, using \"%s\" instead. Please set this now using the \"name <new name>\" command", fallback_client_name);
strecpy(_settings_client.network.client_name, fallback_client_name, lastof(_settings_client.network.client_name));
}
static const char *fallback_server_name = "Unnamed Server";
if (StrEmpty(_settings_client.network.server_name) || strcmp(_settings_client.network.server_name, fallback_server_name) == 0) {
DEBUG(net, 0, "No \"server_name\" has been set, using \"%s\" instead. Please set this now using the \"server_name <new name>\" command.", fallback_server_name);
DEBUG(net, 1, "No \"server_name\" has been set, using \"%s\" instead. Please set this now using the \"server_name <new name>\" command", fallback_server_name);
strecpy(_settings_client.network.server_name, fallback_server_name, lastof(_settings_client.network.server_name));
}
}
@ -864,17 +913,17 @@ bool NetworkServerStart()
NetworkDisconnect(false, false);
NetworkInitialize(false);
DEBUG(net, 1, "starting listeners for clients");
DEBUG(net, 5, "Starting listeners for clients");
if (!ServerNetworkGameSocketHandler::Listen(_settings_client.network.server_port)) return false;
/* Only listen for admins when the password isn't empty. */
if (!StrEmpty(_settings_client.network.admin_password)) {
DEBUG(net, 1, "starting listeners for admins");
DEBUG(net, 5, "Starting listeners for admins");
if (!ServerNetworkAdminSocketHandler::Listen(_settings_client.network.server_admin_port)) return false;
}
/* Try to start UDP-server */
DEBUG(net, 1, "starting listeners for incoming server queries");
DEBUG(net, 5, "Starting listeners for incoming server queries");
NetworkUDPServerListen();
_network_company_states = CallocT<NetworkCompanyState>(MAX_COMPANIES);
@ -1026,7 +1075,7 @@ void NetworkGameLoop()
static bool check_sync_state = false;
static uint32 sync_state[2];
if (f == nullptr && next_date == 0) {
DEBUG(net, 0, "Cannot open commands.log");
DEBUG(desync, 0, "Cannot open commands.log");
next_date = 1;
}
@ -1107,16 +1156,16 @@ void NetworkGameLoop()
/* A message that is not very important to the log playback, but part of the log. */
#ifndef DEBUG_FAILED_DUMP_COMMANDS
} else if (strncmp(p, "cmdf: ", 6) == 0) {
DEBUG(net, 0, "Skipping replay of failed command: %s", p + 6);
DEBUG(desync, 0, "Skipping replay of failed command: %s", p + 6);
#endif
} else {
/* Can't parse a line; what's wrong here? */
DEBUG(net, 0, "trying to parse: %s", p);
DEBUG(desync, 0, "Trying to parse: %s", p);
NOT_REACHED();
}
}
if (f != nullptr && feof(f)) {
DEBUG(net, 0, "End of commands.log");
DEBUG(desync, 0, "End of commands.log");
fclose(f);
f = nullptr;
}
@ -1195,29 +1244,36 @@ static void NetworkGenerateServerId()
seprintf(_settings_client.network.network_id, lastof(_settings_client.network.network_id), "%s", hex_output);
}
void NetworkStartDebugLog(const std::string &connection_string)
{
extern SOCKET _debug_socket; // Comes from debug.c
NetworkAddress address = ParseConnectionString(connection_string, NETWORK_DEFAULT_DEBUGLOG_PORT);
class TCPNetworkDebugConnecter : TCPConnecter {
private:
std::string connection_string;
DEBUG(net, 0, "Redirecting DEBUG() to %s", address.GetAddressAsString().c_str());
public:
TCPNetworkDebugConnecter(const std::string &connection_string) : TCPConnecter(connection_string, NETWORK_DEFAULT_DEBUGLOG_PORT), connection_string(connection_string) {}
SOCKET s = address.Connect();
if (s == INVALID_SOCKET) {
DEBUG(net, 0, "Failed to open socket for redirection DEBUG()");
return;
void OnFailure() override
{
DEBUG(net, 0, "Failed to open connection to %s for redirecting DEBUG()", this->connection_string.c_str());
}
_debug_socket = s;
void OnConnect(SOCKET s) override
{
DEBUG(net, 3, "Redirecting DEBUG() to %s", this->connection_string.c_str());
extern SOCKET _debug_socket;
_debug_socket = s;
}
};
DEBUG(net, 0, "DEBUG() is now redirected");
void NetworkStartDebugLog(const std::string &connection_string)
{
new TCPNetworkDebugConnecter(connection_string);
}
/** This tries to launch the network for a given OS */
void NetworkStartUp()
{
DEBUG(net, 3, "[core] starting network...");
DEBUG(net, 3, "Starting network");
/* Network is available */
_network_available = NetworkCoreInitialize();
@ -1230,7 +1286,7 @@ void NetworkStartUp()
_network_game_info = {};
NetworkInitialize();
DEBUG(net, 3, "[core] network online, multiplayer available");
DEBUG(net, 3, "Network online, multiplayer available");
NetworkFindBroadcastIPs(&_broadcast_list);
}
@ -1240,7 +1296,7 @@ void NetworkShutDown()
NetworkDisconnect(true);
NetworkUDPClose();
DEBUG(net, 3, "[core] shutting down network");
DEBUG(net, 3, "Shutting down network");
_network_available = false;
@ -1252,7 +1308,7 @@ extern "C" {
void CDECL em_openttd_add_server(const char *connection_string)
{
NetworkAddServer(connection_string);
NetworkAddServer(connection_string, false);
}
}

@ -74,7 +74,7 @@ ServerNetworkAdminSocketHandler::ServerNetworkAdminSocketHandler(SOCKET s) : Net
ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler()
{
_network_admins_connected--;
DEBUG(net, 1, "[admin] '%s' (%s) has disconnected", this->admin_name, this->admin_version);
DEBUG(net, 3, "[admin] '%s' (%s) has disconnected", this->admin_name, this->admin_version);
if (_redirect_console_to_admin == this->index) _redirect_console_to_admin = INVALID_ADMIN_ID;
if (this->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) {
@ -102,7 +102,7 @@ ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler()
{
for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::Iterate()) {
if (as->status == ADMIN_STATUS_INACTIVE && std::chrono::steady_clock::now() > as->connect_time + ADMIN_AUTHORISATION_TIMEOUT) {
DEBUG(net, 1, "[admin] Admin did not send its authorisation within %d seconds", (uint32)std::chrono::duration_cast<std::chrono::seconds>(ADMIN_AUTHORISATION_TIMEOUT).count());
DEBUG(net, 2, "[admin] Admin did not send its authorisation within %d seconds", (uint32)std::chrono::duration_cast<std::chrono::seconds>(ADMIN_AUTHORISATION_TIMEOUT).count());
as->CloseConnection(true);
continue;
}
@ -142,7 +142,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode er
StringID strid = GetNetworkErrorMsg(error);
GetString(str, strid, lastof(str));
DEBUG(net, 1, "[admin] the admin '%s' (%s) made an error and has been disconnected. Reason: '%s'", this->admin_name, this->admin_version, str);
DEBUG(net, 1, "[admin] The admin '%s' (%s) made an error and has been disconnected: '%s'", this->admin_name, this->admin_version, str);
return this->CloseConnection(true);
}
@ -523,7 +523,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p)
p->Recv_string(command, sizeof(command));
DEBUG(net, 2, "[admin] Rcon command from '%s' (%s): '%s'", this->admin_name, this->admin_version, command);
DEBUG(net, 3, "[admin] Rcon command from '%s' (%s): %s", this->admin_name, this->admin_version, command);
_redirect_console_to_admin = this->index;
IConsoleCmdExec(command);
@ -539,7 +539,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Pack
p->Recv_string(json, sizeof(json));
DEBUG(net, 2, "[admin] GameScript JSON from '%s' (%s): '%s'", this->admin_name, this->admin_version, json);
DEBUG(net, 6, "[admin] GameScript JSON from '%s' (%s): %s", this->admin_name, this->admin_version, json);
Game::NewEvent(new ScriptEventAdminPort(json));
return NETWORK_RECV_STATUS_OKAY;
@ -551,7 +551,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p)
uint32 d1 = p->Recv_uint32();
DEBUG(net, 2, "[admin] Ping from '%s' (%s): '%d'", this->admin_name, this->admin_version, d1);
DEBUG(net, 6, "[admin] Ping from '%s' (%s): %d", this->admin_name, this->admin_version, d1);
return this->SendPong(d1);
}
@ -688,7 +688,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
this->status = ADMIN_STATUS_ACTIVE;
DEBUG(net, 1, "[admin] '%s' (%s) has connected", this->admin_name, this->admin_version);
DEBUG(net, 3, "[admin] '%s' (%s) has connected", this->admin_name, this->admin_version);
return this->SendProtocol();
}
@ -708,7 +708,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_UPDATE_FREQUENC
if (type >= ADMIN_UPDATE_END || (_admin_update_type_frequencies[type] & freq) != freq) {
/* The server does not know of this UpdateType. */
DEBUG(net, 3, "[admin] Not supported update frequency %d (%d) from '%s' (%s).", type, freq, this->admin_name, this->admin_version);
DEBUG(net, 1, "[admin] Not supported update frequency %d (%d) from '%s' (%s)", type, freq, this->admin_name, this->admin_version);
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
}
@ -778,7 +778,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p)
default:
/* An unsupported "poll" update type. */
DEBUG(net, 3, "[admin] Not supported poll %d (%d) from '%s' (%s).", type, d1, this->admin_name, this->admin_version);
DEBUG(net, 1, "[admin] Not supported poll %d (%d) from '%s' (%s).", type, d1, this->admin_name, this->admin_version);
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
}
@ -805,7 +805,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p)
break;
default:
DEBUG(net, 3, "[admin] Invalid chat action %d from admin '%s' (%s).", action, this->admin_name, this->admin_version);
DEBUG(net, 1, "[admin] Invalid chat action %d from admin '%s' (%s).", action, this->admin_name, this->admin_version);
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
}

@ -39,7 +39,7 @@ static const uint NETWORK_CHAT_LINE_SPACING = 3;
/** Container for a message. */
struct ChatMessage {
char message[DRAW_STRING_BUFFER]; ///< The action message.
std::string message; ///< The action message.
TextColour colour; ///< The colour of the message.
std::chrono::steady_clock::time_point remove_time; ///< The time to remove the message.
};
@ -87,23 +87,14 @@ static inline bool HaveChatMessages(bool show_all)
* @param duration The duration of the chat message in seconds
* @param message message itself in printf() style
*/
void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const char *message, ...)
void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const std::string &message)
{
char buf[DRAW_STRING_BUFFER];
va_list va;
va_start(va, message);
vseprintf(buf, lastof(buf), message, va);
va_end(va);
Utf8TrimString(buf, DRAW_STRING_BUFFER);
if (_chatmsg_list.size() == MAX_CHAT_MESSAGES) {
_chatmsg_list.pop_back();
}
ChatMessage *cmsg = &_chatmsg_list.emplace_front();
strecpy(cmsg->message, buf, lastof(cmsg->message));
cmsg->message = message;
cmsg->colour = (colour & TC_IS_PALETTE_COLOUR) ? colour : TC_WHITE;
cmsg->remove_time = std::chrono::steady_clock::now() + std::chrono::seconds(duration);

@ -190,7 +190,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
if (this->sock == INVALID_SOCKET) return status;
if (this->status == STATUS_CLOSING) return status;
DEBUG(net, 1, "Shutting down client connection %d", this->client_id);
DEBUG(net, 3, "Shutting down client connection %d", this->client_id);
SetBlocking(this->sock);
@ -350,7 +350,7 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res)
_sync_frame = 0;
} else if (_sync_frame < _frame_counter) {
DEBUG(net, 1, "Missed frame for sync-test (%d / %d)", _sync_frame, _frame_counter);
DEBUG(net, 1, "Missed frame for sync-test: %d / %d", _sync_frame, _frame_counter);
_sync_frame = 0;
}
}
@ -542,7 +542,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacke
/** Send a chat-packet over the network */
NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action, DestType type, int dest, const char *msg, NetworkTextMessageData data)
{
if (!my_client) return NETWORK_RECV_STATUS_CONN_LOST;
if (!my_client) return NETWORK_RECV_STATUS_CLIENT_QUIT;
Packet *p = new Packet(PACKET_CLIENT_CHAT, SHRT_MAX);
p->Send_uint8 (action);
@ -799,7 +799,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac
p->Recv_string(name, sizeof(name));
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
/* The server validates the name when receiving it from clients, so when it is wrong
* here something went really wrong. In the best case the packet got malformed on its
* way too us, in the worst case the server is broken or compromised. */
@ -1131,13 +1131,13 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_FRAME(Packet *p
/* Receive the token. */
if (p->CanReadFromPacket(sizeof(uint8))) this->token = p->Recv_uint8();
DEBUG(net, 5, "Received FRAME %d", _frame_counter_server);
DEBUG(net, 7, "Received FRAME %d", _frame_counter_server);
/* Let the server know that we received this frame correctly
* We do this only once per day, to save some bandwidth ;) */
if (!_network_first_time && last_ack_frame < _frame_counter) {
last_ack_frame = _frame_counter + DAY_TICKS;
DEBUG(net, 4, "Sent ACK at %d", _frame_counter);
DEBUG(net, 7, "Sent ACK at %d", _frame_counter);
SendAck();
}
@ -1272,7 +1272,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_QUIT(Packet *p)
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, nullptr, STR_NETWORK_MESSAGE_CLIENT_LEAVING);
delete ci;
} else {
DEBUG(net, 0, "Unknown client (%d) is leaving the game", client_id);
DEBUG(net, 1, "Unknown client (%d) is leaving the game", client_id);
}
InvalidateWindowData(WC_CLIENT_LIST, 0);
@ -1352,7 +1352,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p)
if (client_id == 0) {
/* definitely an invalid client id, debug message and do nothing. */
DEBUG(net, 0, "[move] received invalid client index = 0");
DEBUG(net, 1, "Received invalid client index = 0");
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
}

@ -367,7 +367,7 @@ void NetworkGameSocketHandler::SendCommand(Packet *p, const CommandPacket *cp)
}
if (callback == lengthof(_callback_table)) {
DEBUG(net, 0, "Unknown callback. (Pointer: %p) No callback sent", cp->callback);
DEBUG(net, 0, "Unknown callback for command; no callback sent (command: %d)", cp->cmd);
callback = 0; // _callback_table[0] == nullptr
}
p->Send_uint8 (callback);

@ -808,7 +808,9 @@ void ClientNetworkContentSocketHandler::Connect()
void ClientNetworkContentSocketHandler::Close()
{
if (this->sock == INVALID_SOCKET) return;
NetworkContentSocketHandler::Close();
this->CloseConnection();
this->CloseSocket();
this->OnDisconnect();
}

@ -110,7 +110,7 @@ public:
void Connect();
void SendReceive();
void Close() override;
void Close();
void RequestContentList(ContentType type);
void RequestContentList(uint count, const ContentID *content_ids);

@ -86,7 +86,7 @@ uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const char *reason);
uint NetworkServerKickOrBanIP(const char *ip, bool ban, const char *reason);
void NetworkInitChatMessage();
void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const char *message, ...) WARN_FORMAT(3, 4);
void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const std::string &message);
void NetworkUndrawChatMessage();
void NetworkChatMessageLoop();

@ -112,7 +112,6 @@ void NetworkGameListRemoveItem(NetworkGameList *remove)
ClearGRFConfigList(&remove->info.grfconfig);
delete remove;
DEBUG(net, 4, "[gamelist] removed server from list");
NetworkRebuildHostList();
UpdateNetworkGameWindow();
return;

@ -491,7 +491,7 @@ public:
EM_ASM(if (window["openttd_server_list"]) openttd_server_list());
#endif
this->last_joined = NetworkAddServer(_settings_client.network.last_joined);
this->last_joined = NetworkAddServer(_settings_client.network.last_joined, false);
this->server = this->last_joined;
this->requery_timer.SetInterval(MILLISECONDS_PER_TICK);
@ -767,7 +767,7 @@ public:
break;
case WID_NG_REFRESH: // Refresh
if (this->server != nullptr) NetworkTCPQueryServer(this->server->connection_string);
if (this->server != nullptr) NetworkQueryServer(this->server->connection_string);
break;
case WID_NG_NEWGRF: // NewGRF Settings
@ -845,6 +845,7 @@ public:
if (!StrEmpty(str)) {
strecpy(_settings_client.network.connect_to_ip, str, lastof(_settings_client.network.connect_to_ip));
NetworkAddServer(str);
NetworkRebuildHostList();
}
}
@ -1502,7 +1503,7 @@ struct NetworkLobbyWindow : public Window {
/* Clear the information so removed companies don't remain */
for (auto &company : this->company_info) company = {};
NetworkTCPQueryServer(this->server->connection_string, true);
NetworkQueryLobbyServer(this->server->connection_string);
break;
}
}
@ -1572,7 +1573,7 @@ static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
strecpy(_settings_client.network.last_joined, ngl->connection_string.c_str(), lastof(_settings_client.network.last_joined));
NetworkTCPQueryServer(ngl->connection_string, true);
NetworkQueryLobbyServer(ngl->connection_string);
new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
}

@ -94,10 +94,11 @@ extern uint8 _network_reconnect;
extern CompanyMask _network_company_passworded;
void NetworkTCPQueryServer(const std::string &connection_string, bool request_company_info = false);
void NetworkQueryServer(const std::string &connection_string);
void NetworkQueryLobbyServer(const std::string &connection_string);
void GetBindAddresses(NetworkAddressList *addresses, uint16 port);
struct NetworkGameList *NetworkAddServer(const std::string &connection_string);
struct NetworkGameList *NetworkAddServer(const std::string &connection_string, bool manually = true);
void NetworkRebuildHostList();
void UpdateNetworkGameWindow();
@ -127,5 +128,6 @@ bool NetworkFindName(char *new_name, const char *last);
const char *GenerateCompanyPasswordHash(const char *password, const char *password_server_id, uint32 password_game_seed);
NetworkAddress ParseConnectionString(const std::string &connection_string, uint16 default_port);
std::string NormalizeConnectionString(const std::string &connection_string, uint16 default_port);
#endif /* NETWORK_INTERNAL_H */

@ -253,7 +253,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
*/
if (this->sock == INVALID_SOCKET) return status;
if (status != NETWORK_RECV_STATUS_CONN_LOST && status != NETWORK_RECV_STATUS_SERVER_ERROR && !this->HasClientQuit() && this->status >= STATUS_AUTHORIZED) {
if (status != NETWORK_RECV_STATUS_CLIENT_QUIT && status != NETWORK_RECV_STATUS_SERVER_ERROR && !this->HasClientQuit() && this->status >= STATUS_AUTHORIZED) {
/* We did not receive a leave message from this client... */
char client_name[NETWORK_CLIENT_NAME_LENGTH];
@ -280,7 +280,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
}
NetworkAdminClientError(this->client_id, NETWORK_ERROR_CONNECTION_LOST);
DEBUG(net, 1, "Closed client connection %d", this->client_id);
DEBUG(net, 3, "Closed client connection %d", this->client_id);
/* We just lost one client :( */
if (this->status >= STATUS_AUTHORIZED) _network_game_info.clients_on--;
@ -321,7 +321,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
if (cs->status == STATUS_CLOSE_PENDING) {
SendPacketsState send_state = cs->SendPackets(true);
if (send_state == SPS_CLOSED) {
cs->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
cs->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
} else if (send_state != SPS_PARTLY_SENT && send_state != SPS_NONE_SENT) {
ShutdownSocket(cs->sock, true, false, 2);
}
@ -462,7 +462,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err
this->GetClientName(client_name, lastof(client_name));
DEBUG(net, 1, "'%s' made an error and has been disconnected. Reason: '%s'", client_name, str);
DEBUG(net, 1, "'%s' made an error and has been disconnected: %s", client_name, str);
if (error == NETWORK_ERROR_KICKED && reason != nullptr) {
NetworkTextMessage(NETWORK_ACTION_KICKED, CC_DEFAULT, false, client_name, reason, strid);
@ -483,7 +483,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err
NetworkAdminClientError(this->client_id, error);
} else {
DEBUG(net, 1, "Client %d made an error and has been disconnected. Reason: '%s'", this->client_id, str);
DEBUG(net, 1, "Client %d made an error and has been disconnected: %s", this->client_id, str);
}
/* The client made a mistake, so drop his connection now! */
@ -947,7 +947,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
p->Recv_string(name, sizeof(name));
playas = (Owner)p->Recv_uint8();
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
/* join another company does not affect these values */
switch (playas) {
@ -1160,7 +1160,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
CommandPacket cp;
const char *err = this->ReceiveCommand(p, &cp);
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
NetworkClientInfo *ci = this->GetInfo();
@ -1225,7 +1225,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
if (_debug_net_level >= 2) GetString(str, GetNetworkErrorMsg(errorno), lastof(str));
DEBUG(net, 2, "non-joined client %d reported an error and is closing its connection (%s) (%d, %d, %d)", this->client_id, str, rx_status, status, last_pkt_type);
return this->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
this->GetClientName(client_name, lastof(client_name));
@ -1233,7 +1233,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
StringID strid = GetNetworkErrorMsg(errorno);
GetString(str, strid, lastof(str));
DEBUG(net, 2, "'%s' reported an error and is closing its connection (%s) (%d, %d, %d)", client_name, str, rx_status, status, last_pkt_type);
DEBUG(net, 1, "'%s' reported an error and is closing its connection (%s) (%d, %d, %d)", client_name, str, rx_status, status, last_pkt_type);
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, nullptr, strid);
@ -1262,7 +1262,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
return NETWORK_RECV_STATUS_OKAY;
}
}
return this->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_DESYNC_LOG(Packet *p)
@ -1296,7 +1296,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *p)
/* The client was never joined.. thank the client for the packet, but ignore it */
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
return this->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
this->GetClientName(client_name, lastof(client_name));
@ -1311,7 +1311,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *p)
NetworkAdminClientQuit(this->client_id);
return this->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
return this->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
}
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p)
@ -1464,7 +1464,7 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
break;
}
default:
DEBUG(net, 0, "[server] received unknown chat destination type %d. Doing broadcast instead", desttype);
DEBUG(net, 1, "Received unknown chat destination type %d; doing broadcast instead", desttype);
FALLTHROUGH;
case DESTTYPE_BROADCAST:
@ -1547,7 +1547,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet
p->Recv_string(client_name, sizeof(client_name));
ci = this->GetInfo();
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CONN_LOST;
if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
if (ci != nullptr) {
if (!NetworkIsValidClientName(client_name)) {
@ -1588,7 +1588,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
return NETWORK_RECV_STATUS_OKAY;
}
DEBUG(net, 0, "[rcon] client-id %d executed: '%s'", this->client_id, command);
DEBUG(net, 3, "[rcon] Client-id %d executed: %s", this->client_id, command);
_redirect_console_to_client = this->client_id;
IConsoleCmdExec(command);
@ -1613,7 +1613,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p)
/* Incorrect password sent, return! */
if (strcmp(password, _network_company_states[company_id].password) != 0) {
DEBUG(net, 2, "[move] wrong password from client-id #%d for company #%d", this->client_id, company_id + 1);
DEBUG(net, 2, "Wrong password from client-id #%d for company #%d", this->client_id, company_id + 1);
return NETWORK_RECV_STATUS_OKAY;
}
}
@ -1760,7 +1760,7 @@ void NetworkUpdateClientInfo(ClientID client_id)
static void NetworkCheckRestartMap()
{
if (_settings_client.network.restart_game_year != 0 && _cur_year >= _settings_client.network.restart_game_year) {
DEBUG(net, 0, "Auto-restarting map. Year %d reached", _cur_year);
DEBUG(net, 3, "Auto-restarting map: year %d reached", _cur_year);
_settings_newgame.game_creation.generation_seed = GENERATE_NEW_SEED;
switch(_file_to_saveload.abstract_ftype) {

@ -77,7 +77,7 @@ struct UDPSocket {
std::unique_lock<std::mutex> lock(mutex, std::defer_lock);
if (!lock.try_lock()) {
if (++receive_iterations_locked % 32 == 0) {
DEBUG(net, 0, "[udp] %s background UDP loop processing appears to be blocked. Your OS may be low on UDP send buffers.", name.c_str());
DEBUG(net, 0, "%s background UDP loop processing appears to be blocked. Your OS may be low on UDP send buffers.", name.c_str());
}
return;
}
@ -152,7 +152,7 @@ public:
void MasterNetworkUDPSocketHandler::Receive_MASTER_ACK_REGISTER(Packet *p, NetworkAddress *client_addr)
{
_network_advertise_retries = 0;
DEBUG(net, 2, "[udp] advertising on master server successful (%s)", NetworkAddress::AddressFamilyAsString(client_addr->GetAddress()->ss_family));
DEBUG(net, 3, "Advertising on master server successful (%s)", NetworkAddress::AddressFamilyAsString(client_addr->GetAddress()->ss_family));
/* We are advertised, but we don't want to! */
if (!_settings_client.network.server_advertise) NetworkUDPRemoveAdvertise(false);
@ -161,7 +161,7 @@ void MasterNetworkUDPSocketHandler::Receive_MASTER_ACK_REGISTER(Packet *p, Netwo
void MasterNetworkUDPSocketHandler::Receive_MASTER_SESSION_KEY(Packet *p, NetworkAddress *client_addr)
{
_session_key = p->Recv_uint64();
DEBUG(net, 2, "[udp] received new session key from master server (%s)", NetworkAddress::AddressFamilyAsString(client_addr->GetAddress()->ss_family));
DEBUG(net, 6, "Received new session key from master server (%s)", NetworkAddress::AddressFamilyAsString(client_addr->GetAddress()->ss_family));
}
///*** Communication with clients (we are server) ***/
@ -200,7 +200,7 @@ void ServerNetworkUDPSocketHandler::Receive_CLIENT_FIND_SERVER(Packet *p, Networ
/* Let the client know that we are here */
this->SendPacket(&packet, client_addr);
DEBUG(net, 2, "[udp] queried from %s", client_addr->GetHostname());
DEBUG(net, 7, "Queried from %s", client_addr->GetHostname());
}
void ServerNetworkUDPSocketHandler::Reply_CLIENT_FIND_SERVER_extended(Packet *p, NetworkAddress *client_addr, const NetworkServerGameInfo *ngi)
@ -293,6 +293,8 @@ void ServerNetworkUDPSocketHandler::Receive_CLIENT_GET_NEWGRFS(Packet *p, Networ
};
std::vector<GRFInfo> in_reply;
DEBUG(net, 7, "NewGRF data request from %s", client_addr->GetAddressAsString().c_str());
size_t packet_len = 0;
num_grfs = p->Recv_uint8 ();
@ -389,7 +391,7 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE_Common(Packet *p, Ne
/* Just a fail-safe.. should never happen */
if (_network_udp_server) return;
DEBUG(net, 4, "[udp]%s server response from %s", extended ? " extended" : "", NetworkAddressDumper().GetAddressAsString(client_addr));
DEBUG(net, 3, "%s server response from %s", extended ? " extended" : "", NetworkAddressDumper().GetAddressAsString(client_addr));
/* Find next item */
item = NetworkGameListAddItem(client_addr->GetAddressAsString(false));
@ -498,7 +500,7 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_NEWGRFS(Packet *p, NetworkAdd
uint i;
num_grfs = p->Recv_uint8 ();
DEBUG(net, 6, "[udp] newgrf data reply (%u) from %s", num_grfs, NetworkAddressDumper().GetAddressAsString(client_addr));
DEBUG(net, 7, "NewGRF data reply (%u) from %s", num_grfs, NetworkAddressDumper().GetAddressAsString(client_addr));
if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
@ -529,7 +531,7 @@ static void NetworkUDPBroadCast(NetworkUDPSocketHandler *socket)
for (NetworkAddress &addr : _broadcast_list) {
Packet p = PrepareUdpClientFindServerPacket();
DEBUG(net, 4, "[udp] broadcasting to %s", addr.GetHostname());
DEBUG(net, 5, "Broadcasting to %s", addr.GetHostname());
socket->SendPacket(&p, &addr, true, true);
}
@ -549,7 +551,7 @@ void NetworkUDPQueryMasterServer()
std::lock_guard<std::mutex> lock(_udp_client.mutex);
_udp_client.socket->SendPacket(&p, &out_addr, true);
DEBUG(net, 2, "[udp] master server queried at %s", NetworkAddressDumper().GetAddressAsString(&out_addr));
DEBUG(net, 6, "Master server queried at %s", NetworkAddressDumper().GetAddressAsString(&out_addr));
}
/** Find all servers */
@ -558,7 +560,7 @@ void NetworkUDPSearchGame()
/* We are still searching.. */
if (_network_udp_broadcast > 0) return;
DEBUG(net, 0, "[udp] searching server");
DEBUG(net, 3, "Searching server");
NetworkUDPBroadCast(_udp_client.socket);
_network_udp_broadcast = 300; // Stay searching for 300 ticks
@ -569,7 +571,7 @@ void NetworkUDPSearchGame()
*/
static void NetworkUDPRemoveAdvertiseThread()
{
DEBUG(net, 1, "[udp] removing advertise from master server");
DEBUG(net, 3, "Removing advertise from master server");
/* Find somewhere to send */
NetworkAddress out_addr(NETWORK_MASTER_SERVER_HOST, NETWORK_MASTER_SERVER_PORT);
@ -606,22 +608,22 @@ static void NetworkUDPAdvertiseThread()
/* Find somewhere to send */
NetworkAddress out_addr(NETWORK_MASTER_SERVER_HOST, NETWORK_MASTER_SERVER_PORT);
DEBUG(net, 1, "[udp] advertising to master server");
DEBUG(net, 3, "Advertising to master server");
/* Add a bit more messaging when we cannot get a session key */
static byte session_key_retries = 0;
if (_session_key == 0 && session_key_retries++ == 2) {
DEBUG(net, 0, "[udp] advertising to the master server is failing");
DEBUG(net, 0, "[udp] we are not receiving the session key from the server");
DEBUG(net, 0, "[udp] please allow udp packets from %s to you to be delivered", NetworkAddressDumper().GetAddressAsString(&out_addr, false));
DEBUG(net, 0, "[udp] please allow udp packets from you to %s to be delivered", NetworkAddressDumper().GetAddressAsString(&out_addr, false));
DEBUG(net, 0, "Advertising to the master server is failing");
DEBUG(net, 0, " we are not receiving the session key from the server");
DEBUG(net, 0, " please allow udp packets from %s to you to be delivered", NetworkAddressDumper().GetAddressAsString(&out_addr, false));
DEBUG(net, 0, " please allow udp packets from you to %s to be delivered", NetworkAddressDumper().GetAddressAsString(&out_addr, false));
}
if (_session_key != 0 && _network_advertise_retries == 0) {
DEBUG(net, 0, "[udp] advertising to the master server is failing");
DEBUG(net, 0, "[udp] we are not receiving the acknowledgement from the server");
DEBUG(net, 0, "[udp] this usually means that the master server cannot reach us");
DEBUG(net, 0, "[udp] please allow udp and tcp packets to port %u to be delivered", _settings_client.network.server_port);
DEBUG(net, 0, "[udp] please allow udp and tcp packets from port %u to be delivered", _settings_client.network.server_port);
DEBUG(net, 0, "Advertising to the master server is failing");
DEBUG(net, 0, " we are not receiving the acknowledgement from the server");
DEBUG(net, 0, " this usually means that the master server cannot reach us");
DEBUG(net, 0, " please allow udp and tcp packets to port %u to be delivered", _settings_client.network.server_port);
DEBUG(net, 0, " please allow udp and tcp packets from port %u to be delivered", _settings_client.network.server_port);
}
/* Send the packet */
@ -677,7 +679,7 @@ void NetworkUDPInitialize()
/* If not closed, then do it. */
if (_udp_server.socket != nullptr) NetworkUDPClose();
DEBUG(net, 1, "[udp] initializing listeners");
DEBUG(net, 3, "Initializing UDP listeners");
assert(_udp_client.socket == nullptr && _udp_server.socket == nullptr && _udp_master.socket == nullptr);
// std::scoped_lock lock(_udp_client.mutex, _udp_server.mutex, _udp_master.mutex);
@ -719,7 +721,7 @@ void NetworkUDPClose()
_network_udp_server = false;
_network_udp_broadcast = 0;
DEBUG(net, 1, "[udp] closed listeners");
DEBUG(net, 5, "Closed UDP listeners");
}
/** Receive the UDP packets. */

@ -307,7 +307,7 @@ void AirportAnimationTrigger(Station *st, AirpAnimationTrigger trigger, CargoID
{
if (st->airport.tile == INVALID_TILE) return;
TILE_AREA_LOOP(tile, st->airport) {
for (TileIndex tile : st->airport) {
if (st->TileBelongsToAirport(tile)) AirportTileAnimationTrigger(st, tile, trigger, cargo_type);
}
}

@ -287,7 +287,7 @@ bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigge
{
bool ret = true;
uint32 random = Random();
TILE_AREA_LOOP(tile, ind->location) {
for (TileIndex tile : ind->location) {
if (ind->TileBelongsToIndustry(tile)) {
if (StartStopIndustryTileAnimation(tile, iat, random)) {
SB(random, 0, 16, Random());
@ -380,7 +380,7 @@ void TriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger)
void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
{
uint32 reseed_industry = 0;
TILE_AREA_LOOP(tile, ind->location) {
for (TileIndex tile : ind->location) {
if (ind->TileBelongsToIndustry(tile)) {
DoTriggerIndustryTile(tile, trigger, ind, reseed_industry);
}

@ -562,7 +562,7 @@ void TriggerObjectAnimation(Object *o, ObjectAnimationTrigger trigger, const Obj
{
if (!HasBit(spec->animation.triggers, trigger)) return;
TILE_AREA_LOOP(tile, o->location) {
for (TileIndex tile : o->location) {
TriggerObjectTileAnimation(o, tile, trigger, spec);
}
}

@ -739,7 +739,7 @@ void DeallocateSpecFromStation(BaseStation *st, byte specindex)
ETileArea area = ETileArea(st, INVALID_TILE, TA_WHOLE);
/* Check all tiles over the station to check if the specindex is still in use */
TILE_AREA_LOOP(tile, area) {
for (TileIndex tile : area) {
if (st->TileBelongsToRailStation(tile) && GetCustomStationSpecIndex(tile) == specindex) {
return;
}
@ -949,7 +949,7 @@ void TriggerStationAnimation(BaseStation *st, TileIndex tile, StationAnimationTr
ETileArea area = ETileArea(st, tile, tas[trigger]);
/* Check all tiles over the station to check if the specindex is still in use */
TILE_AREA_LOOP(tile, area) {
for (TileIndex tile : area) {
if (st->TileBelongsToRailStation(tile)) {
const StationSpec *ss = GetStationSpec(tile);
if (ss != nullptr && HasBit(ss->animation.triggers, trigger)) {
@ -1005,7 +1005,7 @@ void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigg
uint32 used_triggers = 0;
/* Check all tiles over the station to check if the specindex is still in use */
TILE_AREA_LOOP(tile, area) {
for (TileIndex tile : area) {
if (st->TileBelongsToRailStation(tile)) {
const StationSpec *ss = GetStationSpec(tile);
if (ss == nullptr) continue;

@ -114,7 +114,7 @@ void BuildObject(ObjectType type, TileIndex tile, CompanyID owner, Town *town, u
assert(o->town != nullptr);
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
if (IsWaterTile(t)) ClearNeighbourNonFloodingStates(t);
WaterClass wc = (IsWaterTile(t) ? GetWaterClass(t) : WATER_CLASS_INVALID);
/* Update company infrastructure counts for objects build on canals owned by nobody. */
@ -137,7 +137,7 @@ void BuildObject(ObjectType type, TileIndex tile, CompanyID owner, Town *town, u
static void IncreaseAnimationStage(TileIndex tile)
{
TileArea ta = Object::GetByTile(tile)->location;
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
SetAnimationFrame(t, GetAnimationFrame(t) + 1);
MarkTileDirtyByTile(t, VMDF_NOT_MAP_MODE);
}
@ -223,7 +223,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
int size_x = GB(spec->size, HasBit(view, 0) ? 4 : 0, 4);
int size_y = GB(spec->size, HasBit(view, 0) ? 0 : 4, 4);
TileArea ta(tile, size_x, size_y);
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
if (!IsValidTile(t)) return_cmd_error(STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB); // Might be off the map
}
@ -237,7 +237,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
* some information about the tiles. */
bool allow_water = (spec->flags & (OBJECT_FLAG_BUILT_ON_WATER | OBJECT_FLAG_NOT_ON_LAND)) != 0;
bool allow_ground = (spec->flags & OBJECT_FLAG_NOT_ON_LAND) == 0;
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
if (HasTileWaterGround(t)) {
if (!allow_water) return_cmd_error(STR_ERROR_CAN_T_BUILD_ON_WATER);
if (!IsWaterTile(t)) {
@ -270,7 +270,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
int allowed_z;
if (GetTileSlope(tile, &allowed_z) != SLOPE_FLAT) allowed_z++;
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
uint16 callback = CALLBACK_FAILED;
if (HasBit(spec->callback_mask, CBM_OBJ_SLOPE_CHECK)) {
TileIndex diff = t - tile;
@ -290,7 +290,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (flags & DC_EXEC) {
/* This is basically a copy of the loop above with the exception that we now
* execute the commands and don't check for errors, since that's already done. */
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
if (HasTileWaterGround(t)) {
if (!IsWaterTile(t)) {
DoCommand(t, 0, 0, (flags & ~DC_NO_WATER) | DC_NO_MODIFY_TOWN_RATING, CMD_LANDSCAPE_CLEAR);
@ -305,7 +305,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
/* Finally do a check for bridges. */
if (type < NEW_OBJECT_OFFSET || !_settings_game.construction.allow_grf_objects_under_bridges) {
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
if (IsBridgeAbove(t) && (
!(spec->flags & OBJECT_FLAG_ALLOW_UNDER_BRIDGE) ||
(GetTileMaxZ(t) + spec->height >= GetBridgeHeight(GetSouthernBridgeEnd(t))))) {
@ -588,7 +588,7 @@ static Foundation GetFoundation_Object(TileIndex tile, Slope tileh)
static void ReallyClearObjectTile(Object *o)
{
Object::DecTypeCount(o->type);
TILE_AREA_LOOP(tile_cur, o->location) {
for (TileIndex tile_cur : o->location) {
DeleteNewGRFInspectWindow(GSF_OBJECTS, tile_cur);
MakeWaterKeepingClass(tile_cur, GetTileOwner(tile_cur));

@ -837,7 +837,7 @@ int openttd_main(int argc, char *argv[])
DeterminePaths(argv[0]);
TarScanner::DoScan(TarScanner::BASESET);
if (dedicated) DEBUG(net, 0, "Starting dedicated version %s", _openttd_revision);
if (dedicated) DEBUG(net, 3, "Starting dedicated server, version %s", _openttd_revision);
if (_dedicated_forks && !dedicated) _dedicated_forks = false;
#if defined(UNIX)
@ -1149,7 +1149,7 @@ bool SafeLoad(const std::string &filename, SaveLoadOperation fop, DetailedFileTy
* special cases which make clients desync immediately. So we fall
* back to just generating a new game with the current settings.
*/
DEBUG(net, 0, "Loading game failed, so a new (random) game will be started!");
DEBUG(net, 0, "Loading game failed, so a new (random) game will be started");
MakeNewGame(false, true);
return false;
}
@ -1682,7 +1682,7 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log)
/* Check docking tiles */
TileArea ta;
std::map<TileIndex, bool> docking_tiles;
TILE_AREA_LOOP(tile, st->docking_station) {
for (TileIndex tile : st->docking_station) {
ta.Add(tile);
docking_tiles[tile] = IsDockingTile(tile);
}
@ -1691,7 +1691,7 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log)
CCLOG("station docking mismatch: station %i, company %i, prev: (%X, %u, %u), recalc: (%X, %u, %u)",
st->index, (int)st->owner, ta.tile, ta.w, ta.h, st->docking_station.tile, st->docking_station.w, st->docking_station.h);
}
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (docking_tiles[tile] != IsDockingTile(tile)) {
CCLOG("docking tile mismatch: tile %i", (int)tile);
}

@ -2718,7 +2718,7 @@ static uint16 GetFreeStationPlatforms(StationID st_id)
bool is_free;
TileIndex t2;
uint16 counter = 0;
TILE_AREA_LOOP(t1, st->train_station) {
for (TileIndex t1 : st->train_station) {
if (st->TileBelongsToRailStation(t1)) {
/* We only proceed if this tile is a track tile and the north(-east/-west) end of the platform */
if (IsCompatibleTrainStationTile(t1 + TileOffsByDiagDir(GetRailStationAxis(t1) == AXIS_X ? DIAGDIR_NE : DIAGDIR_NW), t1) || IsStationTileBlocked(t1)) continue;

@ -164,7 +164,7 @@ void CcRoadStop(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2,
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, tile);
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
TileArea roadstop_area(tile, GB(p1, 0, 8), GB(p1, 8, 8));
TILE_AREA_LOOP(cur_tile, roadstop_area) {
for (TileIndex cur_tile : roadstop_area) {
ConnectRoadToStructure(cur_tile, dir);
/* For a drive-through road stop build connecting road for other entrance. */
if (HasBit(p2, 1)) ConnectRoadToStructure(cur_tile, ReverseDiagDir(dir));

@ -639,8 +639,8 @@ bool AfterLoadGame()
if (IsSavegameVersionBefore(SLV_119)) {
_pause_mode = (_pause_mode == 2) ? PM_PAUSED_NORMAL : PM_UNPAUSED;
} else if (_network_dedicated && (_pause_mode & PM_PAUSED_ERROR) != 0) {
DEBUG(net, 0, "The loading savegame was paused due to an error state.");
DEBUG(net, 0, " The savegame cannot be used for multiplayer!");
DEBUG(net, 0, "The loading savegame was paused due to an error state");
DEBUG(net, 0, " This savegame cannot be used for multiplayer");
/* Restore the signals */
ResetSignalHandlers();
return false;

@ -89,7 +89,7 @@ void MoveBuoysToWaypoints()
if (train) {
/* When we make a rail waypoint of the station, convert the map as well. */
TILE_AREA_LOOP(t, train_st) {
for (TileIndex t : train_st) {
if (!IsTileType(t, MP_STATION) || GetStationIndex(t) != index) continue;
SB(_me[t].m6, 3, 3, STATION_WAYPOINT);

@ -186,7 +186,7 @@
if (!HasHeliport(industry_id)) return INVALID_TILE;
const Industry *ind = ::Industry::Get(industry_id);
TILE_AREA_LOOP(tile_cur, ind->location) {
for (TileIndex tile_cur : ind->location) {
if (IsTileType(tile_cur, MP_STATION) && IsOilRig(tile_cur)) {
return tile_cur;
}
@ -208,7 +208,7 @@
if (!HasDock(industry_id)) return INVALID_TILE;
const Industry *ind = ::Industry::Get(industry_id);
TILE_AREA_LOOP(tile_cur, ind->location) {
for (TileIndex tile_cur : ind->location) {
if (IsTileType(tile_cur, MP_STATION) && IsOilRig(tile_cur)) {
return tile_cur;
}

@ -261,11 +261,11 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
case OT_GOTO_STATION: {
const Station *st = ::Station::Get(order->GetDestination());
if (st->train_station.tile != INVALID_TILE) {
TILE_AREA_LOOP(t, st->train_station) {
for (TileIndex t : st->train_station) {
if (st->TileBelongsToRailStation(t)) return t;
}
} else if (st->ship_station.tile != INVALID_TILE) {
TILE_AREA_LOOP(t, st->ship_station) {
for (TileIndex t : st->ship_station) {
if (IsTileType(t, MP_STATION) && (IsDock(t) || IsOilRig(t)) && GetStationIndex(t) == st->index) return t;
}
} else if (st->bus_stops != nullptr) {
@ -273,7 +273,7 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
} else if (st->truck_stops != nullptr) {
return st->truck_stops->xy;
} else if (st->airport.tile != INVALID_TILE) {
TILE_AREA_LOOP(tile, st->airport) {
for (TileIndex tile : st->airport) {
if (st->TileBelongsToAirport(tile) && !::IsHangar(tile)) return tile;
}
}
@ -283,7 +283,7 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
case OT_GOTO_WAYPOINT: {
const Waypoint *wp = ::Waypoint::Get(order->GetDestination());
if (wp->train_station.tile != INVALID_TILE) {
TILE_AREA_LOOP(t, wp->train_station) {
for (TileIndex t : wp->train_station) {
if (wp->TileBelongsToRailStation(t)) return t;
}
}

@ -21,7 +21,7 @@ void ScriptTileList::AddRectangle(TileIndex t1, TileIndex t2)
if (!::IsValidTile(t2)) return;
TileArea ta(t1, t2);
TILE_AREA_LOOP(t, ta) this->AddItem(t);
for (TileIndex t : ta) this->AddItem(t);
}
void ScriptTileList::AddTile(TileIndex tile)
@ -37,7 +37,7 @@ void ScriptTileList::RemoveRectangle(TileIndex t1, TileIndex t2)
if (!::IsValidTile(t2)) return;
TileArea ta(t1, t2);
TILE_AREA_LOOP(t, ta) this->RemoveItem(t);
for (TileIndex t : ta) this->RemoveItem(t);
}
void ScriptTileList::RemoveTile(TileIndex tile)
@ -55,7 +55,7 @@ void ScriptTileList::RemoveTile(TileIndex tile)
*/
static void FillIndustryCatchment(const Industry *i, int radius, BitmapTileArea &bta)
{
TILE_AREA_LOOP(cur_tile, i->location) {
for (TileIndex cur_tile : i->location) {
if (!::IsTileType(cur_tile, MP_INDUSTRY) || ::GetIndustryIndex(cur_tile) != i->index) continue;
int tx = TileX(cur_tile);
@ -156,7 +156,7 @@ ScriptTileList_StationType::ScriptTileList_StationType(StationID station_id, Scr
if ((station_type & ScriptStation::STATION_DOCK) != 0) station_type_value |= (1 << ::STATION_DOCK) | (1 << ::STATION_OILRIG);
TileArea ta(::TileXY(rect->left, rect->top), rect->right - rect->left + 1, rect->bottom - rect->top + 1);
TILE_AREA_LOOP(cur_tile, ta) {
for (TileIndex cur_tile : ta) {
if (!::IsTileType(cur_tile, MP_STATION)) continue;
if (::GetStationIndex(cur_tile) != station_id) continue;
if (!HasBit(station_type_value, ::GetStationType(cur_tile))) continue;

@ -37,6 +37,7 @@ void ScriptConfig::Change(const char *name, int version, bool force_exact_match,
this->SetSetting(item.name, InteractiveRandomRange(item.max_value + 1 - item.min_value) + item.min_value);
}
}
this->AddRandomDeviation();
}
}
@ -52,7 +53,9 @@ ScriptConfig::ScriptConfig(const ScriptConfig *config)
for (const auto &item : config->settings) {
this->settings[stredup(item.first)] = item.second;
}
this->AddRandomDeviation();
/* Virtual functions get called statically in constructors, so make it explicit to remove any confusion. */
this->ScriptConfig::AddRandomDeviation();
}
ScriptConfig::~ScriptConfig()

@ -662,7 +662,7 @@ inline uint32 SmallMapWindow::GetTileColours(const TileArea &ta) const
TileIndex tile = INVALID_TILE; // Position of the most important tile.
TileType et = MP_VOID; // Effective tile type at that position.
TILE_AREA_LOOP(ti, ta) {
for (TileIndex ti : ta) {
TileType ttype = GetTileType(ti);
switch (ttype) {

@ -442,7 +442,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists)
if (!_settings_game.station.serve_neutral_industries && this->industry != nullptr) {
/* Station is associated with an industry, so we only need to deliver to that industry. */
this->catchment_tiles.Initialize(this->industry->location);
TILE_AREA_LOOP(tile, this->industry->location) {
for (TileIndex tile : this->industry->location) {
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == this->industry->index) {
this->catchment_tiles.SetTile(tile);
}
@ -458,7 +458,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists)
/* Loop finding all station tiles */
TileArea ta(TileXY(this->rect.left, this->rect.top), TileXY(this->rect.right, this->rect.bottom));
this->station_tiles = 0;
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (!IsTileType(tile, MP_STATION) || GetStationIndex(tile) != this->index) continue;
this->station_tiles++;
}
@ -470,7 +470,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists)
/* Loop finding all station tiles */
TileArea ta(TileXY(this->rect.left, this->rect.top), TileXY(this->rect.right, this->rect.bottom));
this->station_tiles = 0;
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (!IsTileType(tile, MP_STATION) || GetStationIndex(tile) != this->index) continue;
this->station_tiles++;
@ -480,7 +480,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists)
/* This tile sub-loop doesn't need to test any tiles, they are simply added to the catchment set. */
TileArea ta2 = TileArea(tile, 1, 1).Expand(r);
TILE_AREA_LOOP(tile2, ta2) this->catchment_tiles.SetTile(tile2);
for (TileIndex tile2 : ta2) this->catchment_tiles.SetTile(tile2);
}
/* Search catchment tiles for towns and industries */
@ -606,7 +606,7 @@ CommandCost StationRect::BeforeAddRect(TileIndex tile, int w, int h, StationRect
/* static */ bool StationRect::ScanForStationTiles(StationID st_id, int left_a, int top_a, int right_a, int bottom_a)
{
TileArea ta(TileXY(left_a, top_a), TileXY(right_a, bottom_a));
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (IsTileType(tile, MP_STATION) && GetStationIndex(tile) == st_id) return true;
}

@ -938,7 +938,7 @@ void ForAllStationsAroundTiles(const TileArea &ta, Func func)
uint max_c = _settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED;
max_c += _settings_game.station.catchment_increase;
TileArea ta_ext = TileArea(ta).Expand(max_c);
TILE_AREA_LOOP(tile, ta_ext) {
for (TileIndex tile : ta_ext) {
if (IsTileType(tile, MP_STATION)) seen_stations.insert(GetStationIndex(tile));
}
@ -950,7 +950,7 @@ void ForAllStationsAroundTiles(const TileArea &ta, Func func)
if (!_settings_game.station.serve_neutral_industries && st->industry != nullptr) continue;
/* Test if the tile is within the station's catchment */
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (st->TileIsInCatchment(tile)) {
if (func(st, tile)) break;
}

@ -104,7 +104,7 @@ CommandCost GetStationAround(TileArea ta, StationID closest_station, CompanyID c
ta.Expand(1);
/* check around to see if there are any stations there owned by the company */
TILE_AREA_LOOP(tile_cur, ta) {
for (TileIndex tile_cur : ta) {
if (IsTileType(tile_cur, MP_STATION)) {
StationID t = GetStationIndex(tile_cur);
if (!T::IsValidID(t) || Station::Get(t)->owner != company) continue;
@ -574,7 +574,7 @@ CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad)
/* Loop over all tiles to get the produced cargo of
* everything except industries */
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (IsTileType(tile, MP_INDUSTRY)) industries.insert(GetIndustryIndex(tile));
AddProducedCargo(tile, produced);
}
@ -612,7 +612,7 @@ CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, Cargo
TileArea ta = TileArea(tile, w, h).Expand(rad);
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
/* Ignore industry if it has a neutral station. */
if (!_settings_game.station.serve_neutral_industries && IsTileType(tile, MP_INDUSTRY) && Industry::GetByTile(tile)->neutral_station != nullptr) continue;
@ -992,7 +992,7 @@ static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag fl
const StationSpec *statspec = StationClass::Get(spec_class)->GetSpec(spec_index);
bool slope_cb = statspec != nullptr && HasBit(statspec->callback_mask, CBM_STATION_SLOPE_CHECK);
TILE_AREA_LOOP(tile_cur, tile_area) {
for (TileIndex tile_cur : tile_area) {
CommandCost ret = CheckBuildableTile(tile_cur, invalid_dirs, allowed_z, false, false);
if (ret.Failed()) return ret;
cost.AddCost(ret);
@ -1080,7 +1080,7 @@ static CommandCost CheckFlatLandRoadStop(TileArea tile_area, DoCommandFlag flags
CommandCost cost(EXPENSES_CONSTRUCTION);
int allowed_z = -1;
TILE_AREA_LOOP(cur_tile, tile_area) {
for (TileIndex cur_tile : tile_area) {
CommandCost ret = CheckBuildableTile(cur_tile, invalid_dirs, allowed_z, !is_drive_through, !_settings_game.construction.allow_road_stops_under_bridges);
if (ret.Failed()) return ret;
cost.AddCost(ret);
@ -1630,7 +1630,7 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32
update_reservation_area = TileArea(tile_org, numtracks_orig, 1);
}
TILE_AREA_LOOP(tile, update_reservation_area) {
for (TileIndex tile : update_reservation_area) {
/* Don't even try to make eye candy parts reserved. */
if (IsStationTileBlocked(tile)) continue;
@ -1759,7 +1759,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector<T *> &affected_st
CommandCost error;
/* Do the action for every tile into the area */
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
/* Make sure the specified tile is a rail station */
if (!HasStationTileRail(tile)) continue;
@ -1931,7 +1931,7 @@ CommandCost RemoveRailStation(T *st, DoCommandFlag flags, Money removal_cost)
CommandCost cost(EXPENSES_CONSTRUCTION);
/* clear all areas of the station */
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
/* only remove tiles that are actually train station tiles */
if (st->TileBelongsToRailStation(tile)) {
std::vector<T*> affected_stations; // dummy
@ -2099,7 +2099,7 @@ CommandCost CmdBuildRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
if (flags & DC_EXEC) {
/* Check every tile in the area. */
TILE_AREA_LOOP(cur_tile, roadstop_area) {
for (TileIndex cur_tile : roadstop_area) {
/* Get existing road types and owners before any tile clearing */
RoadType road_rt = MayHaveRoad(cur_tile) ? GetRoadType(cur_tile, RTT_ROAD) : INVALID_ROADTYPE;
RoadType tram_rt = MayHaveRoad(cur_tile) ? GetRoadType(cur_tile, RTT_TRAM) : INVALID_ROADTYPE;
@ -2312,7 +2312,7 @@ CommandCost CmdRemoveRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
CommandCost last_error(STR_ERROR_THERE_IS_NO_STATION);
bool had_success = false;
TILE_AREA_LOOP(cur_tile, roadstop_area) {
for (TileIndex cur_tile : roadstop_area) {
/* Make sure the specified tile is a road stop of the correct type */
if (!IsTileType(cur_tile, MP_STATION) || !IsRoadStop(cur_tile) || (uint32)GetRoadStopType(cur_tile) != GB(p2, 0, 1)) continue;
@ -2462,7 +2462,7 @@ static CommandCost CanRemoveAirport(Station *st, DoCommandFlag flags)
CommandCost cost(EXPENSES_CONSTRUCTION);
TILE_AREA_LOOP(tile_cur, st->airport) {
for (TileIndex tile_cur : st->airport) {
if (!st->TileBelongsToAirport(tile_cur)) continue;
CommandCost ret = EnsureNoVehicleOnGround(tile_cur);
@ -2626,7 +2626,7 @@ CommandCost CmdBuildAirport(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
}
}
TILE_AREA_LOOP(tile_cur, st->airport) {
for (TileIndex tile_cur : st->airport) {
if (IsHangarTile(tile_cur)) OrderBackup::Reset(tile_cur, false);
DeleteAnimatedTile(tile_cur);
DoClearSquare(tile_cur);
@ -2716,7 +2716,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
Town *nearest = AirportGetNearestTown(as, it, dist);
nearest->noise_reached -= GetAirportNoiseLevelForDistance(as, dist);
TILE_AREA_LOOP(tile_cur, st->airport) {
for (TileIndex tile_cur : st->airport) {
DeleteAnimatedTile(tile_cur);
DoClearSquare(tile_cur);
DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur);
@ -4627,7 +4627,7 @@ void UpdateStationDockingTiles(Station *st)
int y1 = std::max<int>(y - 1, 0);
TileArea ta(TileXY(x1, y1), TileXY(x2 - 1, y2 - 1));
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (IsValidTile(tile) && IsPossibleDockingTile(tile)) CheckForDockingTile(tile);
}
}

@ -118,7 +118,7 @@ static void FindStationsAroundSelection()
Station *adjacent = nullptr;
/* Direct loop instead of ForAllStationsAroundTiles as we are not interested in catchment area */
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (IsTileType(tile, MP_STATION) && GetTileOwner(tile) == _local_company) {
Station *st = Station::GetByTile(tile);
if (st == nullptr) continue;
@ -2391,7 +2391,7 @@ static const T *FindStationsNearby(TileArea ta, bool distant_join)
_deleted_stations_nearby.clear();
/* Check the inside, to return, if we sit on another station */
TILE_AREA_LOOP(t, ta) {
for (TileIndex t : ta) {
if (t < MapSize() && IsTileType(t, MP_STATION) && T::IsValidID(GetStationIndex(t))) return T::GetByTile(t);
}

@ -329,7 +329,7 @@ bool FindSubsidyTownCargoRoute()
/* Calculate the produced cargo of houses around town center. */
CargoArray town_cargo_produced;
TileArea ta = TileArea(src_town->xy, 1, 1).Expand(SUBSIDY_TOWN_CARGO_RADIUS);
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (IsTileType(tile, MP_HOUSE)) {
AddProducedCargo(tile, town_cargo_produced);
}
@ -440,7 +440,7 @@ bool FindSubsidyCargoDestination(CargoID cid, SourceType src_type, SourceID src)
/* Calculate cargo acceptance of houses around town center. */
CargoArray town_cargo_accepted;
TileArea ta = TileArea(dst_town->xy, 1, 1).Expand(SUBSIDY_TOWN_CARGO_RADIUS);
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
if (IsTileType(tile, MP_HOUSE)) {
AddAcceptedCargo(tile, town_cargo_accepted, nullptr);
}

@ -1390,7 +1390,7 @@ static const char * const _name_polish_2_o[] = {
"Zakopane",
u8"Szklarska Por\u0119ba",
"Bochnia",
"Golub-Dobrzyn",
u8"Golub-Dobrzy\u0144",
"Chojnice",
"Ostrowiec",
"Otwock",
@ -1484,7 +1484,7 @@ static const char * const _name_polish_2_n[] = {
"Pilzno",
"Przodkowo",
"Strzelno",
"Susz",
"Leszno",
"Jaworzno",
"Choszczno",
"Mogilno",

@ -65,7 +65,7 @@ static void GenerateDesertArea(TileIndex end, TileIndex start)
_generating_world = true;
TileArea ta(start, end);
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
SetTropicZone(tile, (_ctrl_pressed) ? TROPICZONE_NORMAL : TROPICZONE_DESERT);
DoCommandP(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
MarkTileDirtyByTile(tile);
@ -82,7 +82,7 @@ static void GenerateRockyArea(TileIndex end, TileIndex start)
bool success = false;
TileArea ta(start, end);
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
switch (GetTileType(tile)) {
case MP_TREES:
if (GetTreeGround(tile) == TREE_GROUND_SHORE) continue;
@ -494,18 +494,18 @@ static void CommonRaiseLowerBigLand(TileIndex tile, int mode)
if (mode != 0) {
/* Raise land */
h = MAX_TILE_HEIGHT;
TILE_AREA_LOOP(tile2, ta) {
for (TileIndex tile2 : ta) {
h = std::min(h, TileHeight(tile2));
}
} else {
/* Lower land */
h = 0;
TILE_AREA_LOOP(tile2, ta) {
for (TileIndex tile2 : ta) {
h = std::max(h, TileHeight(tile2));
}
}
TILE_AREA_LOOP(tile2, ta) {
for (TileIndex tile2 : ta) {
if (TileHeight(tile2) == h) {
DoCommandP(tile2, SLOPE_N, (uint32)mode, CMD_TERRAFORM_LAND);
}

@ -146,6 +146,24 @@ void OrthogonalTileArea::ClampToMap()
this->h = std::min<int>(this->h, MapSizeY() - TileY(this->tile));
}
/**
* Returns an iterator to the beginning of the tile area.
* @return The OrthogonalTileIterator.
*/
OrthogonalTileIterator OrthogonalTileArea::begin() const
{
return OrthogonalTileIterator(*this);
}
/**
* Returns an iterator to the end of the tile area.
* @return The OrthogonalTileIterator.
*/
OrthogonalTileIterator OrthogonalTileArea::end() const
{
return OrthogonalTileIterator(OrthogonalTileArea());
}
/**
* Create a diagonal tile area from two corners.
* @param start First corner of the area.

@ -15,6 +15,9 @@
#include "map_func.h"
#include <tuple>
template<uint N> class OrthogonalTileIteratorStep;
using OrthogonalTileIterator = class OrthogonalTileIteratorStep<1>;
/** Represents the covered area of e.g. a rail station */
struct OrthogonalTileArea {
TileIndex tile; ///< The base tile of the area
@ -66,6 +69,10 @@ struct OrthogonalTileArea {
{
return std::tie(tile, w, h) == std::tie(other.tile, other.w, other.h);
}
OrthogonalTileIterator begin() const;
OrthogonalTileIterator end() const;
};
/** Represents a diagonal tile area. */
@ -131,6 +138,15 @@ public:
return this->tile;
}
/**
* Get the tile we are currently at.
* @return The tile we are at, or INVALID_TILE when we're done.
*/
inline TileIndex operator *() const
{
return this->tile;
}
/**
* Move ourselves to the next tile in the rectangle on the map.
*/
@ -193,8 +209,6 @@ public:
}
};
using OrthogonalTileIterator = OrthogonalTileIteratorStep<1>;
/** Iterator to iterate over a tile area (rectangle) of the map.
* It prefetches tiles once per row.
*/
@ -293,14 +307,4 @@ public:
}
};
/**
* A loop which iterates over the tiles of a TileArea.
* @param var The name of the variable which contains the current tile.
* This variable will be allocated in this \c for of this loop.
* @param ta The tile area to search over.
*/
#define TILE_AREA_LOOP(var, ta) for (OrthogonalTileIterator var(ta); var != INVALID_TILE; ++var)
#define TILE_AREA_LOOP_STEP(var, ta, N) for (OrthogonalTileIteratorStep<N> var(ta); var != INVALID_TILE; ++var)
#define TILE_AREA_LOOP_WITH_PREFETCH(var, ta) for (OrthogonalPrefetchTileIterator var(ta); var != INVALID_TILE; ++var)
#endif /* TILEAREA_TYPE_H */

@ -2636,7 +2636,7 @@ static inline CommandCost CanBuildHouseHere(TileIndex tile, TownID town, bool no
*/
static inline CommandCost CanBuildHouseHere(const TileArea &ta, TownID town, int maxz, bool noslope)
{
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
CommandCost ret = CanBuildHouseHere(tile, town, noslope);
/* if building on slopes is allowed, there will be flattening foundation (to tile max z) */
if (ret.Succeeded() && GetTileMaxZ(tile) != maxz) ret = CommandCost(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION);

@ -546,7 +546,7 @@ CommandCost CmdPlantTree(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
int limit = (c == nullptr ? INT32_MAX : GB(c->tree_limit, 16, 16));
TileArea ta(tile, p2);
TILE_AREA_LOOP(tile, ta) {
for (TileIndex tile : ta) {
switch (GetTileType(tile)) {
case MP_TREES: {
bool grow_existing_tree_instead = false;

@ -256,7 +256,7 @@ void VideoDriver_Dedicated::MainLoop()
* intro game... */
if (SaveOrLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, BASE_DIR) == SL_ERROR) {
/* Loading failed, pop out.. */
DEBUG(net, 0, "Loading requested map failed, aborting");
DEBUG(net, 0, "Loading requested map failed; closing server.");
return;
} else {
/* We can load this game, so go ahead */

@ -2875,7 +2875,7 @@ static inline TileIndex ViewportMapGetMostSignificantTileType(const Viewport * c
/* Find the most important tile of the area. */
TileIndex result = from_tile;
uint importance = 0;
TILE_AREA_LOOP_WITH_PREFETCH(tile, tile_area) {
for (OrthogonalPrefetchTileIterator tile(tile_area); tile != INVALID_TILE; ++tile) {
const TileType ttype = GetTileType(tile);
const uint tile_importance = _tiletype_importance[ttype];
if (tile_importance > importance) {

@ -1079,7 +1079,7 @@ static void FloodVehicles(TileIndex tile)
if (IsAirportTile(tile)) {
const Station *st = Station::GetByTile(tile);
TILE_AREA_LOOP(tile, st->airport) {
for (TileIndex tile : st->airport) {
if (st->TileBelongsToAirport(tile)) FindFloodVehicle(tile, z);
}

@ -1193,14 +1193,10 @@ void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
*/
void DeleteWindowByClass(WindowClass cls)
{
restart_search:
/* When we find the window to delete, we need to restart the search
* as deleting this window could cascade in deleting (many) others
* anywhere in the z-array */
/* Note: the container remains stable, even when deleting windows. */
for (Window *w : Window::IterateFromBack()) {
if (w->window_class == cls) {
delete w;
goto restart_search;
}
}
}
@ -1213,14 +1209,10 @@ restart_search:
*/
void DeleteCompanyWindows(CompanyID id)
{
restart_search:
/* When we find the window to delete, we need to restart the search
* as deleting this window could cascade in deleting (many) others
* anywhere in the z-array */
/* Note: the container remains stable, even when deleting windows. */
for (Window *w : Window::IterateFromBack()) {
if (w->owner == id) {
delete w;
goto restart_search;
}
}
@ -3406,10 +3398,7 @@ void CallWindowGameTickEvent()
*/
void DeleteNonVitalWindows()
{
restart_search:
/* When we find the window to delete, we need to restart the search
* as deleting this window could cascade in deleting (many) others
* anywhere in the z-array */
/* Note: the container remains stable, even when deleting windows. */
for (const Window *w : Window::IterateFromBack()) {
if (w->window_class != WC_MAIN_WINDOW &&
w->window_class != WC_SELECT_GAME &&
@ -3419,7 +3408,6 @@ restart_search:
(w->flags & WF_STICKY) == 0) { // do not delete windows which are 'pinned'
delete w;
goto restart_search;
}
}
}
@ -3436,14 +3424,10 @@ void DeleteAllNonVitalWindows()
/* Delete every window except for stickied ones, then sticky ones as well */
DeleteNonVitalWindows();
restart_search:
/* When we find the window to delete, we need to restart the search
* as deleting this window could cascade in deleting (many) others
* anywhere in the z-array */
/* Note: the container remains stable, even when deleting windows. */
for (const Window *w : Window::IterateFromBack()) {
if (w->flags & WF_STICKY) {
delete w;
goto restart_search;
}
}
}
@ -3465,14 +3449,10 @@ void DeleteAllMessages()
*/
void DeleteConstructionWindows()
{
restart_search:
/* When we find the window to delete, we need to restart the search
* as deleting this window could cascade in deleting (many) others
* anywhere in the z-array */
/* Note: the container remains stable, even when deleting windows. */
for (const Window *w : Window::IterateFromBack()) {
if (w->window_desc->flags & WDF_CONSTRUCTION) {
delete w;
goto restart_search;
}
}
}

Loading…
Cancel
Save