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
This commit is contained in:
42
.github/workflows/ci-build.yml
vendored
42
.github/workflows/ci-build.yml
vendored
@@ -314,3 +314,45 @@ jobs:
|
|||||||
echo "::group::Build"
|
echo "::group::Build"
|
||||||
cmake --build .
|
cmake --build .
|
||||||
echo "::endgroup::"
|
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)
|
add_compile_options(/Zc:rvalueCast)
|
||||||
|
|
||||||
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
# Enable multi-threaded compilation.
|
add_compile_options(
|
||||||
add_compile_options(/MP)
|
/MP # Enable multi-threaded compilation.
|
||||||
|
/FC # Display the full path of source code files passed to the compiler in diagnostics.
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
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
|
* 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
|
* 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. */
|
* 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() {
|
Module.preRun.push(function() {
|
||||||
|
@@ -213,7 +213,8 @@ TrueTypeFontCache::TrueTypeFontCache(FontSize fs, int pixels) : FontCache(fs), r
|
|||||||
*/
|
*/
|
||||||
TrueTypeFontCache::~TrueTypeFontCache()
|
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) {
|
for (auto &iter : this->font_tables) {
|
||||||
free(iter.second.second);
|
free(iter.second.second);
|
||||||
|
@@ -93,7 +93,7 @@ static void _GenerateWorld()
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
_generating_world = true;
|
_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 */
|
/* 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();
|
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);
|
_random.SetSeed(_settings_game.game_creation.generation_seed);
|
||||||
@@ -197,7 +197,7 @@ static void _GenerateWorld()
|
|||||||
|
|
||||||
ShowNewGRFError();
|
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);
|
DEBUG(desync, 1, "new_map: %08x", _settings_game.game_creation.generation_seed);
|
||||||
|
|
||||||
if (_debug_desync_level > 0) {
|
if (_debug_desync_level > 0) {
|
||||||
@@ -213,7 +213,7 @@ static void _GenerateWorld()
|
|||||||
|
|
||||||
if (_network_dedicated) {
|
if (_network_dedicated) {
|
||||||
/* Exit the game to prevent a return to main menu. */
|
/* 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;
|
_exit_game = true;
|
||||||
} else {
|
} else {
|
||||||
SwitchToMode(_switch_mode);
|
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% */
|
/* Never show steps smaller than 2%, even if it is a mod 5% */
|
||||||
if (_gws.percent <= last_percent + 2) return;
|
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;
|
last_percent = _gws.percent;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@@ -150,7 +150,7 @@ Industry::~Industry()
|
|||||||
|
|
||||||
const bool has_neutral_station = this->neutral_station != nullptr;
|
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 (IsTileType(tile_cur, MP_INDUSTRY)) {
|
||||||
if (GetIndustryIndex(tile_cur) == this->index) {
|
if (GetIndustryIndex(tile_cur) == this->index) {
|
||||||
DeleteNewGRFInspectWindow(GSF_INDUSTRYTILES, tile_cur);
|
DeleteNewGRFInspectWindow(GSF_INDUSTRYTILES, tile_cur);
|
||||||
@@ -165,7 +165,7 @@ Industry::~Industry()
|
|||||||
|
|
||||||
if (has_neutral_station) {
|
if (has_neutral_station) {
|
||||||
/* Remove possible docking tiles */
|
/* Remove possible docking tiles */
|
||||||
TILE_AREA_LOOP(tile_cur, this->location) {
|
for (TileIndex tile_cur : this->location) {
|
||||||
ClearDockingTilesCheckingNeighbours(tile_cur);
|
ClearDockingTilesCheckingNeighbours(tile_cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,7 +174,7 @@ Industry::~Industry()
|
|||||||
TileArea ta = TileArea(this->location.tile, 0, 0).Expand(21);
|
TileArea ta = TileArea(this->location.tile, 0, 0).Expand(21);
|
||||||
|
|
||||||
/* Remove the farmland and convert it to regular tiles over time. */
|
/* 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) &&
|
if (IsTileType(tile_cur, MP_CLEAR) && IsClearGround(tile_cur, CLEAR_FIELDS) &&
|
||||||
GetIndustryIndexOfField(tile_cur) == this->index) {
|
GetIndustryIndexOfField(tile_cur) == this->index) {
|
||||||
SetIndustryIndexOfField(tile_cur, INVALID_INDUSTRY);
|
SetIndustryIndexOfField(tile_cur, INVALID_INDUSTRY);
|
||||||
@@ -1085,7 +1085,7 @@ static void PlantFarmField(TileIndex tile, IndustryID industry)
|
|||||||
|
|
||||||
/* check the amount of bad tiles */
|
/* check the amount of bad tiles */
|
||||||
int count = 0;
|
int count = 0;
|
||||||
TILE_AREA_LOOP(cur_tile, ta) {
|
for (TileIndex cur_tile : ta) {
|
||||||
assert(cur_tile < MapSize());
|
assert(cur_tile < MapSize());
|
||||||
count += IsSuitableForFarmField(cur_tile, false);
|
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;
|
uint field_type = GB(r, 8, 8) * 9 >> 8;
|
||||||
|
|
||||||
/* make field */
|
/* make field */
|
||||||
TILE_AREA_LOOP(cur_tile, ta) {
|
for (TileIndex cur_tile : ta) {
|
||||||
assert(cur_tile < MapSize());
|
assert(cur_tile < MapSize());
|
||||||
if (IsSuitableForFarmField(cur_tile, true)) {
|
if (IsSuitableForFarmField(cur_tile, true)) {
|
||||||
MakeField(cur_tile, field_type, industry);
|
MakeField(cur_tile, field_type, industry);
|
||||||
@@ -1159,7 +1159,7 @@ static bool SearchLumberMillTrees(TileIndex tile, void *user_data)
|
|||||||
static void ChopLumberMillTrees(Industry *i)
|
static void ChopLumberMillTrees(Industry *i)
|
||||||
{
|
{
|
||||||
/* We only want to cut trees if all tiles are completed. */
|
/* 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 (i->TileBelongsToIndustry(tile_cur)) {
|
||||||
if (!IsIndustryCompleted(tile_cur)) return;
|
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;
|
if (TileX(tile) == 0 || TileY(tile) == 0 || GetTileType(tile) == MP_VOID) return false;
|
||||||
|
|
||||||
TileArea ta(tile - TileDiffXY(1, 1), 2, 2);
|
TileArea ta(tile - TileDiffXY(1, 1), 2, 2);
|
||||||
TILE_AREA_LOOP(tile_walk, ta) {
|
for (TileIndex tile_walk : ta) {
|
||||||
uint curh = TileHeight(tile_walk);
|
uint curh = TileHeight(tile_walk);
|
||||||
/* Is the tile clear? */
|
/* Is the tile clear? */
|
||||||
if ((GetTileType(tile_walk) != MP_CLEAR) && (GetTileType(tile_walk) != MP_TREES)) return false;
|
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. */
|
* Perform terraforming as OWNER_TOWN to disable autoslope and town ratings. */
|
||||||
Backup<CompanyID> cur_company(_current_company, OWNER_TOWN, FILE_LINE);
|
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);
|
uint curh = TileHeight(tile_walk);
|
||||||
if (curh != h) {
|
if (curh != h) {
|
||||||
/* This tile needs terraforming. Check if we can do that without
|
/* 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) {
|
if (flags & DC_EXEC) {
|
||||||
/* Terraform the land under the industry */
|
/* Terraform the land under the industry */
|
||||||
TILE_AREA_LOOP(tile_walk, ta) {
|
for (TileIndex tile_walk : ta) {
|
||||||
uint curh = TileHeight(tile_walk);
|
uint curh = TileHeight(tile_walk);
|
||||||
while (curh != h) {
|
while (curh != h) {
|
||||||
/* We give the terraforming for free here, because we can't calculate
|
/* 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)) {
|
if (Industry::GetNumItems() > (size_t) (dmax * dmax * 2)) {
|
||||||
const Industry* i = nullptr;
|
const Industry* i = nullptr;
|
||||||
TileArea tile_area = TileArea(tile, 1, 1).Expand(dmax);
|
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) {
|
if (GetTileType(atile) == MP_INDUSTRY) {
|
||||||
const Industry *i2 = Industry::GetByTile(atile);
|
const Industry *i2 = Industry::GetByTile(atile);
|
||||||
if (i == i2) continue;
|
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_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_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_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_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_SHUTDOWN :{WHITE}El servidor ha tancat la sessió
|
||||||
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}El servidor està reiniciant...{}Espera un moment...
|
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_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_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_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!!
|
############ Leave those lines in this order!!
|
||||||
STR_NETWORK_ERROR_CLIENT_GENERAL :algemene fout
|
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_SPECTATE :*** {STRING} kijkt nu toe
|
||||||
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} heeft een nieuw bedrijf opgericht (nr. {2:NUM})
|
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_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_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_SHUTDOWN :{WHITE}De server heeft de sessie gesloten
|
||||||
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De server wordt opnieuw gestart...{}Wacht alstublieft...
|
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_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_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_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 :{BLACK}Vieraile verkkosivulla
|
||||||
STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Vieraile sisällön verkkosivulla
|
STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Vieraile sisällön verkkosivulla
|
||||||
STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Lataa
|
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_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_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_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!!
|
############ Leave those lines in this order!!
|
||||||
STR_NETWORK_ERROR_CLIENT_GENERAL :Allgemeiner Fehler
|
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_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_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_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_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_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}
|
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
|
############ range for file menu starts
|
||||||
STR_FILE_MENU_SAVE_GAME :게임 저장하기
|
STR_FILE_MENU_SAVE_GAME :게임 저장하기
|
||||||
STR_FILE_MENU_LOAD_GAME :불러오기
|
STR_FILE_MENU_LOAD_GAME :게임 불러오기
|
||||||
STR_FILE_MENU_QUIT_GAME :게임 그만두기
|
STR_FILE_MENU_QUIT_GAME :게임 그만두기
|
||||||
STR_FILE_MENU_SEPARATOR :
|
STR_FILE_MENU_SEPARATOR :
|
||||||
STR_FILE_MENU_EXIT :종료
|
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_LEFT :Pe partea stângă
|
||||||
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Pe partea dreaptă
|
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
|
STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Alege naţionalitatea numelor oraşelor
|
||||||
|
|
||||||
############ start of townname region
|
############ 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_2X_ZOOM :Mărime dublă
|
||||||
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Mărime împătrită
|
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_TOOLTIP :{BLACK}Alege dimensiunea fontului pentru interfață
|
||||||
|
|
||||||
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_AUTO :(auto-detecție)
|
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_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_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_ITEM :{NUM}Hz
|
||||||
STR_GAME_OPTIONS_REFRESH_RATE_WARNING :{WHITE}Ratele de împrospătare de peste 60Hz ar putea afecta performanța.
|
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 :Înălțimea limită a hărții: {STRING}
|
||||||
STR_CONFIG_SETTING_MAP_HEIGHT_LIMIT_VALUE :{NUM}
|
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_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 :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
|
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_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 :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_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_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 :Limita de viteză pentru trecerea timpului: {STRING}
|
||||||
STR_CONFIG_SETTING_FAST_FORWARD_SPEED_LIMIT_VAL :{NUM}% din viteza normală a jocului
|
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_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 :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_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 :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_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}
|
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
|
# Cheat window
|
||||||
STR_CHEATS :{WHITE}Cheat-uri
|
STR_CHEATS :{WHITE}Cheat-uri
|
||||||
STR_CHEATS_TOOLTIP :{BLACK}Bifa vă indică dacă aţi folosit anterior acest cheat
|
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_MONEY :{LTBLUE}Măreşte fondurile cu {CURRENCY_LONG}
|
||||||
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Joacă drept compania: {ORANGE}{COMMA}
|
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Joacă drept compania: {ORANGE}{COMMA}
|
||||||
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Buldozer magic (demolează industrii şi lucruri amovibile): {ORANGE}{STRING}
|
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_EARRING :Cercei:
|
||||||
STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Schimbă cravata sau cerceii
|
STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Schimbă cravata sau cerceii
|
||||||
|
|
||||||
|
STR_NETWORK_SERVER_VISIBILITY_PRIVATE :Privat
|
||||||
|
|
||||||
# Network server list
|
# Network server list
|
||||||
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Multiplayer
|
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_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_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 :{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_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:
|
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
|
STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Companie protejată. Introdu parola
|
||||||
|
|
||||||
# Network company list added strings
|
# 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ă
|
STR_NETWORK_COMPANY_LIST_SPECTATE :Observă
|
||||||
|
|
||||||
# Network client list
|
# 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_SERVER :Server
|
||||||
STR_NETWORK_CLIENT :Client
|
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_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_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_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!!
|
############ Leave those lines in this order!!
|
||||||
STR_NETWORK_ERROR_CLIENT_GENERAL :eroare generală
|
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_SPECTATE :*** {STRING} a intrat ca spectator
|
||||||
STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW :*** {STRING} a început o companie nouă (#{2:NUM})
|
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_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_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_SHUTDOWN :{WHITE}Serverul a închis conexiunea
|
||||||
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Serverul este repornit...{}Vă rugăm aşteptaţi...
|
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!!
|
############ Leave those lines in this order!!
|
||||||
STR_FRAMETIME_CAPTION_GAMELOOP :Buclă de joc
|
STR_FRAMETIME_CAPTION_GAMELOOP :Buclă de joc
|
||||||
STR_FRAMETIME_CAPTION_GL_ECONOMY :Manipularea încărcăturilor
|
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 :Randare grafică
|
||||||
STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Randarea vizorului global
|
STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Randarea vizorului global
|
||||||
STR_FRAMETIME_CAPTION_SOUND :Mixaj de sunet
|
STR_FRAMETIME_CAPTION_SOUND :Mixaj de sunet
|
||||||
|
STR_FRAMETIME_CAPTION_ALLSCRIPTS :Totalul de scripturi GS/AI
|
||||||
STR_FRAMETIME_CAPTION_AI :IA {NUM} {STRING}
|
STR_FRAMETIME_CAPTION_AI :IA {NUM} {STRING}
|
||||||
############ End of leave-in-this-order
|
############ 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_REQUIRES :{BLACK}Necesită:
|
||||||
STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING}
|
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 :{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%)
|
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_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_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_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_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_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
|
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_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_RAILROAD_LOCOMOTIVE :locomotivă
|
||||||
|
STR_ENGINE_PREVIEW_ELRAIL_LOCOMOTIVE :locomotivă electrificată
|
||||||
STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :locomotivă monoşină
|
STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :locomotivă monoşină
|
||||||
STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :locomotivă pernă magnetică
|
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 :{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_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_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_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
|
# Autoreplace window
|
||||||
STR_REPLACE_VEHICLES_WHITE :{WHITE}Înlocuieşte {STRING} - {STRING}
|
STR_REPLACE_VEHICLES_WHITE :{WHITE}Înlocuieşte {STRING} - {STRING}
|
||||||
@@ -3618,6 +3646,7 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Fă opti
|
|||||||
# Vehicle view
|
# Vehicle view
|
||||||
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
|
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_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
|
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_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_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
|
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_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_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_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
|
# Town related errors
|
||||||
STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}Nu pot construi nici un oras
|
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
|
# map menu
|
||||||
STR_MAP_MENU_MAP_OF_WORLD :Mapa sveta
|
STR_MAP_MENU_MAP_OF_WORLD :Mapa sveta
|
||||||
STR_MAP_MENU_EXTRA_VIEWPORT :Ďalší pohľad
|
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
|
STR_MAP_MENU_SIGN_LIST :Zoznam popisov
|
||||||
|
|
||||||
############ range for town menu starts
|
############ range for town menu starts
|
||||||
@@ -632,7 +632,7 @@ STR_MONTH_ABBREV_DEC :Dec
|
|||||||
STR_MONTH_JAN :Január
|
STR_MONTH_JAN :Január
|
||||||
STR_MONTH_FEB :Február
|
STR_MONTH_FEB :Február
|
||||||
STR_MONTH_MAR :Marec
|
STR_MONTH_MAR :Marec
|
||||||
STR_MONTH_APR :April
|
STR_MONTH_APR :Apríl
|
||||||
STR_MONTH_MAY :Máj
|
STR_MONTH_MAY :Máj
|
||||||
STR_MONTH_JUN :Jún
|
STR_MONTH_JUN :Jún
|
||||||
STR_MONTH_JUL :Júl
|
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_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_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_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_BIG_UFO :{BIG_FONT}{BLACK}'UFO' pristálo neďaleko mesta {TOWN}!
|
||||||
STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE :{BIG_FONT}{BLACK}Zaval v uholnej bani nedaleko 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_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!
|
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_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_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_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_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_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%
|
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_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_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_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 !!!
|
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_LEFT :Jazdia naľavo
|
||||||
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Jazdia napravo
|
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
|
STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Výber štýlu názvov miest
|
||||||
|
|
||||||
############ start of townname region
|
############ 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 :{BLACK}Jazyk
|
||||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Výber jazyka rozhrania
|
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 :{BLACK}Celá obrazovka
|
||||||
STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Zaškrtnite, ak chcete hrať OpenTTD na celej obrazovke
|
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_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_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_FRAME :{BLACK}Veľkosť rozhrania
|
||||||
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Výber veľkosti prvkov 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_VARIETY_VERY_HIGH :Veľmi vysoká
|
||||||
|
|
||||||
STR_AI_SPEED_VERY_SLOW :Veľmi pomalé
|
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_MEDIUM :Stredne
|
||||||
STR_AI_SPEED_FAST :Rychle
|
STR_AI_SPEED_FAST :Rýchle
|
||||||
STR_AI_SPEED_VERY_FAST :Veľmi rýchle
|
STR_AI_SPEED_VERY_FAST :Veľmi rýchle
|
||||||
|
|
||||||
STR_SEA_LEVEL_VERY_LOW :Veľmi nízka
|
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 :Vlastná výška
|
||||||
STR_TERRAIN_TYPE_CUSTOM_VALUE :Vlastná výška ({NUM})
|
STR_TERRAIN_TYPE_CUSTOM_VALUE :Vlastná výška ({NUM})
|
||||||
|
|
||||||
STR_CITY_APPROVAL_PERMISSIVE :Pozitivny
|
STR_CITY_APPROVAL_PERMISSIVE :Pozitívny
|
||||||
STR_CITY_APPROVAL_TOLERANT :Tolerantny
|
STR_CITY_APPROVAL_TOLERANT :Tolerantný
|
||||||
STR_CITY_APPROVAL_HOSTILE :Odmietavy
|
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'
|
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_FILTER_TITLE :{BLACK}Filtrovací reťazec:
|
||||||
STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbaliť všetko
|
STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Rozbaliť všetko
|
||||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Zabaliť 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_NO_EXPLANATION_AVAILABLE_HELPTEXT :(nie je dostupné vysvetlenie)
|
||||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Predvolená hodnota: {ORANGE}{STRING}
|
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Predvolená hodnota: {ORANGE}{STRING}
|
||||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Nastavenie typu: {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_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_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_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_CATEGORY :{BLACK}Kategória:
|
||||||
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Typ:
|
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_ORIGINAL :Pôvodné
|
||||||
STR_CONFIG_SETTING_REALISTIC :Realistické
|
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_CENTER :v strede
|
||||||
STR_CONFIG_SETTING_HORIZONTAL_POS_RIGHT :vpravo
|
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 :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_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 :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 :Povoliť 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 :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_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}
|
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_OWN :Vlastná spoločnosť
|
||||||
STR_CONFIG_SETTING_LIVERIES_ALL :Všetky spoločnosti
|
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 :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 :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_SCROLLING_HELPTEXT :Povolí posúvanie pomocou dvoj-dimenzionálnych kolečiek myši
|
||||||
STR_CONFIG_SETTING_SCROLLWHEEL_ZOOM :Priblížovať mapu
|
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 :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_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 :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 :Prednastaviť "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 :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_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é
|
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_MEDIUM :Stredný
|
||||||
STR_CONFIG_SETTING_AI_PROFILE_HARD :{G=m}Ťažký
|
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_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 :#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 :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_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
|
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_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_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 :{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_UNSAFE :nevhodné pre statické použitie
|
||||||
STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :systém NewGRF
|
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_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_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_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é
|
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_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_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_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 :{LTBLUE}Zmeniť 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_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_TEMPERATE_LANDSCAPE :Krajina mierneho pásma
|
||||||
STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subpolárna krajina
|
STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :Subpolárna krajina
|
||||||
STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :Subtropická 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_EARRING :Náušnica:
|
||||||
STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Zmeniť kravatu alebo náušnicu
|
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
|
# Network server list
|
||||||
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Hra pre viac hráčov
|
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_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 :{BLACK}Názov
|
||||||
STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP :{BLACK}Názov hry
|
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_PASSWORD :{SILVER}Heslo:
|
||||||
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVER JE OFFLINE
|
STR_NETWORK_SERVER_LIST_SERVER_OFFLINE :{SILVER}SERVER JE OFFLINE
|
||||||
STR_NETWORK_SERVER_LIST_SERVER_FULL :{SILVER}SERVER JE PLNÝ
|
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_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 :{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 :{BLACK}Prehľadať internet
|
||||||
STR_NETWORK_SERVER_LIST_SEARCH_SERVER_INTERNET_TOOLTIP :{BLACK}Prehľadať verejné servery na internete
|
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_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_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_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 :{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.
|
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_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_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_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_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_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_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 :{BLACK}Nová spoločnosť
|
||||||
STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Založiť 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
|
STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Spoločnosť je chránená. Zadaj heslo
|
||||||
|
|
||||||
# Network company list added strings
|
# 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ť
|
STR_NETWORK_COMPANY_LIST_SPECTATE :Pozorovať
|
||||||
|
|
||||||
# Network client list
|
# 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_SERVER :Server
|
||||||
STR_NETWORK_CLIENT :Klient
|
STR_NETWORK_CLIENT :Klient
|
||||||
@@ -2225,50 +2268,54 @@ STR_NETWORK_CHAT_OSKTITLE :{BLACK}Zadajte
|
|||||||
|
|
||||||
# Network messages
|
# Network messages
|
||||||
STR_NETWORK_ERROR_NOTAVAILABLE :{WHITE}Nebolo nájdené žiadne sieťové zariadenie, alebo je hra kompilovaná bez ENABLE_NETWORK
|
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_NOSERVER :{WHITE}Nebola nájdená žiadna sieťová hra
|
||||||
STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Server neodpoveda na ziadost
|
STR_NETWORK_ERROR_NOCONNECTION :{WHITE}Server neodpovedá na žiadosť
|
||||||
STR_NETWORK_ERROR_NEWGRF_MISMATCH :{WHITE}Pripojenie zlyhalo kvoli nespravnemu NewGRF
|
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_DESYNC :{WHITE}Sieť - Chyba synchronizácie hry
|
||||||
STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Sieť - Stratené spojenie
|
STR_NETWORK_ERROR_LOSTCONNECTION :{WHITE}Sieť - Stratené spojenie
|
||||||
STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Nedokážem nahrať hru zo servera
|
STR_NETWORK_ERROR_SAVEGAMEERROR :{WHITE}Nedokážem nahrať hru zo servera
|
||||||
STR_NETWORK_ERROR_SERVER_START :{WHITE}Server nemôžem spustiť
|
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_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_REVISION :{WHITE}Revizia hry u tohto klienta nezodpoveda revizii hry na serveri.
|
||||||
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Nespravne heslo.
|
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Nesprávne heslo
|
||||||
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Server je plny
|
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Server je plný
|
||||||
STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Si zablokovany na tomto serveri
|
STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Si zabanovaný na tomto serveri
|
||||||
STR_NETWORK_ERROR_KICKED :{WHITE}Bol si vyhodeny z hry
|
STR_NETWORK_ERROR_KICKED :{WHITE}Bol si vyhodený z hry
|
||||||
STR_NETWORK_ERROR_KICK_MESSAGE :{WHITE}Dôvod: {STRING}
|
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_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_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_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_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_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!!
|
############ Leave those lines in this order!!
|
||||||
STR_NETWORK_ERROR_CLIENT_GENERAL :generalna chyba
|
STR_NETWORK_ERROR_CLIENT_GENERAL :všeobecná chyba
|
||||||
STR_NETWORK_ERROR_CLIENT_DESYNC :chyba synchronizacie
|
STR_NETWORK_ERROR_CLIENT_DESYNC :chyba synchronizácie
|
||||||
STR_NETWORK_ERROR_CLIENT_SAVEGAME :nemôžem načítať mapu
|
STR_NETWORK_ERROR_CLIENT_SAVEGAME :nemôžem načítať mapu
|
||||||
STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST :spojenie prerušené
|
STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST :spojenie prerušené
|
||||||
STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR :chyba protokolu
|
STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR :chyba protokolu
|
||||||
STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH :Nespravne NewGRF
|
STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH :Nesprávne NewGRF
|
||||||
STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED :overenie odmietnute
|
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_NOT_EXPECTED :prijatý neplatný, alebo neočakávaný paket
|
||||||
STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :chybna revizia hry
|
STR_NETWORK_ERROR_CLIENT_WRONG_REVISION :chybná verzia hry
|
||||||
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :meno sa uz pouziva
|
STR_NETWORK_ERROR_CLIENT_NAME_IN_USE :meno sa už používa
|
||||||
STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD :nespravne heslo
|
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_COMPANY_MISMATCH :zlá spoločnosť-id in DoCommand
|
||||||
STR_NETWORK_ERROR_CLIENT_KICKED :vyhodený zo servera
|
STR_NETWORK_ERROR_CLIENT_KICKED :vyhodený zo servera
|
||||||
STR_NETWORK_ERROR_CLIENT_CHEATER :sa pokusal cheatovat
|
STR_NETWORK_ERROR_CLIENT_CHEATER :sa pokúšal cheatovať
|
||||||
STR_NETWORK_ERROR_CLIENT_SERVER_FULL :server je plny
|
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_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_PASSWORD :nebolo včas obdržané heslo
|
||||||
STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER :všeobecný timeout
|
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_MAP :sťahovanie mapy trvalo príliš dlho
|
||||||
STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN :spracovanie 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
|
############ End of leave-in-this-order
|
||||||
|
|
||||||
STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}Možná ztráta pripojenia
|
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_CLIENT_LEFT :*** {STRING} opustil hru ({2:STRING})
|
||||||
STR_NETWORK_MESSAGE_NAME_CHANGE :*** {STRING} zmenil/-a svoje meno na {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_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_SERVER_REBOOT :{WHITE}Server sa reštartuje...{}Čakajte prosím...
|
||||||
STR_NETWORK_MESSAGE_KICKED :*** Hráč {STRING} bol vyhodený. Dôvod: ({STRING})
|
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_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Vyberte typ stanice pre vystavbu
|
||||||
|
|
||||||
STR_STATION_CLASS_DFLT :Pôvodná stanica
|
STR_STATION_CLASS_DFLT :Pôvodná stanica
|
||||||
STR_STATION_CLASS_WAYP :Smerove body
|
STR_STATION_CLASS_WAYP :Smerové body
|
||||||
|
|
||||||
# Signal window
|
# Signal window
|
||||||
STR_BUILD_SIGNAL_CAPTION :{WHITE}Výber návestidla
|
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_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_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_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
|
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Zvýšit hustotu návestidiel
|
||||||
|
|
||||||
# Bridge selection window
|
# 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_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_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_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
|
# Ship depot construction window
|
||||||
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Orientácia lodenice
|
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)
|
# Land generation window (SE)
|
||||||
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Generovanie územia
|
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_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_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_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_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Vygenerovať náhodné územie
|
||||||
STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Vytvoriť nový scenár
|
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_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?
|
STR_RESET_LANDSCAPE_CONFIRMATION_TEXT :{WHITE}Ste si istý, že chcete odstrániť všetok majetok spoločnosti?
|
||||||
|
|
||||||
# Town generation window (SE)
|
# 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_NAME_RANDOM_TOOLTIP :{BLACK}Vygenerovať nové náhodné meno
|
||||||
|
|
||||||
STR_FOUND_TOWN_INITIAL_SIZE_TITLE :{YELLOW}Veľkosť mesta:
|
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_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_SIZE_RANDOM :{BLACK}Náhodný
|
||||||
STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Vyber veľkosť mesta
|
STR_FOUND_TOWN_INITIAL_SIZE_TOOLTIP :{BLACK}Vyber veľkosť mesta
|
||||||
STR_FOUND_TOWN_CITY :{BLACK}Veľkomesto
|
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_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_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_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_BUILD_NEW_INDUSTRY :{BLACK}Postaviť
|
||||||
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Založiť
|
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Založiť
|
||||||
STR_FUND_INDUSTRY_REMOVE_ALL_INDUSTRIES :{BLACK}Odstrániť všetok priemysel
|
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_RAILROAD_STATION :Železničná stanica
|
||||||
STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Letecký hangár
|
STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Letecký hangár
|
||||||
STR_LAI_STATION_DESCRIPTION_AIRPORT :Letisko
|
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_BUS_STATION :Stanica
|
||||||
STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Prístav
|
STR_LAI_STATION_DESCRIPTION_SHIP_DOCK :Prístav
|
||||||
STR_LAI_STATION_DESCRIPTION_BUOY :Bója
|
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
|
STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Zmeniť rok začiatku hry
|
||||||
|
|
||||||
# SE Map generation
|
# SE Map generation
|
||||||
STR_SE_MAPGEN_CAPTION :{WHITE}Typ scenara
|
STR_SE_MAPGEN_CAPTION :{WHITE}Typ scenára
|
||||||
STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Rovna krajina
|
STR_SE_MAPGEN_FLAT_WORLD :{WHITE}Rovná krajina
|
||||||
STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Generovať rovnú krajinu
|
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 :{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_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
|
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_FILTER_TITLE :{ORANGE}Filtrovací reťazec:
|
||||||
STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Nahrať vybraný zoznam
|
STR_NEWGRF_SETTINGS_PRESET_LIST_TOOLTIP :{BLACK}Nahrať vybraný zoznam
|
||||||
STR_NEWGRF_SETTINGS_PRESET_SAVE :{BLACK}Uložit 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_SAVE_QUERY :{BLACK}Zadajte názov zoznamu
|
||||||
STR_NEWGRF_SETTINGS_PRESET_DELETE :{BLACK}Vymazat zoznam
|
STR_NEWGRF_SETTINGS_PRESET_DELETE :{BLACK}Vymazať zoznam
|
||||||
STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Vymazat vybraný zoznam
|
STR_NEWGRF_SETTINGS_PRESET_DELETE_TOOLTIP :{BLACK}Vymazať vybraný zoznam
|
||||||
STR_NEWGRF_SETTINGS_ADD :{BLACK}Pridat
|
STR_NEWGRF_SETTINGS_ADD :{BLACK}Pridať
|
||||||
STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Pridat vybraný NewGRF súbor do konfigurácie
|
STR_NEWGRF_SETTINGS_ADD_FILE_TOOLTIP :{BLACK}Pridať vybraný NewGRF súbor do konfigurácie
|
||||||
STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Obnovit zoznam súborov
|
STR_NEWGRF_SETTINGS_RESCAN_FILES :{BLACK}Obnoviť zoznam súborov
|
||||||
STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Obnovit zoznam dostupných NewGRF súborov
|
STR_NEWGRF_SETTINGS_RESCAN_FILES_TOOLTIP :{BLACK}Obnoviť zoznam dostupných NewGRF súborov
|
||||||
STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Odstránit
|
STR_NEWGRF_SETTINGS_REMOVE :{BLACK}Odstrániť
|
||||||
STR_NEWGRF_SETTINGS_REMOVE_TOOLTIP :{BLACK}Odstránit vybraný NewGRF súbor zo zoznamu
|
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 :{BLACK}Vyššie
|
||||||
STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Posunút vybraný NewGRF súbor v zozname 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
|
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_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_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_SHOW_PARAMETERS :{BLACK}Ukázať parametre
|
||||||
STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Prepnúť paletu
|
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_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_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
|
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_ERROR :{RED}Chyba: {SILVER}{STRING}
|
||||||
STR_NEWGRF_ERROR_MSG_FATAL :{RED}Kritická 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_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_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_DOS_OR_WINDOWS :{1:STRING} je pre verziu {STRING} TTD.
|
||||||
STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} je navrhnutý pre použitie s {STRING}
|
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_LOCAL_AUTHORITY_TOOLTIP :{BLACK}Zobraziť informácie o miestnej správe
|
||||||
STR_TOWN_VIEW_RENAME_TOOLTIP :{BLACK}Zmeniť názov mesta
|
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_EXPAND_TOOLTIP :{BLACK}Zväčšiť veľkosť mesta
|
||||||
STR_TOWN_VIEW_DELETE_BUTTON :{BLACK}Vymazať
|
STR_TOWN_VIEW_DELETE_BUTTON :{BLACK}Vymazať
|
||||||
STR_TOWN_VIEW_DELETE_TOOLTIP :{BLACK}Kompletne vymazať toto mesto
|
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_STATION :{YELLOW}{STATION} {STATION_FEATURES}
|
||||||
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
|
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
|
||||||
STR_STATION_LIST_NONE :{YELLOW}- Žiadne -
|
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_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
|
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
|
STR_BUY_VEHICLE_TRAM_VEHICLE_CAPTION :Nové električky
|
||||||
|
|
||||||
############ range for vehicle availability starts
|
############ 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_ROAD_VEHICLE_ALL_CAPTION :Nové cestné vozidlá
|
||||||
STR_BUY_VEHICLE_SHIP_CAPTION :Nové lode
|
STR_BUY_VEHICLE_SHIP_CAPTION :Nové lode
|
||||||
STR_BUY_VEHICLE_AIRCRAFT_CAPTION :Nové lietadlá
|
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_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_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_TRAIN_TOOLTIP :{BLACK}Automaticky nahradiť všetky vlaky v depe
|
||||||
STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Automaticky nahradit všetky vozidlá v garáži
|
STR_DEPOT_AUTOREPLACE_ROAD_VEHICLE_TOOLTIP :{BLACK}Automaticky nahradiť všetky vozidlá v garáži
|
||||||
STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Automaticky nahradit všetky lode v lodenici
|
STR_DEPOT_AUTOREPLACE_SHIP_TOOLTIP :{BLACK}Automaticky nahradiť všetky lode v lodenici
|
||||||
STR_DEPOT_AUTOREPLACE_AIRCRAFT_TOOLTIP :{BLACK}Automaticky nahradit všetky lietadlá v hangári
|
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_TRAIN_NEW_VEHICLES_BUTTON :{BLACK}Nové vlaky
|
||||||
STR_DEPOT_ROAD_VEHICLE_NEW_VEHICLES_BUTTON :{BLACK}Nové vozidlá
|
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_BROKEN_DOWN :{RED}Pokazený
|
||||||
STR_VEHICLE_STATUS_STOPPED :{RED}Zastavené
|
STR_VEHICLE_STATUS_STOPPED :{RED}Zastavené
|
||||||
STR_VEHICLE_STATUS_TRAIN_STOPPING_VEL :{RED}Zastavuje, {VELOCITY}
|
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_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
|
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_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_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_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_SHIP_LIST_TOOLTIP :{BLACK}Vybrať typ nákladu pre loď
|
||||||
STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}Vybrať nový typ nákladu
|
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 :{WHITE}Dostupné {STRING}
|
||||||
STR_AI_LIST_CAPTION_AI :AI
|
STR_AI_LIST_CAPTION_AI :AI
|
||||||
STR_AI_LIST_CAPTION_GAMESCRIPT :Herné skripty
|
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_AUTHOR :{LTBLUE}Autor: {ORANGE}{STRING}
|
||||||
STR_AI_LIST_VERSION :{LTBLUE}Verzia: {ORANGE}{NUM}
|
STR_AI_LIST_VERSION :{LTBLUE}Verzia: {ORANGE}{NUM}
|
||||||
@@ -4305,7 +4353,7 @@ STR_SCREENSHOT_MINIMAP_SCREENSHOT :{BLACK}Snímka
|
|||||||
|
|
||||||
# AI Parameters
|
# AI Parameters
|
||||||
STR_AI_SETTINGS_CAPTION :{WHITE}{STRING} Parametre
|
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_CAPTION_GAMESCRIPT :Skript
|
||||||
STR_AI_SETTINGS_CLOSE :{BLACK}Zavrieť
|
STR_AI_SETTINGS_CLOSE :{BLACK}Zavrieť
|
||||||
STR_AI_SETTINGS_RESET :{BLACK}Resetovať
|
STR_AI_SETTINGS_RESET :{BLACK}Resetovať
|
||||||
@@ -4350,7 +4398,7 @@ STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Odhadova
|
|||||||
|
|
||||||
# Saveload messages
|
# Saveload messages
|
||||||
STR_ERROR_SAVE_STILL_IN_PROGRESS :{WHITE}Ukladanie hry este bezi,{}pockajte prosim na dokoncenie!
|
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_UNABLE_TO_READ_DRIVE :{BLACK}Zariadenie je nečitateľné
|
||||||
STR_ERROR_GAME_SAVE_FAILED :{WHITE}Uloženie hry zlyhalo{}{STRING}
|
STR_ERROR_GAME_SAVE_FAILED :{WHITE}Uloženie hry zlyhalo{}{STRING}
|
||||||
STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Súbor sa nedá vymazať
|
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
|
STR_ERROR_BRIBE_FAILED :{WHITE}Tvoj pokus o podplácanie bol odhalený vyšetrovateľom
|
||||||
|
|
||||||
# Levelling errors
|
# Levelling errors
|
||||||
STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Nemôžeš tu zvýšiť 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ôžeš tu zníž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ôžem tu upraviť 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_EXCAVATION_WOULD_DAMAGE :{WHITE}Vyhĺbenie by poškodilo tunel
|
||||||
STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... už na úrovni mora
|
STR_ERROR_ALREADY_AT_SEA_LEVEL :{WHITE}... už na úrovni mora
|
||||||
STR_ERROR_TOO_HIGH :{WHITE}... príliš vysoko
|
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_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_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_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_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_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_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_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_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_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ť...
|
STR_ERROR_PROTECTED :{WHITE}S akciami tejto spoločnosti nie je zatiaľ možné obchodovať...
|
||||||
|
|
||||||
# Town related errors
|
# Town related errors
|
||||||
STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}Nie je možné postaviť viac miest
|
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_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_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_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_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_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_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_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á
|
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
|
# Station construction related errors
|
||||||
STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Nemôžete tu postaviť železničnú stanicu...
|
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_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_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_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...
|
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_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_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_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...
|
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
|
# Depot related errors
|
||||||
STR_ERROR_CAN_T_BUILD_TRAIN_DEPOT :{WHITE}Nemôžete tu postaviť vlakové depo...
|
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_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_TRAM_DEPOT :{WHITE}Nemôžete tu postaviť električkovú garáž...
|
||||||
STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Nemôžeš tu postaviť lodenicu...
|
STR_ERROR_CAN_T_BUILD_SHIP_DEPOT :{WHITE}Nemôžete tu postaviť lodenicu...
|
||||||
|
|
||||||
STR_ERROR_CAN_T_RENAME_DEPOT :{WHITE}Depo sa nedá premenovať...
|
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_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_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_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_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_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á...
|
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_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_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
|
# Road construction errors
|
||||||
STR_ERROR_MUST_REMOVE_ROAD_FIRST :{WHITE}Najprv treba odstrániť cestu
|
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_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_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_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_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_ROAD :{WHITE}... nenašla sa cesta
|
||||||
STR_ERROR_THERE_IS_NO_TRAMWAY :{WHITE}...nenašla sa električková trať
|
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_ROAD :{WHITE}Nemôžete tu konvertovať cestu...
|
||||||
STR_ERROR_CAN_T_CONVERT_TRAMWAY :{WHITE}Nemôžeš tu konvertovať električkovú trať...
|
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_ROAD :{WHITE}Žiadna použiteľná cesta
|
||||||
STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Žiadna použiteľná električková trať
|
STR_ERROR_NO_SUITABLE_TRAMWAY :{WHITE}Žiadna použiteľná električková trať
|
||||||
STR_ERROR_INCOMPATIBLE_TRAMWAY :{WHITE}... nekompatibilné električkové trate
|
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
|
# Tree related errors
|
||||||
STR_ERROR_TREE_ALREADY_HERE :{WHITE}... strom tu už je
|
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_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
|
# Bridge related errors
|
||||||
STR_ERROR_CAN_T_BUILD_BRIDGE_HERE :{WHITE}Nemôžete tu postaviť most...
|
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
|
STR_ERROR_BRIDGE_THROUGH_MAP_BORDER :{WHITE}Most skončí za okrajom mapy
|
||||||
|
|
||||||
# Tunnel related errors
|
# 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_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_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Tunel musi byť najskôr zbúraný
|
||||||
STR_ERROR_ANOTHER_TUNNEL_IN_THE_WAY :{WHITE}Iný tunel v ceste
|
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_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_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é
|
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_CAN_T_REVERSE_DIRECTION_TRAIN :{WHITE}Nemožno otočiť vlak naopak...
|
||||||
STR_ERROR_TRAIN_START_NO_POWER :Vlak nemá energiu
|
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
|
STR_ERROR_AIRCRAFT_IS_IN_FLIGHT :{WHITE}Lietadlo je vo vzduchu
|
||||||
|
|
||||||
# Order related errors
|
# 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_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_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...
|
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
|
STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE :{WHITE}... lietadlo nemá dostatočný dosah
|
||||||
|
|
||||||
# Timetable related errors
|
# 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_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.
|
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_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_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_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
|
# Translatable comment for OpenTTD's desktop shortcut
|
||||||
STR_DESKTOP_SHORTCUT_COMMENT :Simulátor založený na hre Transport Tycoon Deluxe
|
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_STATUE_1 :{G=z}Socha
|
||||||
STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :{G=z}Fontána
|
STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :{G=z}Fontána
|
||||||
STR_TOWN_BUILDING_NAME_PARK_1 :{G=m}Park
|
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_SHOPS_AND_OFFICES_1 :Obchody a kancelárie
|
||||||
STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1 :Moderná administratívna budova
|
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_WAREHOUSE_1 :{G=m}Sklad
|
||||||
STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Kancelárie
|
STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3 :Kancelárie
|
||||||
STR_TOWN_BUILDING_NAME_STADIUM_1 :{G=m}Stadión
|
STR_TOWN_BUILDING_NAME_STADIUM_1 :{G=m}Štadión
|
||||||
STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Stare domy
|
STR_TOWN_BUILDING_NAME_OLD_HOUSES_1 :Staré domy
|
||||||
STR_TOWN_BUILDING_NAME_COTTAGES_1 :Chaty
|
STR_TOWN_BUILDING_NAME_COTTAGES_1 :Chaty
|
||||||
STR_TOWN_BUILDING_NAME_HOUSES_1 :Domy
|
STR_TOWN_BUILDING_NAME_HOUSES_1 :Domy
|
||||||
STR_TOWN_BUILDING_NAME_FLATS_1 :Byty
|
STR_TOWN_BUILDING_NAME_FLATS_1 :Byty
|
||||||
STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :{G=z}Administrativa
|
STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2 :{G=z}Administratíva
|
||||||
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Obchody a kancelarie
|
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2 :Obchody a kancelárie
|
||||||
STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3 :Obchody a kancelarie
|
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_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_OFFICES_1 :Kancelárie
|
||||||
STR_TOWN_BUILDING_NAME_HOUSES_2 :Domy
|
STR_TOWN_BUILDING_NAME_HOUSES_2 :Domy
|
||||||
STR_TOWN_BUILDING_NAME_CINEMA_1 :{G=s}Kino
|
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_IMPERIAL :{COMMA}{NBSP}mil/s
|
||||||
STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/s
|
STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}km/s
|
||||||
STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}m/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_IMPERIAL :mil/s
|
||||||
STR_UNIT_NAME_VELOCITY_METRIC :km/h
|
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_RANGE :Menzil
|
||||||
STR_SORT_BY_POPULATION :Nüfus
|
STR_SORT_BY_POPULATION :Nüfus
|
||||||
STR_SORT_BY_RATING :Değerlendirme
|
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
|
# 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
|
# Tooltips for the main toolbar
|
||||||
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Oyunu durdur
|
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_WHO_REACHED :{BIG_FONT}{BLACK} {NUM}
|
||||||
STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK} {NUM} senesindeki şirket ligi
|
STR_HIGHSCORE_TOP_COMPANIES_NETWORK_GAME :{BIG_FONT}{BLACK} {NUM} senesindeki şirket ligi
|
||||||
STR_HIGHSCORE_POSITION :{BIG_FONT}{BLACK}{COMMA}.
|
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_ENTREPRENEUR :Girişimci
|
||||||
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Sanayici
|
STR_HIGHSCORE_PERFORMANCE_TITLE_INDUSTRIALIST :Sanayici
|
||||||
STR_HIGHSCORE_PERFORMANCE_TITLE_CAPITALIST :Sermayedar
|
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_ROUGH_LAND :{TINY_FONT}{BLACK}Engebeli Alan
|
||||||
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Çim alan
|
STR_SMALLMAP_LEGENDA_GRASS_LAND :{TINY_FONT}{BLACK}Çim alan
|
||||||
STR_SMALLMAP_LEGENDA_BARE_LAND :{TINY_FONT}{BLACK}Çıplak Arazi
|
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_FIELDS :{TINY_FONT}{BLACK}Meralar
|
||||||
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Ağaçlar
|
STR_SMALLMAP_LEGENDA_TREES :{TINY_FONT}{BLACK}Ağaçlar
|
||||||
STR_SMALLMAP_LEGENDA_ROCKS :{TINY_FONT}{BLACK}Kayalar
|
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_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Son mesajı ya da haberi göster
|
||||||
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
|
STR_STATUSBAR_COMPANY_NAME :{SILVER}- - {COMPANY} - -
|
||||||
STR_STATUSBAR_PAUSED :{YELLOW}* * DURAKLATILDI * *
|
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_AUTOSAVE :{RED}OTOMATİK KAYDET
|
||||||
STR_STATUSBAR_SAVING_GAME :{RED}* * KAYDEDiYOR * *
|
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_CNY :Çin Yuanı (CNY)
|
||||||
STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Doları (HKD)
|
STR_GAME_OPTIONS_CURRENCY_HKD :Hong Kong Doları (HKD)
|
||||||
STR_GAME_OPTIONS_CURRENCY_INR :Hindistan Rupisi (INR)
|
STR_GAME_OPTIONS_CURRENCY_INR :Hindistan Rupisi (INR)
|
||||||
|
STR_GAME_OPTIONS_CURRENCY_IDR :Endonezya Rupiahı (IDR)
|
||||||
STR_GAME_OPTIONS_CURRENCY_MYR :Malezya Ringgiti (MYR)
|
STR_GAME_OPTIONS_CURRENCY_MYR :Malezya Ringgiti (MYR)
|
||||||
############ end of currency region
|
############ end of currency region
|
||||||
|
|
||||||
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Soldan trafik
|
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_LEFT :Soldan trafik
|
||||||
STR_GAME_OPTIONS_ROAD_VEHICLES_DROPDOWN_RIGHT :Sağdan 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
|
STR_GAME_OPTIONS_TOWN_NAMES_DROPDOWN_TOOLTIP :{BLACK}Şehir isimleri için bir tür seçin
|
||||||
|
|
||||||
############ start of townname region
|
############ 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 :{BLACK}Dil
|
||||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Görünen dili seçin
|
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 :{BLACK}Tam ekran
|
||||||
STR_GAME_OPTIONS_FULLSCREEN_TOOLTIP :{BLACK}Tam ekran oynamak için bunu isaretleyin
|
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_OTHER :diğer
|
||||||
STR_GAME_OPTIONS_RESOLUTION_ITEM :{NUM}x{NUM}
|
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_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_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_NORMAL :Normal
|
||||||
STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :İki kat büyük
|
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
|
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 :{BLACK}Yazı boyutu
|
||||||
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :Arayüz boyutunu seç
|
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_NORMAL :Normal
|
||||||
STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Yazı iki kat büyük
|
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_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 :{BLACK}Temel grafik kümesi
|
||||||
STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Kullanılacak temel grafik kümesini seçin
|
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_HILLY :Engebeli
|
||||||
STR_TERRAIN_TYPE_MOUNTAINOUS :Dağlık
|
STR_TERRAIN_TYPE_MOUNTAINOUS :Dağlık
|
||||||
STR_TERRAIN_TYPE_ALPINIST :Alp Meraklısı
|
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_PERMISSIVE :İzne tabi
|
||||||
STR_CITY_APPROVAL_TOLERANT :Töleranslı
|
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_FILTER_TITLE :{BLACK}Süzgeç metni:
|
||||||
STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Tümünü genişlet
|
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_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_NO_EXPLANATION_AVAILABLE_HELPTEXT :(açıklama bulunmamaktadır)
|
||||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Varsayılan değer: {ORANGE}{STRING}
|
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Varsayılan değer: {ORANGE}{STRING}
|
||||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Ayar türü: {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_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_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_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_CATEGORY :{BLACK}Kategori:
|
||||||
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tür:
|
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 :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_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_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 :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
|
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 :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_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 :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 :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_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
|
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_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 :Şirket mali tablosunda grup harcamaları: {STRING}
|
||||||
STR_CONFIG_SETTING_EXPENSES_LAYOUT_HELPTEXT :Şirket harcamaları penceresinin nasıl düzenleneceğini belirle
|
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_FAST_FORWARD_SPEED_LIMIT_ZERO :Limit yok (bilgisayarın izin verdiği maksimum hızda )
|
||||||
|
|
||||||
STR_CONFIG_SETTING_SOUND_TICKER :Kayan haber bandı: {STRING}
|
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_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_VALUE :{NUM}
|
||||||
STR_CONFIG_SETTING_ENDING_YEAR_ZERO :Asla
|
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 :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_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}
|
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 :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_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 :Ana araç çubuğu konumu: {STRING}
|
||||||
STR_CONFIG_SETTING_TOOLBAR_POS_HELPTEXT :Ekranın üst kısmındaki ana araç çubuğunun yatay konumu
|
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_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 :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_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_MIN :4x
|
||||||
STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :2x
|
STR_CONFIG_SETTING_ZOOM_LVL_IN_2X :2x
|
||||||
STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal
|
STR_CONFIG_SETTING_ZOOM_LVL_NORMAL :Normal
|
||||||
STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :2x
|
STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X :2x
|
||||||
STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :4x
|
STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X :4x
|
||||||
STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X :8x
|
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 :Şehirlerin genişleme hızı: {STRING}
|
||||||
STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Şehir büyüme hızı
|
STR_CONFIG_SETTING_TOWN_GROWTH_HELPTEXT :Şehir büyüme hızı
|
||||||
STR_CONFIG_SETTING_TOWN_GROWTH_NONE :Hiçbiri
|
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_IMPERIAL :Imperial (İngiliz ölçü birimleri) (mph)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrik (km/s)
|
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_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 :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.
|
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
|
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
|
# 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
|
# Intro window
|
||||||
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
|
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
|
||||||
@@ -1813,6 +1875,7 @@ STR_INTRO_TRANSLATION :{BLACK}Bu çevi
|
|||||||
|
|
||||||
# Quit window
|
# Quit window
|
||||||
STR_QUIT_CAPTION :{WHITE}Çıkış
|
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_YES :{BLACK}Evet
|
||||||
STR_QUIT_NO :{BLACK}Hayır
|
STR_QUIT_NO :{BLACK}Hayır
|
||||||
|
|
||||||
@@ -1824,6 +1887,7 @@ STR_ABANDON_SCENARIO_QUERY :{YELLOW}Bu sena
|
|||||||
# Cheat window
|
# Cheat window
|
||||||
STR_CHEATS :{WHITE}Hileler
|
STR_CHEATS :{WHITE}Hileler
|
||||||
STR_CHEATS_TOOLTIP :{BLACK}Onay kutuları bu hilenin daha önce kullanılıp kullanmadığını bildirir.
|
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_MONEY :{LTBLUE}Parayı {CURRENCY_LONG} kadar arttır
|
||||||
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Oynanan şirket: {ORANGE}{COMMA}
|
STR_CHEAT_CHANGE_COMPANY :{LTBLUE}Oynanan şirket: {ORANGE}{COMMA}
|
||||||
STR_CHEAT_EXTRA_DYNAMITE :{LTBLUE}Sihirli buldozer (fabrikaları, silinemeyen nesneleri siler): {ORANGE}{STRING}
|
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_EARRING :Küpe:
|
||||||
STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Kravatı veya küpeyi değiştir
|
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
|
# Network server list
|
||||||
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Çok Oyunculu
|
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 :{BLACK}Sunucuyu tazele
|
||||||
STR_NETWORK_SERVER_LIST_REFRESH_TOOLTIP :{BLACK}Sunucu bilgisini 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 :{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_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
|
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_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_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_CLIENTS_SELECT :{BLACK}{NUM} istemci
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Azami istemci sayısı:
|
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
|
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
|
STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Şirket korumalı. Parola girin
|
||||||
|
|
||||||
# Network company list added strings
|
# 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
|
STR_NETWORK_COMPANY_LIST_SPECTATE :Gözlemle
|
||||||
|
|
||||||
# Network client list
|
# 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_SERVER :Sunucu
|
||||||
STR_NETWORK_CLIENT :İstemci
|
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_CLIENT_START :{WHITE}Bağlanamadı
|
||||||
STR_NETWORK_ERROR_TIMEOUT :{WHITE}Bağlantı #{NUM} zaman aşımına uğradı
|
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_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_REVISION :{WHITE}Bu istemcinin revizyonu sunucununki ile aynı değil
|
||||||
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Yanlış parola
|
STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Yanlış parola
|
||||||
STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Sunucu dolu
|
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_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_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_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!!
|
############ Leave those lines in this order!!
|
||||||
STR_NETWORK_ERROR_CLIENT_GENERAL :genel hata
|
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_COMPUTER :genel zamanaşımı
|
||||||
STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP :haritayı indirmek çok uzun sürdü
|
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_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
|
############ End of leave-in-this-order
|
||||||
|
|
||||||
STR_NETWORK_ERROR_CLIENT_GUI_LOST_CONNECTION_CAPTION :{WHITE}Olası bağlantı kaybı
|
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_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_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_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_UNPAUSED :Oyun devam ediyor ({STRING})
|
||||||
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_NOT_ENOUGH_PLAYERS :oyuncu sayısı
|
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_CONNECTING_CLIENTS :istemcilere bağlanıyor
|
||||||
STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL :el ile
|
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_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
|
############ End of leave-in-this-order
|
||||||
STR_NETWORK_MESSAGE_CLIENT_LEAVING :ayrılıyor
|
STR_NETWORK_MESSAGE_CLIENT_LEAVING :ayrılıyor
|
||||||
STR_NETWORK_MESSAGE_CLIENT_JOINED :*** {STRING} oyuna katıldı
|
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_COMPANY_NEW :*** {STRING} yeni bir şirket kurdu (#{2:NUM})
|
||||||
STR_NETWORK_MESSAGE_CLIENT_LEFT :*** {STRING} oyunu terketti ({2:STRING})
|
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_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_SHUTDOWN :{WHITE}Sunucu kapandı
|
||||||
STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}Sunucu baştan başlatılıyor...{}Lütfen bekleyin...
|
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})
|
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_YES_DOWNLOAD :{BLACK}Evet, grafikleri indir
|
||||||
STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Hayır, OpenTTD'den çık
|
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
|
# Transparency settings window
|
||||||
STR_TRANSPARENCY_CAPTION :{WHITE}Şeffaflık Seçenekleri
|
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
|
STR_JOIN_WAYPOINT_CREATE_SPLITTED_WAYPOINT :{YELLOW}Ayrı bir yerimi yap
|
||||||
|
|
||||||
# Generic toolbar
|
# 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
|
# Rail construction toolbar
|
||||||
STR_RAIL_TOOLBAR_RAILROAD_CONSTRUCTION_CAPTION :Demiryolu Yapımı
|
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_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_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_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
|
# Ship depot construction window
|
||||||
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Tersane Yönü
|
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_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_BUTTON :{BLACK}Rastgele Ağaç
|
||||||
STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Haritaya rastgele ağaç dik
|
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)
|
# Land generation window (SE)
|
||||||
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Arazi Yapımı
|
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
|
# Fund new industry window
|
||||||
STR_FUND_INDUSTRY_CAPTION :{WHITE}Yeni fabrika aç
|
STR_FUND_INDUSTRY_CAPTION :{WHITE}Yeni fabrika aç
|
||||||
STR_FUND_INDUSTRY_SELECTION_TOOLTIP :{BLACK}Bu listeden uygun fabrikayı seçin
|
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_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_INDUSTRY_BUILD_COST :{BLACK}Fiyat: {YELLOW}{CURRENCY_LONG}
|
||||||
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Tetkik arama
|
STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY :{BLACK}Tetkik arama
|
||||||
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}İnşa et
|
STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY :{BLACK}İnşa et
|
||||||
STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY :{BLACK}Parayla Yap
|
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
|
# Industry cargoes window
|
||||||
STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION :{WHITE}{STRING} fabrikası için sanayi zinciri
|
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
|
# Land area window
|
||||||
STR_LAND_AREA_INFORMATION_CAPTION :{WHITE}Arazi Bilgisi
|
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_N_A :{BLACK}Temizleme fiyatı: {LTBLUE}Yok
|
||||||
STR_LAND_AREA_INFORMATION_COST_TO_CLEAR :{BLACK}Temizleme fiyatı: {RED}{CURRENCY_LONG}
|
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}
|
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_FILTER_TITLE :{BLACK}Süzgeç dizgesi:
|
||||||
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Dosya Üzerine Yaz
|
STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Dosya Üzerine Yaz
|
||||||
STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Mevcut dosyanın üzerine yazmak istediğinizden emin misiniz?
|
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
|
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_NUMBER_OF_TOWNS :{BLACK}Şehir sayısı:
|
||||||
STR_MAPGEN_DATE :{BLACK}Tarih:
|
STR_MAPGEN_DATE :{BLACK}Tarih:
|
||||||
STR_MAPGEN_NUMBER_OF_INDUSTRIES :{BLACK}Fabrika sayısı:
|
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_HEIGHT :{BLACK}Kar yüksekliği:
|
||||||
STR_MAPGEN_SNOW_LINE_UP :{BLACK}Kar yüksekliğini bir arttır
|
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
|
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_LABEL :{BLACK}Boyut:
|
||||||
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
|
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_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
|
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_ERROR :{RED}Hata: {SILVER}{STRING}
|
||||||
STR_NEWGRF_ERROR_MSG_FATAL :{RED}Ölümcül 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_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_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_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
|
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
|
# Sign window
|
||||||
STR_EDIT_SIGN_CAPTION :{WHITE}Tabelayı değiştir
|
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_NEXT_SIGN_TOOLTIP :{BLACK}Sonraki tabelaya git
|
||||||
STR_EDIT_SIGN_PREVIOUS_SIGN_TOOLTIP :{BLACK}Önceki 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_EXCLUSIVE_TRANSPORT :Ayrıcalıklı nakliyat haklarını satın al
|
||||||
STR_LOCAL_AUTHORITY_ACTION_BRIBE :Belediyeye rüşvet ver
|
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_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.{} 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.{} 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_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_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.{}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 şehirde sadece senin şirketine yolcu ve kargo taşıma izni verir.{} 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}
|
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Yakalanma riskini göze alarak belediyeye rüşvet ver.{}Fiyat: {CURRENCY_LONG}
|
||||||
|
|
||||||
# Goal window
|
# Goal window
|
||||||
STR_GOALS_CAPTION :{WHITE}{COMPANY} Hedefler
|
STR_GOALS_CAPTION :{WHITE}{COMPANY} Hedefler
|
||||||
STR_GOALS_SPECTATOR_CAPTION :{WHITE}Evrensel Amaçlar
|
STR_GOALS_SPECTATOR_CAPTION :{WHITE}Evrensel Amaçlar
|
||||||
STR_GOALS_SPECTATOR :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_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_TEXT :{ORANGE}{STRING}
|
||||||
STR_GOALS_NONE :{ORANGE}- Hiçbiri -
|
STR_GOALS_NONE :{ORANGE}- Hiçbiri -
|
||||||
STR_GOALS_PROGRESS :{ORANGE}{STRING}
|
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
|
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
|
# Goal question window
|
||||||
STR_GOAL_QUESTION_CAPTION_QUESTION :Soru
|
STR_GOAL_QUESTION_CAPTION_QUESTION :{BLACK}Soru
|
||||||
STR_GOAL_QUESTION_CAPTION_INFORMATION :Bilgi
|
STR_GOAL_QUESTION_CAPTION_INFORMATION :{BLACK}Bilgi
|
||||||
STR_GOAL_QUESTION_CAPTION_WARNING :Uyarı
|
STR_GOAL_QUESTION_CAPTION_WARNING :{BLACK}Uyarı
|
||||||
STR_GOAL_QUESTION_CAPTION_ERROR :Hata
|
STR_GOAL_QUESTION_CAPTION_ERROR :{YELLOW}Hata
|
||||||
|
|
||||||
############ Start of Goal Question button list
|
############ Start of Goal Question button list
|
||||||
STR_GOAL_QUESTION_BUTTON_CANCEL :İptal
|
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_BUTTON :{BLACK}Ayrıntılar
|
||||||
STR_COMPANY_VIEW_INFRASTRUCTURE_TOOLTIP :{BLACK}Ayrıntılı altyapı sayılarını göster
|
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_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_BUTTON :{BLACK}Yeni Surat
|
||||||
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Müdür için yeni surat seç
|
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_COMPANY_NAME_QUERY_CAPTION :Şirketin ismi
|
||||||
STR_COMPANY_VIEW_PRESIDENT_S_NAME_QUERY_CAPTION :Yöneticinin 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}?
|
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_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_ALL_TYPES :Tüm kargo türleri
|
||||||
STR_PURCHASE_INFO_NONE :Hiçbiri
|
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_ALL_BUT :Şunlar hariç tümü: {CARGO_LIST}
|
||||||
STR_PURCHASE_INFO_MAX_TE :{BLACK}Aza. Çekim Gücü: {GOLD}{FORCE}
|
STR_PURCHASE_INFO_MAX_TE :{BLACK}Aza. Çekim Gücü: {GOLD}{FORCE}
|
||||||
STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Menzil: {GOLD}{COMMA} kare
|
STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Menzil: {GOLD}{COMMA} kare
|
||||||
@@ -3675,6 +3828,10 @@ STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Otomatik
|
|||||||
# Vehicle view
|
# Vehicle view
|
||||||
STR_VEHICLE_VIEW_CAPTION :{WHITE}{VEHICLE}
|
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_TRAIN_SEND_TO_DEPOT_TOOLTIP :{BLACK}Treni garaja gönder
|
||||||
STR_VEHICLE_VIEW_ROAD_VEHICLE_SEND_TO_DEPOT_TOOLTIP :{BLACK}Aracı 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_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_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
|
# Messages in the start stop button in the vehicle view
|
||||||
STR_VEHICLE_STATUS_LOADING_UNLOADING :{LTBLUE}Yükleme / Boşaltma
|
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_STOP_ORDER :(Dur)
|
||||||
|
|
||||||
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
|
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)
|
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_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_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_MESSAGE_SCREENSHOT_SUCCESSFULLY :{WHITE}Ekran görüntüsü '{STRING}' olarak kaydedildi
|
||||||
STR_ERROR_SCREENSHOT_FAILED :{WHITE}Ekran görüntüsü alınamadı!
|
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_CURRENCY_REQUIRED :{WHITE}... {CURRENCY_LONG} gerekli
|
||||||
STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Kredi ödenemiyor...
|
STR_ERROR_CAN_T_REPAY_LOAN :{WHITE}Kredi ödenemiyor...
|
||||||
STR_ERROR_INSUFFICIENT_FUNDS :{WHITE}Bankadan borç alınan para verilemez...
|
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_BUY_COMPANY :{WHITE}Şirket satın alınamaz...
|
||||||
STR_ERROR_CAN_T_BUILD_COMPANY_HEADQUARTERS :{WHITE}Şirket binasi yapılamaz...
|
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...
|
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_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_NOTHING_TO_DO :{WHITE}Hiçbir otomatik değiştirme/yenileme kuralı uygulanmadı
|
||||||
STR_ERROR_AUTOREPLACE_MONEY_LIMIT :(para yetmedi)
|
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
|
# Rail construction errors
|
||||||
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}İmkansiz ray birleşimi
|
STR_ERROR_IMPOSSIBLE_TRACK_COMBINATION :{WHITE}İmkansiz ray birleşimi
|
||||||
@@ -4681,10 +4848,10 @@ STR_INDUSTRY_NAME_SUGAR_MINE :Şeker Madeni
|
|||||||
##id 0x6000
|
##id 0x6000
|
||||||
STR_SV_EMPTY :
|
STR_SV_EMPTY :
|
||||||
STR_SV_UNNAMED :İsimsiz
|
STR_SV_UNNAMED :İsimsiz
|
||||||
STR_SV_TRAIN_NAME :Tren {COMMA}
|
STR_SV_TRAIN_NAME :Tren #{COMMA}
|
||||||
STR_SV_ROAD_VEHICLE_NAME :Karayolu Aracı {COMMA}
|
STR_SV_ROAD_VEHICLE_NAME :Karayolu Aracı #{COMMA}
|
||||||
STR_SV_SHIP_NAME :Gemi {COMMA}
|
STR_SV_SHIP_NAME :Gemi #{COMMA}
|
||||||
STR_SV_AIRCRAFT_NAME :Uçak {COMMA}
|
STR_SV_AIRCRAFT_NAME :Uçak #{COMMA}
|
||||||
|
|
||||||
STR_SV_STNAME :{STRING}
|
STR_SV_STNAME :{STRING}
|
||||||
STR_SV_STNAME_NORTH :{STRING} Kuzey
|
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_BUOY_NAME_SERIAL :{TOWN} Şamandırası #{COMMA}
|
||||||
STR_FORMAT_COMPANY_NUM :(Company {COMMA})
|
STR_FORMAT_COMPANY_NUM :(Company {COMMA})
|
||||||
STR_FORMAT_GROUP_NAME :Grup {COMMA}
|
STR_FORMAT_GROUP_NAME :Grup {COMMA}
|
||||||
|
STR_FORMAT_GROUP_VEHICLE_NAME :{GROUP} #{COMMA}
|
||||||
STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING.tamlanan}
|
STR_FORMAT_INDUSTRY_NAME :{TOWN} {STRING.tamlanan}
|
||||||
STR_FORMAT_WAYPOINT_NAME :Yerimi {TOWN}
|
STR_FORMAT_WAYPOINT_NAME :Yerimi {TOWN}
|
||||||
STR_FORMAT_WAYPOINT_NAME_SERIAL :Yerimi {TOWN} #{COMMA}
|
STR_FORMAT_WAYPOINT_NAME_SERIAL :Yerimi {TOWN} #{COMMA}
|
||||||
|
@@ -14,8 +14,6 @@
|
|||||||
|
|
||||||
#include "../../safeguards.h"
|
#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
|
* Get the hostname; in case it wasn't given the
|
||||||
* IPv4 dotted representation is given.
|
* IPv4 dotted representation is given.
|
||||||
@@ -316,82 +314,6 @@ SOCKET NetworkAddress::Resolve(int family, int socktype, int flags, SocketList *
|
|||||||
return sock;
|
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.
|
* Helper function to resolve a listening.
|
||||||
* @param runp information about the socket to try not
|
* @param runp information about the socket to try not
|
||||||
@@ -399,49 +321,52 @@ SOCKET NetworkAddress::Connect()
|
|||||||
*/
|
*/
|
||||||
static SOCKET ListenLoopProc(addrinfo *runp)
|
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();
|
std::string address = NetworkAddress(runp->ai_addr, (int)runp->ai_addrlen).GetAddressAsString();
|
||||||
|
|
||||||
SOCKET sock = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol);
|
SOCKET sock = socket(runp->ai_family, runp->ai_socktype, runp->ai_protocol);
|
||||||
if (sock == INVALID_SOCKET) {
|
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;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (runp->ai_socktype == SOCK_STREAM && !SetNoDelay(sock)) {
|
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;
|
int on = 1;
|
||||||
/* The (const char*) cast is needed for windows!! */
|
/* The (const char*) cast is needed for windows!! */
|
||||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&on, sizeof(on)) == -1) {
|
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__
|
#ifndef __OS2__
|
||||||
if (runp->ai_family == AF_INET6 &&
|
if (runp->ai_family == AF_INET6 &&
|
||||||
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&on, sizeof(on)) == -1) {
|
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
|
#endif
|
||||||
|
|
||||||
if (bind(sock, runp->ai_addr, (int)runp->ai_addrlen) != 0) {
|
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);
|
closesocket(sock);
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (runp->ai_socktype != SOCK_DGRAM && listen(sock, 1) != 0) {
|
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);
|
closesocket(sock);
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Connection succeeded */
|
/* 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;
|
return sock;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -496,3 +421,16 @@ void NetworkAddress::Listen(int socktype, SocketList *sockets)
|
|||||||
default: return "unsupported";
|
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;
|
return this->CompareTo(address) < 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOCKET Connect();
|
|
||||||
void Listen(int socktype, SocketList *sockets);
|
void Listen(int socktype, SocketList *sockets);
|
||||||
|
|
||||||
static const char *SocketTypeAsString(int socktype);
|
static const char *SocketTypeAsString(int socktype);
|
||||||
static const char *AddressFamilyAsString(int family);
|
static const char *AddressFamilyAsString(int family);
|
||||||
|
static const std::string GetPeerName(SOCKET sock);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -27,9 +27,9 @@ bool NetworkCoreInitialize()
|
|||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
{
|
{
|
||||||
WSADATA wsa;
|
WSADATA wsa;
|
||||||
DEBUG(net, 3, "[core] loading windows socket library");
|
DEBUG(net, 5, "Loading windows socket library");
|
||||||
if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) {
|
if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0) {
|
||||||
DEBUG(net, 0, "[core] WSAStartup failed, network unavailable");
|
DEBUG(net, 0, "WSAStartup failed, network unavailable");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,16 +20,17 @@ void NetworkCoreShutdown();
|
|||||||
|
|
||||||
/** Status of a network client; reasons why a client has quit */
|
/** Status of a network client; reasons why a client has quit */
|
||||||
enum NetworkRecvStatus {
|
enum NetworkRecvStatus {
|
||||||
NETWORK_RECV_STATUS_OKAY, ///< Everything is okay
|
NETWORK_RECV_STATUS_OKAY, ///< Everything is okay.
|
||||||
NETWORK_RECV_STATUS_DESYNC, ///< A desync did occur
|
NETWORK_RECV_STATUS_DESYNC, ///< A desync did occur.
|
||||||
NETWORK_RECV_STATUS_NEWGRF_MISMATCH, ///< We did not have the required NewGRFs
|
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_SAVEGAME, ///< Something went wrong (down)loading the savegame.
|
||||||
NETWORK_RECV_STATUS_CONN_LOST, ///< The connection is 'just' lost
|
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_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_ERROR, ///< The server told us we made an error.
|
||||||
NETWORK_RECV_STATUS_SERVER_FULL, ///< The server is full
|
NETWORK_RECV_STATUS_SERVER_FULL, ///< The server is full.
|
||||||
NETWORK_RECV_STATUS_SERVER_BANNED, ///< The server has banned us
|
NETWORK_RECV_STATUS_SERVER_BANNED, ///< The server has banned us.
|
||||||
NETWORK_RECV_STATUS_CLOSE_QUERY, ///< Done querying the server
|
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 */
|
/** Forward declaration due to circular dependencies */
|
||||||
@@ -45,10 +46,7 @@ public:
|
|||||||
NetworkSocketHandler() { this->has_quit = false; }
|
NetworkSocketHandler() { this->has_quit = false; }
|
||||||
|
|
||||||
/** Close the socket when destructing the socket handler */
|
/** Close the socket when destructing the socket handler */
|
||||||
virtual ~NetworkSocketHandler() { this->Close(); }
|
virtual ~NetworkSocketHandler() {}
|
||||||
|
|
||||||
/** Really close the socket */
|
|
||||||
virtual void Close() {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the current connection; for TCP this will be mostly equivalent
|
* Close the current connection; for TCP this will be mostly equivalent
|
||||||
|
@@ -52,7 +52,7 @@ const char *GetNetworkRevisionString()
|
|||||||
|
|
||||||
/* Tag names are not mangled further. */
|
/* Tag names are not mangled further. */
|
||||||
if (_openttd_revision_tagged) {
|
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;
|
return network_revision;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ const char *GetNetworkRevisionString()
|
|||||||
/* Replace the git hash in revision string. */
|
/* Replace the git hash in revision string. */
|
||||||
strecpy(network_revision + hashofs, githash_suffix, network_revision + NETWORK_REVISION_LENGTH);
|
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
|
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;
|
return network_revision;
|
||||||
|
@@ -39,14 +39,14 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // BE
|
|||||||
int sock = socket(AF_INET, SOCK_DGRAM, 0);
|
int sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
|
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
DEBUG(net, 0, "[core] error creating socket");
|
DEBUG(net, 0, "Could not create socket: %s", NetworkError::GetLast().AsString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *output_pointer = nullptr;
|
char *output_pointer = nullptr;
|
||||||
int output_length = _netstat(sock, &output_pointer, 1);
|
int output_length = _netstat(sock, &output_pointer, 1);
|
||||||
if (output_length < 0) {
|
if (output_length < 0) {
|
||||||
DEBUG(net, 0, "[core] error running _netstat");
|
DEBUG(net, 0, "Error running _netstat()");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,6 +205,6 @@ void NetworkFindBroadcastIPs(NetworkAddressList *broadcast)
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
for (NetworkAddress &addr : *broadcast) {
|
for (NetworkAddress &addr : *broadcast) {
|
||||||
addr.SetPort(NETWORK_DEFAULT_PORT);
|
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()
|
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);
|
if (this->sock != INVALID_SOCKET) closesocket(this->sock);
|
||||||
this->sock = INVALID_SOCKET;
|
this->sock = INVALID_SOCKET;
|
||||||
@@ -118,7 +119,7 @@ SendPacketsState NetworkTCPSocketHandler::SendPackets(bool closing_down)
|
|||||||
if (!err.WouldBlock()) {
|
if (!err.WouldBlock()) {
|
||||||
/* Something went wrong.. close client! */
|
/* Something went wrong.. close client! */
|
||||||
if (!closing_down) {
|
if (!closing_down) {
|
||||||
DEBUG(net, 0, "send failed with error %s", err.AsString());
|
DEBUG(net, 0, "Send failed: %s", err.AsString());
|
||||||
this->CloseConnection();
|
this->CloseConnection();
|
||||||
}
|
}
|
||||||
return SPS_CLOSED;
|
return SPS_CLOSED;
|
||||||
@@ -168,7 +169,7 @@ std::unique_ptr<Packet> NetworkTCPSocketHandler::ReceivePacket()
|
|||||||
NetworkError err = NetworkError::GetLast();
|
NetworkError err = NetworkError::GetLast();
|
||||||
if (!err.WouldBlock()) {
|
if (!err.WouldBlock()) {
|
||||||
/* Something went wrong... */
|
/* 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();
|
this->CloseConnection();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -197,7 +198,7 @@ std::unique_ptr<Packet> NetworkTCPSocketHandler::ReceivePacket()
|
|||||||
NetworkError err = NetworkError::GetLast();
|
NetworkError err = NetworkError::GetLast();
|
||||||
if (!err.WouldBlock()) {
|
if (!err.WouldBlock()) {
|
||||||
/* Something went wrong... */
|
/* 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();
|
this->CloseConnection();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@@ -15,9 +15,12 @@
|
|||||||
#include "address.h"
|
#include "address.h"
|
||||||
#include "packet.h"
|
#include "packet.h"
|
||||||
|
|
||||||
#include <deque>
|
|
||||||
#include <memory>
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <deque>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
/** The states of sending the packets. */
|
/** The states of sending the packets. */
|
||||||
enum SendPacketsState {
|
enum SendPacketsState {
|
||||||
@@ -73,23 +76,44 @@ public:
|
|||||||
*/
|
*/
|
||||||
class TCPConnecter {
|
class TCPConnecter {
|
||||||
private:
|
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)
|
* The current status of the connecter.
|
||||||
bool killed; ///< Whether we got killed
|
*
|
||||||
SOCKET sock; ///< The socket we're connecting with
|
* 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.
|
||||||
|
};
|
||||||
|
|
||||||
void Connect();
|
std::thread resolve_thread; ///< Thread used during resolving.
|
||||||
|
std::atomic<Status> status = Status::INIT; ///< The current status of the connecter.
|
||||||
|
|
||||||
static void ThreadEntry(TCPConnecter *param);
|
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.
|
||||||
|
|
||||||
protected:
|
std::vector<SOCKET> sockets; ///< Pending connect() attempts.
|
||||||
/** Address we're connecting to */
|
std::chrono::steady_clock::time_point last_attempt; ///< Time we last tried to connect.
|
||||||
NetworkAddress address;
|
|
||||||
|
std::string connection_string; ///< Current address we are connecting to (before resolving).
|
||||||
|
|
||||||
|
void Resolve();
|
||||||
|
void OnResolved(addrinfo *ai);
|
||||||
|
bool TryNextAddress();
|
||||||
|
void Connect(addrinfo *address);
|
||||||
|
bool CheckActivity();
|
||||||
|
|
||||||
|
static void ResolveThunk(TCPConnecter *connecter);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TCPConnecter(const std::string &connection_string, uint16 default_port);
|
TCPConnecter(const std::string &connection_string, uint16 default_port);
|
||||||
/** Silence the warnings */
|
virtual ~TCPConnecter();
|
||||||
virtual ~TCPConnecter() {}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback when the connection succeeded.
|
* Callback when the connection succeeded.
|
||||||
|
@@ -41,7 +41,7 @@ NetworkAdminSocketHandler::~NetworkAdminSocketHandler()
|
|||||||
NetworkRecvStatus NetworkAdminSocketHandler::CloseConnection(bool error)
|
NetworkRecvStatus NetworkAdminSocketHandler::CloseConnection(bool error)
|
||||||
{
|
{
|
||||||
delete this;
|
delete this;
|
||||||
return NETWORK_RECV_STATUS_CONN_LOST;
|
return NETWORK_RECV_STATUS_CLIENT_QUIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,9 +93,9 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
if (this->HasClientQuit()) {
|
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 {
|
} 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();
|
this->CloseConnection();
|
||||||
@@ -128,7 +128,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::ReceivePackets()
|
|||||||
*/
|
*/
|
||||||
NetworkRecvStatus NetworkAdminSocketHandler::ReceiveInvalidPacket(PacketAdminType type)
|
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;
|
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,6 +15,8 @@
|
|||||||
#include "tcp.h"
|
#include "tcp.h"
|
||||||
#include "../network_internal.h"
|
#include "../network_internal.h"
|
||||||
|
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
#include "../../safeguards.h"
|
#include "../../safeguards.h"
|
||||||
|
|
||||||
/** List of connections that are currently being created */
|
/** 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
|
* Create a new connecter for the given address
|
||||||
* @param connection_string the address to connect to
|
* @param connection_string the address to connect to
|
||||||
*/
|
*/
|
||||||
TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_port) :
|
TCPConnecter::TCPConnecter(const std::string &connection_string, uint16 default_port)
|
||||||
connected(false),
|
|
||||||
aborted(false),
|
|
||||||
killed(false),
|
|
||||||
sock(INVALID_SOCKET)
|
|
||||||
{
|
{
|
||||||
this->address = ParseConnectionString(connection_string, default_port);
|
this->connection_string = NormalizeConnectionString(connection_string, default_port);
|
||||||
|
|
||||||
_tcp_connecters.push_back(this);
|
_tcp_connecters.push_back(this);
|
||||||
if (!StartNewThread(nullptr, "ottd:tcp", &TCPConnecter::ThreadEntry, this)) {
|
|
||||||
this->Connect();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The actual connection function */
|
TCPConnecter::~TCPConnecter()
|
||||||
void TCPConnecter::Connect()
|
|
||||||
{
|
{
|
||||||
this->sock = this->address.Connect();
|
if (this->resolve_thread.joinable()) {
|
||||||
if (this->sock == INVALID_SOCKET) {
|
this->resolve_thread.join();
|
||||||
this->aborted = true;
|
|
||||||
} else {
|
|
||||||
this->connected = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto &socket : this->sockets) {
|
||||||
|
closesocket(socket);
|
||||||
|
}
|
||||||
|
this->sockets.clear();
|
||||||
|
this->sock_to_address.clear();
|
||||||
|
|
||||||
|
freeaddrinfo(this->ai);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry point for the new threads.
|
* Start a connection to the indicated address.
|
||||||
* @param param the TCPConnecter instance to call Connect on.
|
* @param address The address to connection to.
|
||||||
*/
|
*/
|
||||||
/* static */ void TCPConnecter::ThreadEntry(TCPConnecter *param)
|
void TCPConnecter::Connect(addrinfo *address)
|
||||||
{
|
{
|
||||||
param->Connect();
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thunk to start Resolve() on the right instance.
|
||||||
|
*/
|
||||||
|
/* static */ void TCPConnecter::ResolveThunk(TCPConnecter *connecter)
|
||||||
|
{
|
||||||
|
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 */) {
|
for (auto iter = _tcp_connecters.begin(); iter < _tcp_connecters.end(); /* nothing */) {
|
||||||
TCPConnecter *cur = *iter;
|
TCPConnecter *cur = *iter;
|
||||||
const bool connected = cur->connected.load();
|
|
||||||
const bool aborted = cur->aborted.load();
|
if (cur->CheckActivity()) {
|
||||||
if ((connected || aborted) && cur->killed) {
|
|
||||||
iter = _tcp_connecters.erase(iter);
|
iter = _tcp_connecters.erase(iter);
|
||||||
if (cur->sock != INVALID_SOCKET) closesocket(cur->sock);
|
|
||||||
delete cur;
|
delete cur;
|
||||||
continue;
|
} else {
|
||||||
|
iter++;
|
||||||
}
|
}
|
||||||
if (connected) {
|
|
||||||
iter = _tcp_connecters.erase(iter);
|
|
||||||
cur->OnConnect(cur->sock);
|
|
||||||
delete cur;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (aborted) {
|
|
||||||
iter = _tcp_connecters.erase(iter);
|
|
||||||
cur->OnFailure();
|
|
||||||
delete cur;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
iter++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Kill all connection attempts. */
|
/** Kill all connection attempts. */
|
||||||
/* static */ void TCPConnecter::KillAll()
|
/* 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);
|
return ::GetTextfile(type, GetContentInfoSubDir(this->type), tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkContentSocketHandler::Close()
|
/**
|
||||||
|
* Close the actual socket.
|
||||||
|
*/
|
||||||
|
void NetworkContentSocketHandler::CloseSocket()
|
||||||
{
|
{
|
||||||
CloseConnection();
|
|
||||||
if (this->sock == INVALID_SOCKET) return;
|
if (this->sock == INVALID_SOCKET) return;
|
||||||
|
|
||||||
closesocket(this->sock);
|
closesocket(this->sock);
|
||||||
@@ -167,9 +169,9 @@ bool NetworkContentSocketHandler::HandlePacket(Packet *p)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
if (this->HasClientQuit()) {
|
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 {
|
} else {
|
||||||
DEBUG(net, 0, "[tcp/content] received illegal packet");
|
DEBUG(net, 0, "[tcp/content] Received illegal packet");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -219,7 +221,7 @@ bool NetworkContentSocketHandler::ReceivePackets()
|
|||||||
*/
|
*/
|
||||||
bool NetworkContentSocketHandler::ReceiveInvalidPacket(PacketContentType type)
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
/** Base socket handler for all Content TCP sockets */
|
/** Base socket handler for all Content TCP sockets */
|
||||||
class NetworkContentSocketHandler : public NetworkTCPSocketHandler {
|
class NetworkContentSocketHandler : public NetworkTCPSocketHandler {
|
||||||
protected:
|
protected:
|
||||||
void Close() override;
|
void CloseSocket();
|
||||||
|
|
||||||
bool ReceiveInvalidPacket(PacketContentType type);
|
bool ReceiveInvalidPacket(PacketContentType type);
|
||||||
|
|
||||||
@@ -128,7 +128,11 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** On destructing of this class, the socket needs to be closed */
|
/** 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();
|
bool ReceivePackets();
|
||||||
};
|
};
|
||||||
|
@@ -102,7 +102,7 @@ NetworkGameSocketHandler::NetworkGameSocketHandler(SOCKET s) : info(nullptr), cl
|
|||||||
*/
|
*/
|
||||||
NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error)
|
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 */
|
/* Clients drop back to the main menu */
|
||||||
if (!_network_server && _networking) {
|
if (!_network_server && _networking) {
|
||||||
@@ -112,10 +112,10 @@ NetworkRecvStatus NetworkGameSocketHandler::CloseConnection(bool error)
|
|||||||
_networking = false;
|
_networking = false;
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, WL_CRITICAL);
|
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();
|
this->CloseConnection();
|
||||||
|
|
||||||
if (this->HasClientQuit()) {
|
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 {
|
} 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;
|
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
}
|
}
|
||||||
@@ -223,7 +223,7 @@ NetworkRecvStatus NetworkGameSocketHandler::ReceivePackets()
|
|||||||
*/
|
*/
|
||||||
NetworkRecvStatus NetworkGameSocketHandler::ReceiveInvalidPacket(PacketGameType type)
|
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;
|
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;
|
size_t bufferSize = strlen(url) + strlen(host) + strlen(_openttd_revision) + (data == nullptr ? 0 : strlen(data)) + 128;
|
||||||
char *buffer = AllocaM(char, bufferSize);
|
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) {
|
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);
|
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 {
|
} else {
|
||||||
@@ -85,7 +85,7 @@ NetworkRecvStatus NetworkHTTPSocketHandler::CloseConnection(bool error)
|
|||||||
* Helper to simplify the error handling.
|
* Helper to simplify the error handling.
|
||||||
* @param msg the error message to show.
|
* @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 NEWLINE = "\r\n"; ///< End of line marker
|
||||||
static const char * const END_OF_HEADER = "\r\n\r\n"; ///< End of header 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 */
|
/* We expect a HTTP/1.[01] reply */
|
||||||
if (strncmp(this->recv_buffer, HTTP_1_0, strlen(HTTP_1_0)) != 0 &&
|
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) {
|
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);
|
char *status = this->recv_buffer + strlen(HTTP_1_0);
|
||||||
@@ -121,7 +121,7 @@ int NetworkHTTPSocketHandler::HandleHeader()
|
|||||||
|
|
||||||
/* Get the length of the document to receive */
|
/* Get the length of the document to receive */
|
||||||
char *length = strcasestr(this->recv_buffer, CONTENT_LENGTH);
|
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 */
|
/* Skip the header */
|
||||||
length += strlen(CONTENT_LENGTH);
|
length += strlen(CONTENT_LENGTH);
|
||||||
@@ -139,9 +139,9 @@ int NetworkHTTPSocketHandler::HandleHeader()
|
|||||||
/* Make sure we're going to download at least something;
|
/* Make sure we're going to download at least something;
|
||||||
* zero sized files are, for OpenTTD's purposes, always
|
* zero sized files are, for OpenTTD's purposes, always
|
||||||
* wrong. You can't have gzips of 0 bytes! */
|
* 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;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,15 +154,15 @@ int NetworkHTTPSocketHandler::HandleHeader()
|
|||||||
/* Search the end of the line. This is safe because the header will
|
/* Search the end of the line. This is safe because the header will
|
||||||
* always end with two newlines. */
|
* always end with two newlines. */
|
||||||
*strstr(status, NEWLINE) = '\0';
|
*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;
|
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 */
|
/* Redirect to other URL */
|
||||||
char *uri = strcasestr(this->recv_buffer, LOCATION);
|
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);
|
uri += strlen(LOCATION);
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ int NetworkHTTPSocketHandler::HandleHeader()
|
|||||||
char *end_of_line = strstr(uri, NEWLINE);
|
char *end_of_line = strstr(uri, NEWLINE);
|
||||||
*end_of_line = '\0';
|
*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);
|
int ret = NetworkHTTPSocketHandler::Connect(uri, this->callback, this->data, this->redirect_depth + 1);
|
||||||
if (ret != 0) return ret;
|
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)
|
/* static */ int NetworkHTTPSocketHandler::Connect(char *uri, HTTPCallback *callback, const char *data, int depth)
|
||||||
{
|
{
|
||||||
char *hname = strstr(uri, "://");
|
char *hname = strstr(uri, "://");
|
||||||
if (hname == nullptr) return_error("[tcp/http] invalid location");
|
if (hname == nullptr) return_error("[tcp/http] Invalid location");
|
||||||
|
|
||||||
hname += 3;
|
hname += 3;
|
||||||
|
|
||||||
char *url = strchr(hname, '/');
|
char *url = strchr(hname, '/');
|
||||||
if (url == nullptr) return_error("[tcp/http] invalid location");
|
if (url == nullptr) return_error("[tcp/http] Invalid location");
|
||||||
|
|
||||||
*url = '\0';
|
*url = '\0';
|
||||||
|
|
||||||
|
std::string hostname = std::string(hname);
|
||||||
|
|
||||||
/* Restore the URL. */
|
/* Restore the URL. */
|
||||||
*url = '/';
|
*url = '/';
|
||||||
new NetworkHTTPContentConnecter(hname, callback, url, data, depth);
|
new NetworkHTTPContentConnecter(hostname, callback, url, data, depth);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,7 +228,7 @@ int NetworkHTTPSocketHandler::Receive()
|
|||||||
NetworkError err = NetworkError::GetLast();
|
NetworkError err = NetworkError::GetLast();
|
||||||
if (!err.WouldBlock()) {
|
if (!err.WouldBlock()) {
|
||||||
/* Something went wrong... */
|
/* 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;
|
return -1;
|
||||||
}
|
}
|
||||||
/* Connection would block, so stop for now */
|
/* Connection would block, so stop for now */
|
||||||
@@ -254,7 +256,7 @@ int NetworkHTTPSocketHandler::Receive()
|
|||||||
|
|
||||||
if (end_of_header == nullptr) {
|
if (end_of_header == nullptr) {
|
||||||
if (read == lengthof(this->recv_buffer)) {
|
if (read == lengthof(this->recv_buffer)) {
|
||||||
DEBUG(net, 0, "[tcp/http] header too big");
|
DEBUG(net, 1, "[tcp/http] Header too big");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
this->recv_pos = read;
|
this->recv_pos = read;
|
||||||
|
@@ -73,6 +73,7 @@ public:
|
|||||||
|
|
||||||
/** Connect with a HTTP server and do ONE query. */
|
/** Connect with a HTTP server and do ONE query. */
|
||||||
class NetworkHTTPContentConnecter : TCPConnecter {
|
class NetworkHTTPContentConnecter : TCPConnecter {
|
||||||
|
std::string hostname; ///< Hostname we are connecting to.
|
||||||
HTTPCallback *callback; ///< Callback to tell that we received some data (or won't).
|
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 *url; ///< The URL we want to get at the server.
|
||||||
const char *data; ///< The data to send
|
const char *data; ///< The data to send
|
||||||
@@ -81,14 +82,15 @@ class NetworkHTTPContentConnecter : TCPConnecter {
|
|||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* Start the connecting.
|
* 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 callback The callback for HTTP retrieval.
|
||||||
* @param url The url at the server.
|
* @param url The url at the server.
|
||||||
* @param data The data to send.
|
* @param data The data to send.
|
||||||
* @param depth The depth (redirect recursion) of the queries.
|
* @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) :
|
NetworkHTTPContentConnecter(const std::string &hostname, HTTPCallback *callback, const char *url, const char *data = nullptr, int depth = 0) :
|
||||||
TCPConnecter(connection_string, 80),
|
TCPConnecter(hostname, 80),
|
||||||
|
hostname(hostname),
|
||||||
callback(callback),
|
callback(callback),
|
||||||
url(stredup(url)),
|
url(stredup(url)),
|
||||||
data(data),
|
data(data),
|
||||||
@@ -110,7 +112,7 @@ public:
|
|||||||
|
|
||||||
void OnConnect(SOCKET s) override
|
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. */
|
/* We've relinquished control of data now. */
|
||||||
this->data = nullptr;
|
this->data = nullptr;
|
||||||
}
|
}
|
||||||
|
@@ -49,7 +49,7 @@ public:
|
|||||||
SetNonBlocking(s); // XXX error handling?
|
SetNonBlocking(s); // XXX error handling?
|
||||||
|
|
||||||
NetworkAddress address(sin, sin_len);
|
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?
|
SetNoDelay(s); // XXX error handling?
|
||||||
|
|
||||||
@@ -61,10 +61,10 @@ public:
|
|||||||
Packet p(Tban_packet);
|
Packet p(Tban_packet);
|
||||||
p.PrepareToSend();
|
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) {
|
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);
|
closesocket(s);
|
||||||
break;
|
break;
|
||||||
@@ -81,7 +81,7 @@ public:
|
|||||||
p.PrepareToSend();
|
p.PrepareToSend();
|
||||||
|
|
||||||
if (p.TransferOut<int>(send, s, 0) < 0) {
|
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);
|
closesocket(s);
|
||||||
|
|
||||||
@@ -150,7 +150,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sockets.size() == 0) {
|
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);
|
ShowNetworkError(STR_NETWORK_ERROR_SERVER_START);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -165,7 +165,7 @@ public:
|
|||||||
closesocket(s.second);
|
closesocket(s.second);
|
||||||
}
|
}
|
||||||
sockets.clear();
|
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 */
|
/* Enable broadcast */
|
||||||
unsigned long val = 1;
|
unsigned long val = 1;
|
||||||
if (setsockopt(s.second, SOL_SOCKET, SO_BROADCAST, (char *) &val, sizeof(val)) < 0) {
|
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 */
|
/* Send the buffer */
|
||||||
ssize_t res = p->TransferOut<int>(sendto, s.second, 0, (const struct sockaddr *)send.GetAddress(), send.GetAddressLength());
|
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 */
|
/* 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;
|
if (!all) break;
|
||||||
}
|
}
|
||||||
|
@@ -211,7 +211,7 @@ public:
|
|||||||
virtual ~NetworkUDPSocketHandler() { this->Close(); }
|
virtual ~NetworkUDPSocketHandler() { this->Close(); }
|
||||||
|
|
||||||
bool Listen();
|
bool Listen();
|
||||||
void Close() override;
|
void Close();
|
||||||
|
|
||||||
void SendPacket(Packet *p, NetworkAddress *recv, bool all = false, bool broadcast = false, bool short_mtu = false);
|
void SendPacket(Packet *p, NetworkAddress *recv, bool all = false, bool broadcast = false, bool short_mtu = false);
|
||||||
void ReceivePackets();
|
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);
|
DEBUG(desync, 1, "msg: date{%08x; %02x; %02x}; %s", _date, _date_fract, _tick_skip_counter, message);
|
||||||
IConsolePrintF(colour, "%s", 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 */
|
/* Calculate the frame-lag of a client */
|
||||||
@@ -527,6 +527,19 @@ std::string_view ParseFullConnectionString(const std::string &connection_string,
|
|||||||
return ip;
|
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
|
* Convert a string containing either "hostname" or "hostname:ip" to a
|
||||||
* NetworkAddress.
|
* NetworkAddress.
|
||||||
@@ -598,13 +611,13 @@ void NetworkClose(bool close_admins)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
|
for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
|
||||||
cs->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
|
cs->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
|
||||||
}
|
}
|
||||||
ServerNetworkGameSocketHandler::CloseListeners();
|
ServerNetworkGameSocketHandler::CloseListeners();
|
||||||
ServerNetworkAdminSocketHandler::CloseListeners();
|
ServerNetworkAdminSocketHandler::CloseListeners();
|
||||||
} else if (MyClient::my_client != nullptr) {
|
} else if (MyClient::my_client != nullptr) {
|
||||||
MyClient::SendQuit();
|
MyClient::SendQuit();
|
||||||
MyClient::my_client->CloseConnection(NETWORK_RECV_STATUS_CONN_LOST);
|
MyClient::my_client->CloseConnection(NETWORK_RECV_STATUS_CLIENT_QUIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
TCPConnecter::KillAll();
|
TCPConnecter::KillAll();
|
||||||
@@ -636,41 +649,77 @@ static void NetworkInitialize(bool close_admins = true)
|
|||||||
_last_sync_tick_skip_counter = 0;
|
_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 {
|
class TCPQueryConnecter : TCPConnecter {
|
||||||
private:
|
private:
|
||||||
bool request_company_info;
|
|
||||||
std::string connection_string;
|
std::string connection_string;
|
||||||
|
|
||||||
public:
|
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
|
void OnFailure() override
|
||||||
{
|
{
|
||||||
NetworkDisconnect();
|
NetworkGameList *item = NetworkGameListAddItem(connection_string);
|
||||||
|
item->online = false;
|
||||||
|
|
||||||
|
UpdateNetworkGameWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnConnect(SOCKET s) override
|
void OnConnect(SOCKET s) override
|
||||||
{
|
{
|
||||||
_networking = true;
|
_networking = true;
|
||||||
new ClientNetworkGameSocketHandler(s, this->connection_string);
|
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 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;
|
if (!_network_available) return;
|
||||||
|
|
||||||
NetworkDisconnect();
|
|
||||||
NetworkInitialize();
|
NetworkInitialize();
|
||||||
|
|
||||||
new TCPQueryConnecter(connection_string, request_company_info);
|
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;
|
||||||
|
|
||||||
|
NetworkInitialize();
|
||||||
|
|
||||||
|
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.
|
* @param connection_string The IP:port of the server to add.
|
||||||
* @return The entry on the game list.
|
* @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;
|
if (connection_string.empty()) return nullptr;
|
||||||
|
|
||||||
@@ -689,13 +738,13 @@ NetworkGameList *NetworkAddServer(const std::string &connection_string)
|
|||||||
if (item->info.server_name.empty()) {
|
if (item->info.server_name.empty()) {
|
||||||
ClearGRFConfigList(&item->info.grfconfig);
|
ClearGRFConfigList(&item->info.grfconfig);
|
||||||
item->info.server_name = connection_string;
|
item->info.server_name = connection_string;
|
||||||
item->manually = true;
|
|
||||||
|
|
||||||
NetworkRebuildHostList();
|
|
||||||
UpdateNetworkGameWindow();
|
UpdateNetworkGameWindow();
|
||||||
|
|
||||||
|
NetworkQueryServer(connection_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkTCPQueryServer(connection_string);
|
if (manually) item->manually = true;
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
@@ -840,13 +889,13 @@ static void CheckClientAndServerName()
|
|||||||
{
|
{
|
||||||
static const char *fallback_client_name = "Unnamed Client";
|
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) {
|
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));
|
strecpy(_settings_client.network.client_name, fallback_client_name, lastof(_settings_client.network.client_name));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *fallback_server_name = "Unnamed Server";
|
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) {
|
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));
|
strecpy(_settings_client.network.server_name, fallback_server_name, lastof(_settings_client.network.server_name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -864,17 +913,17 @@ bool NetworkServerStart()
|
|||||||
|
|
||||||
NetworkDisconnect(false, false);
|
NetworkDisconnect(false, false);
|
||||||
NetworkInitialize(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;
|
if (!ServerNetworkGameSocketHandler::Listen(_settings_client.network.server_port)) return false;
|
||||||
|
|
||||||
/* Only listen for admins when the password isn't empty. */
|
/* Only listen for admins when the password isn't empty. */
|
||||||
if (!StrEmpty(_settings_client.network.admin_password)) {
|
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;
|
if (!ServerNetworkAdminSocketHandler::Listen(_settings_client.network.server_admin_port)) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to start UDP-server */
|
/* Try to start UDP-server */
|
||||||
DEBUG(net, 1, "starting listeners for incoming server queries");
|
DEBUG(net, 5, "Starting listeners for incoming server queries");
|
||||||
NetworkUDPServerListen();
|
NetworkUDPServerListen();
|
||||||
|
|
||||||
_network_company_states = CallocT<NetworkCompanyState>(MAX_COMPANIES);
|
_network_company_states = CallocT<NetworkCompanyState>(MAX_COMPANIES);
|
||||||
@@ -1026,7 +1075,7 @@ void NetworkGameLoop()
|
|||||||
static bool check_sync_state = false;
|
static bool check_sync_state = false;
|
||||||
static uint32 sync_state[2];
|
static uint32 sync_state[2];
|
||||||
if (f == nullptr && next_date == 0) {
|
if (f == nullptr && next_date == 0) {
|
||||||
DEBUG(net, 0, "Cannot open commands.log");
|
DEBUG(desync, 0, "Cannot open commands.log");
|
||||||
next_date = 1;
|
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. */
|
/* A message that is not very important to the log playback, but part of the log. */
|
||||||
#ifndef DEBUG_FAILED_DUMP_COMMANDS
|
#ifndef DEBUG_FAILED_DUMP_COMMANDS
|
||||||
} else if (strncmp(p, "cmdf: ", 6) == 0) {
|
} 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
|
#endif
|
||||||
} else {
|
} else {
|
||||||
/* Can't parse a line; what's wrong here? */
|
/* 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();
|
NOT_REACHED();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (f != nullptr && feof(f)) {
|
if (f != nullptr && feof(f)) {
|
||||||
DEBUG(net, 0, "End of commands.log");
|
DEBUG(desync, 0, "End of commands.log");
|
||||||
fclose(f);
|
fclose(f);
|
||||||
f = nullptr;
|
f = nullptr;
|
||||||
}
|
}
|
||||||
@@ -1195,29 +1244,36 @@ static void NetworkGenerateServerId()
|
|||||||
seprintf(_settings_client.network.network_id, lastof(_settings_client.network.network_id), "%s", hex_output);
|
seprintf(_settings_client.network.network_id, lastof(_settings_client.network.network_id), "%s", hex_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkStartDebugLog(const std::string &connection_string)
|
class TCPNetworkDebugConnecter : TCPConnecter {
|
||||||
{
|
private:
|
||||||
extern SOCKET _debug_socket; // Comes from debug.c
|
std::string connection_string;
|
||||||
|
|
||||||
NetworkAddress address = ParseConnectionString(connection_string, NETWORK_DEFAULT_DEBUGLOG_PORT);
|
public:
|
||||||
|
TCPNetworkDebugConnecter(const std::string &connection_string) : TCPConnecter(connection_string, NETWORK_DEFAULT_DEBUGLOG_PORT), connection_string(connection_string) {}
|
||||||
|
|
||||||
DEBUG(net, 0, "Redirecting DEBUG() to %s", address.GetAddressAsString().c_str());
|
void OnFailure() override
|
||||||
|
{
|
||||||
SOCKET s = address.Connect();
|
DEBUG(net, 0, "Failed to open connection to %s for redirecting DEBUG()", this->connection_string.c_str());
|
||||||
if (s == INVALID_SOCKET) {
|
|
||||||
DEBUG(net, 0, "Failed to open socket for redirection DEBUG()");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_debug_socket = s;
|
void OnConnect(SOCKET s) override
|
||||||
|
{
|
||||||
|
DEBUG(net, 3, "Redirecting DEBUG() to %s", this->connection_string.c_str());
|
||||||
|
|
||||||
DEBUG(net, 0, "DEBUG() is now redirected");
|
extern SOCKET _debug_socket;
|
||||||
|
_debug_socket = s;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void NetworkStartDebugLog(const std::string &connection_string)
|
||||||
|
{
|
||||||
|
new TCPNetworkDebugConnecter(connection_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This tries to launch the network for a given OS */
|
/** This tries to launch the network for a given OS */
|
||||||
void NetworkStartUp()
|
void NetworkStartUp()
|
||||||
{
|
{
|
||||||
DEBUG(net, 3, "[core] starting network...");
|
DEBUG(net, 3, "Starting network");
|
||||||
|
|
||||||
/* Network is available */
|
/* Network is available */
|
||||||
_network_available = NetworkCoreInitialize();
|
_network_available = NetworkCoreInitialize();
|
||||||
@@ -1230,7 +1286,7 @@ void NetworkStartUp()
|
|||||||
_network_game_info = {};
|
_network_game_info = {};
|
||||||
|
|
||||||
NetworkInitialize();
|
NetworkInitialize();
|
||||||
DEBUG(net, 3, "[core] network online, multiplayer available");
|
DEBUG(net, 3, "Network online, multiplayer available");
|
||||||
NetworkFindBroadcastIPs(&_broadcast_list);
|
NetworkFindBroadcastIPs(&_broadcast_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1240,7 +1296,7 @@ void NetworkShutDown()
|
|||||||
NetworkDisconnect(true);
|
NetworkDisconnect(true);
|
||||||
NetworkUDPClose();
|
NetworkUDPClose();
|
||||||
|
|
||||||
DEBUG(net, 3, "[core] shutting down network");
|
DEBUG(net, 3, "Shutting down network");
|
||||||
|
|
||||||
_network_available = false;
|
_network_available = false;
|
||||||
|
|
||||||
@@ -1252,7 +1308,7 @@ extern "C" {
|
|||||||
|
|
||||||
void CDECL em_openttd_add_server(const char *connection_string)
|
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()
|
ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler()
|
||||||
{
|
{
|
||||||
_network_admins_connected--;
|
_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 (_redirect_console_to_admin == this->index) _redirect_console_to_admin = INVALID_ADMIN_ID;
|
||||||
|
|
||||||
if (this->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) {
|
if (this->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) {
|
||||||
@@ -102,7 +102,7 @@ ServerNetworkAdminSocketHandler::~ServerNetworkAdminSocketHandler()
|
|||||||
{
|
{
|
||||||
for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::Iterate()) {
|
for (ServerNetworkAdminSocketHandler *as : ServerNetworkAdminSocketHandler::Iterate()) {
|
||||||
if (as->status == ADMIN_STATUS_INACTIVE && std::chrono::steady_clock::now() > as->connect_time + ADMIN_AUTHORISATION_TIMEOUT) {
|
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);
|
as->CloseConnection(true);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendError(NetworkErrorCode er
|
|||||||
StringID strid = GetNetworkErrorMsg(error);
|
StringID strid = GetNetworkErrorMsg(error);
|
||||||
GetString(str, strid, lastof(str));
|
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);
|
return this->CloseConnection(true);
|
||||||
}
|
}
|
||||||
@@ -523,7 +523,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p)
|
|||||||
|
|
||||||
p->Recv_string(command, sizeof(command));
|
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;
|
_redirect_console_to_admin = this->index;
|
||||||
IConsoleCmdExec(command);
|
IConsoleCmdExec(command);
|
||||||
@@ -539,7 +539,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Pack
|
|||||||
|
|
||||||
p->Recv_string(json, sizeof(json));
|
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));
|
Game::NewEvent(new ScriptEventAdminPort(json));
|
||||||
return NETWORK_RECV_STATUS_OKAY;
|
return NETWORK_RECV_STATUS_OKAY;
|
||||||
@@ -551,7 +551,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_PING(Packet *p)
|
|||||||
|
|
||||||
uint32 d1 = p->Recv_uint32();
|
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);
|
return this->SendPong(d1);
|
||||||
}
|
}
|
||||||
@@ -688,7 +688,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_JOIN(Packet *p)
|
|||||||
|
|
||||||
this->status = ADMIN_STATUS_ACTIVE;
|
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();
|
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) {
|
if (type >= ADMIN_UPDATE_END || (_admin_update_type_frequencies[type] & freq) != freq) {
|
||||||
/* The server does not know of this UpdateType. */
|
/* 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);
|
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,7 +778,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_POLL(Packet *p)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
/* An unsupported "poll" update type. */
|
/* 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);
|
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -805,7 +805,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_CHAT(Packet *p)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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);
|
return this->SendError(NETWORK_ERROR_ILLEGAL_PACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -39,7 +39,7 @@ static const uint NETWORK_CHAT_LINE_SPACING = 3;
|
|||||||
|
|
||||||
/** Container for a message. */
|
/** Container for a message. */
|
||||||
struct ChatMessage {
|
struct ChatMessage {
|
||||||
char message[DRAW_STRING_BUFFER]; ///< The action message.
|
std::string message; ///< The action message.
|
||||||
TextColour colour; ///< The colour of the message.
|
TextColour colour; ///< The colour of the message.
|
||||||
std::chrono::steady_clock::time_point remove_time; ///< The time to remove 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 duration The duration of the chat message in seconds
|
||||||
* @param message message itself in printf() style
|
* @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) {
|
if (_chatmsg_list.size() == MAX_CHAT_MESSAGES) {
|
||||||
_chatmsg_list.pop_back();
|
_chatmsg_list.pop_back();
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatMessage *cmsg = &_chatmsg_list.emplace_front();
|
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->colour = (colour & TC_IS_PALETTE_COLOUR) ? colour : TC_WHITE;
|
||||||
cmsg->remove_time = std::chrono::steady_clock::now() + std::chrono::seconds(duration);
|
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->sock == INVALID_SOCKET) return status;
|
||||||
if (this->status == STATUS_CLOSING) 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);
|
SetBlocking(this->sock);
|
||||||
|
|
||||||
@@ -350,7 +350,7 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res)
|
|||||||
|
|
||||||
_sync_frame = 0;
|
_sync_frame = 0;
|
||||||
} else if (_sync_frame < _frame_counter) {
|
} 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;
|
_sync_frame = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -542,7 +542,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::SendCommand(const CommandPacke
|
|||||||
/** Send a chat-packet over the network */
|
/** Send a chat-packet over the network */
|
||||||
NetworkRecvStatus ClientNetworkGameSocketHandler::SendChat(NetworkAction action, DestType type, int dest, const char *msg, NetworkTextMessageData data)
|
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);
|
Packet *p = new Packet(PACKET_CLIENT_CHAT, SHRT_MAX);
|
||||||
|
|
||||||
p->Send_uint8 (action);
|
p->Send_uint8 (action);
|
||||||
@@ -799,7 +799,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_CLIENT_INFO(Pac
|
|||||||
p->Recv_string(name, sizeof(name));
|
p->Recv_string(name, sizeof(name));
|
||||||
|
|
||||||
if (this->status < STATUS_AUTHORIZED) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
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
|
/* 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
|
* 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. */
|
* 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. */
|
/* Receive the token. */
|
||||||
if (p->CanReadFromPacket(sizeof(uint8))) this->token = p->Recv_uint8();
|
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
|
/* Let the server know that we received this frame correctly
|
||||||
* We do this only once per day, to save some bandwidth ;) */
|
* We do this only once per day, to save some bandwidth ;) */
|
||||||
if (!_network_first_time && last_ack_frame < _frame_counter) {
|
if (!_network_first_time && last_ack_frame < _frame_counter) {
|
||||||
last_ack_frame = _frame_counter + DAY_TICKS;
|
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();
|
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);
|
NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, ci->client_name, nullptr, STR_NETWORK_MESSAGE_CLIENT_LEAVING);
|
||||||
delete ci;
|
delete ci;
|
||||||
} else {
|
} 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);
|
InvalidateWindowData(WC_CLIENT_LIST, 0);
|
||||||
@@ -1352,7 +1352,7 @@ NetworkRecvStatus ClientNetworkGameSocketHandler::Receive_SERVER_MOVE(Packet *p)
|
|||||||
|
|
||||||
if (client_id == 0) {
|
if (client_id == 0) {
|
||||||
/* definitely an invalid client id, debug message and do nothing. */
|
/* 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;
|
return NETWORK_RECV_STATUS_MALFORMED_PACKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -367,7 +367,7 @@ void NetworkGameSocketHandler::SendCommand(Packet *p, const CommandPacket *cp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (callback == lengthof(_callback_table)) {
|
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
|
callback = 0; // _callback_table[0] == nullptr
|
||||||
}
|
}
|
||||||
p->Send_uint8 (callback);
|
p->Send_uint8 (callback);
|
||||||
|
@@ -808,7 +808,9 @@ void ClientNetworkContentSocketHandler::Connect()
|
|||||||
void ClientNetworkContentSocketHandler::Close()
|
void ClientNetworkContentSocketHandler::Close()
|
||||||
{
|
{
|
||||||
if (this->sock == INVALID_SOCKET) return;
|
if (this->sock == INVALID_SOCKET) return;
|
||||||
NetworkContentSocketHandler::Close();
|
|
||||||
|
this->CloseConnection();
|
||||||
|
this->CloseSocket();
|
||||||
|
|
||||||
this->OnDisconnect();
|
this->OnDisconnect();
|
||||||
}
|
}
|
||||||
|
@@ -110,7 +110,7 @@ public:
|
|||||||
|
|
||||||
void Connect();
|
void Connect();
|
||||||
void SendReceive();
|
void SendReceive();
|
||||||
void Close() override;
|
void Close();
|
||||||
|
|
||||||
void RequestContentList(ContentType type);
|
void RequestContentList(ContentType type);
|
||||||
void RequestContentList(uint count, const ContentID *content_ids);
|
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);
|
uint NetworkServerKickOrBanIP(const char *ip, bool ban, const char *reason);
|
||||||
|
|
||||||
void NetworkInitChatMessage();
|
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 NetworkUndrawChatMessage();
|
||||||
void NetworkChatMessageLoop();
|
void NetworkChatMessageLoop();
|
||||||
|
|
||||||
|
@@ -112,7 +112,6 @@ void NetworkGameListRemoveItem(NetworkGameList *remove)
|
|||||||
ClearGRFConfigList(&remove->info.grfconfig);
|
ClearGRFConfigList(&remove->info.grfconfig);
|
||||||
delete remove;
|
delete remove;
|
||||||
|
|
||||||
DEBUG(net, 4, "[gamelist] removed server from list");
|
|
||||||
NetworkRebuildHostList();
|
NetworkRebuildHostList();
|
||||||
UpdateNetworkGameWindow();
|
UpdateNetworkGameWindow();
|
||||||
return;
|
return;
|
||||||
|
@@ -491,7 +491,7 @@ public:
|
|||||||
EM_ASM(if (window["openttd_server_list"]) openttd_server_list());
|
EM_ASM(if (window["openttd_server_list"]) openttd_server_list());
|
||||||
#endif
|
#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->server = this->last_joined;
|
||||||
|
|
||||||
this->requery_timer.SetInterval(MILLISECONDS_PER_TICK);
|
this->requery_timer.SetInterval(MILLISECONDS_PER_TICK);
|
||||||
@@ -767,7 +767,7 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WID_NG_REFRESH: // Refresh
|
case WID_NG_REFRESH: // Refresh
|
||||||
if (this->server != nullptr) NetworkTCPQueryServer(this->server->connection_string);
|
if (this->server != nullptr) NetworkQueryServer(this->server->connection_string);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WID_NG_NEWGRF: // NewGRF Settings
|
case WID_NG_NEWGRF: // NewGRF Settings
|
||||||
@@ -845,6 +845,7 @@ public:
|
|||||||
if (!StrEmpty(str)) {
|
if (!StrEmpty(str)) {
|
||||||
strecpy(_settings_client.network.connect_to_ip, str, lastof(_settings_client.network.connect_to_ip));
|
strecpy(_settings_client.network.connect_to_ip, str, lastof(_settings_client.network.connect_to_ip));
|
||||||
NetworkAddServer(str);
|
NetworkAddServer(str);
|
||||||
|
NetworkRebuildHostList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1502,7 +1503,7 @@ struct NetworkLobbyWindow : public Window {
|
|||||||
/* Clear the information so removed companies don't remain */
|
/* Clear the information so removed companies don't remain */
|
||||||
for (auto &company : this->company_info) company = {};
|
for (auto &company : this->company_info) company = {};
|
||||||
|
|
||||||
NetworkTCPQueryServer(this->server->connection_string, true);
|
NetworkQueryLobbyServer(this->server->connection_string);
|
||||||
break;
|
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));
|
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);
|
new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
|
||||||
}
|
}
|
||||||
|
@@ -94,10 +94,11 @@ extern uint8 _network_reconnect;
|
|||||||
|
|
||||||
extern CompanyMask _network_company_passworded;
|
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);
|
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 NetworkRebuildHostList();
|
||||||
void UpdateNetworkGameWindow();
|
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);
|
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);
|
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 */
|
#endif /* NETWORK_INTERNAL_H */
|
||||||
|
@@ -253,7 +253,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
|
|||||||
*/
|
*/
|
||||||
if (this->sock == INVALID_SOCKET) return status;
|
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... */
|
/* We did not receive a leave message from this client... */
|
||||||
char client_name[NETWORK_CLIENT_NAME_LENGTH];
|
char client_name[NETWORK_CLIENT_NAME_LENGTH];
|
||||||
|
|
||||||
@@ -280,7 +280,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
|
|||||||
}
|
}
|
||||||
|
|
||||||
NetworkAdminClientError(this->client_id, NETWORK_ERROR_CONNECTION_LOST);
|
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 :( */
|
/* We just lost one client :( */
|
||||||
if (this->status >= STATUS_AUTHORIZED) _network_game_info.clients_on--;
|
if (this->status >= STATUS_AUTHORIZED) _network_game_info.clients_on--;
|
||||||
@@ -321,7 +321,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::CloseConnection(NetworkRecvSta
|
|||||||
if (cs->status == STATUS_CLOSE_PENDING) {
|
if (cs->status == STATUS_CLOSE_PENDING) {
|
||||||
SendPacketsState send_state = cs->SendPackets(true);
|
SendPacketsState send_state = cs->SendPackets(true);
|
||||||
if (send_state == SPS_CLOSED) {
|
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) {
|
} else if (send_state != SPS_PARTLY_SENT && send_state != SPS_NONE_SENT) {
|
||||||
ShutdownSocket(cs->sock, true, false, 2);
|
ShutdownSocket(cs->sock, true, false, 2);
|
||||||
}
|
}
|
||||||
@@ -462,7 +462,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::SendError(NetworkErrorCode err
|
|||||||
|
|
||||||
this->GetClientName(client_name, lastof(client_name));
|
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) {
|
if (error == NETWORK_ERROR_KICKED && reason != nullptr) {
|
||||||
NetworkTextMessage(NETWORK_ACTION_KICKED, CC_DEFAULT, false, client_name, reason, strid);
|
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);
|
NetworkAdminClientError(this->client_id, error);
|
||||||
} else {
|
} 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! */
|
/* 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));
|
p->Recv_string(name, sizeof(name));
|
||||||
playas = (Owner)p->Recv_uint8();
|
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 */
|
/* join another company does not affect these values */
|
||||||
switch (playas) {
|
switch (playas) {
|
||||||
@@ -1160,7 +1160,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND(Packet
|
|||||||
CommandPacket cp;
|
CommandPacket cp;
|
||||||
const char *err = this->ReceiveCommand(p, &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();
|
NetworkClientInfo *ci = this->GetInfo();
|
||||||
|
|
||||||
@@ -1225,7 +1225,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
|
|||||||
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
|
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
|
||||||
if (_debug_net_level >= 2) GetString(str, GetNetworkErrorMsg(errorno), lastof(str));
|
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);
|
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));
|
this->GetClientName(client_name, lastof(client_name));
|
||||||
@@ -1233,7 +1233,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR(Packet *p
|
|||||||
StringID strid = GetNetworkErrorMsg(errorno);
|
StringID strid = GetNetworkErrorMsg(errorno);
|
||||||
GetString(str, strid, lastof(str));
|
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);
|
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 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)
|
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 */
|
/* The client was never joined.. thank the client for the packet, but ignore it */
|
||||||
if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
|
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));
|
this->GetClientName(client_name, lastof(client_name));
|
||||||
@@ -1311,7 +1311,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT(Packet *p)
|
|||||||
|
|
||||||
NetworkAdminClientQuit(this->client_id);
|
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)
|
NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_ACK(Packet *p)
|
||||||
@@ -1464,7 +1464,7 @@ void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, co
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
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;
|
FALLTHROUGH;
|
||||||
|
|
||||||
case DESTTYPE_BROADCAST:
|
case DESTTYPE_BROADCAST:
|
||||||
@@ -1547,7 +1547,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME(Packet
|
|||||||
p->Recv_string(client_name, sizeof(client_name));
|
p->Recv_string(client_name, sizeof(client_name));
|
||||||
ci = this->GetInfo();
|
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 (ci != nullptr) {
|
||||||
if (!NetworkIsValidClientName(client_name)) {
|
if (!NetworkIsValidClientName(client_name)) {
|
||||||
@@ -1588,7 +1588,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_RCON(Packet *p)
|
|||||||
return NETWORK_RECV_STATUS_OKAY;
|
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;
|
_redirect_console_to_client = this->client_id;
|
||||||
IConsoleCmdExec(command);
|
IConsoleCmdExec(command);
|
||||||
@@ -1613,7 +1613,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE(Packet *p)
|
|||||||
|
|
||||||
/* Incorrect password sent, return! */
|
/* Incorrect password sent, return! */
|
||||||
if (strcmp(password, _network_company_states[company_id].password) != 0) {
|
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;
|
return NETWORK_RECV_STATUS_OKAY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1760,7 +1760,7 @@ void NetworkUpdateClientInfo(ClientID client_id)
|
|||||||
static void NetworkCheckRestartMap()
|
static void NetworkCheckRestartMap()
|
||||||
{
|
{
|
||||||
if (_settings_client.network.restart_game_year != 0 && _cur_year >= _settings_client.network.restart_game_year) {
|
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;
|
_settings_newgame.game_creation.generation_seed = GENERATE_NEW_SEED;
|
||||||
switch(_file_to_saveload.abstract_ftype) {
|
switch(_file_to_saveload.abstract_ftype) {
|
||||||
|
@@ -77,7 +77,7 @@ struct UDPSocket {
|
|||||||
std::unique_lock<std::mutex> lock(mutex, std::defer_lock);
|
std::unique_lock<std::mutex> lock(mutex, std::defer_lock);
|
||||||
if (!lock.try_lock()) {
|
if (!lock.try_lock()) {
|
||||||
if (++receive_iterations_locked % 32 == 0) {
|
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;
|
return;
|
||||||
}
|
}
|
||||||
@@ -152,7 +152,7 @@ public:
|
|||||||
void MasterNetworkUDPSocketHandler::Receive_MASTER_ACK_REGISTER(Packet *p, NetworkAddress *client_addr)
|
void MasterNetworkUDPSocketHandler::Receive_MASTER_ACK_REGISTER(Packet *p, NetworkAddress *client_addr)
|
||||||
{
|
{
|
||||||
_network_advertise_retries = 0;
|
_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! */
|
/* We are advertised, but we don't want to! */
|
||||||
if (!_settings_client.network.server_advertise) NetworkUDPRemoveAdvertise(false);
|
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)
|
void MasterNetworkUDPSocketHandler::Receive_MASTER_SESSION_KEY(Packet *p, NetworkAddress *client_addr)
|
||||||
{
|
{
|
||||||
_session_key = p->Recv_uint64();
|
_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) ***/
|
///*** 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 */
|
/* Let the client know that we are here */
|
||||||
this->SendPacket(&packet, client_addr);
|
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)
|
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;
|
std::vector<GRFInfo> in_reply;
|
||||||
|
|
||||||
|
DEBUG(net, 7, "NewGRF data request from %s", client_addr->GetAddressAsString().c_str());
|
||||||
|
|
||||||
size_t packet_len = 0;
|
size_t packet_len = 0;
|
||||||
|
|
||||||
num_grfs = p->Recv_uint8 ();
|
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 */
|
/* Just a fail-safe.. should never happen */
|
||||||
if (_network_udp_server) return;
|
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 */
|
/* Find next item */
|
||||||
item = NetworkGameListAddItem(client_addr->GetAddressAsString(false));
|
item = NetworkGameListAddItem(client_addr->GetAddressAsString(false));
|
||||||
@@ -498,7 +500,7 @@ void ClientNetworkUDPSocketHandler::Receive_SERVER_NEWGRFS(Packet *p, NetworkAdd
|
|||||||
uint i;
|
uint i;
|
||||||
|
|
||||||
num_grfs = p->Recv_uint8 ();
|
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;
|
if (num_grfs > NETWORK_MAX_GRF_COUNT) return;
|
||||||
|
|
||||||
@@ -529,7 +531,7 @@ static void NetworkUDPBroadCast(NetworkUDPSocketHandler *socket)
|
|||||||
for (NetworkAddress &addr : _broadcast_list) {
|
for (NetworkAddress &addr : _broadcast_list) {
|
||||||
Packet p = PrepareUdpClientFindServerPacket();
|
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);
|
socket->SendPacket(&p, &addr, true, true);
|
||||||
}
|
}
|
||||||
@@ -549,7 +551,7 @@ void NetworkUDPQueryMasterServer()
|
|||||||
std::lock_guard<std::mutex> lock(_udp_client.mutex);
|
std::lock_guard<std::mutex> lock(_udp_client.mutex);
|
||||||
_udp_client.socket->SendPacket(&p, &out_addr, true);
|
_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 */
|
/** Find all servers */
|
||||||
@@ -558,7 +560,7 @@ void NetworkUDPSearchGame()
|
|||||||
/* We are still searching.. */
|
/* We are still searching.. */
|
||||||
if (_network_udp_broadcast > 0) return;
|
if (_network_udp_broadcast > 0) return;
|
||||||
|
|
||||||
DEBUG(net, 0, "[udp] searching server");
|
DEBUG(net, 3, "Searching server");
|
||||||
|
|
||||||
NetworkUDPBroadCast(_udp_client.socket);
|
NetworkUDPBroadCast(_udp_client.socket);
|
||||||
_network_udp_broadcast = 300; // Stay searching for 300 ticks
|
_network_udp_broadcast = 300; // Stay searching for 300 ticks
|
||||||
@@ -569,7 +571,7 @@ void NetworkUDPSearchGame()
|
|||||||
*/
|
*/
|
||||||
static void NetworkUDPRemoveAdvertiseThread()
|
static void NetworkUDPRemoveAdvertiseThread()
|
||||||
{
|
{
|
||||||
DEBUG(net, 1, "[udp] removing advertise from master server");
|
DEBUG(net, 3, "Removing advertise from master server");
|
||||||
|
|
||||||
/* Find somewhere to send */
|
/* Find somewhere to send */
|
||||||
NetworkAddress out_addr(NETWORK_MASTER_SERVER_HOST, NETWORK_MASTER_SERVER_PORT);
|
NetworkAddress out_addr(NETWORK_MASTER_SERVER_HOST, NETWORK_MASTER_SERVER_PORT);
|
||||||
@@ -606,22 +608,22 @@ static void NetworkUDPAdvertiseThread()
|
|||||||
/* Find somewhere to send */
|
/* Find somewhere to send */
|
||||||
NetworkAddress out_addr(NETWORK_MASTER_SERVER_HOST, NETWORK_MASTER_SERVER_PORT);
|
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 */
|
/* Add a bit more messaging when we cannot get a session key */
|
||||||
static byte session_key_retries = 0;
|
static byte session_key_retries = 0;
|
||||||
if (_session_key == 0 && session_key_retries++ == 2) {
|
if (_session_key == 0 && session_key_retries++ == 2) {
|
||||||
DEBUG(net, 0, "[udp] advertising to the master server is failing");
|
DEBUG(net, 0, "Advertising to the master server is failing");
|
||||||
DEBUG(net, 0, "[udp] we are not receiving the session key from the server");
|
DEBUG(net, 0, " 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, " 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, " please allow udp packets from you to %s to be delivered", NetworkAddressDumper().GetAddressAsString(&out_addr, false));
|
||||||
}
|
}
|
||||||
if (_session_key != 0 && _network_advertise_retries == 0) {
|
if (_session_key != 0 && _network_advertise_retries == 0) {
|
||||||
DEBUG(net, 0, "[udp] advertising to the master server is failing");
|
DEBUG(net, 0, "Advertising to the master server is failing");
|
||||||
DEBUG(net, 0, "[udp] we are not receiving the acknowledgement from the server");
|
DEBUG(net, 0, " 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, " 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, " 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, " please allow udp and tcp packets from port %u to be delivered", _settings_client.network.server_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send the packet */
|
/* Send the packet */
|
||||||
@@ -677,7 +679,7 @@ void NetworkUDPInitialize()
|
|||||||
/* If not closed, then do it. */
|
/* If not closed, then do it. */
|
||||||
if (_udp_server.socket != nullptr) NetworkUDPClose();
|
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);
|
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);
|
// 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_server = false;
|
||||||
_network_udp_broadcast = 0;
|
_network_udp_broadcast = 0;
|
||||||
DEBUG(net, 1, "[udp] closed listeners");
|
DEBUG(net, 5, "Closed UDP listeners");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Receive the UDP packets. */
|
/** Receive the UDP packets. */
|
||||||
|
@@ -307,7 +307,7 @@ void AirportAnimationTrigger(Station *st, AirpAnimationTrigger trigger, CargoID
|
|||||||
{
|
{
|
||||||
if (st->airport.tile == INVALID_TILE) return;
|
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);
|
if (st->TileBelongsToAirport(tile)) AirportTileAnimationTrigger(st, tile, trigger, cargo_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -287,7 +287,7 @@ bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigge
|
|||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
uint32 random = Random();
|
uint32 random = Random();
|
||||||
TILE_AREA_LOOP(tile, ind->location) {
|
for (TileIndex tile : ind->location) {
|
||||||
if (ind->TileBelongsToIndustry(tile)) {
|
if (ind->TileBelongsToIndustry(tile)) {
|
||||||
if (StartStopIndustryTileAnimation(tile, iat, random)) {
|
if (StartStopIndustryTileAnimation(tile, iat, random)) {
|
||||||
SB(random, 0, 16, Random());
|
SB(random, 0, 16, Random());
|
||||||
@@ -380,7 +380,7 @@ void TriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger)
|
|||||||
void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
|
void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
|
||||||
{
|
{
|
||||||
uint32 reseed_industry = 0;
|
uint32 reseed_industry = 0;
|
||||||
TILE_AREA_LOOP(tile, ind->location) {
|
for (TileIndex tile : ind->location) {
|
||||||
if (ind->TileBelongsToIndustry(tile)) {
|
if (ind->TileBelongsToIndustry(tile)) {
|
||||||
DoTriggerIndustryTile(tile, trigger, ind, reseed_industry);
|
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;
|
if (!HasBit(spec->animation.triggers, trigger)) return;
|
||||||
|
|
||||||
TILE_AREA_LOOP(tile, o->location) {
|
for (TileIndex tile : o->location) {
|
||||||
TriggerObjectTileAnimation(o, tile, trigger, spec);
|
TriggerObjectTileAnimation(o, tile, trigger, spec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -739,7 +739,7 @@ void DeallocateSpecFromStation(BaseStation *st, byte specindex)
|
|||||||
|
|
||||||
ETileArea area = ETileArea(st, INVALID_TILE, TA_WHOLE);
|
ETileArea area = ETileArea(st, INVALID_TILE, TA_WHOLE);
|
||||||
/* Check all tiles over the station to check if the specindex is still in use */
|
/* 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) {
|
if (st->TileBelongsToRailStation(tile) && GetCustomStationSpecIndex(tile) == specindex) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -949,7 +949,7 @@ void TriggerStationAnimation(BaseStation *st, TileIndex tile, StationAnimationTr
|
|||||||
ETileArea area = ETileArea(st, tile, tas[trigger]);
|
ETileArea area = ETileArea(st, tile, tas[trigger]);
|
||||||
|
|
||||||
/* Check all tiles over the station to check if the specindex is still in use */
|
/* 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)) {
|
if (st->TileBelongsToRailStation(tile)) {
|
||||||
const StationSpec *ss = GetStationSpec(tile);
|
const StationSpec *ss = GetStationSpec(tile);
|
||||||
if (ss != nullptr && HasBit(ss->animation.triggers, trigger)) {
|
if (ss != nullptr && HasBit(ss->animation.triggers, trigger)) {
|
||||||
@@ -1005,7 +1005,7 @@ void TriggerStationRandomisation(Station *st, TileIndex tile, StationRandomTrigg
|
|||||||
uint32 used_triggers = 0;
|
uint32 used_triggers = 0;
|
||||||
|
|
||||||
/* Check all tiles over the station to check if the specindex is still in use */
|
/* 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)) {
|
if (st->TileBelongsToRailStation(tile)) {
|
||||||
const StationSpec *ss = GetStationSpec(tile);
|
const StationSpec *ss = GetStationSpec(tile);
|
||||||
if (ss == nullptr) continue;
|
if (ss == nullptr) continue;
|
||||||
|
@@ -114,7 +114,7 @@ void BuildObject(ObjectType type, TileIndex tile, CompanyID owner, Town *town, u
|
|||||||
|
|
||||||
assert(o->town != nullptr);
|
assert(o->town != nullptr);
|
||||||
|
|
||||||
TILE_AREA_LOOP(t, ta) {
|
for (TileIndex t : ta) {
|
||||||
if (IsWaterTile(t)) ClearNeighbourNonFloodingStates(t);
|
if (IsWaterTile(t)) ClearNeighbourNonFloodingStates(t);
|
||||||
WaterClass wc = (IsWaterTile(t) ? GetWaterClass(t) : WATER_CLASS_INVALID);
|
WaterClass wc = (IsWaterTile(t) ? GetWaterClass(t) : WATER_CLASS_INVALID);
|
||||||
/* Update company infrastructure counts for objects build on canals owned by nobody. */
|
/* 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)
|
static void IncreaseAnimationStage(TileIndex tile)
|
||||||
{
|
{
|
||||||
TileArea ta = Object::GetByTile(tile)->location;
|
TileArea ta = Object::GetByTile(tile)->location;
|
||||||
TILE_AREA_LOOP(t, ta) {
|
for (TileIndex t : ta) {
|
||||||
SetAnimationFrame(t, GetAnimationFrame(t) + 1);
|
SetAnimationFrame(t, GetAnimationFrame(t) + 1);
|
||||||
MarkTileDirtyByTile(t, VMDF_NOT_MAP_MODE);
|
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_x = GB(spec->size, HasBit(view, 0) ? 4 : 0, 4);
|
||||||
int size_y = GB(spec->size, HasBit(view, 0) ? 0 : 4, 4);
|
int size_y = GB(spec->size, HasBit(view, 0) ? 0 : 4, 4);
|
||||||
TileArea ta(tile, size_x, size_y);
|
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
|
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. */
|
* some information about the tiles. */
|
||||||
bool allow_water = (spec->flags & (OBJECT_FLAG_BUILT_ON_WATER | OBJECT_FLAG_NOT_ON_LAND)) != 0;
|
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;
|
bool allow_ground = (spec->flags & OBJECT_FLAG_NOT_ON_LAND) == 0;
|
||||||
TILE_AREA_LOOP(t, ta) {
|
for (TileIndex t : ta) {
|
||||||
if (HasTileWaterGround(t)) {
|
if (HasTileWaterGround(t)) {
|
||||||
if (!allow_water) return_cmd_error(STR_ERROR_CAN_T_BUILD_ON_WATER);
|
if (!allow_water) return_cmd_error(STR_ERROR_CAN_T_BUILD_ON_WATER);
|
||||||
if (!IsWaterTile(t)) {
|
if (!IsWaterTile(t)) {
|
||||||
@@ -270,7 +270,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
int allowed_z;
|
int allowed_z;
|
||||||
if (GetTileSlope(tile, &allowed_z) != SLOPE_FLAT) allowed_z++;
|
if (GetTileSlope(tile, &allowed_z) != SLOPE_FLAT) allowed_z++;
|
||||||
|
|
||||||
TILE_AREA_LOOP(t, ta) {
|
for (TileIndex t : ta) {
|
||||||
uint16 callback = CALLBACK_FAILED;
|
uint16 callback = CALLBACK_FAILED;
|
||||||
if (HasBit(spec->callback_mask, CBM_OBJ_SLOPE_CHECK)) {
|
if (HasBit(spec->callback_mask, CBM_OBJ_SLOPE_CHECK)) {
|
||||||
TileIndex diff = t - tile;
|
TileIndex diff = t - tile;
|
||||||
@@ -290,7 +290,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
/* This is basically a copy of the loop above with the exception that we now
|
/* 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. */
|
* 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 (HasTileWaterGround(t)) {
|
||||||
if (!IsWaterTile(t)) {
|
if (!IsWaterTile(t)) {
|
||||||
DoCommand(t, 0, 0, (flags & ~DC_NO_WATER) | DC_NO_MODIFY_TOWN_RATING, CMD_LANDSCAPE_CLEAR);
|
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. */
|
/* Finally do a check for bridges. */
|
||||||
if (type < NEW_OBJECT_OFFSET || !_settings_game.construction.allow_grf_objects_under_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) && (
|
if (IsBridgeAbove(t) && (
|
||||||
!(spec->flags & OBJECT_FLAG_ALLOW_UNDER_BRIDGE) ||
|
!(spec->flags & OBJECT_FLAG_ALLOW_UNDER_BRIDGE) ||
|
||||||
(GetTileMaxZ(t) + spec->height >= GetBridgeHeight(GetSouthernBridgeEnd(t))))) {
|
(GetTileMaxZ(t) + spec->height >= GetBridgeHeight(GetSouthernBridgeEnd(t))))) {
|
||||||
@@ -588,7 +588,7 @@ static Foundation GetFoundation_Object(TileIndex tile, Slope tileh)
|
|||||||
static void ReallyClearObjectTile(Object *o)
|
static void ReallyClearObjectTile(Object *o)
|
||||||
{
|
{
|
||||||
Object::DecTypeCount(o->type);
|
Object::DecTypeCount(o->type);
|
||||||
TILE_AREA_LOOP(tile_cur, o->location) {
|
for (TileIndex tile_cur : o->location) {
|
||||||
DeleteNewGRFInspectWindow(GSF_OBJECTS, tile_cur);
|
DeleteNewGRFInspectWindow(GSF_OBJECTS, tile_cur);
|
||||||
|
|
||||||
MakeWaterKeepingClass(tile_cur, GetTileOwner(tile_cur));
|
MakeWaterKeepingClass(tile_cur, GetTileOwner(tile_cur));
|
||||||
|
@@ -837,7 +837,7 @@ int openttd_main(int argc, char *argv[])
|
|||||||
DeterminePaths(argv[0]);
|
DeterminePaths(argv[0]);
|
||||||
TarScanner::DoScan(TarScanner::BASESET);
|
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 (_dedicated_forks && !dedicated) _dedicated_forks = false;
|
||||||
|
|
||||||
#if defined(UNIX)
|
#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
|
* special cases which make clients desync immediately. So we fall
|
||||||
* back to just generating a new game with the current settings.
|
* 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);
|
MakeNewGame(false, true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1682,7 +1682,7 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log)
|
|||||||
/* Check docking tiles */
|
/* Check docking tiles */
|
||||||
TileArea ta;
|
TileArea ta;
|
||||||
std::map<TileIndex, bool> docking_tiles;
|
std::map<TileIndex, bool> docking_tiles;
|
||||||
TILE_AREA_LOOP(tile, st->docking_station) {
|
for (TileIndex tile : st->docking_station) {
|
||||||
ta.Add(tile);
|
ta.Add(tile);
|
||||||
docking_tiles[tile] = IsDockingTile(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)",
|
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);
|
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)) {
|
if (docking_tiles[tile] != IsDockingTile(tile)) {
|
||||||
CCLOG("docking tile mismatch: tile %i", (int)tile);
|
CCLOG("docking tile mismatch: tile %i", (int)tile);
|
||||||
}
|
}
|
||||||
|
@@ -2718,7 +2718,7 @@ static uint16 GetFreeStationPlatforms(StationID st_id)
|
|||||||
bool is_free;
|
bool is_free;
|
||||||
TileIndex t2;
|
TileIndex t2;
|
||||||
uint16 counter = 0;
|
uint16 counter = 0;
|
||||||
TILE_AREA_LOOP(t1, st->train_station) {
|
for (TileIndex t1 : st->train_station) {
|
||||||
if (st->TileBelongsToRailStation(t1)) {
|
if (st->TileBelongsToRailStation(t1)) {
|
||||||
/* We only proceed if this tile is a track tile and the north(-east/-west) end of the platform */
|
/* 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;
|
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.sound.confirm) SndPlayTileFx(SND_1F_CONSTRUCTION_OTHER, tile);
|
||||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||||
TileArea roadstop_area(tile, GB(p1, 0, 8), GB(p1, 8, 8));
|
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);
|
ConnectRoadToStructure(cur_tile, dir);
|
||||||
/* For a drive-through road stop build connecting road for other entrance. */
|
/* For a drive-through road stop build connecting road for other entrance. */
|
||||||
if (HasBit(p2, 1)) ConnectRoadToStructure(cur_tile, ReverseDiagDir(dir));
|
if (HasBit(p2, 1)) ConnectRoadToStructure(cur_tile, ReverseDiagDir(dir));
|
||||||
|
@@ -639,8 +639,8 @@ bool AfterLoadGame()
|
|||||||
if (IsSavegameVersionBefore(SLV_119)) {
|
if (IsSavegameVersionBefore(SLV_119)) {
|
||||||
_pause_mode = (_pause_mode == 2) ? PM_PAUSED_NORMAL : PM_UNPAUSED;
|
_pause_mode = (_pause_mode == 2) ? PM_PAUSED_NORMAL : PM_UNPAUSED;
|
||||||
} else if (_network_dedicated && (_pause_mode & PM_PAUSED_ERROR) != 0) {
|
} 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 loading savegame was paused due to an error state");
|
||||||
DEBUG(net, 0, " The savegame cannot be used for multiplayer!");
|
DEBUG(net, 0, " This savegame cannot be used for multiplayer");
|
||||||
/* Restore the signals */
|
/* Restore the signals */
|
||||||
ResetSignalHandlers();
|
ResetSignalHandlers();
|
||||||
return false;
|
return false;
|
||||||
|
@@ -89,7 +89,7 @@ void MoveBuoysToWaypoints()
|
|||||||
|
|
||||||
if (train) {
|
if (train) {
|
||||||
/* When we make a rail waypoint of the station, convert the map as well. */
|
/* 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;
|
if (!IsTileType(t, MP_STATION) || GetStationIndex(t) != index) continue;
|
||||||
|
|
||||||
SB(_me[t].m6, 3, 3, STATION_WAYPOINT);
|
SB(_me[t].m6, 3, 3, STATION_WAYPOINT);
|
||||||
|
@@ -186,7 +186,7 @@
|
|||||||
if (!HasHeliport(industry_id)) return INVALID_TILE;
|
if (!HasHeliport(industry_id)) return INVALID_TILE;
|
||||||
|
|
||||||
const Industry *ind = ::Industry::Get(industry_id);
|
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)) {
|
if (IsTileType(tile_cur, MP_STATION) && IsOilRig(tile_cur)) {
|
||||||
return tile_cur;
|
return tile_cur;
|
||||||
}
|
}
|
||||||
@@ -208,7 +208,7 @@
|
|||||||
if (!HasDock(industry_id)) return INVALID_TILE;
|
if (!HasDock(industry_id)) return INVALID_TILE;
|
||||||
|
|
||||||
const Industry *ind = ::Industry::Get(industry_id);
|
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)) {
|
if (IsTileType(tile_cur, MP_STATION) && IsOilRig(tile_cur)) {
|
||||||
return tile_cur;
|
return tile_cur;
|
||||||
}
|
}
|
||||||
|
@@ -261,11 +261,11 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
|
|||||||
case OT_GOTO_STATION: {
|
case OT_GOTO_STATION: {
|
||||||
const Station *st = ::Station::Get(order->GetDestination());
|
const Station *st = ::Station::Get(order->GetDestination());
|
||||||
if (st->train_station.tile != INVALID_TILE) {
|
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;
|
if (st->TileBelongsToRailStation(t)) return t;
|
||||||
}
|
}
|
||||||
} else if (st->ship_station.tile != INVALID_TILE) {
|
} 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;
|
if (IsTileType(t, MP_STATION) && (IsDock(t) || IsOilRig(t)) && GetStationIndex(t) == st->index) return t;
|
||||||
}
|
}
|
||||||
} else if (st->bus_stops != nullptr) {
|
} else if (st->bus_stops != nullptr) {
|
||||||
@@ -273,7 +273,7 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
|
|||||||
} else if (st->truck_stops != nullptr) {
|
} else if (st->truck_stops != nullptr) {
|
||||||
return st->truck_stops->xy;
|
return st->truck_stops->xy;
|
||||||
} else if (st->airport.tile != INVALID_TILE) {
|
} 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;
|
if (st->TileBelongsToAirport(tile) && !::IsHangar(tile)) return tile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr
|
|||||||
case OT_GOTO_WAYPOINT: {
|
case OT_GOTO_WAYPOINT: {
|
||||||
const Waypoint *wp = ::Waypoint::Get(order->GetDestination());
|
const Waypoint *wp = ::Waypoint::Get(order->GetDestination());
|
||||||
if (wp->train_station.tile != INVALID_TILE) {
|
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;
|
if (wp->TileBelongsToRailStation(t)) return t;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,7 +21,7 @@ void ScriptTileList::AddRectangle(TileIndex t1, TileIndex t2)
|
|||||||
if (!::IsValidTile(t2)) return;
|
if (!::IsValidTile(t2)) return;
|
||||||
|
|
||||||
TileArea ta(t1, t2);
|
TileArea ta(t1, t2);
|
||||||
TILE_AREA_LOOP(t, ta) this->AddItem(t);
|
for (TileIndex t : ta) this->AddItem(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptTileList::AddTile(TileIndex tile)
|
void ScriptTileList::AddTile(TileIndex tile)
|
||||||
@@ -37,7 +37,7 @@ void ScriptTileList::RemoveRectangle(TileIndex t1, TileIndex t2)
|
|||||||
if (!::IsValidTile(t2)) return;
|
if (!::IsValidTile(t2)) return;
|
||||||
|
|
||||||
TileArea ta(t1, t2);
|
TileArea ta(t1, t2);
|
||||||
TILE_AREA_LOOP(t, ta) this->RemoveItem(t);
|
for (TileIndex t : ta) this->RemoveItem(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScriptTileList::RemoveTile(TileIndex tile)
|
void ScriptTileList::RemoveTile(TileIndex tile)
|
||||||
@@ -55,7 +55,7 @@ void ScriptTileList::RemoveTile(TileIndex tile)
|
|||||||
*/
|
*/
|
||||||
static void FillIndustryCatchment(const Industry *i, int radius, BitmapTileArea &bta)
|
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;
|
if (!::IsTileType(cur_tile, MP_INDUSTRY) || ::GetIndustryIndex(cur_tile) != i->index) continue;
|
||||||
|
|
||||||
int tx = TileX(cur_tile);
|
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);
|
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);
|
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 (!::IsTileType(cur_tile, MP_STATION)) continue;
|
||||||
if (::GetStationIndex(cur_tile) != station_id) continue;
|
if (::GetStationIndex(cur_tile) != station_id) continue;
|
||||||
if (!HasBit(station_type_value, ::GetStationType(cur_tile))) 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->SetSetting(item.name, InteractiveRandomRange(item.max_value + 1 - item.min_value) + item.min_value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this->AddRandomDeviation();
|
this->AddRandomDeviation();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -52,7 +53,9 @@ ScriptConfig::ScriptConfig(const ScriptConfig *config)
|
|||||||
for (const auto &item : config->settings) {
|
for (const auto &item : config->settings) {
|
||||||
this->settings[stredup(item.first)] = item.second;
|
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()
|
ScriptConfig::~ScriptConfig()
|
||||||
|
@@ -662,7 +662,7 @@ inline uint32 SmallMapWindow::GetTileColours(const TileArea &ta) const
|
|||||||
TileIndex tile = INVALID_TILE; // Position of the most important tile.
|
TileIndex tile = INVALID_TILE; // Position of the most important tile.
|
||||||
TileType et = MP_VOID; // Effective tile type at that position.
|
TileType et = MP_VOID; // Effective tile type at that position.
|
||||||
|
|
||||||
TILE_AREA_LOOP(ti, ta) {
|
for (TileIndex ti : ta) {
|
||||||
TileType ttype = GetTileType(ti);
|
TileType ttype = GetTileType(ti);
|
||||||
|
|
||||||
switch (ttype) {
|
switch (ttype) {
|
||||||
|
@@ -442,7 +442,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists)
|
|||||||
if (!_settings_game.station.serve_neutral_industries && this->industry != nullptr) {
|
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. */
|
/* Station is associated with an industry, so we only need to deliver to that industry. */
|
||||||
this->catchment_tiles.Initialize(this->industry->location);
|
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) {
|
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == this->industry->index) {
|
||||||
this->catchment_tiles.SetTile(tile);
|
this->catchment_tiles.SetTile(tile);
|
||||||
}
|
}
|
||||||
@@ -458,7 +458,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists)
|
|||||||
/* Loop finding all station tiles */
|
/* Loop finding all station tiles */
|
||||||
TileArea ta(TileXY(this->rect.left, this->rect.top), TileXY(this->rect.right, this->rect.bottom));
|
TileArea ta(TileXY(this->rect.left, this->rect.top), TileXY(this->rect.right, this->rect.bottom));
|
||||||
this->station_tiles = 0;
|
this->station_tiles = 0;
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
if (!IsTileType(tile, MP_STATION) || GetStationIndex(tile) != this->index) continue;
|
if (!IsTileType(tile, MP_STATION) || GetStationIndex(tile) != this->index) continue;
|
||||||
this->station_tiles++;
|
this->station_tiles++;
|
||||||
}
|
}
|
||||||
@@ -470,7 +470,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists)
|
|||||||
/* Loop finding all station tiles */
|
/* Loop finding all station tiles */
|
||||||
TileArea ta(TileXY(this->rect.left, this->rect.top), TileXY(this->rect.right, this->rect.bottom));
|
TileArea ta(TileXY(this->rect.left, this->rect.top), TileXY(this->rect.right, this->rect.bottom));
|
||||||
this->station_tiles = 0;
|
this->station_tiles = 0;
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
if (!IsTileType(tile, MP_STATION) || GetStationIndex(tile) != this->index) continue;
|
if (!IsTileType(tile, MP_STATION) || GetStationIndex(tile) != this->index) continue;
|
||||||
|
|
||||||
this->station_tiles++;
|
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. */
|
/* 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);
|
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 */
|
/* 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)
|
/* 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));
|
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;
|
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;
|
uint max_c = _settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED;
|
||||||
max_c += _settings_game.station.catchment_increase;
|
max_c += _settings_game.station.catchment_increase;
|
||||||
TileArea ta_ext = TileArea(ta).Expand(max_c);
|
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));
|
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;
|
if (!_settings_game.station.serve_neutral_industries && st->industry != nullptr) continue;
|
||||||
|
|
||||||
/* Test if the tile is within the station's catchment */
|
/* Test if the tile is within the station's catchment */
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
if (st->TileIsInCatchment(tile)) {
|
if (st->TileIsInCatchment(tile)) {
|
||||||
if (func(st, tile)) break;
|
if (func(st, tile)) break;
|
||||||
}
|
}
|
||||||
|
@@ -104,7 +104,7 @@ CommandCost GetStationAround(TileArea ta, StationID closest_station, CompanyID c
|
|||||||
ta.Expand(1);
|
ta.Expand(1);
|
||||||
|
|
||||||
/* check around to see if there are any stations there owned by the company */
|
/* 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)) {
|
if (IsTileType(tile_cur, MP_STATION)) {
|
||||||
StationID t = GetStationIndex(tile_cur);
|
StationID t = GetStationIndex(tile_cur);
|
||||||
if (!T::IsValidID(t) || Station::Get(t)->owner != company) continue;
|
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
|
/* Loop over all tiles to get the produced cargo of
|
||||||
* everything except industries */
|
* everything except industries */
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
if (IsTileType(tile, MP_INDUSTRY)) industries.insert(GetIndustryIndex(tile));
|
if (IsTileType(tile, MP_INDUSTRY)) industries.insert(GetIndustryIndex(tile));
|
||||||
AddProducedCargo(tile, produced);
|
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);
|
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. */
|
/* 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;
|
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);
|
const StationSpec *statspec = StationClass::Get(spec_class)->GetSpec(spec_index);
|
||||||
bool slope_cb = statspec != nullptr && HasBit(statspec->callback_mask, CBM_STATION_SLOPE_CHECK);
|
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);
|
CommandCost ret = CheckBuildableTile(tile_cur, invalid_dirs, allowed_z, false, false);
|
||||||
if (ret.Failed()) return ret;
|
if (ret.Failed()) return ret;
|
||||||
cost.AddCost(ret);
|
cost.AddCost(ret);
|
||||||
@@ -1080,7 +1080,7 @@ static CommandCost CheckFlatLandRoadStop(TileArea tile_area, DoCommandFlag flags
|
|||||||
CommandCost cost(EXPENSES_CONSTRUCTION);
|
CommandCost cost(EXPENSES_CONSTRUCTION);
|
||||||
int allowed_z = -1;
|
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);
|
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;
|
if (ret.Failed()) return ret;
|
||||||
cost.AddCost(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);
|
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. */
|
/* Don't even try to make eye candy parts reserved. */
|
||||||
if (IsStationTileBlocked(tile)) continue;
|
if (IsStationTileBlocked(tile)) continue;
|
||||||
|
|
||||||
@@ -1759,7 +1759,7 @@ CommandCost RemoveFromRailBaseStation(TileArea ta, std::vector<T *> &affected_st
|
|||||||
CommandCost error;
|
CommandCost error;
|
||||||
|
|
||||||
/* Do the action for every tile into the area */
|
/* 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 */
|
/* Make sure the specified tile is a rail station */
|
||||||
if (!HasStationTileRail(tile)) continue;
|
if (!HasStationTileRail(tile)) continue;
|
||||||
|
|
||||||
@@ -1931,7 +1931,7 @@ CommandCost RemoveRailStation(T *st, DoCommandFlag flags, Money removal_cost)
|
|||||||
|
|
||||||
CommandCost cost(EXPENSES_CONSTRUCTION);
|
CommandCost cost(EXPENSES_CONSTRUCTION);
|
||||||
/* clear all areas of the station */
|
/* clear all areas of the station */
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
/* only remove tiles that are actually train station tiles */
|
/* only remove tiles that are actually train station tiles */
|
||||||
if (st->TileBelongsToRailStation(tile)) {
|
if (st->TileBelongsToRailStation(tile)) {
|
||||||
std::vector<T*> affected_stations; // dummy
|
std::vector<T*> affected_stations; // dummy
|
||||||
@@ -2099,7 +2099,7 @@ CommandCost CmdBuildRoadStop(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
|
|||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
/* Check every tile in the area. */
|
/* 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 */
|
/* Get existing road types and owners before any tile clearing */
|
||||||
RoadType road_rt = MayHaveRoad(cur_tile) ? GetRoadType(cur_tile, RTT_ROAD) : INVALID_ROADTYPE;
|
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;
|
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);
|
CommandCost last_error(STR_ERROR_THERE_IS_NO_STATION);
|
||||||
bool had_success = false;
|
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 */
|
/* 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;
|
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);
|
CommandCost cost(EXPENSES_CONSTRUCTION);
|
||||||
|
|
||||||
TILE_AREA_LOOP(tile_cur, st->airport) {
|
for (TileIndex tile_cur : st->airport) {
|
||||||
if (!st->TileBelongsToAirport(tile_cur)) continue;
|
if (!st->TileBelongsToAirport(tile_cur)) continue;
|
||||||
|
|
||||||
CommandCost ret = EnsureNoVehicleOnGround(tile_cur);
|
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);
|
if (IsHangarTile(tile_cur)) OrderBackup::Reset(tile_cur, false);
|
||||||
DeleteAnimatedTile(tile_cur);
|
DeleteAnimatedTile(tile_cur);
|
||||||
DoClearSquare(tile_cur);
|
DoClearSquare(tile_cur);
|
||||||
@@ -2716,7 +2716,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
|
|||||||
Town *nearest = AirportGetNearestTown(as, it, dist);
|
Town *nearest = AirportGetNearestTown(as, it, dist);
|
||||||
nearest->noise_reached -= GetAirportNoiseLevelForDistance(as, dist);
|
nearest->noise_reached -= GetAirportNoiseLevelForDistance(as, dist);
|
||||||
|
|
||||||
TILE_AREA_LOOP(tile_cur, st->airport) {
|
for (TileIndex tile_cur : st->airport) {
|
||||||
DeleteAnimatedTile(tile_cur);
|
DeleteAnimatedTile(tile_cur);
|
||||||
DoClearSquare(tile_cur);
|
DoClearSquare(tile_cur);
|
||||||
DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur);
|
DeleteNewGRFInspectWindow(GSF_AIRPORTTILES, tile_cur);
|
||||||
@@ -4627,7 +4627,7 @@ void UpdateStationDockingTiles(Station *st)
|
|||||||
int y1 = std::max<int>(y - 1, 0);
|
int y1 = std::max<int>(y - 1, 0);
|
||||||
|
|
||||||
TileArea ta(TileXY(x1, y1), TileXY(x2 - 1, y2 - 1));
|
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);
|
if (IsValidTile(tile) && IsPossibleDockingTile(tile)) CheckForDockingTile(tile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -118,7 +118,7 @@ static void FindStationsAroundSelection()
|
|||||||
Station *adjacent = nullptr;
|
Station *adjacent = nullptr;
|
||||||
|
|
||||||
/* Direct loop instead of ForAllStationsAroundTiles as we are not interested in catchment area */
|
/* 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) {
|
if (IsTileType(tile, MP_STATION) && GetTileOwner(tile) == _local_company) {
|
||||||
Station *st = Station::GetByTile(tile);
|
Station *st = Station::GetByTile(tile);
|
||||||
if (st == nullptr) continue;
|
if (st == nullptr) continue;
|
||||||
@@ -2391,7 +2391,7 @@ static const T *FindStationsNearby(TileArea ta, bool distant_join)
|
|||||||
_deleted_stations_nearby.clear();
|
_deleted_stations_nearby.clear();
|
||||||
|
|
||||||
/* Check the inside, to return, if we sit on another station */
|
/* 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);
|
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. */
|
/* Calculate the produced cargo of houses around town center. */
|
||||||
CargoArray town_cargo_produced;
|
CargoArray town_cargo_produced;
|
||||||
TileArea ta = TileArea(src_town->xy, 1, 1).Expand(SUBSIDY_TOWN_CARGO_RADIUS);
|
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)) {
|
if (IsTileType(tile, MP_HOUSE)) {
|
||||||
AddProducedCargo(tile, town_cargo_produced);
|
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. */
|
/* Calculate cargo acceptance of houses around town center. */
|
||||||
CargoArray town_cargo_accepted;
|
CargoArray town_cargo_accepted;
|
||||||
TileArea ta = TileArea(dst_town->xy, 1, 1).Expand(SUBSIDY_TOWN_CARGO_RADIUS);
|
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)) {
|
if (IsTileType(tile, MP_HOUSE)) {
|
||||||
AddAcceptedCargo(tile, town_cargo_accepted, nullptr);
|
AddAcceptedCargo(tile, town_cargo_accepted, nullptr);
|
||||||
}
|
}
|
||||||
|
@@ -1390,7 +1390,7 @@ static const char * const _name_polish_2_o[] = {
|
|||||||
"Zakopane",
|
"Zakopane",
|
||||||
u8"Szklarska Por\u0119ba",
|
u8"Szklarska Por\u0119ba",
|
||||||
"Bochnia",
|
"Bochnia",
|
||||||
"Golub-Dobrzyn",
|
u8"Golub-Dobrzy\u0144",
|
||||||
"Chojnice",
|
"Chojnice",
|
||||||
"Ostrowiec",
|
"Ostrowiec",
|
||||||
"Otwock",
|
"Otwock",
|
||||||
@@ -1484,7 +1484,7 @@ static const char * const _name_polish_2_n[] = {
|
|||||||
"Pilzno",
|
"Pilzno",
|
||||||
"Przodkowo",
|
"Przodkowo",
|
||||||
"Strzelno",
|
"Strzelno",
|
||||||
"Susz",
|
"Leszno",
|
||||||
"Jaworzno",
|
"Jaworzno",
|
||||||
"Choszczno",
|
"Choszczno",
|
||||||
"Mogilno",
|
"Mogilno",
|
||||||
|
@@ -65,7 +65,7 @@ static void GenerateDesertArea(TileIndex end, TileIndex start)
|
|||||||
_generating_world = true;
|
_generating_world = true;
|
||||||
|
|
||||||
TileArea ta(start, end);
|
TileArea ta(start, end);
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
SetTropicZone(tile, (_ctrl_pressed) ? TROPICZONE_NORMAL : TROPICZONE_DESERT);
|
SetTropicZone(tile, (_ctrl_pressed) ? TROPICZONE_NORMAL : TROPICZONE_DESERT);
|
||||||
DoCommandP(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
|
DoCommandP(tile, 0, 0, CMD_LANDSCAPE_CLEAR);
|
||||||
MarkTileDirtyByTile(tile);
|
MarkTileDirtyByTile(tile);
|
||||||
@@ -82,7 +82,7 @@ static void GenerateRockyArea(TileIndex end, TileIndex start)
|
|||||||
bool success = false;
|
bool success = false;
|
||||||
TileArea ta(start, end);
|
TileArea ta(start, end);
|
||||||
|
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
switch (GetTileType(tile)) {
|
switch (GetTileType(tile)) {
|
||||||
case MP_TREES:
|
case MP_TREES:
|
||||||
if (GetTreeGround(tile) == TREE_GROUND_SHORE) continue;
|
if (GetTreeGround(tile) == TREE_GROUND_SHORE) continue;
|
||||||
@@ -494,18 +494,18 @@ static void CommonRaiseLowerBigLand(TileIndex tile, int mode)
|
|||||||
if (mode != 0) {
|
if (mode != 0) {
|
||||||
/* Raise land */
|
/* Raise land */
|
||||||
h = MAX_TILE_HEIGHT;
|
h = MAX_TILE_HEIGHT;
|
||||||
TILE_AREA_LOOP(tile2, ta) {
|
for (TileIndex tile2 : ta) {
|
||||||
h = std::min(h, TileHeight(tile2));
|
h = std::min(h, TileHeight(tile2));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Lower land */
|
/* Lower land */
|
||||||
h = 0;
|
h = 0;
|
||||||
TILE_AREA_LOOP(tile2, ta) {
|
for (TileIndex tile2 : ta) {
|
||||||
h = std::max(h, TileHeight(tile2));
|
h = std::max(h, TileHeight(tile2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TILE_AREA_LOOP(tile2, ta) {
|
for (TileIndex tile2 : ta) {
|
||||||
if (TileHeight(tile2) == h) {
|
if (TileHeight(tile2) == h) {
|
||||||
DoCommandP(tile2, SLOPE_N, (uint32)mode, CMD_TERRAFORM_LAND);
|
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));
|
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.
|
* Create a diagonal tile area from two corners.
|
||||||
* @param start First corner of the area.
|
* @param start First corner of the area.
|
||||||
|
@@ -15,6 +15,9 @@
|
|||||||
#include "map_func.h"
|
#include "map_func.h"
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
|
|
||||||
|
template<uint N> class OrthogonalTileIteratorStep;
|
||||||
|
using OrthogonalTileIterator = class OrthogonalTileIteratorStep<1>;
|
||||||
|
|
||||||
/** Represents the covered area of e.g. a rail station */
|
/** Represents the covered area of e.g. a rail station */
|
||||||
struct OrthogonalTileArea {
|
struct OrthogonalTileArea {
|
||||||
TileIndex tile; ///< The base tile of the area
|
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);
|
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. */
|
/** Represents a diagonal tile area. */
|
||||||
@@ -131,6 +138,15 @@ public:
|
|||||||
return this->tile;
|
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.
|
* 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.
|
/** Iterator to iterate over a tile area (rectangle) of the map.
|
||||||
* It prefetches tiles once per row.
|
* 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 */
|
#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)
|
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);
|
CommandCost ret = CanBuildHouseHere(tile, town, noslope);
|
||||||
/* if building on slopes is allowed, there will be flattening foundation (to tile max z) */
|
/* 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);
|
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));
|
int limit = (c == nullptr ? INT32_MAX : GB(c->tree_limit, 16, 16));
|
||||||
|
|
||||||
TileArea ta(tile, p2);
|
TileArea ta(tile, p2);
|
||||||
TILE_AREA_LOOP(tile, ta) {
|
for (TileIndex tile : ta) {
|
||||||
switch (GetTileType(tile)) {
|
switch (GetTileType(tile)) {
|
||||||
case MP_TREES: {
|
case MP_TREES: {
|
||||||
bool grow_existing_tree_instead = false;
|
bool grow_existing_tree_instead = false;
|
||||||
|
@@ -256,7 +256,7 @@ void VideoDriver_Dedicated::MainLoop()
|
|||||||
* intro game... */
|
* intro game... */
|
||||||
if (SaveOrLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, BASE_DIR) == SL_ERROR) {
|
if (SaveOrLoad(_file_to_saveload.name, _file_to_saveload.file_op, _file_to_saveload.detail_ftype, BASE_DIR) == SL_ERROR) {
|
||||||
/* Loading failed, pop out.. */
|
/* Loading failed, pop out.. */
|
||||||
DEBUG(net, 0, "Loading requested map failed, aborting");
|
DEBUG(net, 0, "Loading requested map failed; closing server.");
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
/* We can load this game, so go ahead */
|
/* 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. */
|
/* Find the most important tile of the area. */
|
||||||
TileIndex result = from_tile;
|
TileIndex result = from_tile;
|
||||||
uint importance = 0;
|
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 TileType ttype = GetTileType(tile);
|
||||||
const uint tile_importance = _tiletype_importance[ttype];
|
const uint tile_importance = _tiletype_importance[ttype];
|
||||||
if (tile_importance > importance) {
|
if (tile_importance > importance) {
|
||||||
|
@@ -1079,7 +1079,7 @@ static void FloodVehicles(TileIndex tile)
|
|||||||
|
|
||||||
if (IsAirportTile(tile)) {
|
if (IsAirportTile(tile)) {
|
||||||
const Station *st = Station::GetByTile(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);
|
if (st->TileBelongsToAirport(tile)) FindFloodVehicle(tile, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1193,14 +1193,10 @@ void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
|
|||||||
*/
|
*/
|
||||||
void DeleteWindowByClass(WindowClass cls)
|
void DeleteWindowByClass(WindowClass cls)
|
||||||
{
|
{
|
||||||
restart_search:
|
/* Note: the container remains stable, even when deleting windows. */
|
||||||
/* 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 */
|
|
||||||
for (Window *w : Window::IterateFromBack()) {
|
for (Window *w : Window::IterateFromBack()) {
|
||||||
if (w->window_class == cls) {
|
if (w->window_class == cls) {
|
||||||
delete w;
|
delete w;
|
||||||
goto restart_search;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1213,14 +1209,10 @@ restart_search:
|
|||||||
*/
|
*/
|
||||||
void DeleteCompanyWindows(CompanyID id)
|
void DeleteCompanyWindows(CompanyID id)
|
||||||
{
|
{
|
||||||
restart_search:
|
/* Note: the container remains stable, even when deleting windows. */
|
||||||
/* 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 */
|
|
||||||
for (Window *w : Window::IterateFromBack()) {
|
for (Window *w : Window::IterateFromBack()) {
|
||||||
if (w->owner == id) {
|
if (w->owner == id) {
|
||||||
delete w;
|
delete w;
|
||||||
goto restart_search;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3406,10 +3398,7 @@ void CallWindowGameTickEvent()
|
|||||||
*/
|
*/
|
||||||
void DeleteNonVitalWindows()
|
void DeleteNonVitalWindows()
|
||||||
{
|
{
|
||||||
restart_search:
|
/* Note: the container remains stable, even when deleting windows. */
|
||||||
/* 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 */
|
|
||||||
for (const Window *w : Window::IterateFromBack()) {
|
for (const Window *w : Window::IterateFromBack()) {
|
||||||
if (w->window_class != WC_MAIN_WINDOW &&
|
if (w->window_class != WC_MAIN_WINDOW &&
|
||||||
w->window_class != WC_SELECT_GAME &&
|
w->window_class != WC_SELECT_GAME &&
|
||||||
@@ -3419,7 +3408,6 @@ restart_search:
|
|||||||
(w->flags & WF_STICKY) == 0) { // do not delete windows which are 'pinned'
|
(w->flags & WF_STICKY) == 0) { // do not delete windows which are 'pinned'
|
||||||
|
|
||||||
delete w;
|
delete w;
|
||||||
goto restart_search;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3436,14 +3424,10 @@ void DeleteAllNonVitalWindows()
|
|||||||
/* Delete every window except for stickied ones, then sticky ones as well */
|
/* Delete every window except for stickied ones, then sticky ones as well */
|
||||||
DeleteNonVitalWindows();
|
DeleteNonVitalWindows();
|
||||||
|
|
||||||
restart_search:
|
/* Note: the container remains stable, even when deleting windows. */
|
||||||
/* 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 */
|
|
||||||
for (const Window *w : Window::IterateFromBack()) {
|
for (const Window *w : Window::IterateFromBack()) {
|
||||||
if (w->flags & WF_STICKY) {
|
if (w->flags & WF_STICKY) {
|
||||||
delete w;
|
delete w;
|
||||||
goto restart_search;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3465,14 +3449,10 @@ void DeleteAllMessages()
|
|||||||
*/
|
*/
|
||||||
void DeleteConstructionWindows()
|
void DeleteConstructionWindows()
|
||||||
{
|
{
|
||||||
restart_search:
|
/* Note: the container remains stable, even when deleting windows. */
|
||||||
/* 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 */
|
|
||||||
for (const Window *w : Window::IterateFromBack()) {
|
for (const Window *w : Window::IterateFromBack()) {
|
||||||
if (w->window_desc->flags & WDF_CONSTRUCTION) {
|
if (w->window_desc->flags & WDF_CONSTRUCTION) {
|
||||||
delete w;
|
delete w;
|
||||||
goto restart_search;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user