mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-25 07:29:10 +00:00
Compare commits
1 Commits
1.4.3
...
1.4.0-beta
Author | SHA1 | Date | |
---|---|---|---|
|
dd7fffc27e |
@@ -75,10 +75,10 @@ $(BIN_DIR)/%.obm: $(BASESET_DIR)/%.obm $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/
|
|||||||
$(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $< >$@
|
$(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $< >$@
|
||||||
|
|
||||||
# Compile extra grf
|
# Compile extra grf
|
||||||
$(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites $(GRF_DIR)/assemble_nfo.awk
|
$(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites
|
||||||
$(E) '$(STAGE) Assembling openttd.nfo'
|
$(E) '$(STAGE) Assembling openttd.nfo'
|
||||||
$(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null
|
$(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null
|
||||||
$(Q) awk -f $(GRF_DIR)/assemble_nfo.awk $(GRF_DIR)/openttd.nfo > $(OBJS_DIR)/sprites/openttd.nfo
|
$(Q) $(CC_BUILD) -nostdinc -I$(GRF_DIR) -C -E - < "$(GRF_DIR)/openttd.nfo" | sed -e '/^#/d' -e '/^$$/d' > $(OBJS_DIR)/sprites/openttd.nfo
|
||||||
$(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/openttd.nfo
|
$(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/openttd.nfo
|
||||||
$(E) '$(STAGE) Compiling openttd.grf'
|
$(E) '$(STAGE) Compiling openttd.grf'
|
||||||
$(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/openttd.grf
|
$(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/openttd.grf
|
||||||
|
@@ -10,7 +10,7 @@ fallback = true
|
|||||||
description = A music pack without actual music.
|
description = A music pack without actual music.
|
||||||
description.af_ZA = 'n Musiek stel sonder enige musiek.
|
description.af_ZA = 'n Musiek stel sonder enige musiek.
|
||||||
description.ar_EG = مجموعة موسيقى بدون موسيقى
|
description.ar_EG = مجموعة موسيقى بدون موسيقى
|
||||||
description.be_BY = "Пусты" набор музычнага афармлення, які не зьмяшчае ніякай музыкі.
|
description.be_BY = "Пусты" набор музычнага афармлення, не змяшчаючы ніякай музыкі.
|
||||||
description.bg_BG = Празен музикален пакет.
|
description.bg_BG = Празен музикален пакет.
|
||||||
description.ca_ES = Un joc de música sense cap música.
|
description.ca_ES = Un joc de música sense cap música.
|
||||||
description.cs_CZ = Prázná hudební sada.
|
description.cs_CZ = Prázná hudební sada.
|
||||||
|
@@ -10,7 +10,7 @@ fallback = true
|
|||||||
description = A sound pack without any sounds.
|
description = A sound pack without any sounds.
|
||||||
description.af_ZA = 'n Klank stel sonder enige klanke.
|
description.af_ZA = 'n Klank stel sonder enige klanke.
|
||||||
description.ar_EG = مجموعة صوت بدوت اصوات مضافة
|
description.ar_EG = مجموعة صوت بدوت اصوات مضافة
|
||||||
description.be_BY = "Пусты" набор гукавога афармленьня, які не зьмяшчае ніякіх гукаў.
|
description.be_BY = "Пусты" набор гукавога афармленьня, не змяшчаючы ніякіх гукаў.
|
||||||
description.bg_BG = Празен звуков пакет.
|
description.bg_BG = Празен звуков пакет.
|
||||||
description.ca_ES = Un joc de sons sense cap so.
|
description.ca_ES = Un joc de sons sense cap so.
|
||||||
description.cs_CZ = Prázdná sada zvuků.
|
description.cs_CZ = Prázdná sada zvuků.
|
||||||
@@ -22,7 +22,6 @@ description.en_AU = A sound pack without any sounds.
|
|||||||
description.en_US = A sound pack without any sounds.
|
description.en_US = A sound pack without any sounds.
|
||||||
description.es_ES = Un conjunto de sonidos vacío.
|
description.es_ES = Un conjunto de sonidos vacío.
|
||||||
description.et_EE = Helikogu ilma helideta.
|
description.et_EE = Helikogu ilma helideta.
|
||||||
description.eu_ES = Soinurik gabeko soinu pakete bat
|
|
||||||
description.fi_FI = Äänipaketti, jossa ei ole ääniä.
|
description.fi_FI = Äänipaketti, jossa ei ole ääniä.
|
||||||
description.fr_FR = Un pack de sons sans sons.
|
description.fr_FR = Un pack de sons sans sons.
|
||||||
description.gd_GB = Pacaid fhuaimean anns nach eil fuaim sam bith.
|
description.gd_GB = Pacaid fhuaimean anns nach eil fuaim sam bith.
|
||||||
|
Binary file not shown.
@@ -11,7 +11,7 @@ palette = DOS
|
|||||||
description = Original Transport Tycoon Deluxe DOS edition graphics.
|
description = Original Transport Tycoon Deluxe DOS edition graphics.
|
||||||
description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS uitgawe grafieke.
|
description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS uitgawe grafieke.
|
||||||
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الرسومية نسخة الدوس
|
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الرسومية نسخة الدوس
|
||||||
description.be_BY = Арыґінальная ґрафіка з Transport Tycoon Deluxe для DOS.
|
description.be_BY = Арыгінальная графіка з Transport Tycoon Deluxe для DOS.
|
||||||
description.bg_BG = Оригинални графики на Transport Tycoon Deluxe за DOS.
|
description.bg_BG = Оригинални графики на Transport Tycoon Deluxe за DOS.
|
||||||
description.ca_ES = Gràfics originals de Transport Tycoon Deluxe per a DOS.
|
description.ca_ES = Gràfics originals de Transport Tycoon Deluxe per a DOS.
|
||||||
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (verze pro DOS).
|
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (verze pro DOS).
|
||||||
|
@@ -10,7 +10,7 @@ version = 0
|
|||||||
description = Original Transport Tycoon Deluxe DOS edition sounds.
|
description = Original Transport Tycoon Deluxe DOS edition sounds.
|
||||||
description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS uitgawe klanke.
|
description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS uitgawe klanke.
|
||||||
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الصوتية نسخة الدوس
|
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الصوتية نسخة الدوس
|
||||||
description.be_BY = Арыґінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для DOS.
|
description.be_BY = Арыгінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для DOS.
|
||||||
description.bg_BG = Оригинални звуци на Transport Tycoon Deluxe за DOS.
|
description.bg_BG = Оригинални звуци на Transport Tycoon Deluxe за DOS.
|
||||||
description.ca_ES = Sons originals de Transport Tycoon Deluxe per a DOS.
|
description.ca_ES = Sons originals de Transport Tycoon Deluxe per a DOS.
|
||||||
description.cs_CZ = Původní sada zvuků Transport Tycoon Deluxe (verze pro DOS).
|
description.cs_CZ = Původní sada zvuků Transport Tycoon Deluxe (verze pro DOS).
|
||||||
|
@@ -11,7 +11,7 @@ palette = DOS
|
|||||||
description = Original Transport Tycoon Deluxe DOS (German) edition graphics.
|
description = Original Transport Tycoon Deluxe DOS (German) edition graphics.
|
||||||
description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS (German) uitgawe grafieke.
|
description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS (German) uitgawe grafieke.
|
||||||
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الالمانية نسخة الدوس
|
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الالمانية نسخة الدوس
|
||||||
description.be_BY = Арыґінальная ґрафіка зь нямецкай версіі Transport Tycoon Deluxe для DOS.
|
description.be_BY = Арыгінальная графіка з нямецкай версіі Transport Tycoon Deluxe для DOS.
|
||||||
description.bg_BG = Оригинални графики на Transport Tycoon Deluxe за DOS (немски) .
|
description.bg_BG = Оригинални графики на Transport Tycoon Deluxe за DOS (немски) .
|
||||||
description.ca_ES = Gràfics originals de Transport Tycoon Deluxe per a DOS (Alemany).
|
description.ca_ES = Gràfics originals de Transport Tycoon Deluxe per a DOS (Alemany).
|
||||||
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (německá verze pro DOS).
|
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (německá verze pro DOS).
|
||||||
|
@@ -11,7 +11,7 @@ palette = Windows
|
|||||||
description = Original Transport Tycoon Deluxe Windows edition graphics.
|
description = Original Transport Tycoon Deluxe Windows edition graphics.
|
||||||
description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe grafieke.
|
description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe grafieke.
|
||||||
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الرسومية نسخة وندوز
|
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الرسومية نسخة وندوز
|
||||||
description.be_BY = Арыґінальная ґрафіка з Transport Tycoon Deluxe для Windows.
|
description.be_BY = Арыгінальная графіка з Transport Tycoon Deluxe для Windows.
|
||||||
description.bg_BG = Оригинални графики на Transport Tycoon Deluxe за Windows.
|
description.bg_BG = Оригинални графики на Transport Tycoon Deluxe за Windows.
|
||||||
description.ca_ES = Gràfics originals de Transport Tycoon Deluxe per a Windows.
|
description.ca_ES = Gràfics originals de Transport Tycoon Deluxe per a Windows.
|
||||||
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (verze pro Windows).
|
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (verze pro Windows).
|
||||||
@@ -33,7 +33,7 @@ description.id_ID = Grafik orisinil Transport Tycoon Deluxe versi Windows.
|
|||||||
description.is_IS = Upprunalega grafíkin úr Transport Tycoon Deluxe Windows útgáfunni.
|
description.is_IS = Upprunalega grafíkin úr Transport Tycoon Deluxe Windows útgáfunni.
|
||||||
description.it_IT = Grafica originale di Transport Tycoon Deluxe, edizione Windows.
|
description.it_IT = Grafica originale di Transport Tycoon Deluxe, edizione Windows.
|
||||||
description.ja_JP = Transport Tycoon Deluxe オリジナル版 グラフィック (Windows)
|
description.ja_JP = Transport Tycoon Deluxe オリジナル版 グラフィック (Windows)
|
||||||
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 그래픽입니다.
|
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도우 에디션의 그래픽입니다.
|
||||||
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Grafik.
|
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Grafik.
|
||||||
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo grafika.
|
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo grafika.
|
||||||
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for Windows.
|
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for Windows.
|
||||||
|
@@ -10,7 +10,7 @@ version = 1
|
|||||||
description = Original Transport Tycoon Deluxe Windows edition music.
|
description = Original Transport Tycoon Deluxe Windows edition music.
|
||||||
description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe musiek.
|
description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe musiek.
|
||||||
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الموسيقية نسخة وندوز
|
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الموسيقية نسخة وندوز
|
||||||
description.be_BY = Арыґінальны набор музычнага афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
description.be_BY = Арыгінальны набор музычнага афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
||||||
description.bg_BG = Оригинална музика на Transport Tycoon Deluxe за Windows.
|
description.bg_BG = Оригинална музика на Transport Tycoon Deluxe за Windows.
|
||||||
description.ca_ES = Música Original de Transport Tycoon Deluxe per a Windows.
|
description.ca_ES = Música Original de Transport Tycoon Deluxe per a Windows.
|
||||||
description.cs_CZ = Původní hudba Transport Tycoon Deluxe (verze pro Windows).
|
description.cs_CZ = Původní hudba Transport Tycoon Deluxe (verze pro Windows).
|
||||||
@@ -32,7 +32,7 @@ description.id_ID = Musik pengiring orisinil Transport Tycoon Deluxe versi Windo
|
|||||||
description.is_IS = Upprunalega tónlistin úr Transport Tycoon Deluxe Windows útgáfunni.
|
description.is_IS = Upprunalega tónlistin úr Transport Tycoon Deluxe Windows útgáfunni.
|
||||||
description.it_IT = Musica originale di Transport Tycoon Deluxe, edizione Windows.
|
description.it_IT = Musica originale di Transport Tycoon Deluxe, edizione Windows.
|
||||||
description.ja_JP = Transport Tycoon Deluxe オリジナル版 音楽 (Windows)
|
description.ja_JP = Transport Tycoon Deluxe オリジナル版 音楽 (Windows)
|
||||||
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 음악입니다.
|
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도우 에디션의 음악입니다.
|
||||||
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Music.
|
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Music.
|
||||||
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo muzika.
|
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo muzika.
|
||||||
description.lv_LV = Oriģinālā Transport Tycoon Deluxe Windows izdevuma mūzika.
|
description.lv_LV = Oriģinālā Transport Tycoon Deluxe Windows izdevuma mūzika.
|
||||||
|
@@ -10,7 +10,7 @@ version = 0
|
|||||||
description = Original Transport Tycoon Deluxe Windows edition sounds.
|
description = Original Transport Tycoon Deluxe Windows edition sounds.
|
||||||
description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe klanke.
|
description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe klanke.
|
||||||
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الصوتية نسخة وندوز
|
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الصوتية نسخة وندوز
|
||||||
description.be_BY = Арыґінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
description.be_BY = Арыгінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
||||||
description.bg_BG = Оригинални звуци на Transport Tycoon Deluxe за Windows.
|
description.bg_BG = Оригинални звуци на Transport Tycoon Deluxe за Windows.
|
||||||
description.ca_ES = Sons originals de Transport Tycoon Deluxe per a Windows.
|
description.ca_ES = Sons originals de Transport Tycoon Deluxe per a Windows.
|
||||||
description.cs_CZ = Původní sada zvuků Transport Tycoon Deluxe (verze pro Windows).
|
description.cs_CZ = Původní sada zvuků Transport Tycoon Deluxe (verze pro Windows).
|
||||||
@@ -32,7 +32,7 @@ description.id_ID = Efek suara orisinil Transport Tycoon Deluxe versi Windows.
|
|||||||
description.is_IS = Upprunalega hljóðið úr Transport Tycoon Deluxe Windows útgáfunni.
|
description.is_IS = Upprunalega hljóðið úr Transport Tycoon Deluxe Windows útgáfunni.
|
||||||
description.it_IT = Suoni originali di Transport Tycoon Deluxe, edizione Windows.
|
description.it_IT = Suoni originali di Transport Tycoon Deluxe, edizione Windows.
|
||||||
description.ja_JP = Transport Tycoon Deluxe オリジナル版 効果音 (Windows)
|
description.ja_JP = Transport Tycoon Deluxe オリジナル版 効果音 (Windows)
|
||||||
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 효과음입니다.
|
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도우 에디션의 효과음입니다.
|
||||||
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Sound.
|
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Sound.
|
||||||
description.lt_LT = Originalūs Transport Tycoon Deluxe Windows leidimo garsai.
|
description.lt_LT = Originalūs Transport Tycoon Deluxe Windows leidimo garsai.
|
||||||
description.nb_NO = Originale lyder fra Transport Tycoon Deluxe for Windows.
|
description.nb_NO = Originale lyder fra Transport Tycoon Deluxe for Windows.
|
||||||
|
591
changelog.txt
591
changelog.txt
File diff suppressed because it is too large
Load Diff
171
config.lib
171
config.lib
@@ -57,8 +57,8 @@ set_default() {
|
|||||||
enable_translator="0"
|
enable_translator="0"
|
||||||
enable_unicode="1"
|
enable_unicode="1"
|
||||||
enable_console="1";
|
enable_console="1";
|
||||||
enable_assert="0"
|
enable_assert="1"
|
||||||
enable_strip="1"
|
enable_strip="0"
|
||||||
enable_universal="0"
|
enable_universal="0"
|
||||||
enable_osx_g5="0"
|
enable_osx_g5="0"
|
||||||
enable_cocoa_quartz="1"
|
enable_cocoa_quartz="1"
|
||||||
@@ -1450,11 +1450,7 @@ make_cflags_and_ldflags() {
|
|||||||
LDFLAGS="$LDFLAGS -noixemul"
|
LDFLAGS="$LDFLAGS -noixemul"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$enable_profiling" = "0" ]; then
|
CFLAGS="-O2 -fomit-frame-pointer $CFLAGS"
|
||||||
# -fomit-frame-pointer and -pg do not go well together (gcc errors they are incompatible)
|
|
||||||
CFLAGS="-fomit-frame-pointer $CFLAGS"
|
|
||||||
fi
|
|
||||||
CFLAGS="-O2 $CFLAGS"
|
|
||||||
else
|
else
|
||||||
OBJS_SUBDIR="debug"
|
OBJS_SUBDIR="debug"
|
||||||
|
|
||||||
@@ -1498,7 +1494,7 @@ make_cflags_and_ldflags() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$enable_profiling" != "0" ]; then
|
if [ "$enable_profiling" != "0" ]; then
|
||||||
CFLAGS="$CFLAGS -pg"
|
CFLAGS="$CFLAGS -p"
|
||||||
LDFLAGS="$LDFLAGS -pg"
|
LDFLAGS="$LDFLAGS -pg"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -1704,18 +1700,17 @@ make_cflags_and_ldflags() {
|
|||||||
|
|
||||||
if [ -n "$png_config" ]; then
|
if [ -n "$png_config" ]; then
|
||||||
CFLAGS="$CFLAGS -DWITH_PNG"
|
CFLAGS="$CFLAGS -DWITH_PNG"
|
||||||
CFLAGS="$CFLAGS `$png_config --cflags | tr '\n\r' ' '`"
|
CFLAGS="$CFLAGS `$png_config --cppflags --I_opts | tr '\n\r' ' '`"
|
||||||
|
|
||||||
|
# The extra flags are unneeded for latest libpng-config, but some versions are so broken...
|
||||||
if [ "$enable_static" != "0" ]; then
|
if [ "$enable_static" != "0" ]; then
|
||||||
if [ "$os" = "OSX" ]; then
|
if [ "$os" = "OSX" ]; then
|
||||||
# fontconfig_config goes via pkg-config on all systems, which doesn't know --prefix
|
LIBS="$LIBS `$png_config --prefix`/lib/libpng.a"
|
||||||
# Also, despite the reason we link to the .a file ourself (because we can't use -static), we do need to ask pkg-config about possible other deps
|
|
||||||
LIBS="$LIBS `$png_config --variable=prefix`/lib/libpng.a `$png_config --libs --static | sed s@-lpng[0-9]*@@`"
|
|
||||||
else
|
else
|
||||||
LIBS="$LIBS `$png_config --libs --static | tr '\n\r' ' '`"
|
LIBS="$LIBS `$png_config --static --ldflags | tr '\n\r' ' '`"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
LIBS="$LIBS `$png_config --libs | tr '\n\r' ' '`"
|
LIBS="$LIBS `$png_config --ldflags | tr '\n\r' ' '`"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -2720,64 +2715,80 @@ detect_libtimidity() {
|
|||||||
detect_library "$with_libtimidity" "libtimidity" "libtimidity.a" "" "timidity.h"
|
detect_library "$with_libtimidity" "libtimidity" "libtimidity.a" "" "timidity.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_pkg_config() {
|
detect_lzma() {
|
||||||
# $1 - config-param ($with_lzma value)
|
|
||||||
# $2 - package name ('liblzma')
|
|
||||||
# $3 - config name ('lzma_config', sets $lzma_config)
|
|
||||||
# $4 - minimum module version ('2.3')
|
|
||||||
|
|
||||||
# 0 means no, 1 is auto-detect, 2 is force
|
# 0 means no, 1 is auto-detect, 2 is force
|
||||||
if [ "$1" = "0" ]; then
|
if [ "$with_lzma" = "0" ]; then
|
||||||
log 1 "checking $2... disabled"
|
log 1 "checking liblzma... disabled"
|
||||||
|
|
||||||
eval "$3=\"\""
|
lzma_config=""
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log 2 "detecting $2"
|
if [ "$with_lzma" = "1" ] || [ "$with_lzma" = "" ] || [ "$with_lzma" = "2" ]; then
|
||||||
|
lzma_config="pkg-config liblzma"
|
||||||
if [ "$1" = "1" ] || [ "$1" = "" ] || [ "$1" = "2" ]; then
|
|
||||||
pkg_config_call="pkg-config $2"
|
|
||||||
else
|
else
|
||||||
pkg_config_call="$1"
|
lzma_config="$with_lzma"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
version=`$pkg_config_call --modversion 2>/dev/null`
|
version=`$lzma_config --modversion 2>/dev/null`
|
||||||
ret=$?
|
ret=$?
|
||||||
check_version "$4" "$version"
|
log 2 "executing $lzma_config --modversion"
|
||||||
version_ok=$?
|
|
||||||
log 2 "executing $pkg_config_call --modversion"
|
|
||||||
log 2 " returned $version"
|
log 2 " returned $version"
|
||||||
log 2 " exit code $ret"
|
log 2 " exit code $ret"
|
||||||
|
|
||||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
|
if [ -z "$version" ] || [ "$ret" != "0" ]; then
|
||||||
if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
|
log 1 "checking liblzma... not found"
|
||||||
log 1 "checking $2... needs at least version $4, $2 NOT enabled"
|
|
||||||
else
|
|
||||||
log 1 "checking $2... not found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# It was forced, so it should be found.
|
# It was forced, so it should be found.
|
||||||
if [ "$1" != "1" ]; then
|
if [ "$with_lzma" != "1" ]; then
|
||||||
log 1 "configure: error: pkg-config $2 couldn't be found"
|
log 1 "configure: error: pkg-config liblzma couldn't be found"
|
||||||
log 1 "configure: error: you supplied '$1', but it seems invalid"
|
log 1 "configure: error: you supplied '$with_lzma', but it seems invalid"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
eval "$3=\"\""
|
lzma_config=""
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
eval "$3=\"$pkg_config_call\""
|
log 1 "checking liblzma... found"
|
||||||
log 1 "checking $2... found"
|
|
||||||
}
|
|
||||||
|
|
||||||
detect_lzma() {
|
|
||||||
detect_pkg_config "$with_lzma" "liblzma" "lzma_config" "5.0"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_xdg_basedir() {
|
detect_xdg_basedir() {
|
||||||
detect_pkg_config "$with_xdg_basedir" "libxdg-basedir" "xdg_basedir_config" "1.2"
|
# 0 means no, 1 is auto-detect, 2 is force
|
||||||
|
if [ "$with_xdg_basedir" = "0" ]; then
|
||||||
|
log 1 "checking libxdg_basedir... disabled"
|
||||||
|
|
||||||
|
xdg_basedir_config=""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$with_xdg_basedir" = "1" ] || [ "$with_xdg_basedir" = "" ] || [ "$with_xdg_basedir" = "2" ]; then
|
||||||
|
xdg_basedir_config="pkg-config libxdg-basedir"
|
||||||
|
else
|
||||||
|
xdg_basedir_config="$with_xdg_basedir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
version=`$xdg_basedir_config --modversion 2>/dev/null`
|
||||||
|
ret=$?
|
||||||
|
log 2 "executing $xdg_basedir_config --modversion"
|
||||||
|
log 2 " returned $version"
|
||||||
|
log 2 " exit code $ret"
|
||||||
|
|
||||||
|
if [ -z "$version" ] || [ "$ret" != "0" ]; then
|
||||||
|
log 1 "checking libxdg_basedir... not found"
|
||||||
|
|
||||||
|
# It was forced, so it should be found.
|
||||||
|
if [ "$with_xdg_basedir" != "1" ]; then
|
||||||
|
log 1 "configure: error: pkg-config libxdg_basedir couldn't be found"
|
||||||
|
log 1 "configure: error: you supplied '$with_xdg_basedir', but it seems invalid"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
xdg_basedir_config=""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log 1 "checking libxdg_basedir... found"
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_png() {
|
detect_png() {
|
||||||
@@ -2804,7 +2815,33 @@ detect_png() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
detect_pkg_config "$with_png" "libpng" "png_config" "1.2"
|
if [ "$with_png" = "1" ] || [ "$with_png" = "" ] || [ "$with_png" = "2" ]; then
|
||||||
|
png_config="libpng-config"
|
||||||
|
else
|
||||||
|
png_config="$with_png"
|
||||||
|
fi
|
||||||
|
|
||||||
|
version=`$png_config --version 2>/dev/null`
|
||||||
|
ret=$?
|
||||||
|
log 2 "executing $png_config --version"
|
||||||
|
log 2 " returned $version"
|
||||||
|
log 2 " exit code $ret"
|
||||||
|
|
||||||
|
if [ -z "$version" ] || [ "$ret" != "0" ]; then
|
||||||
|
log 1 "checking libpng... not found"
|
||||||
|
|
||||||
|
# It was forced, so it should be found.
|
||||||
|
if [ "$with_png" != "1" ]; then
|
||||||
|
log 1 "configure: error: libpng-config couldn't be found"
|
||||||
|
log 1 "configure: error: you supplied '$with_png', but it seems invalid"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
png_config=""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log 1 "checking libpng... found"
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_freetype() {
|
detect_freetype() {
|
||||||
@@ -2899,7 +2936,39 @@ detect_fontconfig() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
detect_pkg_config "$with_fontconfig" "fontconfig" "fontconfig_config" "2.3"
|
if [ "$with_fontconfig" = "1" ] || [ "$with_fontconfig" = "" ] || [ "$with_fontconfig" = "2" ]; then
|
||||||
|
fontconfig_config="pkg-config fontconfig"
|
||||||
|
else
|
||||||
|
fontconfig_config="$with_fontconfig"
|
||||||
|
fi
|
||||||
|
|
||||||
|
version=`$fontconfig_config --modversion 2>/dev/null`
|
||||||
|
ret=$?
|
||||||
|
check_version '2.3' "$version"
|
||||||
|
version_ok=$?
|
||||||
|
log 2 "executing $fontconfig_config --modversion"
|
||||||
|
log 2 " returned $version"
|
||||||
|
log 2 " exit code $ret"
|
||||||
|
|
||||||
|
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
|
||||||
|
if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
|
||||||
|
log 1 "checking libfontconfig... needs at least version 2.3.0, fontconfig NOT enabled"
|
||||||
|
else
|
||||||
|
log 1 "checking libfontconfig... not found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# It was forced, so it should be found.
|
||||||
|
if [ "$with_fontconfig" != "1" ]; then
|
||||||
|
log 1 "configure: error: fontconfig-config couldn't be found"
|
||||||
|
log 1 "configure: error: you supplied '$with_fontconfig', but it seems invalid"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
fontconfig_config=""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
log 1 "checking libfontconfig... found"
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_icu() {
|
detect_icu() {
|
||||||
|
262
docs/desync.txt
262
docs/desync.txt
@@ -1,262 +0,0 @@
|
|||||||
Some explanations about Desyncs
|
|
||||||
Last updated: 2014-02-23
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
Table of contents
|
|
||||||
-----------------
|
|
||||||
1.0) Desync theory
|
|
||||||
* 1.1) OpenTTD multiplayer architecture
|
|
||||||
* 1.2) What is a Desync and how is it detected
|
|
||||||
* 1.3) Typical causes of Desyncs
|
|
||||||
2.0) What to do in case of a Desync
|
|
||||||
* 2.1) Cache debugging
|
|
||||||
* 2.2) Desync recording
|
|
||||||
3.0) Evaluating the Desync records
|
|
||||||
* 3.1) Replaying
|
|
||||||
* 3.2) Evaluation the replay
|
|
||||||
* 3.3) Comparing savegames
|
|
||||||
|
|
||||||
|
|
||||||
1.1) OpenTTD multiplayer architecture
|
|
||||||
---- --------------------------------
|
|
||||||
OpenTTD has a huge gamestate, which changes all of the time.
|
|
||||||
The savegame contains the complete gamestate at a specific point
|
|
||||||
in time. But this state changes completely each tick: Vehicles move
|
|
||||||
and trees grow.
|
|
||||||
|
|
||||||
However, most of these changes in the gamestate are deterministic:
|
|
||||||
Without a player interfering a vehicle follows its orders always
|
|
||||||
in the same way, and trees always grow the same.
|
|
||||||
|
|
||||||
In OpenTTD multiplayer synchronisation works by creating a savegame
|
|
||||||
when clients join, and then transfering that savegame to the client,
|
|
||||||
so it has the complete gamestate at a fixed point in time.
|
|
||||||
|
|
||||||
Afterwards clients only receive 'commands', that is: Stuff which is
|
|
||||||
not predictable, like
|
|
||||||
- player actions
|
|
||||||
- AI actions
|
|
||||||
- GameScript actions
|
|
||||||
- Admin Port command
|
|
||||||
- rcon commands
|
|
||||||
- ...
|
|
||||||
|
|
||||||
These commands contain the information on how to execute the command,
|
|
||||||
and when to execute it. Time is measured in 'network frames'.
|
|
||||||
Mind that network frames to not match ingame time. Network frames
|
|
||||||
also run while the game is paused, to give a defined behaviour to
|
|
||||||
stuff that is executing while the game is paused.
|
|
||||||
|
|
||||||
The deterministic part of the gamestate is run by the clients on
|
|
||||||
their own. All they get from the server is the instruction to
|
|
||||||
run the gamestate up to a certain network time, which basically
|
|
||||||
says that there are no commands scheduled in that time.
|
|
||||||
|
|
||||||
When a client (which includes the server itself) wants to execute
|
|
||||||
a command (i.e. a non-predictable action), it does this by
|
|
||||||
- calling DoCommandP resp. DoCommandPInternal
|
|
||||||
- These functions first do a local test-run of the command to
|
|
||||||
check simple preconditions. (Just to give the client an
|
|
||||||
immediate response without bothering the server and waiting for
|
|
||||||
the response.) The test-run may not actually change the
|
|
||||||
gamestate, all changes must be discarded.
|
|
||||||
- If the local test-run succeeds the command is sent to the server.
|
|
||||||
- The server inserts the command into the command queue, which
|
|
||||||
assigns a network frame to the commands, i.e. when it shall be
|
|
||||||
executed on all clients.
|
|
||||||
- Enhanced with this specific timestamp, the command is send to all
|
|
||||||
clients, which execute the command simultaneously in the same
|
|
||||||
network frame in the same order.
|
|
||||||
|
|
||||||
1.2) What is a Desync and how is it detected
|
|
||||||
---- ---------------------------------------
|
|
||||||
In the ideal case all clients have the same gamestate as the server
|
|
||||||
and run in sync. That is, vehicle movement is the same on all
|
|
||||||
clients, and commands are executed the same everywhere and
|
|
||||||
have the same results.
|
|
||||||
|
|
||||||
When a Desync happens, it means that the gamestates on the clients
|
|
||||||
(including the server) are no longer the same. Just imagine
|
|
||||||
that a vehicle picks the left line instead of the right line at
|
|
||||||
a junction on one client.
|
|
||||||
|
|
||||||
The important thing here is, that noone notices when a Desync
|
|
||||||
occurs. The desync client will continue to simulate the gamestate
|
|
||||||
and execute commands from the server. Once the gamestate differs
|
|
||||||
it will increasingly spiral out of control: If a vehicle picks a
|
|
||||||
different route, it will arrive at a different time at a station,
|
|
||||||
which will load different cargo, which causes other vehicles to
|
|
||||||
load other stuff, which causes industries to notice different
|
|
||||||
servicing, which causes industries to change production, ...
|
|
||||||
the client could run all day in a different universe.
|
|
||||||
|
|
||||||
To limit how long a Desync can remain unnoticed, the server
|
|
||||||
transfers some checksums every now and then for the gamestate.
|
|
||||||
Currently this checksum is the state of the random number
|
|
||||||
generator of the game logic. A lot of things in OpenTTD depend
|
|
||||||
on the RNG, and if the gamestate differs, it is likely that the
|
|
||||||
RNG is called at different times, and the state differs when
|
|
||||||
checked.
|
|
||||||
|
|
||||||
The clients compare this 'checksum' with the checksum of their
|
|
||||||
own gamestate at the specific network frame. If they differ,
|
|
||||||
the client disconnects with a Desync error.
|
|
||||||
|
|
||||||
The important thing here is: The detection of the Desync is
|
|
||||||
only an ultimate failure detection. It does not give any
|
|
||||||
indication on when the Desync happened. The Desync may after
|
|
||||||
all have occured long ago, and just did not affect the checksum
|
|
||||||
up to now. The checksum may have matched 10 times or more
|
|
||||||
since the Desync happend, and only now the Desync has spiraled
|
|
||||||
enough to finally affect the checksum. (There was once a desync
|
|
||||||
which was only noticed by the checksum after 20 game years.)
|
|
||||||
|
|
||||||
1.3) Typical causes of Desyncs
|
|
||||||
---- -------------------------
|
|
||||||
Desyncs can be caused by the following scenarios:
|
|
||||||
- The savegame does not describe the complete gamestate.
|
|
||||||
- Some information which affects the progression of the
|
|
||||||
gamestate is not saved in the savegame.
|
|
||||||
- Some information which affects the progression of the
|
|
||||||
gamestate is not loaded from the savegame.
|
|
||||||
This includes the case that something is not completely
|
|
||||||
reset before loading the savegame, so data from the
|
|
||||||
previous game is carried over to the new one.
|
|
||||||
- The gamestate does not behave deterministic.
|
|
||||||
- Cache mismatch: The game logic depends on some cached
|
|
||||||
values, which are not invalidated properly. This is
|
|
||||||
the usual case for NewGRF-specific Desyncs.
|
|
||||||
- Undefined behaviour: The game logic performs multiple
|
|
||||||
things in an undefined order or with an undefined
|
|
||||||
result. E.g. when sorting something with a key while
|
|
||||||
some keys are equal. Or some computation that depends
|
|
||||||
on the CPU architecture (32/64 bit, little/big endian).
|
|
||||||
- The gamestate is modified when it shall not be modified.
|
|
||||||
- The test-run of a command alters the gamestate.
|
|
||||||
- The gamestate is altered by a player or script without
|
|
||||||
using commands.
|
|
||||||
|
|
||||||
|
|
||||||
2.1) Cache debugging
|
|
||||||
---- ---------------
|
|
||||||
Desyncs which are caused by inproper cache validation can
|
|
||||||
often be found by enabling cache validation:
|
|
||||||
- Start OpenTTD with '-d desync=2'.
|
|
||||||
- This will enable validation of caches every tick.
|
|
||||||
That is, cached values are recomputed every tick and compared
|
|
||||||
to the cached value.
|
|
||||||
- Differences are logged to 'commands-out.log' in the autosave
|
|
||||||
folder.
|
|
||||||
|
|
||||||
Mind that this type of debugging can also be done in singleplayer.
|
|
||||||
|
|
||||||
2.2) Desync recording
|
|
||||||
---- ----------------
|
|
||||||
If you have a server, which happens to encounter Desyncs often,
|
|
||||||
you can enable recording of the gamestate alterations. This
|
|
||||||
will later allow the replay the gamestate and locate the Desync
|
|
||||||
cause.
|
|
||||||
|
|
||||||
There are two levels of Desync recording, which are enabled
|
|
||||||
via '-d desync=2' resp. '-d desync=3'. Both will record all
|
|
||||||
commands to a file 'commands-out.log' in the autosave folder.
|
|
||||||
|
|
||||||
If you have the savegame from the start of the server, and
|
|
||||||
this command log you can replay the whole game. (see Section 3.1)
|
|
||||||
|
|
||||||
If you do not start the server from a savegame, there will
|
|
||||||
also be a savegame created just after a map has been generated.
|
|
||||||
The savegame will be named 'dmp_cmds_*.sav' and be put into
|
|
||||||
the autosave folder.
|
|
||||||
|
|
||||||
In addition to that '-d desync=3' also creates regular savegames
|
|
||||||
at defined spots in network time. (more defined than regular
|
|
||||||
autosaves). These will be created in the autosave folder
|
|
||||||
and will also be named 'dmp_cmds_*.sav'.
|
|
||||||
|
|
||||||
These saves allow comparing the gamestate with the original
|
|
||||||
gamestate during replaying, and thus greatly help debugging.
|
|
||||||
However, they also take a lot of disk space.
|
|
||||||
|
|
||||||
|
|
||||||
3.1) Replaying
|
|
||||||
---- ---------
|
|
||||||
To replay a Desync recording, you need these files:
|
|
||||||
- The savegame from when the server was started, resp.
|
|
||||||
the automatically created savegame from when the map
|
|
||||||
was generated.
|
|
||||||
- The 'commands-out.log' file.
|
|
||||||
- Optionally the 'dmp_cmds_*.sav'.
|
|
||||||
Put these files into a safe spot. (Not your autosave folder!)
|
|
||||||
|
|
||||||
Next, prepare your OpenTTD for replaying:
|
|
||||||
- Get the same version of OpenTTD as the original server was running.
|
|
||||||
- Uncomment/enable the define 'DEBUG_DUMP_COMMANDS' in
|
|
||||||
'src/network/network_func.h'.
|
|
||||||
- Put the 'commands-out.log' into the root save folder, and rename
|
|
||||||
it to 'commands.log'.
|
|
||||||
- Run 'openttd -D -d desync=3 -g startsavegame.sav'.
|
|
||||||
This replays the server log and creates new 'commands-out.log'
|
|
||||||
and 'dmp_cmds_*.sav' in your autosave folder.
|
|
||||||
|
|
||||||
3.2) Evaluation the replay
|
|
||||||
---- ---------------------
|
|
||||||
The replaying will also compare the checksums which are part of
|
|
||||||
the 'commands-out.log' with the replayed gamestate.
|
|
||||||
If they differ, it will trigger a 'NOT_REACHED'.
|
|
||||||
|
|
||||||
If the replay succeeds without mismatch, that is the replay reproduces
|
|
||||||
the original server state:
|
|
||||||
- Repeat the replay starting from incrementally later 'dmp_cmds_*.sav'
|
|
||||||
while truncating the 'commands.log' at the beginning appropriately.
|
|
||||||
The 'dmp_cmds_*.sav' can be your own ones from the first reply, or
|
|
||||||
the ones from the original server (if you have them).
|
|
||||||
(This simulates the view of joining clients during the game.)
|
|
||||||
- If one of those replays fails, you have located the Desync between
|
|
||||||
the last dmp_cmds that reproduces the replay and the first one
|
|
||||||
that fails.
|
|
||||||
|
|
||||||
If you have the original 'dmp_cmds_*.sav', you can also compare those
|
|
||||||
savegames with your own ones from the replay. You can also comment/disable
|
|
||||||
the 'NOT_REACHED' mentioned above, to get another 'dmp_cmds_*.sav' from
|
|
||||||
the replay after the mismatch has already been detected.
|
|
||||||
See Section 3.2 on how to compare savegames.
|
|
||||||
If the saves differ you have located the Desync between the last dmp_cmds
|
|
||||||
that match and the first one that does not. The difference of the saves
|
|
||||||
may point you in the direction of what causes it.
|
|
||||||
|
|
||||||
If the replay succeeds without mismatch, and you do not have any
|
|
||||||
'dmp_cmd_*.sav' from the original server, it is a lost case.
|
|
||||||
Enable creation of the 'dmp_cmd_*.sav' on the server, and wait for the
|
|
||||||
next Desync.
|
|
||||||
|
|
||||||
Finally, you can also compare the 'commands-out.log' from the original
|
|
||||||
server with the one from the replay. They will differ in stuff like
|
|
||||||
dates, and the original log will contain the chat, but otherwise they
|
|
||||||
should match.
|
|
||||||
|
|
||||||
3.2) Comparing savegames
|
|
||||||
---- -------------------
|
|
||||||
The binary form of the savegames from the original server and from
|
|
||||||
your replay will always differ:
|
|
||||||
- The savegame contains paths to used NewGRF files.
|
|
||||||
- The gamelog will log your loading of the savegame.
|
|
||||||
- The savegame data of AIs and the Gamescript will differ.
|
|
||||||
Scripts are not run during the replay, only their recorded commands
|
|
||||||
are replayed. Their internal state will thus not change in the
|
|
||||||
replay and will differ.
|
|
||||||
|
|
||||||
To compare savegame more semantically, there exist some ugly hackish
|
|
||||||
tools at:
|
|
||||||
http://devs.openttd.org/~frosch/texts/zpipe.c
|
|
||||||
http://devs.openttd.org/~frosch/texts/printhunk.c
|
|
||||||
|
|
||||||
The first one decompresses OpenTTD savegames. The second one creates
|
|
||||||
a textual representation of an uncompressed savegame, by parsing hunks
|
|
||||||
and arrays and such. With both tools you need to be a bit careful
|
|
||||||
since they work on stdin and stdout, which may not deal well with
|
|
||||||
binary data.
|
|
||||||
|
|
||||||
If you have the textual representation of the savegames, you can
|
|
||||||
compare them with regular diff tools.
|
|
@@ -1,6 +1,6 @@
|
|||||||
OpenTTD's known bugs
|
OpenTTD's known bugs
|
||||||
Last updated: 2014-09-23
|
Last updated: 2014-01-07
|
||||||
Release version: 1.4.3
|
Release version: 1.4.0-beta2
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@@ -33,13 +33,12 @@ No suitable AI can be found
|
|||||||
If you have no AIs and an AI is started the so-called 'dummy' AI will
|
If you have no AIs and an AI is started the so-called 'dummy' AI will
|
||||||
be loaded. This AI does nothing but writing a message on the AI debug
|
be loaded. This AI does nothing but writing a message on the AI debug
|
||||||
window and showing a red warning. There are basically two solutions
|
window and showing a red warning. There are basically two solutions
|
||||||
for this problem: Either you set the number of AI players to 0 so that
|
for this problem: you must change the settings so no AI is started,
|
||||||
no AI is started. You find that setting at the top of the window in the
|
this is done in the difficulty settings window. The other solution is
|
||||||
"AI / Game Scripts Settings" window.
|
acquiring (downloading) some AI. The easiest way to do this is via
|
||||||
The other solution is acquiring (downloading) some AI. The easiest way
|
the "Check Online Content" button in the main (intro) menu or via
|
||||||
to do this is via the "Check Online Content" button in the main (intro)
|
"AI Settings" -> "Select AI" -> "Check Online Content" which is also
|
||||||
menu or directly in the "AI / Game Scripts Settings" dialogue via the
|
accessed via the main menu.
|
||||||
"Check Online Content" button.
|
|
||||||
|
|
||||||
After a while of playing, colours get corrupted
|
After a while of playing, colours get corrupted
|
||||||
In Windows 7 the background slideshow corrupts the colour mapping of
|
In Windows 7 the background slideshow corrupts the colour mapping of
|
||||||
@@ -445,11 +444,3 @@ Trains might not stop at platforms that are currently being changed [FS#5553]:
|
|||||||
just anywhere in the station because then it would never leave the station
|
just anywhere in the station because then it would never leave the station
|
||||||
if you have the same station in the order list multiple times in a row or
|
if you have the same station in the order list multiple times in a row or
|
||||||
if there is only one station in the order list (see FS#5684).
|
if there is only one station in the order list (see FS#5684).
|
||||||
|
|
||||||
Some houses and industries are not affected by transparency [FS#5817]:
|
|
||||||
Some of the default houses and industries (f.e. the iron ore mine) are
|
|
||||||
not affected by the transparency options. This is because the graphics do
|
|
||||||
not (completely) separate the ground from the building.
|
|
||||||
This is a bug of the original graphics, and unfortunately cannot be
|
|
||||||
fixed with OpenGFX for the sake of maintaining compatibility with the
|
|
||||||
original graphics.
|
|
||||||
|
@@ -1,32 +0,0 @@
|
|||||||
# $Id$
|
|
||||||
|
|
||||||
# This file is part of OpenTTD.
|
|
||||||
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
BEGIN {
|
|
||||||
# Very basic variant function; barely any error checking.
|
|
||||||
# Just use the first argument as the file to start from when assembling everything
|
|
||||||
path = ARGV[1];
|
|
||||||
gsub("[^/\\\\]*$", "", path);
|
|
||||||
assemble(ARGV[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
# Recursive function for assembling by means of resolving the #includes.
|
|
||||||
function assemble(filename) {
|
|
||||||
while ((getline < filename) > 0) {
|
|
||||||
if (NF == 2 && $1 == "#include" ) {
|
|
||||||
# Remove the quotes.
|
|
||||||
gsub("[\"'<>]", "", $2);
|
|
||||||
assemble(path $2);
|
|
||||||
} else {
|
|
||||||
print $0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (close(filename) < 0) {
|
|
||||||
print "Could not open " filename > "/dev/stderr";
|
|
||||||
exit -1;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,94 +1,10 @@
|
|||||||
openttd (1.4.3-0) unstable; urgency=low
|
openttd (1.4.0~beta2) unstable; urgency=low
|
||||||
|
|
||||||
* New upstream release 1.4.3
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Tue, 23 Sep 2014 21:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.3~RC2-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.3-RC2
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Sun, 14 Sep 2014 19:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.3~RC1-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.3-RC1
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Sun, 07 Sep 2014 19:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.2-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.2
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Sat, 16 Aug 2014 21:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.2~RC2-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.2-RC2
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Sun, 03 Aug 2014 18:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.2~RC1-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.2-RC1
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Thu, 03 Jul 2014 21:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.1-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.1
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Mon, 02 Jun 2014 21:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.1~RC2-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.1-RC2
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Sun, 18 May 2014 21:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.1~RC1-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.1-RC1
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Sun, 04 May 2014 21:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.0-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.0
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Tue, 01 Apr 2014 21:00:00 +0200
|
|
||||||
|
|
||||||
openttd (1.4.0~RC1-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.0-RC1
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Tue, 17 Mar 2014 21:00:00 +0100
|
|
||||||
|
|
||||||
openttd (1.4.0~beta5-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.0-beta5
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Tue, 25 Feb 2014 10:15:00 +0100
|
|
||||||
|
|
||||||
openttd (1.4.0~beta4-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.0-beta4
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Thu, 06 Feb 2014 21:00:00 +0100
|
|
||||||
|
|
||||||
openttd (1.4.0~beta3-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.0-beta3
|
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Tue, 21 Jan 2014 21:00:00 +0100
|
|
||||||
|
|
||||||
openttd (1.4.0~beta2-0) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release 1.4.0-beta2
|
* New upstream release 1.4.0-beta2
|
||||||
|
|
||||||
-- OpenTTD <info@openttd.org> Tue, 07 Jan 2014 21:00:00 +0100
|
-- OpenTTD <info@openttd.org> Tue, 07 Jan 2014 21:00:00 +0100
|
||||||
|
|
||||||
openttd (1.4.0~beta1-0) unstable; urgency=low
|
openttd (1.4.0~beta1) unstable; urgency=low
|
||||||
|
|
||||||
* New upstream release 1.4.0-beta1
|
* New upstream release 1.4.0-beta1
|
||||||
|
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
# Version numbers to update
|
# Version numbers to update
|
||||||
!define APPV_MAJOR 1
|
!define APPV_MAJOR 1
|
||||||
!define APPV_MINOR 4
|
!define APPV_MINOR 4
|
||||||
!define APPV_MAINT 3
|
!define APPV_MAINT 0
|
||||||
!define APPV_BUILD 2
|
!define APPV_BUILD 1
|
||||||
!define APPV_EXTRA ""
|
!define APPV_EXTRA "-beta2"
|
||||||
|
|
||||||
!define APPNAME "OpenTTD" ; Define application name
|
!define APPNAME "OpenTTD" ; Define application name
|
||||||
!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version
|
!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version
|
||||||
|
@@ -102,7 +102,7 @@
|
|||||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
<ExceptionHandling>Sync</ExceptionHandling>
|
<ExceptionHandling>Sync</ExceptionHandling>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
<ExceptionHandling>Sync</ExceptionHandling>
|
<ExceptionHandling>Sync</ExceptionHandling>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
@@ -1036,8 +1036,6 @@
|
|||||||
<ClInclude Include="..\src\script\api\script_station.hpp" />
|
<ClInclude Include="..\src\script\api\script_station.hpp" />
|
||||||
<ClInclude Include="..\src\script\api\script_stationlist.hpp" />
|
<ClInclude Include="..\src\script\api\script_stationlist.hpp" />
|
||||||
<ClInclude Include="..\src\script\api\script_story_page.hpp" />
|
<ClInclude Include="..\src\script\api\script_story_page.hpp" />
|
||||||
<ClInclude Include="..\src\script\api\script_storypagelist.hpp" />
|
|
||||||
<ClInclude Include="..\src\script\api\script_storypageelementlist.hpp" />
|
|
||||||
<ClInclude Include="..\src\script\api\script_subsidy.hpp" />
|
<ClInclude Include="..\src\script\api\script_subsidy.hpp" />
|
||||||
<ClInclude Include="..\src\script\api\script_subsidylist.hpp" />
|
<ClInclude Include="..\src\script\api\script_subsidylist.hpp" />
|
||||||
<ClInclude Include="..\src\script\api\script_testmode.hpp" />
|
<ClInclude Include="..\src\script\api\script_testmode.hpp" />
|
||||||
@@ -1100,8 +1098,6 @@
|
|||||||
<ClCompile Include="..\src\script\api\script_station.cpp" />
|
<ClCompile Include="..\src\script\api\script_station.cpp" />
|
||||||
<ClCompile Include="..\src\script\api\script_stationlist.cpp" />
|
<ClCompile Include="..\src\script\api\script_stationlist.cpp" />
|
||||||
<ClCompile Include="..\src\script\api\script_story_page.cpp" />
|
<ClCompile Include="..\src\script\api\script_story_page.cpp" />
|
||||||
<ClCompile Include="..\src\script\api\script_storypagelist.cpp" />
|
|
||||||
<ClCompile Include="..\src\script\api\script_storypageelementlist.cpp" />
|
|
||||||
<ClCompile Include="..\src\script\api\script_subsidy.cpp" />
|
<ClCompile Include="..\src\script\api\script_subsidy.cpp" />
|
||||||
<ClCompile Include="..\src\script\api\script_subsidylist.cpp" />
|
<ClCompile Include="..\src\script\api\script_subsidylist.cpp" />
|
||||||
<ClCompile Include="..\src\script\api\script_testmode.cpp" />
|
<ClCompile Include="..\src\script\api\script_testmode.cpp" />
|
||||||
@@ -1127,8 +1123,6 @@
|
|||||||
<ClInclude Include="..\src\blitter\32bpp_optimized.hpp" />
|
<ClInclude Include="..\src\blitter\32bpp_optimized.hpp" />
|
||||||
<ClCompile Include="..\src\blitter\32bpp_simple.cpp" />
|
<ClCompile Include="..\src\blitter\32bpp_simple.cpp" />
|
||||||
<ClInclude Include="..\src\blitter\32bpp_simple.hpp" />
|
<ClInclude Include="..\src\blitter\32bpp_simple.hpp" />
|
||||||
<ClInclude Include="..\src\blitter\32bpp_sse_func.hpp" />
|
|
||||||
<ClInclude Include="..\src\blitter\32bpp_sse_type.h" />
|
|
||||||
<ClCompile Include="..\src\blitter\32bpp_sse2.cpp" />
|
<ClCompile Include="..\src\blitter\32bpp_sse2.cpp" />
|
||||||
<ClInclude Include="..\src\blitter\32bpp_sse2.hpp" />
|
<ClInclude Include="..\src\blitter\32bpp_sse2.hpp" />
|
||||||
<ClCompile Include="..\src\blitter\32bpp_sse4.cpp" />
|
<ClCompile Include="..\src\blitter\32bpp_sse4.cpp" />
|
||||||
|
@@ -2337,12 +2337,6 @@
|
|||||||
<ClInclude Include="..\src\script\api\script_story_page.hpp">
|
<ClInclude Include="..\src\script\api\script_story_page.hpp">
|
||||||
<Filter>Script API</Filter>
|
<Filter>Script API</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\src\script\api\script_storypagelist.hpp">
|
|
||||||
<Filter>Script API</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\script\api\script_storypageelementlist.hpp">
|
|
||||||
<Filter>Script API</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\script\api\script_subsidy.hpp">
|
<ClInclude Include="..\src\script\api\script_subsidy.hpp">
|
||||||
<Filter>Script API</Filter>
|
<Filter>Script API</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -2529,12 +2523,6 @@
|
|||||||
<ClCompile Include="..\src\script\api\script_story_page.cpp">
|
<ClCompile Include="..\src\script\api\script_story_page.cpp">
|
||||||
<Filter>Script API Implementation</Filter>
|
<Filter>Script API Implementation</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\src\script\api\script_storypagelist.cpp">
|
|
||||||
<Filter>Script API Implementation</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\script\api\script_storypageelementlist.cpp">
|
|
||||||
<Filter>Script API Implementation</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\script\api\script_subsidy.cpp">
|
<ClCompile Include="..\src\script\api\script_subsidy.cpp">
|
||||||
<Filter>Script API Implementation</Filter>
|
<Filter>Script API Implementation</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -2610,12 +2598,6 @@
|
|||||||
<ClInclude Include="..\src\blitter\32bpp_simple.hpp">
|
<ClInclude Include="..\src\blitter\32bpp_simple.hpp">
|
||||||
<Filter>Blitters</Filter>
|
<Filter>Blitters</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\src\blitter\32bpp_sse_func.hpp">
|
|
||||||
<Filter>Blitters</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\blitter\32bpp_sse_type.h">
|
|
||||||
<Filter>Blitters</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\src\blitter\32bpp_sse2.cpp">
|
<ClCompile Include="..\src\blitter\32bpp_sse2.cpp">
|
||||||
<Filter>Blitters</Filter>
|
<Filter>Blitters</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@@ -102,7 +102,7 @@
|
|||||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
<ExceptionHandling>Sync</ExceptionHandling>
|
<ExceptionHandling>Sync</ExceptionHandling>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
@@ -204,7 +204,7 @@
|
|||||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||||
<OmitFramePointers>true</OmitFramePointers>
|
<OmitFramePointers>true</OmitFramePointers>
|
||||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
<ExceptionHandling>Sync</ExceptionHandling>
|
<ExceptionHandling>Sync</ExceptionHandling>
|
||||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
@@ -52,7 +52,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
@@ -257,7 +257,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
@@ -3478,14 +3478,6 @@
|
|||||||
RelativePath=".\..\src\script\api\script_story_page.hpp"
|
RelativePath=".\..\src\script\api\script_story_page.hpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypagelist.hpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypageelementlist.hpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\script\api\script_subsidy.hpp"
|
RelativePath=".\..\src\script\api\script_subsidy.hpp"
|
||||||
>
|
>
|
||||||
@@ -3738,14 +3730,6 @@
|
|||||||
RelativePath=".\..\src\script\api\script_story_page.cpp"
|
RelativePath=".\..\src\script\api\script_story_page.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypagelist.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypageelementlist.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\script\api\script_subsidy.cpp"
|
RelativePath=".\..\src\script\api\script_subsidy.cpp"
|
||||||
>
|
>
|
||||||
@@ -3850,14 +3834,6 @@
|
|||||||
RelativePath=".\..\src\blitter\32bpp_simple.hpp"
|
RelativePath=".\..\src\blitter\32bpp_simple.hpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\blitter\32bpp_sse_func.hpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\blitter\32bpp_sse_type.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\blitter\32bpp_sse2.cpp"
|
RelativePath=".\..\src\blitter\32bpp_sse2.cpp"
|
||||||
>
|
>
|
||||||
|
@@ -52,7 +52,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
@@ -257,7 +257,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
|
@@ -53,7 +53,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
@@ -255,7 +255,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
@@ -3475,14 +3475,6 @@
|
|||||||
RelativePath=".\..\src\script\api\script_story_page.hpp"
|
RelativePath=".\..\src\script\api\script_story_page.hpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypagelist.hpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypageelementlist.hpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\script\api\script_subsidy.hpp"
|
RelativePath=".\..\src\script\api\script_subsidy.hpp"
|
||||||
>
|
>
|
||||||
@@ -3735,14 +3727,6 @@
|
|||||||
RelativePath=".\..\src\script\api\script_story_page.cpp"
|
RelativePath=".\..\src\script\api\script_story_page.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypagelist.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\script\api\script_storypageelementlist.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\script\api\script_subsidy.cpp"
|
RelativePath=".\..\src\script\api\script_subsidy.cpp"
|
||||||
>
|
>
|
||||||
@@ -3847,14 +3831,6 @@
|
|||||||
RelativePath=".\..\src\blitter\32bpp_simple.hpp"
|
RelativePath=".\..\src\blitter\32bpp_simple.hpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\blitter\32bpp_sse_func.hpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\..\src\blitter\32bpp_sse_type.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath=".\..\src\blitter\32bpp_sse2.cpp"
|
RelativePath=".\..\src\blitter\32bpp_sse2.cpp"
|
||||||
>
|
>
|
||||||
|
@@ -53,7 +53,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
@@ -255,7 +255,7 @@
|
|||||||
FavorSizeOrSpeed="2"
|
FavorSizeOrSpeed="2"
|
||||||
OmitFramePointers="true"
|
OmitFramePointers="true"
|
||||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||||
StringPooling="true"
|
StringPooling="true"
|
||||||
ExceptionHandling="1"
|
ExceptionHandling="1"
|
||||||
RuntimeLibrary="0"
|
RuntimeLibrary="0"
|
||||||
|
66
readme.txt
66
readme.txt
@@ -1,5 +1,5 @@
|
|||||||
Last updated: 2014-09-23
|
Last updated: 2014-01-07
|
||||||
Release version: 1.4.3
|
Release version: 1.4.0-beta2
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@@ -674,47 +674,46 @@ http://homer.rice.edu/~sandmann/cwsdpmi/csdpmi5s.zip
|
|||||||
X.X) Credits
|
X.X) Credits
|
||||||
---- -------
|
---- -------
|
||||||
The OpenTTD team (in alphabetical order):
|
The OpenTTD team (in alphabetical order):
|
||||||
Albert Hofkamp (Alberth) - GUI expert (since 0.7)
|
Albert Hofkamp (Alberth) - GUI expert
|
||||||
Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)
|
Jean-François Claeys (Belugas) - GUI, newindustries and more
|
||||||
Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)
|
Matthijs Kooijman (blathijs) - Pathfinder-guru, pool rework
|
||||||
Christoph Elsenhans (frosch) - General coding (since 0.6)
|
Ulf Hermann (fonsinchen) - Cargo Distribution
|
||||||
Loïc Guilloux (glx) - Windows Expert (since 0.4.5)
|
Christoph Elsenhans (frosch) - General coding
|
||||||
Michael Lutz (michi_cc) - Path based signals (since 0.7)
|
Loïc Guilloux (glx) - Windows Expert
|
||||||
Owen Rudge (orudge) - Forum host, OS/2 port (since 0.1)
|
Michael Lutz (michi_cc) - Path based signals
|
||||||
Peter Nelson (peter1138) - Spiritual descendant from newGRF gods (since 0.4.5)
|
Owen Rudge (orudge) - Forum host, OS/2 port
|
||||||
Ingo von Borstel (planetmaker) - General coding, Support (since 1.1)
|
Peter Nelson (peter1138) - Spiritual descendant from newGRF gods
|
||||||
Remko Bijker (Rubidium) - Lead coder and way more (since 0.4.5)
|
Ingo von Borstel (planetmaker) - Support
|
||||||
José Soler (Terkhen) - General coding (since 1.0)
|
Remko Bijker (Rubidium) - Lead coder and way more
|
||||||
Leif Linse (Zuu) - AI/Game Script (since 1.2)
|
Zdeněk Sojka (SmatZ) - Bug finder and fixer
|
||||||
|
José Soler (Terkhen) - General coding
|
||||||
|
Thijs Marinussen (Yexo) - AI Framework
|
||||||
|
Leif Linse (Zuu) - AI/Game Script
|
||||||
|
|
||||||
Inactive Developers:
|
Inactive Developers:
|
||||||
Jean-François Claeys (Belugas) - GUI, newindustries and more (0.4.5 - 1.0)
|
Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles
|
||||||
Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles (0.3 - 0.7)
|
Victor Fischer (Celestar) - Programming everywhere you need him to
|
||||||
Victor Fischer (Celestar) - Programming everywhere you need him to (0.3 - 0.6)
|
Tamás Faragó (Darkvater) - Ex-Lead coder
|
||||||
Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) (0.4.5 - 0.6)
|
Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)
|
||||||
Jonathan Coome (Maedhros) - High priest of the NewGRF Temple (0.5 - 0.6)
|
Jonathan Coome (Maedhros) - High priest of the NewGRF Temple
|
||||||
Attila Bán (MiHaMiX) - WebTranslator 1 and 2 (0.3 - 0.5)
|
Attila Bán (MiHaMiX) - WebTranslator 1 and 2
|
||||||
Zdeněk Sojka (SmatZ) - Bug finder and fixer (0.6 - 1.3)
|
Christoph Mallon (Tron) - Programmer, code correctness police
|
||||||
Christoph Mallon (Tron) - Programmer, code correctness police (0.3 - 0.5)
|
|
||||||
Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active)
|
|
||||||
Thijs Marinussen (Yexo) - AI Framework, General (0.6 - 1.3)
|
|
||||||
|
|
||||||
Retired Developers:
|
Retired Developers:
|
||||||
Tamás Faragó (Darkvater) - Ex-Lead coder (0.3 - 0.5)
|
Ludvig Strigeus (ludde) - OpenTTD author, main coder (0.1 - 0.3.3)
|
||||||
Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3 - 0.3)
|
Serge Paquet (vurlix) - Assistant project manager, coder (0.1 - 0.3.3)
|
||||||
Emil Djupfeld (egladil) - MacOSX port (0.4 - 0.6)
|
Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3.0 - 0.3.6)
|
||||||
Simon Sasburg (HackyKid) - Bug fixer (0.4 - 0.4.5)
|
Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker
|
||||||
Ludvig Strigeus (ludde) - Original author of OpenTTD, main coder (0.1 - 0.3)
|
Patric Stout (TrueBrain) - NoProgrammer (0.3 - 1.2), sys op (active)
|
||||||
Cian Duffy (MYOB) - BeOS port / manual writing (0.1 - 0.3)
|
|
||||||
Petr Baudiš (pasky) - Many patches, newgrf support, etc. (0.3 - 0.3)
|
|
||||||
Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker (0.6 - 0.7)
|
|
||||||
Serge Paquet (vurlix) - 2nd contributor after ludde (0.1 - 0.3)
|
|
||||||
|
|
||||||
Thanks to:
|
Thanks to:
|
||||||
Josef Drexler - For his great work on TTDPatch.
|
Josef Drexler - For his great work on TTDPatch.
|
||||||
Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and track foundations
|
Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and track foundations
|
||||||
|
Petr Baudiš (pasky) - Many patches, newgrf support, etc.
|
||||||
|
Simon Sasburg (HackyKid) - For the many bugfixes he has blessed us with
|
||||||
Stefan Meißner (sign_de) - For his work on the console
|
Stefan Meißner (sign_de) - For his work on the console
|
||||||
Mike Ragsdale - OpenTTD installer
|
Mike Ragsdale - OpenTTD installer
|
||||||
|
Cian Duffy (MYOB) - BeOS port / manual writing
|
||||||
Christian Rosentreter (tokai) - MorphOS / AmigaOS port
|
Christian Rosentreter (tokai) - MorphOS / AmigaOS port
|
||||||
Richard Kempton (RichK67) - Additional airports, initial TGP implementation
|
Richard Kempton (RichK67) - Additional airports, initial TGP implementation
|
||||||
Alberto Demichelis - Squirrel scripting language
|
Alberto Demichelis - Squirrel scripting language
|
||||||
@@ -723,7 +722,6 @@ Thanks to:
|
|||||||
George - Canal graphics
|
George - Canal graphics
|
||||||
Andrew Parkhouse (andythenorth) - River graphics
|
Andrew Parkhouse (andythenorth) - River graphics
|
||||||
David Dallaston (Pikka) - Tram tracks
|
David Dallaston (Pikka) - Tram tracks
|
||||||
Fleashosio - Titlegame
|
|
||||||
All Translators - For their support to make OpenTTD a truly international game
|
All Translators - For their support to make OpenTTD a truly international game
|
||||||
Bug Reporters - Thanks for all bug reports
|
Bug Reporters - Thanks for all bug reports
|
||||||
Chris Sawyer - For an amazing game!
|
Chris Sawyer - For an amazing game!
|
||||||
|
@@ -816,8 +816,6 @@ script/api/script_signlist.hpp
|
|||||||
script/api/script_station.hpp
|
script/api/script_station.hpp
|
||||||
script/api/script_stationlist.hpp
|
script/api/script_stationlist.hpp
|
||||||
script/api/script_story_page.hpp
|
script/api/script_story_page.hpp
|
||||||
script/api/script_storypagelist.hpp
|
|
||||||
script/api/script_storypageelementlist.hpp
|
|
||||||
script/api/script_subsidy.hpp
|
script/api/script_subsidy.hpp
|
||||||
script/api/script_subsidylist.hpp
|
script/api/script_subsidylist.hpp
|
||||||
script/api/script_testmode.hpp
|
script/api/script_testmode.hpp
|
||||||
@@ -882,8 +880,6 @@ script/api/script_signlist.cpp
|
|||||||
script/api/script_station.cpp
|
script/api/script_station.cpp
|
||||||
script/api/script_stationlist.cpp
|
script/api/script_stationlist.cpp
|
||||||
script/api/script_story_page.cpp
|
script/api/script_story_page.cpp
|
||||||
script/api/script_storypagelist.cpp
|
|
||||||
script/api/script_storypageelementlist.cpp
|
|
||||||
script/api/script_subsidy.cpp
|
script/api/script_subsidy.cpp
|
||||||
script/api/script_subsidylist.cpp
|
script/api/script_subsidylist.cpp
|
||||||
script/api/script_testmode.cpp
|
script/api/script_testmode.cpp
|
||||||
@@ -916,8 +912,6 @@ blitter/32bpp_optimized.hpp
|
|||||||
blitter/32bpp_simple.cpp
|
blitter/32bpp_simple.cpp
|
||||||
blitter/32bpp_simple.hpp
|
blitter/32bpp_simple.hpp
|
||||||
#if SSE
|
#if SSE
|
||||||
blitter/32bpp_sse_func.hpp
|
|
||||||
blitter/32bpp_sse_type.h
|
|
||||||
blitter/32bpp_sse2.cpp
|
blitter/32bpp_sse2.cpp
|
||||||
blitter/32bpp_sse2.hpp
|
blitter/32bpp_sse2.hpp
|
||||||
blitter/32bpp_sse4.cpp
|
blitter/32bpp_sse4.cpp
|
||||||
|
@@ -66,7 +66,7 @@ public:
|
|||||||
static SQChar temp[256];
|
static SQChar temp[256];
|
||||||
va_list vl;
|
va_list vl;
|
||||||
va_start(vl, s);
|
va_start(vl, s);
|
||||||
scvsnprintf(temp, sizeof(temp), s, vl);
|
scvsprintf(temp, s, vl);
|
||||||
va_end(vl);
|
va_end(vl);
|
||||||
throw temp;
|
throw temp;
|
||||||
}
|
}
|
||||||
|
@@ -853,7 +853,7 @@ struct AIConfigWindow : public Window {
|
|||||||
case WID_AIC_GAMELIST: {
|
case WID_AIC_GAMELIST: {
|
||||||
this->selected_slot = OWNER_DEITY;
|
this->selected_slot = OWNER_DEITY;
|
||||||
this->InvalidateData();
|
this->InvalidateData();
|
||||||
if (click_count > 1 && this->selected_slot != INVALID_COMPANY && _game_mode != GM_NORMAL) ShowAIListWindow((CompanyID)this->selected_slot);
|
if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowAIListWindow((CompanyID)this->selected_slot);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -44,7 +44,7 @@ void CcBuildAirport(const CommandCost &result, TileIndex tile, uint32 p1, uint32
|
|||||||
{
|
{
|
||||||
if (result.Failed()) return;
|
if (result.Failed()) return;
|
||||||
|
|
||||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT_OTHER, tile);
|
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT, tile);
|
||||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -226,27 +226,8 @@ public:
|
|||||||
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
|
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
|
||||||
this->OnInvalidateData();
|
this->OnInvalidateData();
|
||||||
|
|
||||||
/* Ensure airport class is valid (changing NewGRFs). */
|
this->vscroll->SetCount(AirportClass::Get(_selected_airport_class)->GetSpecCount());
|
||||||
_selected_airport_class = Clamp(_selected_airport_class, APC_BEGIN, (AirportClassID)(AirportClass::GetClassCount() - 1));
|
this->SelectFirstAvailableAirport(true);
|
||||||
const AirportClass *ac = AirportClass::Get(_selected_airport_class);
|
|
||||||
this->vscroll->SetCount(ac->GetSpecCount());
|
|
||||||
|
|
||||||
/* Ensure the airport index is valid for this class (changing NewGRFs). */
|
|
||||||
_selected_airport_index = Clamp(_selected_airport_index, -1, ac->GetSpecCount() - 1);
|
|
||||||
|
|
||||||
/* Only when no valid airport was selected, we want to select the first airport. */
|
|
||||||
bool selectFirstAirport = true;
|
|
||||||
if (_selected_airport_index != -1) {
|
|
||||||
const AirportSpec *as = ac->GetSpec(_selected_airport_index);
|
|
||||||
if (as->IsAvailable()) {
|
|
||||||
/* Ensure the airport layout is valid. */
|
|
||||||
_selected_airport_layout = Clamp(_selected_airport_layout, 0, as->num_table - 1);
|
|
||||||
selectFirstAirport = false;
|
|
||||||
this->UpdateSelectSize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (selectFirstAirport) this->SelectFirstAvailableAirport(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual ~BuildAirportWindow()
|
virtual ~BuildAirportWindow()
|
||||||
|
@@ -160,7 +160,7 @@ static void TransferCargo(Vehicle *old_veh, Vehicle *new_head, bool part_of_chai
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Update train weight etc., the old vehicle will be sold anyway */
|
/* Update train weight etc., the old vehicle will be sold anyway */
|
||||||
if (part_of_chain && new_head->type == VEH_TRAIN) Train::From(new_head)->ConsistChanged(CCF_LOADUNLOAD);
|
if (part_of_chain && new_head->type == VEH_TRAIN) Train::From(new_head)->ConsistChanged(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -276,8 +276,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
case WID_RV_INFO_TAB: {
|
case WID_RV_INFO_TAB: {
|
||||||
Dimension d = GetStringBoundingBox(STR_REPLACE_NOT_REPLACING);
|
SetDParam(0, STR_REPLACE_NOT_REPLACING);
|
||||||
d = maxdim(d, GetStringBoundingBox(STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED));
|
Dimension d = GetStringBoundingBox(STR_BLACK_STRING);
|
||||||
|
SetDParam(0, STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED);
|
||||||
|
d = maxdim(d, GetStringBoundingBox(STR_BLACK_STRING));
|
||||||
d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT;
|
d.width += WD_FRAMETEXT_LEFT + WD_FRAMETEXT_RIGHT;
|
||||||
d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
|
d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
|
||||||
*size = maxdim(*size, d);
|
*size = maxdim(*size, d);
|
||||||
@@ -349,21 +351,20 @@ public:
|
|||||||
switch (widget) {
|
switch (widget) {
|
||||||
case WID_RV_INFO_TAB: {
|
case WID_RV_INFO_TAB: {
|
||||||
const Company *c = Company::Get(_local_company);
|
const Company *c = Company::Get(_local_company);
|
||||||
StringID str;
|
|
||||||
if (this->sel_engine[0] != INVALID_ENGINE) {
|
if (this->sel_engine[0] != INVALID_ENGINE) {
|
||||||
if (!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group)) {
|
if (!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group)) {
|
||||||
str = STR_REPLACE_NOT_REPLACING;
|
SetDParam(0, STR_REPLACE_NOT_REPLACING);
|
||||||
} else {
|
} else {
|
||||||
bool when_old = false;
|
bool when_old = false;
|
||||||
EngineID e = EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group, &when_old);
|
EngineID e = EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group, &when_old);
|
||||||
str = when_old ? STR_REPLACE_REPLACING_WHEN_OLD : STR_ENGINE_NAME;
|
SetDParam(0, when_old ? STR_REPLACE_REPLACING_WHEN_OLD : STR_ENGINE_NAME);
|
||||||
SetDParam(0, e);
|
SetDParam(1, e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
str = STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED;
|
SetDParam(0, STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, str, TC_BLACK, SA_HOR_CENTER);
|
DrawString(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_BLACK_STRING, TC_FROMSTRING, SA_HOR_CENTER);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -100,7 +100,7 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
|
|||||||
|
|
||||||
/* Then find the MD5 checksum */
|
/* Then find the MD5 checksum */
|
||||||
item = md5s->GetItem(filename, false);
|
item = md5s->GetItem(filename, false);
|
||||||
if (item == NULL || item->value == NULL) {
|
if (item == NULL) {
|
||||||
DEBUG(grf, 0, "No MD5 checksum specified for: %s (in %s)", filename, full_filename);
|
DEBUG(grf, 0, "No MD5 checksum specified for: %s (in %s)", filename, full_filename);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -133,46 +133,6 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BM_CRASH_REMAP:
|
|
||||||
if (src_px->a == 255) {
|
|
||||||
do {
|
|
||||||
uint m = *src_n;
|
|
||||||
if (m == 0) {
|
|
||||||
uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
|
|
||||||
*dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
|
|
||||||
*anim = 0;
|
|
||||||
} else {
|
|
||||||
uint r = remap[GB(m, 0, 8)];
|
|
||||||
*anim = r | (m & 0xFF00);
|
|
||||||
if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
|
||||||
}
|
|
||||||
anim++;
|
|
||||||
dst++;
|
|
||||||
src_px++;
|
|
||||||
src_n++;
|
|
||||||
} while (--n != 0);
|
|
||||||
} else {
|
|
||||||
do {
|
|
||||||
uint m = *src_n;
|
|
||||||
if (m == 0) {
|
|
||||||
if (src_px->a != 0) {
|
|
||||||
uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
|
|
||||||
*dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
|
|
||||||
*anim = 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
uint r = remap[GB(m, 0, 8)];
|
|
||||||
*anim = 0;
|
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
|
||||||
}
|
|
||||||
anim++;
|
|
||||||
dst++;
|
|
||||||
src_px++;
|
|
||||||
src_n++;
|
|
||||||
} while (--n != 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BM_TRANSPARENT:
|
case BM_TRANSPARENT:
|
||||||
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
|
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
|
||||||
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
|
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
|
||||||
@@ -248,7 +208,6 @@ void Blitter_32bppAnim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomL
|
|||||||
case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
|
case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
|
||||||
case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
|
case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
|
||||||
case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return;
|
case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return;
|
||||||
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP> (bp, zoom); return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,7 +439,7 @@ void Blitter_32bppAnim::PaletteAnimate(const Palette &palette)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Make sure the backend redraws the whole screen */
|
/* Make sure the backend redraws the whole screen */
|
||||||
VideoDriver::GetInstance()->MakeDirty(0, 0, _screen.width, _screen.height);
|
_video_driver->MakeDirty(0, 0, _screen.width, _screen.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
Blitter::PaletteAnimation Blitter_32bppAnim::UsePaletteAnimation()
|
Blitter::PaletteAnimation Blitter_32bppAnim::UsePaletteAnimation()
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
#include "../video/video_driver.hpp"
|
#include "../video/video_driver.hpp"
|
||||||
#include "../table/sprites.h"
|
#include "../table/sprites.h"
|
||||||
#include "32bpp_anim_sse4.hpp"
|
#include "32bpp_anim_sse4.hpp"
|
||||||
#include "32bpp_sse_func.hpp"
|
|
||||||
|
|
||||||
/** Instantiation of the SSE4 32bpp blitter factory. */
|
/** Instantiation of the SSE4 32bpp blitter factory. */
|
||||||
static FBlitter_32bppSSE4_Anim iFBlitter_32bppSSE4_Anim;
|
static FBlitter_32bppSSE4_Anim iFBlitter_32bppSSE4_Anim;
|
||||||
@@ -28,15 +27,15 @@ static FBlitter_32bppSSE4_Anim iFBlitter_32bppSSE4_Anim;
|
|||||||
* @param zoom zoom level at which we are drawing
|
* @param zoom zoom level at which we are drawing
|
||||||
*/
|
*/
|
||||||
IGNORE_UNINITIALIZED_WARNING_START
|
IGNORE_UNINITIALIZED_WARNING_START
|
||||||
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last, bool translucent, bool animated>
|
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last>
|
||||||
inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
||||||
{
|
{
|
||||||
const byte * const remap = bp->remap;
|
|
||||||
Colour *dst_line = (Colour *) bp->dst + bp->top * bp->pitch + bp->left;
|
Colour *dst_line = (Colour *) bp->dst + bp->top * bp->pitch + bp->left;
|
||||||
uint16 *anim_line = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left;
|
uint16 *anim_line = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left;
|
||||||
int effective_width = bp->width;
|
int effective_width = bp->width;
|
||||||
|
|
||||||
/* Find where to start reading in the source sprite. */
|
/* Find where to start reading in the source sprite. */
|
||||||
|
const byte * const remap = bp->remap;
|
||||||
const Blitter_32bppSSE_Base::SpriteData * const sd = (const Blitter_32bppSSE_Base::SpriteData *) bp->sprite;
|
const Blitter_32bppSSE_Base::SpriteData * const sd = (const Blitter_32bppSSE_Base::SpriteData *) bp->sprite;
|
||||||
const SpriteInfo * const si = &sd->infos[zoom];
|
const SpriteInfo * const si = &sd->infos[zoom];
|
||||||
const MapValue *src_mv_line = (const MapValue *) &sd->data[si->mv_offset] + bp->skip_top * si->sprite_width;
|
const MapValue *src_mv_line = (const MapValue *) &sd->data[si->mv_offset] + bp->skip_top * si->sprite_width;
|
||||||
@@ -46,70 +45,55 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL
|
|||||||
src_rgba_line += bp->skip_left;
|
src_rgba_line += bp->skip_left;
|
||||||
src_mv_line += bp->skip_left;
|
src_mv_line += bp->skip_left;
|
||||||
}
|
}
|
||||||
const MapValue *src_mv = src_mv_line;
|
|
||||||
|
|
||||||
/* Load these variables into register before loop. */
|
/* Load these variables into register before loop. */
|
||||||
const __m128i a_cm = ALPHA_CONTROL_MASK;
|
const __m128i a_cm = ALPHA_CONTROL_MASK;
|
||||||
const __m128i pack_low_cm = PACK_LOW_CONTROL_MASK;
|
const __m128i pack_low_cm = PACK_LOW_CONTROL_MASK;
|
||||||
|
const __m128i briAB_cm = BRIGHTNESS_LOW_CONTROL_MASK;
|
||||||
|
const __m128i div_cleaner = BRIGHTNESS_DIV_CLEANER;
|
||||||
|
const __m128i ob_check = OVERBRIGHT_PRESENCE_MASK;
|
||||||
|
const __m128i ob_mask = OVERBRIGHT_VALUE_MASK;
|
||||||
|
const __m128i ob_cm = OVERBRIGHT_CONTROL_MASK;
|
||||||
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
|
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
|
||||||
|
|
||||||
for (int y = bp->height; y != 0; y--) {
|
for (int y = bp->height; y != 0; y--) {
|
||||||
Colour *dst = dst_line;
|
Colour *dst = dst_line;
|
||||||
const Colour *src = src_rgba_line + META_LENGTH;
|
const Colour *src = src_rgba_line + META_LENGTH;
|
||||||
if (mode != BM_TRANSPARENT) src_mv = src_mv_line;
|
const MapValue *src_mv = src_mv_line;
|
||||||
uint16 *anim = anim_line;
|
uint16 *anim = anim_line;
|
||||||
|
|
||||||
if (read_mode == RM_WITH_MARGIN) {
|
switch (mode) {
|
||||||
assert(bt_last == BT_NONE); // or you must ensure block type is preserved
|
default: {
|
||||||
anim += src_rgba_line[0].data;
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
src += src_rgba_line[0].data;
|
src += src_rgba_line[0].data;
|
||||||
dst += src_rgba_line[0].data;
|
dst += src_rgba_line[0].data;
|
||||||
if (mode != BM_TRANSPARENT) src_mv += src_rgba_line[0].data;
|
src_mv += src_rgba_line[0].data;
|
||||||
|
anim += src_rgba_line[0].data;
|
||||||
const int width_diff = si->sprite_width - bp->width;
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
effective_width = bp->width - (int) src_rgba_line[0].data;
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
const int new_width = effective_width - delta_diff;
|
const int new_width = effective_width - (delta_diff & ~1);
|
||||||
effective_width = delta_diff > 0 ? new_width : effective_width;
|
effective_width = delta_diff > 0 ? new_width : effective_width;
|
||||||
if (effective_width <= 0) goto next_line;
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mode) {
|
case RM_WITH_SKIP: {
|
||||||
default:
|
|
||||||
if (!translucent) {
|
|
||||||
for (uint x = (uint) effective_width; x > 0; x--) {
|
|
||||||
if (src->a) {
|
|
||||||
if (animated) {
|
|
||||||
*anim = *(const uint16*) src_mv;
|
|
||||||
*dst = (src_mv->m >= PALETTE_ANIM_START) ? AdjustBrightneSSE(this->LookupColourInPalette(src_mv->m), src_mv->v) : src->data;
|
|
||||||
} else {
|
|
||||||
*anim = 0;
|
|
||||||
*dst = *src;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (animated) src_mv++;
|
|
||||||
anim++;
|
|
||||||
src++;
|
|
||||||
dst++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint x = (uint) effective_width/2; x != 0; x--) {
|
|
||||||
uint32 mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
uint32 mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
__m128i dstABCD = _mm_loadl_epi64((__m128i*) dst);
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
for (uint x = (uint) effective_width/2; x != 0; x--) {
|
||||||
if (animated) {
|
|
||||||
/* Remap colours. */
|
/* Remap colours. */
|
||||||
const byte m0 = mvX2;
|
const byte m0 = mvX2;
|
||||||
if (m0 >= PALETTE_ANIM_START) {
|
if (m0 >= PALETTE_ANIM_START) {
|
||||||
const Colour c0 = (this->LookupColourInPalette(m0).data & 0x00FFFFFF) | (src[0].data & 0xFF000000);
|
const Colour c0 = (this->LookupColourInPalette(m0).data & 0x00FFFFFF) | (src[0].data & 0xFF000000);
|
||||||
InsertFirstUint32(AdjustBrightneSSE(c0, (byte) (mvX2 >> 8)).data, srcABCD);
|
INSR32(AdjustBrightness(c0, (byte) (mvX2 >> 8)).data, srcABCD, 0);
|
||||||
}
|
}
|
||||||
const byte m1 = mvX2 >> 16;
|
const byte m1 = mvX2 >> 16;
|
||||||
if (m1 >= PALETTE_ANIM_START) {
|
if (m1 >= PALETTE_ANIM_START) {
|
||||||
const Colour c1 = (this->LookupColourInPalette(m1).data & 0x00FFFFFF) | (src[1].data & 0xFF000000);
|
const Colour c1 = (this->LookupColourInPalette(m1).data & 0x00FFFFFF) | (src[1].data & 0xFF000000);
|
||||||
InsertSecondUint32(AdjustBrightneSSE(c1, (byte) (mvX2 >> 24)).data, srcABCD);
|
INSR32(AdjustBrightness(c1, (byte) (mvX2 >> 24)).data, srcABCD, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update anim buffer. */
|
/* Update anim buffer. */
|
||||||
@@ -136,91 +120,106 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL
|
|||||||
} else {
|
} else {
|
||||||
anim[0] = (uint16) anim01;
|
anim[0] = (uint16) anim01;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (src[0].a) anim[0] = 0;
|
|
||||||
if (src[1].a) anim[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Blend colours. */
|
/* Blend colours. */
|
||||||
bmno_alpha_blend:
|
bmno_alpha_blend:
|
||||||
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm);
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
bmno_full_opacity:
|
bmno_full_opacity:
|
||||||
_mm_storel_epi64((__m128i *) dst, srcABCD);
|
srcABCD = _mm_blend_epi16(srcABCD, dstABCD, 0xF0);
|
||||||
bmno_full_transparency:
|
|
||||||
src_mv += 2;
|
src_mv += 2;
|
||||||
|
mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
src += 2;
|
src += 2;
|
||||||
anim += 2;
|
anim += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) (dst+2));
|
||||||
|
_mm_storeu_si128((__m128i *) dst, srcABCD);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
dst += 2;
|
dst += 2;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bmno_full_transparency:
|
||||||
|
src_mv += 2;
|
||||||
|
mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
|
dst += 2;
|
||||||
|
src += 2;
|
||||||
|
anim += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((bt_last == BT_NONE && effective_width & 1) || bt_last == BT_ODD) {
|
if (bt_last == BT_ODD) {
|
||||||
if (src->a == 0) {
|
if (src->a == 0) {
|
||||||
} else if (src->a == 255) {
|
} else if (src->a == 255) {
|
||||||
*anim = *(const uint16*) src_mv;
|
*anim = (uint16) mvX2;
|
||||||
*dst = (src_mv->m >= PALETTE_ANIM_START) ? AdjustBrightneSSE(LookupColourInPalette(src_mv->m), src_mv->v) : *src;
|
*dst = ((byte) mvX2 >= PALETTE_ANIM_START) ? AdjustBrightness(LookupColourInPalette((byte) mvX2), (byte) (mvX2 >> 8)) : *src;
|
||||||
} else {
|
} else {
|
||||||
*anim = 0;
|
*anim = 0;
|
||||||
__m128i srcABCD;
|
if ((byte) mvX2 >= PALETTE_ANIM_START) {
|
||||||
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
|
ALIGN(16) Colour colour = AdjustBrightness(LookupColourInPalette((byte) mvX2), (byte) (mvX2 >> 8));
|
||||||
if (src_mv->m >= PALETTE_ANIM_START) {
|
|
||||||
Colour colour = AdjustBrightneSSE(LookupColourInPalette(src_mv->m), src_mv->v);
|
|
||||||
colour.a = src->a;
|
colour.a = src->a;
|
||||||
srcABCD = _mm_cvtsi32_si128(colour.data);
|
srcABCD = _mm_load_si128((__m128i*) &colour);
|
||||||
} else {
|
|
||||||
srcABCD = _mm_cvtsi32_si128(src->data);
|
|
||||||
}
|
}
|
||||||
dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm));
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
|
(*dst).data = EXTR32(srcABCD, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case BM_COLOUR_REMAP:
|
default: NOT_REACHED();
|
||||||
for (uint x = (uint) effective_width / 2; x != 0; x--) {
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BM_COLOUR_REMAP: {
|
||||||
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
|
src += src_rgba_line[0].data;
|
||||||
|
src_mv += src_rgba_line[0].data;
|
||||||
|
dst += src_rgba_line[0].data;
|
||||||
|
anim += src_rgba_line[0].data;
|
||||||
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
|
const int nd = effective_width - delta_diff;
|
||||||
|
effective_width = delta_diff > 0 ? nd : effective_width;
|
||||||
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case RM_WITH_SKIP: {
|
||||||
uint32 mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
uint32 mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
__m128i dstABCD = _mm_loadl_epi64((__m128i*) dst);
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
|
||||||
|
for (uint x = (uint) effective_width / 2; x != 0; x--) {
|
||||||
/* Remap colours. */
|
/* Remap colours. */
|
||||||
const uint m0 = (byte) mvX2;
|
const uint m0 = (byte) mvX2;
|
||||||
const uint r0 = remap[m0];
|
const uint r0 = remap[m0];
|
||||||
const uint m1 = (byte) (mvX2 >> 16);
|
const uint m1 = (byte) (mvX2 >> 16);
|
||||||
const uint r1 = remap[m1];
|
const uint r1 = remap[m1];
|
||||||
if (mvX2 & 0x00FF00FF) {
|
if (mvX2 & 0x00FF00FF) {
|
||||||
#define CMOV_REMAP(m_colour, m_colour_init, m_src, m_m) \
|
/* Written so the compiler uses CMOV. */
|
||||||
/* Written so the compiler uses CMOV. */ \
|
const Colour src0 = src[0];
|
||||||
Colour m_colour = m_colour_init; \
|
const Colour c0map = (this->LookupColourInPalette(r0).data & 0x00FFFFFF) | (src0.data & 0xFF000000);
|
||||||
{ \
|
Colour c0 = dst[0];
|
||||||
const Colour srcm = (Colour) (m_src); \
|
c0 = r0 == 0 ? c0 : c0map;
|
||||||
const uint m = (byte) (m_m); \
|
c0 = m0 != 0 ? c0 : src0;
|
||||||
const uint r = remap[m]; \
|
INSR32(c0.data, srcABCD, 0);
|
||||||
const Colour cmap = (this->LookupColourInPalette(r).data & 0x00FFFFFF) | (srcm.data & 0xFF000000); \
|
|
||||||
m_colour = r == 0 ? m_colour : cmap; \
|
|
||||||
m_colour = m != 0 ? m_colour : srcm; \
|
|
||||||
}
|
|
||||||
#ifdef _SQ64
|
|
||||||
uint64 srcs = _mm_cvtsi128_si64(srcABCD);
|
|
||||||
uint64 dsts;
|
|
||||||
if (animated) dsts = _mm_cvtsi128_si64(dstABCD);
|
|
||||||
uint64 remapped_src = 0;
|
|
||||||
CMOV_REMAP(c0, animated ? dsts : 0, srcs, mvX2);
|
|
||||||
remapped_src = c0.data;
|
|
||||||
CMOV_REMAP(c1, animated ? dsts >> 32 : 0, srcs >> 32, mvX2 >> 16);
|
|
||||||
remapped_src |= (uint64) c1.data << 32;
|
|
||||||
srcABCD = _mm_cvtsi64_si128(remapped_src);
|
|
||||||
#else
|
|
||||||
Colour remapped_src[2];
|
|
||||||
CMOV_REMAP(c0, animated ? _mm_cvtsi128_si32(dstABCD) : 0, _mm_cvtsi128_si32(srcABCD), mvX2);
|
|
||||||
remapped_src[0] = c0.data;
|
|
||||||
CMOV_REMAP(c1, animated ? dst[1] : 0, src[1], mvX2 >> 16);
|
|
||||||
remapped_src[1] = c1.data;
|
|
||||||
srcABCD = _mm_loadl_epi64((__m128i*) &remapped_src);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((mvX2 & 0xFF00FF00) != 0x80008000) srcABCD = AdjustBrightnessOfTwoPixels(srcABCD, mvX2);
|
const Colour src1 = src[1];
|
||||||
|
const Colour c1map = (this->LookupColourInPalette(r1).data & 0x00FFFFFF) | (src1.data & 0xFF000000);
|
||||||
|
Colour c1 = dst[1];
|
||||||
|
c1 = r1 == 0 ? c1 : c1map;
|
||||||
|
c1 = m1 != 0 ? c1 : src1;
|
||||||
|
INSR32(c1.data, srcABCD, 1);
|
||||||
|
|
||||||
|
if ((mvX2 & 0xFF00FF00) != 0x80008000) {
|
||||||
|
ADJUST_BRIGHTNESS_2(srcABCD, mvX2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update anim buffer. */
|
/* Update anim buffer. */
|
||||||
if (animated) {
|
|
||||||
const byte a0 = src[0].a;
|
const byte a0 = src[0].a;
|
||||||
const byte a1 = src[1].a;
|
const byte a1 = src[1].a;
|
||||||
uint32 anim01 = mvX2 & 0xFF00FF00;
|
uint32 anim01 = mvX2 & 0xFF00FF00;
|
||||||
@@ -246,96 +245,109 @@ bmno_full_transparency:
|
|||||||
} else {
|
} else {
|
||||||
anim[0] = (uint16) anim01;
|
anim[0] = (uint16) anim01;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (src[0].a) anim[0] = 0;
|
|
||||||
if (src[1].a) anim[1] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Blend colours. */
|
/* Blend colours. */
|
||||||
bmcr_alpha_blend:
|
bmcr_alpha_blend:
|
||||||
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm);
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
bmcr_full_opacity:
|
bmcr_full_opacity:
|
||||||
_mm_storel_epi64((__m128i *) dst, srcABCD);
|
srcABCD = _mm_blend_epi16(srcABCD, dstABCD, 0xF0);
|
||||||
|
|
||||||
|
src += 2;
|
||||||
|
src_mv += 2;
|
||||||
|
anim += 2;
|
||||||
|
mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) (dst+2));
|
||||||
|
_mm_storeu_si128((__m128i *) dst, srcABCD);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
dst += 2;
|
||||||
|
continue;
|
||||||
|
|
||||||
bmcr_full_transparency:
|
bmcr_full_transparency:
|
||||||
src_mv += 2;
|
src_mv += 2;
|
||||||
|
mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
dst += 2;
|
dst += 2;
|
||||||
src += 2;
|
src += 2;
|
||||||
anim += 2;
|
anim += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((bt_last == BT_NONE && effective_width & 1) || bt_last == BT_ODD) {
|
if (effective_width & 1) {
|
||||||
/* In case the m-channel is zero, do not remap this pixel in any way. */
|
/* In case the m-channel is zero, do not remap this pixel in any way. */
|
||||||
__m128i srcABCD;
|
if (src->a == 0) {
|
||||||
if (src->a == 0) break;
|
} else if ((byte) mvX2 != 0) {
|
||||||
if (src_mv->m) {
|
const uint r = remap[(byte) mvX2];
|
||||||
const uint r = remap[src_mv->m];
|
*anim = (src->a == 255) ? (r | ((uint16) mvX2 & 0xFF00)) : 0;
|
||||||
*anim = (animated && src->a == 255) ? r | ((uint16) src_mv->v << 8 ) : 0;
|
|
||||||
if (r != 0) {
|
if (r != 0) {
|
||||||
Colour remapped_colour = AdjustBrightneSSE(this->LookupColourInPalette(r), src_mv->v);
|
Colour remapped_colour = AdjustBrightness(LookupColourInPalette(r), (byte) (mvX2 >> 8));
|
||||||
if (src->a == 255) {
|
if (src->a == 255) {
|
||||||
*dst = remapped_colour;
|
*dst = remapped_colour;
|
||||||
} else {
|
} else {
|
||||||
remapped_colour.a = src->a;
|
remapped_colour.a = src->a;
|
||||||
srcABCD = _mm_cvtsi32_si128(remapped_colour.data);
|
INSR32(remapped_colour.data, srcABCD, 0);
|
||||||
goto bmcr_alpha_blend_single;
|
goto bmcr_alpha_blend_single;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
*anim = 0;
|
*anim = 0;
|
||||||
srcABCD = _mm_cvtsi32_si128(src->data);
|
if (src->a == 255) {
|
||||||
if (src->a < 255) {
|
*dst = *src;
|
||||||
|
} else {
|
||||||
bmcr_alpha_blend_single:
|
bmcr_alpha_blend_single:
|
||||||
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, a_cm, pack_low_cm);
|
(*dst).data = EXTR32(srcABCD, 0);
|
||||||
}
|
}
|
||||||
dst->data = _mm_cvtsi128_si32(srcABCD);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case BM_TRANSPARENT:
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BM_TRANSPARENT: {
|
||||||
/* Make the current colour a bit more black, so it looks like this image is transparent. */
|
/* Make the current colour a bit more black, so it looks like this image is transparent. */
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
for (uint x = (uint) bp->width / 2; x > 0; x--) {
|
for (uint x = (uint) bp->width / 2; x > 0; x--) {
|
||||||
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
__m128i dstABCD = _mm_loadl_epi64((__m128i*) dst);
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
_mm_storel_epi64((__m128i *) dst, DarkenTwoPixels(srcABCD, dstABCD, a_cm, tr_nom_base));
|
__m128i dstCD = _mm_unpackhi_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i alphaAB = _mm_shuffle_epi8(srcAB, a_cm);
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 2); // Reduce to 64 levels of shades so the max value fits in 16 bits.
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstCD);
|
||||||
|
Colour *old_dst = dst;
|
||||||
src += 2;
|
src += 2;
|
||||||
dst += 2;
|
dst += 2;
|
||||||
anim += 2;
|
anim += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, dstAB);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
if (src[-2].a) anim[-2] = 0;
|
if (src[-2].a) anim[-2] = 0;
|
||||||
if (src[-1].a) anim[-1] = 0;
|
if (src[-1].a) anim[-1] = 0;
|
||||||
}
|
}
|
||||||
|
if (bp->width & 1) {
|
||||||
if ((bt_last == BT_NONE && bp->width & 1) || bt_last == BT_ODD) {
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
__m128i srcABCD = _mm_cvtsi32_si128(src->data);
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
|
__m128i alphaAB = _mm_shuffle_epi8(srcAB, a_cm);
|
||||||
dst->data = _mm_cvtsi128_si32(DarkenTwoPixels(srcABCD, dstABCD, a_cm, tr_nom_base));
|
alphaAB = _mm_srli_epi16(alphaAB, 2);
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstAB);
|
||||||
|
(*dst).data = EXTR32(dstAB, 0);
|
||||||
if (src[0].a) anim[0] = 0;
|
if (src[0].a) anim[0] = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BM_CRASH_REMAP:
|
|
||||||
for (uint x = (uint) bp->width; x > 0; x--) {
|
|
||||||
if (src_mv->m == 0) {
|
|
||||||
if (src->a != 0) {
|
|
||||||
uint8 g = MakeDark(src->r, src->g, src->b);
|
|
||||||
*dst = ComposeColourRGBA(g, g, g, src->a, *dst);
|
|
||||||
*anim = 0;
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
uint r = remap[src_mv->m];
|
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
|
|
||||||
}
|
|
||||||
src_mv++;
|
|
||||||
dst++;
|
|
||||||
src++;
|
|
||||||
anim++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
next_line:
|
src_mv_line += si->sprite_width;
|
||||||
if (mode != BM_TRANSPARENT) src_mv_line += si->sprite_width;
|
|
||||||
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
|
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
|
||||||
dst_line += bp->pitch;
|
dst_line += bp->pitch;
|
||||||
anim_line += this->anim_buf_width;
|
anim_line += this->anim_buf_width;
|
||||||
@@ -352,48 +364,42 @@ IGNORE_UNINITIALIZED_WARNING_STOP
|
|||||||
*/
|
*/
|
||||||
void Blitter_32bppSSE4_Anim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
void Blitter_32bppSSE4_Anim::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
||||||
{
|
{
|
||||||
const Blitter_32bppSSE_Base::SpriteFlags sprite_flags = ((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags;
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
default: {
|
case BM_NORMAL: {
|
||||||
bm_normal:
|
|
||||||
if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) {
|
|
||||||
const BlockType bt_last = (BlockType) (bp->width & 1);
|
const BlockType bt_last = (BlockType) (bp->width & 1);
|
||||||
if (bt_last == BT_EVEN) {
|
if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) {
|
||||||
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN, true, false>(bp, zoom);
|
switch (bt_last) {
|
||||||
else Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN, true, true>(bp, zoom);
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN>(bp, zoom); return;
|
||||||
} else {
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD>(bp, zoom); return;
|
||||||
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true, false>(bp, zoom);
|
default: NOT_REACHED();
|
||||||
else Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true, true>(bp, zoom);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef _SQ64
|
switch (bt_last) {
|
||||||
if (sprite_flags & SF_TRANSLUCENT) {
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_EVEN>(bp, zoom); return;
|
||||||
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom);
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_ODD>(bp, zoom); return;
|
||||||
else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom);
|
default: NOT_REACHED();
|
||||||
} else {
|
|
||||||
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false, false>(bp, zoom);
|
|
||||||
else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false, true>(bp, zoom);
|
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
if (sprite_flags & SF_NO_ANIM) Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom);
|
|
||||||
else Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BM_COLOUR_REMAP:
|
case BM_COLOUR_REMAP:
|
||||||
if (sprite_flags & SF_NO_REMAP) goto bm_normal;
|
|
||||||
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
|
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
|
||||||
if (sprite_flags & SF_NO_ANIM) Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true, false>(bp, zoom);
|
Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE>(bp, zoom); return;
|
||||||
else Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true, true>(bp, zoom);
|
|
||||||
} else {
|
} else {
|
||||||
if (sprite_flags & SF_NO_ANIM) Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true, false>(bp, zoom);
|
Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE>(bp, zoom); return;
|
||||||
else Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true, true>(bp, zoom);
|
|
||||||
}
|
}
|
||||||
break;
|
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE>(bp, zoom); return;
|
||||||
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
|
default: NOT_REACHED();
|
||||||
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, RM_NONE, BT_NONE, true, true>(bp, zoom); return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Same code as seen in 32bpp_sse2.cpp but some macros are not the same. */
|
||||||
|
inline Colour Blitter_32bppSSE4_Anim::AdjustBrightness(Colour colour, uint8 brightness)
|
||||||
|
{
|
||||||
|
/* Shortcut for normal brightness. */
|
||||||
|
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||||
|
|
||||||
|
return Blitter_32bppSSE4::ReallyAdjustBrightness(colour, brightness);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* WITH_SSE */
|
#endif /* WITH_SSE */
|
||||||
|
@@ -14,14 +14,6 @@
|
|||||||
|
|
||||||
#ifdef WITH_SSE
|
#ifdef WITH_SSE
|
||||||
|
|
||||||
#ifndef SSE_VERSION
|
|
||||||
#define SSE_VERSION 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FULL_ANIMATION
|
|
||||||
#define FULL_ANIMATION 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "32bpp_anim.hpp"
|
#include "32bpp_anim.hpp"
|
||||||
#include "32bpp_sse4.hpp"
|
#include "32bpp_sse4.hpp"
|
||||||
|
|
||||||
@@ -33,12 +25,14 @@ class Blitter_32bppSSE4_Anim FINAL : public Blitter_32bppAnim, public Blitter_32
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last, bool translucent, bool animated>
|
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last>
|
||||||
/* virtual */ void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
/* virtual */ void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
||||||
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
||||||
|
/* virtual */ Colour AdjustBrightness(Colour colour, uint8 brightness);
|
||||||
/* virtual */ Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) {
|
/* virtual */ Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) {
|
||||||
return Blitter_32bppSSE_Base::Encode(sprite, allocator);
|
return Blitter_32bppSSE_Base::Encode(sprite, allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* virtual */ const char *GetName() { return "32bpp-sse4-anim"; }
|
/* virtual */ const char *GetName() { return "32bpp-sse4-anim"; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -112,19 +112,6 @@ public:
|
|||||||
return Colour(r * nom / denom, g * nom / denom, b * nom / denom);
|
return Colour(r * nom / denom, g * nom / denom, b * nom / denom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Make a colour dark grey, for specialized 32bpp remapping.
|
|
||||||
* @param r red component
|
|
||||||
* @param g green component
|
|
||||||
* @param b blue component
|
|
||||||
* @return the brightness value of the new colour, now dark grey.
|
|
||||||
*/
|
|
||||||
static inline uint8 MakeDark(uint8 r, uint8 g, uint8 b)
|
|
||||||
{
|
|
||||||
/* Magic-numbers are ~66% of those used in MakeGrey() */
|
|
||||||
return ((r * 13063) + (g * 25647) + (b * 4981)) / 65536;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make a colour grey - based.
|
* Make a colour grey - based.
|
||||||
* @param colour the colour to make grey.
|
* @param colour the colour to make grey.
|
||||||
|
@@ -141,40 +141,6 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BM_CRASH_REMAP:
|
|
||||||
if (src_px->a == 255) {
|
|
||||||
do {
|
|
||||||
uint m = *src_n;
|
|
||||||
if (m == 0) {
|
|
||||||
uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
|
|
||||||
*dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
|
|
||||||
} else {
|
|
||||||
uint r = remap[GB(m, 0, 8)];
|
|
||||||
if (r != 0) *dst = this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8));
|
|
||||||
}
|
|
||||||
dst++;
|
|
||||||
src_px++;
|
|
||||||
src_n++;
|
|
||||||
} while (--n != 0);
|
|
||||||
} else {
|
|
||||||
do {
|
|
||||||
uint m = *src_n;
|
|
||||||
if (m == 0) {
|
|
||||||
if (src_px->a != 0) {
|
|
||||||
uint8 g = MakeDark(src_px->r, src_px->g, src_px->b);
|
|
||||||
*dst = ComposeColourRGBA(g, g, g, src_px->a, *dst);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
uint r = remap[GB(m, 0, 8)];
|
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), GB(m, 8, 8)), src_px->a, *dst);
|
|
||||||
}
|
|
||||||
dst++;
|
|
||||||
src_px++;
|
|
||||||
src_n++;
|
|
||||||
} while (--n != 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BM_TRANSPARENT:
|
case BM_TRANSPARENT:
|
||||||
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
|
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
|
||||||
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
|
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
|
||||||
@@ -238,7 +204,6 @@ void Blitter_32bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode,
|
|||||||
case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
|
case BM_NORMAL: Draw<BM_NORMAL> (bp, zoom); return;
|
||||||
case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
|
case BM_COLOUR_REMAP: Draw<BM_COLOUR_REMAP>(bp, zoom); return;
|
||||||
case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return;
|
case BM_TRANSPARENT: Draw<BM_TRANSPARENT> (bp, zoom); return;
|
||||||
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP> (bp, zoom); return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,17 +45,6 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BM_CRASH_REMAP:
|
|
||||||
if (src->m == 0) {
|
|
||||||
if (src->a != 0) {
|
|
||||||
uint8 g = MakeDark(src->r, src->g, src->b);
|
|
||||||
*dst = ComposeColourRGBA(g, g, g, src->a, *dst);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (bp->remap[src->m] != 0) *dst = ComposeColourPA(this->AdjustBrightness(this->LookupColourInPalette(bp->remap[src->m]), src->v), src->a, *dst);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BM_TRANSPARENT:
|
case BM_TRANSPARENT:
|
||||||
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
|
/* TODO -- We make an assumption here that the remap in fact is transparency, not some colour.
|
||||||
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
|
* This is never a problem with the code we produce, but newgrfs can make it fail... or at least:
|
||||||
|
@@ -15,14 +15,223 @@
|
|||||||
#include "../zoom_func.h"
|
#include "../zoom_func.h"
|
||||||
#include "../settings_type.h"
|
#include "../settings_type.h"
|
||||||
#include "32bpp_sse2.hpp"
|
#include "32bpp_sse2.hpp"
|
||||||
#include "32bpp_sse_func.hpp"
|
|
||||||
|
|
||||||
/** Instantiation of the SSE2 32bpp blitter factory. */
|
/** Instantiation of the SSE2 32bpp blitter factory. */
|
||||||
static FBlitter_32bppSSE2 iFBlitter_32bppSSE2;
|
static FBlitter_32bppSSE2 iFBlitter_32bppSSE2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws a sprite to a (screen) buffer. It is templated to allow faster operation.
|
||||||
|
*
|
||||||
|
* @tparam mode blitter mode
|
||||||
|
* @param bp further blitting parameters
|
||||||
|
* @param zoom zoom level at which we are drawing
|
||||||
|
*/
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_START
|
||||||
|
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last>
|
||||||
|
inline void Blitter_32bppSSE2::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
||||||
|
{
|
||||||
|
Colour *dst_line = (Colour *) bp->dst + bp->top * bp->pitch + bp->left;
|
||||||
|
int effective_width = bp->width;
|
||||||
|
|
||||||
|
/* Find where to start reading in the source sprite */
|
||||||
|
const SpriteData * const sd = (const SpriteData *) bp->sprite;
|
||||||
|
const SpriteInfo * const si = &sd->infos[zoom];
|
||||||
|
const MapValue *src_mv_line = (const MapValue *) &sd->data[si->mv_offset] + bp->skip_top * si->sprite_width;
|
||||||
|
const Colour *src_rgba_line = (const Colour *) ((const byte *) &sd->data[si->sprite_offset] + bp->skip_top * si->sprite_line_size);
|
||||||
|
|
||||||
|
if (read_mode != RM_WITH_MARGIN) {
|
||||||
|
src_rgba_line += bp->skip_left;
|
||||||
|
src_mv_line += bp->skip_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load these variables into register before loop. */
|
||||||
|
const __m128i clear_hi = CLEAR_HIGH_BYTE_MASK;
|
||||||
|
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
|
||||||
|
|
||||||
|
for (int y = bp->height; y != 0; y--) {
|
||||||
|
Colour *dst = dst_line;
|
||||||
|
const Colour *src = src_rgba_line + META_LENGTH;
|
||||||
|
const MapValue *src_mv = src_mv_line;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
default: {
|
||||||
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
|
src += src_rgba_line[0].data;
|
||||||
|
dst += src_rgba_line[0].data;
|
||||||
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
|
const int new_width = effective_width - (delta_diff & ~1);
|
||||||
|
effective_width = delta_diff > 0 ? new_width : effective_width;
|
||||||
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case RM_WITH_SKIP: {
|
||||||
|
for (uint x = (uint) effective_width / 2; x > 0; x--) {
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
ALPHA_BLEND_2();
|
||||||
|
*(uint64*) dst = EXTR64(srcABCD, 0);
|
||||||
|
src += 2;
|
||||||
|
dst += 2;
|
||||||
|
}
|
||||||
|
if (bt_last == BT_ODD) {
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
ALPHA_BLEND_2();
|
||||||
|
(*dst).data = EXTR32(srcABCD, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BM_COLOUR_REMAP: {
|
||||||
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
|
src += src_rgba_line[0].data;
|
||||||
|
src_mv += src_rgba_line[0].data;
|
||||||
|
dst += src_rgba_line[0].data;
|
||||||
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
|
const int nd = effective_width - delta_diff;
|
||||||
|
effective_width = delta_diff > 0 ? nd : effective_width;
|
||||||
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case RM_WITH_SKIP: {
|
||||||
|
const byte *remap = bp->remap;
|
||||||
|
for (uint x = (uint) effective_width; x != 0; x--) {
|
||||||
|
/* In case the m-channel is zero, do not remap this pixel in any way */
|
||||||
|
if (src_mv->m == 0) {
|
||||||
|
if (src->a < 255) {
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
ALPHA_BLEND_2();
|
||||||
|
(*dst).data = EXTR32(srcABCD, 0);
|
||||||
|
} else {
|
||||||
|
*dst = src->data;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const uint r = remap[src_mv->m];
|
||||||
|
if (r != 0) {
|
||||||
|
Colour remapped_colour = AdjustBrightness(this->LookupColourInPalette(r), src_mv->v);
|
||||||
|
if (src->a < 255) {
|
||||||
|
__m128i srcABCD;
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
remapped_colour.a = src->a;
|
||||||
|
INSR32(remapped_colour.data, srcABCD, 0);
|
||||||
|
ALPHA_BLEND_2();
|
||||||
|
(*dst).data = EXTR32(srcABCD, 0);
|
||||||
|
} else
|
||||||
|
*dst = remapped_colour;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
src_mv++;
|
||||||
|
dst++;
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
src_mv_line += si->sprite_width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BM_TRANSPARENT: {
|
||||||
|
/* Make the current colour a bit more black, so it looks like this image is transparent.
|
||||||
|
* rgb = rgb * ((256/4) * 4 - (alpha/4)) / ((256/4) * 4)
|
||||||
|
*/
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
for (uint x = (uint) bp->width / 2; x > 0; x--) {
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstCD = _mm_unpackhi_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i alphaAB = _mm_shufflelo_epi16(srcAB, 0x3F);
|
||||||
|
alphaAB = _mm_shufflehi_epi16(alphaAB, 0x3F);
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 2); // Reduce to 64 levels of shades so the max value fits in 16 bits.
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstCD);
|
||||||
|
Colour *old_dst = dst;
|
||||||
|
src += 2;
|
||||||
|
dst += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, dstAB);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
}
|
||||||
|
if (bp->width & 1) {
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i alphaAB = _mm_shufflelo_epi16(srcAB, 0x3F);
|
||||||
|
alphaAB = _mm_shufflehi_epi16(alphaAB, 0x3F);
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 2);
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstAB);
|
||||||
|
(*dst).data = EXTR32(dstAB, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
|
||||||
|
dst_line += bp->pitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_STOP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws a sprite to a (screen) buffer. Calls adequate templated function.
|
||||||
|
*
|
||||||
|
* @param bp further blitting parameters
|
||||||
|
* @param mode blitter mode
|
||||||
|
* @param zoom zoom level at which we are drawing
|
||||||
|
*/
|
||||||
|
void Blitter_32bppSSE2::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case BM_NORMAL: {
|
||||||
|
const BlockType bt_last = (BlockType) (bp->width & 1);
|
||||||
|
if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) {
|
||||||
|
switch (bt_last) {
|
||||||
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN>(bp, zoom); return;
|
||||||
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (bt_last) {
|
||||||
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_EVEN>(bp, zoom); return;
|
||||||
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_ODD>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BM_COLOUR_REMAP:
|
||||||
|
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
|
||||||
|
Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE>(bp, zoom); return;
|
||||||
|
} else {
|
||||||
|
Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE>(bp, zoom); return;
|
||||||
|
}
|
||||||
|
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator)
|
Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator)
|
||||||
{
|
{
|
||||||
/* First uint32 of a line = the number of transparent pixels from the left.
|
/* First uint32 of a line = ~1 & the number of transparent pixels from the left.
|
||||||
* Second uint32 of a line = the number of transparent pixels from the right.
|
* Second uint32 of a line = the number of transparent pixels from the right.
|
||||||
* Then all RGBA then all MV.
|
* Then all RGBA then all MV.
|
||||||
*/
|
*/
|
||||||
@@ -36,7 +245,6 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca
|
|||||||
|
|
||||||
/* Calculate sizes and allocate. */
|
/* Calculate sizes and allocate. */
|
||||||
SpriteData sd;
|
SpriteData sd;
|
||||||
memset(&sd, 0, sizeof(sd));
|
|
||||||
uint all_sprites_size = 0;
|
uint all_sprites_size = 0;
|
||||||
for (ZoomLevel z = zoom_min; z <= zoom_max; z++) {
|
for (ZoomLevel z = zoom_min; z <= zoom_max; z++) {
|
||||||
const SpriteLoader::Sprite *src_sprite = &sprite[z];
|
const SpriteLoader::Sprite *src_sprite = &sprite[z];
|
||||||
@@ -58,10 +266,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca
|
|||||||
dst_sprite->y_offs = sprite->y_offs;
|
dst_sprite->y_offs = sprite->y_offs;
|
||||||
memcpy(dst_sprite->data, &sd, sizeof(SpriteData));
|
memcpy(dst_sprite->data, &sd, sizeof(SpriteData));
|
||||||
|
|
||||||
/* Copy colours and determine flags. */
|
/* Copy colours. */
|
||||||
bool has_remap = false;
|
|
||||||
bool has_anim = false;
|
|
||||||
bool has_translucency = false;
|
|
||||||
for (ZoomLevel z = zoom_min; z <= zoom_max; z++) {
|
for (ZoomLevel z = zoom_min; z <= zoom_max; z++) {
|
||||||
const SpriteLoader::Sprite *src_sprite = &sprite[z];
|
const SpriteLoader::Sprite *src_sprite = &sprite[z];
|
||||||
const SpriteLoader::CommonPixel *src = (const SpriteLoader::CommonPixel *) src_sprite->data;
|
const SpriteLoader::CommonPixel *src = (const SpriteLoader::CommonPixel *) src_sprite->data;
|
||||||
@@ -72,19 +277,14 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca
|
|||||||
for (uint x = src_sprite->width; x != 0; x--) {
|
for (uint x = src_sprite->width; x != 0; x--) {
|
||||||
if (src->a != 0) {
|
if (src->a != 0) {
|
||||||
dst_rgba->a = src->a;
|
dst_rgba->a = src->a;
|
||||||
if (src->a != 0 && src->a != 255) has_translucency = true;
|
|
||||||
dst_mv->m = src->m;
|
dst_mv->m = src->m;
|
||||||
if (src->m != 0) {
|
if (src->m != 0) {
|
||||||
/* Do some accounting for flags. */
|
|
||||||
has_remap = true;
|
|
||||||
if (src->m >= PALETTE_ANIM_START) has_anim = true;
|
|
||||||
|
|
||||||
/* Get brightest value (or default brightness if it's a black pixel). */
|
/* Get brightest value (or default brightness if it's a black pixel). */
|
||||||
const uint8 rgb_max = max(src->r, max(src->g, src->b));
|
const uint8 rgb_max = max(src->r, max(src->g, src->b));
|
||||||
dst_mv->v = (rgb_max == 0) ? Blitter_32bppBase::DEFAULT_BRIGHTNESS : rgb_max;
|
dst_mv->v = (rgb_max == 0) ? Blitter_32bppBase::DEFAULT_BRIGHTNESS : rgb_max;
|
||||||
|
|
||||||
/* Pre-convert the mapping channel to a RGB value. */
|
/* Pre-convert the mapping channel to a RGB value. */
|
||||||
const Colour colour = AdjustBrightneSSE(Blitter_32bppBase::LookupColourInPalette(src->m), dst_mv->v);
|
const Colour colour = AdjustBrightness(Blitter_32bppBase::LookupColourInPalette(src->m), dst_mv->v);
|
||||||
dst_rgba->r = colour.r;
|
dst_rgba->r = colour.r;
|
||||||
dst_rgba->g = colour.g;
|
dst_rgba->g = colour.g;
|
||||||
dst_rgba->b = colour.b;
|
dst_rgba->b = colour.b;
|
||||||
@@ -111,7 +311,7 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca
|
|||||||
else break;
|
else break;
|
||||||
dst_rgba++;
|
dst_rgba++;
|
||||||
}
|
}
|
||||||
(*dst_rgba_line).data = nb_pix_transp;
|
(*dst_rgba_line).data = nb_pix_transp & ~1; // "& ~1" to preserve the last block type
|
||||||
|
|
||||||
Colour *nb_right = dst_rgba_line + 1;
|
Colour *nb_right = dst_rgba_line + 1;
|
||||||
dst_rgba_line = (Colour*) ((byte*) dst_rgba_line + sd.infos[z].sprite_line_size);
|
dst_rgba_line = (Colour*) ((byte*) dst_rgba_line + sd.infos[z].sprite_line_size);
|
||||||
@@ -124,18 +324,56 @@ Sprite *Blitter_32bppSSE_Base::Encode(const SpriteLoader::Sprite *sprite, Alloca
|
|||||||
else break;
|
else break;
|
||||||
dst_rgba--;
|
dst_rgba--;
|
||||||
}
|
}
|
||||||
(*nb_right).data = nb_pix_transp;
|
(*nb_right).data = nb_pix_transp; // no "& ~1" here, must be done when we know bp->width
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store sprite flags. */
|
|
||||||
sd.flags = SF_NONE;
|
|
||||||
if (has_translucency) sd.flags |= SF_TRANSLUCENT;
|
|
||||||
if (!has_remap) sd.flags |= SF_NO_REMAP;
|
|
||||||
if (!has_anim) sd.flags |= SF_NO_ANIM;
|
|
||||||
memcpy(dst_sprite->data, &sd, sizeof(SpriteData));
|
|
||||||
|
|
||||||
return dst_sprite;
|
return dst_sprite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** ReallyAdjustBrightness() is not called that often.
|
||||||
|
* Inlining this function implies a far jump, which has a huge latency.
|
||||||
|
*/
|
||||||
|
inline Colour Blitter_32bppSSE2::AdjustBrightness(Colour colour, uint8 brightness)
|
||||||
|
{
|
||||||
|
/* Shortcut for normal brightness. */
|
||||||
|
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||||
|
|
||||||
|
return Blitter_32bppSSE2::ReallyAdjustBrightness(colour, brightness);
|
||||||
|
}
|
||||||
|
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_START
|
||||||
|
/* static */ Colour Blitter_32bppSSE2::ReallyAdjustBrightness(Colour colour, uint8 brightness)
|
||||||
|
{
|
||||||
|
ALIGN(16) uint64 c16 = colour.b | (uint64) colour.g << 16 | (uint64) colour.r << 32;
|
||||||
|
c16 *= brightness;
|
||||||
|
uint64 c16_ob = c16; // Helps out of order execution.
|
||||||
|
c16 /= DEFAULT_BRIGHTNESS;
|
||||||
|
c16 &= 0x01FF01FF01FF;
|
||||||
|
|
||||||
|
/* Sum overbright (maximum for each rgb is 508, 9 bits, -255 is changed in -256 so we just have to take the 8 lower bits into account). */
|
||||||
|
c16_ob = (((c16_ob >> (8 + 7)) & 0x0100010001) * 0xFF) & c16;
|
||||||
|
uint64 ob = (uint16) c16_ob + (uint16) (c16_ob >> 16) + (uint16) (c16_ob >> 32);
|
||||||
|
|
||||||
|
const uint32 alpha32 = colour.data & 0xFF000000;
|
||||||
|
__m128i ret;
|
||||||
|
INSR64(c16, ret, 0);
|
||||||
|
if (ob != 0) {
|
||||||
|
/* Reduce overbright strength. */
|
||||||
|
ob /= 2;
|
||||||
|
__m128i ob128;
|
||||||
|
INSR64(ob | ob << 16 | ob << 32, ob128, 0);
|
||||||
|
__m128i white = OVERBRIGHT_VALUE_MASK;
|
||||||
|
__m128i c128 = ret;
|
||||||
|
ret = _mm_subs_epu16(white, c128); /* PSUBUSW, (255 - rgb) */
|
||||||
|
ret = _mm_mullo_epi16(ret, ob128); /* PMULLW, ob*(255 - rgb) */
|
||||||
|
ret = _mm_srli_epi16(ret, 8); /* PSRLW, ob*(255 - rgb)/256 */
|
||||||
|
ret = _mm_add_epi16(ret, c128); /* PADDW, ob*(255 - rgb)/256 + rgb */
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = _mm_packus_epi16(ret, ret); /* PACKUSWB, saturate and pack. */
|
||||||
|
return alpha32 | EXTR32(ret, 0);
|
||||||
|
}
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_STOP
|
||||||
|
|
||||||
#endif /* WITH_SSE */
|
#endif /* WITH_SSE */
|
||||||
|
@@ -14,15 +14,64 @@
|
|||||||
|
|
||||||
#ifdef WITH_SSE
|
#ifdef WITH_SSE
|
||||||
|
|
||||||
#ifndef SSE_VERSION
|
#include "32bpp_simple.hpp"
|
||||||
#define SSE_VERSION 2
|
#include "emmintrin.h"
|
||||||
|
|
||||||
|
#define META_LENGTH 2 ///< Number of uint32 inserted before each line of pixels in a sprite.
|
||||||
|
#define MARGIN_NORMAL_THRESHOLD (zoom == ZOOM_LVL_OUT_32X ? 8 : 4) ///< Minimum width to use margins with BM_NORMAL.
|
||||||
|
#define MARGIN_REMAP_THRESHOLD 4 ///< Minimum width to use margins with BM_COLOUR_REMAP.
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define ALIGN(n) __declspec(align(n))
|
||||||
|
#else
|
||||||
|
#define ALIGN(n) __attribute__ ((aligned (n)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FULL_ANIMATION
|
typedef union ALIGN(16) um128i {
|
||||||
#define FULL_ANIMATION 0
|
__m128i m128i;
|
||||||
#endif
|
uint8 m128i_u8[16];
|
||||||
|
uint16 m128i_u16[8];
|
||||||
|
uint32 m128i_u32[4];
|
||||||
|
uint64 m128i_u64[2];
|
||||||
|
} um128i;
|
||||||
|
|
||||||
#include "32bpp_sse_type.h"
|
#define CLEAR_HIGH_BYTE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0)
|
||||||
|
#define ALPHA_CONTROL_MASK _mm_setr_epi8( 6, 7, 6, 7, 6, 7, -1, -1, 14, 15, 14, 15, 14, 15, -1, -1)
|
||||||
|
#define PACK_LOW_CONTROL_MASK _mm_setr_epi8( 0, 2, 4, -1, 8, 10, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1)
|
||||||
|
#define PACK_HIGH_CONTROL_MASK _mm_setr_epi8(-1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 4, -1, 8, 10, 12, -1)
|
||||||
|
#define BRIGHTNESS_LOW_CONTROL_MASK _mm_setr_epi8( 1, 2, 1, 2, 1, 2, 0, 2, 3, 2, 3, 2, 3, 2, 0, 2)
|
||||||
|
#define BRIGHTNESS_DIV_CLEANER _mm_setr_epi8(-1, 1, -1, 1, -1, 1, -1, 0, -1, 1, -1, 1, -1, 1, -1, 0)
|
||||||
|
#define OVERBRIGHT_PRESENCE_MASK _mm_setr_epi8( 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0)
|
||||||
|
#define OVERBRIGHT_VALUE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0)
|
||||||
|
#define OVERBRIGHT_CONTROL_MASK _mm_setr_epi8( 0, 1, 0, 1, 0, 1, 7, 7, 2, 3, 2, 3, 2, 3, 7, 7)
|
||||||
|
#define TRANSPARENT_NOM_BASE _mm_setr_epi16(256, 256, 256, 256, 256, 256, 256, 256)
|
||||||
|
|
||||||
|
#define EXTR32(from, rank) (*(um128i*) &from).m128i_u32[rank]
|
||||||
|
#define EXTR64(from, rank) (*(um128i*) &from).m128i_u64[rank]
|
||||||
|
#define INSR32(val, into, rank) { \
|
||||||
|
(*(um128i*) &into).m128i = _mm_insert_epi16((*(um128i*) &into).m128i, val, (rank)*2); \
|
||||||
|
(*(um128i*) &into).m128i = _mm_insert_epi16((*(um128i*) &into).m128i, (val) >> 16, (rank)*2 + 1); \
|
||||||
|
}
|
||||||
|
#define INSR64(val, into, rank) (*(um128i*) &into).m128i_u64[rank] = (val)
|
||||||
|
|
||||||
|
/* Alpha blend 2 pixels. */
|
||||||
|
#define ALPHA_BLEND_2() { \
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128()); /* PUNPCKLBW, expand each uint8 into uint16 */ \
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128()); \
|
||||||
|
\
|
||||||
|
__m128i alphaAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); /* PCMPGTW, if (alpha > 0) a++; */ \
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 15); \
|
||||||
|
alphaAB = _mm_add_epi16(alphaAB, srcAB); \
|
||||||
|
alphaAB = _mm_shufflelo_epi16(alphaAB, 0x3F); /* PSHUFLW, put alpha1 in front of each rgb1 */ \
|
||||||
|
alphaAB = _mm_shufflehi_epi16(alphaAB, 0x3F); /* PSHUFHW, put alpha2 in front of each rgb2 */ \
|
||||||
|
\
|
||||||
|
srcAB = _mm_sub_epi16(srcAB, dstAB); /* PSUBW, (r - Cr) */ \
|
||||||
|
srcAB = _mm_mullo_epi16(srcAB, alphaAB); /* PMULLW, a*(r - Cr) */ \
|
||||||
|
srcAB = _mm_srli_epi16(srcAB, 8); /* PSRLW, a*(r - Cr)/256 */ \
|
||||||
|
srcAB = _mm_add_epi16(srcAB, dstAB); /* PADDW, a*(r - Cr)/256 + Cr */ \
|
||||||
|
srcAB = _mm_and_si128(srcAB, clear_hi); /* PAND, wipe high bytes to keep low bytes when packing */ \
|
||||||
|
srcABCD = _mm_packus_epi16(srcAB, srcAB); /* PACKUSWB, pack 2 colours (with saturation) */ \
|
||||||
|
}
|
||||||
|
|
||||||
/** Base methods for 32bpp SSE blitters. */
|
/** Base methods for 32bpp SSE blitters. */
|
||||||
class Blitter_32bppSSE_Base {
|
class Blitter_32bppSSE_Base {
|
||||||
@@ -49,18 +98,6 @@ public:
|
|||||||
BT_NONE, ///< No specialisation for either case.
|
BT_NONE, ///< No specialisation for either case.
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Helper for using specialised functions designed to prevent whenever it's possible things like:
|
|
||||||
* - IO (reading video buffer),
|
|
||||||
* - calculations (alpha blending),
|
|
||||||
* - heavy branching (remap lookups and animation buffer handling).
|
|
||||||
*/
|
|
||||||
enum SpriteFlags {
|
|
||||||
SF_NONE = 0,
|
|
||||||
SF_TRANSLUCENT = 1 << 1, ///< The sprite has at least 1 translucent pixel.
|
|
||||||
SF_NO_REMAP = 1 << 2, ///< The sprite has no remappable colour pixel.
|
|
||||||
SF_NO_ANIM = 1 << 3, ///< The sprite has no palette animated pixel.
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Data stored about a (single) sprite. */
|
/** Data stored about a (single) sprite. */
|
||||||
struct SpriteInfo {
|
struct SpriteInfo {
|
||||||
uint32 sprite_offset; ///< The offset to the sprite data.
|
uint32 sprite_offset; ///< The offset to the sprite data.
|
||||||
@@ -69,21 +106,21 @@ public:
|
|||||||
uint16 sprite_width; ///< The width of the sprite.
|
uint16 sprite_width; ///< The width of the sprite.
|
||||||
};
|
};
|
||||||
struct SpriteData {
|
struct SpriteData {
|
||||||
SpriteFlags flags;
|
|
||||||
SpriteInfo infos[ZOOM_LVL_COUNT];
|
SpriteInfo infos[ZOOM_LVL_COUNT];
|
||||||
byte data[]; ///< Data, all zoomlevels.
|
byte data[]; ///< Data, all zoomlevels.
|
||||||
};
|
};
|
||||||
|
|
||||||
Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator);
|
Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator);
|
||||||
|
virtual Colour AdjustBrightness(Colour colour, uint8 brightness) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_ENUM_AS_BIT_SET(Blitter_32bppSSE_Base::SpriteFlags);
|
|
||||||
|
|
||||||
/** The SSE2 32 bpp blitter (without palette animation). */
|
/** The SSE2 32 bpp blitter (without palette animation). */
|
||||||
class Blitter_32bppSSE2 : public Blitter_32bppSimple, public Blitter_32bppSSE_Base {
|
class Blitter_32bppSSE2 : public Blitter_32bppSimple, public Blitter_32bppSSE_Base {
|
||||||
public:
|
public:
|
||||||
|
virtual Colour AdjustBrightness(Colour colour, uint8 brightness);
|
||||||
|
static Colour ReallyAdjustBrightness(Colour colour, uint8 brightness);
|
||||||
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
||||||
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last, bool translucent>
|
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last>
|
||||||
void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
||||||
|
|
||||||
/* virtual */ Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) {
|
/* virtual */ Sprite *Encode(const SpriteLoader::Sprite *sprite, AllocatorProc *allocator) {
|
||||||
|
@@ -15,9 +15,310 @@
|
|||||||
#include "../zoom_func.h"
|
#include "../zoom_func.h"
|
||||||
#include "../settings_type.h"
|
#include "../settings_type.h"
|
||||||
#include "32bpp_sse4.hpp"
|
#include "32bpp_sse4.hpp"
|
||||||
#include "32bpp_sse_func.hpp"
|
|
||||||
|
|
||||||
/** Instantiation of the SSE4 32bpp blitter factory. */
|
/** Instantiation of the SSE4 32bpp blitter factory. */
|
||||||
static FBlitter_32bppSSE4 iFBlitter_32bppSSE4;
|
static FBlitter_32bppSSE4 iFBlitter_32bppSSE4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws a sprite to a (screen) buffer. It is templated to allow faster operation.
|
||||||
|
*
|
||||||
|
* @tparam mode blitter mode
|
||||||
|
* @param bp further blitting parameters
|
||||||
|
* @param zoom zoom level at which we are drawing
|
||||||
|
*/
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_START
|
||||||
|
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last>
|
||||||
|
inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
||||||
|
{
|
||||||
|
const byte * const remap = bp->remap;
|
||||||
|
Colour *dst_line = (Colour *) bp->dst + bp->top * bp->pitch + bp->left;
|
||||||
|
int effective_width = bp->width;
|
||||||
|
|
||||||
|
/* Find where to start reading in the source sprite. */
|
||||||
|
const SpriteData * const sd = (const SpriteData *) bp->sprite;
|
||||||
|
const SpriteInfo * const si = &sd->infos[zoom];
|
||||||
|
const MapValue *src_mv_line = (const MapValue *) &sd->data[si->mv_offset] + bp->skip_top * si->sprite_width;
|
||||||
|
const Colour *src_rgba_line = (const Colour *) ((const byte *) &sd->data[si->sprite_offset] + bp->skip_top * si->sprite_line_size);
|
||||||
|
|
||||||
|
if (read_mode != RM_WITH_MARGIN) {
|
||||||
|
src_rgba_line += bp->skip_left;
|
||||||
|
src_mv_line += bp->skip_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load these variables into register before loop. */
|
||||||
|
const __m128i a_cm = ALPHA_CONTROL_MASK;
|
||||||
|
const __m128i pack_low_cm = PACK_LOW_CONTROL_MASK;
|
||||||
|
const __m128i briAB_cm = BRIGHTNESS_LOW_CONTROL_MASK;
|
||||||
|
const __m128i div_cleaner = BRIGHTNESS_DIV_CLEANER;
|
||||||
|
const __m128i ob_check = OVERBRIGHT_PRESENCE_MASK;
|
||||||
|
const __m128i ob_mask = OVERBRIGHT_VALUE_MASK;
|
||||||
|
const __m128i ob_cm = OVERBRIGHT_CONTROL_MASK;
|
||||||
|
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
|
||||||
|
|
||||||
|
for (int y = bp->height; y != 0; y--) {
|
||||||
|
const Colour *src = src_rgba_line + META_LENGTH;
|
||||||
|
Colour *dst = dst_line;
|
||||||
|
const MapValue *src_mv = src_mv_line;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
default: {
|
||||||
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
|
src += src_rgba_line[0].data;
|
||||||
|
dst += src_rgba_line[0].data;
|
||||||
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
|
const int new_width = effective_width - (delta_diff & ~1);
|
||||||
|
effective_width = delta_diff > 0 ? new_width : effective_width;
|
||||||
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case RM_WITH_SKIP: {
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
for (uint x = (uint) effective_width / 2; x > 0; x--) {
|
||||||
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
|
srcABCD = _mm_blend_epi16(srcABCD, dstABCD, 0xF0);
|
||||||
|
Colour *old_dst = dst;
|
||||||
|
src += 2;
|
||||||
|
dst += 2;
|
||||||
|
/* It is VERY important to read next data before it gets invalidated in cpu cache.
|
||||||
|
* And PEXTR latency is a real problem here.
|
||||||
|
*/
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, srcABCD);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
}
|
||||||
|
if (bt_last == BT_ODD) {
|
||||||
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
|
*dst = (Colour) EXTR32(srcABCD, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BM_COLOUR_REMAP: {
|
||||||
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
|
src += src_rgba_line[0].data;
|
||||||
|
src_mv += src_rgba_line[0].data;
|
||||||
|
dst += src_rgba_line[0].data;
|
||||||
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
|
const int nd = effective_width - delta_diff;
|
||||||
|
effective_width = delta_diff > 0 ? nd : effective_width;
|
||||||
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case RM_WITH_SKIP: {
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
uint32 mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
|
|
||||||
|
for (uint x = (uint) effective_width / 2; x > 0; x--) {
|
||||||
|
/* Remap colours. */
|
||||||
|
if (mvX2 & 0x00FF00FF) {
|
||||||
|
/* Written so the compiler uses CMOV. */
|
||||||
|
const Colour src0 = src[0];
|
||||||
|
const uint m0 = (byte) mvX2;
|
||||||
|
const uint r0 = remap[m0];
|
||||||
|
const Colour c0map = (this->LookupColourInPalette(r0).data & 0x00FFFFFF) | (src0.data & 0xFF000000);
|
||||||
|
Colour c0 = 0; // Use alpha of 0 to keep dst as is.
|
||||||
|
c0 = r0 == 0 ? c0 : c0map;
|
||||||
|
c0 = m0 != 0 ? c0 : src0;
|
||||||
|
INSR32(c0.data, srcABCD, 0);
|
||||||
|
|
||||||
|
const Colour src1 = src[1];
|
||||||
|
const uint m1 = (byte) (mvX2 >> 16);
|
||||||
|
const uint r1 = remap[m1];
|
||||||
|
const Colour c1map = (this->LookupColourInPalette(r1).data & 0x00FFFFFF) | (src1.data & 0xFF000000);
|
||||||
|
Colour c1 = 0;
|
||||||
|
c1 = r1 == 0 ? c1 : c1map;
|
||||||
|
c1 = m1 != 0 ? c1 : src1;
|
||||||
|
INSR32(c1.data, srcABCD, 1);
|
||||||
|
|
||||||
|
if ((mvX2 & 0xFF00FF00) != 0x80008000) {
|
||||||
|
ADJUST_BRIGHTNESS_2(srcABCD, mvX2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blend colours. */
|
||||||
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
|
srcABCD = _mm_blend_epi16(srcABCD, dstABCD, 0xF0);
|
||||||
|
Colour *old_dst = dst;
|
||||||
|
dst += 2;
|
||||||
|
src += 2;
|
||||||
|
src_mv += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, srcABCD);
|
||||||
|
mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (effective_width & 1) {
|
||||||
|
/* In case the m-channel is zero, do not remap this pixel in any way. */
|
||||||
|
if ((byte) mvX2 == 0) {
|
||||||
|
if (src->a < 255) {
|
||||||
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
|
(*dst).data = EXTR32(srcABCD, 0);
|
||||||
|
} else
|
||||||
|
*dst = *src;
|
||||||
|
} else {
|
||||||
|
const uint r = remap[(byte) mvX2];
|
||||||
|
if (r != 0) {
|
||||||
|
Colour remapped_colour = AdjustBrightness(this->LookupColourInPalette(r), (byte) (mvX2 >> 8));
|
||||||
|
if (src->a == 255) {
|
||||||
|
*dst = remapped_colour;
|
||||||
|
} else {
|
||||||
|
remapped_colour.a = src->a;
|
||||||
|
INSR32(remapped_colour.data, srcABCD, 0);
|
||||||
|
ALPHA_BLEND_2(pack_low_cm);
|
||||||
|
(*dst).data = EXTR32(srcABCD, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
src_mv_line += si->sprite_width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case BM_TRANSPARENT: {
|
||||||
|
/* Make the current colour a bit more black, so it looks like this image is transparent.
|
||||||
|
* rgb = rgb * ((256/4) * 4 - (alpha/4)) / ((256/4) * 4)
|
||||||
|
*/
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
for (uint x = (uint) bp->width / 2; x > 0; x--) {
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstCD = _mm_unpackhi_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i alphaAB = _mm_shuffle_epi8(srcAB, a_cm);
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 2); // Reduce to 64 levels of shades so the max value fits in 16 bits.
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstCD);
|
||||||
|
Colour *old_dst = dst;
|
||||||
|
src += 2;
|
||||||
|
dst += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, dstAB);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
}
|
||||||
|
if (bp->width & 1) {
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i alphaAB = _mm_shuffle_epi8(srcAB, a_cm);
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 2);
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstAB);
|
||||||
|
(*dst).data = EXTR32(dstAB, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
|
||||||
|
dst_line += bp->pitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_STOP
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws a sprite to a (screen) buffer. Calls adequate templated function.
|
||||||
|
*
|
||||||
|
* @param bp further blitting parameters
|
||||||
|
* @param mode blitter mode
|
||||||
|
* @param zoom zoom level at which we are drawing
|
||||||
|
*/
|
||||||
|
void Blitter_32bppSSE4::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
||||||
|
{
|
||||||
|
const BlockType bt_last = (BlockType) (bp->width & 1);
|
||||||
|
switch (mode) {
|
||||||
|
case BM_NORMAL: {
|
||||||
|
if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) {
|
||||||
|
switch (bt_last) {
|
||||||
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN>(bp, zoom); return;
|
||||||
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (bt_last) {
|
||||||
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_EVEN>(bp, zoom); return;
|
||||||
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_ODD>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BM_COLOUR_REMAP:
|
||||||
|
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
|
||||||
|
Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE>(bp, zoom); return;
|
||||||
|
} else {
|
||||||
|
Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE>(bp, zoom); return;
|
||||||
|
}
|
||||||
|
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Same code as seen in 32bpp_sse2.cpp but some macros are not the same. */
|
||||||
|
inline Colour Blitter_32bppSSE4::AdjustBrightness(Colour colour, uint8 brightness)
|
||||||
|
{
|
||||||
|
/* Shortcut for normal brightness. */
|
||||||
|
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||||
|
|
||||||
|
return Blitter_32bppSSE4::ReallyAdjustBrightness(colour, brightness);
|
||||||
|
}
|
||||||
|
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_START
|
||||||
|
/* static */ Colour Blitter_32bppSSE4::ReallyAdjustBrightness(Colour colour, uint8 brightness)
|
||||||
|
{
|
||||||
|
ALIGN(16) uint64 c16 = colour.b | (uint64) colour.g << 16 | (uint64) colour.r << 32;
|
||||||
|
c16 *= brightness;
|
||||||
|
uint64 c16_ob = c16; // Helps out of order execution.
|
||||||
|
c16 /= DEFAULT_BRIGHTNESS;
|
||||||
|
c16 &= 0x01FF01FF01FF;
|
||||||
|
|
||||||
|
/* Sum overbright (maximum for each rgb is 508, 9 bits, -255 is changed in -256 so we just have to take the 8 lower bits into account). */
|
||||||
|
c16_ob = (((c16_ob >> (8 + 7)) & 0x0100010001) * 0xFF) & c16;
|
||||||
|
uint64 ob = (uint16) c16_ob + (uint16) (c16_ob >> 16) + (uint16) (c16_ob >> 32);
|
||||||
|
|
||||||
|
const uint32 alpha32 = colour.data & 0xFF000000;
|
||||||
|
__m128i ret;
|
||||||
|
INSR64(c16, ret, 0);
|
||||||
|
if (ob != 0) {
|
||||||
|
/* Reduce overbright strength. */
|
||||||
|
ob /= 2;
|
||||||
|
__m128i ob128;
|
||||||
|
INSR64(ob | ob << 16 | ob << 32, ob128, 0);
|
||||||
|
__m128i white = OVERBRIGHT_VALUE_MASK;
|
||||||
|
__m128i c128 = ret;
|
||||||
|
ret = _mm_subs_epu16(white, c128); /* PSUBUSW, (255 - rgb) */
|
||||||
|
ret = _mm_mullo_epi16(ret, ob128); /* PMULLW, ob*(255 - rgb) */
|
||||||
|
ret = _mm_srli_epi16(ret, 8); /* PSRLW, ob*(255 - rgb)/256 */
|
||||||
|
ret = _mm_add_epi16(ret, c128); /* PADDW, ob*(255 - rgb)/256 + rgb */
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = _mm_packus_epi16(ret, ret); /* PACKUSWB, saturate and pack. */
|
||||||
|
return alpha32 | EXTR32(ret, 0);
|
||||||
|
}
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_STOP
|
||||||
|
|
||||||
#endif /* WITH_SSE */
|
#endif /* WITH_SSE */
|
||||||
|
@@ -14,21 +14,38 @@
|
|||||||
|
|
||||||
#ifdef WITH_SSE
|
#ifdef WITH_SSE
|
||||||
|
|
||||||
#ifndef SSE_VERSION
|
|
||||||
#define SSE_VERSION 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FULL_ANIMATION
|
|
||||||
#define FULL_ANIMATION 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "32bpp_ssse3.hpp"
|
#include "32bpp_ssse3.hpp"
|
||||||
|
#include "smmintrin.h"
|
||||||
|
|
||||||
|
#undef EXTR32
|
||||||
|
#define EXTR32(from, rank) _mm_extract_epi32((*(um128i*) &from).m128i, rank)
|
||||||
|
#undef INSR32
|
||||||
|
#define INSR32(val, into, rank) (*(um128i*) &into).m128i = _mm_insert_epi32((*(um128i*) &into).m128i, val, rank)
|
||||||
|
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_START
|
||||||
|
#ifdef _SQ64
|
||||||
|
#undef INSR64
|
||||||
|
#define INSR64(val, into, rank) (*(um128i*) &into).m128i = _mm_insert_epi64((*(um128i*) &into).m128i, val, rank)
|
||||||
|
#else
|
||||||
|
typedef union { uint64 u64; struct _u32 { uint32 low, high; } u32; } u6432;
|
||||||
|
#undef INSR64
|
||||||
|
#define INSR64(val, into, rank) { \
|
||||||
|
u6432 v; \
|
||||||
|
v.u64 = val; \
|
||||||
|
(*(um128i*) &into).m128i = _mm_insert_epi32((*(um128i*) &into).m128i, v.u32.low, (rank)*2); \
|
||||||
|
(*(um128i*) &into).m128i = _mm_insert_epi32((*(um128i*) &into).m128i, v.u32.high, (rank)*2 + 1); \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
IGNORE_UNINITIALIZED_WARNING_STOP
|
||||||
|
|
||||||
/** The SSE4 32 bpp blitter (without palette animation). */
|
/** The SSE4 32 bpp blitter (without palette animation). */
|
||||||
class Blitter_32bppSSE4 : public Blitter_32bppSSSE3 {
|
class Blitter_32bppSSE4 : public Blitter_32bppSSSE3 {
|
||||||
public:
|
public:
|
||||||
|
Colour AdjustBrightness(Colour colour, uint8 brightness);
|
||||||
|
static Colour ReallyAdjustBrightness(Colour colour, uint8 brightness);
|
||||||
|
|
||||||
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
||||||
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last, bool translucent>
|
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last>
|
||||||
void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
||||||
/* virtual */ const char *GetName() { return "32bpp-sse4"; }
|
/* virtual */ const char *GetName() { return "32bpp-sse4"; }
|
||||||
};
|
};
|
||||||
|
@@ -1,455 +0,0 @@
|
|||||||
/* $Id$ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file 32bpp_sse_func.hpp Functions related to SSE 32 bpp blitter. */
|
|
||||||
|
|
||||||
#ifndef BLITTER_32BPP_SSE_FUNC_HPP
|
|
||||||
#define BLITTER_32BPP_SSE_FUNC_HPP
|
|
||||||
|
|
||||||
#ifdef WITH_SSE
|
|
||||||
|
|
||||||
static inline void InsertFirstUint32(const uint32 value, __m128i &into)
|
|
||||||
{
|
|
||||||
#if (SSE_VERSION >= 4)
|
|
||||||
into = _mm_insert_epi32(into, value, 0);
|
|
||||||
#else
|
|
||||||
into = _mm_insert_epi16(into, value, 0);
|
|
||||||
into = _mm_insert_epi16(into, value >> 16, 1);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void InsertSecondUint32(const uint32 value, __m128i &into)
|
|
||||||
{
|
|
||||||
#if (SSE_VERSION >= 4)
|
|
||||||
into = _mm_insert_epi32(into, value, 1);
|
|
||||||
#else
|
|
||||||
into = _mm_insert_epi16(into, value, 2);
|
|
||||||
into = _mm_insert_epi16(into, value >> 16, 3);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void LoadUint64(const uint64 value, __m128i &into)
|
|
||||||
{
|
|
||||||
#ifdef _SQ64
|
|
||||||
into = _mm_cvtsi64_si128(value);
|
|
||||||
#else
|
|
||||||
#if (SSE_VERSION >= 4)
|
|
||||||
into = _mm_cvtsi32_si128(value);
|
|
||||||
InsertSecondUint32(value >> 32, into);
|
|
||||||
#else
|
|
||||||
(*(um128i*) &into).m128i_u64[0] = value;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __m128i PackUnsaturated(__m128i from, const __m128i &mask)
|
|
||||||
{
|
|
||||||
#if (SSE_VERSION == 2)
|
|
||||||
from = _mm_and_si128(from, mask); // PAND, wipe high bytes to keep low bytes when packing
|
|
||||||
return _mm_packus_epi16(from, from); // PACKUSWB, pack 2 colours (with saturation)
|
|
||||||
#else
|
|
||||||
return _mm_shuffle_epi8(from, mask);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __m128i DistributeAlpha(const __m128i from, const __m128i &mask)
|
|
||||||
{
|
|
||||||
#if (SSE_VERSION == 2)
|
|
||||||
__m128i alphaAB = _mm_shufflelo_epi16(from, 0x3F); // PSHUFLW, put alpha1 in front of each rgb1
|
|
||||||
return _mm_shufflehi_epi16(alphaAB, 0x3F); // PSHUFHW, put alpha2 in front of each rgb2
|
|
||||||
#else
|
|
||||||
return _mm_shuffle_epi8(from, mask);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __m128i AlphaBlendTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &pack_mask)
|
|
||||||
{
|
|
||||||
__m128i srcAB = _mm_unpacklo_epi8(src, _mm_setzero_si128()); // PUNPCKLBW, expand each uint8 into uint16
|
|
||||||
__m128i dstAB = _mm_unpacklo_epi8(dst, _mm_setzero_si128());
|
|
||||||
|
|
||||||
__m128i alphaAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); // PCMPGTW, if (alpha > 0) a++;
|
|
||||||
alphaAB = _mm_srli_epi16(alphaAB, 15);
|
|
||||||
alphaAB = _mm_add_epi16(alphaAB, srcAB);
|
|
||||||
alphaAB = DistributeAlpha(alphaAB, distribution_mask);
|
|
||||||
|
|
||||||
srcAB = _mm_sub_epi16(srcAB, dstAB); // PSUBW, (r - Cr)
|
|
||||||
srcAB = _mm_mullo_epi16(srcAB, alphaAB); // PMULLW, a*(r - Cr)
|
|
||||||
srcAB = _mm_srli_epi16(srcAB, 8); // PSRLW, a*(r - Cr)/256
|
|
||||||
srcAB = _mm_add_epi16(srcAB, dstAB); // PADDW, a*(r - Cr)/256 + Cr
|
|
||||||
return PackUnsaturated(srcAB, pack_mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Darken 2 pixels.
|
|
||||||
* rgb = rgb * ((256/4) * 4 - (alpha/4)) / ((256/4) * 4)
|
|
||||||
*/
|
|
||||||
static inline __m128i DarkenTwoPixels(__m128i src, __m128i dst, const __m128i &distribution_mask, const __m128i &tr_nom_base)
|
|
||||||
{
|
|
||||||
__m128i srcAB = _mm_unpacklo_epi8(src, _mm_setzero_si128());
|
|
||||||
__m128i dstAB = _mm_unpacklo_epi8(dst, _mm_setzero_si128());
|
|
||||||
__m128i alphaAB = DistributeAlpha(srcAB, distribution_mask);
|
|
||||||
alphaAB = _mm_srli_epi16(alphaAB, 2); // Reduce to 64 levels of shades so the max value fits in 16 bits.
|
|
||||||
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
|
||||||
dstAB = _mm_mullo_epi16(dstAB, nom);
|
|
||||||
dstAB = _mm_srli_epi16(dstAB, 8);
|
|
||||||
return _mm_packus_epi16(dstAB, dstAB);
|
|
||||||
}
|
|
||||||
|
|
||||||
IGNORE_UNINITIALIZED_WARNING_START
|
|
||||||
static Colour ReallyAdjustBrightness(Colour colour, uint8 brightness)
|
|
||||||
{
|
|
||||||
uint64 c16 = colour.b | (uint64) colour.g << 16 | (uint64) colour.r << 32;
|
|
||||||
c16 *= brightness;
|
|
||||||
uint64 c16_ob = c16; // Helps out of order execution.
|
|
||||||
c16 /= Blitter_32bppBase::DEFAULT_BRIGHTNESS;
|
|
||||||
c16 &= 0x01FF01FF01FFULL;
|
|
||||||
|
|
||||||
/* Sum overbright (maximum for each rgb is 508, 9 bits, -255 is changed in -256 so we just have to take the 8 lower bits into account). */
|
|
||||||
c16_ob = (((c16_ob >> (8 + 7)) & 0x0100010001ULL) * 0xFF) & c16;
|
|
||||||
const uint ob = ((uint16) c16_ob + (uint16) (c16_ob >> 16) + (uint16) (c16_ob >> 32)) / 2;
|
|
||||||
|
|
||||||
const uint32 alpha32 = colour.data & 0xFF000000;
|
|
||||||
__m128i ret;
|
|
||||||
LoadUint64(c16, ret);
|
|
||||||
if (ob != 0) {
|
|
||||||
__m128i ob128 = _mm_cvtsi32_si128(ob);
|
|
||||||
ob128 = _mm_shufflelo_epi16(ob128, 0xC0);
|
|
||||||
__m128i white = OVERBRIGHT_VALUE_MASK;
|
|
||||||
__m128i c128 = ret;
|
|
||||||
ret = _mm_subs_epu16(white, c128); // PSUBUSW, (255 - rgb)
|
|
||||||
ret = _mm_mullo_epi16(ret, ob128); // PMULLW, ob*(255 - rgb)
|
|
||||||
ret = _mm_srli_epi16(ret, 8); // PSRLW, ob*(255 - rgb)/256
|
|
||||||
ret = _mm_add_epi16(ret, c128); // PADDW, ob*(255 - rgb)/256 + rgb
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = _mm_packus_epi16(ret, ret); // PACKUSWB, saturate and pack.
|
|
||||||
return alpha32 | _mm_cvtsi128_si32(ret);
|
|
||||||
}
|
|
||||||
IGNORE_UNINITIALIZED_WARNING_STOP
|
|
||||||
|
|
||||||
/** ReallyAdjustBrightness() is not called that often.
|
|
||||||
* Inlining this function implies a far jump, which has a huge latency.
|
|
||||||
*/
|
|
||||||
static inline Colour AdjustBrightneSSE(Colour colour, uint8 brightness)
|
|
||||||
{
|
|
||||||
/* Shortcut for normal brightness. */
|
|
||||||
if (brightness == Blitter_32bppBase::DEFAULT_BRIGHTNESS) return colour;
|
|
||||||
|
|
||||||
return ReallyAdjustBrightness(colour, brightness);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __m128i AdjustBrightnessOfTwoPixels(__m128i from, uint32 brightness)
|
|
||||||
{
|
|
||||||
#if (SSE_VERSION < 3)
|
|
||||||
NOT_REACHED();
|
|
||||||
#else
|
|
||||||
/* The following dataflow differs from the one of AdjustBrightness() only for alpha.
|
|
||||||
* In order to keep alpha in colAB, insert a 1 in a unused brightness byte (a*1->a).
|
|
||||||
* OK, not a 1 but DEFAULT_BRIGHTNESS to compensate the div.
|
|
||||||
*/
|
|
||||||
brightness &= 0xFF00FF00;
|
|
||||||
brightness += Blitter_32bppBase::DEFAULT_BRIGHTNESS;
|
|
||||||
|
|
||||||
__m128i colAB = _mm_unpacklo_epi8(from, _mm_setzero_si128());
|
|
||||||
__m128i briAB = _mm_cvtsi32_si128(brightness);
|
|
||||||
briAB = _mm_shuffle_epi8(briAB, BRIGHTNESS_LOW_CONTROL_MASK); // DEFAULT_BRIGHTNESS in 0, 0x00 in 2.
|
|
||||||
colAB = _mm_mullo_epi16(colAB, briAB);
|
|
||||||
__m128i colAB_ob = _mm_srli_epi16(colAB, 8+7);
|
|
||||||
colAB = _mm_srli_epi16(colAB, 7);
|
|
||||||
|
|
||||||
/* Sum overbright.
|
|
||||||
* Maximum for each rgb is 508 => 9 bits. The highest bit tells if there is overbright.
|
|
||||||
* -255 is changed in -256 so we just have to take the 8 lower bits into account.
|
|
||||||
*/
|
|
||||||
colAB = _mm_and_si128(colAB, BRIGHTNESS_DIV_CLEANER);
|
|
||||||
colAB_ob = _mm_and_si128(colAB_ob, OVERBRIGHT_PRESENCE_MASK);
|
|
||||||
colAB_ob = _mm_mullo_epi16(colAB_ob, OVERBRIGHT_VALUE_MASK);
|
|
||||||
colAB_ob = _mm_and_si128(colAB_ob, colAB);
|
|
||||||
__m128i obAB = _mm_hadd_epi16(_mm_hadd_epi16(colAB_ob, _mm_setzero_si128()), _mm_setzero_si128());
|
|
||||||
|
|
||||||
obAB = _mm_srli_epi16(obAB, 1); // Reduce overbright strength.
|
|
||||||
obAB = _mm_shuffle_epi8(obAB, OVERBRIGHT_CONTROL_MASK);
|
|
||||||
__m128i retAB = OVERBRIGHT_VALUE_MASK; // ob_mask is equal to white.
|
|
||||||
retAB = _mm_subs_epu16(retAB, colAB); // (255 - rgb)
|
|
||||||
retAB = _mm_mullo_epi16(retAB, obAB); // ob*(255 - rgb)
|
|
||||||
retAB = _mm_srli_epi16(retAB, 8); // ob*(255 - rgb)/256
|
|
||||||
retAB = _mm_add_epi16(retAB, colAB); // ob*(255 - rgb)/256 + rgb
|
|
||||||
|
|
||||||
return _mm_packus_epi16(retAB, retAB);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if FULL_ANIMATION == 0
|
|
||||||
/**
|
|
||||||
* Draws a sprite to a (screen) buffer. It is templated to allow faster operation.
|
|
||||||
*
|
|
||||||
* @tparam mode blitter mode
|
|
||||||
* @param bp further blitting parameters
|
|
||||||
* @param zoom zoom level at which we are drawing
|
|
||||||
*/
|
|
||||||
IGNORE_UNINITIALIZED_WARNING_START
|
|
||||||
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last, bool translucent>
|
|
||||||
#if (SSE_VERSION == 2)
|
|
||||||
inline void Blitter_32bppSSE2::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
|
||||||
#elif (SSE_VERSION == 3)
|
|
||||||
inline void Blitter_32bppSSSE3::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
|
||||||
#elif (SSE_VERSION == 4)
|
|
||||||
inline void Blitter_32bppSSE4::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
const byte * const remap = bp->remap;
|
|
||||||
Colour *dst_line = (Colour *) bp->dst + bp->top * bp->pitch + bp->left;
|
|
||||||
int effective_width = bp->width;
|
|
||||||
|
|
||||||
/* Find where to start reading in the source sprite. */
|
|
||||||
const SpriteData * const sd = (const SpriteData *) bp->sprite;
|
|
||||||
const SpriteInfo * const si = &sd->infos[zoom];
|
|
||||||
const MapValue *src_mv_line = (const MapValue *) &sd->data[si->mv_offset] + bp->skip_top * si->sprite_width;
|
|
||||||
const Colour *src_rgba_line = (const Colour *) ((const byte *) &sd->data[si->sprite_offset] + bp->skip_top * si->sprite_line_size);
|
|
||||||
|
|
||||||
if (read_mode != RM_WITH_MARGIN) {
|
|
||||||
src_rgba_line += bp->skip_left;
|
|
||||||
src_mv_line += bp->skip_left;
|
|
||||||
}
|
|
||||||
const MapValue *src_mv = src_mv_line;
|
|
||||||
|
|
||||||
/* Load these variables into register before loop. */
|
|
||||||
#if (SSE_VERSION == 2)
|
|
||||||
const __m128i clear_hi = CLEAR_HIGH_BYTE_MASK;
|
|
||||||
#define ALPHA_BLEND_PARAM_1 clear_hi
|
|
||||||
#define ALPHA_BLEND_PARAM_2 clear_hi
|
|
||||||
#define DARKEN_PARAM_1 tr_nom_base
|
|
||||||
#define DARKEN_PARAM_2 tr_nom_base
|
|
||||||
#else
|
|
||||||
const __m128i a_cm = ALPHA_CONTROL_MASK;
|
|
||||||
const __m128i pack_low_cm = PACK_LOW_CONTROL_MASK;
|
|
||||||
#define ALPHA_BLEND_PARAM_1 a_cm
|
|
||||||
#define ALPHA_BLEND_PARAM_2 pack_low_cm
|
|
||||||
#define DARKEN_PARAM_1 a_cm
|
|
||||||
#define DARKEN_PARAM_2 tr_nom_base
|
|
||||||
#endif
|
|
||||||
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
|
|
||||||
|
|
||||||
for (int y = bp->height; y != 0; y--) {
|
|
||||||
Colour *dst = dst_line;
|
|
||||||
const Colour *src = src_rgba_line + META_LENGTH;
|
|
||||||
if (mode == BM_COLOUR_REMAP || mode == BM_CRASH_REMAP) src_mv = src_mv_line;
|
|
||||||
|
|
||||||
if (read_mode == RM_WITH_MARGIN) {
|
|
||||||
assert(bt_last == BT_NONE); // or you must ensure block type is preserved
|
|
||||||
src += src_rgba_line[0].data;
|
|
||||||
dst += src_rgba_line[0].data;
|
|
||||||
if (mode == BM_COLOUR_REMAP || mode == BM_CRASH_REMAP) src_mv += src_rgba_line[0].data;
|
|
||||||
const int width_diff = si->sprite_width - bp->width;
|
|
||||||
effective_width = bp->width - (int) src_rgba_line[0].data;
|
|
||||||
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
|
||||||
const int new_width = effective_width - delta_diff;
|
|
||||||
effective_width = delta_diff > 0 ? new_width : effective_width;
|
|
||||||
if (effective_width <= 0) goto next_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (mode) {
|
|
||||||
default:
|
|
||||||
if (!translucent) {
|
|
||||||
for (uint x = (uint) effective_width; x > 0; x--) {
|
|
||||||
if (src->a) *dst = *src;
|
|
||||||
src++;
|
|
||||||
dst++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint x = (uint) effective_width / 2; x > 0; x--) {
|
|
||||||
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
|
|
||||||
__m128i dstABCD = _mm_loadl_epi64((__m128i*) dst);
|
|
||||||
_mm_storel_epi64((__m128i*) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2));
|
|
||||||
src += 2;
|
|
||||||
dst += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((bt_last == BT_NONE && effective_width & 1) || bt_last == BT_ODD) {
|
|
||||||
__m128i srcABCD = _mm_cvtsi32_si128(src->data);
|
|
||||||
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
|
|
||||||
dst->data = _mm_cvtsi128_si32(AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BM_COLOUR_REMAP:
|
|
||||||
#if (SSE_VERSION >= 3)
|
|
||||||
for (uint x = (uint) effective_width / 2; x > 0; x--) {
|
|
||||||
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
|
|
||||||
__m128i dstABCD = _mm_loadl_epi64((__m128i*) dst);
|
|
||||||
uint32 mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
|
||||||
|
|
||||||
/* Remap colours. */
|
|
||||||
if (mvX2 & 0x00FF00FF) {
|
|
||||||
#define CMOV_REMAP(m_colour, m_colour_init, m_src, m_m) \
|
|
||||||
/* Written so the compiler uses CMOV. */ \
|
|
||||||
Colour m_colour = m_colour_init; \
|
|
||||||
{ \
|
|
||||||
const Colour srcm = (Colour) (m_src); \
|
|
||||||
const uint m = (byte) (m_m); \
|
|
||||||
const uint r = remap[m]; \
|
|
||||||
const Colour cmap = (this->LookupColourInPalette(r).data & 0x00FFFFFF) | (srcm.data & 0xFF000000); \
|
|
||||||
m_colour = r == 0 ? m_colour : cmap; \
|
|
||||||
m_colour = m != 0 ? m_colour : srcm; \
|
|
||||||
}
|
|
||||||
#ifdef _SQ64
|
|
||||||
uint64 srcs = _mm_cvtsi128_si64(srcABCD);
|
|
||||||
uint64 remapped_src = 0;
|
|
||||||
CMOV_REMAP(c0, 0, srcs, mvX2);
|
|
||||||
remapped_src = c0.data;
|
|
||||||
CMOV_REMAP(c1, 0, srcs >> 32, mvX2 >> 16);
|
|
||||||
remapped_src |= (uint64) c1.data << 32;
|
|
||||||
srcABCD = _mm_cvtsi64_si128(remapped_src);
|
|
||||||
#else
|
|
||||||
Colour remapped_src[2];
|
|
||||||
CMOV_REMAP(c0, 0, _mm_cvtsi128_si32(srcABCD), mvX2);
|
|
||||||
remapped_src[0] = c0.data;
|
|
||||||
CMOV_REMAP(c1, 0, src[1], mvX2 >> 16);
|
|
||||||
remapped_src[1] = c1.data;
|
|
||||||
srcABCD = _mm_loadl_epi64((__m128i*) &remapped_src);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((mvX2 & 0xFF00FF00) != 0x80008000) srcABCD = AdjustBrightnessOfTwoPixels(srcABCD, mvX2);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Blend colours. */
|
|
||||||
_mm_storel_epi64((__m128i *) dst, AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2));
|
|
||||||
dst += 2;
|
|
||||||
src += 2;
|
|
||||||
src_mv += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((bt_last == BT_NONE && effective_width & 1) || bt_last == BT_ODD) {
|
|
||||||
#else
|
|
||||||
for (uint x = (uint) effective_width; x > 0; x--) {
|
|
||||||
#endif
|
|
||||||
/* In case the m-channel is zero, do not remap this pixel in any way. */
|
|
||||||
__m128i srcABCD;
|
|
||||||
if (src_mv->m) {
|
|
||||||
const uint r = remap[src_mv->m];
|
|
||||||
if (r != 0) {
|
|
||||||
Colour remapped_colour = AdjustBrightneSSE(this->LookupColourInPalette(r), src_mv->v);
|
|
||||||
if (src->a == 255) {
|
|
||||||
*dst = remapped_colour;
|
|
||||||
} else {
|
|
||||||
remapped_colour.a = src->a;
|
|
||||||
srcABCD = _mm_cvtsi32_si128(remapped_colour.data);
|
|
||||||
goto bmcr_alpha_blend_single;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
srcABCD = _mm_cvtsi32_si128(src->data);
|
|
||||||
if (src->a < 255) {
|
|
||||||
bmcr_alpha_blend_single:
|
|
||||||
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
|
|
||||||
srcABCD = AlphaBlendTwoPixels(srcABCD, dstABCD, ALPHA_BLEND_PARAM_1, ALPHA_BLEND_PARAM_2);
|
|
||||||
}
|
|
||||||
dst->data = _mm_cvtsi128_si32(srcABCD);
|
|
||||||
}
|
|
||||||
#if (SSE_VERSION == 2)
|
|
||||||
src_mv++;
|
|
||||||
dst++;
|
|
||||||
src++;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BM_TRANSPARENT:
|
|
||||||
/* Make the current colour a bit more black, so it looks like this image is transparent. */
|
|
||||||
for (uint x = (uint) bp->width / 2; x > 0; x--) {
|
|
||||||
__m128i srcABCD = _mm_loadl_epi64((const __m128i*) src);
|
|
||||||
__m128i dstABCD = _mm_loadl_epi64((__m128i*) dst);
|
|
||||||
_mm_storel_epi64((__m128i *) dst, DarkenTwoPixels(srcABCD, dstABCD, DARKEN_PARAM_1, DARKEN_PARAM_2));
|
|
||||||
src += 2;
|
|
||||||
dst += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((bt_last == BT_NONE && bp->width & 1) || bt_last == BT_ODD) {
|
|
||||||
__m128i srcABCD = _mm_cvtsi32_si128(src->data);
|
|
||||||
__m128i dstABCD = _mm_cvtsi32_si128(dst->data);
|
|
||||||
dst->data = _mm_cvtsi128_si32(DarkenTwoPixels(srcABCD, dstABCD, DARKEN_PARAM_1, DARKEN_PARAM_2));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BM_CRASH_REMAP:
|
|
||||||
for (uint x = (uint) bp->width; x > 0; x--) {
|
|
||||||
if (src_mv->m == 0) {
|
|
||||||
if (src->a != 0) {
|
|
||||||
uint8 g = MakeDark(src->r, src->g, src->b);
|
|
||||||
*dst = ComposeColourRGBA(g, g, g, src->a, *dst);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
uint r = remap[src_mv->m];
|
|
||||||
if (r != 0) *dst = ComposeColourPANoCheck(this->AdjustBrightness(this->LookupColourInPalette(r), src_mv->v), src->a, *dst);
|
|
||||||
}
|
|
||||||
src_mv++;
|
|
||||||
dst++;
|
|
||||||
src++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
next_line:
|
|
||||||
if (mode == BM_COLOUR_REMAP || mode == BM_CRASH_REMAP) src_mv_line += si->sprite_width;
|
|
||||||
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
|
|
||||||
dst_line += bp->pitch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
IGNORE_UNINITIALIZED_WARNING_STOP
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draws a sprite to a (screen) buffer. Calls adequate templated function.
|
|
||||||
*
|
|
||||||
* @param bp further blitting parameters
|
|
||||||
* @param mode blitter mode
|
|
||||||
* @param zoom zoom level at which we are drawing
|
|
||||||
*/
|
|
||||||
#if (SSE_VERSION == 2)
|
|
||||||
void Blitter_32bppSSE2::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
|
||||||
#elif (SSE_VERSION == 3)
|
|
||||||
void Blitter_32bppSSSE3::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
|
||||||
#elif (SSE_VERSION == 4)
|
|
||||||
void Blitter_32bppSSE4::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
switch (mode) {
|
|
||||||
default: {
|
|
||||||
if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) {
|
|
||||||
bm_normal:
|
|
||||||
const BlockType bt_last = (BlockType) (bp->width & 1);
|
|
||||||
switch (bt_last) {
|
|
||||||
default: Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN, true>(bp, zoom); return;
|
|
||||||
case BT_ODD: Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD, true>(bp, zoom); return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & SF_TRANSLUCENT) {
|
|
||||||
Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, true>(bp, zoom);
|
|
||||||
} else {
|
|
||||||
Draw<BM_NORMAL, RM_WITH_MARGIN, BT_NONE, false>(bp, zoom);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case BM_COLOUR_REMAP:
|
|
||||||
if (((const Blitter_32bppSSE_Base::SpriteData *) bp->sprite)->flags & SF_NO_REMAP) goto bm_normal;
|
|
||||||
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
|
|
||||||
Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE, true>(bp, zoom); return;
|
|
||||||
} else {
|
|
||||||
Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE, true>(bp, zoom); return;
|
|
||||||
}
|
|
||||||
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE, true>(bp, zoom); return;
|
|
||||||
case BM_CRASH_REMAP: Draw<BM_CRASH_REMAP, RM_NONE, BT_NONE, true>(bp, zoom); return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* FULL_ANIMATION */
|
|
||||||
|
|
||||||
#endif /* WITH_SSE */
|
|
||||||
#endif /* BLITTER_32BPP_SSE_FUNC_HPP */
|
|
@@ -1,56 +0,0 @@
|
|||||||
/* $Id$ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file 32bpp_sse_type.hpp Types related to SSE 32 bpp blitter. */
|
|
||||||
|
|
||||||
#ifndef BLITTER_32BPP_SSE_TYPE_HPP
|
|
||||||
#define BLITTER_32BPP_SSE_TYPE_HPP
|
|
||||||
|
|
||||||
#ifdef WITH_SSE
|
|
||||||
|
|
||||||
#include "32bpp_simple.hpp"
|
|
||||||
#if (SSE_VERSION == 2)
|
|
||||||
#include <emmintrin.h>
|
|
||||||
#elif (SSE_VERSION == 3)
|
|
||||||
#include <tmmintrin.h>
|
|
||||||
#elif (SSE_VERSION == 4)
|
|
||||||
#include <smmintrin.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define META_LENGTH 2 ///< Number of uint32 inserted before each line of pixels in a sprite.
|
|
||||||
#define MARGIN_NORMAL_THRESHOLD (zoom == ZOOM_LVL_OUT_32X ? 8 : 4) ///< Minimum width to use margins with BM_NORMAL.
|
|
||||||
#define MARGIN_REMAP_THRESHOLD 4 ///< Minimum width to use margins with BM_COLOUR_REMAP.
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#define ALIGN(n) __declspec(align(n))
|
|
||||||
#else
|
|
||||||
#define ALIGN(n) __attribute__ ((aligned (n)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef union ALIGN(16) um128i {
|
|
||||||
__m128i m128i;
|
|
||||||
uint8 m128i_u8[16];
|
|
||||||
uint16 m128i_u16[8];
|
|
||||||
uint32 m128i_u32[4];
|
|
||||||
uint64 m128i_u64[2];
|
|
||||||
} um128i;
|
|
||||||
|
|
||||||
#define CLEAR_HIGH_BYTE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0, -1, 0)
|
|
||||||
#define ALPHA_CONTROL_MASK _mm_setr_epi8( 6, 7, 6, 7, 6, 7, -1, -1, 14, 15, 14, 15, 14, 15, -1, -1)
|
|
||||||
#define PACK_LOW_CONTROL_MASK _mm_setr_epi8( 0, 2, 4, -1, 8, 10, 12, -1, -1, -1, -1, -1, -1, -1, -1, -1)
|
|
||||||
#define PACK_HIGH_CONTROL_MASK _mm_setr_epi8(-1, -1, -1, -1, -1, -1, -1, -1, 0, 2, 4, -1, 8, 10, 12, -1)
|
|
||||||
#define BRIGHTNESS_LOW_CONTROL_MASK _mm_setr_epi8( 1, 2, 1, 2, 1, 2, 0, 2, 3, 2, 3, 2, 3, 2, 0, 2)
|
|
||||||
#define BRIGHTNESS_DIV_CLEANER _mm_setr_epi8(-1, 1, -1, 1, -1, 1, -1, 0, -1, 1, -1, 1, -1, 1, -1, 0)
|
|
||||||
#define OVERBRIGHT_PRESENCE_MASK _mm_setr_epi8( 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0)
|
|
||||||
#define OVERBRIGHT_VALUE_MASK _mm_setr_epi8(-1, 0, -1, 0, -1, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0)
|
|
||||||
#define OVERBRIGHT_CONTROL_MASK _mm_setr_epi8( 0, 1, 0, 1, 0, 1, 7, 7, 2, 3, 2, 3, 2, 3, 7, 7)
|
|
||||||
#define TRANSPARENT_NOM_BASE _mm_setr_epi16(256, 256, 256, 256, 256, 256, 256, 256)
|
|
||||||
|
|
||||||
#endif /* WITH_SSE */
|
|
||||||
#endif /* BLITTER_32BPP_SSE_TYPE_HPP */
|
|
@@ -15,9 +15,273 @@
|
|||||||
#include "../zoom_func.h"
|
#include "../zoom_func.h"
|
||||||
#include "../settings_type.h"
|
#include "../settings_type.h"
|
||||||
#include "32bpp_ssse3.hpp"
|
#include "32bpp_ssse3.hpp"
|
||||||
#include "32bpp_sse_func.hpp"
|
|
||||||
|
|
||||||
/** Instantiation of the SSSE3 32bpp blitter factory. */
|
/** Instantiation of the SSSE3 32bpp blitter factory. */
|
||||||
static FBlitter_32bppSSSE3 iFBlitter_32bppSSSE3;
|
static FBlitter_32bppSSSE3 iFBlitter_32bppSSSE3;
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-variable"
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* Draws a sprite to a (screen) buffer. It is templated to allow faster operation.
|
||||||
|
*
|
||||||
|
* @tparam mode blitter mode
|
||||||
|
* @param bp further blitting parameters
|
||||||
|
* @param zoom zoom level at which we are drawing
|
||||||
|
*/
|
||||||
|
template <BlitterMode mode, Blitter_32bppSSE2::ReadMode read_mode, Blitter_32bppSSE2::BlockType bt_last>
|
||||||
|
inline void Blitter_32bppSSSE3::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
|
||||||
|
{
|
||||||
|
const byte * const remap = bp->remap;
|
||||||
|
Colour *dst_line = (Colour *) bp->dst + bp->top * bp->pitch + bp->left;
|
||||||
|
int effective_width = bp->width;
|
||||||
|
|
||||||
|
/* Find where to start reading in the source sprite */
|
||||||
|
const SpriteData * const sd = (const SpriteData *) bp->sprite;
|
||||||
|
const SpriteInfo * const si = &sd->infos[zoom];
|
||||||
|
const MapValue *src_mv_line = (const MapValue *) &sd->data[si->mv_offset] + bp->skip_top * si->sprite_width;
|
||||||
|
const Colour *src_rgba_line = (const Colour *) ((const byte *) &sd->data[si->sprite_offset] + bp->skip_top * si->sprite_line_size);
|
||||||
|
|
||||||
|
if (read_mode != RM_WITH_MARGIN) {
|
||||||
|
src_rgba_line += bp->skip_left;
|
||||||
|
src_mv_line += bp->skip_left;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Load these variables into register before loop. */
|
||||||
|
const __m128i a_cm = ALPHA_CONTROL_MASK;
|
||||||
|
const __m128i pack_hi_cm = PACK_HIGH_CONTROL_MASK;
|
||||||
|
const __m128i briAB_cm = BRIGHTNESS_LOW_CONTROL_MASK;
|
||||||
|
const __m128i div_cleaner = BRIGHTNESS_DIV_CLEANER;
|
||||||
|
const __m128i ob_check = OVERBRIGHT_PRESENCE_MASK;
|
||||||
|
const __m128i ob_mask = OVERBRIGHT_VALUE_MASK;
|
||||||
|
const __m128i ob_cm = OVERBRIGHT_CONTROL_MASK;
|
||||||
|
const __m128i tr_nom_base = TRANSPARENT_NOM_BASE;
|
||||||
|
|
||||||
|
for (int y = bp->height; y != 0; y--) {
|
||||||
|
Colour *dst = dst_line;
|
||||||
|
const Colour *src = src_rgba_line + META_LENGTH;
|
||||||
|
const MapValue *src_mv = src_mv_line;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
default: {
|
||||||
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
|
src += src_rgba_line[0].data;
|
||||||
|
dst += src_rgba_line[0].data;
|
||||||
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
|
const int new_width = effective_width - (delta_diff & ~1);
|
||||||
|
effective_width = delta_diff > 0 ? new_width : effective_width;
|
||||||
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case RM_WITH_SKIP: {
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
for (uint x = (uint) effective_width / 2; x > 0; x--) {
|
||||||
|
ALPHA_BLEND_2(pack_hi_cm);
|
||||||
|
/* With high repack, srcABCD have its 2 blended pixels like: [S0 S1 S2 S3] -> [-- -- BS0 BS1]
|
||||||
|
* dstABCD shuffled: [D0 D1 D2 D3] -> [D2 D3 D0 D0]
|
||||||
|
* PALIGNR takes what's in (): [-- -- (BS0 BS1] [D2 D3) D0 D0]
|
||||||
|
*/
|
||||||
|
dstABCD = _mm_shuffle_epi32(dstABCD, 0x0E);
|
||||||
|
srcABCD = _mm_alignr_epi8(dstABCD, srcABCD, 8);
|
||||||
|
Colour *old_dst = dst;
|
||||||
|
src += 2;
|
||||||
|
dst += 2;
|
||||||
|
/* It is VERY important to read next data before it gets invalidated in cpu cache. */
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, srcABCD);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
}
|
||||||
|
if (bt_last == BT_ODD) {
|
||||||
|
ALPHA_BLEND_2(pack_hi_cm);
|
||||||
|
(*dst).data = EXTR32(srcABCD, 2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BM_COLOUR_REMAP: {
|
||||||
|
switch (read_mode) {
|
||||||
|
case RM_WITH_MARGIN: {
|
||||||
|
src += src_rgba_line[0].data;
|
||||||
|
src_mv += src_rgba_line[0].data;
|
||||||
|
dst += src_rgba_line[0].data;
|
||||||
|
const int width_diff = si->sprite_width - bp->width;
|
||||||
|
effective_width = bp->width - (int) src_rgba_line[0].data;
|
||||||
|
const int delta_diff = (int) src_rgba_line[1].data - width_diff;
|
||||||
|
const int nd = effective_width - delta_diff;
|
||||||
|
effective_width = delta_diff > 0 ? nd : effective_width;
|
||||||
|
if (effective_width <= 0) break;
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case RM_WITH_SKIP: {
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
uint32 mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
|
|
||||||
|
for (uint x = (uint) effective_width / 2; x > 0; x--) {
|
||||||
|
/* Remap colours. */
|
||||||
|
if (mvX2 & 0x00FF00FF) {
|
||||||
|
/* Written so the compiler uses CMOV. */
|
||||||
|
const Colour src0 = src[0];
|
||||||
|
const uint m0 = (byte) mvX2;
|
||||||
|
const uint r0 = remap[m0];
|
||||||
|
const Colour c0map = (this->LookupColourInPalette(r0).data & 0x00FFFFFF) | (src0.data & 0xFF000000);
|
||||||
|
Colour c0 = 0; // Use alpha of 0 to keep dst as is.
|
||||||
|
c0 = r0 == 0 ? c0 : c0map;
|
||||||
|
c0 = m0 != 0 ? c0 : src0;
|
||||||
|
INSR32(c0.data, srcABCD, 0);
|
||||||
|
|
||||||
|
const Colour src1 = src[1];
|
||||||
|
const uint m1 = (byte) (mvX2 >> 16);
|
||||||
|
const uint r1 = remap[m1];
|
||||||
|
const Colour c1map = (this->LookupColourInPalette(r1).data & 0x00FFFFFF) | (src1.data & 0xFF000000);
|
||||||
|
Colour c1 = 0;
|
||||||
|
c1 = r1 == 0 ? c1 : c1map;
|
||||||
|
c1 = m1 != 0 ? c1 : src1;
|
||||||
|
INSR32(c1.data, srcABCD, 1);
|
||||||
|
|
||||||
|
if ((mvX2 & 0xFF00FF00) != 0x80008000) {
|
||||||
|
ADJUST_BRIGHTNESS_2(srcABCD, mvX2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blend colours. */
|
||||||
|
ALPHA_BLEND_2(pack_hi_cm);
|
||||||
|
dstABCD = _mm_shuffle_epi32(dstABCD, 0x0E);
|
||||||
|
srcABCD = _mm_alignr_epi8(dstABCD, srcABCD, 8);
|
||||||
|
Colour *old_dst = dst;
|
||||||
|
dst += 2;
|
||||||
|
src += 2;
|
||||||
|
src_mv += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, srcABCD);
|
||||||
|
mvX2 = *((uint32 *) const_cast<MapValue *>(src_mv));
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (effective_width & 1) {
|
||||||
|
/* In case the m-channel is zero, do not remap this pixel in any way */
|
||||||
|
if (src_mv->m == 0) {
|
||||||
|
if (src->a < 255) {
|
||||||
|
ALPHA_BLEND_2(pack_hi_cm);
|
||||||
|
(*dst).data = EXTR32(srcABCD, 2);
|
||||||
|
} else {
|
||||||
|
*dst = src->data;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const uint r = remap[src_mv->m];
|
||||||
|
if (r != 0) {
|
||||||
|
Colour remapped_colour = AdjustBrightness(this->LookupColourInPalette(r), src_mv->v);
|
||||||
|
if (src->a < 255) {
|
||||||
|
remapped_colour.a = src->a;
|
||||||
|
INSR32(remapped_colour.data, srcABCD, 0);
|
||||||
|
ALPHA_BLEND_2(pack_hi_cm);
|
||||||
|
(*dst).data = EXTR32(srcABCD, 2);
|
||||||
|
} else
|
||||||
|
*dst = remapped_colour;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
src_mv_line += si->sprite_width;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BM_TRANSPARENT: {
|
||||||
|
/* Make the current colour a bit more black, so it looks like this image is transparent.
|
||||||
|
* rgb = rgb * ((256/4) * 4 - (alpha/4)) / ((256/4) * 4)
|
||||||
|
*/
|
||||||
|
__m128i srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
__m128i dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
for (uint x = (uint) bp->width / 2; x > 0; x--) {
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstCD = _mm_unpackhi_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i alphaAB = _mm_shuffle_epi8(srcAB, a_cm);
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 2); // Reduce to 64 levels of shades so the max value fits in 16 bits.
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstCD);
|
||||||
|
Colour *old_dst = dst;
|
||||||
|
src += 2;
|
||||||
|
dst += 2;
|
||||||
|
dstABCD = _mm_loadu_si128((__m128i*) dst);
|
||||||
|
_mm_storeu_si128((__m128i *) old_dst, dstAB);
|
||||||
|
srcABCD = _mm_loadu_si128((const __m128i*) src);
|
||||||
|
}
|
||||||
|
if (bp->width & 1) {
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128());
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128());
|
||||||
|
__m128i alphaAB = _mm_shuffle_epi8(srcAB, a_cm);
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 2);
|
||||||
|
__m128i nom = _mm_sub_epi16(tr_nom_base, alphaAB);
|
||||||
|
dstAB = _mm_mullo_epi16(dstAB, nom);
|
||||||
|
dstAB = _mm_srli_epi16(dstAB, 8);
|
||||||
|
dstAB = _mm_packus_epi16(dstAB, dstAB);
|
||||||
|
(*dst).data = EXTR32(dstAB, 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
|
||||||
|
dst_line += bp->pitch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draws a sprite to a (screen) buffer. Calls adequate templated function.
|
||||||
|
*
|
||||||
|
* @param bp further blitting parameters
|
||||||
|
* @param mode blitter mode
|
||||||
|
* @param zoom zoom level at which we are drawing
|
||||||
|
*/
|
||||||
|
void Blitter_32bppSSSE3::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case BM_NORMAL: {
|
||||||
|
const BlockType bt_last = (BlockType) (bp->width & 1);
|
||||||
|
if (bp->skip_left != 0 || bp->width <= MARGIN_NORMAL_THRESHOLD) {
|
||||||
|
switch (bt_last) {
|
||||||
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_SKIP, BT_EVEN>(bp, zoom); return;
|
||||||
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_SKIP, BT_ODD>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (bt_last) {
|
||||||
|
case BT_EVEN: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_EVEN>(bp, zoom); return;
|
||||||
|
case BT_ODD: Draw<BM_NORMAL, RM_WITH_MARGIN, BT_ODD>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case BM_COLOUR_REMAP:
|
||||||
|
if (bp->skip_left != 0 || bp->width <= MARGIN_REMAP_THRESHOLD) {
|
||||||
|
Draw<BM_COLOUR_REMAP, RM_WITH_SKIP, BT_NONE>(bp, zoom); return;
|
||||||
|
} else {
|
||||||
|
Draw<BM_COLOUR_REMAP, RM_WITH_MARGIN, BT_NONE>(bp, zoom); return;
|
||||||
|
}
|
||||||
|
case BM_TRANSPARENT: Draw<BM_TRANSPARENT, RM_NONE, BT_NONE>(bp, zoom); return;
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* WITH_SSE */
|
#endif /* WITH_SSE */
|
||||||
|
@@ -14,21 +14,71 @@
|
|||||||
|
|
||||||
#ifdef WITH_SSE
|
#ifdef WITH_SSE
|
||||||
|
|
||||||
#ifndef SSE_VERSION
|
|
||||||
#define SSE_VERSION 3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef FULL_ANIMATION
|
|
||||||
#define FULL_ANIMATION 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "32bpp_sse2.hpp"
|
#include "32bpp_sse2.hpp"
|
||||||
|
#include "tmmintrin.h"
|
||||||
|
|
||||||
|
/* Alpha blend 2 pixels. */
|
||||||
|
#undef ALPHA_BLEND_2
|
||||||
|
#define ALPHA_BLEND_2(m_pack_mask) { \
|
||||||
|
__m128i srcAB = _mm_unpacklo_epi8(srcABCD, _mm_setzero_si128()); /* PUNPCKLBW, expand each uint8 into uint16 */ \
|
||||||
|
__m128i dstAB = _mm_unpacklo_epi8(dstABCD, _mm_setzero_si128()); \
|
||||||
|
\
|
||||||
|
__m128i alphaAB = _mm_cmpgt_epi16(srcAB, _mm_setzero_si128()); /* PCMPGTW, if (alpha > 0) a++; */ \
|
||||||
|
alphaAB = _mm_srli_epi16(alphaAB, 15); \
|
||||||
|
alphaAB = _mm_add_epi16(alphaAB, srcAB); \
|
||||||
|
alphaAB = _mm_shuffle_epi8(alphaAB, a_cm); /* PSHUFB, put alpha in front of each rgb */ \
|
||||||
|
\
|
||||||
|
srcAB = _mm_sub_epi16(srcAB, dstAB); /* PSUBW, (r - Cr) */ \
|
||||||
|
srcAB = _mm_mullo_epi16(srcAB, alphaAB); /* PMULLW, a*(r - Cr) */ \
|
||||||
|
srcAB = _mm_srli_epi16(srcAB, 8); /* PSRLW, a*(r - Cr)/256 */ \
|
||||||
|
srcAB = _mm_add_epi16(srcAB, dstAB); /* PADDW, a*(r - Cr)/256 + Cr */ \
|
||||||
|
srcABCD = _mm_shuffle_epi8(srcAB, m_pack_mask); /* PSHUFB, pack 2 Colour (without saturation) */ \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Adjust brightness of 2 pixels. */
|
||||||
|
#define ADJUST_BRIGHTNESS_2(colourX2, brightnessX2) \
|
||||||
|
/* The following dataflow differs from the one of AdjustBrightness() only for alpha.
|
||||||
|
* In order to keep alpha in colAB, insert a 1 in a unused brightness byte (a*1->a).
|
||||||
|
* OK, not a 1 but DEFAULT_BRIGHTNESS to compensate the div.
|
||||||
|
*/ \
|
||||||
|
brightnessX2 &= 0xFF00FF00; \
|
||||||
|
brightnessX2 += DEFAULT_BRIGHTNESS; \
|
||||||
|
\
|
||||||
|
__m128i zero = _mm_setzero_si128(); \
|
||||||
|
__m128i colAB = _mm_unpacklo_epi8(colourX2, zero); \
|
||||||
|
\
|
||||||
|
__m128i briAB; \
|
||||||
|
INSR64(brightnessX2, briAB, 0); \
|
||||||
|
briAB = _mm_shuffle_epi8(briAB, briAB_cm); /* DEFAULT_BRIGHTNESS in 0, 0x00 in 2. */ \
|
||||||
|
colAB = _mm_mullo_epi16(colAB, briAB); \
|
||||||
|
__m128i colAB_ob = _mm_srli_epi16(colAB, 8+7); \
|
||||||
|
colAB = _mm_srli_epi16(colAB, 7); \
|
||||||
|
\
|
||||||
|
/* Sum overbright.
|
||||||
|
* Maximum for each rgb is 508 => 9 bits. The highest bit tells if there is overbright.
|
||||||
|
* -255 is changed in -256 so we just have to take the 8 lower bits into account.
|
||||||
|
*/ \
|
||||||
|
colAB = _mm_and_si128(colAB, div_cleaner); \
|
||||||
|
colAB_ob = _mm_and_si128(colAB_ob, ob_check); \
|
||||||
|
colAB_ob = _mm_mullo_epi16(colAB_ob, ob_mask); \
|
||||||
|
colAB_ob = _mm_and_si128(colAB_ob, colAB); \
|
||||||
|
__m128i obAB = _mm_hadd_epi16(_mm_hadd_epi16(colAB_ob, zero), zero); \
|
||||||
|
\
|
||||||
|
obAB = _mm_srli_epi16(obAB, 1); /* Reduce overbright strength. */ \
|
||||||
|
obAB = _mm_shuffle_epi8(obAB, ob_cm); \
|
||||||
|
__m128i retAB = ob_mask; /* ob_mask is equal to white. */ \
|
||||||
|
retAB = _mm_subs_epu16(retAB, colAB); /* (255 - rgb) */ \
|
||||||
|
retAB = _mm_mullo_epi16(retAB, obAB); /* ob*(255 - rgb) */ \
|
||||||
|
retAB = _mm_srli_epi16(retAB, 8); /* ob*(255 - rgb)/256 */ \
|
||||||
|
retAB = _mm_add_epi16(retAB, colAB); /* ob*(255 - rgb)/256 + rgb */ \
|
||||||
|
\
|
||||||
|
colourX2 = _mm_packus_epi16(retAB, retAB);
|
||||||
|
|
||||||
/** The SSSE3 32 bpp blitter (without palette animation). */
|
/** The SSSE3 32 bpp blitter (without palette animation). */
|
||||||
class Blitter_32bppSSSE3 : public Blitter_32bppSSE2 {
|
class Blitter_32bppSSSE3 : public Blitter_32bppSSE2 {
|
||||||
public:
|
public:
|
||||||
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
|
||||||
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last, bool translucent>
|
template <BlitterMode mode, Blitter_32bppSSE_Base::ReadMode read_mode, Blitter_32bppSSE_Base::BlockType bt_last>
|
||||||
void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
||||||
/* virtual */ const char *GetName() { return "32bpp-ssse3"; }
|
/* virtual */ const char *GetName() { return "32bpp-ssse3"; }
|
||||||
};
|
};
|
||||||
|
@@ -83,8 +83,7 @@ void Blitter_8bppOptimized::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Z
|
|||||||
width -= pixels;
|
width -= pixels;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case BM_COLOUR_REMAP:
|
case BM_COLOUR_REMAP: {
|
||||||
case BM_CRASH_REMAP: {
|
|
||||||
const uint8 *remap = bp->remap;
|
const uint8 *remap = bp->remap;
|
||||||
do {
|
do {
|
||||||
uint m = remap[*src];
|
uint m = remap[*src];
|
||||||
|
@@ -37,7 +37,6 @@ void Blitter_8bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoom
|
|||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case BM_COLOUR_REMAP:
|
case BM_COLOUR_REMAP:
|
||||||
case BM_CRASH_REMAP:
|
|
||||||
colour = bp->remap[*src];
|
colour = bp->remap[*src];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -20,7 +20,6 @@ enum BlitterMode {
|
|||||||
BM_NORMAL, ///< Perform the simple blitting.
|
BM_NORMAL, ///< Perform the simple blitting.
|
||||||
BM_COLOUR_REMAP, ///< Perform a colour remapping.
|
BM_COLOUR_REMAP, ///< Perform a colour remapping.
|
||||||
BM_TRANSPARENT, ///< Perform transparency colour remapping.
|
BM_TRANSPARENT, ///< Perform transparency colour remapping.
|
||||||
BM_CRASH_REMAP, ///< Perform a crash remapping.
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -244,7 +244,7 @@ bool HandleBootstrap()
|
|||||||
new BootstrapAskForDownloadWindow();
|
new BootstrapAskForDownloadWindow();
|
||||||
|
|
||||||
/* Process the user events. */
|
/* Process the user events. */
|
||||||
VideoDriver::GetInstance()->MainLoop();
|
_video_driver->MainLoop();
|
||||||
|
|
||||||
/* _exit_game is used to get out of the video driver's main loop.
|
/* _exit_game is used to get out of the video driver's main loop.
|
||||||
* In case GM_BOOTSTRAP is still set we did not exit it via the
|
* In case GM_BOOTSTRAP is still set we did not exit it via the
|
||||||
|
@@ -772,14 +772,13 @@ static uint ShowAdditionalText(int left, int right, int y, EngineID engine)
|
|||||||
{
|
{
|
||||||
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ADDITIONAL_TEXT, 0, 0, engine, NULL);
|
uint16 callback = GetVehicleCallback(CBID_VEHICLE_ADDITIONAL_TEXT, 0, 0, engine, NULL);
|
||||||
if (callback == CALLBACK_FAILED || callback == 0x400) return y;
|
if (callback == CALLBACK_FAILED || callback == 0x400) return y;
|
||||||
const GRFFile *grffile = Engine::Get(engine)->GetGRF();
|
|
||||||
if (callback > 0x400) {
|
if (callback > 0x400) {
|
||||||
ErrorUnknownCallbackResult(grffile->grfid, CBID_VEHICLE_ADDITIONAL_TEXT, callback);
|
ErrorUnknownCallbackResult(Engine::Get(engine)->GetGRFID(), CBID_VEHICLE_ADDITIONAL_TEXT, callback);
|
||||||
return y;
|
return y;
|
||||||
}
|
}
|
||||||
|
|
||||||
StartTextRefStackUsage(grffile, 6);
|
StartTextRefStackUsage(6);
|
||||||
uint result = DrawStringMultiLine(left, right, y, INT32_MAX, GetGRFStringID(grffile->grfid, 0xD000 + callback), TC_BLACK);
|
uint result = DrawStringMultiLine(left, right, y, INT32_MAX, GetGRFStringID(Engine::Get(engine)->GetGRFID(), 0xD000 + callback), TC_BLACK);
|
||||||
StopTextRefStackUsage();
|
StopTextRefStackUsage();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -224,7 +224,8 @@ bool VehicleCargoReroute::operator()(CargoPacket *cp)
|
|||||||
}
|
}
|
||||||
if (this->source != this->destination) {
|
if (this->source != this->destination) {
|
||||||
this->source->RemoveFromMeta(cp_new, VehicleCargoList::MTA_TRANSFER, cp_new->Count());
|
this->source->RemoveFromMeta(cp_new, VehicleCargoList::MTA_TRANSFER, cp_new->Count());
|
||||||
this->destination->AddToMeta(cp_new, VehicleCargoList::MTA_TRANSFER);
|
this->source->AddToMeta(cp_new, VehicleCargoList::MTA_TRANSFER);
|
||||||
|
this->destination->action_counts[VehicleCargoList::MTA_TRANSFER] += cp_new->Count();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Legal, as front pushing doesn't invalidate iterators in std::list. */
|
/* Legal, as front pushing doesn't invalidate iterators in std::list. */
|
||||||
|
@@ -67,7 +67,7 @@ void ClearCargoDeliveryMonitoring(CompanyID company)
|
|||||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||||
* @return Amount collected since last query/activation for the monitored combination.
|
* @return Amount collected since last query/activation for the monitored combination.
|
||||||
*/
|
*/
|
||||||
static int32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
|
static uint32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
|
||||||
{
|
{
|
||||||
CargoMonitorMap::iterator iter = monitor_map.find(monitor);
|
CargoMonitorMap::iterator iter = monitor_map.find(monitor);
|
||||||
if (iter == monitor_map.end()) {
|
if (iter == monitor_map.end()) {
|
||||||
@@ -77,7 +77,7 @@ static int32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, boo
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
int32 result = iter->second;
|
uint32 result = iter->second;
|
||||||
iter->second = 0;
|
iter->second = 0;
|
||||||
if (!keep_monitoring) monitor_map.erase(iter);
|
if (!keep_monitoring) monitor_map.erase(iter);
|
||||||
return result;
|
return result;
|
||||||
@@ -90,7 +90,7 @@ static int32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, boo
|
|||||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||||
* @return Amount of delivered cargo for the monitored combination.
|
* @return Amount of delivered cargo for the monitored combination.
|
||||||
*/
|
*/
|
||||||
int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
|
uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
|
||||||
{
|
{
|
||||||
return GetAmount(_cargo_deliveries, monitor, keep_monitoring);
|
return GetAmount(_cargo_deliveries, monitor, keep_monitoring);
|
||||||
}
|
}
|
||||||
@@ -102,7 +102,7 @@ int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
|
|||||||
* @return Amount of picked up cargo for the monitored combination.
|
* @return Amount of picked up cargo for the monitored combination.
|
||||||
* @note Cargo pick up is counted on final delivery, to prevent users getting credit for picking up cargo without delivering it.
|
* @note Cargo pick up is counted on final delivery, to prevent users getting credit for picking up cargo without delivering it.
|
||||||
*/
|
*/
|
||||||
int32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
|
uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
|
||||||
{
|
{
|
||||||
return GetAmount(_cargo_pickups, monitor, keep_monitoring);
|
return GetAmount(_cargo_pickups, monitor, keep_monitoring);
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
#include "company_func.h"
|
#include "company_func.h"
|
||||||
#include "industry.h"
|
#include "industry.h"
|
||||||
#include "town.h"
|
#include "town.h"
|
||||||
#include "core/overflowsafe_type.hpp"
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
struct Station;
|
struct Station;
|
||||||
@@ -32,7 +31,7 @@ struct Station;
|
|||||||
typedef uint32 CargoMonitorID; ///< Type of the cargo monitor number.
|
typedef uint32 CargoMonitorID; ///< Type of the cargo monitor number.
|
||||||
|
|
||||||
/** Map type for storing and updating active cargo monitor numbers and their amounts. */
|
/** Map type for storing and updating active cargo monitor numbers and their amounts. */
|
||||||
typedef std::map<CargoMonitorID, OverflowSafeInt32> CargoMonitorMap;
|
typedef std::map<CargoMonitorID, uint32> CargoMonitorMap;
|
||||||
|
|
||||||
extern CargoMonitorMap _cargo_pickups;
|
extern CargoMonitorMap _cargo_pickups;
|
||||||
extern CargoMonitorMap _cargo_deliveries;
|
extern CargoMonitorMap _cargo_deliveries;
|
||||||
@@ -142,8 +141,8 @@ static inline TownID DecodeMonitorTown(CargoMonitorID num)
|
|||||||
|
|
||||||
void ClearCargoPickupMonitoring(CompanyID company = INVALID_OWNER);
|
void ClearCargoPickupMonitoring(CompanyID company = INVALID_OWNER);
|
||||||
void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER);
|
void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER);
|
||||||
int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
|
uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||||
int32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring);
|
uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||||
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st);
|
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st);
|
||||||
|
|
||||||
#endif /* CARGOMONITOR_H */
|
#endif /* CARGOMONITOR_H */
|
||||||
|
@@ -544,54 +544,17 @@ void VehicleCargoList::InvalidateCache()
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Moves some cargo from one designation to another. You can only move
|
* Moves some cargo from one designation to another. You can only move
|
||||||
* between adjacent designations. E.g. you can keep cargo that was previously
|
* between adjacent designations. E.g. you can keep cargo that was
|
||||||
* reserved (MTA_LOAD), but you can't reserve cargo that's marked as to be
|
* previously reserved (MTA_LOAD) or you can mark cargo to be transferred
|
||||||
* delivered. Furthermore, as this method doesn't change the actual packets,
|
* that was previously marked as to be delivered, but you can't reserve
|
||||||
* you cannot move cargo from or to MTA_TRANSFER. You need a specialized
|
* cargo that's marked as to be delivered.
|
||||||
* template method for that.
|
|
||||||
* @tparam from Previous designation of cargo.
|
|
||||||
* @tparam to New designation of cargo.
|
|
||||||
* @param max_move Maximum amount of cargo to reassign.
|
|
||||||
* @return Amount of cargo actually reassigned.
|
|
||||||
*/
|
*/
|
||||||
template<VehicleCargoList::MoveToAction Tfrom, VehicleCargoList::MoveToAction Tto>
|
uint VehicleCargoList::Reassign(uint max_move, MoveToAction from, MoveToAction to)
|
||||||
uint VehicleCargoList::Reassign(uint max_move, TileOrStationID)
|
|
||||||
{
|
{
|
||||||
assert_tcompile(Tfrom != MTA_TRANSFER && Tto != MTA_TRANSFER);
|
max_move = min(this->action_counts[from], max_move);
|
||||||
assert_tcompile(Tfrom - Tto == 1 || Tto - Tfrom == 1);
|
assert(Delta((int)from, (int)to) == 1);
|
||||||
max_move = min(this->action_counts[Tfrom], max_move);
|
this->action_counts[from] -= max_move;
|
||||||
this->action_counts[Tfrom] -= max_move;
|
this->action_counts[to] += max_move;
|
||||||
this->action_counts[Tto] += max_move;
|
|
||||||
return max_move;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reassign cargo from MTA_DELIVER to MTA_TRANSFER and take care of the next
|
|
||||||
* station the cargo wants to visit.
|
|
||||||
* @param max_move Maximum amount of cargo to reassign.
|
|
||||||
* @param next_station Station to record as next hop in the reassigned packets.
|
|
||||||
* @return Amount of cargo actually reassigned.
|
|
||||||
*/
|
|
||||||
template<>
|
|
||||||
uint VehicleCargoList::Reassign<VehicleCargoList::MTA_DELIVER, VehicleCargoList::MTA_TRANSFER>(uint max_move, TileOrStationID next_station)
|
|
||||||
{
|
|
||||||
max_move = min(this->action_counts[MTA_DELIVER], max_move);
|
|
||||||
|
|
||||||
uint sum = 0;
|
|
||||||
for (Iterator it(this->packets.begin()); sum < this->action_counts[MTA_TRANSFER] + max_move;) {
|
|
||||||
CargoPacket *cp = *it++;
|
|
||||||
sum += cp->Count();
|
|
||||||
if (sum <= this->action_counts[MTA_TRANSFER]) continue;
|
|
||||||
if (sum > this->action_counts[MTA_TRANSFER] + max_move) {
|
|
||||||
CargoPacket *cp_split = cp->Split(sum - this->action_counts[MTA_TRANSFER] + max_move);
|
|
||||||
sum -= cp_split->Count();
|
|
||||||
this->packets.insert(it, cp_split);
|
|
||||||
}
|
|
||||||
cp->next_station = next_station;
|
|
||||||
}
|
|
||||||
|
|
||||||
this->action_counts[MTA_DELIVER] -= max_move;
|
|
||||||
this->action_counts[MTA_TRANSFER] += max_move;
|
|
||||||
return max_move;
|
return max_move;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -843,7 +806,7 @@ uint StationCargoList::Load(uint max_move, VehicleCargoList *dest, TileIndex loa
|
|||||||
uint move = min(dest->ActionCount(VehicleCargoList::MTA_LOAD), max_move);
|
uint move = min(dest->ActionCount(VehicleCargoList::MTA_LOAD), max_move);
|
||||||
if (move > 0) {
|
if (move > 0) {
|
||||||
this->reserved_count -= move;
|
this->reserved_count -= move;
|
||||||
dest->Reassign<VehicleCargoList::MTA_LOAD, VehicleCargoList::MTA_KEEP>(move);
|
dest->Reassign(move, VehicleCargoList::MTA_LOAD, VehicleCargoList::MTA_KEEP);
|
||||||
return move;
|
return move;
|
||||||
} else {
|
} else {
|
||||||
return this->ShiftCargo(CargoLoad(this, dest, max_move, load_place), next_station, true);
|
return this->ShiftCargo(CargoLoad(this, dest, max_move, load_place), next_station, true);
|
||||||
@@ -868,4 +831,3 @@ uint StationCargoList::Reroute(uint max_move, StationCargoList *dest, StationID
|
|||||||
*/
|
*/
|
||||||
template class CargoList<VehicleCargoList, CargoPacketList>;
|
template class CargoList<VehicleCargoList, CargoPacketList>;
|
||||||
template class CargoList<StationCargoList, StationCargoPacketMap>;
|
template class CargoList<StationCargoList, StationCargoPacketMap>;
|
||||||
template uint VehicleCargoList::Reassign<VehicleCargoList::MTA_DELIVER, VehicleCargoList::MTA_KEEP>(uint, TileOrStationID);
|
|
||||||
|
@@ -157,7 +157,7 @@ public:
|
|||||||
* Gets the ID of the station where the cargo was loaded for the first time.
|
* Gets the ID of the station where the cargo was loaded for the first time.
|
||||||
* @return StationID.
|
* @return StationID.
|
||||||
*/
|
*/
|
||||||
inline StationID SourceStation() const
|
inline SourceID SourceStation() const
|
||||||
{
|
{
|
||||||
return this->source;
|
return this->source;
|
||||||
}
|
}
|
||||||
@@ -429,8 +429,7 @@ public:
|
|||||||
* amount of cargo to be moved. Second parameter is destination (if
|
* amount of cargo to be moved. Second parameter is destination (if
|
||||||
* applicable), return value is amount of cargo actually moved. */
|
* applicable), return value is amount of cargo actually moved. */
|
||||||
|
|
||||||
template<MoveToAction Tfrom, MoveToAction Tto>
|
uint Reassign(uint max_move, MoveToAction from, MoveToAction to);
|
||||||
uint Reassign(uint max_move, TileOrStationID update = INVALID_TILE);
|
|
||||||
uint Return(uint max_move, StationCargoList *dest, StationID next_station);
|
uint Return(uint max_move, StationCargoList *dest, StationID next_station);
|
||||||
uint Unload(uint max_move, StationCargoList *dest, CargoPayment *payment);
|
uint Unload(uint max_move, StationCargoList *dest, CargoPayment *payment);
|
||||||
uint Shift(uint max_move, VehicleCargoList *dest);
|
uint Shift(uint max_move, VehicleCargoList *dest);
|
||||||
|
@@ -160,10 +160,8 @@ CommandProc CmdCreateStoryPage;
|
|||||||
CommandProc CmdCreateStoryPageElement;
|
CommandProc CmdCreateStoryPageElement;
|
||||||
CommandProc CmdUpdateStoryPageElement;
|
CommandProc CmdUpdateStoryPageElement;
|
||||||
CommandProc CmdSetStoryPageTitle;
|
CommandProc CmdSetStoryPageTitle;
|
||||||
CommandProc CmdSetStoryPageDate;
|
|
||||||
CommandProc CmdShowStoryPage;
|
CommandProc CmdShowStoryPage;
|
||||||
CommandProc CmdRemoveStoryPage;
|
CommandProc CmdRemoveStoryPage;
|
||||||
CommandProc CmdRemoveStoryPageElement;
|
|
||||||
|
|
||||||
CommandProc CmdLevelLand;
|
CommandProc CmdLevelLand;
|
||||||
|
|
||||||
@@ -246,7 +244,7 @@ static const Command _command_proc_table[] = {
|
|||||||
DEF_CMD(CmdForceTrainProceed, 0, CMDT_VEHICLE_MANAGEMENT ), // CMD_FORCE_TRAIN_PROCEED
|
DEF_CMD(CmdForceTrainProceed, 0, CMDT_VEHICLE_MANAGEMENT ), // CMD_FORCE_TRAIN_PROCEED
|
||||||
DEF_CMD(CmdReverseTrainDirection, 0, CMDT_VEHICLE_MANAGEMENT ), // CMD_REVERSE_TRAIN_DIRECTION
|
DEF_CMD(CmdReverseTrainDirection, 0, CMDT_VEHICLE_MANAGEMENT ), // CMD_REVERSE_TRAIN_DIRECTION
|
||||||
|
|
||||||
DEF_CMD(CmdClearOrderBackup, CMD_CLIENT_ID, CMDT_SERVER_SETTING ), // CMD_CLEAR_ORDER_BACKUP
|
DEF_CMD(CmdClearOrderBackup, CMD_CLIENT_ID, CMDT_ROUTE_MANAGEMENT ), // CMD_CLEAR_ORDER_BACKUP
|
||||||
DEF_CMD(CmdModifyOrder, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_MODIFY_ORDER
|
DEF_CMD(CmdModifyOrder, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_MODIFY_ORDER
|
||||||
DEF_CMD(CmdSkipToOrder, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SKIP_TO_ORDER
|
DEF_CMD(CmdSkipToOrder, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SKIP_TO_ORDER
|
||||||
DEF_CMD(CmdDeleteOrder, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_DELETE_ORDER
|
DEF_CMD(CmdDeleteOrder, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_DELETE_ORDER
|
||||||
@@ -314,10 +312,8 @@ static const Command _command_proc_table[] = {
|
|||||||
DEF_CMD(CmdCreateStoryPageElement, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_CREATE_STORY_PAGE_ELEMENT
|
DEF_CMD(CmdCreateStoryPageElement, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_CREATE_STORY_PAGE_ELEMENT
|
||||||
DEF_CMD(CmdUpdateStoryPageElement, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_UPDATE_STORY_PAGE_ELEMENT
|
DEF_CMD(CmdUpdateStoryPageElement, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_UPDATE_STORY_PAGE_ELEMENT
|
||||||
DEF_CMD(CmdSetStoryPageTitle, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SET_STORY_PAGE_TITLE
|
DEF_CMD(CmdSetStoryPageTitle, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SET_STORY_PAGE_TITLE
|
||||||
DEF_CMD(CmdSetStoryPageDate, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SET_STORY_PAGE_DATE
|
|
||||||
DEF_CMD(CmdShowStoryPage, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SHOW_STORY_PAGE
|
DEF_CMD(CmdShowStoryPage, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SHOW_STORY_PAGE
|
||||||
DEF_CMD(CmdRemoveStoryPage, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_STORY_PAGE
|
DEF_CMD(CmdRemoveStoryPage, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_STORY_PAGE
|
||||||
DEF_CMD(CmdRemoveStoryPageElement, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_STORY_ELEMENT_PAGE
|
|
||||||
|
|
||||||
DEF_CMD(CmdLevelLand, CMD_ALL_TILES | CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_LEVEL_LAND; test run might clear tiles multiple times, in execution that only happens once
|
DEF_CMD(CmdLevelLand, CMD_ALL_TILES | CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_LEVEL_LAND; test run might clear tiles multiple times, in execution that only happens once
|
||||||
|
|
||||||
@@ -575,7 +571,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallbac
|
|||||||
/* Only show the error when it's for us. */
|
/* Only show the error when it's for us. */
|
||||||
StringID error_part1 = GB(cmd, 16, 16);
|
StringID error_part1 = GB(cmd, 16, 16);
|
||||||
if (estimate_only || (IsLocalCompany() && error_part1 != 0 && my_cmd)) {
|
if (estimate_only || (IsLocalCompany() && error_part1 != 0 && my_cmd)) {
|
||||||
ShowErrorMessage(error_part1, res.GetErrorMessage(), WL_INFO, x, y, res.GetTextRefStackGRF(), res.GetTextRefStackSize(), res.GetTextRefStack());
|
ShowErrorMessage(error_part1, res.GetErrorMessage(), WL_INFO, x, y, res.GetTextRefStackSize(), res.GetTextRefStack());
|
||||||
}
|
}
|
||||||
} else if (estimate_only) {
|
} else if (estimate_only) {
|
||||||
ShowEstimatedCostOrIncome(res.GetCost(), x, y);
|
ShowEstimatedCostOrIncome(res.GetCost(), x, y);
|
||||||
@@ -601,7 +597,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallbac
|
|||||||
* @param cmd the command cost to return.
|
* @param cmd the command cost to return.
|
||||||
* @param clear whether to keep the storage changes or not.
|
* @param clear whether to keep the storage changes or not.
|
||||||
*/
|
*/
|
||||||
#define return_dcpi(cmd) { _docommand_recursive = 0; return cmd; }
|
#define return_dcpi(cmd, clear) { _docommand_recursive = 0; ClearPersistentStorageChanges(clear); return cmd; }
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Helper function for the toplevel network safe docommand function for the current company.
|
* Helper function for the toplevel network safe docommand function for the current company.
|
||||||
@@ -645,7 +641,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Do not even think about executing out-of-bounds tile-commands */
|
/* Do not even think about executing out-of-bounds tile-commands */
|
||||||
if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (cmd_flags & CMD_ALL_TILES) == 0))) return_dcpi(CMD_ERROR);
|
if (tile != 0 && (tile >= MapSize() || (!IsValidTile(tile) && (cmd_flags & CMD_ALL_TILES) == 0))) return_dcpi(CMD_ERROR, false);
|
||||||
|
|
||||||
/* Always execute server and spectator commands as spectator */
|
/* Always execute server and spectator commands as spectator */
|
||||||
bool exec_as_spectator = (cmd_flags & (CMD_SPECTATOR | CMD_SERVER)) != 0;
|
bool exec_as_spectator = (cmd_flags & (CMD_SPECTATOR | CMD_SERVER)) != 0;
|
||||||
@@ -654,7 +650,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
* The server will ditch any server commands a client sends to it, so effectively
|
* The server will ditch any server commands a client sends to it, so effectively
|
||||||
* this guards the server from executing functions for an invalid company. */
|
* this guards the server from executing functions for an invalid company. */
|
||||||
if (_game_mode == GM_NORMAL && !exec_as_spectator && !Company::IsValidID(_current_company) && !(_current_company == OWNER_DEITY && (cmd_flags & CMD_DEITY) != 0)) {
|
if (_game_mode == GM_NORMAL && !exec_as_spectator && !Company::IsValidID(_current_company) && !(_current_company == OWNER_DEITY && (cmd_flags & CMD_DEITY) != 0)) {
|
||||||
return_dcpi(CMD_ERROR);
|
return_dcpi(CMD_ERROR, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
Backup<CompanyByte> cur_company(_current_company, FILE_LINE);
|
Backup<CompanyByte> cur_company(_current_company, FILE_LINE);
|
||||||
@@ -665,9 +661,8 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
/* Test the command. */
|
/* Test the command. */
|
||||||
_cleared_object_areas.Clear();
|
_cleared_object_areas.Clear();
|
||||||
SetTownRatingTestMode(true);
|
SetTownRatingTestMode(true);
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_ENTER_TESTMODE);
|
ClearPersistentStorageChanges(false);
|
||||||
CommandCost res = proc(tile, flags, p1, p2, text);
|
CommandCost res = proc(tile, flags, p1, p2, text);
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_LEAVE_TESTMODE);
|
|
||||||
SetTownRatingTestMode(false);
|
SetTownRatingTestMode(false);
|
||||||
|
|
||||||
/* Make sure we're not messing things up here. */
|
/* Make sure we're not messing things up here. */
|
||||||
@@ -686,7 +681,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
DEBUG(desync, 1, "cmdf: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s)", _date, _date_fract, (int)_current_company, tile, p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));
|
DEBUG(desync, 1, "cmdf: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s)", _date, _date_fract, (int)_current_company, tile, p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));
|
||||||
}
|
}
|
||||||
cur_company.Restore();
|
cur_company.Restore();
|
||||||
return_dcpi(res);
|
return_dcpi(res, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_NETWORK
|
#ifdef ENABLE_NETWORK
|
||||||
@@ -702,7 +697,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
* This way it's not handled by DoCommand and only the
|
* This way it's not handled by DoCommand and only the
|
||||||
* actual execution of the command causes messages. Also
|
* actual execution of the command causes messages. Also
|
||||||
* reset the storages as we've not executed the command. */
|
* reset the storages as we've not executed the command. */
|
||||||
return_dcpi(CommandCost());
|
return_dcpi(CommandCost(), false);
|
||||||
}
|
}
|
||||||
#endif /* ENABLE_NETWORK */
|
#endif /* ENABLE_NETWORK */
|
||||||
DEBUG(desync, 1, "cmd: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s)", _date, _date_fract, (int)_current_company, tile, p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));
|
DEBUG(desync, 1, "cmd: %08x; %02x; %02x; %06x; %08x; %08x; %08x; \"%s\" (%s)", _date, _date_fract, (int)_current_company, tile, p1, p2, cmd & ~CMD_NETWORK_COMMAND, text, GetCommandName(cmd));
|
||||||
@@ -710,9 +705,8 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
/* Actually try and execute the command. If no cost-type is given
|
/* Actually try and execute the command. If no cost-type is given
|
||||||
* use the construction one */
|
* use the construction one */
|
||||||
_cleared_object_areas.Clear();
|
_cleared_object_areas.Clear();
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_ENTER_COMMAND);
|
ClearPersistentStorageChanges(false);
|
||||||
CommandCost res2 = proc(tile, flags | DC_EXEC, p1, p2, text);
|
CommandCost res2 = proc(tile, flags | DC_EXEC, p1, p2, text);
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_LEAVE_COMMAND);
|
|
||||||
|
|
||||||
if (cmd_id == CMD_COMPANY_CTRL) {
|
if (cmd_id == CMD_COMPANY_CTRL) {
|
||||||
cur_company.Trash();
|
cur_company.Trash();
|
||||||
@@ -733,7 +727,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
if (!test_and_exec_can_differ) {
|
if (!test_and_exec_can_differ) {
|
||||||
assert(res.GetCost() == res2.GetCost() && res.Failed() == res2.Failed()); // sanity check
|
assert(res.GetCost() == res2.GetCost() && res.Failed() == res2.Failed()); // sanity check
|
||||||
} else if (res2.Failed()) {
|
} else if (res2.Failed()) {
|
||||||
return_dcpi(res2);
|
return_dcpi(res2, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we're needing more money and we haven't done
|
/* If we're needing more money and we haven't done
|
||||||
@@ -743,7 +737,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
* So make sure the signal buffer is empty even in this case */
|
* So make sure the signal buffer is empty even in this case */
|
||||||
UpdateSignalsInBuffer();
|
UpdateSignalsInBuffer();
|
||||||
SetDParam(0, _additional_cash_required);
|
SetDParam(0, _additional_cash_required);
|
||||||
return_dcpi(CommandCost(STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY));
|
return_dcpi(CommandCost(STR_ERROR_NOT_ENOUGH_CASH_REQUIRES_CURRENCY), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update last build coordinate of company. */
|
/* update last build coordinate of company. */
|
||||||
@@ -757,7 +751,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
|
|||||||
/* update signals if needed */
|
/* update signals if needed */
|
||||||
UpdateSignalsInBuffer();
|
UpdateSignalsInBuffer();
|
||||||
|
|
||||||
return_dcpi(res2);
|
return_dcpi(res2, true);
|
||||||
}
|
}
|
||||||
#undef return_dcpi
|
#undef return_dcpi
|
||||||
|
|
||||||
@@ -785,15 +779,13 @@ uint32 CommandCost::textref_stack[16];
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Activate usage of the NewGRF #TextRefStack for the error message.
|
* Activate usage of the NewGRF #TextRefStack for the error message.
|
||||||
* @param grffile NewGRF that provides the #TextRefStack
|
* @param number of entries to copy from the temporary NewGRF registers
|
||||||
* @param num_registers number of entries to copy from the temporary NewGRF registers
|
|
||||||
*/
|
*/
|
||||||
void CommandCost::UseTextRefStack(const GRFFile *grffile, uint num_registers)
|
void CommandCost::UseTextRefStack(uint num_registers)
|
||||||
{
|
{
|
||||||
extern TemporaryStorageArray<int32, 0x110> _temp_store;
|
extern TemporaryStorageArray<int32, 0x110> _temp_store;
|
||||||
|
|
||||||
assert(num_registers < lengthof(textref_stack));
|
assert(num_registers < lengthof(textref_stack));
|
||||||
this->textref_stack_grffile = grffile;
|
|
||||||
this->textref_stack_size = num_registers;
|
this->textref_stack_size = num_registers;
|
||||||
for (uint i = 0; i < num_registers; i++) {
|
for (uint i = 0; i < num_registers; i++) {
|
||||||
textref_stack[i] = _temp_store.GetValue(0x100 + i);
|
textref_stack[i] = _temp_store.GetValue(0x100 + i);
|
||||||
|
@@ -16,8 +16,6 @@
|
|||||||
#include "strings_type.h"
|
#include "strings_type.h"
|
||||||
#include "tile_type.h"
|
#include "tile_type.h"
|
||||||
|
|
||||||
struct GRFFile;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Common return value for all commands. Wraps the cost and
|
* Common return value for all commands. Wraps the cost and
|
||||||
* a possible error message/state together.
|
* a possible error message/state together.
|
||||||
@@ -27,7 +25,6 @@ class CommandCost {
|
|||||||
Money cost; ///< The cost of this action
|
Money cost; ///< The cost of this action
|
||||||
StringID message; ///< Warning message for when success is unset
|
StringID message; ///< Warning message for when success is unset
|
||||||
bool success; ///< Whether the comment went fine up to this moment
|
bool success; ///< Whether the comment went fine up to this moment
|
||||||
const GRFFile *textref_stack_grffile; ///< NewGRF providing the #TextRefStack content.
|
|
||||||
uint textref_stack_size; ///< Number of uint32 values to put on the #TextRefStack for the error message.
|
uint textref_stack_size; ///< Number of uint32 values to put on the #TextRefStack for the error message.
|
||||||
|
|
||||||
static uint32 textref_stack[16];
|
static uint32 textref_stack[16];
|
||||||
@@ -36,25 +33,25 @@ public:
|
|||||||
/**
|
/**
|
||||||
* Creates a command cost return with no cost and no error
|
* Creates a command cost return with no cost and no error
|
||||||
*/
|
*/
|
||||||
CommandCost() : expense_type(INVALID_EXPENSES), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_grffile(NULL), textref_stack_size(0) {}
|
CommandCost() : expense_type(INVALID_EXPENSES), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a command return value the is failed with the given message
|
* Creates a command return value the is failed with the given message
|
||||||
*/
|
*/
|
||||||
explicit CommandCost(StringID msg) : expense_type(INVALID_EXPENSES), cost(0), message(msg), success(false), textref_stack_grffile(NULL), textref_stack_size(0) {}
|
explicit CommandCost(StringID msg) : expense_type(INVALID_EXPENSES), cost(0), message(msg), success(false), textref_stack_size(0) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a command cost with given expense type and start cost of 0
|
* Creates a command cost with given expense type and start cost of 0
|
||||||
* @param ex_t the expense type
|
* @param ex_t the expense type
|
||||||
*/
|
*/
|
||||||
explicit CommandCost(ExpensesType ex_t) : expense_type(ex_t), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_grffile(NULL), textref_stack_size(0) {}
|
explicit CommandCost(ExpensesType ex_t) : expense_type(ex_t), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a command return value with the given start cost and expense type
|
* Creates a command return value with the given start cost and expense type
|
||||||
* @param ex_t the expense type
|
* @param ex_t the expense type
|
||||||
* @param cst the initial cost of this command
|
* @param cst the initial cost of this command
|
||||||
*/
|
*/
|
||||||
CommandCost(ExpensesType ex_t, const Money &cst) : expense_type(ex_t), cost(cst), message(INVALID_STRING_ID), success(true), textref_stack_grffile(NULL), textref_stack_size(0) {}
|
CommandCost(ExpensesType ex_t, const Money &cst) : expense_type(ex_t), cost(cst), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -106,16 +103,7 @@ public:
|
|||||||
this->message = message;
|
this->message = message;
|
||||||
}
|
}
|
||||||
|
|
||||||
void UseTextRefStack(const GRFFile *grffile, uint num_registers);
|
void UseTextRefStack(uint num_registers);
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the NewGRF providing the #TextRefStack of the error message.
|
|
||||||
* @return the NewGRF.
|
|
||||||
*/
|
|
||||||
const GRFFile *GetTextRefStackGRF() const
|
|
||||||
{
|
|
||||||
return this->textref_stack_grffile;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of uint32 values for the #TextRefStack of the error message.
|
* Returns the number of uint32 values for the #TextRefStack of the error message.
|
||||||
@@ -288,10 +276,8 @@ enum Commands {
|
|||||||
CMD_CREATE_STORY_PAGE_ELEMENT, ///< create a new story page element
|
CMD_CREATE_STORY_PAGE_ELEMENT, ///< create a new story page element
|
||||||
CMD_UPDATE_STORY_PAGE_ELEMENT, ///< update a story page element
|
CMD_UPDATE_STORY_PAGE_ELEMENT, ///< update a story page element
|
||||||
CMD_SET_STORY_PAGE_TITLE, ///< update title of a story page
|
CMD_SET_STORY_PAGE_TITLE, ///< update title of a story page
|
||||||
CMD_SET_STORY_PAGE_DATE, ///< update date of a story page
|
|
||||||
CMD_SHOW_STORY_PAGE, ///< show a story page
|
CMD_SHOW_STORY_PAGE, ///< show a story page
|
||||||
CMD_REMOVE_STORY_PAGE, ///< remove a story page
|
CMD_REMOVE_STORY_PAGE, ///< remove a story page
|
||||||
CMD_REMOVE_STORY_PAGE_ELEMENT, ///< remove a story page element
|
|
||||||
CMD_LEVEL_LAND, ///< level land
|
CMD_LEVEL_LAND, ///< level land
|
||||||
|
|
||||||
CMD_BUILD_LOCK, ///< build a lock
|
CMD_BUILD_LOCK, ///< build a lock
|
||||||
|
@@ -853,21 +853,59 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
MarkWholeScreenDirty();
|
MarkWholeScreenDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkServerNewCompany(c, ci);
|
if (_network_server) {
|
||||||
|
if (ci != NULL) {
|
||||||
|
/* ci is only NULL when replaying.
|
||||||
|
* When replaying no client is actually in need of an update. */
|
||||||
|
ci->client_playas = c->index;
|
||||||
|
NetworkUpdateClientInfo(ci->client_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Company::IsValidID(c->index)) {
|
||||||
|
_network_company_states[c->index].months_empty = 0;
|
||||||
|
_network_company_states[c->index].password[0] = '\0';
|
||||||
|
NetworkServerUpdateCompanyPassworded(c->index, false);
|
||||||
|
|
||||||
|
/* XXX - When a client joins, we automatically set its name to the
|
||||||
|
* client's name (for some reason). As it stands now only the server
|
||||||
|
* knows the client's name, so it needs to send out a "broadcast" to
|
||||||
|
* do this. To achieve this we send a network command. However, it
|
||||||
|
* uses _local_company to execute the command as. To prevent abuse
|
||||||
|
* (eg. only yourself can change your name/company), we 'cheat' by
|
||||||
|
* impersonation _local_company as the server. Not the best solution;
|
||||||
|
* but it works.
|
||||||
|
* TODO: Perhaps this could be improved by when the client is ready
|
||||||
|
* with joining to let it send itself the command, and not the server?
|
||||||
|
* For example in network_client.c:534? */
|
||||||
|
if (ci != NULL) {
|
||||||
|
/* ci is only NULL when replaying.
|
||||||
|
* When replaying, the command to rename the president will
|
||||||
|
* automatically be ran, so this is not even needed to get
|
||||||
|
* the exact same state. */
|
||||||
|
NetworkSendCommand(0, 0, 0, CMD_RENAME_PRESIDENT, NULL, ci->client_name, c->index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Announce new company on network. */
|
||||||
|
NetworkAdminCompanyInfo(c, true);
|
||||||
|
|
||||||
|
if (ci != NULL) {
|
||||||
|
/* ci is only NULL when replaying.
|
||||||
|
* When replaying, the message that someone started a new company
|
||||||
|
* is not interesting at all. */
|
||||||
|
NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, c->index + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif /* ENABLE_NETWORK */
|
#endif /* ENABLE_NETWORK */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case 1: { // Make a new AI company
|
case 1: // Make a new AI company
|
||||||
if (!(flags & DC_EXEC)) return CommandCost();
|
if (!(flags & DC_EXEC)) return CommandCost();
|
||||||
|
|
||||||
if (company_id != INVALID_COMPANY && (company_id >= MAX_COMPANIES || Company::IsValidID(company_id))) return CMD_ERROR;
|
if (company_id != INVALID_COMPANY && (company_id >= MAX_COMPANIES || Company::IsValidID(company_id))) return CMD_ERROR;
|
||||||
Company *c = DoStartupNewCompany(true, company_id);
|
DoStartupNewCompany(true, company_id);
|
||||||
#ifdef ENABLE_NETWORK
|
|
||||||
if (c != NULL) NetworkServerNewCompany(c, NULL);
|
|
||||||
#endif /* ENABLE_NETWORK */
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
case 2: { // Delete a company
|
case 2: { // Delete a company
|
||||||
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p2, 0, 2);
|
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p2, 0, 2);
|
||||||
|
@@ -2013,7 +2013,7 @@ struct CompanyWindow : Window
|
|||||||
NWidgetStacked *wi = this->GetWidget<NWidgetStacked>(WID_C_SELECT_BUTTONS);
|
NWidgetStacked *wi = this->GetWidget<NWidgetStacked>(WID_C_SELECT_BUTTONS);
|
||||||
if (plane != wi->shown_plane) {
|
if (plane != wi->shown_plane) {
|
||||||
wi->SetDisplayedPlane(plane);
|
wi->SetDisplayedPlane(plane);
|
||||||
this->InvalidateData();
|
this->SetDirty();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -475,7 +475,7 @@ void IConsoleCmdExec(const char *cmdstr)
|
|||||||
DEBUG(console, 8, "Token %d is: '%s'", i, tokens[i]);
|
DEBUG(console, 8, "Token %d is: '%s'", i, tokens[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StrEmpty(tokens[0])) return; // don't execute empty commands
|
if (tokens[0] == '\0') return; // don't execute empty commands
|
||||||
/* 2. Determine type of command (cmd or alias) and execute
|
/* 2. Determine type of command (cmd or alias) and execute
|
||||||
* First try commands, then aliases. Execute
|
* First try commands, then aliases. Execute
|
||||||
* the found action taking into account its hooking code
|
* the found action taking into account its hooking code
|
||||||
|
@@ -185,7 +185,7 @@ struct IConsoleWindow : Window
|
|||||||
~IConsoleWindow()
|
~IConsoleWindow()
|
||||||
{
|
{
|
||||||
_iconsole_mode = ICONSOLE_CLOSED;
|
_iconsole_mode = ICONSOLE_CLOSED;
|
||||||
VideoDriver::GetInstance()->EditBoxLostFocus();
|
_video_driver->EditBoxLostFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -374,7 +374,7 @@ struct IConsoleWindow : Window
|
|||||||
|
|
||||||
virtual void OnFocusLost()
|
virtual void OnFocusLost()
|
||||||
{
|
{
|
||||||
VideoDriver::GetInstance()->EditBoxLostFocus();
|
_video_driver->EditBoxLostFocus();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -12,7 +12,6 @@
|
|||||||
#ifndef OVERFLOWSAFE_TYPE_HPP
|
#ifndef OVERFLOWSAFE_TYPE_HPP
|
||||||
#define OVERFLOWSAFE_TYPE_HPP
|
#define OVERFLOWSAFE_TYPE_HPP
|
||||||
|
|
||||||
#include "math_func.hpp"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Overflow safe template for integers, i.e. integers that will never overflow
|
* Overflow safe template for integers, i.e. integers that will never overflow
|
||||||
@@ -152,6 +151,5 @@ template <class T, int64 T_MAX, int64 T_MIN> inline OverflowSafeInt<T, T_MAX, T_
|
|||||||
template <class T, int64 T_MAX, int64 T_MIN> inline OverflowSafeInt<T, T_MAX, T_MIN> operator / (byte a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return (OverflowSafeInt<T, T_MAX, T_MIN>)a / (int)b; }
|
template <class T, int64 T_MAX, int64 T_MIN> inline OverflowSafeInt<T, T_MAX, T_MIN> operator / (byte a, OverflowSafeInt<T, T_MAX, T_MIN> b) { return (OverflowSafeInt<T, T_MAX, T_MIN>)a / (int)b; }
|
||||||
|
|
||||||
typedef OverflowSafeInt<int64, INT64_MAX, INT64_MIN> OverflowSafeInt64;
|
typedef OverflowSafeInt<int64, INT64_MAX, INT64_MIN> OverflowSafeInt64;
|
||||||
typedef OverflowSafeInt<int32, INT32_MAX, INT32_MIN> OverflowSafeInt32;
|
|
||||||
|
|
||||||
#endif /* OVERFLOWSAFE_TYPE_HPP */
|
#endif /* OVERFLOWSAFE_TYPE_HPP */
|
||||||
|
@@ -81,9 +81,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
template <class Titem, typename Tindex, size_t Tgrowth_step, size_t Tmax_size, PoolType Tpool_type = PT_NORMAL, bool Tcache = false, bool Tzero = true>
|
template <class Titem, typename Tindex, size_t Tgrowth_step, size_t Tmax_size, PoolType Tpool_type = PT_NORMAL, bool Tcache = false, bool Tzero = true>
|
||||||
struct Pool : PoolBase {
|
struct Pool : PoolBase {
|
||||||
/* Ensure Tmax_size is within the bounds of Tindex. */
|
|
||||||
assert_compile((uint64)(Tmax_size - 1) >> 8 * sizeof(Tindex) == 0);
|
|
||||||
|
|
||||||
static const size_t MAX_SIZE = Tmax_size; ///< Make template parameter accessible from outside
|
static const size_t MAX_SIZE = Tmax_size; ///< Make template parameter accessible from outside
|
||||||
|
|
||||||
const char * const name; ///< Name of this pool
|
const char * const name; ///< Name of this pool
|
||||||
|
@@ -12,90 +12,16 @@
|
|||||||
#ifndef SMALLSTACK_TYPE_HPP
|
#ifndef SMALLSTACK_TYPE_HPP
|
||||||
#define SMALLSTACK_TYPE_HPP
|
#define SMALLSTACK_TYPE_HPP
|
||||||
|
|
||||||
#include "smallvec_type.hpp"
|
#include "pool_type.hpp"
|
||||||
#include "../thread/thread.h"
|
#include "pool_func.hpp"
|
||||||
|
|
||||||
/**
|
|
||||||
* A simplified pool which stores values instead of pointers and doesn't
|
|
||||||
* redefine operator new/delete. It also never zeroes memory and always reuses
|
|
||||||
* it.
|
|
||||||
*/
|
|
||||||
template<typename Titem, typename Tindex, Tindex Tgrowth_step, Tindex Tmax_size>
|
|
||||||
class SimplePool {
|
|
||||||
public:
|
|
||||||
inline SimplePool() : first_unused(0), first_free(0), mutex(ThreadMutex::New()) {}
|
|
||||||
inline ~SimplePool() { delete this->mutex; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the mutex. We don't lock the mutex in the pool methods as the
|
|
||||||
* SmallStack isn't necessarily in a consistent state after each method.
|
|
||||||
* @return Mutex.
|
|
||||||
*/
|
|
||||||
inline ThreadMutex *GetMutex() { return this->mutex; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the item at position index.
|
|
||||||
* @return Item at index.
|
|
||||||
*/
|
|
||||||
inline Titem &Get(Tindex index) { return this->data[index]; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new item and return its index.
|
|
||||||
* @return Index of new item.
|
|
||||||
*/
|
|
||||||
inline Tindex Create()
|
|
||||||
{
|
|
||||||
Tindex index = this->FindFirstFree();
|
|
||||||
if (index < Tmax_size) {
|
|
||||||
this->data[index].valid = true;
|
|
||||||
this->first_free = index + 1;
|
|
||||||
this->first_unused = max(this->first_unused, this->first_free);
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy (or rather invalidate) the item at the given index.
|
|
||||||
* @param index Index of item to be destroyed.
|
|
||||||
*/
|
|
||||||
inline void Destroy(Tindex index)
|
|
||||||
{
|
|
||||||
this->data[index].valid = false;
|
|
||||||
this->first_free = min(this->first_free, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
inline Tindex FindFirstFree()
|
|
||||||
{
|
|
||||||
Tindex index = this->first_free;
|
|
||||||
for (; index < this->first_unused; index++) {
|
|
||||||
if (!this->data[index].valid) return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index >= this->data.Length() && index < Tmax_size) {
|
|
||||||
this->data.Resize(index + 1);
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct SimplePoolPoolItem : public Titem {
|
|
||||||
bool valid;
|
|
||||||
};
|
|
||||||
|
|
||||||
Tindex first_unused;
|
|
||||||
Tindex first_free;
|
|
||||||
|
|
||||||
ThreadMutex *mutex;
|
|
||||||
SmallVector<SimplePoolPoolItem, Tgrowth_step> data;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for SmallStack. We cannot add this into SmallStack itself as
|
* Base class for SmallStack. We cannot add this into SmallStack itself as
|
||||||
* certain compilers don't like it.
|
* certain compilers don't like it.
|
||||||
*/
|
*/
|
||||||
template <typename Titem, typename Tindex>
|
template <typename Tindex, typename Titem>
|
||||||
struct SmallStackItem {
|
class SmallStackItem {
|
||||||
|
protected:
|
||||||
Tindex next; ///< Pool index of next item.
|
Tindex next; ///< Pool index of next item.
|
||||||
Titem value; ///< Value of current item.
|
Titem value; ///< Value of current item.
|
||||||
|
|
||||||
@@ -124,30 +50,30 @@ struct SmallStackItem {
|
|||||||
* 5. You can choose your own index type, so that you can align it with your
|
* 5. You can choose your own index type, so that you can align it with your
|
||||||
* value type. E.G. value types of 16 bits length like to be combined with
|
* value type. E.G. value types of 16 bits length like to be combined with
|
||||||
* index types of the same length.
|
* index types of the same length.
|
||||||
* 6. All accesses to the underlying pool are guarded by a mutex and atomic in
|
|
||||||
* the sense that the mutex stays locked until the pool has reacquired a
|
|
||||||
* consistent state. This means that even though a common data structure is
|
|
||||||
* used the SmallStack is still reentrant.
|
|
||||||
* @tparam Titem Value type to be used.
|
* @tparam Titem Value type to be used.
|
||||||
* @tparam Tindex Index type to use for the pool.
|
* @tparam Tindex Index type to use for the pool.
|
||||||
* @tparam Tinvalid Invalid item to keep at the bottom of each stack.
|
* @tparam Tinvalid Invalid item to keep at the bottom of each stack.
|
||||||
* @tparam Tgrowth_step Growth step for pool.
|
* @tparam Tgrowth_step Growth step for pool.
|
||||||
* @tparam Tmax_size Maximum size for pool.
|
* @tparam Tmax_size Maximum size for pool.
|
||||||
*/
|
*/
|
||||||
template <typename Titem, typename Tindex, Titem Tinvalid, Tindex Tgrowth_step, Tindex Tmax_size>
|
template <typename Titem, typename Tindex, Titem Tinvalid, size_t Tgrowth_step, size_t Tmax_size>
|
||||||
class SmallStack : public SmallStackItem<Titem, Tindex> {
|
class SmallStack : public SmallStackItem<Tindex, Titem> {
|
||||||
public:
|
protected:
|
||||||
|
class PooledSmallStack;
|
||||||
typedef SmallStackItem<Titem, Tindex> Item;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SmallStack item that can be kept in a pool.
|
* Create a branch in the pool if necessary.
|
||||||
*/
|
*/
|
||||||
struct PooledSmallStack : public Item {
|
void Branch()
|
||||||
Tindex branch_count; ///< Number of branches in the tree structure this item is parent of
|
{
|
||||||
};
|
if (PooledSmallStack::IsValidID(this->next)) {
|
||||||
|
PooledSmallStack::Get(this->next)->CreateBranch();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef SimplePool<PooledSmallStack, Tindex, Tgrowth_step, Tmax_size> SmallStackPool;
|
public:
|
||||||
|
typedef SmallStackItem<Tindex, Titem> Item;
|
||||||
|
typedef Pool<PooledSmallStack, Tindex, Tgrowth_step, Tmax_size, PT_NORMAL, true, false> SmallStackPool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor for a stack with one or two items in it.
|
* Constructor for a stack with one or two items in it.
|
||||||
@@ -160,8 +86,14 @@ public:
|
|||||||
*/
|
*/
|
||||||
inline ~SmallStack()
|
inline ~SmallStack()
|
||||||
{
|
{
|
||||||
/* Pop() locks the mutex and after each pop the pool is consistent.*/
|
if (PooledSmallStack::IsValidID(this->next)) {
|
||||||
while (this->next != Tmax_size) this->Pop();
|
PooledSmallStack *item = PooledSmallStack::Get(this->next);
|
||||||
|
if (item->NumBranches() == 0) {
|
||||||
|
delete item;
|
||||||
|
} else {
|
||||||
|
item->DeleteBranch();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -178,32 +110,23 @@ public:
|
|||||||
inline SmallStack &operator=(const SmallStack &other)
|
inline SmallStack &operator=(const SmallStack &other)
|
||||||
{
|
{
|
||||||
if (this == &other) return *this;
|
if (this == &other) return *this;
|
||||||
while (this->next != Tmax_size) this->Pop();
|
this->~SmallStack();
|
||||||
this->next = other.next;
|
this->next = other.next;
|
||||||
this->value = other.value;
|
this->value = other.value;
|
||||||
/* Deleting and branching are independent operations, so it's fine to
|
|
||||||
* acquire separate locks for them. */
|
|
||||||
this->Branch();
|
this->Branch();
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pushes a new item onto the stack if there is still space in the
|
* Push a new item onto the stack.
|
||||||
* underlying pool. Otherwise the topmost item's value gets overwritten.
|
|
||||||
* @param item Item to be pushed.
|
* @param item Item to be pushed.
|
||||||
*/
|
*/
|
||||||
inline void Push(const Titem &item)
|
inline void Push(const Titem &item)
|
||||||
{
|
{
|
||||||
if (this->value != Tinvalid) {
|
if (this->value != Tinvalid) {
|
||||||
ThreadMutexLocker lock(_pool.GetMutex());
|
assert(PooledSmallStack::CanAllocateItem());
|
||||||
Tindex new_item = _pool.Create();
|
PooledSmallStack *next = new PooledSmallStack(this->value, this->next);
|
||||||
if (new_item != Tmax_size) {
|
this->next = next->index;
|
||||||
PooledSmallStack &pushed = _pool.Get(new_item);
|
|
||||||
pushed.value = this->value;
|
|
||||||
pushed.next = this->next;
|
|
||||||
pushed.branch_count = 0;
|
|
||||||
this->next = new_item;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this->value = item;
|
this->value = item;
|
||||||
}
|
}
|
||||||
@@ -215,27 +138,18 @@ public:
|
|||||||
inline Titem Pop()
|
inline Titem Pop()
|
||||||
{
|
{
|
||||||
Titem ret = this->value;
|
Titem ret = this->value;
|
||||||
if (this->next == Tmax_size) {
|
if (!PooledSmallStack::IsValidID(this->next)) {
|
||||||
this->value = Tinvalid;
|
this->value = Tinvalid;
|
||||||
} else {
|
} else {
|
||||||
ThreadMutexLocker lock(_pool.GetMutex());
|
PooledSmallStack *next = PooledSmallStack::Get(this->next);
|
||||||
PooledSmallStack &popped = _pool.Get(this->next);
|
static_cast<Item &>(*this) = *next;
|
||||||
this->value = popped.value;
|
if (next->NumBranches() == 0) {
|
||||||
if (popped.branch_count == 0) {
|
delete next;
|
||||||
_pool.Destroy(this->next);
|
|
||||||
} else {
|
} else {
|
||||||
--popped.branch_count;
|
next->DeleteBranch();
|
||||||
/* We can't use Branch() here as we already have the mutex.*/
|
this->Branch();
|
||||||
if (popped.next != Tmax_size) {
|
|
||||||
++(_pool.Get(popped.next).branch_count);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Accessing popped here is no problem as the pool will only set
|
|
||||||
* the validity flag, not actually delete the item, on Destroy().
|
|
||||||
* It's impossible for another thread to acquire the same item in
|
|
||||||
* the mean time because of the mutex. */
|
|
||||||
this->next = popped.next;
|
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,7 +159,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
inline bool IsEmpty() const
|
inline bool IsEmpty() const
|
||||||
{
|
{
|
||||||
return this->value == Tinvalid && this->next == Tmax_size;
|
return this->value == Tinvalid && !PooledSmallStack::IsValidID(this->next);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -256,14 +170,11 @@ public:
|
|||||||
inline bool Contains(const Titem &item) const
|
inline bool Contains(const Titem &item) const
|
||||||
{
|
{
|
||||||
if (item == Tinvalid || item == this->value) return true;
|
if (item == Tinvalid || item == this->value) return true;
|
||||||
if (this->next != Tmax_size) {
|
|
||||||
ThreadMutexLocker lock(_pool.GetMutex());
|
|
||||||
const SmallStack *in_list = this;
|
const SmallStack *in_list = this;
|
||||||
do {
|
while (PooledSmallStack::IsValidID(in_list->next)) {
|
||||||
in_list = static_cast<const SmallStack *>(
|
in_list = static_cast<const SmallStack *>(
|
||||||
static_cast<const Item *>(&_pool.Get(in_list->next)));
|
static_cast<const Item *>(PooledSmallStack::Get(in_list->next)));
|
||||||
if (in_list->value == item) return true;
|
if (in_list->value == item) return true;
|
||||||
} while (in_list->next != Tmax_size);
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -272,15 +183,19 @@ protected:
|
|||||||
static SmallStackPool _pool;
|
static SmallStackPool _pool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a branch in the pool if necessary.
|
* SmallStack item that can be kept in a pool (by having an index).
|
||||||
*/
|
*/
|
||||||
inline void Branch()
|
class PooledSmallStack : public Item, public SmallStackPool::template PoolItem<&SmallStack::_pool> {
|
||||||
{
|
private:
|
||||||
if (this->next != Tmax_size) {
|
Tindex branch_count; ///< Number of branches in the tree structure this item is parent of
|
||||||
ThreadMutexLocker lock(_pool.GetMutex());
|
public:
|
||||||
++(_pool.Get(this->next).branch_count);
|
PooledSmallStack(Titem value, Tindex next) : Item(value, next), branch_count(0) {}
|
||||||
}
|
|
||||||
}
|
inline void CreateBranch() { ++this->branch_count; }
|
||||||
|
inline void DeleteBranch() { --this->branch_count; }
|
||||||
|
inline Tindex NumBranches() { return this->branch_count; }
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -138,14 +138,14 @@ char *CrashLog::LogConfiguration(char *buffer, const char *last) const
|
|||||||
BaseGraphics::GetUsedSet() == NULL ? "none" : BaseGraphics::GetUsedSet()->name,
|
BaseGraphics::GetUsedSet() == NULL ? "none" : BaseGraphics::GetUsedSet()->name,
|
||||||
BaseGraphics::GetUsedSet() == NULL ? UINT32_MAX : BaseGraphics::GetUsedSet()->version,
|
BaseGraphics::GetUsedSet() == NULL ? UINT32_MAX : BaseGraphics::GetUsedSet()->version,
|
||||||
_current_language == NULL ? "none" : _current_language->file,
|
_current_language == NULL ? "none" : _current_language->file,
|
||||||
MusicDriver::GetInstance() == NULL ? "none" : MusicDriver::GetInstance()->GetName(),
|
_music_driver == NULL ? "none" : _music_driver->GetName(),
|
||||||
BaseMusic::GetUsedSet() == NULL ? "none" : BaseMusic::GetUsedSet()->name,
|
BaseMusic::GetUsedSet() == NULL ? "none" : BaseMusic::GetUsedSet()->name,
|
||||||
BaseMusic::GetUsedSet() == NULL ? UINT32_MAX : BaseMusic::GetUsedSet()->version,
|
BaseMusic::GetUsedSet() == NULL ? UINT32_MAX : BaseMusic::GetUsedSet()->version,
|
||||||
_networking ? (_network_server ? "server" : "client") : "no",
|
_networking ? (_network_server ? "server" : "client") : "no",
|
||||||
SoundDriver::GetInstance() == NULL ? "none" : SoundDriver::GetInstance()->GetName(),
|
_sound_driver == NULL ? "none" : _sound_driver->GetName(),
|
||||||
BaseSounds::GetUsedSet() == NULL ? "none" : BaseSounds::GetUsedSet()->name,
|
BaseSounds::GetUsedSet() == NULL ? "none" : BaseSounds::GetUsedSet()->name,
|
||||||
BaseSounds::GetUsedSet() == NULL ? UINT32_MAX : BaseSounds::GetUsedSet()->version,
|
BaseSounds::GetUsedSet() == NULL ? UINT32_MAX : BaseSounds::GetUsedSet()->version,
|
||||||
VideoDriver::GetInstance() == NULL ? "none" : VideoDriver::GetInstance()->GetName()
|
_video_driver == NULL ? "none" : _video_driver->GetName()
|
||||||
);
|
);
|
||||||
|
|
||||||
buffer += seprintf(buffer, last,
|
buffer += seprintf(buffer, last,
|
||||||
@@ -482,7 +482,7 @@ bool CrashLog::MakeCrashLog() const
|
|||||||
*/
|
*/
|
||||||
/* static */ void CrashLog::AfterCrashLogCleanup()
|
/* static */ void CrashLog::AfterCrashLogCleanup()
|
||||||
{
|
{
|
||||||
if (MusicDriver::GetInstance() != NULL) MusicDriver::GetInstance()->Stop();
|
if (_music_driver != NULL) _music_driver->Stop();
|
||||||
if (SoundDriver::GetInstance() != NULL) SoundDriver::GetInstance()->Stop();
|
if (_sound_driver != NULL) _sound_driver->Stop();
|
||||||
if (VideoDriver::GetInstance() != NULL) VideoDriver::GetInstance()->Stop();
|
if (_video_driver != NULL) _video_driver->Stop();
|
||||||
}
|
}
|
||||||
|
@@ -144,14 +144,14 @@ void CheckSwitchToEuro()
|
|||||||
* Will fill _currency_specs array with
|
* Will fill _currency_specs array with
|
||||||
* default values from origin_currency_specs
|
* default values from origin_currency_specs
|
||||||
* Called only from newgrf.cpp and settings.cpp.
|
* Called only from newgrf.cpp and settings.cpp.
|
||||||
* @param preserve_custom will not reset custom currency
|
* @param preserve_custom will not reset custom currency (the latest one on the list)
|
||||||
|
* if ever it is flagged to true. In which case, the total size of the memory to move
|
||||||
|
* will be one currency spec less, thus preserving the custom currency from been
|
||||||
|
* overwritten.
|
||||||
*/
|
*/
|
||||||
void ResetCurrencies(bool preserve_custom)
|
void ResetCurrencies(bool preserve_custom)
|
||||||
{
|
{
|
||||||
for (uint i = 0; i < CURRENCY_END; i++) {
|
memcpy(&_currency_specs, &origin_currency_specs, sizeof(origin_currency_specs) - (preserve_custom ? sizeof(_custom_currency) : 0));
|
||||||
if (preserve_custom && i == CURRENCY_CUSTOM) continue;
|
|
||||||
_currency_specs[i] = origin_currency_specs[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -73,7 +73,7 @@ struct SetDateWindow : Window {
|
|||||||
|
|
||||||
case WID_SD_DAY:
|
case WID_SD_DAY:
|
||||||
for (uint i = 0; i < 31; i++) {
|
for (uint i = 0; i < 31; i++) {
|
||||||
*list->Append() = new DropDownListStringItem(STR_DAY_NUMBER_1ST + i, i + 1, false);
|
*list->Append() = new DropDownListStringItem(STR_ORDINAL_NUMBER_1ST + i, i + 1, false);
|
||||||
}
|
}
|
||||||
selected = this->date.day;
|
selected = this->date.day;
|
||||||
break;
|
break;
|
||||||
@@ -106,7 +106,7 @@ struct SetDateWindow : Window {
|
|||||||
|
|
||||||
case WID_SD_DAY:
|
case WID_SD_DAY:
|
||||||
for (uint i = 0; i < 31; i++) {
|
for (uint i = 0; i < 31; i++) {
|
||||||
d = maxdim(d, GetStringBoundingBox(STR_DAY_NUMBER_1ST + i));
|
d = maxdim(d, GetStringBoundingBox(STR_ORDINAL_NUMBER_1ST + i));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -130,7 +130,7 @@ struct SetDateWindow : Window {
|
|||||||
virtual void SetStringParameters(int widget) const
|
virtual void SetStringParameters(int widget) const
|
||||||
{
|
{
|
||||||
switch (widget) {
|
switch (widget) {
|
||||||
case WID_SD_DAY: SetDParam(0, this->date.day - 1 + STR_DAY_NUMBER_1ST); break;
|
case WID_SD_DAY: SetDParam(0, this->date.day - 1 + STR_ORDINAL_NUMBER_1ST); break;
|
||||||
case WID_SD_MONTH: SetDParam(0, this->date.month + STR_MONTH_JAN); break;
|
case WID_SD_MONTH: SetDParam(0, this->date.month + STR_MONTH_JAN); break;
|
||||||
case WID_SD_YEAR: SetDParam(0, this->date.year); break;
|
case WID_SD_YEAR: SetDParam(0, this->date.year); break;
|
||||||
}
|
}
|
||||||
|
@@ -41,13 +41,13 @@ void CcBuildDocks(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p
|
|||||||
{
|
{
|
||||||
if (result.Failed()) return;
|
if (result.Failed()) return;
|
||||||
|
|
||||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT_WATER, tile);
|
if (_settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT, tile);
|
||||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CcBuildCanal(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
|
void CcBuildCanal(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
|
||||||
{
|
{
|
||||||
if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT_WATER, tile);
|
if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT, tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -16,14 +16,17 @@
|
|||||||
#include "video/video_driver.hpp"
|
#include "video/video_driver.hpp"
|
||||||
#include "string_func.h"
|
#include "string_func.h"
|
||||||
|
|
||||||
|
VideoDriver *_video_driver; ///< The currently active video driver.
|
||||||
char *_ini_videodriver; ///< The video driver a stored in the configuration file.
|
char *_ini_videodriver; ///< The video driver a stored in the configuration file.
|
||||||
int _num_resolutions; ///< The number of resolutions.
|
int _num_resolutions; ///< The number of resolutions.
|
||||||
Dimension _resolutions[32]; ///< List of resolutions.
|
Dimension _resolutions[32]; ///< List of resolutions.
|
||||||
Dimension _cur_resolution; ///< The current resolution.
|
Dimension _cur_resolution; ///< The current resolution.
|
||||||
bool _rightclick_emulate; ///< Whether right clicking is emulated.
|
bool _rightclick_emulate; ///< Whether right clicking is emulated.
|
||||||
|
|
||||||
|
SoundDriver *_sound_driver; ///< The currently active sound driver.
|
||||||
char *_ini_sounddriver; ///< The sound driver a stored in the configuration file.
|
char *_ini_sounddriver; ///< The sound driver a stored in the configuration file.
|
||||||
|
|
||||||
|
MusicDriver *_music_driver; ///< The currently active music driver.
|
||||||
char *_ini_musicdriver; ///< The music driver a stored in the configuration file.
|
char *_ini_musicdriver; ///< The music driver a stored in the configuration file.
|
||||||
|
|
||||||
char *_ini_blitter; ///< The blitter as stored in the configuration file.
|
char *_ini_blitter; ///< The blitter as stored in the configuration file.
|
||||||
@@ -83,25 +86,9 @@ int GetDriverParamInt(const char * const *parm, const char *name, int def)
|
|||||||
* @param type the type of driver to select
|
* @param type the type of driver to select
|
||||||
* @post Sets the driver so GetCurrentDriver() returns it too.
|
* @post Sets the driver so GetCurrentDriver() returns it too.
|
||||||
*/
|
*/
|
||||||
void DriverFactoryBase::SelectDriver(const char *name, Driver::Type type)
|
Driver *DriverFactoryBase::SelectDriver(const char *name, Driver::Type type)
|
||||||
{
|
{
|
||||||
if (!DriverFactoryBase::SelectDriverImpl(name, type)) {
|
if (GetDrivers().size() == 0) return NULL;
|
||||||
StrEmpty(name) ?
|
|
||||||
usererror("Failed to autoprobe %s driver", GetDriverTypeName(type)) :
|
|
||||||
usererror("Failed to select requested %s driver '%s'", GetDriverTypeName(type), name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find the requested driver and return its class.
|
|
||||||
* @param name the driver to select.
|
|
||||||
* @param type the type of driver to select
|
|
||||||
* @post Sets the driver so GetCurrentDriver() returns it too.
|
|
||||||
* @return True upon success, otherwise false.
|
|
||||||
*/
|
|
||||||
bool DriverFactoryBase::SelectDriverImpl(const char *name, Driver::Type type)
|
|
||||||
{
|
|
||||||
if (GetDrivers().size() == 0) return false;
|
|
||||||
|
|
||||||
if (StrEmpty(name)) {
|
if (StrEmpty(name)) {
|
||||||
/* Probe for this driver, but do not fall back to dedicated/null! */
|
/* Probe for this driver, but do not fall back to dedicated/null! */
|
||||||
@@ -114,18 +101,15 @@ bool DriverFactoryBase::SelectDriverImpl(const char *name, Driver::Type type)
|
|||||||
if (d->type != type) continue;
|
if (d->type != type) continue;
|
||||||
if (d->priority != priority) continue;
|
if (d->priority != priority) continue;
|
||||||
|
|
||||||
Driver *oldd = *GetActiveDriver(type);
|
|
||||||
Driver *newd = d->CreateInstance();
|
Driver *newd = d->CreateInstance();
|
||||||
*GetActiveDriver(type) = newd;
|
|
||||||
|
|
||||||
const char *err = newd->Start(NULL);
|
const char *err = newd->Start(NULL);
|
||||||
if (err == NULL) {
|
if (err == NULL) {
|
||||||
DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name);
|
DEBUG(driver, 1, "Successfully probed %s driver '%s'", GetDriverTypeName(type), d->name);
|
||||||
delete oldd;
|
delete *GetActiveDriver(type);
|
||||||
return true;
|
*GetActiveDriver(type) = newd;
|
||||||
|
return newd;
|
||||||
}
|
}
|
||||||
|
|
||||||
*GetActiveDriver(type) = oldd;
|
|
||||||
DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err);
|
DEBUG(driver, 1, "Probing %s driver '%s' failed with error: %s", GetDriverTypeName(type), d->name, err);
|
||||||
delete newd;
|
delete newd;
|
||||||
}
|
}
|
||||||
@@ -174,7 +158,7 @@ bool DriverFactoryBase::SelectDriverImpl(const char *name, Driver::Type type)
|
|||||||
DEBUG(driver, 1, "Successfully loaded %s driver '%s'", GetDriverTypeName(type), d->name);
|
DEBUG(driver, 1, "Successfully loaded %s driver '%s'", GetDriverTypeName(type), d->name);
|
||||||
delete *GetActiveDriver(type);
|
delete *GetActiveDriver(type);
|
||||||
*GetActiveDriver(type) = newd;
|
*GetActiveDriver(type) = newd;
|
||||||
return true;
|
return newd;
|
||||||
}
|
}
|
||||||
usererror("No such %s driver: %s\n", GetDriverTypeName(type), buffer);
|
usererror("No such %s driver: %s\n", GetDriverTypeName(type), buffer);
|
||||||
}
|
}
|
||||||
|
@@ -59,10 +59,6 @@ DECLARE_POSTFIX_INCREMENT(Driver::Type)
|
|||||||
/** Base for all driver factories. */
|
/** Base for all driver factories. */
|
||||||
class DriverFactoryBase {
|
class DriverFactoryBase {
|
||||||
private:
|
private:
|
||||||
friend class MusicDriver;
|
|
||||||
friend class SoundDriver;
|
|
||||||
friend class VideoDriver;
|
|
||||||
|
|
||||||
Driver::Type type; ///< The type of driver.
|
Driver::Type type; ///< The type of driver.
|
||||||
int priority; ///< The priority of this factory.
|
int priority; ///< The priority of this factory.
|
||||||
const char *name; ///< The name of the drivers of this factory.
|
const char *name; ///< The name of the drivers of this factory.
|
||||||
@@ -101,8 +97,6 @@ private:
|
|||||||
return driver_type_name[type];
|
return driver_type_name[type];
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool SelectDriverImpl(const char *name, Driver::Type type);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
DriverFactoryBase(Driver::Type type, int priority, const char *name, const char *description);
|
DriverFactoryBase(Driver::Type type, int priority, const char *name, const char *description);
|
||||||
|
|
||||||
@@ -120,7 +114,7 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SelectDriver(const char *name, Driver::Type type);
|
static Driver *SelectDriver(const char *name, Driver::Type type);
|
||||||
static char *GetDriversInfo(char *p, const char *last);
|
static char *GetDriversInfo(char *p, const char *last);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
220
src/economy.cpp
220
src/economy.cpp
@@ -19,7 +19,6 @@
|
|||||||
#include "network/network_func.h"
|
#include "network/network_func.h"
|
||||||
#include "ai/ai.hpp"
|
#include "ai/ai.hpp"
|
||||||
#include "aircraft.h"
|
#include "aircraft.h"
|
||||||
#include "train.h"
|
|
||||||
#include "newgrf_engine.h"
|
#include "newgrf_engine.h"
|
||||||
#include "engine_base.h"
|
#include "engine_base.h"
|
||||||
#include "ground_vehicle.hpp"
|
#include "ground_vehicle.hpp"
|
||||||
@@ -1067,9 +1066,9 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID dest, Ti
|
|||||||
|
|
||||||
/* Update station statistics */
|
/* Update station statistics */
|
||||||
if (accepted > 0) {
|
if (accepted > 0) {
|
||||||
SetBit(st->goods[cargo_type].status, GoodsEntry::GES_EVER_ACCEPTED);
|
SetBit(st->goods[cargo_type].acceptance_pickup, GoodsEntry::GES_EVER_ACCEPTED);
|
||||||
SetBit(st->goods[cargo_type].status, GoodsEntry::GES_CURRENT_MONTH);
|
SetBit(st->goods[cargo_type].acceptance_pickup, GoodsEntry::GES_CURRENT_MONTH);
|
||||||
SetBit(st->goods[cargo_type].status, GoodsEntry::GES_ACCEPTED_BIGTICK);
|
SetBit(st->goods[cargo_type].acceptance_pickup, GoodsEntry::GES_ACCEPTED_BIGTICK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update company statistics */
|
/* Update company statistics */
|
||||||
@@ -1241,7 +1240,7 @@ void PrepareUnload(Vehicle *front_v)
|
|||||||
const GoodsEntry *ge = &st->goods[v->cargo_type];
|
const GoodsEntry *ge = &st->goods[v->cargo_type];
|
||||||
if (v->cargo_cap > 0 && v->cargo.TotalCount() > 0) {
|
if (v->cargo_cap > 0 && v->cargo.TotalCount() > 0) {
|
||||||
v->cargo.Stage(
|
v->cargo.Stage(
|
||||||
HasBit(ge->status, GoodsEntry::GES_ACCEPTANCE),
|
HasBit(ge->acceptance_pickup, GoodsEntry::GES_ACCEPTANCE),
|
||||||
front_v->last_station_visited, next_station,
|
front_v->last_station_visited, next_station,
|
||||||
front_v->current_order.GetUnloadType(), ge,
|
front_v->current_order.GetUnloadType(), ge,
|
||||||
front_v->cargo_payment);
|
front_v->cargo_payment);
|
||||||
@@ -1339,135 +1338,21 @@ static void ReserveConsist(Station *st, Vehicle *u, CargoArray *consist_capleft,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Iterate the articulated parts of a vehicle, also considering the special cases of "normal"
|
* Checks whether an articulated vehicle is empty.
|
||||||
* aircraft and double headed trains. Apply an action to each vehicle and immediately return false
|
* @param v Vehicle
|
||||||
* if that action does so. Otherwise return true.
|
* @return true if all parts are empty.
|
||||||
* @tparam Taction Class of action to be applied. Must implement bool operator()([const] Vehicle *).
|
|
||||||
* @param v First articulated part.
|
|
||||||
* @param action Instance of Taction.
|
|
||||||
* @return false if any of the action invocations returned false, true otherwise.
|
|
||||||
*/
|
*/
|
||||||
template<class Taction>
|
static bool IsArticulatedVehicleEmpty(Vehicle *v)
|
||||||
bool IterateVehicleParts(Vehicle *v, Taction action)
|
|
||||||
{
|
{
|
||||||
for (Vehicle *w = v; w != NULL;
|
v = v->GetFirstEnginePart();
|
||||||
w = w->HasArticulatedPart() ? w->GetNextArticulatedPart() : NULL) {
|
|
||||||
if (!action(w)) return false;
|
for (; v != NULL; v = v->HasArticulatedPart() ? v->GetNextArticulatedPart() : NULL) {
|
||||||
if (w->type == VEH_TRAIN) {
|
if (v->cargo.StoredCount() != 0) return false;
|
||||||
Train *train = Train::From(w);
|
|
||||||
if (train->IsMultiheaded() && !action(train->other_multiheaded_part)) return false;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (v->type == VEH_AIRCRAFT && Aircraft::From(v)->IsNormalAircraft()) return action(v->Next());
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Action to check if a vehicle has no stored cargo.
|
|
||||||
*/
|
|
||||||
struct IsEmptyAction
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Checks if the vehicle has stored cargo.
|
|
||||||
* @param v Vehicle to be checked.
|
|
||||||
* @return true if v is either empty or has only reserved cargo, false otherwise.
|
|
||||||
*/
|
|
||||||
bool operator()(const Vehicle *v)
|
|
||||||
{
|
|
||||||
return v->cargo.StoredCount() == 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Refit preparation action.
|
|
||||||
*/
|
|
||||||
struct PrepareRefitAction
|
|
||||||
{
|
|
||||||
CargoArray &consist_capleft; ///< Capacities left in the consist.
|
|
||||||
uint32 &refit_mask; ///< Bitmask of possible refit cargoes.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a refit preparation action.
|
|
||||||
* @param consist_capleft Capacities left in consist, to be updated here.
|
|
||||||
* @param refit_mask Refit mask to be constructed from refit information of vehicles.
|
|
||||||
*/
|
|
||||||
PrepareRefitAction(CargoArray &consist_capleft, uint32 &refit_mask) :
|
|
||||||
consist_capleft(consist_capleft), refit_mask(refit_mask) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepares for refitting of a vehicle, subtracting its free capacity from consist_capleft and
|
|
||||||
* adding the cargoes it can refit to to the refit mask.
|
|
||||||
* @param v The vehicle to be refitted.
|
|
||||||
* @return true.
|
|
||||||
*/
|
|
||||||
bool operator()(const Vehicle *v)
|
|
||||||
{
|
|
||||||
this->consist_capleft[v->cargo_type] -= v->cargo_cap - v->cargo.ReservedCount();
|
|
||||||
this->refit_mask |= EngInfo(v->engine_type)->refit_mask;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action for returning reserved cargo.
|
|
||||||
*/
|
|
||||||
struct ReturnCargoAction
|
|
||||||
{
|
|
||||||
Station *st; ///< Station to give the returned cargo to.
|
|
||||||
StationID next_hop; ///< Next hop the cargo should be assigned to.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct a cargo return action.
|
|
||||||
* @param st Station to give the returned cargo to.
|
|
||||||
* @param next_one Next hop the cargo should be assigned to.
|
|
||||||
*/
|
|
||||||
ReturnCargoAction(Station *st, StationID next_one) : st(st), next_hop(next_one) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return all reserved cargo from a vehicle.
|
|
||||||
* @param v Vehicle to return cargo from.
|
|
||||||
* @return true.
|
|
||||||
*/
|
|
||||||
bool operator()(Vehicle *v)
|
|
||||||
{
|
|
||||||
v->cargo.Return(UINT_MAX, &this->st->goods[v->cargo_type].cargo, this->next_hop);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Action for finalizing a refit.
|
|
||||||
*/
|
|
||||||
struct FinalizeRefitAction
|
|
||||||
{
|
|
||||||
CargoArray &consist_capleft; ///< Capacities left in the consist.
|
|
||||||
Station *st; ///< Station to reserve cargo from.
|
|
||||||
StationIDStack &next_station; ///< Next hops to reserve cargo for.
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a finalizing action.
|
|
||||||
* @param consist_capleft Capacities left in the consist.
|
|
||||||
* @param st Station to reserve cargo from.
|
|
||||||
* @param next_station Next hops to reserve cargo for.
|
|
||||||
*/
|
|
||||||
FinalizeRefitAction(CargoArray &consist_capleft, Station *st, StationIDStack &next_station) :
|
|
||||||
consist_capleft(consist_capleft), st(st), next_station(next_station) {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reserve cargo from the station and update the remaining consist capacities with the
|
|
||||||
* vehicle's remaining free capacity.
|
|
||||||
* @param v Vehicle to be finalized.
|
|
||||||
* @return true.
|
|
||||||
*/
|
|
||||||
bool operator()(Vehicle *v)
|
|
||||||
{
|
|
||||||
this->st->goods[v->cargo_type].cargo.Reserve(v->cargo_cap - v->cargo.RemainingCount(),
|
|
||||||
&v->cargo, st->xy, next_station);
|
|
||||||
this->consist_capleft[v->cargo_type] += v->cargo_cap - v->cargo.RemainingCount();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Refit a vehicle in a station.
|
* Refit a vehicle in a station.
|
||||||
* @param v Vehicle to be refitted.
|
* @param v Vehicle to be refitted.
|
||||||
@@ -1478,15 +1363,32 @@ struct FinalizeRefitAction
|
|||||||
*/
|
*/
|
||||||
static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station *st, StationIDStack next_station, CargoID new_cid)
|
static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station *st, StationIDStack next_station, CargoID new_cid)
|
||||||
{
|
{
|
||||||
|
if (v->type == VEH_AIRCRAFT && (!Aircraft::From(v)->IsNormalAircraft() || v->Next()->cargo.StoredCount() > 0)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_normal_aircraft = (v->type == VEH_AIRCRAFT && Aircraft::From(v)->IsNormalAircraft());
|
||||||
Vehicle *v_start = v->GetFirstEnginePart();
|
Vehicle *v_start = v->GetFirstEnginePart();
|
||||||
if (!IterateVehicleParts(v_start, IsEmptyAction())) return;
|
|
||||||
|
/* Remove old capacity from consist capacity */
|
||||||
|
consist_capleft[v_start->cargo_type] -= (v_start->cargo_cap - v_start->cargo.ReservedCount());
|
||||||
|
for (Vehicle *w = v_start; w->HasArticulatedPart(); ) {
|
||||||
|
w = w->GetNextArticulatedPart();
|
||||||
|
consist_capleft[w->cargo_type] -= (w->cargo_cap - w->cargo.ReservedCount());
|
||||||
|
}
|
||||||
|
if (is_normal_aircraft) {
|
||||||
|
consist_capleft[v->Next()->cargo_type] -= (v->Next()->cargo_cap - v->Next()->cargo.ReservedCount());
|
||||||
|
}
|
||||||
|
|
||||||
Backup<CompanyByte> cur_company(_current_company, v->owner, FILE_LINE);
|
Backup<CompanyByte> cur_company(_current_company, v->owner, FILE_LINE);
|
||||||
|
|
||||||
|
/* Check if all articulated parts are empty and collect refit mask. */
|
||||||
uint32 refit_mask = v->GetEngine()->info.refit_mask;
|
uint32 refit_mask = v->GetEngine()->info.refit_mask;
|
||||||
|
Vehicle *w = v_start;
|
||||||
/* Remove old capacity from consist capacity and collect refit mask. */
|
while (w->HasArticulatedPart()) {
|
||||||
IterateVehicleParts(v_start, PrepareRefitAction(consist_capleft, refit_mask));
|
w = w->GetNextArticulatedPart();
|
||||||
|
refit_mask |= EngInfo(w->engine_type)->refit_mask;
|
||||||
|
}
|
||||||
|
|
||||||
if (new_cid == CT_AUTO_REFIT) {
|
if (new_cid == CT_AUTO_REFIT) {
|
||||||
/* Get a refittable cargo type with waiting cargo for next_station or INVALID_STATION. */
|
/* Get a refittable cargo type with waiting cargo for next_station or INVALID_STATION. */
|
||||||
@@ -1499,13 +1401,8 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station
|
|||||||
DoCommand(v_start->tile, v_start->index, cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_QUERY_COST, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts.
|
DoCommand(v_start->tile, v_start->index, cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_QUERY_COST, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts.
|
||||||
/* Try to balance different loadable cargoes between parts of the consist, so that
|
/* Try to balance different loadable cargoes between parts of the consist, so that
|
||||||
* all of them can be loaded. Avoid a situation where all vehicles suddenly switch
|
* all of them can be loaded. Avoid a situation where all vehicles suddenly switch
|
||||||
* to the first loadable cargo for which there is only one packet. If the capacities
|
* to the first loadable cargo for which there is only one packet. */
|
||||||
* are equal refit to the cargo of which most is available. This is important for
|
if (_returned_refit_capacity > 0 && consist_capleft[cid] < consist_capleft[new_cid]) {
|
||||||
* consists of only a single vehicle as those will generally have a consist_capleft
|
|
||||||
* of 0 for all cargoes. */
|
|
||||||
if (_returned_refit_capacity > 0 && (consist_capleft[cid] < consist_capleft[new_cid] ||
|
|
||||||
(consist_capleft[cid] == consist_capleft[new_cid] &&
|
|
||||||
st->goods[cid].cargo.AvailableCount() > st->goods[new_cid].cargo.AvailableCount()))) {
|
|
||||||
new_cid = cid;
|
new_cid = cid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1514,13 +1411,29 @@ static void HandleStationRefit(Vehicle *v, CargoArray &consist_capleft, Station
|
|||||||
|
|
||||||
/* Refit if given a valid cargo. */
|
/* Refit if given a valid cargo. */
|
||||||
if (new_cid < NUM_CARGO && new_cid != v_start->cargo_type) {
|
if (new_cid < NUM_CARGO && new_cid != v_start->cargo_type) {
|
||||||
IterateVehicleParts(v_start, ReturnCargoAction(st, StationIDStack(next_station).Pop()));
|
StationID next_one = StationIDStack(next_station).Pop();
|
||||||
|
v_start->cargo.Return(UINT_MAX, &st->goods[v_start->cargo_type].cargo, next_one);
|
||||||
|
for (w = v_start; w->HasArticulatedPart();) {
|
||||||
|
w = w->GetNextArticulatedPart();
|
||||||
|
w->cargo.Return(UINT_MAX, &st->goods[w->cargo_type].cargo, next_one);
|
||||||
|
}
|
||||||
|
if (is_normal_aircraft) {
|
||||||
|
v->Next()->cargo.Return(UINT_MAX, &st->goods[v->Next()->cargo_type].cargo, next_one);
|
||||||
|
}
|
||||||
CommandCost cost = DoCommand(v_start->tile, v_start->index, new_cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_EXEC, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts.
|
CommandCost cost = DoCommand(v_start->tile, v_start->index, new_cid | 1U << 6 | 0xFF << 8 | 1U << 16, DC_EXEC, GetCmdRefitVeh(v_start)); // Auto-refit and only this vehicle including artic parts.
|
||||||
if (cost.Succeeded()) v->First()->profit_this_year -= cost.GetCost() << 8;
|
if (cost.Succeeded()) v->First()->profit_this_year -= cost.GetCost() << 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add new capacity to consist capacity and reserve cargo */
|
/* Add new capacity to consist capacity and reserve cargo */
|
||||||
IterateVehicleParts(v_start, FinalizeRefitAction(consist_capleft, st, next_station));
|
w = v_start;
|
||||||
|
do {
|
||||||
|
st->goods[w->cargo_type].cargo.Reserve(w->cargo_cap, &w->cargo, st->xy, next_station);
|
||||||
|
consist_capleft[w->cargo_type] += w->cargo_cap - w->cargo.RemainingCount();
|
||||||
|
w = w->HasArticulatedPart() ? w->GetNextArticulatedPart() : NULL;
|
||||||
|
} while (w != NULL);
|
||||||
|
if (is_normal_aircraft) {
|
||||||
|
consist_capleft[v->Next()->cargo_type] += v->Next()->cargo_cap - v->Next()->cargo.RemainingCount();
|
||||||
|
}
|
||||||
|
|
||||||
cur_company.Restore();
|
cur_company.Restore();
|
||||||
}
|
}
|
||||||
@@ -1590,12 +1503,12 @@ static void LoadUnloadVehicle(Vehicle *front)
|
|||||||
|
|
||||||
payment->SetCargo(v->cargo_type);
|
payment->SetCargo(v->cargo_type);
|
||||||
|
|
||||||
if (!HasBit(ge->status, GoodsEntry::GES_ACCEPTANCE) && v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER) > 0) {
|
if (!HasBit(ge->acceptance_pickup, GoodsEntry::GES_ACCEPTANCE) && v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER) > 0) {
|
||||||
/* The station does not accept our goods anymore. */
|
/* The station does not accept our goods anymore. */
|
||||||
if (front->current_order.GetUnloadType() & (OUFB_TRANSFER | OUFB_UNLOAD)) {
|
if (front->current_order.GetUnloadType() & (OUFB_TRANSFER | OUFB_UNLOAD)) {
|
||||||
/* Transfer instead of delivering. */
|
/* Transfer instead of delivering. */
|
||||||
v->cargo.Reassign<VehicleCargoList::MTA_DELIVER, VehicleCargoList::MTA_TRANSFER>(
|
v->cargo.Reassign(v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER),
|
||||||
v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER), INVALID_STATION);
|
VehicleCargoList::MTA_DELIVER, VehicleCargoList::MTA_TRANSFER);
|
||||||
} else {
|
} else {
|
||||||
uint new_remaining = v->cargo.RemainingCount() + v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER);
|
uint new_remaining = v->cargo.RemainingCount() + v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER);
|
||||||
if (v->cargo_cap < new_remaining) {
|
if (v->cargo_cap < new_remaining) {
|
||||||
@@ -1604,8 +1517,8 @@ static void LoadUnloadVehicle(Vehicle *front)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Keep instead of delivering. This may lead to no cargo being unloaded, so ...*/
|
/* Keep instead of delivering. This may lead to no cargo being unloaded, so ...*/
|
||||||
v->cargo.Reassign<VehicleCargoList::MTA_DELIVER, VehicleCargoList::MTA_KEEP>(
|
v->cargo.Reassign(v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER),
|
||||||
v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER));
|
VehicleCargoList::MTA_DELIVER, VehicleCargoList::MTA_KEEP);
|
||||||
|
|
||||||
/* ... say we unloaded something, otherwise we'll think we didn't unload
|
/* ... say we unloaded something, otherwise we'll think we didn't unload
|
||||||
* something and we didn't load something, so we must be finished
|
* something and we didn't load something, so we must be finished
|
||||||
@@ -1615,18 +1528,8 @@ static void LoadUnloadVehicle(Vehicle *front)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->cargo.ActionCount(VehicleCargoList::MTA_TRANSFER) > 0) {
|
|
||||||
/* Mark the station dirty if we transfer, but not if we only deliver. */
|
/* Mark the station dirty if we transfer, but not if we only deliver. */
|
||||||
dirty_station = true;
|
dirty_station = v->cargo.ActionCount(VehicleCargoList::MTA_TRANSFER) > 0;
|
||||||
|
|
||||||
if (!ge->HasRating()) {
|
|
||||||
/* Upon transfering cargo, make sure the station has a rating. Fake a pickup for the
|
|
||||||
* first unload to prevent the cargo from quickly decaying after the initial drop. */
|
|
||||||
ge->time_since_pickup = 0;
|
|
||||||
SetBit(ge->status, GoodsEntry::GES_RATING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
amount_unloaded = v->cargo.Unload(amount_unloaded, &ge->cargo, payment);
|
amount_unloaded = v->cargo.Unload(amount_unloaded, &ge->cargo, payment);
|
||||||
remaining = v->cargo.UnloadCount() > 0;
|
remaining = v->cargo.UnloadCount() > 0;
|
||||||
if (amount_unloaded > 0) {
|
if (amount_unloaded > 0) {
|
||||||
@@ -1652,7 +1555,7 @@ static void LoadUnloadVehicle(Vehicle *front)
|
|||||||
if (front->current_order.GetLoadType() & OLFB_NO_LOAD || HasBit(front->vehicle_flags, VF_STOP_LOADING)) continue;
|
if (front->current_order.GetLoadType() & OLFB_NO_LOAD || HasBit(front->vehicle_flags, VF_STOP_LOADING)) continue;
|
||||||
|
|
||||||
/* This order has a refit, if this is the first vehicle part carrying cargo and the whole vehicle is empty, try refitting. */
|
/* This order has a refit, if this is the first vehicle part carrying cargo and the whole vehicle is empty, try refitting. */
|
||||||
if (front->current_order.IsRefit() && artic_part == 1) {
|
if (front->current_order.IsRefit() && artic_part == 1 && IsArticulatedVehicleEmpty(v)) {
|
||||||
HandleStationRefit(v, consist_capleft, st, next_station, front->current_order.GetRefitCargo());
|
HandleStationRefit(v, consist_capleft, st, next_station, front->current_order.GetRefitCargo());
|
||||||
ge = &st->goods[v->cargo_type];
|
ge = &st->goods[v->cargo_type];
|
||||||
}
|
}
|
||||||
@@ -1835,7 +1738,6 @@ static void LoadUnloadVehicle(Vehicle *front)
|
|||||||
if (dirty_station) {
|
if (dirty_station) {
|
||||||
st->MarkTilesDirty(true);
|
st->MarkTilesDirty(true);
|
||||||
SetWindowDirty(WC_STATION_VIEW, last_visited);
|
SetWindowDirty(WC_STATION_VIEW, last_visited);
|
||||||
InvalidateWindowData(WC_STATION_LIST, last_visited);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -627,7 +627,7 @@ bool SettingsDisableElrail(int32 p1)
|
|||||||
FOR_ALL_TRAINS(t) {
|
FOR_ALL_TRAINS(t) {
|
||||||
/* power and acceleration is cached only for front engines */
|
/* power and acceleration is cached only for front engines */
|
||||||
if (t->IsFrontEngine()) {
|
if (t->IsFrontEngine()) {
|
||||||
t->ConsistChanged(CCF_TRACK);
|
t->ConsistChanged(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -16,8 +16,6 @@
|
|||||||
#include "company_type.h"
|
#include "company_type.h"
|
||||||
#include "core/geometry_type.hpp"
|
#include "core/geometry_type.hpp"
|
||||||
|
|
||||||
struct GRFFile;
|
|
||||||
|
|
||||||
/** Message severity/type */
|
/** Message severity/type */
|
||||||
enum WarningLevel {
|
enum WarningLevel {
|
||||||
WL_INFO, ///< Used for DoCommand-like (and some non-fatal AI GUI) errors/information
|
WL_INFO, ///< Used for DoCommand-like (and some non-fatal AI GUI) errors/information
|
||||||
@@ -32,7 +30,6 @@ protected:
|
|||||||
uint duration; ///< Length of display of the message. 0 means forever,
|
uint duration; ///< Length of display of the message. 0 means forever,
|
||||||
uint64 decode_params[20]; ///< Parameters of the message strings.
|
uint64 decode_params[20]; ///< Parameters of the message strings.
|
||||||
const char *strings[20]; ///< Copies of raw strings that were used.
|
const char *strings[20]; ///< Copies of raw strings that were used.
|
||||||
const GRFFile *textref_stack_grffile; ///< NewGRF that filled the #TextRefStack for the error message.
|
|
||||||
uint textref_stack_size; ///< Number of uint32 values to put on the #TextRefStack for the error message.
|
uint textref_stack_size; ///< Number of uint32 values to put on the #TextRefStack for the error message.
|
||||||
uint32 textref_stack[16]; ///< Values to put on the #TextRefStack for the error message.
|
uint32 textref_stack[16]; ///< Values to put on the #TextRefStack for the error message.
|
||||||
StringID summary_msg; ///< General error message showed in first line. Must be valid.
|
StringID summary_msg; ///< General error message showed in first line. Must be valid.
|
||||||
@@ -43,7 +40,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
ErrorMessageData(const ErrorMessageData &data);
|
ErrorMessageData(const ErrorMessageData &data);
|
||||||
~ErrorMessageData();
|
~ErrorMessageData();
|
||||||
ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration = 0, int x = 0, int y = 0, const GRFFile *textref_stack_grffile = NULL, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
|
ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration = 0, int x = 0, int y = 0, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
|
||||||
|
|
||||||
/** Check whether error window shall display a company manager face */
|
/** Check whether error window shall display a company manager face */
|
||||||
bool HasFace() const { return face != INVALID_COMPANY; }
|
bool HasFace() const { return face != INVALID_COMPANY; }
|
||||||
@@ -56,7 +53,7 @@ public:
|
|||||||
|
|
||||||
void ScheduleErrorMessage(const ErrorMessageData &data);
|
void ScheduleErrorMessage(const ErrorMessageData &data);
|
||||||
|
|
||||||
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0, const GRFFile *textref_stack_grffile = NULL, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
|
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
|
||||||
void ClearErrorMessages();
|
void ClearErrorMessages();
|
||||||
void ShowFirstError();
|
void ShowFirstError();
|
||||||
void UnshowCriticalError();
|
void UnshowCriticalError();
|
||||||
|
@@ -94,13 +94,11 @@ ErrorMessageData::~ErrorMessageData()
|
|||||||
* @param duration The amount of time to show this error message.
|
* @param duration The amount of time to show this error message.
|
||||||
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||||
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||||
* @param textref_stack_grffile NewGRF that provides the #TextRefStack for the error message.
|
|
||||||
* @param textref_stack_size Number of uint32 values to put on the #TextRefStack for the error message; 0 if the #TextRefStack shall not be used.
|
* @param textref_stack_size Number of uint32 values to put on the #TextRefStack for the error message; 0 if the #TextRefStack shall not be used.
|
||||||
* @param textref_stack Values to put on the #TextRefStack.
|
* @param textref_stack Values to put on the #TextRefStack.
|
||||||
*/
|
*/
|
||||||
ErrorMessageData::ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration, int x, int y, const GRFFile *textref_stack_grffile, uint textref_stack_size, const uint32 *textref_stack) :
|
ErrorMessageData::ErrorMessageData(StringID summary_msg, StringID detailed_msg, uint duration, int x, int y, uint textref_stack_size, const uint32 *textref_stack) :
|
||||||
duration(duration),
|
duration(duration),
|
||||||
textref_stack_grffile(textref_stack_grffile),
|
|
||||||
textref_stack_size(textref_stack_size),
|
textref_stack_size(textref_stack_size),
|
||||||
summary_msg(summary_msg),
|
summary_msg(summary_msg),
|
||||||
detailed_msg(detailed_msg),
|
detailed_msg(detailed_msg),
|
||||||
@@ -128,7 +126,7 @@ void ErrorMessageData::CopyOutDParams()
|
|||||||
memset(this->strings, 0, sizeof(this->strings));
|
memset(this->strings, 0, sizeof(this->strings));
|
||||||
|
|
||||||
/* Get parameters using type information */
|
/* Get parameters using type information */
|
||||||
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_grffile, this->textref_stack_size, this->textref_stack);
|
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_size, this->textref_stack);
|
||||||
CopyOutDParam(this->decode_params, this->strings, this->detailed_msg == INVALID_STRING_ID ? this->summary_msg : this->detailed_msg, lengthof(this->decode_params));
|
CopyOutDParam(this->decode_params, this->strings, this->detailed_msg == INVALID_STRING_ID ? this->summary_msg : this->detailed_msg, lengthof(this->decode_params));
|
||||||
if (this->textref_stack_size > 0) StopTextRefStackUsage();
|
if (this->textref_stack_size > 0) StopTextRefStackUsage();
|
||||||
|
|
||||||
@@ -183,7 +181,7 @@ public:
|
|||||||
if (widget != WID_EM_MESSAGE) return;
|
if (widget != WID_EM_MESSAGE) return;
|
||||||
|
|
||||||
CopyInDParam(0, this->decode_params, lengthof(this->decode_params));
|
CopyInDParam(0, this->decode_params, lengthof(this->decode_params));
|
||||||
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_grffile, this->textref_stack_size, this->textref_stack);
|
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_size, this->textref_stack);
|
||||||
|
|
||||||
int text_width = max(0, (int)size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT);
|
int text_width = max(0, (int)size->width - WD_FRAMETEXT_LEFT - WD_FRAMETEXT_RIGHT);
|
||||||
this->height_summary = GetStringHeight(this->summary_msg, text_width);
|
this->height_summary = GetStringHeight(this->summary_msg, text_width);
|
||||||
@@ -255,7 +253,7 @@ public:
|
|||||||
|
|
||||||
case WID_EM_MESSAGE:
|
case WID_EM_MESSAGE:
|
||||||
CopyInDParam(0, this->decode_params, lengthof(this->decode_params));
|
CopyInDParam(0, this->decode_params, lengthof(this->decode_params));
|
||||||
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_grffile, this->textref_stack_size, this->textref_stack);
|
if (this->textref_stack_size > 0) StartTextRefStackUsage(this->textref_stack_size, this->textref_stack);
|
||||||
|
|
||||||
if (this->detailed_msg == INVALID_STRING_ID) {
|
if (this->detailed_msg == INVALID_STRING_ID) {
|
||||||
DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM,
|
DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom - WD_FRAMERECT_BOTTOM,
|
||||||
@@ -360,20 +358,19 @@ void UnshowCriticalError()
|
|||||||
* @param wl Message severity.
|
* @param wl Message severity.
|
||||||
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
* @param x World X position (TileVirtX) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||||
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
* @param y World Y position (TileVirtY) of the error location. Set both x and y to 0 to just center the message when there is no related error tile.
|
||||||
* @param textref_stack_grffile NewGRF providing the #TextRefStack for the error message.
|
|
||||||
* @param textref_stack_size Number of uint32 values to put on the #TextRefStack for the error message; 0 if the #TextRefStack shall not be used.
|
* @param textref_stack_size Number of uint32 values to put on the #TextRefStack for the error message; 0 if the #TextRefStack shall not be used.
|
||||||
* @param textref_stack Values to put on the #TextRefStack.
|
* @param textref_stack Values to put on the #TextRefStack.
|
||||||
*/
|
*/
|
||||||
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x, int y, const GRFFile *textref_stack_grffile, uint textref_stack_size, const uint32 *textref_stack)
|
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x, int y, uint textref_stack_size, const uint32 *textref_stack)
|
||||||
{
|
{
|
||||||
assert(textref_stack_size == 0 || (textref_stack_grffile != NULL && textref_stack != NULL));
|
assert(textref_stack_size == 0 || textref_stack != NULL);
|
||||||
if (summary_msg == STR_NULL) summary_msg = STR_EMPTY;
|
if (summary_msg == STR_NULL) summary_msg = STR_EMPTY;
|
||||||
|
|
||||||
if (wl != WL_INFO) {
|
if (wl != WL_INFO) {
|
||||||
/* Print message to console */
|
/* Print message to console */
|
||||||
char buf[DRAW_STRING_BUFFER];
|
char buf[DRAW_STRING_BUFFER];
|
||||||
|
|
||||||
if (textref_stack_size > 0) StartTextRefStackUsage(textref_stack_grffile, textref_stack_size, textref_stack);
|
if (textref_stack_size > 0) StartTextRefStackUsage(textref_stack_size, textref_stack);
|
||||||
|
|
||||||
char *b = GetString(buf, summary_msg, lastof(buf));
|
char *b = GetString(buf, summary_msg, lastof(buf));
|
||||||
if (detailed_msg != INVALID_STRING_ID) {
|
if (detailed_msg != INVALID_STRING_ID) {
|
||||||
@@ -393,7 +390,7 @@ void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel
|
|||||||
|
|
||||||
if (_settings_client.gui.errmsg_duration == 0 && !no_timeout) return;
|
if (_settings_client.gui.errmsg_duration == 0 && !no_timeout) return;
|
||||||
|
|
||||||
ErrorMessageData data(summary_msg, detailed_msg, no_timeout ? 0 : _settings_client.gui.errmsg_duration, x, y, textref_stack_grffile, textref_stack_size, textref_stack);
|
ErrorMessageData data(summary_msg, detailed_msg, no_timeout ? 0 : _settings_client.gui.errmsg_duration, x, y, textref_stack_size, textref_stack);
|
||||||
data.CopyOutDParams();
|
data.CopyOutDParams();
|
||||||
|
|
||||||
ErrmsgWindow *w = (ErrmsgWindow*)FindWindowById(WC_ERRMSG, 0);
|
ErrmsgWindow *w = (ErrmsgWindow*)FindWindowById(WC_ERRMSG, 0);
|
||||||
|
@@ -849,17 +849,12 @@ bool TarScanner::AddFile(const char *filename, size_t basepath_length, const cha
|
|||||||
|
|
||||||
char *pos = link;
|
char *pos = link;
|
||||||
while (*pos != '\0') {
|
while (*pos != '\0') {
|
||||||
char *next = strchr(pos, PATHSEPCHAR);
|
char *next = strchr(link, PATHSEPCHAR);
|
||||||
if (next == NULL) {
|
if (next == NULL) next = pos + strlen(pos);
|
||||||
next = pos + strlen(pos);
|
|
||||||
} else {
|
|
||||||
/* Terminate the substring up to the path separator character. */
|
|
||||||
*next++= '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(pos, ".") == 0) {
|
|
||||||
/* Skip '.' (current dir) */
|
/* Skip '.' (current dir) */
|
||||||
} else if (strcmp(pos, "..") == 0) {
|
if (next != pos + 1 || pos[0] != '.') {
|
||||||
|
if (next == pos + 2 && pos[0] == '.' && pos[1] == '.') {
|
||||||
/* level up */
|
/* level up */
|
||||||
if (dest[0] == '\0') {
|
if (dest[0] == '\0') {
|
||||||
DEBUG(misc, 1, "Ignoring link pointing outside of data directory: %s -> %s", name, link);
|
DEBUG(misc, 1, "Ignoring link pointing outside of data directory: %s -> %s", name, link);
|
||||||
@@ -870,17 +865,13 @@ bool TarScanner::AddFile(const char *filename, size_t basepath_length, const cha
|
|||||||
* This assumes that the truncated part is a real directory and not a link. */
|
* This assumes that the truncated part is a real directory and not a link. */
|
||||||
destpos = strrchr(dest, PATHSEPCHAR);
|
destpos = strrchr(dest, PATHSEPCHAR);
|
||||||
if (destpos == NULL) destpos = dest;
|
if (destpos == NULL) destpos = dest;
|
||||||
*destpos = '\0';
|
|
||||||
} else {
|
} else {
|
||||||
/* Append at end of 'dest' */
|
/* Append at end of 'dest' */
|
||||||
if (destpos != dest) destpos = strecpy(destpos, PATHSEP, lastof(dest));
|
if (destpos != dest) *(destpos++) = PATHSEPCHAR;
|
||||||
destpos = strecpy(destpos, pos, lastof(dest));
|
strncpy(destpos, pos, next - pos); // Safe as we do '\0'-termination ourselves
|
||||||
|
destpos += next - pos;
|
||||||
}
|
}
|
||||||
|
*destpos = '\0';
|
||||||
if (destpos >= lastof(dest)) {
|
|
||||||
DEBUG(misc, 0, "The length of a link in tar-file '%s' is too large (malformed?)", filename);
|
|
||||||
fclose(f);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = next;
|
pos = next;
|
||||||
|
@@ -400,10 +400,6 @@ FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file,
|
|||||||
* .SS1 Transport Tycoon Deluxe preset game
|
* .SS1 Transport Tycoon Deluxe preset game
|
||||||
* .SV1 Transport Tycoon Deluxe (Patch) saved game
|
* .SV1 Transport Tycoon Deluxe (Patch) saved game
|
||||||
* .SV2 Transport Tycoon Deluxe (Patch) saved 2-player game */
|
* .SV2 Transport Tycoon Deluxe (Patch) saved 2-player game */
|
||||||
|
|
||||||
/* Don't crash if we supply no extension */
|
|
||||||
if (ext == NULL) return FIOS_TYPE_INVALID;
|
|
||||||
|
|
||||||
if (strcasecmp(ext, ".sav") == 0) {
|
if (strcasecmp(ext, ".sav") == 0) {
|
||||||
GetFileTitle(file, title, last, SAVE_DIR);
|
GetFileTitle(file, title, last, SAVE_DIR);
|
||||||
return FIOS_TYPE_FILE;
|
return FIOS_TYPE_FILE;
|
||||||
|
@@ -133,11 +133,9 @@ static const NWidgetPart _nested_load_heightmap_dialog_widgets[] = {
|
|||||||
SetDataTip(0x0, STR_SAVELOAD_LIST_TOOLTIP), SetResize(1, 10), SetScrollbar(WID_SL_SCROLLBAR), EndContainer(),
|
SetDataTip(0x0, STR_SAVELOAD_LIST_TOOLTIP), SetResize(1, 10), SetScrollbar(WID_SL_SCROLLBAR), EndContainer(),
|
||||||
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR),
|
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SL_SCROLLBAR),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
|
NWidget(NWID_HORIZONTAL),
|
||||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_CONTENT_DOWNLOAD), SetResize(1, 0), SetFill(1, 0),
|
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_CONTENT_DOWNLOAD), SetResize(1, 0),
|
||||||
SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
|
SetDataTip(STR_INTRO_ONLINE_CONTENT, STR_INTRO_TOOLTIP_ONLINE_CONTENT),
|
||||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_SL_LOAD_BUTTON), SetResize(1, 0), SetFill(1, 0),
|
|
||||||
SetDataTip(STR_SAVELOAD_LOAD_BUTTON, STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP),
|
|
||||||
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
|
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
EndContainer(),
|
EndContainer(),
|
||||||
@@ -523,22 +521,17 @@ public:
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WID_SL_LOAD_BUTTON:
|
case WID_SL_LOAD_BUTTON:
|
||||||
if (this->selected != NULL && !_load_check_data.HasErrors()) {
|
if (this->selected != NULL && !_load_check_data.HasErrors() && (_load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs())) {
|
||||||
|
_switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD_GAME;
|
||||||
|
|
||||||
const char *name = FiosBrowseTo(this->selected);
|
const char *name = FiosBrowseTo(this->selected);
|
||||||
SetFiosType(this->selected->type);
|
SetFiosType(this->selected->type);
|
||||||
|
|
||||||
strecpy(_file_to_saveload.name, name, lastof(_file_to_saveload.name));
|
strecpy(_file_to_saveload.name, name, lastof(_file_to_saveload.name));
|
||||||
strecpy(_file_to_saveload.title, this->selected->title, lastof(_file_to_saveload.title));
|
strecpy(_file_to_saveload.title, this->selected->title, lastof(_file_to_saveload.title));
|
||||||
|
|
||||||
if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
|
|
||||||
delete this;
|
|
||||||
ShowHeightmapLoad();
|
|
||||||
} else if (!_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs()) {
|
|
||||||
_switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD_GAME;
|
|
||||||
ClearErrorMessages();
|
ClearErrorMessages();
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WID_SL_NEWGRF_INFO:
|
case WID_SL_NEWGRF_INFO:
|
||||||
@@ -550,7 +543,7 @@ public:
|
|||||||
case WID_SL_MISSING_NEWGRFS:
|
case WID_SL_MISSING_NEWGRFS:
|
||||||
if (!_network_available) {
|
if (!_network_available) {
|
||||||
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
|
||||||
} else if (_load_check_data.HasNewGrfs()) {
|
} else {
|
||||||
#if defined(ENABLE_NETWORK)
|
#if defined(ENABLE_NETWORK)
|
||||||
ShowMissingContentWindow(_load_check_data.grfconfig);
|
ShowMissingContentWindow(_load_check_data.grfconfig);
|
||||||
#endif
|
#endif
|
||||||
@@ -686,12 +679,9 @@ public:
|
|||||||
case 1:
|
case 1:
|
||||||
/* Selection changes */
|
/* Selection changes */
|
||||||
if (!gui_scope) break;
|
if (!gui_scope) break;
|
||||||
if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
|
|
||||||
this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, this->selected == NULL || _load_check_data.HasErrors());
|
|
||||||
}
|
|
||||||
if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
|
if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
|
||||||
this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON,
|
this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON,
|
||||||
this->selected == NULL || _load_check_data.HasErrors() || !(!_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs()));
|
this->selected == NULL || _load_check_data.HasErrors() || !(_load_check_data.grf_compatibility != GLC_NOT_FOUND || _settings_client.gui.UserIsAllowedToChangeNewGRFs()));
|
||||||
this->SetWidgetDisabledState(WID_SL_NEWGRF_INFO,
|
this->SetWidgetDisabledState(WID_SL_NEWGRF_INFO,
|
||||||
!_load_check_data.HasNewGrfs());
|
!_load_check_data.HasNewGrfs());
|
||||||
this->SetWidgetDisabledState(WID_SL_MISSING_NEWGRFS,
|
this->SetWidgetDisabledState(WID_SL_MISSING_NEWGRFS,
|
||||||
|
@@ -274,35 +274,23 @@ FreeTypeFontCache::FreeTypeFontCache(FontSize fs, FT_Face face, int pixels) : Fo
|
|||||||
}
|
}
|
||||||
|
|
||||||
FT_Error err = FT_Set_Pixel_Sizes(this->face, 0, pixels);
|
FT_Error err = FT_Set_Pixel_Sizes(this->face, 0, pixels);
|
||||||
if (err != FT_Err_Ok) {
|
if (err == FT_Err_Invalid_Pixel_Size) {
|
||||||
|
|
||||||
/* Find nearest size to that requested */
|
/* Find nearest size to that requested */
|
||||||
FT_Bitmap_Size *bs = this->face->available_sizes;
|
FT_Bitmap_Size *bs = this->face->available_sizes;
|
||||||
int i = this->face->num_fixed_sizes;
|
int i = this->face->num_fixed_sizes;
|
||||||
if (i > 0) { // In pathetic cases one might get no fixed sizes at all.
|
|
||||||
int n = bs->height;
|
int n = bs->height;
|
||||||
FT_Int chosen = 0;
|
|
||||||
for (; --i; bs++) {
|
for (; --i; bs++) {
|
||||||
if (abs(pixels - bs->height) >= abs(pixels - n)) continue;
|
if (abs(pixels - bs->height) < abs(pixels - n)) n = bs->height;
|
||||||
n = bs->height;
|
|
||||||
chosen = this->face->num_fixed_sizes - i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Don't use FT_Set_Pixel_Sizes here - it might give us another
|
FT_Set_Pixel_Sizes(this->face, 0, n);
|
||||||
* error, even though the size is available (FS#5885). */
|
|
||||||
err = FT_Select_Size(this->face, chosen);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (err == FT_Err_Ok) {
|
|
||||||
this->units_per_em = this->face->units_per_EM;
|
this->units_per_em = this->face->units_per_EM;
|
||||||
this->ascender = this->face->size->metrics.ascender >> 6;
|
this->ascender = this->face->size->metrics.ascender >> 6;
|
||||||
this->descender = this->face->size->metrics.descender >> 6;
|
this->descender = this->face->size->metrics.descender >> 6;
|
||||||
this->height = this->ascender - this->descender;
|
this->height = this->ascender - this->descender;
|
||||||
} else {
|
|
||||||
/* Both FT_Set_Pixel_Sizes and FT_Select_Size failed. */
|
|
||||||
DEBUG(freetype, 0, "Font size selection failed. Using FontCache defaults.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -392,7 +392,7 @@ FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
|
|||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) && !defined(__LP64__)
|
#if (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5) && !__LP64__
|
||||||
/* This type was introduced with the 10.5 SDK. */
|
/* This type was introduced with the 10.5 SDK. */
|
||||||
#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5)
|
#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5)
|
||||||
#define ATSFSSpec FSSpec
|
#define ATSFSSpec FSSpec
|
||||||
|
@@ -67,8 +67,6 @@
|
|||||||
#include "../script/api/game/game_station.hpp.sq"
|
#include "../script/api/game/game_station.hpp.sq"
|
||||||
#include "../script/api/game/game_stationlist.hpp.sq"
|
#include "../script/api/game/game_stationlist.hpp.sq"
|
||||||
#include "../script/api/game/game_story_page.hpp.sq"
|
#include "../script/api/game/game_story_page.hpp.sq"
|
||||||
#include "../script/api/game/game_storypageelementlist.hpp.sq"
|
|
||||||
#include "../script/api/game/game_storypagelist.hpp.sq"
|
|
||||||
#include "../script/api/game/game_subsidy.hpp.sq"
|
#include "../script/api/game/game_subsidy.hpp.sq"
|
||||||
#include "../script/api/game/game_subsidylist.hpp.sq"
|
#include "../script/api/game/game_subsidylist.hpp.sq"
|
||||||
#include "../script/api/game/game_testmode.hpp.sq"
|
#include "../script/api/game/game_testmode.hpp.sq"
|
||||||
@@ -173,8 +171,6 @@ void GameInstance::RegisterAPI()
|
|||||||
SQGSStationList_Register(this->engine);
|
SQGSStationList_Register(this->engine);
|
||||||
SQGSStationList_Vehicle_Register(this->engine);
|
SQGSStationList_Vehicle_Register(this->engine);
|
||||||
SQGSStoryPage_Register(this->engine);
|
SQGSStoryPage_Register(this->engine);
|
||||||
SQGSStoryPageElementList_Register(this->engine);
|
|
||||||
SQGSStoryPageList_Register(this->engine);
|
|
||||||
SQGSSubsidy_Register(this->engine);
|
SQGSSubsidy_Register(this->engine);
|
||||||
SQGSSubsidyList_Register(this->engine);
|
SQGSSubsidyList_Register(this->engine);
|
||||||
SQGSTestMode_Register(this->engine);
|
SQGSTestMode_Register(this->engine);
|
||||||
|
@@ -377,7 +377,7 @@ void ReconsiderGameScriptLanguage()
|
|||||||
if (_current_data == NULL) return;
|
if (_current_data == NULL) return;
|
||||||
|
|
||||||
char temp[MAX_PATH];
|
char temp[MAX_PATH];
|
||||||
strecpy(temp, _current_language->file, lastof(temp));
|
strecpy(temp, _current_language->file, temp + sizeof(temp));
|
||||||
|
|
||||||
/* Remove the extension */
|
/* Remove the extension */
|
||||||
char *l = strrchr(temp, '.');
|
char *l = strrchr(temp, '.');
|
||||||
|
@@ -98,15 +98,13 @@ static void _GenerateWorld(void *)
|
|||||||
try {
|
try {
|
||||||
_generating_world = true;
|
_generating_world = true;
|
||||||
_modal_progress_work_mutex->BeginCritical();
|
_modal_progress_work_mutex->BeginCritical();
|
||||||
if (_network_dedicated) DEBUG(net, 1, "Generating map, please wait...");
|
if (_network_dedicated) DEBUG(net, 0, "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);
|
||||||
SetGeneratingWorldProgress(GWP_MAP_INIT, 2);
|
SetGeneratingWorldProgress(GWP_MAP_INIT, 2);
|
||||||
SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0);
|
SetObjectToPlace(SPR_CURSOR_ZZZ, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0);
|
||||||
|
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_ENTER_GAMELOOP);
|
|
||||||
|
|
||||||
IncreaseGeneratingWorldProgress(GWP_MAP_INIT);
|
IncreaseGeneratingWorldProgress(GWP_MAP_INIT);
|
||||||
/* Must start economy early because of the costs. */
|
/* Must start economy early because of the costs. */
|
||||||
StartupEconomy();
|
StartupEconomy();
|
||||||
@@ -143,6 +141,8 @@ static void _GenerateWorld(void *)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClearPersistentStorageChanges(true);
|
||||||
|
|
||||||
/* These are probably pointless when inside the scenario editor. */
|
/* These are probably pointless when inside the scenario editor. */
|
||||||
SetGeneratingWorldProgress(GWP_GAME_INIT, 3);
|
SetGeneratingWorldProgress(GWP_GAME_INIT, 3);
|
||||||
StartupCompanies();
|
StartupCompanies();
|
||||||
@@ -179,8 +179,6 @@ static void _GenerateWorld(void *)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_LEAVE_GAMELOOP);
|
|
||||||
|
|
||||||
ResetObjectToPlace();
|
ResetObjectToPlace();
|
||||||
_cur_company.Trash();
|
_cur_company.Trash();
|
||||||
_current_company = _local_company = _gw.lc;
|
_current_company = _local_company = _gw.lc;
|
||||||
@@ -195,7 +193,7 @@ static void _GenerateWorld(void *)
|
|||||||
|
|
||||||
ShowNewGRFError();
|
ShowNewGRFError();
|
||||||
|
|
||||||
if (_network_dedicated) DEBUG(net, 1, "Map generated, starting game");
|
if (_network_dedicated) DEBUG(net, 0, "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) {
|
||||||
@@ -204,7 +202,6 @@ static void _GenerateWorld(void *)
|
|||||||
SaveOrLoad(name, SL_SAVE, AUTOSAVE_DIR, false);
|
SaveOrLoad(name, SL_SAVE, AUTOSAVE_DIR, false);
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
BasePersistentStorageArray::SwitchMode(PSM_LEAVE_GAMELOOP, true);
|
|
||||||
if (_cur_company.IsValid()) _cur_company.Restore();
|
if (_cur_company.IsValid()) _cur_company.Restore();
|
||||||
_generating_world = false;
|
_generating_world = false;
|
||||||
_modal_progress_work_mutex->EndCritical();
|
_modal_progress_work_mutex->EndCritical();
|
||||||
@@ -328,7 +325,7 @@ void GenerateWorld(GenWorldMode mode, uint size_x, uint size_y, bool reset_setti
|
|||||||
_gw.thread = NULL;
|
_gw.thread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!VideoDriver::GetInstance()->HasGUI() || !ThreadObject::New(&_GenerateWorld, NULL, &_gw.thread)) {
|
if (!_video_driver->HasGUI() || !ThreadObject::New(&_GenerateWorld, NULL, &_gw.thread)) {
|
||||||
DEBUG(misc, 1, "Cannot create genworld thread, reverting to single-threaded mode");
|
DEBUG(misc, 1, "Cannot create genworld thread, reverting to single-threaded mode");
|
||||||
_gw.threaded = false;
|
_gw.threaded = false;
|
||||||
_modal_progress_work_mutex->EndCritical();
|
_modal_progress_work_mutex->EndCritical();
|
||||||
|
27
src/gfx.cpp
27
src/gfx.cpp
@@ -85,7 +85,7 @@ void GfxScroll(int left, int top, int width, int height, int xo, int yo)
|
|||||||
|
|
||||||
blitter->ScrollBuffer(_screen.dst_ptr, left, top, width, height, xo, yo);
|
blitter->ScrollBuffer(_screen.dst_ptr, left, top, width, height, xo, yo);
|
||||||
/* This part of the screen is now dirty. */
|
/* This part of the screen is now dirty. */
|
||||||
VideoDriver::GetInstance()->MakeDirty(left, top, width, height);
|
_video_driver->MakeDirty(left, top, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -418,21 +418,19 @@ static int DrawLayoutLine(const ParagraphLayouter::Line *line, int y, int left,
|
|||||||
NOT_REACHED();
|
NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
TextColour colour = TC_BLACK;
|
|
||||||
bool draw_shadow = false;
|
|
||||||
for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
|
for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
|
||||||
const ParagraphLayouter::VisualRun *run = line->GetVisualRun(run_index);
|
const ParagraphLayouter::VisualRun *run = line->GetVisualRun(run_index);
|
||||||
const Font *f = (const Font*)run->GetFont();
|
const Font *f = (const Font*)run->GetFont();
|
||||||
|
|
||||||
FontCache *fc = f->fc;
|
FontCache *fc = f->fc;
|
||||||
colour = f->colour;
|
TextColour colour = f->colour;
|
||||||
SetColourRemap(colour);
|
SetColourRemap(colour);
|
||||||
|
|
||||||
DrawPixelInfo *dpi = _cur_dpi;
|
DrawPixelInfo *dpi = _cur_dpi;
|
||||||
int dpi_left = dpi->left;
|
int dpi_left = dpi->left;
|
||||||
int dpi_right = dpi->left + dpi->width - 1;
|
int dpi_right = dpi->left + dpi->width - 1;
|
||||||
|
|
||||||
draw_shadow = fc->GetDrawGlyphShadow() && (colour & TC_NO_SHADE) == 0 && colour != TC_BLACK;
|
bool draw_shadow = fc->GetDrawGlyphShadow() && colour != TC_BLACK;
|
||||||
|
|
||||||
for (int i = 0; i < run->GetGlyphCount(); i++) {
|
for (int i = 0; i < run->GetGlyphCount(); i++) {
|
||||||
GlyphID glyph = run->GetGlyphs()[i];
|
GlyphID glyph = run->GetGlyphs()[i];
|
||||||
@@ -463,11 +461,6 @@ static int DrawLayoutLine(const ParagraphLayouter::Line *line, int y, int left,
|
|||||||
if (truncation) {
|
if (truncation) {
|
||||||
int x = (_current_text_dir == TD_RTL) ? left : (right - 3 * dot_width);
|
int x = (_current_text_dir == TD_RTL) ? left : (right - 3 * dot_width);
|
||||||
for (int i = 0; i < 3; i++, x += dot_width) {
|
for (int i = 0; i < 3; i++, x += dot_width) {
|
||||||
if (draw_shadow) {
|
|
||||||
SetColourRemap(TC_BLACK);
|
|
||||||
GfxMainBlitter(dot_sprite, x + 1, y + 1, BM_COLOUR_REMAP);
|
|
||||||
SetColourRemap(colour);
|
|
||||||
}
|
|
||||||
GfxMainBlitter(dot_sprite, x, y, BM_COLOUR_REMAP);
|
GfxMainBlitter(dot_sprite, x, y, BM_COLOUR_REMAP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -795,7 +788,7 @@ void DrawSpriteViewport(SpriteID img, PaletteID pal, int x, int y, const SubSpri
|
|||||||
GfxMainBlitterViewport(GetSprite(real_sprite, ST_NORMAL), x, y, BM_TRANSPARENT, sub, real_sprite);
|
GfxMainBlitterViewport(GetSprite(real_sprite, ST_NORMAL), x, y, BM_TRANSPARENT, sub, real_sprite);
|
||||||
} else if (pal != PAL_NONE) {
|
} else if (pal != PAL_NONE) {
|
||||||
_colour_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH), ST_RECOLOUR) + 1;
|
_colour_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH), ST_RECOLOUR) + 1;
|
||||||
GfxMainBlitterViewport(GetSprite(real_sprite, ST_NORMAL), x, y, pal == PALETTE_CRASH ? BM_CRASH_REMAP : BM_COLOUR_REMAP, sub, real_sprite);
|
GfxMainBlitterViewport(GetSprite(real_sprite, ST_NORMAL), x, y, BM_COLOUR_REMAP, sub, real_sprite);
|
||||||
} else {
|
} else {
|
||||||
GfxMainBlitterViewport(GetSprite(real_sprite, ST_NORMAL), x, y, BM_NORMAL, sub, real_sprite);
|
GfxMainBlitterViewport(GetSprite(real_sprite, ST_NORMAL), x, y, BM_NORMAL, sub, real_sprite);
|
||||||
}
|
}
|
||||||
@@ -818,7 +811,7 @@ void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub,
|
|||||||
GfxMainBlitter(GetSprite(real_sprite, ST_NORMAL), x, y, BM_TRANSPARENT, sub, real_sprite, zoom);
|
GfxMainBlitter(GetSprite(real_sprite, ST_NORMAL), x, y, BM_TRANSPARENT, sub, real_sprite, zoom);
|
||||||
} else if (pal != PAL_NONE) {
|
} else if (pal != PAL_NONE) {
|
||||||
_colour_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH), ST_RECOLOUR) + 1;
|
_colour_remap_ptr = GetNonSprite(GB(pal, 0, PALETTE_WIDTH), ST_RECOLOUR) + 1;
|
||||||
GfxMainBlitter(GetSprite(real_sprite, ST_NORMAL), x, y, pal == PALETTE_CRASH ? BM_CRASH_REMAP : BM_COLOUR_REMAP, sub, real_sprite, zoom);
|
GfxMainBlitter(GetSprite(real_sprite, ST_NORMAL), x, y, BM_COLOUR_REMAP, sub, real_sprite, zoom);
|
||||||
} else {
|
} else {
|
||||||
GfxMainBlitter(GetSprite(real_sprite, ST_NORMAL), x, y, BM_NORMAL, sub, real_sprite, zoom);
|
GfxMainBlitter(GetSprite(real_sprite, ST_NORMAL), x, y, BM_NORMAL, sub, real_sprite, zoom);
|
||||||
}
|
}
|
||||||
@@ -1183,7 +1176,7 @@ void UndrawMouseCursor()
|
|||||||
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
|
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
|
||||||
_cursor.visible = false;
|
_cursor.visible = false;
|
||||||
blitter->CopyFromBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), _cursor_backup.GetBuffer(), _cursor.draw_size.x, _cursor.draw_size.y);
|
blitter->CopyFromBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), _cursor_backup.GetBuffer(), _cursor.draw_size.x, _cursor.draw_size.y);
|
||||||
VideoDriver::GetInstance()->MakeDirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y);
|
_video_driver->MakeDirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1243,7 +1236,7 @@ void DrawMouseCursor()
|
|||||||
_cur_dpi = &_screen;
|
_cur_dpi = &_screen;
|
||||||
DrawSprite(_cursor.sprite, _cursor.pal, _cursor.pos.x + _cursor.short_vehicle_offset, _cursor.pos.y);
|
DrawSprite(_cursor.sprite, _cursor.pal, _cursor.pos.x + _cursor.short_vehicle_offset, _cursor.pos.y);
|
||||||
|
|
||||||
VideoDriver::GetInstance()->MakeDirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y);
|
_video_driver->MakeDirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y);
|
||||||
|
|
||||||
_cursor.visible = true;
|
_cursor.visible = true;
|
||||||
_cursor.dirty = false;
|
_cursor.dirty = false;
|
||||||
@@ -1267,7 +1260,7 @@ void RedrawScreenRect(int left, int top, int right, int bottom)
|
|||||||
|
|
||||||
DrawOverlappedWindowForAll(left, top, right, bottom);
|
DrawOverlappedWindowForAll(left, top, right, bottom);
|
||||||
|
|
||||||
VideoDriver::GetInstance()->MakeDirty(left, top, right - left, bottom - top);
|
_video_driver->MakeDirty(left, top, right - left, bottom - top);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1576,12 +1569,12 @@ void SetAnimatedMouseCursor(const AnimCursor *table)
|
|||||||
|
|
||||||
bool ChangeResInGame(int width, int height)
|
bool ChangeResInGame(int width, int height)
|
||||||
{
|
{
|
||||||
return (_screen.width == width && _screen.height == height) || VideoDriver::GetInstance()->ChangeResolution(width, height);
|
return (_screen.width == width && _screen.height == height) || _video_driver->ChangeResolution(width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ToggleFullScreen(bool fs)
|
bool ToggleFullScreen(bool fs)
|
||||||
{
|
{
|
||||||
bool result = VideoDriver::GetInstance()->ToggleFullscreen(fs);
|
bool result = _video_driver->ToggleFullscreen(fs);
|
||||||
if (_fullscreen != fs && _num_resolutions == 0) {
|
if (_fullscreen != fs && _num_resolutions == 0) {
|
||||||
DEBUG(driver, 0, "Could not find a suitable fullscreen resolution");
|
DEBUG(driver, 0, "Could not find a suitable fullscreen resolution");
|
||||||
}
|
}
|
||||||
|
@@ -282,9 +282,9 @@ static bool SwitchNewGRFBlitter()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!VideoDriver::GetInstance()->AfterBlitterChange()) {
|
if (!_video_driver->AfterBlitterChange()) {
|
||||||
/* Failed to switch blitter, let's hope we can return to the old one. */
|
/* Failed to switch blitter, let's hope we can return to the old one. */
|
||||||
if (BlitterFactory::SelectBlitter(cur_blitter) == NULL || !VideoDriver::GetInstance()->AfterBlitterChange()) usererror("Failed to reinitialize video driver. Specify a fixed blitter in the config");
|
if (BlitterFactory::SelectBlitter(cur_blitter) == NULL || !_video_driver->AfterBlitterChange()) usererror("Failed to reinitialize video driver. Specify a fixed blitter in the config");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
31
src/goal.cpp
31
src/goal.cpp
@@ -92,11 +92,7 @@ CommandCost CmdCreateGoal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
g->progress = NULL;
|
g->progress = NULL;
|
||||||
g->completed = false;
|
g->completed = false;
|
||||||
|
|
||||||
if (g->company == INVALID_COMPANY) {
|
InvalidateWindowData(WC_GOALS_LIST, 0);
|
||||||
InvalidateWindowClassesData(WC_GOALS_LIST);
|
|
||||||
} else {
|
|
||||||
InvalidateWindowData(WC_GOALS_LIST, g->company);
|
|
||||||
}
|
|
||||||
if (Goal::GetNumItems() == 1) InvalidateWindowData(WC_MAIN_TOOLBAR, 0);
|
if (Goal::GetNumItems() == 1) InvalidateWindowData(WC_MAIN_TOOLBAR, 0);
|
||||||
|
|
||||||
_new_goal_id = g->index;
|
_new_goal_id = g->index;
|
||||||
@@ -121,14 +117,9 @@ CommandCost CmdRemoveGoal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
Goal *g = Goal::Get(p1);
|
Goal *g = Goal::Get(p1);
|
||||||
CompanyID c = g->company;
|
|
||||||
delete g;
|
delete g;
|
||||||
|
|
||||||
if (c == INVALID_COMPANY) {
|
InvalidateWindowData(WC_GOALS_LIST, 0);
|
||||||
InvalidateWindowClassesData(WC_GOALS_LIST);
|
|
||||||
} else {
|
|
||||||
InvalidateWindowData(WC_GOALS_LIST, c);
|
|
||||||
}
|
|
||||||
if (Goal::GetNumItems() == 0) InvalidateWindowData(WC_MAIN_TOOLBAR, 0);
|
if (Goal::GetNumItems() == 0) InvalidateWindowData(WC_MAIN_TOOLBAR, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,11 +146,7 @@ CommandCost CmdSetGoalText(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
free(g->text);
|
free(g->text);
|
||||||
g->text = strdup(text);
|
g->text = strdup(text);
|
||||||
|
|
||||||
if (g->company == INVALID_COMPANY) {
|
InvalidateWindowData(WC_GOALS_LIST, 0);
|
||||||
InvalidateWindowClassesData(WC_GOALS_LIST);
|
|
||||||
} else {
|
|
||||||
InvalidateWindowData(WC_GOALS_LIST, g->company);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
@@ -188,11 +175,7 @@ CommandCost CmdSetGoalProgress(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
|||||||
g->progress = strdup(text);
|
g->progress = strdup(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g->company == INVALID_COMPANY) {
|
InvalidateWindowData(WC_GOALS_LIST, 0);
|
||||||
InvalidateWindowClassesData(WC_GOALS_LIST);
|
|
||||||
} else {
|
|
||||||
InvalidateWindowData(WC_GOALS_LIST, g->company);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
@@ -216,11 +199,7 @@ CommandCost CmdSetGoalCompleted(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
|||||||
Goal *g = Goal::Get(p1);
|
Goal *g = Goal::Get(p1);
|
||||||
g->completed = p2 == 1;
|
g->completed = p2 == 1;
|
||||||
|
|
||||||
if (g->company == INVALID_COMPANY) {
|
InvalidateWindowData(WC_GOALS_LIST, 0);
|
||||||
InvalidateWindowClassesData(WC_GOALS_LIST);
|
|
||||||
} else {
|
|
||||||
InvalidateWindowData(WC_GOALS_LIST, g->company);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
|
@@ -273,8 +273,6 @@ struct GoalListWindow : public Window {
|
|||||||
{
|
{
|
||||||
this->DrawWidgets();
|
this->DrawWidgets();
|
||||||
|
|
||||||
if (this->IsShaded()) return; // Don't draw anything when the window is shaded.
|
|
||||||
|
|
||||||
/* Calculate progress column width. */
|
/* Calculate progress column width. */
|
||||||
uint max_width = 0;
|
uint max_width = 0;
|
||||||
Goal *s;
|
Goal *s;
|
||||||
|
@@ -106,30 +106,15 @@ int GroundVehicle<T, Type>::GetAcceleration() const
|
|||||||
{
|
{
|
||||||
/* Templated class used for function calls for performance reasons. */
|
/* Templated class used for function calls for performance reasons. */
|
||||||
const T *v = T::From(this);
|
const T *v = T::From(this);
|
||||||
/* Speed is used squared later on, so U16 * U16, and then multiplied by other values. */
|
int32 speed = v->GetCurrentSpeed(); // [km/h-ish]
|
||||||
int64 speed = v->GetCurrentSpeed(); // [km/h-ish]
|
|
||||||
|
|
||||||
/* Weight is stored in tonnes. */
|
/* Weight is stored in tonnes. */
|
||||||
int32 mass = this->gcache.cached_weight;
|
int32 mass = this->gcache.cached_weight;
|
||||||
|
|
||||||
/* Power is stored in HP, we need it in watts.
|
/* Power is stored in HP, we need it in watts. */
|
||||||
* Each vehicle can have U16 power, 128 vehicles, HP -> watt
|
int32 power = this->gcache.cached_power * 746;
|
||||||
* and km/h to m/s conversion below result in a maxium of
|
|
||||||
* about 1.1E11, way more than 4.3E9 of int32. */
|
|
||||||
int64 power = this->gcache.cached_power * 746ll;
|
|
||||||
|
|
||||||
/* This is constructed from:
|
int32 resistance = 0;
|
||||||
* - axle resistance: U16 power * 10 for 128 vehicles.
|
|
||||||
* * 8.3E7
|
|
||||||
* - rolling friction: U16 power * 144 for 128 vehicles.
|
|
||||||
* * 1.2E9
|
|
||||||
* - slope resistance: U16 weight * 100 * 10 (steepness) for 128 vehicles.
|
|
||||||
* * 8.4E9
|
|
||||||
* - air drag: 28 * (U8 drag + 3 * U8 drag * 128 vehicles / 20) * U16 speed * U16 speed
|
|
||||||
* * 6.2E14 before dividing by 1000
|
|
||||||
* Sum is 6.3E11, more than 4.3E9 of int32, so int64 is needed.
|
|
||||||
*/
|
|
||||||
int64 resistance = 0;
|
|
||||||
|
|
||||||
bool maglev = v->GetAccelerationType() == 2;
|
bool maglev = v->GetAccelerationType() == 2;
|
||||||
|
|
||||||
@@ -149,9 +134,7 @@ int GroundVehicle<T, Type>::GetAcceleration() const
|
|||||||
AccelStatus mode = v->GetAccelerationStatus();
|
AccelStatus mode = v->GetAccelerationStatus();
|
||||||
|
|
||||||
const int max_te = this->gcache.cached_max_te; // [N]
|
const int max_te = this->gcache.cached_max_te; // [N]
|
||||||
/* Constructued from power, with need to multiply by 18 and assuming
|
int force;
|
||||||
* low speed, it needs to be a 64 bit integer too. */
|
|
||||||
int64 force;
|
|
||||||
if (speed > 0) {
|
if (speed > 0) {
|
||||||
if (!maglev) {
|
if (!maglev) {
|
||||||
/* Conversion factor from km/h to m/s is 5/18 to get [N] in the end. */
|
/* Conversion factor from km/h to m/s is 5/18 to get [N] in the end. */
|
||||||
@@ -175,10 +158,10 @@ int GroundVehicle<T, Type>::GetAcceleration() const
|
|||||||
* down hill will never slow down enough, and a vehicle that came up
|
* down hill will never slow down enough, and a vehicle that came up
|
||||||
* a hill will never speed up enough to (eventually) get back to the
|
* a hill will never speed up enough to (eventually) get back to the
|
||||||
* same (maximum) speed. */
|
* same (maximum) speed. */
|
||||||
int accel = ClampToI32((force - resistance) / (mass * 4));
|
int accel = (force - resistance) / (mass * 4);
|
||||||
return force < resistance ? min(-1, accel) : max(1, accel);
|
return force < resistance ? min(-1, accel) : max(1, accel);
|
||||||
} else {
|
} else {
|
||||||
return ClampToI32(min(-force - resistance, -10000) / mass);
|
return min(-force - resistance, -10000) / mass;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -113,9 +113,9 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
|
|||||||
* Calculates the total slope resistance for this vehicle.
|
* Calculates the total slope resistance for this vehicle.
|
||||||
* @return Slope resistance.
|
* @return Slope resistance.
|
||||||
*/
|
*/
|
||||||
inline int64 GetSlopeResistance() const
|
inline int32 GetSlopeResistance() const
|
||||||
{
|
{
|
||||||
int64 incl = 0;
|
int32 incl = 0;
|
||||||
|
|
||||||
for (const T *u = T::From(this); u != NULL; u = u->Next()) {
|
for (const T *u = T::From(this); u != NULL; u = u->Next()) {
|
||||||
if (HasBit(u->gv_flags, GVF_GOINGUP_BIT)) {
|
if (HasBit(u->gv_flags, GVF_GOINGUP_BIT)) {
|
||||||
|
@@ -1563,30 +1563,7 @@ static bool CheckIfCanLevelIndustryPlatform(TileIndex tile, DoCommandFlag flags,
|
|||||||
static CommandCost CheckIfFarEnoughFromConflictingIndustry(TileIndex tile, int type)
|
static CommandCost CheckIfFarEnoughFromConflictingIndustry(TileIndex tile, int type)
|
||||||
{
|
{
|
||||||
const IndustrySpec *indspec = GetIndustrySpec(type);
|
const IndustrySpec *indspec = GetIndustrySpec(type);
|
||||||
const Industry *i = NULL;
|
const Industry *i;
|
||||||
|
|
||||||
/* On a large map with many industries, it may be faster to check an area. */
|
|
||||||
static const int dmax = 14;
|
|
||||||
if (Industry::GetNumItems() > (size_t) (dmax * dmax * 2)) {
|
|
||||||
const int tx = TileX(tile);
|
|
||||||
const int ty = TileY(tile);
|
|
||||||
TileArea tile_area = TileArea(TileXY(max(0, tx - dmax), max(0, ty - dmax)), TileXY(min(MapMaxX(), tx + dmax), min(MapMaxY(), ty + dmax)));
|
|
||||||
TILE_AREA_LOOP(atile, tile_area) {
|
|
||||||
if (GetTileType(atile) == MP_INDUSTRY) {
|
|
||||||
const Industry *i2 = Industry::GetByTile(atile);
|
|
||||||
if (i == i2) continue;
|
|
||||||
i = i2;
|
|
||||||
if (DistanceMax(tile, i->location.tile) > (uint)dmax) continue;
|
|
||||||
if (i->type == indspec->conflicting[0] ||
|
|
||||||
i->type == indspec->conflicting[1] ||
|
|
||||||
i->type == indspec->conflicting[2]) {
|
|
||||||
return_cmd_error(STR_ERROR_INDUSTRY_TOO_CLOSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return CommandCost();
|
|
||||||
}
|
|
||||||
|
|
||||||
FOR_ALL_INDUSTRIES(i) {
|
FOR_ALL_INDUSTRIES(i) {
|
||||||
/* Within 14 tiles from another industry is considered close */
|
/* Within 14 tiles from another industry is considered close */
|
||||||
if (DistanceMax(tile, i->location.tile) > 14) continue;
|
if (DistanceMax(tile, i->location.tile) > 14) continue;
|
||||||
@@ -2018,7 +1995,7 @@ static uint GetNumberOfIndustries()
|
|||||||
|
|
||||||
assert(lengthof(numof_industry_table) == ID_END);
|
assert(lengthof(numof_industry_table) == ID_END);
|
||||||
uint difficulty = (_game_mode != GM_EDITOR) ? _settings_game.difficulty.industry_density : (uint)ID_VERY_LOW;
|
uint difficulty = (_game_mode != GM_EDITOR) ? _settings_game.difficulty.industry_density : (uint)ID_VERY_LOW;
|
||||||
return min(IndustryPool::MAX_SIZE, ScaleByMapSize(numof_industry_table[difficulty]));
|
return ScaleByMapSize(numof_industry_table[difficulty]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -24,7 +24,6 @@
|
|||||||
#include "newgrf_industries.h"
|
#include "newgrf_industries.h"
|
||||||
#include "newgrf_text.h"
|
#include "newgrf_text.h"
|
||||||
#include "newgrf_debug.h"
|
#include "newgrf_debug.h"
|
||||||
#include "network/network.h"
|
|
||||||
#include "strings_func.h"
|
#include "strings_func.h"
|
||||||
#include "company_func.h"
|
#include "company_func.h"
|
||||||
#include "tilehighlight_func.h"
|
#include "tilehighlight_func.h"
|
||||||
@@ -80,7 +79,7 @@ static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind,
|
|||||||
if (callback > 0x400) {
|
if (callback > 0x400) {
|
||||||
ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback);
|
ErrorUnknownCallbackResult(indspec->grf_prop.grffile->grfid, CBID_INDUSTRY_CARGO_SUFFIX, callback);
|
||||||
} else if (indspec->grf_prop.grffile->grf_version >= 8 || GB(callback, 0, 8) != 0xFF) {
|
} else if (indspec->grf_prop.grffile->grf_version >= 8 || GB(callback, 0, 8) != 0xFF) {
|
||||||
StartTextRefStackUsage(indspec->grf_prop.grffile, 6);
|
StartTextRefStackUsage(6);
|
||||||
GetString(suffix, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback), suffix_last);
|
GetString(suffix, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback), suffix_last);
|
||||||
StopTextRefStackUsage();
|
StopTextRefStackUsage();
|
||||||
}
|
}
|
||||||
@@ -118,10 +117,12 @@ static int CDECL IndustryTypeNameSorter(const IndustryType *a, const IndustryTyp
|
|||||||
static char industry_name[2][64];
|
static char industry_name[2][64];
|
||||||
|
|
||||||
const IndustrySpec *indsp1 = GetIndustrySpec(*a);
|
const IndustrySpec *indsp1 = GetIndustrySpec(*a);
|
||||||
GetString(industry_name[0], indsp1->name, lastof(industry_name[0]));
|
SetDParam(0, indsp1->name);
|
||||||
|
GetString(industry_name[0], STR_JUST_STRING, lastof(industry_name[0]));
|
||||||
|
|
||||||
const IndustrySpec *indsp2 = GetIndustrySpec(*b);
|
const IndustrySpec *indsp2 = GetIndustrySpec(*b);
|
||||||
GetString(industry_name[1], indsp2->name, lastof(industry_name[1]));
|
SetDParam(0, indsp2->name);
|
||||||
|
GetString(industry_name[1], STR_JUST_STRING, lastof(industry_name[1]));
|
||||||
|
|
||||||
int r = strnatcmp(industry_name[0], industry_name[1]); // Sort by name (natural sorting).
|
int r = strnatcmp(industry_name[0], industry_name[1]); // Sort by name (natural sorting).
|
||||||
|
|
||||||
@@ -470,7 +471,7 @@ public:
|
|||||||
} else {
|
} else {
|
||||||
str = GetGRFStringID(indsp->grf_prop.grffile->grfid, 0xD000 + callback_res); // No. here's the new string
|
str = GetGRFStringID(indsp->grf_prop.grffile->grfid, 0xD000 + callback_res); // No. here's the new string
|
||||||
if (str != STR_UNDEFINED) {
|
if (str != STR_UNDEFINED) {
|
||||||
StartTextRefStackUsage(indsp->grf_prop.grffile, 6);
|
StartTextRefStackUsage(6);
|
||||||
DrawStringMultiLine(left, right, y, bottom, str, TC_YELLOW);
|
DrawStringMultiLine(left, right, y, bottom, str, TC_YELLOW);
|
||||||
StopTextRefStackUsage();
|
StopTextRefStackUsage();
|
||||||
}
|
}
|
||||||
@@ -638,8 +639,7 @@ static inline bool IsProductionAlterable(const Industry *i)
|
|||||||
{
|
{
|
||||||
const IndustrySpec *is = GetIndustrySpec(i->type);
|
const IndustrySpec *is = GetIndustrySpec(i->type);
|
||||||
return ((_game_mode == GM_EDITOR || _cheats.setup_prod.value) &&
|
return ((_game_mode == GM_EDITOR || _cheats.setup_prod.value) &&
|
||||||
(is->production_rate[0] != 0 || is->production_rate[1] != 0 || is->IsRawIndustry()) &&
|
(is->production_rate[0] != 0 || is->production_rate[1] != 0 || is->IsRawIndustry()));
|
||||||
!_networking);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class IndustryViewWindow : public Window
|
class IndustryViewWindow : public Window
|
||||||
@@ -800,7 +800,7 @@ public:
|
|||||||
if (message != STR_NULL && message != STR_UNDEFINED) {
|
if (message != STR_NULL && message != STR_UNDEFINED) {
|
||||||
y += WD_PAR_VSEP_WIDE;
|
y += WD_PAR_VSEP_WIDE;
|
||||||
|
|
||||||
StartTextRefStackUsage(ind->grf_prop.grffile, 6);
|
StartTextRefStackUsage(6);
|
||||||
/* Use all the available space left from where we stand up to the
|
/* Use all the available space left from where we stand up to the
|
||||||
* end of the window. We ALSO enlarge the window if needed, so we
|
* end of the window. We ALSO enlarge the window if needed, so we
|
||||||
* can 'go' wild with the bottom of the window. */
|
* can 'go' wild with the bottom of the window. */
|
||||||
@@ -1669,7 +1669,8 @@ struct CargoesField {
|
|||||||
ypos += (normal_height - FONT_HEIGHT_NORMAL) / 2;
|
ypos += (normal_height - FONT_HEIGHT_NORMAL) / 2;
|
||||||
if (this->u.industry.ind_type < NUM_INDUSTRYTYPES) {
|
if (this->u.industry.ind_type < NUM_INDUSTRYTYPES) {
|
||||||
const IndustrySpec *indsp = GetIndustrySpec(this->u.industry.ind_type);
|
const IndustrySpec *indsp = GetIndustrySpec(this->u.industry.ind_type);
|
||||||
DrawString(xpos, xpos2, ypos, indsp->name, TC_WHITE, SA_HOR_CENTER);
|
SetDParam(0, indsp->name);
|
||||||
|
DrawString(xpos, xpos2, ypos, STR_JUST_STRING, TC_WHITE, SA_HOR_CENTER);
|
||||||
|
|
||||||
/* Draw the industry legend. */
|
/* Draw the industry legend. */
|
||||||
int blob_left, blob_right;
|
int blob_left, blob_right;
|
||||||
@@ -2000,7 +2001,7 @@ struct CargoesRow {
|
|||||||
if (!hs->enabled) continue;
|
if (!hs->enabled) continue;
|
||||||
|
|
||||||
for (uint j = 0; j < lengthof(hs->accepts_cargo); j++) {
|
for (uint j = 0; j < lengthof(hs->accepts_cargo); j++) {
|
||||||
if (hs->cargo_acceptance[j] > 0 && cargo_fld->u.cargo.vertical_cargoes[i] == hs->accepts_cargo[j]) {
|
if (cargo_fld->u.cargo.vertical_cargoes[i] == hs->accepts_cargo[j]) {
|
||||||
cargo_fld->ConnectCargo(cargo_fld->u.cargo.vertical_cargoes[i], false);
|
cargo_fld->ConnectCargo(cargo_fld->u.cargo.vertical_cargoes[i], false);
|
||||||
goto next_cargo;
|
goto next_cargo;
|
||||||
}
|
}
|
||||||
@@ -2192,7 +2193,7 @@ struct IndustryCargoesWindow : public Window {
|
|||||||
if (!hs->enabled || !(hs->building_availability & climate_mask)) continue;
|
if (!hs->enabled || !(hs->building_availability & climate_mask)) continue;
|
||||||
|
|
||||||
for (uint j = 0; j < lengthof(hs->accepts_cargo); j++) {
|
for (uint j = 0; j < lengthof(hs->accepts_cargo); j++) {
|
||||||
if (hs->cargo_acceptance[j] > 0 && cargoes[i] == hs->accepts_cargo[j]) return true;
|
if (cargoes[i] == hs->accepts_cargo[j]) return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -63,8 +63,7 @@ IniGroup::IniGroup(IniLoadFile *parent, const char *name, size_t len) : next(NUL
|
|||||||
if (len == 0) len = strlen(name);
|
if (len == 0) len = strlen(name);
|
||||||
|
|
||||||
this->name = strndup(name, len);
|
this->name = strndup(name, len);
|
||||||
if (this->name == NULL) error("not enough memory to allocate group name");
|
if (this->name != NULL) str_validate(this->name, this->name + len);
|
||||||
str_validate(this->name, this->name + len);
|
|
||||||
|
|
||||||
this->last_item = &this->item;
|
this->last_item = &this->item;
|
||||||
*parent->last_group = this;
|
*parent->last_group = this;
|
||||||
|
@@ -32,7 +32,6 @@
|
|||||||
#include "company_func.h"
|
#include "company_func.h"
|
||||||
#include "pathfinder/npf/aystar.h"
|
#include "pathfinder/npf/aystar.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <set>
|
|
||||||
|
|
||||||
#include "table/strings.h"
|
#include "table/strings.h"
|
||||||
#include "table/sprites.h"
|
#include "table/sprites.h"
|
||||||
@@ -668,7 +667,8 @@ CommandCost CmdClearArea(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
const Company *c = (flags & (DC_AUTO | DC_BANKRUPT)) ? NULL : Company::GetIfValid(_current_company);
|
const Company *c = (flags & (DC_AUTO | DC_BANKRUPT)) ? NULL : Company::GetIfValid(_current_company);
|
||||||
int limit = (c == NULL ? INT32_MAX : GB(c->clear_limit, 16, 16));
|
int limit = (c == NULL ? INT32_MAX : GB(c->clear_limit, 16, 16));
|
||||||
|
|
||||||
TileIterator *iter = HasBit(p2, 0) ? (TileIterator *)new DiagonalTileIterator(tile, p1) : new OrthogonalTileIterator(tile, p1);
|
TileArea ta(tile, p1);
|
||||||
|
TileIterator *iter = HasBit(p2, 0) ? (TileIterator *)new DiagonalTileIterator(tile, p1) : new OrthogonalTileIterator(ta);
|
||||||
for (; *iter != INVALID_TILE; ++(*iter)) {
|
for (; *iter != INVALID_TILE; ++(*iter)) {
|
||||||
TileIndex t = *iter;
|
TileIndex t = *iter;
|
||||||
CommandCost ret = DoCommand(t, 0, 0, flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
|
CommandCost ret = DoCommand(t, 0, 0, flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
|
||||||
@@ -692,10 +692,11 @@ CommandCost CmdClearArea(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
|||||||
|
|
||||||
/* draw explosion animation...
|
/* draw explosion animation...
|
||||||
* Disable explosions when game is paused. Looks silly and blocks the view. */
|
* Disable explosions when game is paused. Looks silly and blocks the view. */
|
||||||
if ((t == tile || t == p1) && _pause_mode == PM_UNPAUSED) {
|
TileIndex off = t - ta.tile;
|
||||||
/* big explosion in two corners, or small explosion for single tiles */
|
if ((TileX(off) == 0 || TileX(off) == ta.w - 1U) && (TileY(off) == 0 || TileY(off) == ta.h - 1U) && _pause_mode == PM_UNPAUSED) {
|
||||||
|
/* big explosion in each corner, or small explosion for single tiles */
|
||||||
CreateEffectVehicleAbove(TileX(t) * TILE_SIZE + TILE_SIZE / 2, TileY(t) * TILE_SIZE + TILE_SIZE / 2, 2,
|
CreateEffectVehicleAbove(TileX(t) * TILE_SIZE + TILE_SIZE / 2, TileY(t) * TILE_SIZE + TILE_SIZE / 2, 2,
|
||||||
TileX(tile) == TileX(p1) && TileY(tile) == TileY(p1) ? EV_EXPLOSION_SMALL : EV_EXPLOSION_LARGE
|
ta.w == 1 && ta.h == 1 ? EV_EXPLOSION_SMALL : EV_EXPLOSION_LARGE
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -721,13 +722,12 @@ void RunTileLoop()
|
|||||||
* shift register (LFSR). This allows a deterministic pseudorandom ordering, but
|
* shift register (LFSR). This allows a deterministic pseudorandom ordering, but
|
||||||
* still with minimal state and fast iteration. */
|
* still with minimal state and fast iteration. */
|
||||||
|
|
||||||
/* Maximal length LFSR feedback terms, from 12-bit (for 64x64 maps) to 24-bit (for 4096x4096 maps).
|
/* Maximal length LFSR feedback terms, from 12-bit (for 64x64 maps) to 22-bit (for 2048x2048 maps).
|
||||||
* Extracted from http://www.ece.cmu.edu/~koopman/lfsr/ */
|
* Extracted from http://www.ece.cmu.edu/~koopman/lfsr/ */
|
||||||
static const uint32 feedbacks[] = {
|
static const uint32 feedbacks[] = {
|
||||||
0xD8F, 0x1296, 0x2496, 0x4357, 0x8679, 0x1030E, 0x206CD, 0x403FE, 0x807B8, 0x1004B2, 0x2006A8, 0x4004B2, 0x800B87
|
0xD8F, 0x1296, 0x2496, 0x4357, 0x8679, 0x1030E, 0x206CD, 0x403FE, 0x807B8, 0x1004B2, 0x2006A8
|
||||||
};
|
};
|
||||||
assert_compile(lengthof(feedbacks) == 2 * MAX_MAP_SIZE_BITS - 2 * MIN_MAP_SIZE_BITS + 1);
|
const uint32 feedback = feedbacks[MapLogX() + MapLogY() - 12];
|
||||||
const uint32 feedback = feedbacks[MapLogX() + MapLogY() - 2 * MIN_MAP_SIZE_BITS];
|
|
||||||
|
|
||||||
/* We update every tile every 256 ticks, so divide the map size by 2^8 = 256 */
|
/* We update every tile every 256 ticks, so divide the map size by 2^8 = 256 */
|
||||||
uint count = 1 << (MapLogX() + MapLogY() - 8);
|
uint count = 1 << (MapLogX() + MapLogY() - 8);
|
||||||
@@ -1097,20 +1097,18 @@ static void BuildRiver(TileIndex begin, TileIndex end)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to flow the river down from a given begin.
|
* Try to flow the river down from a given begin.
|
||||||
|
* @param marks Array for temporary of iterated tiles.
|
||||||
* @param spring The springing point of the river.
|
* @param spring The springing point of the river.
|
||||||
* @param begin The begin point we are looking from; somewhere down hill from the spring.
|
* @param begin The begin point we are looking from; somewhere down hill from the spring.
|
||||||
* @return True iff a river could/has been built, otherwise false.
|
* @return True iff a river could/has been built, otherwise false.
|
||||||
*/
|
*/
|
||||||
static bool FlowRiver(TileIndex spring, TileIndex begin)
|
static bool FlowRiver(bool *marks, TileIndex spring, TileIndex begin)
|
||||||
{
|
{
|
||||||
#define SET_MARK(x) marks.insert(x)
|
|
||||||
#define IS_MARKED(x) (marks.find(x) != marks.end())
|
|
||||||
|
|
||||||
uint height = TileHeight(begin);
|
uint height = TileHeight(begin);
|
||||||
if (IsWaterTile(begin)) return DistanceManhattan(spring, begin) > _settings_game.game_creation.min_river_length;
|
if (IsWaterTile(begin)) return DistanceManhattan(spring, begin) > _settings_game.game_creation.min_river_length;
|
||||||
|
|
||||||
std::set<TileIndex> marks;
|
MemSetT(marks, 0, MapSize());
|
||||||
SET_MARK(begin);
|
marks[begin] = true;
|
||||||
|
|
||||||
/* Breadth first search for the closest tile we can flow down to. */
|
/* Breadth first search for the closest tile we can flow down to. */
|
||||||
std::list<TileIndex> queue;
|
std::list<TileIndex> queue;
|
||||||
@@ -1131,8 +1129,8 @@ static bool FlowRiver(TileIndex spring, TileIndex begin)
|
|||||||
|
|
||||||
for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) {
|
for (DiagDirection d = DIAGDIR_BEGIN; d < DIAGDIR_END; d++) {
|
||||||
TileIndex t2 = end + TileOffsByDiagDir(d);
|
TileIndex t2 = end + TileOffsByDiagDir(d);
|
||||||
if (IsValidTile(t2) && !IS_MARKED(t2) && FlowsDown(end, t2)) {
|
if (IsValidTile(t2) && !marks[t2] && FlowsDown(end, t2)) {
|
||||||
SET_MARK(t2);
|
marks[t2] = true;
|
||||||
count++;
|
count++;
|
||||||
queue.push_back(t2);
|
queue.push_back(t2);
|
||||||
}
|
}
|
||||||
@@ -1141,14 +1139,13 @@ static bool FlowRiver(TileIndex spring, TileIndex begin)
|
|||||||
|
|
||||||
if (found) {
|
if (found) {
|
||||||
/* Flow further down hill. */
|
/* Flow further down hill. */
|
||||||
found = FlowRiver(spring, end);
|
found = FlowRiver(marks, spring, end);
|
||||||
} else if (count > 32) {
|
} else if (count > 32) {
|
||||||
/* Maybe we can make a lake. Find the Nth of the considered tiles. */
|
/* Maybe we can make a lake. Find the Nth of the considered tiles. */
|
||||||
TileIndex lakeCenter = 0;
|
TileIndex lakeCenter = 0;
|
||||||
int i = RandomRange(count - 1) + 1;
|
for (int i = RandomRange(count - 1); i != 0; lakeCenter++) {
|
||||||
std::set<TileIndex>::const_iterator cit = marks.begin();
|
if (marks[lakeCenter]) i--;
|
||||||
while (--i) cit++;
|
}
|
||||||
lakeCenter = *cit;
|
|
||||||
|
|
||||||
if (IsValidTile(lakeCenter) &&
|
if (IsValidTile(lakeCenter) &&
|
||||||
/* A river, or lake, can only be built on flat slopes. */
|
/* A river, or lake, can only be built on flat slopes. */
|
||||||
@@ -1172,7 +1169,6 @@ static bool FlowRiver(TileIndex spring, TileIndex begin)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
marks.clear();
|
|
||||||
if (found) BuildRiver(begin, end);
|
if (found) BuildRiver(begin, end);
|
||||||
return found;
|
return found;
|
||||||
}
|
}
|
||||||
@@ -1187,16 +1183,19 @@ static void CreateRivers()
|
|||||||
|
|
||||||
uint wells = ScaleByMapSize(4 << _settings_game.game_creation.amount_of_rivers);
|
uint wells = ScaleByMapSize(4 << _settings_game.game_creation.amount_of_rivers);
|
||||||
SetGeneratingWorldProgress(GWP_RIVER, wells + 256 / 64); // Include the tile loop calls below.
|
SetGeneratingWorldProgress(GWP_RIVER, wells + 256 / 64); // Include the tile loop calls below.
|
||||||
|
bool *marks = CallocT<bool>(MapSize());
|
||||||
|
|
||||||
for (; wells != 0; wells--) {
|
for (; wells != 0; wells--) {
|
||||||
IncreaseGeneratingWorldProgress(GWP_RIVER);
|
IncreaseGeneratingWorldProgress(GWP_RIVER);
|
||||||
for (int tries = 0; tries < 128; tries++) {
|
for (int tries = 0; tries < 128; tries++) {
|
||||||
TileIndex t = RandomTile();
|
TileIndex t = RandomTile();
|
||||||
if (!CircularTileSearch(&t, 8, FindSpring, NULL)) continue;
|
if (!CircularTileSearch(&t, 8, FindSpring, NULL)) continue;
|
||||||
if (FlowRiver(t, t)) break;
|
if (FlowRiver(marks, t, t)) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(marks);
|
||||||
|
|
||||||
/* Run tile loop to update the ground density. */
|
/* Run tile loop to update the ground density. */
|
||||||
for (uint i = 0; i != 256; i++) {
|
for (uint i = 0; i != 256; i++) {
|
||||||
if (i % 64 == 0) IncreaseGeneratingWorldProgress(GWP_RIVER);
|
if (i % 64 == 0) IncreaseGeneratingWorldProgress(GWP_RIVER);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -199,14 +199,12 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}حصان
|
|||||||
STR_UNITS_POWER_METRIC :{COMMA}حصان
|
STR_UNITS_POWER_METRIC :{COMMA}حصان
|
||||||
STR_UNITS_POWER_SI :{COMMA}ك واط
|
STR_UNITS_POWER_SI :{COMMA}ك واط
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}ت
|
|
||||||
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}طن
|
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}طن
|
||||||
STR_UNITS_WEIGHT_SHORT_SI :{COMMA}كجم
|
STR_UNITS_WEIGHT_SHORT_SI :{COMMA}كجم
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} طن
|
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} طن
|
||||||
STR_UNITS_WEIGHT_LONG_SI :{COMMA}كجم
|
STR_UNITS_WEIGHT_LONG_SI :{COMMA}كجم
|
||||||
|
|
||||||
STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}غال
|
|
||||||
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}ل
|
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}ل
|
||||||
STR_UNITS_VOLUME_SHORT_SI :{COMMA}م3
|
STR_UNITS_VOLUME_SHORT_SI :{COMMA}م3
|
||||||
|
|
||||||
@@ -233,16 +231,13 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}اغلا
|
|||||||
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}عنوان الاطار- اسحب لتحريك الاطار
|
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}عنوان الاطار- اسحب لتحريك الاطار
|
||||||
STR_TOOLTIP_SHADE :{BLACK}نافذة الظل - تعرض العنوان فقط
|
STR_TOOLTIP_SHADE :{BLACK}نافذة الظل - تعرض العنوان فقط
|
||||||
STR_TOOLTIP_DEBUG :{BLACK}اظهر معلومات صائد اخطاء الاضافات الجديدة.
|
STR_TOOLTIP_DEBUG :{BLACK}اظهر معلومات صائد اخطاء الاضافات الجديدة.
|
||||||
STR_TOOLTIP_STICKY :{BLACK}علم هذه النافذة كغير قابلة للإقفال باستخدام زر إغلاق كل النوافذ, اضغط مع Ctrl لجعل الأمر إفتراضيا
|
STR_TOOLTIP_STICKY :{BLACK}خصص هذا الاطار بان يبقى مفتوح عند اغلاق كافة الاطارات
|
||||||
STR_TOOLTIP_RESIZE :{BLACK}اضغط واسحب لتعديل حجم الاطار
|
STR_TOOLTIP_RESIZE :{BLACK}اضغط واسحب لتعديل حجم الاطار
|
||||||
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}تبديل حجم الاطار كبير / صغير
|
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}تبديل حجم الاطار كبير / صغير
|
||||||
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}شريط العرض- فوق /تحت
|
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}شريط العرض- فوق /تحت
|
||||||
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}عمود التحريك - يمين/يسار
|
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}عمود التحريك - يمين/يسار
|
||||||
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}هدم المباني و غيرها في مربع من الأرض.
|
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}هدم المباني و غيرها في مربع من الأرض.
|
||||||
|
|
||||||
# Show engines button
|
|
||||||
|
|
||||||
|
|
||||||
# Query window
|
# Query window
|
||||||
STR_BUTTON_DEFAULT :{BLACK}افتراضي
|
STR_BUTTON_DEFAULT :{BLACK}افتراضي
|
||||||
STR_BUTTON_CANCEL :{BLACK}الغاء
|
STR_BUTTON_CANCEL :{BLACK}الغاء
|
||||||
@@ -456,7 +451,7 @@ STR_ABOUT_MENU_SPRITE_ALIGNER :موائم ال
|
|||||||
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :اضهار /اخفاء مربح الحوارات/الخيارات
|
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :اضهار /اخفاء مربح الحوارات/الخيارات
|
||||||
############ range ends here
|
############ range ends here
|
||||||
|
|
||||||
############ range for ordinal numbers used for the place in the highscore window
|
############ range for days starts (also used for the place in the highscore window)
|
||||||
STR_ORDINAL_NUMBER_1ST :1
|
STR_ORDINAL_NUMBER_1ST :1
|
||||||
STR_ORDINAL_NUMBER_2ND :2
|
STR_ORDINAL_NUMBER_2ND :2
|
||||||
STR_ORDINAL_NUMBER_3RD :3
|
STR_ORDINAL_NUMBER_3RD :3
|
||||||
@@ -472,40 +467,22 @@ STR_ORDINAL_NUMBER_12TH :12
|
|||||||
STR_ORDINAL_NUMBER_13TH :13
|
STR_ORDINAL_NUMBER_13TH :13
|
||||||
STR_ORDINAL_NUMBER_14TH :14
|
STR_ORDINAL_NUMBER_14TH :14
|
||||||
STR_ORDINAL_NUMBER_15TH :15
|
STR_ORDINAL_NUMBER_15TH :15
|
||||||
############ range for ordinal numbers ends
|
STR_ORDINAL_NUMBER_16TH :16
|
||||||
|
STR_ORDINAL_NUMBER_17TH :17
|
||||||
############ range for days starts
|
STR_ORDINAL_NUMBER_18TH :18
|
||||||
STR_DAY_NUMBER_1ST :1
|
STR_ORDINAL_NUMBER_19TH :19
|
||||||
STR_DAY_NUMBER_2ND :2
|
STR_ORDINAL_NUMBER_20TH :20
|
||||||
STR_DAY_NUMBER_3RD :3
|
STR_ORDINAL_NUMBER_21ST :21
|
||||||
STR_DAY_NUMBER_4TH :4
|
STR_ORDINAL_NUMBER_22ND :22
|
||||||
STR_DAY_NUMBER_5TH :5
|
STR_ORDINAL_NUMBER_23RD :23
|
||||||
STR_DAY_NUMBER_6TH :6
|
STR_ORDINAL_NUMBER_24TH :24
|
||||||
STR_DAY_NUMBER_7TH :7
|
STR_ORDINAL_NUMBER_25TH :25
|
||||||
STR_DAY_NUMBER_8TH :8
|
STR_ORDINAL_NUMBER_26TH :26
|
||||||
STR_DAY_NUMBER_9TH :9
|
STR_ORDINAL_NUMBER_27TH :27
|
||||||
STR_DAY_NUMBER_10TH :10
|
STR_ORDINAL_NUMBER_28TH :28
|
||||||
STR_DAY_NUMBER_11TH :11
|
STR_ORDINAL_NUMBER_29TH :29
|
||||||
STR_DAY_NUMBER_12TH :12
|
STR_ORDINAL_NUMBER_30TH :30
|
||||||
STR_DAY_NUMBER_13TH :13
|
STR_ORDINAL_NUMBER_31ST :31
|
||||||
STR_DAY_NUMBER_14TH :14
|
|
||||||
STR_DAY_NUMBER_15TH :15
|
|
||||||
STR_DAY_NUMBER_16TH :16
|
|
||||||
STR_DAY_NUMBER_17TH :17
|
|
||||||
STR_DAY_NUMBER_18TH :18
|
|
||||||
STR_DAY_NUMBER_19TH :19
|
|
||||||
STR_DAY_NUMBER_20TH :20
|
|
||||||
STR_DAY_NUMBER_21ST :21
|
|
||||||
STR_DAY_NUMBER_22ND :22
|
|
||||||
STR_DAY_NUMBER_23RD :23
|
|
||||||
STR_DAY_NUMBER_24TH :24
|
|
||||||
STR_DAY_NUMBER_25TH :25
|
|
||||||
STR_DAY_NUMBER_26TH :26
|
|
||||||
STR_DAY_NUMBER_27TH :27
|
|
||||||
STR_DAY_NUMBER_28TH :28
|
|
||||||
STR_DAY_NUMBER_29TH :29
|
|
||||||
STR_DAY_NUMBER_30TH :30
|
|
||||||
STR_DAY_NUMBER_31ST :31
|
|
||||||
############ range for days ends
|
############ range for days ends
|
||||||
|
|
||||||
############ range for months starts
|
############ range for months starts
|
||||||
@@ -808,11 +785,13 @@ STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE
|
|||||||
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} تنتظر في حوض السفن
|
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} تنتظر في حوض السفن
|
||||||
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} تنتظر في الحظيرة
|
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} تنتظر في الحظيرة
|
||||||
|
|
||||||
# Order review system / warnings
|
# Start of order review system
|
||||||
|
# DON'T ADD OR REMOVE LINES HERE
|
||||||
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} لديها اوامر قليلة جدا في جدولها
|
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} لديها اوامر قليلة جدا في جدولها
|
||||||
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} لديها امر غير صالح
|
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} لديها امر غير صالح
|
||||||
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} لديها امر مكرر
|
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} لديها امر مكرر
|
||||||
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} لديها محطة غير صالحة في القائمة
|
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} لديها محطة غير صالحة في القائمة
|
||||||
|
# end of order system
|
||||||
|
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} اصبحت قديمة
|
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} اصبحت قديمة
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} اصبحت قديمة جدا
|
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} اصبحت قديمة جدا
|
||||||
@@ -927,13 +906,11 @@ STR_GAME_OPTIONS_TOWN_NAME_CATALAN :كتالوني
|
|||||||
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}حفظ آلي
|
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}حفظ آلي
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}اختار مدة الحفظ الآلي
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}اختار مدة الحفظ الآلي
|
||||||
|
|
||||||
############ start of autosave dropdown
|
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :بدون
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :بدون
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :كل شهر
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :كل شهر
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :كل 3 اشهر
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :كل 3 اشهر
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :كل 6 اشهر
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :كل 6 اشهر
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :كل سنة
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :كل سنة
|
||||||
############ end of autosave dropdown
|
|
||||||
|
|
||||||
STR_GAME_OPTIONS_LANGUAGE :{BLACK}لغة
|
STR_GAME_OPTIONS_LANGUAGE :{BLACK}لغة
|
||||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}اختر لغة الواجهه
|
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}اختر لغة الواجهه
|
||||||
@@ -962,7 +939,6 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}اختر
|
|||||||
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} ملف غير صالح{P ""}
|
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} ملف غير صالح{P ""}
|
||||||
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}معلومات اضافية عن الموسيقى الاساسية
|
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}معلومات اضافية عن الموسيقى الاساسية
|
||||||
|
|
||||||
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}فشل في استرداد قائمة الدقة المدعومة
|
|
||||||
STR_ERROR_FULLSCREEN_FAILED :{WHITE}فشل تشغيل نمط الشاشة الكاملة
|
STR_ERROR_FULLSCREEN_FAILED :{WHITE}فشل تشغيل نمط الشاشة الكاملة
|
||||||
|
|
||||||
# Custom currency window
|
# Custom currency window
|
||||||
@@ -1053,8 +1029,7 @@ STR_CONFIG_SETTING_CAPTION :{WHITE}إعدا
|
|||||||
STR_CONFIG_SETTING_EXPAND_ALL :مدد الكل
|
STR_CONFIG_SETTING_EXPAND_ALL :مدد الكل
|
||||||
STR_CONFIG_SETTING_COLLAPSE_ALL :إسحب الكل
|
STR_CONFIG_SETTING_COLLAPSE_ALL :إسحب الكل
|
||||||
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK} فئة:
|
STR_CONFIG_SETTING_RESTRICT_LABEL :اظهر:
|
||||||
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}نوع:
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_BASIC :اﻹعدادات الاساسيه
|
STR_CONFIG_SETTING_RESTRICT_BASIC :اﻹعدادات الاساسيه
|
||||||
|
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT :{BLACK}احصر القائمة على انواع اعدادات محددة
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT :{BLACK}احصر القائمة على انواع اعدادات محددة
|
||||||
@@ -1064,8 +1039,6 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :اعدادات
|
|||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :اعدادات اللعبة (مخزن في المحفوظات, يؤثر على اللعبة الحالية فقط)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :اعدادات اللعبة (مخزن في المحفوظات, يؤثر على اللعبة الحالية فقط)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :اعدادات الشركة (مخزن في المحفوظات, يؤثر على الالعاب الجديدة فقط)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :اعدادات الشركة (مخزن في المحفوظات, يؤثر على الالعاب الجديدة فقط)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :اعدادات الشركة (مخزن في المحفوظات: يؤثر على الشركة الحالية فقط)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :اعدادات الشركة (مخزن في المحفوظات: يؤثر على الشركة الحالية فقط)
|
||||||
STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}عرض جميع النتائج بالنسبة للإعداد {}{SILVER} الفئة {BLACK} إلى {WHITE}{STRING} {BLACK}و{SILVER}نوع {BLACK} إلى{WHITE} جميع انواع الإعدادات
|
|
||||||
STR_CONFIG_SETTINGS_NONE :{WHITE} - بدون -
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_OFF :قفل
|
STR_CONFIG_SETTING_OFF :قفل
|
||||||
STR_CONFIG_SETTING_ON :فتح
|
STR_CONFIG_SETTING_ON :فتح
|
||||||
@@ -1145,7 +1118,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR :مولد الأ
|
|||||||
STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :الأصلي
|
STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :الأصلي
|
||||||
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :مرتفعات منزلقة
|
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :مرتفعات منزلقة
|
||||||
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :ارتفاع خط الثلج: {STRING}
|
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :ارتفاع خط الثلج: {STRING}
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :خشونة التضاريس (صفر التكوين فقط ) :({STRING}
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :خشونة التضاريس (سفر التكوين فقط ) :({STRING}
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :ناعم جدا
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :ناعم جدا
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :ناعم
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :ناعم
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :خشن
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :خشن
|
||||||
@@ -1233,10 +1206,10 @@ STR_CONFIG_SETTING_SOUND_AMBIENT :مؤثرات: {
|
|||||||
STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :شغل مؤثرات صوتية في المناظر و المصانع و المدن
|
STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :شغل مؤثرات صوتية في المناظر و المصانع و المدن
|
||||||
|
|
||||||
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :عطل ادوات البناء عند عدم وجود عربات متاحة لها: {STRING}
|
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :عطل ادوات البناء عند عدم وجود عربات متاحة لها: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_TRAINS :الحد الأعلى لعدد القطارات لكل شركة: {STRING}
|
STR_CONFIG_SETTING_MAX_TRAINS :الحد الأعلى لعدد القطارات لكل لاعب: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :الحد الأعلى لعدد العربات لكل شركة: {STRING}
|
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :الحد الأعلى لعدد العربات لكل لاعب: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_AIRCRAFT :الحد الأعلى لعدد الطائرات لكل شركة: {STRING}
|
STR_CONFIG_SETTING_MAX_AIRCRAFT :الحد الأعلى لعدد الطائرات لكل لاعب: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_SHIPS :الحد الأعلى لعدد السفن لكل شركة: {STRING}
|
STR_CONFIG_SETTING_MAX_SHIPS :الحد الأعلى لعدد السفن لكل لاعب: {STRING}
|
||||||
|
|
||||||
STR_CONFIG_SETTING_AI_BUILDS_TRAINS :حظر القطارات على الحاسوب: {STRING}
|
STR_CONFIG_SETTING_AI_BUILDS_TRAINS :حظر القطارات على الحاسوب: {STRING}
|
||||||
STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :حظر العربات على الكمبيوتر: {STRING}
|
STR_CONFIG_SETTING_AI_BUILDS_ROAD_VEHICLES :حظر العربات على الكمبيوتر: {STRING}
|
||||||
@@ -1502,7 +1475,6 @@ STR_LIVERY_FREIGHT_TRAM :عربة ترا
|
|||||||
STR_FACE_CAPTION :{WHITE}اختيار الوجة
|
STR_FACE_CAPTION :{WHITE}اختيار الوجة
|
||||||
STR_FACE_CANCEL_TOOLTIP :{BLACK}الغاء اختيار الوجة الجديد
|
STR_FACE_CANCEL_TOOLTIP :{BLACK}الغاء اختيار الوجة الجديد
|
||||||
STR_FACE_OK_TOOLTIP :{BLACK}اقبل الوجة الجديد
|
STR_FACE_OK_TOOLTIP :{BLACK}اقبل الوجة الجديد
|
||||||
STR_MAPGEN_RANDOM :{BLACK}عشوائي
|
|
||||||
|
|
||||||
STR_FACE_MALE_BUTTON :{BLACK}رجل
|
STR_FACE_MALE_BUTTON :{BLACK}رجل
|
||||||
STR_FACE_MALE_TOOLTIP :{BLACK}اختر وجة رجل
|
STR_FACE_MALE_TOOLTIP :{BLACK}اختر وجة رجل
|
||||||
@@ -1617,7 +1589,7 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}ضع ك
|
|||||||
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}احم لعبتك برقم سري حتى لا تصبح لعبتك مفتوحة للجميع
|
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}احم لعبتك برقم سري حتى لا تصبح لعبتك مفتوحة للجميع
|
||||||
|
|
||||||
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM}عميل
|
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM}عميل
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}اقصى عدد للعملاء:
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}اقصى عدد عملاء:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}أختر أقصى عدد للعملاء
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}أختر أقصى عدد للعملاء
|
||||||
STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM}شركة
|
STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM}شركة
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}أقصى عدد شركات:
|
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}أقصى عدد شركات:
|
||||||
@@ -2211,7 +2183,6 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF:
|
|||||||
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}الشحنة المقبولة: {LTBLUE}
|
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}الشحنة المقبولة: {LTBLUE}
|
||||||
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA} /8 {STRING})
|
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA} /8 {STRING})
|
||||||
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}حدود سرعة سكة الحديد: {LTBLUE}{VELOCITY}
|
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}حدود سرعة سكة الحديد: {LTBLUE}{VELOCITY}
|
||||||
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}حدود سرعه الطريق: {LTBLUE}{VELOCITY}
|
|
||||||
|
|
||||||
# Description of land area of different tiles
|
# Description of land area of different tiles
|
||||||
STR_LAI_CLEAR_DESCRIPTION_ROCKS :صخور
|
STR_LAI_CLEAR_DESCRIPTION_ROCKS :صخور
|
||||||
@@ -2327,7 +2298,6 @@ STR_SAVELOAD_SAVE_BUTTON :{BLACK}حفظ
|
|||||||
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}احفظ اللعبة الحالية، بواسطة الاسم المختار
|
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}احفظ اللعبة الحالية، بواسطة الاسم المختار
|
||||||
STR_SAVELOAD_LOAD_BUTTON :{BLACK}تحميل
|
STR_SAVELOAD_LOAD_BUTTON :{BLACK}تحميل
|
||||||
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}تحميل اللعبة المختارة
|
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}تحميل اللعبة المختارة
|
||||||
STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK} حمل خارطة التضاريس
|
|
||||||
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}تفاصيل اللعبة
|
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}تفاصيل اللعبة
|
||||||
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}لا توجد معلومات متاحة
|
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}لا توجد معلومات متاحة
|
||||||
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
||||||
@@ -2347,6 +2317,7 @@ STR_MAPGEN_SNOW_LINE_UP :{BLACK}ارفع
|
|||||||
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}خفض خط الثلج مستوى واحد
|
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}خفض خط الثلج مستوى واحد
|
||||||
STR_MAPGEN_RANDOM_SEED :{BLACK}مرجع عشوائي
|
STR_MAPGEN_RANDOM_SEED :{BLACK}مرجع عشوائي
|
||||||
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}اضغط لادخال مرجع عشوائي
|
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}اضغط لادخال مرجع عشوائي
|
||||||
|
STR_MAPGEN_RANDOM :{BLACK}عشوائي
|
||||||
STR_MAPGEN_RANDOM_HELP :{BLACK}غير المرجع العشوائي لتوليد تضاريس الخريطة
|
STR_MAPGEN_RANDOM_HELP :{BLACK}غير المرجع العشوائي لتوليد تضاريس الخريطة
|
||||||
STR_MAPGEN_LAND_GENERATOR :{BLACK}مولد الخريطة:
|
STR_MAPGEN_LAND_GENERATOR :{BLACK}مولد الخريطة:
|
||||||
STR_MAPGEN_TREE_PLACER :{BLACK} لوغاريثم الشجر:
|
STR_MAPGEN_TREE_PLACER :{BLACK} لوغاريثم الشجر:
|
||||||
@@ -2451,8 +2422,6 @@ STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}لم يت
|
|||||||
STR_NEWGRF_SETTINGS_DISABLED :{RED}معطل
|
STR_NEWGRF_SETTINGS_DISABLED :{RED}معطل
|
||||||
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}متعارض مع هذا اللإصدار من Openttd
|
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}متعارض مع هذا اللإصدار من Openttd
|
||||||
|
|
||||||
# NewGRF save preset window
|
|
||||||
|
|
||||||
# NewGRF parameters window
|
# NewGRF parameters window
|
||||||
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}غير خصائص الاضافات الجديدة
|
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}غير خصائص الاضافات الجديدة
|
||||||
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}اغلق
|
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}اغلق
|
||||||
@@ -2546,7 +2515,6 @@ STR_NEWGRF_INVALID_ENGINE :<موديل ا
|
|||||||
STR_NEWGRF_INVALID_INDUSTRYTYPE :<المصنع غير صالح>
|
STR_NEWGRF_INVALID_INDUSTRYTYPE :<المصنع غير صالح>
|
||||||
|
|
||||||
# Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script).
|
# Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script).
|
||||||
STR_INVALID_VEHICLE :<مركبه غير صالحه>
|
|
||||||
|
|
||||||
# NewGRF scanning window
|
# NewGRF scanning window
|
||||||
STR_NEWGRF_SCAN_CAPTION :{WHITE}بحث اضافات جديدة
|
STR_NEWGRF_SCAN_CAPTION :{WHITE}بحث اضافات جديدة
|
||||||
@@ -3364,7 +3332,7 @@ STR_TIMETABLE_TOOLTIP :{BLACK}جدول
|
|||||||
STR_TIMETABLE_NO_TRAVEL :لا رحيل
|
STR_TIMETABLE_NO_TRAVEL :لا رحيل
|
||||||
STR_TIMETABLE_NOT_TIMETABLEABLE :المغادرة (ذاتي: بواسطة الامر اليدوي التالي)
|
STR_TIMETABLE_NOT_TIMETABLEABLE :المغادرة (ذاتي: بواسطة الامر اليدوي التالي)
|
||||||
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :مسافر (غير مجدوله)
|
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :مسافر (غير مجدوله)
|
||||||
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :سافر(بدون جدول زمني) مع تقريبا {2:VELOCITY}
|
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :سافر بمعدل {2:VELOCITY} (بدون جدوله)
|
||||||
STR_TIMETABLE_TRAVEL_FOR :مسافر لـ {STRING}
|
STR_TIMETABLE_TRAVEL_FOR :مسافر لـ {STRING}
|
||||||
STR_TIMETABLE_TRAVEL_FOR_SPEED :سافر لي {STRING} بمعدل {VELOCITY}
|
STR_TIMETABLE_TRAVEL_FOR_SPEED :سافر لي {STRING} بمعدل {VELOCITY}
|
||||||
STR_TIMETABLE_STAY_FOR :ويبقى لـ {STRING}
|
STR_TIMETABLE_STAY_FOR :ويبقى لـ {STRING}
|
||||||
|
@@ -199,26 +199,21 @@ STR_UNITS_POWER_IMPERIAL :{COMMA}hp
|
|||||||
STR_UNITS_POWER_METRIC :{COMMA}hp
|
STR_UNITS_POWER_METRIC :{COMMA}hp
|
||||||
STR_UNITS_POWER_SI :{COMMA}kW
|
STR_UNITS_POWER_SI :{COMMA}kW
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}t
|
|
||||||
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t
|
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}t
|
||||||
STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg
|
STR_UNITS_WEIGHT_SHORT_SI :{COMMA}kg
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA} tona{P "" s}
|
|
||||||
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} tona
|
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} tona
|
||||||
STR_UNITS_WEIGHT_LONG_SI :{COMMA} kg
|
STR_UNITS_WEIGHT_LONG_SI :{COMMA} kg
|
||||||
|
|
||||||
STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}galoi
|
|
||||||
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}l
|
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}l
|
||||||
STR_UNITS_VOLUME_SHORT_SI :{COMMA}m³
|
STR_UNITS_VOLUME_SHORT_SI :{COMMA}m³
|
||||||
|
|
||||||
STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA} galoi{P "" s}
|
|
||||||
STR_UNITS_VOLUME_LONG_METRIC :{COMMA} litro
|
STR_UNITS_VOLUME_LONG_METRIC :{COMMA} litro
|
||||||
STR_UNITS_VOLUME_LONG_SI :{COMMA} m³
|
STR_UNITS_VOLUME_LONG_SI :{COMMA} m³
|
||||||
|
|
||||||
STR_UNITS_FORCE_SI :{COMMA} kN
|
STR_UNITS_FORCE_SI :{COMMA} kN
|
||||||
|
|
||||||
STR_UNITS_HEIGHT_IMPERIAL :{COMMA} ft
|
STR_UNITS_HEIGHT_IMPERIAL :{COMMA} ft
|
||||||
STR_UNITS_HEIGHT_METRIC :{COMMA} m
|
|
||||||
STR_UNITS_HEIGHT_SI :{COMMA} m
|
STR_UNITS_HEIGHT_SI :{COMMA} m
|
||||||
|
|
||||||
# Common window strings
|
# Common window strings
|
||||||
@@ -226,7 +221,6 @@ STR_LIST_FILTER_TITLE :{BLACK}Lokarri
|
|||||||
STR_LIST_FILTER_OSKTITLE :{BLACK}Sartu lokarri iragazkia
|
STR_LIST_FILTER_OSKTITLE :{BLACK}Sartu lokarri iragazkia
|
||||||
STR_LIST_FILTER_TOOLTIP :{BLACK}Sartu hitz bat iragazkian zerrendan aurkitzeko
|
STR_LIST_FILTER_TOOLTIP :{BLACK}Sartu hitz bat iragazkian zerrendan aurkitzeko
|
||||||
|
|
||||||
STR_TOOLTIP_GROUP_ORDER :{BLACK}Aukeratu taldekatzeko ordena
|
|
||||||
STR_TOOLTIP_SORT_ORDER :{BLACK}Hautatu agertze ordena (deszendientea/aszendientea)
|
STR_TOOLTIP_SORT_ORDER :{BLACK}Hautatu agertze ordena (deszendientea/aszendientea)
|
||||||
STR_TOOLTIP_SORT_CRITERIA :{BLACK}Aukeratu ordenatze irizpideak
|
STR_TOOLTIP_SORT_CRITERIA :{BLACK}Aukeratu ordenatze irizpideak
|
||||||
STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Aukeratu iragazki irizpideak
|
STR_TOOLTIP_FILTER_CRITERIA :{BLACK}Aukeratu iragazki irizpideak
|
||||||
@@ -245,9 +239,6 @@ STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra mu
|
|||||||
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra mugitu - zerrendan ezkerra/eskuinera mugitzeko
|
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra mugitu - zerrendan ezkerra/eskuinera mugitzeko
|
||||||
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Eraikinak etab. edo lur karratu bat eraistea. Ctrl area diagonalki aukeratzen du. Mayus eraikinaren kostu estimatua erakusten du.
|
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Eraikinak etab. edo lur karratu bat eraistea. Ctrl area diagonalki aukeratzen du. Mayus eraikinaren kostu estimatua erakusten du.
|
||||||
|
|
||||||
# Show engines button
|
|
||||||
|
|
||||||
|
|
||||||
# Query window
|
# Query window
|
||||||
STR_BUTTON_DEFAULT :{BLACK}Lehenetsia
|
STR_BUTTON_DEFAULT :{BLACK}Lehenetsia
|
||||||
STR_BUTTON_CANCEL :{BLACK}Ezeztatu
|
STR_BUTTON_CANCEL :{BLACK}Ezeztatu
|
||||||
@@ -297,7 +288,6 @@ STR_SORT_BY_POWER_VS_RUNNING_COST :Potentzia/Mante
|
|||||||
STR_SORT_BY_CARGO_CAPACITY :Zama Edukiera
|
STR_SORT_BY_CARGO_CAPACITY :Zama Edukiera
|
||||||
STR_SORT_BY_RANGE :Irismena
|
STR_SORT_BY_RANGE :Irismena
|
||||||
STR_SORT_BY_POPULATION :Biztanleria
|
STR_SORT_BY_POPULATION :Biztanleria
|
||||||
STR_SORT_BY_RATING :Balorazioa
|
|
||||||
|
|
||||||
# Tooltips for the main toolbar
|
# Tooltips for the main toolbar
|
||||||
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Jokoa pausatu
|
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Jokoa pausatu
|
||||||
@@ -465,7 +455,7 @@ STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Kaxen neurriak
|
|||||||
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Txandakatu bloke zikinen kolorea
|
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Txandakatu bloke zikinen kolorea
|
||||||
############ range ends here
|
############ range ends here
|
||||||
|
|
||||||
############ range for ordinal numbers used for the place in the highscore window
|
############ range for days starts (also used for the place in the highscore window)
|
||||||
STR_ORDINAL_NUMBER_1ST :1.
|
STR_ORDINAL_NUMBER_1ST :1.
|
||||||
STR_ORDINAL_NUMBER_2ND :2.
|
STR_ORDINAL_NUMBER_2ND :2.
|
||||||
STR_ORDINAL_NUMBER_3RD :3.
|
STR_ORDINAL_NUMBER_3RD :3.
|
||||||
@@ -481,40 +471,22 @@ STR_ORDINAL_NUMBER_12TH :12.
|
|||||||
STR_ORDINAL_NUMBER_13TH :13.
|
STR_ORDINAL_NUMBER_13TH :13.
|
||||||
STR_ORDINAL_NUMBER_14TH :14.
|
STR_ORDINAL_NUMBER_14TH :14.
|
||||||
STR_ORDINAL_NUMBER_15TH :15.
|
STR_ORDINAL_NUMBER_15TH :15.
|
||||||
############ range for ordinal numbers ends
|
STR_ORDINAL_NUMBER_16TH :16.
|
||||||
|
STR_ORDINAL_NUMBER_17TH :17.
|
||||||
############ range for days starts
|
STR_ORDINAL_NUMBER_18TH :18.
|
||||||
STR_DAY_NUMBER_1ST :1.
|
STR_ORDINAL_NUMBER_19TH :19.
|
||||||
STR_DAY_NUMBER_2ND :2.
|
STR_ORDINAL_NUMBER_20TH :20.
|
||||||
STR_DAY_NUMBER_3RD :3.
|
STR_ORDINAL_NUMBER_21ST :21.
|
||||||
STR_DAY_NUMBER_4TH :4.
|
STR_ORDINAL_NUMBER_22ND :22.
|
||||||
STR_DAY_NUMBER_5TH :5.
|
STR_ORDINAL_NUMBER_23RD :23.
|
||||||
STR_DAY_NUMBER_6TH :6.
|
STR_ORDINAL_NUMBER_24TH :24.
|
||||||
STR_DAY_NUMBER_7TH :7.
|
STR_ORDINAL_NUMBER_25TH :25.
|
||||||
STR_DAY_NUMBER_8TH :8.
|
STR_ORDINAL_NUMBER_26TH :26.
|
||||||
STR_DAY_NUMBER_9TH :9.
|
STR_ORDINAL_NUMBER_27TH :27.
|
||||||
STR_DAY_NUMBER_10TH :10.
|
STR_ORDINAL_NUMBER_28TH :28.
|
||||||
STR_DAY_NUMBER_11TH :11.
|
STR_ORDINAL_NUMBER_29TH :29.
|
||||||
STR_DAY_NUMBER_12TH :12.
|
STR_ORDINAL_NUMBER_30TH :30.
|
||||||
STR_DAY_NUMBER_13TH :13.
|
STR_ORDINAL_NUMBER_31ST :31.
|
||||||
STR_DAY_NUMBER_14TH :14.
|
|
||||||
STR_DAY_NUMBER_15TH :15.
|
|
||||||
STR_DAY_NUMBER_16TH :16.
|
|
||||||
STR_DAY_NUMBER_17TH :17.
|
|
||||||
STR_DAY_NUMBER_18TH :18.
|
|
||||||
STR_DAY_NUMBER_19TH :19.
|
|
||||||
STR_DAY_NUMBER_20TH :20.
|
|
||||||
STR_DAY_NUMBER_21ST :21.
|
|
||||||
STR_DAY_NUMBER_22ND :22.
|
|
||||||
STR_DAY_NUMBER_23RD :23.
|
|
||||||
STR_DAY_NUMBER_24TH :24.
|
|
||||||
STR_DAY_NUMBER_25TH :25.
|
|
||||||
STR_DAY_NUMBER_26TH :26.
|
|
||||||
STR_DAY_NUMBER_27TH :27.
|
|
||||||
STR_DAY_NUMBER_28TH :28.
|
|
||||||
STR_DAY_NUMBER_29TH :29.
|
|
||||||
STR_DAY_NUMBER_30TH :30.
|
|
||||||
STR_DAY_NUMBER_31ST :31.
|
|
||||||
############ range for days ends
|
############ range for days ends
|
||||||
|
|
||||||
############ range for months starts
|
############ range for months starts
|
||||||
@@ -731,7 +703,6 @@ STR_SMALLMAP_LEGENDA_SNOW :{TINY_FONT}{BLA
|
|||||||
STR_SMALLMAP_TOOLTIP_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Aukeratu hirien izenak on/off mapan
|
STR_SMALLMAP_TOOLTIP_TOGGLE_TOWN_NAMES_ON_OFF :{BLACK}Aukeratu hirien izenak on/off mapan
|
||||||
STR_SMALLMAP_CENTER :{BLACK}Mapa txikia orain zauden posizioan zentratu
|
STR_SMALLMAP_CENTER :{BLACK}Mapa txikia orain zauden posizioan zentratu
|
||||||
STR_SMALLMAP_INDUSTRY :{TINY_FONT}{STRING} ({NUM})
|
STR_SMALLMAP_INDUSTRY :{TINY_FONT}{STRING} ({NUM})
|
||||||
STR_SMALLMAP_LINKSTATS :{TINY_FONT}{STRING}
|
|
||||||
STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY}
|
STR_SMALLMAP_COMPANY :{TINY_FONT}{COMPANY}
|
||||||
STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN}
|
STR_SMALLMAP_TOWN :{TINY_FONT}{WHITE}{TOWN}
|
||||||
STR_SMALLMAP_DISABLE_ALL :{BLACK}Dena desgaitu
|
STR_SMALLMAP_DISABLE_ALL :{BLACK}Dena desgaitu
|
||||||
@@ -742,8 +713,6 @@ STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Erakutsi
|
|||||||
STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Garaiera mapa erakutsi/ ez erakutsi
|
STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Garaiera mapa erakutsi/ ez erakutsi
|
||||||
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Ez erakutsi konpainiaren jabetzak mapan.
|
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Ez erakutsi konpainiaren jabetzak mapan.
|
||||||
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Erakutsi konpaniaren propietate denak mapan
|
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Erakutsi konpaniaren propietate denak mapan
|
||||||
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_CARGOS :{BLACK}Ez erakutsi zamarik mapan
|
|
||||||
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_CARGOS :{BLACK}Zama guztiak mapan erakutsi
|
|
||||||
|
|
||||||
# Status bar messages
|
# Status bar messages
|
||||||
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Erakutsi azken mezu edo albiste erreportaia
|
STR_STATUSBAR_TOOLTIP_SHOW_LAST_NEWS :{BLACK}Erakutsi azken mezu edo albiste erreportaia
|
||||||
@@ -820,11 +789,13 @@ STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE
|
|||||||
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} deposituan itxaroten dago
|
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} deposituan itxaroten dago
|
||||||
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} hegazkin deposituan itxaroten dago
|
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} hegazkin deposituan itxaroten dago
|
||||||
|
|
||||||
# Order review system / warnings
|
# Start of order review system
|
||||||
|
# DON'T ADD OR REMOVE LINES HERE
|
||||||
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} agindu gutxiegi ditu zerrendan
|
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} agindu gutxiegi ditu zerrendan
|
||||||
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} agindu zerrenda hutsik du
|
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} agindu zerrenda hutsik du
|
||||||
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} agindu bikoitzak ditu
|
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} agindu bikoitzak ditu
|
||||||
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} geltoki baliogabea du aginduetan
|
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} geltoki baliogabea du aginduetan
|
||||||
|
# end of order system
|
||||||
|
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} zaharra bihurtzen ari da
|
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} zaharra bihurtzen ari da
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} oso zaharra bihurtzen ari da
|
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} oso zaharra bihurtzen ari da
|
||||||
@@ -944,13 +915,11 @@ STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Katalanak
|
|||||||
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Auto-gordea
|
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Auto-gordea
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Aukeratu jokoa automatikoki gordetzeko denbora
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Aukeratu jokoa automatikoki gordetzeko denbora
|
||||||
|
|
||||||
############ start of autosave dropdown
|
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Ez
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Ez
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Hilabetero
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Hilabetero
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :3 hilabetero
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :3 hilabetero
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :6 hilabetero
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :6 hilabetero
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :12 hilabetero
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :12 hilabetero
|
||||||
############ end of autosave dropdown
|
|
||||||
|
|
||||||
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Hizkuntza
|
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Hizkuntza
|
||||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Aukeratu interfazean erabiltzeko hizkuntza
|
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Aukeratu interfazean erabiltzeko hizkuntza
|
||||||
@@ -1078,8 +1047,7 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :Joko ezarpenak
|
|||||||
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Konpainia ezarpenak (Gorden bilduta; bakarrik joko berriei eragingo die)
|
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Konpainia ezarpenak (Gorden bilduta; bakarrik joko berriei eragingo die)
|
||||||
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Konpainia ezarpenak (Gorden bilduta; bakarrik uneko konpainiari eragiten dio)
|
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Konpainia ezarpenak (Gorden bilduta; bakarrik uneko konpainiari eragiten dio)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Kategoria:
|
STR_CONFIG_SETTING_RESTRICT_LABEL :{BLACK}Erakutsi
|
||||||
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Mota:
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Beheko zerrenda laburtu bakarrik aldatutako ezarpenak erakutsiz
|
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Beheko zerrenda laburtu bakarrik aldatutako ezarpenak erakutsiz
|
||||||
STR_CONFIG_SETTING_RESTRICT_BASIC :Oinarrizko ezarpenak
|
STR_CONFIG_SETTING_RESTRICT_BASIC :Oinarrizko ezarpenak
|
||||||
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Ezarpen aurreratuak
|
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Ezarpen aurreratuak
|
||||||
@@ -1087,7 +1055,6 @@ STR_CONFIG_SETTING_RESTRICT_ALL :Adituentzako ez
|
|||||||
STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_DEFAULT :Ezarpenak lehenetsitakoen balio ezberdinarekin
|
STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_DEFAULT :Ezarpenak lehenetsitakoen balio ezberdinarekin
|
||||||
STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Balio ezberdinak dituzten ezarpenak zure joko berriaren ezarpenekin alderatuta
|
STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Balio ezberdinak dituzten ezarpenak zure joko berriaren ezarpenekin alderatuta
|
||||||
|
|
||||||
STR_CONFIG_SETTINGS_NONE :{WHITE}- Ezer ez -
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_OFF :Itzalita
|
STR_CONFIG_SETTING_OFF :Itzalita
|
||||||
STR_CONFIG_SETTING_ON :Piztuta
|
STR_CONFIG_SETTING_ON :Piztuta
|
||||||
@@ -1536,50 +1503,21 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Joko hasieran h
|
|||||||
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD :Errepideak eraikitzerakoan elementu ez egokiak eragotzi: {STRING}
|
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD :Errepideak eraikitzerakoan elementu ez egokiak eragotzi: {STRING}
|
||||||
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD_HELPTEXT :Errepide berreraikuntza ordaintzerakoan irteerarik gabeko errepideak kentzea
|
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD_HELPTEXT :Errepide berreraikuntza ordaintzerakoan irteerarik gabeko errepideak kentzea
|
||||||
|
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :eskuz egin
|
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :asimetrikoa
|
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :simetrikoa
|
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Banaketen zehaztasuna: {STRING}
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Abiadura unitateak: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Inperiala (milia/orduko)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metrikoa (km/h)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Ibilgailuen indar unitateak: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Inperiala (zp)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Metrikoa (zp)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Pisu unitateak: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :Metrikoa (t/tona)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :SI (kg)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Bolumen unitateak: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Inperiala (galoi)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :Metrikoa (l)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :SI (m³)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :Metrikoa (kgf)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Garaiera unitateak: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Inperiala (oin)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metrikoa (m)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_GUI :{ORANGE}Interfazea
|
STR_CONFIG_SETTING_GUI :{ORANGE}Interfazea
|
||||||
STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Kokapena
|
|
||||||
STR_CONFIG_SETTING_CONSTRUCTION :{ORANGE}Eraikuntza
|
STR_CONFIG_SETTING_CONSTRUCTION :{ORANGE}Eraikuntza
|
||||||
STR_CONFIG_SETTING_VEHICLES :{ORANGE}Ibilgailuak
|
STR_CONFIG_SETTING_VEHICLES :{ORANGE}Ibilgailuak
|
||||||
STR_CONFIG_SETTING_STATIONS :{ORANGE}Geltokiak
|
STR_CONFIG_SETTING_STATIONS :{ORANGE}Geltokiak
|
||||||
STR_CONFIG_SETTING_ECONOMY :{ORANGE}Ekonomia
|
STR_CONFIG_SETTING_ECONOMY :{ORANGE}Ekonomia
|
||||||
STR_CONFIG_SETTING_LINKGRAPH :{ORANGE}Zama Banaketa
|
|
||||||
STR_CONFIG_SETTING_AI :{ORANGE}Lehiakideak
|
STR_CONFIG_SETTING_AI :{ORANGE}Lehiakideak
|
||||||
STR_CONFIG_SETTING_DISPLAY_OPTIONS :{ORANGE}Aukerak erakutsi
|
STR_CONFIG_SETTING_DISPLAY_OPTIONS :{ORANGE}Aukerak erakutsi
|
||||||
STR_CONFIG_SETTING_INTERACTION :{ORANGE}Interakzioa
|
STR_CONFIG_SETTING_INTERACTION :{ORANGE}Interakzioa
|
||||||
STR_CONFIG_SETTING_SOUND :{ORANGE}Soinu efektuak
|
|
||||||
STR_CONFIG_SETTING_NEWS :{ORANGE}Albisteak eta mezuak
|
|
||||||
STR_CONFIG_SETTING_CONSTRUCTION_SIGNALS :{ORANGE}Seinaleak
|
STR_CONFIG_SETTING_CONSTRUCTION_SIGNALS :{ORANGE}Seinaleak
|
||||||
STR_CONFIG_SETTING_STATIONS_CARGOHANDLING :{ORANGE}Zamak
|
STR_CONFIG_SETTING_STATIONS_CARGOHANDLING :{ORANGE}Zamak
|
||||||
STR_CONFIG_SETTING_AI_NPC :{ORANGE}Ordenagailu jokalariak
|
STR_CONFIG_SETTING_AI_NPC :{ORANGE}Ordenagailu jokalariak
|
||||||
@@ -1622,7 +1560,6 @@ STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... Gord
|
|||||||
STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... jaramonik ez egiten Grafiko baseari '{STRING}': ez da aurkitu
|
STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... jaramonik ez egiten Grafiko baseari '{STRING}': ez da aurkitu
|
||||||
STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... jaramonik ez egiten Soinu Paketeari '{STRING}': ez da aurkitu
|
STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... jaramonik ez egiten Soinu Paketeari '{STRING}': ez da aurkitu
|
||||||
STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... jaramonik ez egiten musika paketeari'{STRING}': ez da aurkitu
|
STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... jaramonik ez egiten musika paketeari'{STRING}': ez da aurkitu
|
||||||
STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Memoriaz kanpo
|
|
||||||
|
|
||||||
# Intro window
|
# Intro window
|
||||||
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
|
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
|
||||||
@@ -1744,7 +1681,6 @@ STR_LIVERY_FREIGHT_TRAM :Merkantzietarak
|
|||||||
STR_FACE_CAPTION :{WHITE}Aurpegia aukeratu
|
STR_FACE_CAPTION :{WHITE}Aurpegia aukeratu
|
||||||
STR_FACE_CANCEL_TOOLTIP :{BLACK}Bertan behera utzi aurpegia aukeratu
|
STR_FACE_CANCEL_TOOLTIP :{BLACK}Bertan behera utzi aurpegia aukeratu
|
||||||
STR_FACE_OK_TOOLTIP :{BLACK}Aurpegi berria onartu
|
STR_FACE_OK_TOOLTIP :{BLACK}Aurpegi berria onartu
|
||||||
STR_MAPGEN_RANDOM :{BLACK}Ausaz egin
|
|
||||||
|
|
||||||
STR_FACE_MALE_BUTTON :{BLACK}Gizonezkoa
|
STR_FACE_MALE_BUTTON :{BLACK}Gizonezkoa
|
||||||
STR_FACE_MALE_TOOLTIP :{BLACK}Aukeratu gizonezko aurpegiak
|
STR_FACE_MALE_TOOLTIP :{BLACK}Aukeratu gizonezko aurpegiak
|
||||||
@@ -1800,8 +1736,6 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Aldatu k
|
|||||||
|
|
||||||
# Network server list
|
# Network server list
|
||||||
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Multijokalaria
|
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Multijokalaria
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_NO :Ez
|
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_YES :Bai
|
|
||||||
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Jokalariaren izena:
|
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Jokalariaren izena:
|
||||||
STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Izen honen bidez ezagutua izango zara beste jokalarien artean
|
STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Izen honen bidez ezagutua izango zara beste jokalarien artean
|
||||||
|
|
||||||
@@ -1860,8 +1794,6 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Jokoaren
|
|||||||
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Pasahitza ezarri
|
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Pasahitza ezarri
|
||||||
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Babestu zure jokoa pasahitz batekin ez baduzu nahi publikoa izatea
|
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Babestu zure jokoa pasahitz batekin ez baduzu nahi publikoa izatea
|
||||||
|
|
||||||
STR_NETWORK_START_SERVER_UNADVERTISED :Ez
|
|
||||||
STR_NETWORK_START_SERVER_ADVERTISED :Bai
|
|
||||||
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} Bezero
|
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} Bezero
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Gehienezko bezeroak:
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Gehienezko bezeroak:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Gehienezko bezero kopurua aukeratu. Ez da beharrezkoa guztia betetzea
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Gehienezko bezero kopurua aukeratu. Ez da beharrezkoa guztia betetzea
|
||||||
@@ -1982,7 +1914,6 @@ STR_NETWORK_CLIENT :Bezeroa
|
|||||||
STR_NETWORK_SPECTATORS :Ikusleak
|
STR_NETWORK_SPECTATORS :Ikusleak
|
||||||
|
|
||||||
STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Eman nahi duzun diru kantitatea ezarri
|
STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Eman nahi duzun diru kantitatea ezarri
|
||||||
STR_NETWORK_TOOLBAR_LIST_SPECTATOR :{BLACK}Ikusle
|
|
||||||
|
|
||||||
# Network set password
|
# Network set password
|
||||||
STR_COMPANY_PASSWORD_CANCEL :{BLACK}Ez gorde sartutako pasahitza
|
STR_COMPANY_PASSWORD_CANCEL :{BLACK}Ez gorde sartutako pasahitza
|
||||||
@@ -2172,12 +2103,8 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Zama adi
|
|||||||
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Objektuak ikusezinak egin, gardenak izan ordez
|
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Objektuak ikusezinak egin, gardenak izan ordez
|
||||||
|
|
||||||
# Linkgraph legend window
|
# Linkgraph legend window
|
||||||
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Denak
|
|
||||||
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Bat ere ez
|
|
||||||
|
|
||||||
# Linkgraph legend window and linkgraph legend in smallmap
|
# Linkgraph legend window and linkgraph legend in smallmap
|
||||||
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}erabiltzeke
|
|
||||||
STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}saturatua
|
|
||||||
|
|
||||||
# Base for station construction window(s)
|
# Base for station construction window(s)
|
||||||
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Geltoki irismena erakutsi
|
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Geltoki irismena erakutsi
|
||||||
@@ -2239,7 +2166,7 @@ STR_STATION_BUILD_DRAG_DROP_TOOLTIP :{BLACK}Geltokia
|
|||||||
STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Eraikiko den geltoki mota
|
STR_STATION_BUILD_STATION_CLASS_TOOLTIP :{BLACK}Eraikiko den geltoki mota
|
||||||
STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Eraikiko den geltoki mota
|
STR_STATION_BUILD_STATION_TYPE_TOOLTIP :{BLACK}Eraikiko den geltoki mota
|
||||||
|
|
||||||
STR_STATION_CLASS_DFLT :Geltoki lehenetsia
|
STR_STATION_CLASS_DFLT :Oinarrizko geltokia
|
||||||
STR_STATION_CLASS_WAYP :Bidepuntuak
|
STR_STATION_CLASS_WAYP :Bidepuntuak
|
||||||
|
|
||||||
# Signal window
|
# Signal window
|
||||||
@@ -2481,7 +2408,6 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF:
|
|||||||
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Onartutako zama: {LTBLUE}
|
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Onartutako zama: {LTBLUE}
|
||||||
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
|
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
|
||||||
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Trenbidearen abiadura muga: {LTBLUE}{VELOCITY}
|
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Trenbidearen abiadura muga: {LTBLUE}{VELOCITY}
|
||||||
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Bideko abiadura muga: {LTBLUE}{VELOCITY}
|
|
||||||
|
|
||||||
# Description of land area of different tiles
|
# Description of land area of different tiles
|
||||||
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Haitzak
|
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Haitzak
|
||||||
@@ -2597,7 +2523,6 @@ STR_SAVELOAD_SAVE_BUTTON :{BLACK}Gorde
|
|||||||
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Jokoa gorde, aukeratutako izenarekin
|
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Jokoa gorde, aukeratutako izenarekin
|
||||||
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Kargatu
|
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Kargatu
|
||||||
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Aukeratutako jokoa kargatu
|
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Aukeratutako jokoa kargatu
|
||||||
STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Aukeratutako garaiera mapa kargatu
|
|
||||||
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Jokoaren Xehetasunak
|
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Jokoaren Xehetasunak
|
||||||
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Ez dago informaziorik
|
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Ez dago informaziorik
|
||||||
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
||||||
@@ -2617,6 +2542,7 @@ STR_MAPGEN_SNOW_LINE_UP :{BLACK}Igo punt
|
|||||||
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Jeitsi puntu batean elur garaiera
|
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Jeitsi puntu batean elur garaiera
|
||||||
STR_MAPGEN_RANDOM_SEED :{BLACK}Ausazko hazia:
|
STR_MAPGEN_RANDOM_SEED :{BLACK}Ausazko hazia:
|
||||||
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Klikatu ausazko hazia ezartzeko
|
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Klikatu ausazko hazia ezartzeko
|
||||||
|
STR_MAPGEN_RANDOM :{BLACK}Ausaz egin
|
||||||
STR_MAPGEN_RANDOM_HELP :{BLACK}Ausazko hazia aldatu paisaia sortzeko
|
STR_MAPGEN_RANDOM_HELP :{BLACK}Ausazko hazia aldatu paisaia sortzeko
|
||||||
STR_MAPGEN_LAND_GENERATOR :{BLACK}Paisaia sortzailea:
|
STR_MAPGEN_LAND_GENERATOR :{BLACK}Paisaia sortzailea:
|
||||||
STR_MAPGEN_TREE_PLACER :{BLACK}Zuhaitz algoritmoa:
|
STR_MAPGEN_TREE_PLACER :{BLACK}Zuhaitz algoritmoa:
|
||||||
@@ -2723,8 +2649,6 @@ STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Ez da aurk
|
|||||||
STR_NEWGRF_SETTINGS_DISABLED :{RED}Desgaitua
|
STR_NEWGRF_SETTINGS_DISABLED :{RED}Desgaitua
|
||||||
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}OpenTTD-ren bertsio honekin bateraezina
|
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}OpenTTD-ren bertsio honekin bateraezina
|
||||||
|
|
||||||
# NewGRF save preset window
|
|
||||||
|
|
||||||
# NewGRF parameters window
|
# NewGRF parameters window
|
||||||
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}NewGRF parametroak aldatu
|
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}NewGRF parametroak aldatu
|
||||||
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Itxi
|
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Itxi
|
||||||
@@ -2825,7 +2749,6 @@ STR_NEWGRF_INVALID_ENGINE :<garraio modelo
|
|||||||
STR_NEWGRF_INVALID_INDUSTRYTYPE :<industria baliogabea>
|
STR_NEWGRF_INVALID_INDUSTRYTYPE :<industria baliogabea>
|
||||||
|
|
||||||
# Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script).
|
# Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script).
|
||||||
STR_INVALID_VEHICLE :<ibilgailu ezegokia>
|
|
||||||
|
|
||||||
# NewGRF scanning window
|
# NewGRF scanning window
|
||||||
STR_NEWGRF_SCAN_CAPTION :{WHITE} NewGRF berriak bilatzen.
|
STR_NEWGRF_SCAN_CAPTION :{WHITE} NewGRF berriak bilatzen.
|
||||||
@@ -2908,13 +2831,9 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Urte ba
|
|||||||
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Udaletxea sobornatu zure balorazioa hobetzeko, isun larria jasotzeko arriskuarekinn.{}Kostea: {CURRENCY_LONG}
|
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Udaletxea sobornatu zure balorazioa hobetzeko, isun larria jasotzeko arriskuarekinn.{}Kostea: {CURRENCY_LONG}
|
||||||
|
|
||||||
# Goal window
|
# Goal window
|
||||||
STR_GOALS_CAPTION :{WHITE}{COMPANY} Helburuak
|
|
||||||
STR_GOALS_SPECTATOR_CAPTION :{WHITE}Helburu orokorrak
|
|
||||||
STR_GOALS_GLOBAL_TITLE :{BLACK}Helburu orokorrak:
|
STR_GOALS_GLOBAL_TITLE :{BLACK}Helburu orokorrak:
|
||||||
STR_GOALS_TEXT :{ORANGE}{STRING}
|
STR_GOALS_TEXT :{ORANGE}{STRING}
|
||||||
STR_GOALS_NONE :{ORANGE}- Ezer ez -
|
STR_GOALS_NONE :{ORANGE}- Ezer ez -
|
||||||
STR_GOALS_PROGRESS :{ORANGE}{STRING}
|
|
||||||
STR_GOALS_PROGRESS_COMPLETE :{GREEN}{STRING}
|
|
||||||
STR_GOALS_COMPANY_TITLE :{BLACK}Konpainiaren helburuak:
|
STR_GOALS_COMPANY_TITLE :{BLACK}Konpainiaren helburuak:
|
||||||
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikatu helburuan ikupegi nagusia industrian/herrian/laukian zentratzeko. Ktrl+Klik ikuspegi lehio berria irekiko du industri/herri/laukiaren kokapenean
|
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikatu helburuan ikupegi nagusia industrian/herrian/laukian zentratzeko. Ktrl+Klik ikuspegi lehio berria irekiko du industri/herri/laukiaren kokapenean
|
||||||
|
|
||||||
@@ -2954,13 +2873,6 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING
|
|||||||
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikatu garraio zerbitzuan ikuspegi nagusia industria/herrian zentratzeko. Ktrl+Klik ikuspegi lehio berria irekiko du indutri/herriaren kokapenean
|
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikatu garraio zerbitzuan ikuspegi nagusia industria/herrian zentratzeko. Ktrl+Klik ikuspegi lehio berria irekiko du indutri/herriaren kokapenean
|
||||||
|
|
||||||
# Story book window
|
# Story book window
|
||||||
STR_STORY_BOOK_TITLE :{YELLOW}{STRING}
|
|
||||||
STR_STORY_BOOK_GENERIC_PAGE_ITEM :Orrialdea {NUM}
|
|
||||||
STR_STORY_BOOK_PREV_PAGE :{BLACK}Aurrekoa
|
|
||||||
STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Aurreko orrialdera joan
|
|
||||||
STR_STORY_BOOK_NEXT_PAGE :{BLACK}Hurrengoa
|
|
||||||
STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Hurrengo orrialdera joan
|
|
||||||
STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Helburu erreferentzia baliogabea
|
|
||||||
|
|
||||||
# Station list window
|
# Station list window
|
||||||
STR_STATION_LIST_TOOLTIP :{BLACK}Geltokien izenak - Klikatu geltokiaren izenean ikuspegi nagusia geltokian zentratzeko. Ktrl+Klik Ikuspegi lehio berria irekiko du geltokiaren kokapenean
|
STR_STATION_LIST_TOOLTIP :{BLACK}Geltokien izenak - Klikatu geltokiaren izenean ikuspegi nagusia geltokian zentratzeko. Ktrl+Klik Ikuspegi lehio berria irekiko du geltokiaren kokapenean
|
||||||
@@ -2988,27 +2900,8 @@ STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN
|
|||||||
|
|
||||||
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Zama balorazioak
|
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Zama balorazioak
|
||||||
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Geltokiaren zama balorazioak erakutsi
|
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Geltokiaren zama balorazioak erakutsi
|
||||||
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%)
|
|
||||||
|
|
||||||
STR_STATION_VIEW_WAITING_STATION :Geltokia: Itxaroten
|
|
||||||
STR_STATION_VIEW_WAITING_AMOUNT :Kopurua: Itxoiten
|
|
||||||
STR_STATION_VIEW_FROM :{YELLOW}{CARGO_SHORT} {STATION}-tik
|
|
||||||
STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT}{STATION}-tik
|
|
||||||
STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT}{STATION}-ra
|
|
||||||
STR_STATION_VIEW_FROM_ANY :{RED}{CARGO_SHORT} geltoki ezezagunetik
|
|
||||||
STR_STATION_VIEW_TO_ANY :{RED}{CARGO_SHORT} edozein geltokitara
|
|
||||||
STR_STATION_VIEW_VIA_ANY :{RED}{CARGO_SHORT} edozein geltokitatik pasatuz
|
|
||||||
STR_STATION_VIEW_FROM_HERE :{GREEN}{CARGO_SHORT} geltoki honetatik
|
|
||||||
STR_STATION_VIEW_VIA_HERE :{GREEN}{CARGO_SHORT} geltoki honetan geldituz
|
|
||||||
STR_STATION_VIEW_TO_HERE :{GREEN}{CARGO_SHORT} geltoki honetara
|
|
||||||
STR_STATION_VIEW_NONSTOP :{YELLOW}{CARGO_SHORT} gelditu gabe
|
|
||||||
|
|
||||||
STR_STATION_VIEW_GROUP_S_V_D :Abiapuntua-Bidea-Helburua
|
|
||||||
STR_STATION_VIEW_GROUP_S_D_V :Abiapuntua-Helburua-Bidea
|
|
||||||
STR_STATION_VIEW_GROUP_V_S_D :Bidea-Abiapuntua-Helburua
|
|
||||||
STR_STATION_VIEW_GROUP_V_D_S :Bidea-Helburua-Abiapuntua
|
|
||||||
STR_STATION_VIEW_GROUP_D_S_V :Helburua-Abiapuntua-Bidea
|
|
||||||
STR_STATION_VIEW_GROUP_D_V_S :Helburua-Bidea-Abiapuntua
|
|
||||||
|
|
||||||
############ range for rating starts
|
############ range for rating starts
|
||||||
STR_CARGO_RATING_APPALLING :Negargarria
|
STR_CARGO_RATING_APPALLING :Negargarria
|
||||||
@@ -3151,7 +3044,6 @@ STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Azken hi
|
|||||||
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} (%{COMMA} garraiatua)
|
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} (%{COMMA} garraiatua)
|
||||||
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Ikuspegi nagusia industrian kokatu. Ktrl+Klik ikuspegi lehio berri bat irekiko du industriaren kokapenarekin
|
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Ikuspegi nagusia industrian kokatu. Ktrl+Klik ikuspegi lehio berri bat irekiko du industriaren kokapenarekin
|
||||||
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Ekoizpen kopurua: {YELLOW}{COMMA}%
|
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Ekoizpen kopurua: {YELLOW}{COMMA}%
|
||||||
STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Industriak berehalako itxiera iragarri du!
|
|
||||||
|
|
||||||
############ range for requires starts
|
############ range for requires starts
|
||||||
STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Beharrezkoa du: {YELLOW}{STRING}{STRING}
|
STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Beharrezkoa du: {YELLOW}{STRING}{STRING}
|
||||||
@@ -3267,10 +3159,10 @@ STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_BUTTON :{BLACK}Ibilgail
|
|||||||
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Itsasontia erosi
|
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_BUTTON :{BLACK}Itsasontia erosi
|
||||||
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Hegazkina erosi
|
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}Hegazkina erosi
|
||||||
|
|
||||||
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Aukeratuta dagoen ibilgailua erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
STR_BUY_VEHICLE_TRAIN_BUY_VEHICLE_TOOLTIP :{BLACK}Piztuta dagoen ibilgailua erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
||||||
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Aukeratuta dagoen ibilgailua erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_VEHICLE_TOOLTIP :{BLACK}Piztuta dagoen ibilgailua erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
||||||
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Aukeratuta dagoen itsasontzia erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
STR_BUY_VEHICLE_SHIP_BUY_VEHICLE_TOOLTIP :{BLACK}Piztuta dagoen itsasontzia erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
||||||
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Aukeratuta dagoen hegazkina erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_TOOLTIP :{BLACK}Piztuta dagoen hegazkina erosi. Shift+Klik gutxi gora beherako kostea erakutsi
|
||||||
|
|
||||||
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Berrizendatu
|
STR_BUY_VEHICLE_TRAIN_RENAME_BUTTON :{BLACK}Berrizendatu
|
||||||
STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Berrizendatu
|
STR_BUY_VEHICLE_ROAD_VEHICLE_RENAME_BUTTON :{BLACK}Berrizendatu
|
||||||
@@ -3515,9 +3407,6 @@ STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Mantenim
|
|||||||
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Mantenimendu tartea 10 puntutan igo. Ktrl+klik mantenimendu tartea 5 puntutan igo
|
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Mantenimendu tartea 10 puntutan igo. Ktrl+klik mantenimendu tartea 5 puntutan igo
|
||||||
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Mantenimendu tartea 10 puntutan gutxitu. Ktrl+klik mantenimendu tartea 5 puntutan gutxitu
|
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Mantenimendu tartea 10 puntutan gutxitu. Ktrl+klik mantenimendu tartea 5 puntutan gutxitu
|
||||||
|
|
||||||
STR_VEHICLE_DETAILS_DEFAULT :Lehenetsia
|
|
||||||
STR_VEHICLE_DETAILS_DAYS :Egunak
|
|
||||||
STR_VEHICLE_DETAILS_PERCENT :Ehunekoa
|
|
||||||
|
|
||||||
STR_QUERY_RENAME_TRAIN_CAPTION :{WHITE}Trena izendatu
|
STR_QUERY_RENAME_TRAIN_CAPTION :{WHITE}Trena izendatu
|
||||||
STR_QUERY_RENAME_ROAD_VEHICLE_CAPTION :{WHITE}Errepide ibilgailua izendatu
|
STR_QUERY_RENAME_ROAD_VEHICLE_CAPTION :{WHITE}Errepide ibilgailua izendatu
|
||||||
@@ -3867,7 +3756,6 @@ STR_AI_SETTINGS_START_DELAY :IA hau abiarazt
|
|||||||
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} ren "irakur nazazu" artxiboa
|
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} {STRING} ren "irakur nazazu" artxiboa
|
||||||
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING}-aren aldaketak
|
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} {STRING}-aren aldaketak
|
||||||
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} rako lizentzia
|
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} {STRING} rako lizentzia
|
||||||
STR_TEXTFILE_WRAP_TEXT :{WHITE}Testua trinkotu
|
|
||||||
STR_TEXTFILE_VIEW_README :{BLACK}Ikusi "irakur nazazu"
|
STR_TEXTFILE_VIEW_README :{BLACK}Ikusi "irakur nazazu"
|
||||||
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Aldaketak
|
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Aldaketak
|
||||||
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Lizentzia
|
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Lizentzia
|
||||||
@@ -3890,10 +3778,6 @@ STR_INCOME_FLOAT_INCOME_SMALL :{TINY_FONT}{GRE
|
|||||||
STR_INCOME_FLOAT_INCOME :{GREEN}Sarrerak: {CURRENCY_LONG}
|
STR_INCOME_FLOAT_INCOME :{GREEN}Sarrerak: {CURRENCY_LONG}
|
||||||
STR_FEEDER_TINY :{TINY_FONT}{YELLOW}Transferitu: {CURRENCY_LONG}
|
STR_FEEDER_TINY :{TINY_FONT}{YELLOW}Transferitu: {CURRENCY_LONG}
|
||||||
STR_FEEDER :{YELLOW}Transferitu: {CURRENCY_LONG}
|
STR_FEEDER :{YELLOW}Transferitu: {CURRENCY_LONG}
|
||||||
STR_FEEDER_INCOME_TINY :{TINY_FONT}{YELLOW}Transferitu: {CURRENCY_LONG}{WHITE} / {GREEN}Sarrera: {CURRENCY_LONG}
|
|
||||||
STR_FEEDER_INCOME :{YELLOW}Transferitu: {CURRENCY_LONG}{WHITE} / {GREEN}Sarrera: {CURRENCY_LONG}
|
|
||||||
STR_FEEDER_COST_TINY :{TINY_FONT}{YELLOW}Transferitu: {CURRENCY_LONG}{WHITE} / {RED}Kostua: {CURRENCY_LONG}
|
|
||||||
STR_FEEDER_COST :{YELLOW}Transferitu: {CURRENCY_LONG}{WHITE} / {RED}Kostua: {CURRENCY_LONG}
|
|
||||||
STR_MESSAGE_ESTIMATED_COST :{WHITE}Gutxi gora beherako kostea: {CURRENCY_LONG}
|
STR_MESSAGE_ESTIMATED_COST :{WHITE}Gutxi gora beherako kostea: {CURRENCY_LONG}
|
||||||
STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Gutxi gora beherako sarrerak: {CURRENCY_LONG}
|
STR_MESSAGE_ESTIMATED_INCOME :{WHITE}Gutxi gora beherako sarrerak: {CURRENCY_LONG}
|
||||||
|
|
||||||
@@ -4245,9 +4129,6 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Ezin da
|
|||||||
|
|
||||||
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... garraioa suntsituta
|
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... garraioa suntsituta
|
||||||
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Ez da ibilgailu erabilgarririk egongo
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Aldatu zure NewGRF konfigurazioa
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Ez dago ibilgailu erabilgarririk oraindik
|
|
||||||
|
|
||||||
# Specific vehicle errors
|
# Specific vehicle errors
|
||||||
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Ezin da trena seinalea pasatzera behartu, istripu arriskua...
|
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Ezin da trena seinalea pasatzera behartu, istripu arriskua...
|
||||||
@@ -4292,7 +4173,6 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Ezin da
|
|||||||
STR_DESKTOP_SHORTCUT_COMMENT :Transport Tycoon Deluxe-ren simulazio bat
|
STR_DESKTOP_SHORTCUT_COMMENT :Transport Tycoon Deluxe-ren simulazio bat
|
||||||
|
|
||||||
# Translatable descriptions in media/baseset/*.ob* files
|
# Translatable descriptions in media/baseset/*.ob* files
|
||||||
STR_BASESOUNDS_NONE_DESCRIPTION :Soinurik gabeko soinu pakete bat
|
|
||||||
|
|
||||||
##id 0x2000
|
##id 0x2000
|
||||||
# Town building names
|
# Town building names
|
||||||
@@ -4742,7 +4622,6 @@ STR_JUST_DATE_ISO :{DATE_ISO}
|
|||||||
STR_JUST_STRING :{STRING}
|
STR_JUST_STRING :{STRING}
|
||||||
STR_JUST_STRING_STRING :{STRING}{STRING}
|
STR_JUST_STRING_STRING :{STRING}{STRING}
|
||||||
STR_JUST_RAW_STRING :{STRING}
|
STR_JUST_RAW_STRING :{STRING}
|
||||||
STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING}
|
|
||||||
|
|
||||||
# Slightly 'raw' stringcodes with colour or size
|
# Slightly 'raw' stringcodes with colour or size
|
||||||
STR_BLACK_COMMA :{BLACK}{COMMA}
|
STR_BLACK_COMMA :{BLACK}{COMMA}
|
||||||
|
@@ -408,30 +408,30 @@ STR_CARGO_SINGULAR_FIZZY_DRINK.pre :газіроў
|
|||||||
|
|
||||||
# Quantity of cargo
|
# Quantity of cargo
|
||||||
STR_QUANTITY_NOTHING :
|
STR_QUANTITY_NOTHING :
|
||||||
STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}пасажыр{P "" а аў}
|
STR_QUANTITY_PASSENGERS :{COMMA} пасажыр{P "" а аў}
|
||||||
STR_QUANTITY_COAL :{WEIGHT_LONG} вугалю
|
STR_QUANTITY_COAL :{WEIGHT_LONG} вугалю
|
||||||
STR_QUANTITY_MAIL :{COMMA}{NBSP}мяш{P ок кi коў} пошты
|
STR_QUANTITY_MAIL :{COMMA} мяш{P ок кi коў} пошты
|
||||||
STR_QUANTITY_OIL :{VOLUME_LONG} нафты
|
STR_QUANTITY_OIL :{VOLUME_LONG} нафты
|
||||||
STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}гал{P ава авы оў} жывёлы
|
STR_QUANTITY_LIVESTOCK :{COMMA} гал{P ава авы оў} жывёлы
|
||||||
STR_QUANTITY_GOODS :{COMMA}{NBSP}скрын{P ка кi ак} тавараў
|
STR_QUANTITY_GOODS :{COMMA} скрын{P ка кi ак} тавараў
|
||||||
STR_QUANTITY_GRAIN :{WEIGHT_LONG} зерня
|
STR_QUANTITY_GRAIN :{WEIGHT_LONG} зерня
|
||||||
STR_QUANTITY_WOOD :{WEIGHT_LONG} драўнiны
|
STR_QUANTITY_WOOD :{WEIGHT_LONG} драўнiны
|
||||||
STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} жалезнай руды
|
STR_QUANTITY_IRON_ORE :{WEIGHT_LONG} жалезнай руды
|
||||||
STR_QUANTITY_STEEL :{WEIGHT_LONG} сталi
|
STR_QUANTITY_STEEL :{WEIGHT_LONG} сталi
|
||||||
STR_QUANTITY_VALUABLES :{COMMA}{NBSP}мяш{P ок кi коў} каштоўнасьцяў
|
STR_QUANTITY_VALUABLES :{COMMA} мяш{P ок кi коў} каштоўнасьцяў
|
||||||
STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} меднай руды
|
STR_QUANTITY_COPPER_ORE :{WEIGHT_LONG} меднай руды
|
||||||
STR_QUANTITY_MAIZE :{WEIGHT_LONG} кукурузы
|
STR_QUANTITY_MAIZE :{WEIGHT_LONG} кукурузы
|
||||||
STR_QUANTITY_FRUIT :{WEIGHT_LONG} садавiны
|
STR_QUANTITY_FRUIT :{WEIGHT_LONG} садавiны
|
||||||
STR_QUANTITY_DIAMONDS :{COMMA}{NBSP}мяш{P ок кi коў} алмазаў
|
STR_QUANTITY_DIAMONDS :{COMMA} мяш{P ок кi коў} алмазаў
|
||||||
STR_QUANTITY_FOOD :{WEIGHT_LONG} ежы
|
STR_QUANTITY_FOOD :{WEIGHT_LONG} ежы
|
||||||
STR_QUANTITY_PAPER :{WEIGHT_LONG} паперы
|
STR_QUANTITY_PAPER :{WEIGHT_LONG} паперы
|
||||||
STR_QUANTITY_GOLD :{COMMA}{NBSP}мяш{P ок кi коў} золата
|
STR_QUANTITY_GOLD :{COMMA} мяш{P ок кi коў} золата
|
||||||
STR_QUANTITY_WATER :{VOLUME_LONG} вады
|
STR_QUANTITY_WATER :{VOLUME_LONG} вады
|
||||||
STR_QUANTITY_WHEAT :{WEIGHT_LONG} пшаніцы
|
STR_QUANTITY_WHEAT :{WEIGHT_LONG} пшаніцы
|
||||||
STR_QUANTITY_RUBBER :{VOLUME_LONG} каўчуку
|
STR_QUANTITY_RUBBER :{VOLUME_LONG} каўчуку
|
||||||
STR_QUANTITY_SUGAR :{WEIGHT_LONG} цукру
|
STR_QUANTITY_SUGAR :{WEIGHT_LONG} цукру
|
||||||
STR_QUANTITY_TOYS :{COMMA}{NBSP}цац{P ка кi ак}
|
STR_QUANTITY_TOYS :{COMMA} цац{P ка кi ак}
|
||||||
STR_QUANTITY_SWEETS :{COMMA}{NBSP}скрын{P ка кi ак} цукерак
|
STR_QUANTITY_SWEETS :{COMMA} скрын{P ка кi ак} цукерак
|
||||||
STR_QUANTITY_COLA :{VOLUME_LONG} колы
|
STR_QUANTITY_COLA :{VOLUME_LONG} колы
|
||||||
STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} цукровай баўны
|
STR_QUANTITY_CANDYFLOSS :{WEIGHT_LONG} цукровай баўны
|
||||||
STR_QUANTITY_BUBBLES :{COMMA} бурбал{P ка кi ак}
|
STR_QUANTITY_BUBBLES :{COMMA} бурбал{P ка кi ак}
|
||||||
@@ -478,12 +478,12 @@ STR_ABBREV_NONE :{TINY_FONT}НЯ
|
|||||||
STR_ABBREV_ALL :{TINY_FONT}Усё
|
STR_ABBREV_ALL :{TINY_FONT}Усё
|
||||||
|
|
||||||
# 'Mode' of transport for cargoes
|
# 'Mode' of transport for cargoes
|
||||||
STR_PASSENGERS :{COMMA}{NBSP}пасажыр{P "" ы аў}
|
STR_PASSENGERS :{COMMA} пасажыр{P "" ы аў}
|
||||||
STR_BAGS :{COMMA}{NBSP}мяш{P ок кi коў}
|
STR_BAGS :{COMMA} мя{P шок шкi шкоў}
|
||||||
STR_TONS :{COMMA}{NBSP}тон{P а ы ""}
|
STR_TONS :{COMMA} тон{P а ы ""}
|
||||||
STR_LITERS :{COMMA}{NBSP}лiтр{P "" ы аў}
|
STR_LITERS :{COMMA} лiтр{P "" ы аў}
|
||||||
STR_ITEMS :{COMMA}{NBSP}штук{P а i ""}
|
STR_ITEMS :{COMMA} штук{P а i ""}
|
||||||
STR_CRATES :{COMMA}{NBSP}скрын{P я i яў}
|
STR_CRATES :{COMMA} скрын{P я i яў}
|
||||||
|
|
||||||
# Colours, do not shuffle
|
# Colours, do not shuffle
|
||||||
STR_COLOUR_DARK_BLUE :Цёмна-сiнi
|
STR_COLOUR_DARK_BLUE :Цёмна-сiнi
|
||||||
@@ -504,37 +504,37 @@ STR_COLOUR_GREY :Шэры
|
|||||||
STR_COLOUR_WHITE :Белы
|
STR_COLOUR_WHITE :Белы
|
||||||
|
|
||||||
# Units used in OpenTTD
|
# Units used in OpenTTD
|
||||||
STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}мiл{P я i яў}/г
|
STR_UNITS_VELOCITY_IMPERIAL :{COMMA} мiл{P я i яў}/г
|
||||||
STR_UNITS_VELOCITY_METRIC :{COMMA}{NBSP}км/г
|
STR_UNITS_VELOCITY_METRIC :{COMMA} км/г
|
||||||
STR_UNITS_VELOCITY_SI :{COMMA}{NBSP}м/с
|
STR_UNITS_VELOCITY_SI :{COMMA} м/с
|
||||||
|
|
||||||
STR_UNITS_POWER_IMPERIAL :{COMMA}{NBSP}к.с.
|
STR_UNITS_POWER_IMPERIAL :{COMMA} к.с.
|
||||||
STR_UNITS_POWER_METRIC :{COMMA}{NBSP}к.с.
|
STR_UNITS_POWER_METRIC :{COMMA} к.с.
|
||||||
STR_UNITS_POWER_SI :{COMMA}{NBSP}кВт
|
STR_UNITS_POWER_SI :{COMMA} кВт
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}{NBSP}т
|
STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA} т
|
||||||
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA}{NBSP}т
|
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} т
|
||||||
STR_UNITS_WEIGHT_SHORT_SI :{COMMA}{NBSP}кг
|
STR_UNITS_WEIGHT_SHORT_SI :{COMMA} кг
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA}{NBSP}тон{P а ы ""}
|
STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA} тон{P а ы ""}
|
||||||
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA}{NBSP}тон{P а ы ""}
|
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} тон{P а ы ""}
|
||||||
STR_UNITS_WEIGHT_LONG_SI :{COMMA}{NBSP}кг
|
STR_UNITS_WEIGHT_LONG_SI :{COMMA} кг
|
||||||
|
|
||||||
STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}{NBSP}гал.
|
STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA} гал.
|
||||||
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA}{NBSP}л
|
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA} л
|
||||||
STR_UNITS_VOLUME_SHORT_SI :{COMMA}{NBSP}м³
|
STR_UNITS_VOLUME_SHORT_SI :{COMMA} м³
|
||||||
|
|
||||||
STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA}{NBSP}галон{P "" а аў}
|
STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA} галон{P "" а аў}
|
||||||
STR_UNITS_VOLUME_LONG_METRIC :{COMMA}{NBSP}лiтр{P "" ы аў}
|
STR_UNITS_VOLUME_LONG_METRIC :{COMMA} лiтр{P "" ы аў}
|
||||||
STR_UNITS_VOLUME_LONG_SI :{COMMA}{NBSP}м³
|
STR_UNITS_VOLUME_LONG_SI :{COMMA} м³
|
||||||
|
|
||||||
STR_UNITS_FORCE_IMPERIAL :{COMMA}{NBSP}фунт{P "" а аў}-сілы
|
STR_UNITS_FORCE_IMPERIAL :{COMMA} фунт{P "" а аў}-сілы
|
||||||
STR_UNITS_FORCE_METRIC :{COMMA}{NBSP}кгс
|
STR_UNITS_FORCE_METRIC :{COMMA} кгс
|
||||||
STR_UNITS_FORCE_SI :{COMMA}{NBSP}кН
|
STR_UNITS_FORCE_SI :{COMMA} кН
|
||||||
|
|
||||||
STR_UNITS_HEIGHT_IMPERIAL :{COMMA}{NBSP}фут{P "" ы аў}
|
STR_UNITS_HEIGHT_IMPERIAL :{COMMA} фут{P "" ы аў}
|
||||||
STR_UNITS_HEIGHT_METRIC :{COMMA}{NBSP}м
|
STR_UNITS_HEIGHT_METRIC :{COMMA} м
|
||||||
STR_UNITS_HEIGHT_SI :{COMMA}{NBSP}м
|
STR_UNITS_HEIGHT_SI :{COMMA} м
|
||||||
|
|
||||||
# Common window strings
|
# Common window strings
|
||||||
STR_LIST_FILTER_TITLE :{BLACK}Фільтар:
|
STR_LIST_FILTER_TITLE :{BLACK}Фільтар:
|
||||||
@@ -553,17 +553,14 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Закр
|
|||||||
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Загаловак вакна — цягніце яго для перамяшчэньня вакна
|
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Загаловак вакна — цягніце яго для перамяшчэньня вакна
|
||||||
STR_TOOLTIP_SHADE :{BLACK}Згарнуць вакно, пакінуўшы загаловак
|
STR_TOOLTIP_SHADE :{BLACK}Згарнуць вакно, пакінуўшы загаловак
|
||||||
STR_TOOLTIP_DEBUG :{BLACK}Паказаць наладачную iнфармацыю NewGRF
|
STR_TOOLTIP_DEBUG :{BLACK}Паказаць наладачную iнфармацыю NewGRF
|
||||||
STR_TOOLTIP_DEFSIZE :{BLACK}Зьмяніць памеры вакна на значэньні па змоўчаньні. Ctrl+пстрычка захавае бягучы памер як значэньне па змоўчаньні.
|
STR_TOOLTIP_DEFSIZE :{BLACK}Змяніць памеры вакна на значэньні па змаўчаньні. Ctrl+пстрычка захавае бягучы памер як значэньне па змаўчаньні.
|
||||||
STR_TOOLTIP_STICKY :{BLACK}Пазначыць гэтае вакно як незачыняльнае па клявішы «Закрыць усе вокны». Ctrl+пстрычка захоўвае гэты стан па змоўчаньні.
|
STR_TOOLTIP_STICKY :{BLACK}Пазначыць гэтае вакно як незачыняльнае па клявішы «Закрыць усе вокны». Ctrl+пстрычка захоўвае гэты стан па змаўчанні.
|
||||||
STR_TOOLTIP_RESIZE :{BLACK}Націсьніце ды цягніце для зьмяненьня памеру вакна
|
STR_TOOLTIP_RESIZE :{BLACK}Націсьніце ды цягніце для зьмяненьня памеру вакна
|
||||||
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Вялікае/маленькае вакно
|
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Вялікае/маленькае вакно
|
||||||
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка ўверх/уніз
|
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка ўверх/уніз
|
||||||
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка налева/направа
|
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка налева/направа
|
||||||
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Поўная ачыстка прамавугольнага ўчастку зямлі. Ctrl — выбар вобласьці па дыяганалі. Пры націснутым Shift — ацэнка кошту ачысткі.
|
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Поўная ачыстка прамавугольнага ўчастку зямлі. Ctrl — выбар вобласьці па дыяганалі. Пры націснутым Shift — ацэнка кошту ачысткі.
|
||||||
|
|
||||||
# Show engines button
|
|
||||||
|
|
||||||
|
|
||||||
# Query window
|
# Query window
|
||||||
STR_BUTTON_DEFAULT :{BLACK}Па змоўчаньнi
|
STR_BUTTON_DEFAULT :{BLACK}Па змоўчаньнi
|
||||||
STR_BUTTON_CANCEL :{BLACK}Скасаваць
|
STR_BUTTON_CANCEL :{BLACK}Скасаваць
|
||||||
@@ -615,7 +612,7 @@ STR_SORT_BY_POWER_VS_RUNNING_COST :Магутна
|
|||||||
STR_SORT_BY_CARGO_CAPACITY :Ёмiстасьць
|
STR_SORT_BY_CARGO_CAPACITY :Ёмiстасьць
|
||||||
STR_SORT_BY_RANGE :Далёкасьць
|
STR_SORT_BY_RANGE :Далёкасьць
|
||||||
STR_SORT_BY_POPULATION :Насельніцтва
|
STR_SORT_BY_POPULATION :Насельніцтва
|
||||||
STR_SORT_BY_RATING :Рэйтынґ
|
STR_SORT_BY_RATING :Рэйтынг
|
||||||
|
|
||||||
# Tooltips for the main toolbar
|
# Tooltips for the main toolbar
|
||||||
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Паўза
|
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Паўза
|
||||||
@@ -629,7 +626,7 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Сьпi
|
|||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Паказаць фінансавую інфармацыю кампаніі
|
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Паказаць фінансавую інфармацыю кампаніі
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Паказаць агульную інфармацыю аб кампаніі
|
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Паказаць агульную інфармацыю аб кампаніі
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Паказаць гісторыю кампаніі
|
STR_TOOLBAR_TOOLTIP_DISPLAY_STORY_BOOK :{BLACK}Паказаць гісторыю кампаніі
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Паказаць сьпіс задач
|
STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Паказаць спіс задач
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Паказаць ґрафiкi
|
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Паказаць ґрафiкi
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Паказаць рэйтынґі кампаніяў
|
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Паказаць рэйтынґі кампаніяў
|
||||||
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Сьпіс існуючых прадпрыемстваў; заснаваньне новых
|
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Сьпіс існуючых прадпрыемстваў; заснаваньне новых
|
||||||
@@ -703,7 +700,7 @@ STR_FILE_MENU_EXIT :Выхад
|
|||||||
# map menu
|
# map menu
|
||||||
STR_MAP_MENU_MAP_OF_WORLD :Мапа сусьвету
|
STR_MAP_MENU_MAP_OF_WORLD :Мапа сусьвету
|
||||||
STR_MAP_MENU_EXTRA_VIEW_PORT :Дадатковае вакно прагляду
|
STR_MAP_MENU_EXTRA_VIEW_PORT :Дадатковае вакно прагляду
|
||||||
STR_MAP_MENU_LINGRAPH_LEGEND :Леґенда грузаперавозак
|
STR_MAP_MENU_LINGRAPH_LEGEND :Легенда грузаперавозак
|
||||||
STR_MAP_MENU_SIGN_LIST :Сьпіс таблічак
|
STR_MAP_MENU_SIGN_LIST :Сьпіс таблічак
|
||||||
|
|
||||||
############ range for town menu starts
|
############ range for town menu starts
|
||||||
@@ -786,7 +783,7 @@ STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Пераклю
|
|||||||
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Падфарбоўваць блёкі, якія патрабуюць перамалёўкі
|
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Падфарбоўваць блёкі, якія патрабуюць перамалёўкі
|
||||||
############ range ends here
|
############ range ends here
|
||||||
|
|
||||||
############ range for ordinal numbers used for the place in the highscore window
|
############ range for days starts (also used for the place in the highscore window)
|
||||||
STR_ORDINAL_NUMBER_1ST :1-е
|
STR_ORDINAL_NUMBER_1ST :1-е
|
||||||
STR_ORDINAL_NUMBER_2ND :2-е
|
STR_ORDINAL_NUMBER_2ND :2-е
|
||||||
STR_ORDINAL_NUMBER_3RD :3-е
|
STR_ORDINAL_NUMBER_3RD :3-е
|
||||||
@@ -802,40 +799,22 @@ STR_ORDINAL_NUMBER_12TH :12-е
|
|||||||
STR_ORDINAL_NUMBER_13TH :13-е
|
STR_ORDINAL_NUMBER_13TH :13-е
|
||||||
STR_ORDINAL_NUMBER_14TH :14-е
|
STR_ORDINAL_NUMBER_14TH :14-е
|
||||||
STR_ORDINAL_NUMBER_15TH :15-е
|
STR_ORDINAL_NUMBER_15TH :15-е
|
||||||
############ range for ordinal numbers ends
|
STR_ORDINAL_NUMBER_16TH :16-е
|
||||||
|
STR_ORDINAL_NUMBER_17TH :17-е
|
||||||
############ range for days starts
|
STR_ORDINAL_NUMBER_18TH :18-е
|
||||||
STR_DAY_NUMBER_1ST :1-е
|
STR_ORDINAL_NUMBER_19TH :19-е
|
||||||
STR_DAY_NUMBER_2ND :2-е
|
STR_ORDINAL_NUMBER_20TH :20-е
|
||||||
STR_DAY_NUMBER_3RD :3-е
|
STR_ORDINAL_NUMBER_21ST :21-е
|
||||||
STR_DAY_NUMBER_4TH :4-е
|
STR_ORDINAL_NUMBER_22ND :22-е
|
||||||
STR_DAY_NUMBER_5TH :5-е
|
STR_ORDINAL_NUMBER_23RD :23-е
|
||||||
STR_DAY_NUMBER_6TH :6-е
|
STR_ORDINAL_NUMBER_24TH :24-е
|
||||||
STR_DAY_NUMBER_7TH :7-е
|
STR_ORDINAL_NUMBER_25TH :25-е
|
||||||
STR_DAY_NUMBER_8TH :8-е
|
STR_ORDINAL_NUMBER_26TH :26-е
|
||||||
STR_DAY_NUMBER_9TH :9-е
|
STR_ORDINAL_NUMBER_27TH :27-е
|
||||||
STR_DAY_NUMBER_10TH :10-е
|
STR_ORDINAL_NUMBER_28TH :28-е
|
||||||
STR_DAY_NUMBER_11TH :11-е
|
STR_ORDINAL_NUMBER_29TH :29-е
|
||||||
STR_DAY_NUMBER_12TH :12-е
|
STR_ORDINAL_NUMBER_30TH :30-е
|
||||||
STR_DAY_NUMBER_13TH :13-е
|
STR_ORDINAL_NUMBER_31ST :31-е
|
||||||
STR_DAY_NUMBER_14TH :14-е
|
|
||||||
STR_DAY_NUMBER_15TH :15-е
|
|
||||||
STR_DAY_NUMBER_16TH :16-е
|
|
||||||
STR_DAY_NUMBER_17TH :17-е
|
|
||||||
STR_DAY_NUMBER_18TH :18-е
|
|
||||||
STR_DAY_NUMBER_19TH :19-е
|
|
||||||
STR_DAY_NUMBER_20TH :20-е
|
|
||||||
STR_DAY_NUMBER_21ST :21-е
|
|
||||||
STR_DAY_NUMBER_22ND :22-е
|
|
||||||
STR_DAY_NUMBER_23RD :23-е
|
|
||||||
STR_DAY_NUMBER_24TH :24-е
|
|
||||||
STR_DAY_NUMBER_25TH :25-е
|
|
||||||
STR_DAY_NUMBER_26TH :26-е
|
|
||||||
STR_DAY_NUMBER_27TH :27-е
|
|
||||||
STR_DAY_NUMBER_28TH :28-е
|
|
||||||
STR_DAY_NUMBER_29TH :29-е
|
|
||||||
STR_DAY_NUMBER_30TH :30-е
|
|
||||||
STR_DAY_NUMBER_31ST :31-е
|
|
||||||
############ range for days ends
|
############ range for days ends
|
||||||
|
|
||||||
############ range for months starts
|
############ range for months starts
|
||||||
@@ -1015,13 +994,13 @@ STR_SMALLMAP_TYPE_OWNERS :Уладаль
|
|||||||
STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Паказаць на мапе контуры зямлі
|
STR_SMALLMAP_TOOLTIP_SHOW_LAND_CONTOURS_ON_MAP :{BLACK}Паказаць на мапе контуры зямлі
|
||||||
STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Паказаць на мапе транспарт
|
STR_SMALLMAP_TOOLTIP_SHOW_VEHICLES_ON_MAP :{BLACK}Паказаць на мапе транспарт
|
||||||
STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Паказаць на мапе прамысловасьць
|
STR_SMALLMAP_TOOLTIP_SHOW_INDUSTRIES_ON_MAP :{BLACK}Паказаць на мапе прамысловасьць
|
||||||
STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Паказаць на мапе грузавыя плыні
|
STR_SMALLMAP_TOOLTIP_SHOW_LINK_STATS_ON_MAP :{BLACK}Паказаць на карце грузавыя плыні
|
||||||
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Паказаць на мапе маршруты
|
STR_SMALLMAP_TOOLTIP_SHOW_TRANSPORT_ROUTES_ON :{BLACK}Паказаць на мапе маршруты
|
||||||
STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Паказаць на мапе расьліннасьць
|
STR_SMALLMAP_TOOLTIP_SHOW_VEGETATION_ON_MAP :{BLACK}Паказаць на мапе расьліннасьць
|
||||||
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Паказаць на мапе уладальнікаў зямлі
|
STR_SMALLMAP_TOOLTIP_SHOW_LAND_OWNERS_ON_MAP :{BLACK}Паказаць на мапе уладальнікаў зямлі
|
||||||
STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Клiк па тыпе прадпрыемства пераключае яго паказ на мапе. Ctrl+клiк адключае ўсе тыпы, акрамя аднаго выбранага. Паўторны Ctrl+клiк уключае ўсе тыпы прадпрыемстваў.
|
STR_SMALLMAP_TOOLTIP_INDUSTRY_SELECTION :{BLACK}Клiк па тыпе прадпрыемства пераключае яго паказ на мапе. Ctrl+клiк адключае ўсе тыпы, акрамя аднаго выбранага. Паўторны Ctrl+клiк уключае ўсе тыпы прадпрыемстваў.
|
||||||
STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Клiк па назьве кампанii пераключае паказ яе маёмасьцi на мапе. Ctrl+клiк адключае ўсе кампанii, акрамя адной выбранай.
|
STR_SMALLMAP_TOOLTIP_COMPANY_SELECTION :{BLACK}Клiк па назьве кампанii пераключае паказ яе маёмасьцi на мапе. Ctrl+клiк адключае ўсе кампанii, акрамя адной выбранай.
|
||||||
STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Пстрычка па назве грузу пераключае бачнасьць гэтага грузу. Ctrl+пстрычка хавае ўсе грузы акрамя выбранага. Паўторная Ctrl+пстрычка адлюстроўвае ўсе грузы.
|
STR_SMALLMAP_TOOLTIP_CARGO_SELECTION :{BLACK}Пстрычка па назве грузу пераключае бачнасць гэтага грузу. Ctrl+пстрычка хавае ўсе грузы акрамя выбранага. Паўторная Ctrl+пстрычка адлюстроўвае ўсе грузы.
|
||||||
|
|
||||||
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Дарогі
|
STR_SMALLMAP_LEGENDA_ROADS :{TINY_FONT}{BLACK}Дарогі
|
||||||
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Чыгункі
|
STR_SMALLMAP_LEGENDA_RAILROADS :{TINY_FONT}{BLACK}Чыгункі
|
||||||
@@ -1144,11 +1123,13 @@ STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE
|
|||||||
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} чакае ў дэпо
|
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} чакае ў дэпо
|
||||||
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} чакае ў самалётным анґары
|
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} чакае ў самалётным анґары
|
||||||
|
|
||||||
# Order review system / warnings
|
# Start of order review system
|
||||||
|
# DON'T ADD OR REMOVE LINES HERE
|
||||||
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}У ТС «{VEHICLE}» не хапае заданьняў у раскладзе
|
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}У ТС «{VEHICLE}» не хапае заданьняў у раскладзе
|
||||||
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} не мае заданьняў
|
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} не мае заданьняў
|
||||||
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} мае дубляваныя заданьні
|
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} мае дубляваныя заданьні
|
||||||
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} мае няісную станцыю ў заданьнях
|
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} мае няісную станцыю ў заданьнях
|
||||||
|
# end of order system
|
||||||
|
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} састарэў
|
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} састарэў
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} цалкам састарэў
|
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} цалкам састарэў
|
||||||
@@ -1270,13 +1251,11 @@ STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Каталён
|
|||||||
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Аўтазахаваньне
|
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Аўтазахаваньне
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Інтэрвал паміж аўтаматычнымі захаваньнямі гульні
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Інтэрвал паміж аўтаматычнымі захаваньнямі гульні
|
||||||
|
|
||||||
############ start of autosave dropdown
|
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Выключана
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Выключана
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Штомесяц
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :Штомесяц
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :Кожныя 3 месяцы
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :Кожныя 3 месяцы
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :Кожныя 6 месяцаў
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :Кожныя 6 месяцаў
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :Кожныя 12 месяцаў
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :Кожныя 12 месяцаў
|
||||||
############ end of autosave dropdown
|
|
||||||
|
|
||||||
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Мова
|
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Мова
|
||||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Выбраць мову інтэрфэйсу
|
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Выбраць мову інтэрфэйсу
|
||||||
@@ -1305,7 +1284,6 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Выбе
|
|||||||
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} пашкоджан{P ы ых ых} файл{P 0 "" ы аў}
|
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} пашкоджан{P ы ых ых} файл{P 0 "" ы аў}
|
||||||
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Дадатковая інфармацыя аб базавым музычным наборы
|
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Дадатковая інфармацыя аб базавым музычным наборы
|
||||||
|
|
||||||
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Не атрымалася атрымаць сьпіс падтрымліваемых разрозненьняў экрана
|
|
||||||
STR_ERROR_FULLSCREEN_FAILED :{WHITE}Памылка поўнаэкраннага рэжыму
|
STR_ERROR_FULLSCREEN_FAILED :{WHITE}Памылка поўнаэкраннага рэжыму
|
||||||
|
|
||||||
# Custom currency window
|
# Custom currency window
|
||||||
@@ -1405,9 +1383,8 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :Наладкі
|
|||||||
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Наладкі кампаніі (утрымліваюцца ў файлах захаваньняў; сапраўдныя толькі для новых гульняў)
|
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Наладкі кампаніі (утрымліваюцца ў файлах захаваньняў; сапраўдныя толькі для новых гульняў)
|
||||||
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Наладкі кампаніі (утрымліваюцца ў файлах захаваньняў; сапраўдныя толькі для бягучай гульні)
|
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Наладкі кампаніі (утрымліваюцца ў файлах захаваньняў; сапраўдныя толькі для бягучай гульні)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Катэґорыя:
|
STR_CONFIG_SETTING_RESTRICT_LABEL :{BLACK}Паказваць:
|
||||||
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Тып:
|
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Адлюстроўваць у сьпісе толькі зьмененыя наладкі
|
||||||
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Адлюстроўваць у спісе толькі наладкі, якія адпавядаюць абранай катэгорыі
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_BASIC :Базавыя наладкі
|
STR_CONFIG_SETTING_RESTRICT_BASIC :Базавыя наладкі
|
||||||
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Пашыраныя наладкі
|
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Пашыраныя наладкі
|
||||||
STR_CONFIG_SETTING_RESTRICT_ALL :Спэцыяльныя наладкі / усе наладкі
|
STR_CONFIG_SETTING_RESTRICT_ALL :Спэцыяльныя наладкі / усе наладкі
|
||||||
@@ -1421,10 +1398,6 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Наладкі
|
|||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Наладкі гульні (запісваюцца ў захаваньне; уплываюць толькі на бягучую гульню)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Наладкі гульні (запісваюцца ў захаваньне; уплываюць толькі на бягучую гульню)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Наладкі кампаніі (запісваюцца ў захаваньні; уплываюць толькі на новыя гульні)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Наладкі кампаніі (запісваюцца ў захаваньні; уплываюць толькі на новыя гульні)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Наладкі кампаніі (запісваюцца ў захаваньне; уплываюць толькі на бягучую кампанію)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Наладкі кампаніі (запісваюцца ў захаваньне; уплываюць толькі на бягучую кампанію)
|
||||||
STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Паказаць усе вынікі пошуку па наладках{}{SILVER}Катэґорыя {BLACK}да {WHITE}{STRING}
|
|
||||||
STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Паказаць усе вынікі пошуку па наладках{}{SILVER}Тып BLACK}да {WHITE}Усе тыпы наладак
|
|
||||||
STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Паказаць усе вынікі пошуку па наладках{}{SILVER}Катэґорыя {BLACK}да {WHITE}{STRING} {BLACK}і {SILVER}Тып {BLACK}да {WHITE}Усе тыпы наладак
|
|
||||||
STR_CONFIG_SETTINGS_NONE :{WHITE}- Няма -
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_OFF :не
|
STR_CONFIG_SETTING_OFF :не
|
||||||
STR_CONFIG_SETTING_ON :так
|
STR_CONFIG_SETTING_ON :так
|
||||||
@@ -1459,7 +1432,7 @@ STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Усталюй
|
|||||||
STR_CONFIG_SETTING_RECESSIONS :Спады: {STRING}
|
STR_CONFIG_SETTING_RECESSIONS :Спады: {STRING}
|
||||||
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Калі ўключана, спад можа наставаць раз у некалькі гадоў. Падчас спаду ўвесь аб'ём вытворчасьці значна ніжэй (ён вяртаецца да ранейшага ўзроўня, калі спад сканчаецца)
|
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Калі ўключана, спад можа наставаць раз у некалькі гадоў. Падчас спаду ўвесь аб'ём вытворчасьці значна ніжэй (ён вяртаецца да ранейшага ўзроўня, калі спад сканчаецца)
|
||||||
STR_CONFIG_SETTING_TRAIN_REVERSING :Забараніць разварот цягнікоў на станцыях: {STRING}
|
STR_CONFIG_SETTING_TRAIN_REVERSING :Забараніць разварот цягнікоў на станцыях: {STRING}
|
||||||
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Калі ўключана, цягнікі ня будуць разварочвацца на прахадных станцыях, нават калі гэта дазволіць скараціць шлях да наступнага пункта прызначэньня.
|
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Калі ўключана, цягнікі ня будуць разварочвацца на прахадных станцыях, нават калі гэта дазволіць скараціць шлях да наступнага пункта прызначэньня
|
||||||
STR_CONFIG_SETTING_DISASTERS :Бедствы: {STRING}
|
STR_CONFIG_SETTING_DISASTERS :Бедствы: {STRING}
|
||||||
STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Пераключыце бедствы, якія могуць час ад часу блякаваць ці зьнішчаць транспартныя сродкі ды інфраструктуру
|
STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Пераключыце бедствы, якія могуць час ад часу блякаваць ці зьнішчаць транспартныя сродкі ды інфраструктуру
|
||||||
STR_CONFIG_SETTING_CITY_APPROVAL :Стаўленьне гарадзкой рады да рэструктурызацыі навакольляў: {STRING}
|
STR_CONFIG_SETTING_CITY_APPROVAL :Стаўленьне гарадзкой рады да рэструктурызацыі навакольляў: {STRING}
|
||||||
@@ -1582,7 +1555,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Транспа
|
|||||||
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Калі ўключана, усе мадэлі транспартных сродкаў пасьля з'яўленьня застануцца даступнымі назаўжды.
|
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Калі ўключана, усе мадэлі транспартных сродкаў пасьля з'яўленьня застануцца даступнымі назаўжды.
|
||||||
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Аўтазамена старых транспартных сродкаў: {STRING}
|
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Аўтазамена старых транспартных сродкаў: {STRING}
|
||||||
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Калі ўключана, транспарт напрыканцы свайго пэўнага тэрміна службы будзе аўтаматычна заменены, калі ўмовы замены будуць выкананыя.
|
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Калі ўключана, транспарт напрыканцы свайго пэўнага тэрміна службы будзе аўтаматычна заменены, калі ўмовы замены будуць выкананыя.
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS :Аўтазамена транспарта {STRING} заканчэння тэрміна эксплуатацыі
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS :Аўтаабнаўленьне, калi транспарт дасягне {STRING} макс. узросту
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Адносны ўзрост, калі транспартны сродак будзе разглядацца як той, што патрабуе аўтаўзамены.
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Адносны ўзрост, калі транспартны сродак будзе разглядацца як той, што патрабуе аўтаўзамены.
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} месяц{P "" ы аў} перад
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} месяц{P "" ы аў} перад
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} месяц{P "" ы аў} пасьля
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} месяц{P "" ы аў} пасьля
|
||||||
@@ -1606,7 +1579,7 @@ STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
|
|||||||
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Макс. адлегласьць ад краю мапы да нафтаперапрацоўчых заводаў: {STRING}
|
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Макс. адлегласьць ад краю мапы да нафтаперапрацоўчых заводаў: {STRING}
|
||||||
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Нафтаперапрацоўчыя заводы будуюцца толькі каля краю мапы, у тым ліку на востраве.
|
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Нафтаперапрацоўчыя заводы будуюцца толькі каля краю мапы, у тым ліку на востраве.
|
||||||
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Вышыня сьнегавой лініі: {STRING}
|
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Вышыня сьнегавой лініі: {STRING}
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Нароўнасьць ляндшафту: {STRING}
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Нароўнасьць ляндшафту (толькі TerraGenesis) : {STRING}
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Вельмі гладкі
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Вельмі гладкі
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Гладкі
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Гладкі
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Грубы
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Грубы
|
||||||
@@ -1641,7 +1614,7 @@ STR_CONFIG_SETTING_SMOOTH_SCROLLING :Павольн
|
|||||||
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Кантралюе, што адбудзецца ў галоўным вакне, калі пстрыкнуць у малым вакне прагляду па нейкай кропцы. Калі ўключана, позірк будзе павольна перамяшчацца па мапе ў галоўным вакне. Калі выключана — экран адразу прыгне ў вызначанае месца.
|
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Кантралюе, што адбудзецца ў галоўным вакне, калі пстрыкнуць у малым вакне прагляду па нейкай кропцы. Калі ўключана, позірк будзе павольна перамяшчацца па мапе ў галоўным вакне. Калі выключана — экран адразу прыгне ў вызначанае месца.
|
||||||
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Паказваць замеры пры будаўніцтве: {STRING}
|
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Паказваць замеры пры будаўніцтве: {STRING}
|
||||||
STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Паказваць адлегласьць у клетках і розьніцу ў вышынях, калі нешта будуецца "працяжкай" (з націснутай кнопкай мышы).
|
STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Паказваць адлегласьць у клетках і розьніцу ў вышынях, калі нешта будуецца "працяжкай" (з націснутай кнопкай мышы).
|
||||||
STR_CONFIG_SETTING_LIVERIES :Паказваць індывідуальную афарбоўку транспарта: {STRING}
|
STR_CONFIG_SETTING_LIVERIES :Паказваць індывідуальныя афарбоўкі транспарту (два фірмовыя колеры): {STRING}
|
||||||
STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Ўжываньне спэцыфічных афарбовак (ліўрэй) для канкрэтнага тыпу транспартных сродкаў (у адрозьненьне ад фірмовага колеру ўсёй кампаніі).
|
STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Ўжываньне спэцыфічных афарбовак (ліўрэй) для канкрэтнага тыпу транспартных сродкаў (у адрозьненьне ад фірмовага колеру ўсёй кампаніі).
|
||||||
STR_CONFIG_SETTING_LIVERIES_NONE :не
|
STR_CONFIG_SETTING_LIVERIES_NONE :не
|
||||||
STR_CONFIG_SETTING_LIVERIES_OWN :толькі для сваёй кампаніі
|
STR_CONFIG_SETTING_LIVERIES_OWN :толькі для сваёй кампаніі
|
||||||
@@ -1679,7 +1652,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-01-31
|
|||||||
|
|
||||||
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE :Калі ў NewGRF ня вызначана палітра, выкарыстоўваць: {STRING}
|
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE :Калі ў NewGRF ня вызначана палітра, выкарыстоўваць: {STRING}
|
||||||
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_HELPTEXT :Палітра ґрафічных набораў (NewGRF), якая ўжываецца па змоўчаньні, калі ня вызначана ў самім наборы.
|
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_HELPTEXT :Палітра ґрафічных набораў (NewGRF), якая ўжываецца па змоўчаньні, калі ня вызначана ў самім наборы.
|
||||||
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_DOS :Палітра па змоўчаньні (DOS)
|
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_DOS :Палітра па змаўчаньні (DOS)
|
||||||
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_WIN :Састарэлы фармат палітры (Win)
|
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_WIN :Састарэлы фармат палітры (Win)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Аўтаматычнае ўключэньне паўзы напачатку гульні: {STRING}
|
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Аўтаматычнае ўключэньне паўзы напачатку гульні: {STRING}
|
||||||
@@ -1690,7 +1663,7 @@ STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :нiчога
|
|||||||
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :усе дзеяньні, акрамя будаўніцтва
|
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :усе дзеяньні, акрамя будаўніцтва
|
||||||
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :усе дзеяньнi, акрамя зьмяненьня ляндшафту
|
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :усе дзеяньнi, акрамя зьмяненьня ляндшафту
|
||||||
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :усе дзеяньнi
|
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :усе дзеяньнi
|
||||||
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Паказваць групы ў сьпісе транспарта: {STRING}
|
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Выкарыстоўваць пашыраны сьпіс транспорту: {STRING}
|
||||||
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Дазволіць ужываньне пашыранага сьпісу транспартных сродкаў для групаваньня.
|
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Дазволіць ужываньне пашыранага сьпісу транспартных сродкаў для групаваньня.
|
||||||
STR_CONFIG_SETTING_LOADING_INDICATORS :Паказваць індыкатар загрузкі: {STRING}
|
STR_CONFIG_SETTING_LOADING_INDICATORS :Паказваць індыкатар загрузкі: {STRING}
|
||||||
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Выбраць, ці будуць паказвацца індыкатары загрузкі над транспартам, які грузіцца ці разгружаецца.
|
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Выбраць, ці будуць паказвацца індыкатары загрузкі над транспартам, які грузіцца ці разгружаецца.
|
||||||
@@ -1705,7 +1678,7 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Тып чыгу
|
|||||||
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :першыя даступныя
|
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :першыя даступныя
|
||||||
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :апошнія даступныя
|
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :апошнія даступныя
|
||||||
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :найбольш ужывальныя
|
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :найбольш ужывальныя
|
||||||
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Паказваць зарэзерваваныя каляiны: {STRING}
|
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Паказваць каляіны, якія зарэзэрваваў цягнік: {STRING}
|
||||||
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Зарэзэрваваныя рэйкі будуць мець адрозны колер. Дапамагае вырашыць праблему, калі цягнік адмаўляецца заехаць у блёк з маршрутнымі сьветлафорамі.
|
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Зарэзэрваваныя рэйкі будуць мець адрозны колер. Дапамагае вырашыць праблему, калі цягнік адмаўляецца заехаць у блёк з маршрутнымі сьветлафорамі.
|
||||||
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Захоўваць актыўнымі інструмэнты будаўніцтва пасьля ўжываньня: {STRING}
|
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Захоўваць актыўнымі інструмэнты будаўніцтва пасьля ўжываньня: {STRING}
|
||||||
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Захаваць будаўнічыя інструмэнты для мастоў, тунэляў і г.д. пасля выкарыстаньня.
|
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Захаваць будаўнічыя інструмэнты для мастоў, тунэляў і г.д. пасля выкарыстаньня.
|
||||||
@@ -1764,7 +1737,7 @@ STR_CONFIG_SETTING_SERVINT_ISPERCENT :Інтэрва
|
|||||||
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Выбраць, ці залежыць абслугоўваньне транспарту ад даты апошняга абслугоўваньня або ад падзеньня надзейнасьці на пэўны адсотак ад максымальнай.
|
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Выбраць, ці залежыць абслугоўваньне транспарту ад даты апошняга абслугоўваньня або ад падзеньня надзейнасьці на пэўны адсотак ад максымальнай.
|
||||||
STR_CONFIG_SETTING_SERVINT_TRAINS :Iнтэрвал абслугоўваньня для цягнiкоў: {STRING}
|
STR_CONFIG_SETTING_SERVINT_TRAINS :Iнтэрвал абслугоўваньня для цягнiкоў: {STRING}
|
||||||
STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Усталяваць міжсэрвісны інтэрвал для новых чыгуначных транспартных сродкаў, калі пэўны інтэрвал ня вызначаны для канкрэтнага цягніка.
|
STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Усталяваць міжсэрвісны інтэрвал для новых чыгуначных транспартных сродкаў, калі пэўны інтэрвал ня вызначаны для канкрэтнага цягніка.
|
||||||
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA}{NBSP}д{P зень днi дзён}/%
|
STR_CONFIG_SETTING_SERVINT_VALUE :{COMMA} д{P зень днi дзён}/%
|
||||||
STR_CONFIG_SETTING_SERVINT_DISABLED :адключана
|
STR_CONFIG_SETTING_SERVINT_DISABLED :адключана
|
||||||
STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Iнтэрвал абслугоўваньня для аўтатранспарту: {STRING}
|
STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES :Iнтэрвал абслугоўваньня для аўтатранспарту: {STRING}
|
||||||
STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Усталяваць міжсэрвісны інтэрвал для новага аўтатранспарту, калі пэўны інтэрвал ня вызначаны для канкрэтнай машыны.
|
STR_CONFIG_SETTING_SERVINT_ROAD_VEHICLES_HELPTEXT :Усталяваць міжсэрвісны інтэрвал для новага аўтатранспарту, калі пэўны інтэрвал ня вызначаны для канкрэтнай машыны.
|
||||||
@@ -1855,7 +1828,7 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Дазволі
|
|||||||
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Гарадам дазволена будаваць чыгуначныя пераезды: {STRING}
|
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Гарадам дазволена будаваць чыгуначныя пераезды: {STRING}
|
||||||
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Уключэньне гэтай наладкі дазваляе гарадам будаваць чыгуначная пераезды.
|
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Уключэньне гэтай наладкі дазваляе гарадам будаваць чыгуначная пераезды.
|
||||||
STR_CONFIG_SETTING_NOISE_LEVEL :Гарадам дазволена кантраляваць узровень шуму ад аэрапортаў: {STRING}
|
STR_CONFIG_SETTING_NOISE_LEVEL :Гарадам дазволена кантраляваць узровень шуму ад аэрапортаў: {STRING}
|
||||||
STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Пры выключанай наладцы колькасьць аэрапортаў абмежавана дзвюма на кожны горад. Пры ўключанай - адміністрацыя горада абмяжоўвае толькі ўзровень дапушчальнага шуму (ён залежыць ад колькасці жыхароў). Узровень шуму, вырабленага аэрапортам, залежыць ад яго тыпу і адлегласьці ад цэнтра горада.
|
STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Калі гэта наладка адключаная, у кожным населеным пунце можа быць толькі два аэрапорта. Калі ўключаная — колькасьць аэрапортаў абмяжуецца ўзроўнем шума, які дапускае горад. Гэта, у сваю чаргу, залежыць ад колькасьці насельніцтва, памераў аэрапортаў і адлегласьці да іх.
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING :Заснаваньне гарадоў у гульні: {STRING}
|
STR_CONFIG_SETTING_TOWN_FOUNDING :Заснаваньне гарадоў у гульні: {STRING}
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Уключэньне гэтай наладкі дазваляе гульцам фундаваць новыя населеныя пункты падчас гульні.
|
STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Уключэньне гэтай наладкі дазваляе гульцам фундаваць новыя населеныя пункты падчас гульні.
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :забаронена
|
STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :забаронена
|
||||||
@@ -1906,64 +1879,64 @@ STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :Адносна
|
|||||||
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD :Выдаляць абсурдныя элемэнты падчас дарожнага будаўніцтва: {STRING}
|
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD :Выдаляць абсурдныя элемэнты падчас дарожнага будаўніцтва: {STRING}
|
||||||
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD_HELPTEXT :Выдаляць "мёртвыя" канцы дарогаў, якія ўтварыліся пасля рэканструкцыі вуліц.
|
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD_HELPTEXT :Выдаляць "мёртвыя" канцы дарогаў, якія ўтварыліся пасля рэканструкцыі вуліц.
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Абнаўляць ґраф размеркаваньня раз у {STRING}{NBSP}д{P 0:2 зень ні зён}
|
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL :Абнаўляць граф размеркаваньня раз у {STRING} д{P 0:2 зень ні зён}
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Перыяд пераразьліку ґрафаў размеркаваньня. У кожным цыкле разьлічваецца не ґраф цалкам, а толькі адзін зь яго кампанэнтаў. Чым менш гэта значэньне, тым больш будзе нагрузка на працэсар. Чым больш значэньне, тым больш часу пройдзе перад пачаткам разьліку ґрафаў для новых маршрутаў.
|
STR_CONFIG_SETTING_LINKGRAPH_INTERVAL_HELPTEXT :Перыяд пераразліку графаў размеркаваньня. У кожным цыкле разлічваецца не граф цалкам, а толькі адзін з яго кампанентаў. Чым менш гэта значэньне, тым больш будзе нагрузка на працэсар. Чым больш значэньне, тым больш часу пройдзе перад пачаткам разліку графаў для новых маршрутаў.
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_TIME :Пералічваць ґраф разьмеркаваньня раз у {STRING}{NBSP}д{P 0:2 зень ні зён}
|
STR_CONFIG_SETTING_LINKGRAPH_TIME :Пералічваць граф размеркавання раз у {STRING} д{P 0:2 зень ні зён}
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Час, адведзены для пераразьліку кампанэнтаў ґрафа. Разьлік запускаецца асобным патокам і працягваецца на працягу паказанай колькасьці гульнявых дзён. Калі значэньне будзе надта малым, то, магчыма, разьлік не пасьпее завяршыцца, і гульня будзе чакаць завяршэньня (гэта прывядзе да затрымак). Пры вялікіх значэньнях ґрафы размеркаваньня будуць павольней абнаўляцца пры зьменах маршрутаў.
|
STR_CONFIG_SETTING_LINKGRAPH_TIME_HELPTEXT :Час, адведзены для пераразліку кампанентаў графа. Разлік запускаецца асобным струменем і працягваецца на працягу паказанай колькасці гульнявых дзён. Калі значэньне будзе занадта маленькім, то, магчыма, разлік не паспее завяршыцца, і гульня будзе чакаць завяршэнні (гэта прывядзе да затрымак). Пры вялікіх значэньнях графы размеркаваньня будуць павольней абнаўляцца пры зменах маршрутаў.
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :уручную
|
STR_CONFIG_SETTING_DISTRIBUTION_MANUAL :уручную
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :несымэтрычнае
|
STR_CONFIG_SETTING_DISTRIBUTION_ASYMMETRIC :несіметрычнае
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :сымэтрычнае
|
STR_CONFIG_SETTING_DISTRIBUTION_SYMMETRIC :сіметрычнае
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_PAX :Разьмеркаваньне пасажыраў: {STRING}
|
STR_CONFIG_SETTING_DISTRIBUTION_PAX :Размеркаваньне пасажыраў: {STRING}
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :«Сымэтрычнае» азначае, што прыкладна аднолькавая колькасьць пасажыраў будзе накіроўвацца па прамым і зваротным маршрутам.{}«Несымэтрычнае» азначае, што пасажырапатокі ў любых кірунках не будуць залежаць адзін ад аднаго.{}«Уручную» — не выкарыстоўваць аўтаматычнае разьмеркаваньне для пасажыраў.
|
STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :«Сіметрычнае» азначае, што прыкладна аднолькавая колькасць пасажыраў будзе накіроўвацца па прамым і зваротным маршрутам.{}«Несіметрычнае» азначае, што пасажыраплыні ў любых кірунках не будуць залежаць адзін ад аднаго.{}«Уручную» - не выкарыстоўваць аўтаматычнае размеркаваньне для пасажыраў.
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Разьмеркаваньне пошты: {STRING}
|
STR_CONFIG_SETTING_DISTRIBUTION_MAIL :Размеркаваньне пошты: {STRING}
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :«Сымэтрычнае» азначае, што прыкладна аднолькавая колькасьць пошты будзе накіроўвацца па прамым і зваротным маршрутам.{}«Несымэтрычнае» азначае, што аб'ёмы пошты ў любых кірунках не будуць залежаць адзін ад аднаго.{}«Уручную» — не выкарыстоўваць аўтаматычнае разьмеркаваньне для пошты.
|
STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :«Сіметрычнае» азначае, што прыкладна аднолькавая колькасць пошты будзе накіроўвацца па прамым і зваротным маршрутам.{}«Несіметрычнае» азначае, што аб'ёмы пошты ў любых кірунках не будуць залежаць адзін ад аднаго.{}«Уручную» - не выкарыстоўваць аўтаматычнае размеркаваньне для пошты.
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Разьмеркаваньне каштоўных грузаў: {STRING}
|
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Размеркаваньне каштоўных грузаў: {STRING}
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Каштоўныя грузы — гэта каштоўнасьці, алмазы й золата. Модулі NewGRF могуць зьмяніць вызначэньні грузаў.{}«Сымэтрычнае» азначае, што прыкладна аднолькавая колькасьць грузу будзе накіроўвацца па прамым і зваротным маршрутам.{}«Несымэтрычнае» азначае, што аб'ёмы грузаў у любых кірунках не будуць залежаць адзін ад аднаго.{}«Уручную» — не выкарыстоўваць аўтаматычнае разьмеркаваньне грузаў.{}На субарктычных мапах рэкамендуецца ўсталяваць несымэтрычнае ці ручное разьмеркаваньне, бо банкі не вяртаюць золата ў шахты. Ва ўмераным ці субтрапічным клімаце можна ўсталяваць сымэтрычнае разьмеркаваньне, бо банкі абменьваюцца каштоўнасьцямі паміж сабой.
|
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :Каштоўныя грузы - гэта каштоўнасці, алмазы і золата. Модулі NewGRF могуць змяніць вызначэньні грузаў.{}«Сіметрычнае» азначае, што прыкладна аднолькавая колькасць грузу будзе накіроўвацца па прамым і зваротным маршрутам.{}«Несіметрычнае» азначае, што аб'ёмы грузаў у любых кірунках не будуць залежаць адзін ад аднаго.{}«Уручную» - не выкарыстоўваць аўтаматычнае размеркаваньне грузаў.{}На субарктычных мапах рэкамендуецца ўсталяваць несіметрычнае ці ручное размеркаваньне, бо банкі не вяртаюць золата ў шахты. Ва ўмераным ці субтрапічным клімаце можна ўсталяваць сіметрычнае размеркаваньне, бо банкі абменьваюцца каштоўнасцямі паміж сабой.
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Разьмеркаваньне іншых грузаў: {STRING}
|
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Размеркаваньне іншых грузаў: {STRING}
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :«Несымэтрычнае» азначае, што выпадковыя аб'ёмы грузаў могуць быць адпраўлены ў любых кірунках.{}«Уручную» азначае, што ніякага аўтаматычнага разьмеркаваньня для гэтых грузаў ня будзе.
|
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :«Сіметрычнае» азначае, што прыкладна аднолькавая колькасць грузу будзе накіроўвацца па прамым і зваротным маршрутам.{}«Несіметрычнае» азначае, што аб'ёмы грузаў у любых кірунках не будуць залежаць адзін ад аднаго.{}«Уручную» - не выкарыстоўваць аўтаматычнае размеркаваньне грузаў.{}Вам, хутчэй за ўсё, запатрабуецца несіметрычнае ці ручное размеркаваньне.
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Дакладнасьць разьмеркаваньня: {STRING}
|
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Дакладнасць размеркаваньня: {STRING}
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Чым вышэй дадзенае значэньне, тым больш працэсарнага часу выкарыстоўваецца для разьліку ґрафа грузаперавозак. Пры высокіх значэньнях магчымы затрымкі ў гульні. Аднак пры нізкіх значэньнях разлікі грузапатокаў будуць недакладнымі, і грузы, магчыма, будуць адпраўляцца не туды, куды трэба.
|
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Чым вышэй дадзенае значэньне, тым больш працэсарнага часу выкарыстоўваецца для разліку графа грузаперавозак. Пры высокіх значэньнях магчымы затрымкі ў гульні. Аднак пры нізкіх значэньнях разлікі грузаплыняў будуць недакладнымі, і грузы, магчыма, будуць адпраўляцца не туды, куды трэба.
|
||||||
STR_CONFIG_SETTING_DEMAND_DISTANCE :Залежнасьць попыту ад адлегласьці: {STRING}
|
STR_CONFIG_SETTING_DEMAND_DISTANCE :Залежнасць попыту ад адлегласці: {STRING}
|
||||||
STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Калі гэта значэньне больш за 0 — тая колькасьць грузу, што адпраўляецца з адной станцыі на іншую, будзе залежаць ад адлегласьці паміж станцыямі. Чым вышэй гэта значэньне, тым больш грузу будзе адпраўляцца да блізкіх станцый і менш{NBSP} — да далёкіх.
|
STR_CONFIG_SETTING_DEMAND_DISTANCE_HELPTEXT :Калі гэта значэньне больш 0, тая колькасць грузу, які адпраўляецца з адной станцыі на іншую, будзе залежаць ад адлегласці паміж станцыямі. Чым вышэй гэта значэньне, тым больш грузу будзе адпраўляцца да блізкіх станцый і менш{NBSP}- да далёкіх.
|
||||||
STR_CONFIG_SETTING_DEMAND_SIZE :Колькасьць грузу, што вяртаецца, пры сымэтрычным разьмеркаваньні: {STRING}
|
STR_CONFIG_SETTING_DEMAND_SIZE :Колькасць грузу, які вяртаецца, пры сіметрычным размеркаваньні: {STRING}
|
||||||
STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Усталёўка гэтага значэньня ніжэй 100% прымусіць разьмеркаваньне быць меней «сымэтрычным»: колькасьць грузу, які вяртаецца, зможа быць меншай за колькасць адпраўленага. Усталёўка 0% зробіць разьмеркаваньне цалкам несымэтрычным.
|
STR_CONFIG_SETTING_DEMAND_SIZE_HELPTEXT :Усталёўка гэтага значэньня ніжэй 100% прымусіць размеркаваньне быць меней «сіметрычным»: колькасць грузу, які вяртаецца, зможа быць менш, чым колькасць адпраўленага. Усталёўка ў 0% зробіць размеркаваньне цалкам несіметрычным.
|
||||||
STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Насычэньне кароткіх маршрутаў перад выкарыстаньнем ёмістых: {STRING}
|
STR_CONFIG_SETTING_SHORT_PATH_SATURATION :Мяжа загрузкі кароткіх маршрутаў перад выкарыстаньнем ёмістых: {STRING}
|
||||||
STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Пры наяўнасці некалькіх маршрутаў паміж станцыямі альґарытм разьмеркаваньня грузаў будзе выкарыстоўваць карацейшы маршрут да яго насычэньня, потым наступны па даўжыні, пакуль ён таксама не будзе насычаны, і г.{NBSP}д. Насычэньне вызначаецца па ацэнцы ёмістасьці ды плянуемай напружанасьці выкарыстаньня. Калі ўсе шляхі насычаныя, а попыт застаецца, Cargodist будзе перагружаць усе маршруты, аддаючы перавагу больш ёмістым. Збольшага альґарытм ня будзе дакладна вылічваць ёмістасьць. Гэта наладка дазваляе вызнасыць, наколькі загружаць маршрут, перад тым як пачаць выкарыстоўваць даўжэйшы. Усталюйце значэньне ніжэй за 100%, каб пазьбегнуць перагрузкі станцыяў у выпадку, калі прапускная здольнасьць маршруту будзе пераацэнена альґарытмам.
|
STR_CONFIG_SETTING_SHORT_PATH_SATURATION_HELPTEXT :Пры наяўнасці некалькіх маршрутаў паміж станцыямі алгарытм размеркаваньня грузаў будзе выкарыстоўваць найкароткі маршрут да яго загрузкі, потым наступны па даўжыні і г.{NBSP}д. Пры лішку грузу маршруты будуць перагружацца пачынальна з самых прадукцыйных. Загрузка разлічваецца зыходзячы з адзнакі прапускной здольнасці (якая можа быць недакладнай) і інтэнсіўнасці выкарыстаньня. Гэта наладка вызначае, наколькі загружаць маршрут перад тым, як пачаць выкарыстоўваць наступны. Усталюйце значэньне ніжэй 100% для таго, каб пазбегнуць затрымкі грузу, калі прапускная здольнасць маршруту будзе пераацэнена алгарытмам.
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Сыстэма адзінак для хуткасьці: {STRING}
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Сістэма адзінак для хуткасці: {STRING}
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Паказваць значэньні хуткасьці ў выбранай сыстэме адзінак
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Паказваць значэнні хуткасці ў выбранай сістэме адзінак
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :ангельскія (міль/г)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :англійская (міль/г)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :мэтрычная (км/г)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :метрычная (км/г)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :СІ (м/с)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :СІ (м/с)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Сыстэма адзінак для магутнасьці: {STRING}
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Сістэма адзінак для магутнасці: {STRING}
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Паказваць магутнасьць рухавікоў транспартных сродкаў у выбранай сыстэме адзінак
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Паказваць магутнасць рухавікоў транспартных сродкаў у выбранай сістэме адзінак
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :ангельская (к. с.)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :англійская (к. с.)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :мэтрычная (к. с.)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :метрычная (к. с.)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :СІ (кВт)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :СІ (кВт)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Сыстэма адзінак для масы: {STRING}
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Сістэма адзінак для масы: {STRING}
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Паказваць велічыні масы ў абранай сыстэме адзінак
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Паказваць велічыні масы ў абранай сістэме адзінак
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :ангельская (малая тона)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :англійская (малая тона)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :мэтрычная (т)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :метрычная (т)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :СІ (кг)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :СІ (кг)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Сыстэма адзінак для аб'ёму: {STRING}
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Сістэма адзінак для аб'ёму: {STRING}
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Паказваць значэньні аб'ёму ў выбранай сыстэме адзінак
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Паказваць значэньні аб'ёму ў выбранай сістэме адзінак
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :ангельская (галон)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :англійская (галон)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :мэтрычная (л)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :метрычная (л)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :СІ (m³)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :СІ (m³)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Сыстэма адзінак для цягавага намаганьня: {STRING}
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Сістэма адзінак для цягавага намаганьня: {STRING}
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :Паказваць значэньні цягавага намаганьня ў выбранай сыстэме адзінак
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :Паказваць значэнні цягавага намаганьня ў выбранай сістэме адзінак
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :ангельская (фунт-сіла)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :ангельская (фунт-сіла)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :мэтрычная (кгс)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :метрычная (кгс)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :СІ (кН)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :СІ (кН)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Сыстэма адзінак для вышыні: {STRING}
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Сістэма адзінак для вышыні: {STRING}
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Паказваць значэньні вышыні ў выбранай сыстэме адзінак
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Паказваць значэнні вышыні ў выбранай сістэме адзінак
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :ангельская (фут)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :англійская (фут)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :мэтрычная (м)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :метрычная (м)
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :СІ (м)
|
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :СІ (м)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_GUI :{ORANGE}Інтэрфэйс
|
STR_CONFIG_SETTING_GUI :{ORANGE}Інтэрфэйс
|
||||||
@@ -1972,7 +1945,7 @@ STR_CONFIG_SETTING_CONSTRUCTION :{ORANGE}Буд
|
|||||||
STR_CONFIG_SETTING_VEHICLES :{ORANGE}Транспарт
|
STR_CONFIG_SETTING_VEHICLES :{ORANGE}Транспарт
|
||||||
STR_CONFIG_SETTING_STATIONS :{ORANGE}Станцыі
|
STR_CONFIG_SETTING_STATIONS :{ORANGE}Станцыі
|
||||||
STR_CONFIG_SETTING_ECONOMY :{ORANGE}Эканоміка
|
STR_CONFIG_SETTING_ECONOMY :{ORANGE}Эканоміка
|
||||||
STR_CONFIG_SETTING_LINKGRAPH :{ORANGE}Разьмеркаваньне грузаў
|
STR_CONFIG_SETTING_LINKGRAPH :{ORANGE}Размеркаваньне грузаў
|
||||||
STR_CONFIG_SETTING_AI :{ORANGE}Канкурэнты
|
STR_CONFIG_SETTING_AI :{ORANGE}Канкурэнты
|
||||||
STR_CONFIG_SETTING_DISPLAY_OPTIONS :{ORANGE}Наладкі відарысу
|
STR_CONFIG_SETTING_DISPLAY_OPTIONS :{ORANGE}Наладкі відарысу
|
||||||
STR_CONFIG_SETTING_INTERACTION :{ORANGE}Узаемадзеяньне
|
STR_CONFIG_SETTING_INTERACTION :{ORANGE}Узаемадзеяньне
|
||||||
@@ -2143,7 +2116,6 @@ STR_LIVERY_FREIGHT_TRAM :Грузавы
|
|||||||
STR_FACE_CAPTION :{WHITE}Выбар твару
|
STR_FACE_CAPTION :{WHITE}Выбар твару
|
||||||
STR_FACE_CANCEL_TOOLTIP :{BLACK}Скасаваць выбар новага твару
|
STR_FACE_CANCEL_TOOLTIP :{BLACK}Скасаваць выбар новага твару
|
||||||
STR_FACE_OK_TOOLTIP :{BLACK}Прыняць выбар новага твару
|
STR_FACE_OK_TOOLTIP :{BLACK}Прыняць выбар новага твару
|
||||||
STR_MAPGEN_RANDOM :{BLACK}Выпадковая
|
|
||||||
|
|
||||||
STR_FACE_MALE_BUTTON :{BLACK}Мужчынскі
|
STR_FACE_MALE_BUTTON :{BLACK}Мужчынскі
|
||||||
STR_FACE_MALE_TOOLTIP :{BLACK}Выбар мужчынскіх твараў
|
STR_FACE_MALE_TOOLTIP :{BLACK}Выбар мужчынскіх твараў
|
||||||
@@ -2200,7 +2172,7 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Зьмя
|
|||||||
# Network server list
|
# Network server list
|
||||||
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Сеткавая гульня
|
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Сеткавая гульня
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED :{BLACK}Інтэрнэт
|
STR_NETWORK_SERVER_LIST_ADVERTISED :{BLACK}Інтэрнэт
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_TOOLTIP :{BLACK}Выберыце паміж гульнёй праз Інтэрнэт або ў лакальнай сетцы
|
STR_NETWORK_SERVER_LIST_ADVERTISED_TOOLTIP :{BLACK}Выберыце паміж гульнёй праз Інтэрнэт, або ў лакальнай сетцы
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_NO :Не
|
STR_NETWORK_SERVER_LIST_ADVERTISED_NO :Не
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_YES :Так
|
STR_NETWORK_SERVER_LIST_ADVERTISED_YES :Так
|
||||||
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Імя гульца:
|
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Імя гульца:
|
||||||
@@ -2264,10 +2236,10 @@ STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Абар
|
|||||||
STR_NETWORK_START_SERVER_UNADVERTISED :Не
|
STR_NETWORK_START_SERVER_UNADVERTISED :Не
|
||||||
STR_NETWORK_START_SERVER_ADVERTISED :Так
|
STR_NETWORK_START_SERVER_ADVERTISED :Так
|
||||||
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} клiент{P "" ы аў}
|
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} клiент{P "" ы аў}
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Макс. колькасьць клiентаў:
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Макс. клiентаў:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Выбар максымальнай колькасьці кліентаў. Ня ўсе месцы павінны быць занятыя
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Выбар максымальнай колькасьці кліентаў. Ня ўсе месцы павінны быць занятыя
|
||||||
STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} кампанi{P я i яў}
|
STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} кампанi{P я i яў}
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Макс. колькасьць кампанiяў:
|
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Макс. кампанiяў:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Абмежаваць максымальную колькасьць кампаніяў на сэрвэры
|
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Абмежаваць максымальную колькасьць кампаніяў на сэрвэры
|
||||||
STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} назіральнік{P "" i аў}
|
STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} назіральнік{P "" i аў}
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Макс. назіральнiкаў:
|
STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Макс. назіральнiкаў:
|
||||||
@@ -2592,14 +2564,14 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Пера
|
|||||||
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Зрабіць аб'екты не празрыстымі, а цалкам нябачнымі
|
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Зрабіць аб'екты не празрыстымі, а цалкам нябачнымі
|
||||||
|
|
||||||
# Linkgraph legend window
|
# Linkgraph legend window
|
||||||
STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Схема грузапатокаў
|
STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Схема грузаплыняў
|
||||||
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Усе
|
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Усе
|
||||||
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Няма
|
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Няма
|
||||||
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Выберыце кампаніі для адлюстраваньня
|
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Выберыце кампаніі для адлюстраваньня
|
||||||
|
|
||||||
# Linkgraph legend window and linkgraph legend in smallmap
|
# Linkgraph legend window and linkgraph legend in smallmap
|
||||||
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}нявыкарыст.
|
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}нявыкарыст.
|
||||||
STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}насычана
|
STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}загруж.
|
||||||
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}перагруз
|
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}перагруз
|
||||||
|
|
||||||
# Base for station construction window(s)
|
# Base for station construction window(s)
|
||||||
@@ -2908,7 +2880,6 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF:
|
|||||||
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Прымае: {LTBLUE}
|
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Прымае: {LTBLUE}
|
||||||
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
|
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
|
||||||
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Макс. хуткасьць чыгункi: {LTBLUE}{VELOCITY}
|
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Макс. хуткасьць чыгункi: {LTBLUE}{VELOCITY}
|
||||||
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Макс. хуткасьць аўтамабіляў: {LTBLUE}{VELOCITY}
|
|
||||||
|
|
||||||
# Description of land area of different tiles
|
# Description of land area of different tiles
|
||||||
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Камяні
|
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Камяні
|
||||||
@@ -3005,7 +2976,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Зямля на
|
|||||||
STR_ABOUT_OPENTTD :{WHITE}Аб OpenTTD
|
STR_ABOUT_OPENTTD :{WHITE}Аб OpenTTD
|
||||||
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Арыґінальныя аўтарскія правы {COPYRIGHT} 1995 Chris Sawyer. Усе правы абароненыя.
|
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Арыґінальныя аўтарскія правы {COPYRIGHT} 1995 Chris Sawyer. Усе правы абароненыя.
|
||||||
STR_ABOUT_VERSION :{BLACK}OpenTTD вэрсія {REV}
|
STR_ABOUT_VERSION :{BLACK}OpenTTD вэрсія {REV}
|
||||||
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002–2014 Каманда распрацоўнікаў OpenTTD
|
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2014 Каманда распрацоўнікаў OpenTTD
|
||||||
|
|
||||||
# Save/load game/scenario
|
# Save/load game/scenario
|
||||||
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Захаваць гульню
|
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Захаваць гульню
|
||||||
@@ -3024,7 +2995,6 @@ STR_SAVELOAD_SAVE_BUTTON :{BLACK}Заха
|
|||||||
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Захаваць гульню пад выбранай назвай
|
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Захаваць гульню пад выбранай назвай
|
||||||
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Загрузіць
|
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Загрузіць
|
||||||
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Загрузіць выбраную гульню
|
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Загрузіць выбраную гульню
|
||||||
STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Загрузіць выбраную мапу вышыняў
|
|
||||||
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Зьвесткі аб гульні
|
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Зьвесткі аб гульні
|
||||||
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Няма зьвесткаў.
|
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Няма зьвесткаў.
|
||||||
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
||||||
@@ -3045,6 +3015,7 @@ STR_MAPGEN_SNOW_LINE_UP :{BLACK}Падн
|
|||||||
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Апусьціць сьнегавую лінію
|
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Апусьціць сьнегавую лінію
|
||||||
STR_MAPGEN_RANDOM_SEED :{BLACK}Выпадковая лічба:
|
STR_MAPGEN_RANDOM_SEED :{BLACK}Выпадковая лічба:
|
||||||
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Пстрыкніце тут, каб увесьці адвольную пачатковую лічбу. Ляндшафт ствараецца псэўдавыпадкова, лічба — апорная кропка ў пасьлядоўнасьці выпадковых лічбаў.
|
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Пстрыкніце тут, каб увесьці адвольную пачатковую лічбу. Ляндшафт ствараецца псэўдавыпадкова, лічба — апорная кропка ў пасьлядоўнасьці выпадковых лічбаў.
|
||||||
|
STR_MAPGEN_RANDOM :{BLACK}Выпадковая
|
||||||
STR_MAPGEN_RANDOM_HELP :{BLACK}Зьмяніць выпадковую лічбу, якую выкарыстоўвае ґенэратар ляндшафту
|
STR_MAPGEN_RANDOM_HELP :{BLACK}Зьмяніць выпадковую лічбу, якую выкарыстоўвае ґенэратар ляндшафту
|
||||||
STR_MAPGEN_LAND_GENERATOR :{BLACK}Ґенэратар ляндшафту:
|
STR_MAPGEN_LAND_GENERATOR :{BLACK}Ґенэратар ляндшафту:
|
||||||
STR_MAPGEN_TREE_PLACER :{BLACK}Альґарытм дрэваў:
|
STR_MAPGEN_TREE_PLACER :{BLACK}Альґарытм дрэваў:
|
||||||
@@ -3151,8 +3122,6 @@ STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Файл
|
|||||||
STR_NEWGRF_SETTINGS_DISABLED :{RED}Адключана
|
STR_NEWGRF_SETTINGS_DISABLED :{RED}Адключана
|
||||||
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Несумяшчальна з дадзенай вэрсіяй OpenTTD
|
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Несумяшчальна з дадзенай вэрсіяй OpenTTD
|
||||||
|
|
||||||
# NewGRF save preset window
|
|
||||||
|
|
||||||
# NewGRF parameters window
|
# NewGRF parameters window
|
||||||
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Зьмяніць парамэтры NewGRF
|
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Зьмяніць парамэтры NewGRF
|
||||||
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Закрыць
|
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Закрыць
|
||||||
@@ -3240,7 +3209,6 @@ STR_NEWGRF_LIST_MISSING :{RED}Файлы
|
|||||||
STR_NEWGRF_BROKEN :{WHITE}Файл NewGRF «{0:STRING}» можа прывесьці да страты сынхранізацыі й крушэньня гульні.
|
STR_NEWGRF_BROKEN :{WHITE}Файл NewGRF «{0:STRING}» можа прывесьці да страты сынхранізацыі й крушэньня гульні.
|
||||||
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Мяняецца стан лакаматыва «{1:ENGINE}», які знаходзіцца па-за дэпо.
|
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Мяняецца стан лакаматыва «{1:ENGINE}», які знаходзіцца па-за дэпо.
|
||||||
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Мяняецца даўжыня транспарту «{1:ENGINE}», які знаходзіцца па-за дэпо.
|
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Мяняецца даўжыня транспарту «{1:ENGINE}», які знаходзіцца па-за дэпо.
|
||||||
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Гэта зьмяніла ёмістасьць транспарту '{1:ENGINE}', калі не ў дэпо для пераабсталяваньня
|
|
||||||
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Цягнік «{VEHICLE}», які належыць «{COMPANY}», мае няправільную даўжыню. Верагодна, гэта выклікана праблемамі ў файле новай ґрафікі. Гульня можа рассынхранізавацца або «выляцець».
|
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Цягнік «{VEHICLE}», які належыць «{COMPANY}», мае няправільную даўжыню. Верагодна, гэта выклікана праблемамі ў файле новай ґрафікі. Гульня можа рассынхранізавацца або «выляцець».
|
||||||
|
|
||||||
STR_NEWGRF_BUGGY :{WHITE}NewGRF «{0:STRING}» падае няправільную інфармацыю.
|
STR_NEWGRF_BUGGY :{WHITE}NewGRF «{0:STRING}» падае няправільную інфармацыю.
|
||||||
@@ -3295,8 +3263,8 @@ STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED_WINTER :{ORANGE}{STRING
|
|||||||
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} дастаўлена
|
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED_GENERAL :{ORANGE}{STRING}{GREEN} дастаўлена
|
||||||
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (недастаткова)
|
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_REQUIRED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{RED} (недастаткова)
|
||||||
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (дастаткова)
|
STR_TOWN_VIEW_CARGO_FOR_TOWNGROWTH_DELIVERED :{ORANGE}{CARGO_TINY} / {CARGO_LONG}{GREEN} (дастаткова)
|
||||||
STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Горад расьце раз у {ORANGE}{COMMA}{BLACK}{NBSP}д{P зень нi зён}
|
STR_TOWN_VIEW_TOWN_GROWS_EVERY :{BLACK}Горад расьце раз у {ORANGE}{COMMA}{BLACK} д{P зень нi зён}
|
||||||
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Горад расьце раз у {ORANGE}{COMMA}{BLACK}{NBSP}д{P зень нi зён} (прафінансавана)
|
STR_TOWN_VIEW_TOWN_GROWS_EVERY_FUNDED :{BLACK}Горад расьце раз у {ORANGE}{COMMA}{BLACK} д{P зень нi зён} (прафінансавана)
|
||||||
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Горад {RED}не{BLACK} разьвіваецца
|
STR_TOWN_VIEW_TOWN_GROW_STOPPED :{BLACK}Горад {RED}не{BLACK} разьвіваецца
|
||||||
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Узровень шуму ў горадзе: {ORANGE}{COMMA}{BLACK} Макс: {ORANGE}{COMMA}
|
STR_TOWN_VIEW_NOISE_IN_TOWN :{BLACK}Узровень шуму ў горадзе: {ORANGE}{COMMA}{BLACK} Макс: {ORANGE}{COMMA}
|
||||||
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Паказаць горад у асноўным вакне. Ctrl+клік — паказаць у дадатковым вакне.
|
STR_TOWN_VIEW_CENTER_TOOLTIP :{BLACK}Паказаць горад у асноўным вакне. Ctrl+клік — паказаць у дадатковым вакне.
|
||||||
@@ -3387,10 +3355,10 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Наці
|
|||||||
|
|
||||||
# Story book window
|
# Story book window
|
||||||
STR_STORY_BOOK_CAPTION :{WHITE}Гісторыя кампаніі «{COMPANY}»
|
STR_STORY_BOOK_CAPTION :{WHITE}Гісторыя кампаніі «{COMPANY}»
|
||||||
STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Сусьветная гісторыя
|
STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Сусветная гісторыя
|
||||||
STR_STORY_BOOK_TITLE :{YELLOW}{STRING}
|
STR_STORY_BOOK_TITLE :{YELLOW}{STRING}
|
||||||
STR_STORY_BOOK_GENERIC_PAGE_ITEM :Стар. {NUM}
|
STR_STORY_BOOK_GENERIC_PAGE_ITEM :Стар. {NUM}
|
||||||
STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Перайсьці на патрэбную старонку, выбраўшы яе ў выпадаючым сьпісе.
|
STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Перайсьці на патрэбную старонку, выбраўшы яе ў выпадаючым спісе.
|
||||||
STR_STORY_BOOK_PREV_PAGE :{BLACK}Папярэдняя
|
STR_STORY_BOOK_PREV_PAGE :{BLACK}Папярэдняя
|
||||||
STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Папярэдняя старонка
|
STR_STORY_BOOK_PREV_PAGE_TOOLTIP :{BLACK}Папярэдняя старонка
|
||||||
STR_STORY_BOOK_NEXT_PAGE :{BLACK}Наступная
|
STR_STORY_BOOK_NEXT_PAGE :{BLACK}Наступная
|
||||||
@@ -3424,18 +3392,18 @@ STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN
|
|||||||
|
|
||||||
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рэйтынґ
|
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рэйтынґ
|
||||||
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Паказаць рэйтынґ станцыі
|
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Паказаць рэйтынґ станцыі
|
||||||
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Месячны аб'ём паставак і мясцовы рэйтынґ:
|
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Месячны аб'ём паставак і мясцовы рэйтынг:
|
||||||
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%)
|
STR_STATION_VIEW_CARGO_SUPPLY_RATING :{WHITE}{STRING}: {YELLOW}{COMMA} / {STRING} ({COMMA}%)
|
||||||
|
|
||||||
STR_STATION_VIEW_GROUP :{BLACK}Групаваць
|
STR_STATION_VIEW_GROUP :{BLACK}Групаваць
|
||||||
STR_STATION_VIEW_WAITING_STATION :па станцыі (якія чакаюць)
|
STR_STATION_VIEW_WAITING_STATION :па станцыі (якія чакаюць)
|
||||||
STR_STATION_VIEW_WAITING_AMOUNT :па колькасьці (якія чакаюць)
|
STR_STATION_VIEW_WAITING_AMOUNT :па колькасці (якія чакаюць)
|
||||||
STR_STATION_VIEW_PLANNED_STATION :па станцыі (плянаваныя)
|
STR_STATION_VIEW_PLANNED_STATION :па станцыі (планаваныя)
|
||||||
STR_STATION_VIEW_PLANNED_AMOUNT :па колькасьці (плянаваныя)
|
STR_STATION_VIEW_PLANNED_AMOUNT :па колькасці (планаваныя)
|
||||||
STR_STATION_VIEW_FROM :{YELLOW}{CARGO_SHORT} з {STATION}
|
STR_STATION_VIEW_FROM :{YELLOW}{CARGO_SHORT} з {STATION}
|
||||||
STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT} праз {STATION}
|
STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT} праз {STATION}
|
||||||
STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT} у {STATION}
|
STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT} у {STATION}
|
||||||
STR_STATION_VIEW_FROM_ANY :{RED}{CARGO_SHORT} зь невядомай станцыі
|
STR_STATION_VIEW_FROM_ANY :{RED}{CARGO_SHORT} з невядомай станцыі
|
||||||
STR_STATION_VIEW_TO_ANY :{RED}{CARGO_SHORT} на любую станцыю
|
STR_STATION_VIEW_TO_ANY :{RED}{CARGO_SHORT} на любую станцыю
|
||||||
STR_STATION_VIEW_VIA_ANY :{RED}{CARGO_SHORT} праз любую станцыю
|
STR_STATION_VIEW_VIA_ANY :{RED}{CARGO_SHORT} праз любую станцыю
|
||||||
STR_STATION_VIEW_FROM_HERE :{GREEN}{CARGO_SHORT} з гэтай станцыі
|
STR_STATION_VIEW_FROM_HERE :{GREEN}{CARGO_SHORT} з гэтай станцыі
|
||||||
@@ -3443,12 +3411,12 @@ STR_STATION_VIEW_VIA_HERE :{GREEN}{CARGO_S
|
|||||||
STR_STATION_VIEW_TO_HERE :{GREEN}{CARGO_SHORT} на гэту станцыю
|
STR_STATION_VIEW_TO_HERE :{GREEN}{CARGO_SHORT} на гэту станцыю
|
||||||
STR_STATION_VIEW_NONSTOP :{YELLOW}{CARGO_SHORT} без перасадак
|
STR_STATION_VIEW_NONSTOP :{YELLOW}{CARGO_SHORT} без перасадак
|
||||||
|
|
||||||
STR_STATION_VIEW_GROUP_S_V_D :Адкуль — Праз — Куды
|
STR_STATION_VIEW_GROUP_S_V_D :Адкуль - Праз - Куды
|
||||||
STR_STATION_VIEW_GROUP_S_D_V :Адкуль — Куды — Праз
|
STR_STATION_VIEW_GROUP_S_D_V :Адкуль - Куды - Праз
|
||||||
STR_STATION_VIEW_GROUP_V_S_D :Праз — Адкуль — Куды
|
STR_STATION_VIEW_GROUP_V_S_D :Праз - Адкуль - Куды
|
||||||
STR_STATION_VIEW_GROUP_V_D_S :Праз — Куды — Адкуль
|
STR_STATION_VIEW_GROUP_V_D_S :Праз - Куды - Адкуль
|
||||||
STR_STATION_VIEW_GROUP_D_S_V :Куды — Адкуль — Праз
|
STR_STATION_VIEW_GROUP_D_S_V :Куды - Адкуль - Праз
|
||||||
STR_STATION_VIEW_GROUP_D_V_S :Куды — Праз — Адкуль
|
STR_STATION_VIEW_GROUP_D_V_S :Куды - Праз - Адкуль
|
||||||
|
|
||||||
############ range for rating starts
|
############ range for rating starts
|
||||||
STR_CARGO_RATING_APPALLING :Жудасны
|
STR_CARGO_RATING_APPALLING :Жудасны
|
||||||
@@ -3970,7 +3938,7 @@ STR_VEHICLE_INFO_CAPACITY_CAPACITY :{BLACK}Ёмiс
|
|||||||
|
|
||||||
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Выручка перавозкі: {LTBLUE}{CURRENCY_LONG}
|
STR_VEHICLE_INFO_FEEDER_CARGO_VALUE :{BLACK}Выручка перавозкі: {LTBLUE}{CURRENCY_LONG}
|
||||||
|
|
||||||
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Агляд кожныя {LTBLUE}{COMMA}{NBSP}дзён{BLACK} Апошнi раз: {LTBLUE}{DATE_LONG}
|
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_DAYS :{BLACK}Агляд кожныя {LTBLUE}{COMMA} дзён{BLACK} Апошнi раз: {LTBLUE}{DATE_LONG}
|
||||||
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Агляд кожныя {LTBLUE}{COMMA}%{BLACK} Апошнi раз: {LTBLUE}{DATE_LONG}
|
STR_VEHICLE_DETAILS_SERVICING_INTERVAL_PERCENT :{BLACK}Агляд кожныя {LTBLUE}{COMMA}%{BLACK} Апошнi раз: {LTBLUE}{DATE_LONG}
|
||||||
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Павялiчыць інтэрвал абслугоўваньня на 10. Ctrl+клік — павялічыць інтэрвал абслугоўваньня на 5.
|
STR_VEHICLE_DETAILS_INCREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Павялiчыць інтэрвал абслугоўваньня на 10. Ctrl+клік — павялічыць інтэрвал абслугоўваньня на 5.
|
||||||
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Зьменшыць інтэрвал абслугоўваньня на 10. Ctrl+клік — паменшыць інтэрвал абслугоўваньня на 5.
|
STR_VEHICLE_DETAILS_DECREASE_SERVICING_INTERVAL_TOOLTIP :{BLACK}Зьменшыць інтэрвал абслугоўваньня на 10. Ctrl+клік — паменшыць інтэрвал абслугоўваньня на 5.
|
||||||
@@ -4068,8 +4036,8 @@ STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Зьмя
|
|||||||
|
|
||||||
STR_ORDER_REFIT :{BLACK}Пераабсталяваць
|
STR_ORDER_REFIT :{BLACK}Пераабсталяваць
|
||||||
STR_ORDER_REFIT_TOOLTIP :{BLACK}Выберыце тып грузу для пераабсталяваньня. Ctrl+клік — для выдаленьня заданьня.
|
STR_ORDER_REFIT_TOOLTIP :{BLACK}Выберыце тып грузу для пераабсталяваньня. Ctrl+клік — для выдаленьня заданьня.
|
||||||
STR_ORDER_REFIT_AUTO :{BLACK}Пераабсталяваньне
|
STR_ORDER_REFIT_AUTO :{BLACK}Аўтаматычнае пераабсталяваньне
|
||||||
STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Выберыце тып грузу для пераабсталяваньня. Яно будзе праведзена, калі ТС дазваляе гэта зрабіць. Ctrl+пстрычка адменіць пераабсталяваньне.
|
STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Выберыце груз для пераабсталяваньня ў гэтым заданьнi. Ctrl+Клiк — скасаваньне. Аўтаматычнае пераабсталяваньне адбудзецца, толькi калi транспарт гэта дазваляе
|
||||||
STR_ORDER_DROP_REFIT_AUTO :Нязьменны груз
|
STR_ORDER_DROP_REFIT_AUTO :Нязьменны груз
|
||||||
STR_ORDER_DROP_REFIT_AUTO_ANY :Даступны груз
|
STR_ORDER_DROP_REFIT_AUTO_ANY :Даступны груз
|
||||||
|
|
||||||
@@ -4160,18 +4128,18 @@ STR_ORDER_NO_UNLOAD_FULL_LOAD :(Не разг
|
|||||||
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Не разгружацца й чакаць поўнай загрузкі любым грузам)
|
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Не разгружацца й чакаць поўнай загрузкі любым грузам)
|
||||||
STR_ORDER_NO_UNLOAD_NO_LOAD :(Не разгружацца й не грузіцца)
|
STR_ORDER_NO_UNLOAD_NO_LOAD :(Не разгружацца й не грузіцца)
|
||||||
|
|
||||||
STR_ORDER_AUTO_REFIT :(Пераабстал. пад {STRING.acc})
|
STR_ORDER_AUTO_REFIT :(Пераабсталяваньне для {STRING})
|
||||||
STR_ORDER_FULL_LOAD_REFIT :(Пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі)
|
STR_ORDER_FULL_LOAD_REFIT :(Поўная загрузка з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_FULL_LOAD_ANY_REFIT :(Пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі любым грузам)
|
STR_ORDER_FULL_LOAD_ANY_REFIT :(Поўная загрузка любым грузам з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_UNLOAD_REFIT :(Разгрузіцца, пераабстал. пад {STRING.acc} і забраць груз)
|
STR_ORDER_UNLOAD_REFIT :(Разгрузіць і забраць груз з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Разгрузіцца, пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі)
|
STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Разгрузіць і чакаць поўнай загрузкі з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Разгрузіцца, пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі любым грузам)
|
STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Разгрузіць і чакаць любой поўнай загрузкі з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_TRANSFER_REFIT :(Перадаць, пераабстал. пад {STRING.acc} і забраць груз)
|
STR_ORDER_TRANSFER_REFIT :(Перадаць i забраць груз з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Перадаць, пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі)
|
STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Перадаць i чакаць поўнай загрузкi з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Перадаць, пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі любым грузам)
|
STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Перадаць i чакаць любой поўнай загрузкi з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_NO_UNLOAD_REFIT :(Не разгружацца, пераабстал. пад {STRING.acc} і забраць груз)
|
STR_ORDER_NO_UNLOAD_REFIT :(Не разгружацца й забраць груз з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Не разгружацца, пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі)
|
STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Не разгружацца й чакаць поўнай загрузкi з пераабсталяваньнем для {STRING})
|
||||||
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Не разгружацца, пераабстал. пад {STRING.acc} і чакаць поўнай загрузкі любым грузам)
|
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Не разгружацца й чакаць любой поўнай загрузкi з пераабсталяваньнем для {STRING})
|
||||||
|
|
||||||
STR_ORDER_AUTO_REFIT_ANY :даступны груз
|
STR_ORDER_AUTO_REFIT_ANY :даступны груз
|
||||||
|
|
||||||
@@ -4202,8 +4170,8 @@ STR_TIMETABLE_TRAVEL_FOR :Час у шл
|
|||||||
STR_TIMETABLE_TRAVEL_FOR_SPEED :Рухацца да {STRING} не хутчэй за {VELOCITY}
|
STR_TIMETABLE_TRAVEL_FOR_SPEED :Рухацца да {STRING} не хутчэй за {VELOCITY}
|
||||||
STR_TIMETABLE_STAY_FOR :і чакаць {STRING}
|
STR_TIMETABLE_STAY_FOR :і чакаць {STRING}
|
||||||
STR_TIMETABLE_AND_TRAVEL_FOR :і рухацца да {STRING}
|
STR_TIMETABLE_AND_TRAVEL_FOR :і рухацца да {STRING}
|
||||||
STR_TIMETABLE_DAYS :{COMMA}{NBSP}д{P зень нi зён}
|
STR_TIMETABLE_DAYS :{COMMA} д{P зень нi зён}
|
||||||
STR_TIMETABLE_TICKS :{COMMA}{NBSP}цiк{P "" i аў}
|
STR_TIMETABLE_TICKS :{COMMA} цiк{P "" i аў}
|
||||||
|
|
||||||
STR_TIMETABLE_TOTAL_TIME :{BLACK}Увесь маршрут зойме {STRING}
|
STR_TIMETABLE_TOTAL_TIME :{BLACK}Увесь маршрут зойме {STRING}
|
||||||
STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Рух па маршруце зойме {STRING} (ня ўсё ўлічана)
|
STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :{BLACK}Рух па маршруце зойме {STRING} (ня ўсё ўлічана)
|
||||||
@@ -4215,7 +4183,7 @@ STR_TIMETABLE_STATUS_NOT_STARTED :{BLACK}Ґраф
|
|||||||
STR_TIMETABLE_STATUS_START_AT :{BLACK}Адлік часу пачнецца з {STRING}
|
STR_TIMETABLE_STATUS_START_AT :{BLACK}Адлік часу пачнецца з {STRING}
|
||||||
|
|
||||||
STR_TIMETABLE_STARTING_DATE :{BLACK}Пачатковая дата
|
STR_TIMETABLE_STARTING_DATE :{BLACK}Пачатковая дата
|
||||||
STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Выберыце пачатковую дату для гэтага ґрафіка. Ctrl+пстрычка ўсталюе пачатковую дату і раўнамерна разьмяркуе ўсе транспартныя сродкі, якія рухаюцца па гэтым маршруце, калі час руху па ім цалкам разьлічаны.
|
STR_TIMETABLE_STARTING_DATE_TOOLTIP :{BLACK}Выберыце пачатковую дату для гэтага графіка. Ctrl+пстрычка ўсталюе пачатковую дату і раўнамерна размяркуе ўсе транспартныя сродкі, якія рухаюцца па гэтым маршруце, калі час руху па ім цалкам разлічаны.
|
||||||
|
|
||||||
STR_TIMETABLE_CHANGE_TIME :{BLACK}Зьмяніць час
|
STR_TIMETABLE_CHANGE_TIME :{BLACK}Зьмяніць час
|
||||||
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Зьмяніць час для вылучанага заданьня
|
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Зьмяніць час для вылучанага заданьня
|
||||||
@@ -4330,7 +4298,7 @@ STR_TEXTFILE_README_CAPTION :{WHITE}{STRING}
|
|||||||
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} сьпiс зьменаў {STRING}
|
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} сьпiс зьменаў {STRING}
|
||||||
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} ліцэнзія {STRING}
|
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} ліцэнзія {STRING}
|
||||||
STR_TEXTFILE_WRAP_TEXT :{WHITE}Пераносіць тэкст
|
STR_TEXTFILE_WRAP_TEXT :{WHITE}Пераносіць тэкст
|
||||||
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Пераносіць тэкст так, каб ён зьмяшчаўся ў вакне без неабходнасьці пракруткі
|
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Пераносіць тэкст так, каб ён змяшчаўся ў акне без неабходнасці прагорткі
|
||||||
STR_TEXTFILE_VIEW_README :{BLACK}Прагледзець iнструкцыю
|
STR_TEXTFILE_VIEW_README :{BLACK}Прагледзець iнструкцыю
|
||||||
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Журнал зьменаў
|
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Журнал зьменаў
|
||||||
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Ліцэнзія
|
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Ліцэнзія
|
||||||
@@ -4709,9 +4677,9 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Не а
|
|||||||
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... транспартны сродак зьнішчаны
|
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... транспартны сродак зьнішчаны
|
||||||
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Усе транспартныя сродкі будуць недаступныя
|
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Усе транспартныя сродкі будуць недаступныя
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Зьмяніце канфігурацыю модуля NewGRF
|
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Змяніце канфігурацыю модуля NewGRF
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Няма даступных транспартных сродкаў
|
STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Няма даступных транспартных сродкаў
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Пачніце гульню пасьля {DATE_SHORT} або падключыце NewGRF з транспартам адпаведных часоў.
|
STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Пачніце гульню не раней {DATE_SHORT} або падключыце NewGRF, дадаючы транспартныя сродкі, якія выкарыстоўваліся тым часам.
|
||||||
|
|
||||||
# Specific vehicle errors
|
# Specific vehicle errors
|
||||||
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Немагчыма іґнараваць сыґнал. Небясьпечна...
|
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Немагчыма іґнараваць сыґнал. Небясьпечна...
|
||||||
@@ -4756,14 +4724,14 @@ STR_ERROR_CAN_T_DELETE_SIGN :{WHITE}Не а
|
|||||||
STR_DESKTOP_SHORTCUT_COMMENT :Эканамічны сімулятар на аснове «Transport Tycoon Deluxe»
|
STR_DESKTOP_SHORTCUT_COMMENT :Эканамічны сімулятар на аснове «Transport Tycoon Deluxe»
|
||||||
|
|
||||||
# Translatable descriptions in media/baseset/*.ob* files
|
# Translatable descriptions in media/baseset/*.ob* files
|
||||||
STR_BASEGRAPHICS_DOS_DESCRIPTION :Арыґінальная ґрафіка з Transport Tycoon Deluxe для DOS.
|
STR_BASEGRAPHICS_DOS_DESCRIPTION :Арыгінальная графіка з Transport Tycoon Deluxe для DOS.
|
||||||
STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Арыґінальная ґрафіка зь нямецкай версіі Transport Tycoon Deluxe для DOS.
|
STR_BASEGRAPHICS_DOS_DE_DESCRIPTION :Арыгінальная графіка з нямецкай версіі Transport Tycoon Deluxe для DOS.
|
||||||
STR_BASEGRAPHICS_WIN_DESCRIPTION :Арыґінальная ґрафіка з Transport Tycoon Deluxe для Windows.
|
STR_BASEGRAPHICS_WIN_DESCRIPTION :Арыгінальная графіка з Transport Tycoon Deluxe для Windows.
|
||||||
STR_BASESOUNDS_DOS_DESCRIPTION :Арыґінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для DOS.
|
STR_BASESOUNDS_DOS_DESCRIPTION :Арыгінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для DOS.
|
||||||
STR_BASESOUNDS_WIN_DESCRIPTION :Арыґінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
STR_BASESOUNDS_WIN_DESCRIPTION :Арыгінальны набор гукавога афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
||||||
STR_BASESOUNDS_NONE_DESCRIPTION :"Пусты" набор гукавога афармленьня, які не зьмяшчае ніякіх гукаў.
|
STR_BASESOUNDS_NONE_DESCRIPTION :"Пусты" набор гукавога афармленьня, не змяшчаючы ніякіх гукаў.
|
||||||
STR_BASEMUSIC_WIN_DESCRIPTION :Арыґінальны набор музычнага афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
STR_BASEMUSIC_WIN_DESCRIPTION :Арыгінальны набор музычнага афармленьня з гульні Transport Tycoon Deluxe для Windows.
|
||||||
STR_BASEMUSIC_NONE_DESCRIPTION :"Пусты" набор музычнага афармлення, які не зьмяшчае ніякай музыкі.
|
STR_BASEMUSIC_NONE_DESCRIPTION :"Пусты" набор музычнага афармлення, не змяшчаючы ніякай музыкі.
|
||||||
|
|
||||||
##id 0x2000
|
##id 0x2000
|
||||||
# Town building names
|
# Town building names
|
||||||
|
@@ -249,9 +249,6 @@ STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de
|
|||||||
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista para esquerda/direita
|
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Barra de rolagem - rola a lista para esquerda/direita
|
||||||
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolir edifícios etc. num quadrado de terreno. Ctrl seleciona a área diagonalmente. Shift alterna construção/mostrar estimativa de preço
|
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Demolir edifícios etc. num quadrado de terreno. Ctrl seleciona a área diagonalmente. Shift alterna construção/mostrar estimativa de preço
|
||||||
|
|
||||||
# Show engines button
|
|
||||||
|
|
||||||
|
|
||||||
# Query window
|
# Query window
|
||||||
STR_BUTTON_DEFAULT :{BLACK}Padrão
|
STR_BUTTON_DEFAULT :{BLACK}Padrão
|
||||||
STR_BUTTON_CANCEL :{BLACK}Cancelar
|
STR_BUTTON_CANCEL :{BLACK}Cancelar
|
||||||
@@ -474,7 +471,7 @@ STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Alternar caixas
|
|||||||
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Alterna a colorização dos blocos sujos
|
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Alterna a colorização dos blocos sujos
|
||||||
############ range ends here
|
############ range ends here
|
||||||
|
|
||||||
############ range for ordinal numbers used for the place in the highscore window
|
############ range for days starts (also used for the place in the highscore window)
|
||||||
STR_ORDINAL_NUMBER_1ST :1
|
STR_ORDINAL_NUMBER_1ST :1
|
||||||
STR_ORDINAL_NUMBER_2ND :2
|
STR_ORDINAL_NUMBER_2ND :2
|
||||||
STR_ORDINAL_NUMBER_3RD :3
|
STR_ORDINAL_NUMBER_3RD :3
|
||||||
@@ -490,40 +487,22 @@ STR_ORDINAL_NUMBER_12TH :12
|
|||||||
STR_ORDINAL_NUMBER_13TH :13
|
STR_ORDINAL_NUMBER_13TH :13
|
||||||
STR_ORDINAL_NUMBER_14TH :14
|
STR_ORDINAL_NUMBER_14TH :14
|
||||||
STR_ORDINAL_NUMBER_15TH :15
|
STR_ORDINAL_NUMBER_15TH :15
|
||||||
############ range for ordinal numbers ends
|
STR_ORDINAL_NUMBER_16TH :16
|
||||||
|
STR_ORDINAL_NUMBER_17TH :17
|
||||||
############ range for days starts
|
STR_ORDINAL_NUMBER_18TH :18
|
||||||
STR_DAY_NUMBER_1ST :1º
|
STR_ORDINAL_NUMBER_19TH :19
|
||||||
STR_DAY_NUMBER_2ND :2
|
STR_ORDINAL_NUMBER_20TH :20
|
||||||
STR_DAY_NUMBER_3RD :3
|
STR_ORDINAL_NUMBER_21ST :21
|
||||||
STR_DAY_NUMBER_4TH :4
|
STR_ORDINAL_NUMBER_22ND :22
|
||||||
STR_DAY_NUMBER_5TH :5
|
STR_ORDINAL_NUMBER_23RD :23
|
||||||
STR_DAY_NUMBER_6TH :6
|
STR_ORDINAL_NUMBER_24TH :24
|
||||||
STR_DAY_NUMBER_7TH :7
|
STR_ORDINAL_NUMBER_25TH :25
|
||||||
STR_DAY_NUMBER_8TH :8
|
STR_ORDINAL_NUMBER_26TH :26
|
||||||
STR_DAY_NUMBER_9TH :9
|
STR_ORDINAL_NUMBER_27TH :27
|
||||||
STR_DAY_NUMBER_10TH :10
|
STR_ORDINAL_NUMBER_28TH :28
|
||||||
STR_DAY_NUMBER_11TH :11
|
STR_ORDINAL_NUMBER_29TH :29
|
||||||
STR_DAY_NUMBER_12TH :12
|
STR_ORDINAL_NUMBER_30TH :30
|
||||||
STR_DAY_NUMBER_13TH :13
|
STR_ORDINAL_NUMBER_31ST :31
|
||||||
STR_DAY_NUMBER_14TH :14
|
|
||||||
STR_DAY_NUMBER_15TH :15
|
|
||||||
STR_DAY_NUMBER_16TH :16
|
|
||||||
STR_DAY_NUMBER_17TH :17
|
|
||||||
STR_DAY_NUMBER_18TH :18
|
|
||||||
STR_DAY_NUMBER_19TH :19
|
|
||||||
STR_DAY_NUMBER_20TH :20
|
|
||||||
STR_DAY_NUMBER_21ST :21
|
|
||||||
STR_DAY_NUMBER_22ND :22
|
|
||||||
STR_DAY_NUMBER_23RD :23
|
|
||||||
STR_DAY_NUMBER_24TH :24
|
|
||||||
STR_DAY_NUMBER_25TH :25
|
|
||||||
STR_DAY_NUMBER_26TH :26
|
|
||||||
STR_DAY_NUMBER_27TH :27
|
|
||||||
STR_DAY_NUMBER_28TH :28
|
|
||||||
STR_DAY_NUMBER_29TH :29
|
|
||||||
STR_DAY_NUMBER_30TH :30
|
|
||||||
STR_DAY_NUMBER_31ST :31
|
|
||||||
############ range for days ends
|
############ range for days ends
|
||||||
|
|
||||||
############ range for months starts
|
############ range for months starts
|
||||||
@@ -832,11 +811,13 @@ STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE
|
|||||||
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} está aguardando no depósito
|
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} está aguardando no depósito
|
||||||
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} está aguardando no hangar
|
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} está aguardando no hangar
|
||||||
|
|
||||||
# Order review system / warnings
|
# Start of order review system
|
||||||
|
# DON'T ADD OR REMOVE LINES HERE
|
||||||
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} tem tem muito poucas ordens no horário
|
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} tem tem muito poucas ordens no horário
|
||||||
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} tem uma ordem nula
|
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} tem uma ordem nula
|
||||||
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} tem ordens duplicadas
|
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} tem ordens duplicadas
|
||||||
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} tem uma estação inválida em suas ordens
|
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} tem uma estação inválida em suas ordens
|
||||||
|
# end of order system
|
||||||
|
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} está ficando velho
|
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} está ficando velho
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} está ficando muito velho
|
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} está ficando muito velho
|
||||||
@@ -958,13 +939,11 @@ STR_GAME_OPTIONS_TOWN_NAME_CATALAN :Catalão
|
|||||||
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvar automaticamente
|
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Salvar automaticamente
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticos
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Selecionar o intervalo entre jogos salvos automaticos
|
||||||
|
|
||||||
############ start of autosave dropdown
|
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Desativado
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Desativado
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :A cada mês
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :A cada mês
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :A cada 3 meses
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :A cada 3 meses
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :A cada 6 meses
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :A cada 6 meses
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :A cada 12 meses
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :A cada 12 meses
|
||||||
############ end of autosave dropdown
|
|
||||||
|
|
||||||
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Idioma
|
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Idioma
|
||||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Selecionar o idioma da interface do jogo
|
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Selecionar o idioma da interface do jogo
|
||||||
@@ -993,7 +972,6 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Selecion
|
|||||||
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} arquivo{P "" s} corrompido{P "" s}
|
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} arquivo{P "" s} corrompido{P "" s}
|
||||||
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Informação adicional sobre o conjunto de músicas base
|
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Informação adicional sobre o conjunto de músicas base
|
||||||
|
|
||||||
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Falha ao obter a lista de resoluções suportadas
|
|
||||||
STR_ERROR_FULLSCREEN_FAILED :{WHITE}Modo de tela cheia falhou
|
STR_ERROR_FULLSCREEN_FAILED :{WHITE}Modo de tela cheia falhou
|
||||||
|
|
||||||
# Custom currency window
|
# Custom currency window
|
||||||
@@ -1093,9 +1071,8 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :Config. do jogo
|
|||||||
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Config. da companhia (guardado no savegame; afeta apenas novos jogos)
|
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Config. da companhia (guardado no savegame; afeta apenas novos jogos)
|
||||||
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Config. da companhia (guardado no savegame; afeta apenas a comp. atual)
|
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Config. da companhia (guardado no savegame; afeta apenas a comp. atual)
|
||||||
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categoria:
|
STR_CONFIG_SETTING_RESTRICT_LABEL :{BLACK}Exibir:
|
||||||
STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Tipo:
|
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo a mostrar apenas configs. alteradas
|
||||||
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo a mostrar apenas filtros pré-definidos
|
|
||||||
STR_CONFIG_SETTING_RESTRICT_BASIC :Configs. básicas
|
STR_CONFIG_SETTING_RESTRICT_BASIC :Configs. básicas
|
||||||
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Configs. avançadas
|
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Configs. avançadas
|
||||||
STR_CONFIG_SETTING_RESTRICT_ALL :Configs. expert / todas as configs.
|
STR_CONFIG_SETTING_RESTRICT_ALL :Configs. expert / todas as configs.
|
||||||
@@ -1104,15 +1081,11 @@ STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Configs. com um
|
|||||||
|
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo a determinados tipos
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT :{BLACK}Restringe a lista abaixo a determinados tipos
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL :Todos os tipos de configs.
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL :Todos os tipos de configs.
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Configs. do cliente (não é guardado no savegame; afeta todos os jogos)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Config. do cliente (não é guardado no savegame; afeta todos os jogos)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Configs. do jogo (guardado no savegame; afeta apenas novos jogos)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Config. do jogo (guardado no savegame; afeta apenas novos jogos)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Configs. do jogo (guardado no savegame; afeta apenas o jogo atual)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Config. do jogo (guardado no savegame; afeta apenas o jogo atual)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Configs. da companhia (guardado no savegame; afeta apenas novos jogos)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Config. da companhia (guardado no savegame; afeta apenas novos jogos)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Configs. de companhia (guardado no savegame; afeta apenas a companhia atual)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Config. de companhia (guardado no savegame; afeta apenas a companhia atual)
|
||||||
STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Categoria {BLACK}até {WHITE}{STRING}
|
|
||||||
STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Tipo {BLACK}até {WHITE}Todas configurações de tipos
|
|
||||||
STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Mostrar todos resultados por configuração{}{SILVER}Category {BLACK}até {WHITE}{STRING} {BLACK}e {SILVER}Tipo {BLACK}até {WHITE}Todas configurações de tipos
|
|
||||||
STR_CONFIG_SETTINGS_NONE :{G=m}{WHITE}- Nenhum -
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_OFF :Desl.
|
STR_CONFIG_SETTING_OFF :Desl.
|
||||||
STR_CONFIG_SETTING_ON :Lig.
|
STR_CONFIG_SETTING_ON :Lig.
|
||||||
@@ -1150,12 +1123,12 @@ STR_CONFIG_SETTING_TRAIN_REVERSING :Desabilitar rev
|
|||||||
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Se ativado, trens não irão mudar de direção em estações não terminais, mesmo se houver um caminho mais curto ao próximo destino ao trocar de direção
|
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Se ativado, trens não irão mudar de direção em estações não terminais, mesmo se houver um caminho mais curto ao próximo destino ao trocar de direção
|
||||||
STR_CONFIG_SETTING_DISASTERS :Desastres: {STRING}
|
STR_CONFIG_SETTING_DISASTERS :Desastres: {STRING}
|
||||||
STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Alterna desastres que podem ocasionalmente bloquear ou destruir veículos ou infraestrutura
|
STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Alterna desastres que podem ocasionalmente bloquear ou destruir veículos ou infraestrutura
|
||||||
STR_CONFIG_SETTING_CITY_APPROVAL :Atitude da prefeitura em relação à restruturação local: {STRING}
|
STR_CONFIG_SETTING_CITY_APPROVAL :Atitude da prefeitura em relação à restruturação de área: {STRING}
|
||||||
STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Escolhe como a poluição sonoroa e ambiental afeta a classificação na cidade e as ações futuras naquela área
|
STR_CONFIG_SETTING_CITY_APPROVAL_HELPTEXT :Escolhe como a poluição sonoroa e ambiental afeta a classificação na cidade e as ações futuras naquela área
|
||||||
|
|
||||||
STR_CONFIG_SETTING_BUILDONSLOPES :Permitir a construção em declives e encostas: {STRING}
|
STR_CONFIG_SETTING_BUILDONSLOPES :Permitir a construção em declives e encostas: {STRING}
|
||||||
STR_CONFIG_SETTING_BUILDONSLOPES_HELPTEXT :Se ativado, trilhos e estações podem ser construídas na maioria das inclinações. Se desativado, são permitidas apenas em inclinações correspondentes à direção da via, sem precisar de fundações
|
STR_CONFIG_SETTING_BUILDONSLOPES_HELPTEXT :Se ativado, trilhos e estações podem ser construídas na maioria das inclinações. Se desativado, são permitidas apenas em inclinações correspondentes à direção da via, sem precisar de fundações
|
||||||
STR_CONFIG_SETTING_AUTOSLOPE :Permitir paisagismo sob edifícios, trilhos, etc.: {STRING}
|
STR_CONFIG_SETTING_AUTOSLOPE :Permitir paisagismo sob edifícios, ruas, etc. (auto nivelação): {STRING}
|
||||||
STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite paisagismo sob edifícios e vias sem precisar removê-las
|
STR_CONFIG_SETTING_AUTOSLOPE_HELPTEXT :Permite paisagismo sob edifícios e vias sem precisar removê-las
|
||||||
STR_CONFIG_SETTING_CATCHMENT :Dimensionamento mais realista das áreas de abrangência: {STRING}
|
STR_CONFIG_SETTING_CATCHMENT :Dimensionamento mais realista das áreas de abrangência: {STRING}
|
||||||
STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Exibe áreas de abrangência de para diferentes tipos de estações e aeroportos
|
STR_CONFIG_SETTING_CATCHMENT_HELPTEXT :Exibe áreas de abrangência de para diferentes tipos de estações e aeroportos
|
||||||
@@ -1270,7 +1243,7 @@ STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES :Veículos nunca
|
|||||||
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quanto ativado, mantém todos os modelos de veículos disponíveis após serem introduzidos
|
STR_CONFIG_SETTING_NEVER_EXPIRE_VEHICLES_HELPTEXT :Quanto ativado, mantém todos os modelos de veículos disponíveis após serem introduzidos
|
||||||
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING}
|
STR_CONFIG_SETTING_AUTORENEW_VEHICLE :Auto-renovação de veículos quando ficam velhos: {STRING}
|
||||||
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativado, os veículos próximos do fim da vida útil são automaticamente substituídos quando as condições forem atingidas
|
STR_CONFIG_SETTING_AUTORENEW_VEHICLE_HELPTEXT :Quando ativado, os veículos próximos do fim da vida útil são automaticamente substituídos quando as condições forem atingidas
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS :Renovar veículos a {STRING} da vida útil
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS :Renovar a {STRING} da vida útil
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Idade relativa para quando um veículo deva ser renovado
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS_HELPTEXT :Idade relativa para quando um veículo deva ser renovado
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} m{P 0 ês eses} antes
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_BEFORE :{COMMA} m{P 0 ês eses} antes
|
||||||
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} m{P 0 ês eses} depois
|
STR_CONFIG_SETTING_AUTORENEW_MONTHS_VALUE_AFTER :{COMMA} m{P 0 ês eses} depois
|
||||||
@@ -1291,10 +1264,10 @@ STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :Grossura da lin
|
|||||||
STR_CONFIG_SETTING_LAND_GENERATOR :Gerador de Terreno: {STRING}
|
STR_CONFIG_SETTING_LAND_GENERATOR :Gerador de Terreno: {STRING}
|
||||||
STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original
|
STR_CONFIG_SETTING_LAND_GENERATOR_ORIGINAL :Original
|
||||||
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
|
STR_CONFIG_SETTING_LAND_GENERATOR_TERRA_GENESIS :TerraGenesis
|
||||||
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Dist máx da borda para Refinarias de Óleo: {STRING}
|
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE :Dist. máx. da borda para Refinarias de Óleo: {STRING}
|
||||||
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Refinarias são construídas apenas nas bordas, ou no litoral, para ilhas
|
STR_CONFIG_SETTING_OIL_REF_EDGE_DISTANCE_HELPTEXT :Refinarias são construídas apenas nas bordas, ou no litoral, para ilhas
|
||||||
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altitude da linha de neve: {STRING}
|
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :Altitude da linha de neve: {STRING}
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Irregularidade do terreno: {STRING}
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :Irregularidade do terreno (TerraGenesis apenas) : {STRING}
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Muito Regular
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Muito Regular
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Regular
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :Regular
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Irregular
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_ROUGH :Irregular
|
||||||
@@ -1312,7 +1285,7 @@ STR_CONFIG_SETTING_ENABLE_FREEFORM_EDGES_HELPTEXT :Se desativado,
|
|||||||
STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}Há construções na borda norte do mapa
|
STR_CONFIG_SETTING_EDGES_NOT_EMPTY :{WHITE}Há construções na borda norte do mapa
|
||||||
STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Há bordas acima da nível do mar
|
STR_CONFIG_SETTING_EDGES_NOT_WATER :{WHITE}Há bordas acima da nível do mar
|
||||||
|
|
||||||
STR_CONFIG_SETTING_STATION_SPREAD :Tam máx de estações compostas {STRING}
|
STR_CONFIG_SETTING_STATION_SPREAD :Tam. máx. de estações compostas {STRING}
|
||||||
STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Área máxima que uma só estação pode ocupar com partes de estação. Valores altos tornam o jogo lento
|
STR_CONFIG_SETTING_STATION_SPREAD_HELPTEXT :Área máxima que uma só estação pode ocupar com partes de estação. Valores altos tornam o jogo lento
|
||||||
STR_CONFIG_SETTING_SERVICEATHELIPAD :Manutenção automática de helicópteros em heliportos: {STRING}
|
STR_CONFIG_SETTING_SERVICEATHELIPAD :Manutenção automática de helicópteros em heliportos: {STRING}
|
||||||
STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Faz manutenção de helicópteros a cada pouso, mesmo que não haja depósito no local de pouso
|
STR_CONFIG_SETTING_SERVICEATHELIPAD_HELPTEXT :Faz manutenção de helicópteros a cada pouso, mesmo que não haja depósito no local de pouso
|
||||||
@@ -1329,7 +1302,7 @@ STR_CONFIG_SETTING_SMOOTH_SCROLLING :Suavizar rolame
|
|||||||
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a janela principal rola para uma posição específica quando clicado no minimapa ou após localizar um objeto. Ativado torna o rolamento suave. Desativado torna o rolamento instanâneo
|
STR_CONFIG_SETTING_SMOOTH_SCROLLING_HELPTEXT :Controla como a janela principal rola para uma posição específica quando clicado no minimapa ou após localizar um objeto. Ativado torna o rolamento suave. Desativado torna o rolamento instanâneo
|
||||||
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Exibe distâncias quando usar ferramentas de construção: {STRING}
|
STR_CONFIG_SETTING_MEASURE_TOOLTIP :Exibe distâncias quando usar ferramentas de construção: {STRING}
|
||||||
STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Exibe distâncias e diferenças de altitude quando clicando e arrastando enquanto constrói
|
STR_CONFIG_SETTING_MEASURE_TOOLTIP_HELPTEXT :Exibe distâncias e diferenças de altitude quando clicando e arrastando enquanto constrói
|
||||||
STR_CONFIG_SETTING_LIVERIES :Exibir cores avançadas: {STRING}
|
STR_CONFIG_SETTING_LIVERIES :Exibir cores das empresas: {STRING}
|
||||||
STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Contra o uso de cores de veículos dependentes do tipo (ao invés de cores específicas à companhia)
|
STR_CONFIG_SETTING_LIVERIES_HELPTEXT :Contra o uso de cores de veículos dependentes do tipo (ao invés de cores específicas à companhia)
|
||||||
STR_CONFIG_SETTING_LIVERIES_NONE :Nenhum
|
STR_CONFIG_SETTING_LIVERIES_NONE :Nenhum
|
||||||
STR_CONFIG_SETTING_LIVERIES_OWN :Minha empresa
|
STR_CONFIG_SETTING_LIVERIES_OWN :Minha empresa
|
||||||
@@ -1378,7 +1351,7 @@ STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :Nenhuma ação
|
|||||||
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Todas ações "não-construentes"
|
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_CONSTRUCTION :Todas ações "não-construentes"
|
||||||
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Todas ações exceto modificações de terreno
|
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_NON_LANDSCAPING :Todas ações exceto modificações de terreno
|
||||||
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Todas ações
|
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_ALL_ACTIONS :Todas ações
|
||||||
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Usar a lista agrupada de veículos: {STRING}
|
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS :Usar a lista avançada de veículos: {STRING}
|
||||||
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativa o uso da listagem avançada para agrupamento de veículos
|
STR_CONFIG_SETTING_ADVANCED_VEHICLE_LISTS_HELPTEXT :Ativa o uso da listagem avançada para agrupamento de veículos
|
||||||
STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING}
|
STR_CONFIG_SETTING_LOADING_INDICATORS :Usar indicadores de carga: {STRING}
|
||||||
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleciona se os indicadores de carga são exibidos sobre os veículos (des)carregando
|
STR_CONFIG_SETTING_LOADING_INDICATORS_HELPTEXT :Seleciona se os indicadores de carga são exibidos sobre os veículos (des)carregando
|
||||||
@@ -1393,7 +1366,7 @@ STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Tipo de trilho
|
|||||||
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível
|
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Primeiro disponível
|
||||||
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível
|
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Último disponível
|
||||||
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado
|
STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado
|
||||||
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Exibir vias reservadas para trilhos: {STRING}
|
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION :Exibir vias reservadas: {STRING}
|
||||||
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Escurece as vias reservadas para ajudar a lidar com problemas de trens não funcionando em blocos baseados em destinos
|
STR_CONFIG_SETTING_SHOW_TRACK_RESERVATION_HELPTEXT :Escurece as vias reservadas para ajudar a lidar com problemas de trens não funcionando em blocos baseados em destinos
|
||||||
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Manter a barra de construção aberta: {STRING}
|
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS :Manter a barra de construção aberta: {STRING}
|
||||||
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Mantém as ferramentas de construção para pontes, túneis, etc abertas após o uso
|
STR_CONFIG_SETTING_PERSISTENT_BUILDINGTOOLS_HELPTEXT :Mantém as ferramentas de construção para pontes, túneis, etc abertas após o uso
|
||||||
@@ -1419,13 +1392,13 @@ STR_CONFIG_SETTING_SOUND_AMBIENT_HELPTEXT :Tocar som ambie
|
|||||||
|
|
||||||
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Desativar construção de infraestrutura quando nenhum veículo adequado estiver disponível: {STRING}
|
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING :Desativar construção de infraestrutura quando nenhum veículo adequado estiver disponível: {STRING}
|
||||||
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Quando ativado, a infraestrutura só é disponível se há veículos disponíveis para usá-la, prevenindo gasto de tempo e dinheiro com infraestrutura inútil.
|
STR_CONFIG_SETTING_DISABLE_UNSUITABLE_BUILDING_HELPTEXT :Quando ativado, a infraestrutura só é disponível se há veículos disponíveis para usá-la, prevenindo gasto de tempo e dinheiro com infraestrutura inútil.
|
||||||
STR_CONFIG_SETTING_MAX_TRAINS :Número máx de trens por companhia: {STRING}
|
STR_CONFIG_SETTING_MAX_TRAINS :Máximo de trens por companhia: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Máx. de trens que uma companhia pode ter
|
STR_CONFIG_SETTING_MAX_TRAINS_HELPTEXT :Máx. de trens que uma companhia pode ter
|
||||||
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Número máx de automóveis por companhia: {STRING}
|
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES :Máximo de automóveis por companhia: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Quantidade máxima de automóveis que uma companhia pode ter
|
STR_CONFIG_SETTING_MAX_ROAD_VEHICLES_HELPTEXT :Quantidade máxima de automóveis que uma companhia pode ter
|
||||||
STR_CONFIG_SETTING_MAX_AIRCRAFT :Número máx de aeronaves por companhia: {STRING}
|
STR_CONFIG_SETTING_MAX_AIRCRAFT :Máximo de aeronaves por companhia: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Quantidade máxima de aeronaves que uma companhia pode ter
|
STR_CONFIG_SETTING_MAX_AIRCRAFT_HELPTEXT :Quantidade máxima de aeronaves que uma companhia pode ter
|
||||||
STR_CONFIG_SETTING_MAX_SHIPS :Número máx de embarcações por companhia: {STRING}
|
STR_CONFIG_SETTING_MAX_SHIPS :Máximo de embarcações por companhia: {STRING}
|
||||||
STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Quantidade máxima de embarcações que uma companhia pode ter
|
STR_CONFIG_SETTING_MAX_SHIPS_HELPTEXT :Quantidade máxima de embarcações que uma companhia pode ter
|
||||||
|
|
||||||
STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desativar trens para o computador: {STRING}
|
STR_CONFIG_SETTING_AI_BUILDS_TRAINS :Desativar trens para o computador: {STRING}
|
||||||
@@ -1543,12 +1516,12 @@ STR_CONFIG_SETTING_ALLOW_TOWN_ROADS_HELPTEXT :Permite cidades
|
|||||||
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir cidades construirem cruzamentos de nível: {STRING}
|
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS :Permitir cidades construirem cruzamentos de nível: {STRING}
|
||||||
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Se ativado, permite as cidades construírem ruas que atravessam ferrovias
|
STR_CONFIG_SETTING_ALLOW_TOWN_LEVEL_CROSSINGS_HELPTEXT :Se ativado, permite as cidades construírem ruas que atravessam ferrovias
|
||||||
STR_CONFIG_SETTING_NOISE_LEVEL :Permitir controle de ruído de aeronaves pelas cidades: {STRING}
|
STR_CONFIG_SETTING_NOISE_LEVEL :Permitir controle de ruído de aeronaves pelas cidades: {STRING}
|
||||||
STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Se desativado, podem haver 2 aeroportos por cidade. Se ativado, o número de aeroportos é limitado pelo controle de ruído da cidade, que depende da população, tamanho e distância do aeroporto
|
STR_CONFIG_SETTING_NOISE_LEVEL_HELPTEXT :Se desativado, podem haver 2 aeroportos por cidade. Se ativado, o número de aeroportos depende do controle de ruído da cidade, que depende da população, tamanho e distância do aeroporto
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING :Fundação de cidades no jogo: {STRING}
|
STR_CONFIG_SETTING_TOWN_FOUNDING :Fundação de cidades no jogo: {STRING}
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Se ativado, permite jogadores construírem novas cidades
|
STR_CONFIG_SETTING_TOWN_FOUNDING_HELPTEXT :Se ativado, permite jogadores construírem novas cidades
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Proibido
|
STR_CONFIG_SETTING_TOWN_FOUNDING_FORBIDDEN :Proibido
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido
|
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED :Permitido
|
||||||
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Permitido, layout de cidades customizável
|
STR_CONFIG_SETTING_TOWN_FOUNDING_ALLOWED_CUSTOM_LAYOUT :Aermitido, layout de cidades customizável
|
||||||
|
|
||||||
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Posicionamento de árvores: {STRING}
|
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT :Posicionamento de árvores: {STRING}
|
||||||
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controla o nascimento aleatório de árvores durante o jogo. Isso pode afetar indústrias que dependem do crescimento de árvores, como serrarias
|
STR_CONFIG_SETTING_EXTRA_TREE_PLACEMENT_HELPTEXT :Controla o nascimento aleatório de árvores durante o jogo. Isso pode afetar indústrias que dependem do crescimento de árvores, como serrarias
|
||||||
@@ -1608,7 +1581,7 @@ STR_CONFIG_SETTING_DISTRIBUTION_MAIL_HELPTEXT :"simétrico" si
|
|||||||
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para classe BLINDADOS de carga: {STRING}
|
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED :Modo de distribuição para classe BLINDADOS de carga: {STRING}
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe BLINDADO indica objetos de valor no clima temperado, diamantes no subtropical ou ouro no subártico. NewGRF's podem mudar isso. "simétrico" significa que aproximadamente a mesma quantidade de carga será enviada da estação A para a estação B assim como de B para A. "assimétrico" significa que quantidades de carga arbitrárias serão enviadas em ambas as direções. "manual" significa que não haverá distribuição automática. Para objetos de valor, sugere-se usar "assimétrico" ou "manual" para subártico, já que bancos não enviam ouro de volta a minas. Para temperado e subtropical você pode selecionar "simétrico", já que bancos trocam objetos de valor entre si.
|
STR_CONFIG_SETTING_DISTRIBUTION_ARMOURED_HELPTEXT :A classe BLINDADO indica objetos de valor no clima temperado, diamantes no subtropical ou ouro no subártico. NewGRF's podem mudar isso. "simétrico" significa que aproximadamente a mesma quantidade de carga será enviada da estação A para a estação B assim como de B para A. "assimétrico" significa que quantidades de carga arbitrárias serão enviadas em ambas as direções. "manual" significa que não haverá distribuição automática. Para objetos de valor, sugere-se usar "assimétrico" ou "manual" para subártico, já que bancos não enviam ouro de volta a minas. Para temperado e subtropical você pode selecionar "simétrico", já que bancos trocam objetos de valor entre si.
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribuição para outras classes de carga: {STRING}
|
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT :Modo de distribuição para outras classes de carga: {STRING}
|
||||||
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"assimétrico" significa que quantidades de carga arbitrárias serão enviadas em ambas as direções. "manual" significa que não haverá distribuição automática. Você provavelmente irá querer usar "assimétrico" ou "manual".
|
STR_CONFIG_SETTING_DISTRIBUTION_DEFAULT_HELPTEXT :"simétrico" significa que aproximadamente a mesma quantidade de carga será enviada da estação A para a estação B assim como de B para A. "assimétrico" significa que quantidades de carga arbitrárias serão enviadas em ambas as direções. "manual" significa que não haverá distribuição automática. Você provavelmente irá querer usar "assimétrico" ou "manual".
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisão da distribuição: {STRING}
|
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY :Precisão da distribuição: {STRING}
|
||||||
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Quanto mais alto você define esse valor, mais tempo de CPU será dado ao cálculo do gráfico. Se levar muito tempo, você poderá notar um pouco de lag. Se você definir um valor muito baixo, a distribuição será imprecisa, e você notará cargas deixando de serem enviadas aonde deveriam ir.
|
STR_CONFIG_SETTING_LINKGRAPH_ACCURACY_HELPTEXT :Quanto mais alto você define esse valor, mais tempo de CPU será dado ao cálculo do gráfico. Se levar muito tempo, você poderá notar um pouco de lag. Se você definir um valor muito baixo, a distribuição será imprecisa, e você notará cargas deixando de serem enviadas aonde deveriam ir.
|
||||||
STR_CONFIG_SETTING_DEMAND_DISTANCE :Efeito da distância na demanda: {STRING}
|
STR_CONFIG_SETTING_DEMAND_DISTANCE :Efeito da distância na demanda: {STRING}
|
||||||
@@ -1831,7 +1804,6 @@ STR_LIVERY_FREIGHT_TRAM :Bonde de Carga
|
|||||||
STR_FACE_CAPTION :{WHITE}Seleção de Rosto
|
STR_FACE_CAPTION :{WHITE}Seleção de Rosto
|
||||||
STR_FACE_CANCEL_TOOLTIP :{BLACK}Cancelar seleção da novo rosto
|
STR_FACE_CANCEL_TOOLTIP :{BLACK}Cancelar seleção da novo rosto
|
||||||
STR_FACE_OK_TOOLTIP :{BLACK}Aceitar seleção do novo rosto
|
STR_FACE_OK_TOOLTIP :{BLACK}Aceitar seleção do novo rosto
|
||||||
STR_MAPGEN_RANDOM :{BLACK}Randomizar
|
|
||||||
|
|
||||||
STR_FACE_MALE_BUTTON :{BLACK}Masculino
|
STR_FACE_MALE_BUTTON :{BLACK}Masculino
|
||||||
STR_FACE_MALE_TOOLTIP :{BLACK}Rostos masculinos
|
STR_FACE_MALE_TOOLTIP :{BLACK}Rostos masculinos
|
||||||
@@ -1952,13 +1924,13 @@ STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Proteja
|
|||||||
STR_NETWORK_START_SERVER_UNADVERTISED :Não
|
STR_NETWORK_START_SERVER_UNADVERTISED :Não
|
||||||
STR_NETWORK_START_SERVER_ADVERTISED :Sim
|
STR_NETWORK_START_SERVER_ADVERTISED :Sim
|
||||||
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} cliente{P "" s}
|
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} cliente{P "" s}
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Num máx de clientes:
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Máx de clientes:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Escolha o número máximo de clientes. Não é necessário estarem todos preenchidos
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Escolha o número máximo de clientes. Não é necessário estarem todos preenchidos
|
||||||
STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} empresa{P "" s}
|
STR_NETWORK_START_SERVER_COMPANIES_SELECT :{BLACK}{NUM} empresa{P "" s}
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Núm máx de empresas:
|
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES :{BLACK}Máximo de empresas:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limita o servidor para uma certa quantia de empresas
|
STR_NETWORK_START_SERVER_NUMBER_OF_COMPANIES_TOOLTIP :{BLACK}Limita o servidor para uma certa quantia de empresas
|
||||||
STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} espectador{P "" es}
|
STR_NETWORK_START_SERVER_SPECTATORS_SELECT :{BLACK}{NUM} espectador{P "" es}
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Núm máx de espectadores:
|
STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS :{BLACK}Máx de espectadores:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limita o servidor para um certa quantia de espectadores
|
STR_NETWORK_START_SERVER_NUMBER_OF_SPECTATORS_TOOLTIP :{BLACK}Limita o servidor para um certa quantia de espectadores
|
||||||
STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Idioma falado:
|
STR_NETWORK_START_SERVER_LANGUAGE_SPOKEN :{BLACK}Idioma falado:
|
||||||
STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Outros jogadores saberão o idioma utilizado no servidor.
|
STR_NETWORK_START_SERVER_LANGUAGE_TOOLTIP :{BLACK}Outros jogadores saberão o idioma utilizado no servidor.
|
||||||
@@ -2576,7 +2548,6 @@ STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF:
|
|||||||
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceita: {LTBLUE}
|
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Carga aceita: {LTBLUE}
|
||||||
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
|
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
|
||||||
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Velocidade limite do trilho: {LTBLUE}{VELOCITY}
|
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Velocidade limite do trilho: {LTBLUE}{VELOCITY}
|
||||||
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Limite de velocidade da rua: {LTBLUE}{VELOCITY}
|
|
||||||
|
|
||||||
# Description of land area of different tiles
|
# Description of land area of different tiles
|
||||||
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Rochas
|
STR_LAI_CLEAR_DESCRIPTION_ROCKS :Rochas
|
||||||
@@ -2692,7 +2663,6 @@ STR_SAVELOAD_SAVE_BUTTON :{BLACK}Salvar
|
|||||||
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salvar o jogo atual, usando o nome escolhido
|
STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Salvar o jogo atual, usando o nome escolhido
|
||||||
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Carregar
|
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Carregar
|
||||||
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carrega o jogo selecionado
|
STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Carrega o jogo selecionado
|
||||||
STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Carrega o mapa topográfico selecionado
|
|
||||||
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalhes do Jogo
|
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalhes do Jogo
|
||||||
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nenhuma informação disponível
|
STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Nenhuma informação disponível
|
||||||
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING}
|
||||||
@@ -2713,6 +2683,7 @@ STR_MAPGEN_SNOW_LINE_UP :{BLACK}Aumentar
|
|||||||
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Diminuir a linha da neve em um ponto
|
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Diminuir a linha da neve em um ponto
|
||||||
STR_MAPGEN_RANDOM_SEED :{BLACK}Semente:
|
STR_MAPGEN_RANDOM_SEED :{BLACK}Semente:
|
||||||
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Clique para digitar uma semente
|
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Clique para digitar uma semente
|
||||||
|
STR_MAPGEN_RANDOM :{BLACK}Randomizar
|
||||||
STR_MAPGEN_RANDOM_HELP :{BLACK}Muda a semente randômica da Geração de Terreno
|
STR_MAPGEN_RANDOM_HELP :{BLACK}Muda a semente randômica da Geração de Terreno
|
||||||
STR_MAPGEN_LAND_GENERATOR :{BLACK}Gerador de terra
|
STR_MAPGEN_LAND_GENERATOR :{BLACK}Gerador de terra
|
||||||
STR_MAPGEN_TREE_PLACER :{BLACK}Algorítimo de árvores
|
STR_MAPGEN_TREE_PLACER :{BLACK}Algorítimo de árvores
|
||||||
@@ -2819,8 +2790,6 @@ STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Arquivo co
|
|||||||
STR_NEWGRF_SETTINGS_DISABLED :{RED}Desativado
|
STR_NEWGRF_SETTINGS_DISABLED :{RED}Desativado
|
||||||
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatível com esta versão de OpenTTD
|
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Incompatível com esta versão de OpenTTD
|
||||||
|
|
||||||
# NewGRF save preset window
|
|
||||||
|
|
||||||
# NewGRF parameters window
|
# NewGRF parameters window
|
||||||
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Alterar parâmetros NewGRF
|
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Alterar parâmetros NewGRF
|
||||||
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Fechar
|
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Fechar
|
||||||
@@ -2908,7 +2877,6 @@ STR_NEWGRF_LIST_MISSING :{RED}Arquivos f
|
|||||||
STR_NEWGRF_BROKEN :{WHITE}'{0:STRING}' tem altas chances de causar desincronias e/ou travamentos
|
STR_NEWGRF_BROKEN :{WHITE}'{0:STRING}' tem altas chances de causar desincronias e/ou travamentos
|
||||||
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Alterou o estado do vagão motorizado para '{1:ENGINE}' estando fora de um depósito
|
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Alterou o estado do vagão motorizado para '{1:ENGINE}' estando fora de um depósito
|
||||||
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Mudou o tamanho do veículo para '{1:ENGINE}' estando fora de um depósito
|
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Mudou o tamanho do veículo para '{1:ENGINE}' estando fora de um depósito
|
||||||
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}A capacidade do veículo mudou para '{1:ENGINE}' quando fora do depósito
|
|
||||||
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Trem '{VEHICLE}' de '{COMPANY}' tem um tamanho inválido. Provavelmente causado por um NewGRF. O jogo pode travar ou sair de sincronia
|
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Trem '{VEHICLE}' de '{COMPANY}' tem um tamanho inválido. Provavelmente causado por um NewGRF. O jogo pode travar ou sair de sincronia
|
||||||
|
|
||||||
STR_NEWGRF_BUGGY :{WHITE}O NewGRF '{0:STRING}' retorna informação incorreta
|
STR_NEWGRF_BUGGY :{WHITE}O NewGRF '{0:STRING}' retorna informação incorreta
|
||||||
@@ -3716,8 +3684,8 @@ STR_ORDER_TOOLTIP_UNLOAD :{BLACK}Altera a
|
|||||||
|
|
||||||
STR_ORDER_REFIT :{BLACK}Adaptar
|
STR_ORDER_REFIT :{BLACK}Adaptar
|
||||||
STR_ORDER_REFIT_TOOLTIP :{BLACK}Selecionar a adaptação na ordem atual. CTRL + Clique para remover a instrução
|
STR_ORDER_REFIT_TOOLTIP :{BLACK}Selecionar a adaptação na ordem atual. CTRL + Clique para remover a instrução
|
||||||
STR_ORDER_REFIT_AUTO :{BLACK}Reformar na estação
|
STR_ORDER_REFIT_AUTO :{BLACK}Auto-reforma
|
||||||
STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de carga para o qual reformar nessa ordem. Ctrl+clique para remover a ordem de reforma. Reforma apenas será feita se o veículo permitir
|
STR_ORDER_REFIT_AUTO_TOOLTIP :{BLACK}Selecione o tipo de carga para o qual auto-reformar nessa ordem. Ctrl+clique para remover a ordem de reforma. Auto-reformar apenas será feito se o veículo permitir
|
||||||
STR_ORDER_DROP_REFIT_AUTO :Carga fixa
|
STR_ORDER_DROP_REFIT_AUTO :Carga fixa
|
||||||
STR_ORDER_DROP_REFIT_AUTO_ANY :Cargas disponíveis
|
STR_ORDER_DROP_REFIT_AUTO_ANY :Cargas disponíveis
|
||||||
|
|
||||||
@@ -3808,18 +3776,18 @@ STR_ORDER_NO_UNLOAD_FULL_LOAD :(Não descarreg
|
|||||||
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Não descarregar e esperar por qualquer carregamento completo)
|
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Não descarregar e esperar por qualquer carregamento completo)
|
||||||
STR_ORDER_NO_UNLOAD_NO_LOAD :(Não descarregar e não carregar)
|
STR_ORDER_NO_UNLOAD_NO_LOAD :(Não descarregar e não carregar)
|
||||||
|
|
||||||
STR_ORDER_AUTO_REFIT :(Reformar para {STRING})
|
STR_ORDER_AUTO_REFIT :(Auto-reformar para {STRING})
|
||||||
STR_ORDER_FULL_LOAD_REFIT :(Carga completa com reforma para {STRING})
|
STR_ORDER_FULL_LOAD_REFIT :(Carga completa com auto-reforma para {STRING})
|
||||||
STR_ORDER_FULL_LOAD_ANY_REFIT :(Qualquer carga completa com reforma para {STRING})
|
STR_ORDER_FULL_LOAD_ANY_REFIT :(Qualquer carga completa com auto-reforma para {STRING})
|
||||||
STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com reforma para {STRING})
|
STR_ORDER_UNLOAD_REFIT :(Descarregar e carregar com auto-reforma para {STRING})
|
||||||
STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar carga completa com reforma para {STRING})
|
STR_ORDER_UNLOAD_FULL_LOAD_REFIT :(Descarregar e aguardar carga completa com auto-reforma para {STRING})
|
||||||
STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar qualquer carga completa com reforma para {STRING})
|
STR_ORDER_UNLOAD_FULL_LOAD_ANY_REFIT :(Descarregar e aguardar qualquer carga completa com auto-reforma para {STRING})
|
||||||
STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com reforma para {STRING})
|
STR_ORDER_TRANSFER_REFIT :(Transferir e carregar com auto-reforma para {STRING})
|
||||||
STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar carga completa com reforma para {STRING})
|
STR_ORDER_TRANSFER_FULL_LOAD_REFIT :(Transferir e aguardar carga completa com auto-reforma para {STRING})
|
||||||
STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carga completa com reforma para {STRING})
|
STR_ORDER_TRANSFER_FULL_LOAD_ANY_REFIT :(Transferir e aguardar por qualquer carga completa com auto-reforma para {STRING})
|
||||||
STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com reforma para {STRING})
|
STR_ORDER_NO_UNLOAD_REFIT :(Não descarregar e carregar com auto-reforma para {STRING})
|
||||||
STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar carga completa com reforma para {STRING})
|
STR_ORDER_NO_UNLOAD_FULL_LOAD_REFIT :(Não descarregar e aguardar carga completa com auto-reforma para {STRING})
|
||||||
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não descarregar e aguardar por qualquer carga completa com reforma para {STRING})
|
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY_REFIT :(Não carregar e aguardar por qualquer carga completa com auto-reforma para {STRING})
|
||||||
|
|
||||||
STR_ORDER_AUTO_REFIT_ANY :cargas disponíveis
|
STR_ORDER_AUTO_REFIT_ANY :cargas disponíveis
|
||||||
|
|
||||||
@@ -3845,7 +3813,7 @@ STR_TIMETABLE_TOOLTIP :{BLACK}Horário
|
|||||||
STR_TIMETABLE_NO_TRAVEL :Não viajar
|
STR_TIMETABLE_NO_TRAVEL :Não viajar
|
||||||
STR_TIMETABLE_NOT_TIMETABLEABLE :Viagem (automático; calendarizada pela próxima ordem manual)
|
STR_TIMETABLE_NOT_TIMETABLEABLE :Viagem (automático; calendarizada pela próxima ordem manual)
|
||||||
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Viajar (não calendarizado)
|
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Viajar (não calendarizado)
|
||||||
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Viagem a no máximo {2:VELOCITY} (sem plano de horário)
|
STR_TIMETABLE_TRAVEL_NOT_TIMETABLED_SPEED :Viaje em até {2:VELOCITY} (sem plano de horário)
|
||||||
STR_TIMETABLE_TRAVEL_FOR :Viajar para {STRING}
|
STR_TIMETABLE_TRAVEL_FOR :Viajar para {STRING}
|
||||||
STR_TIMETABLE_TRAVEL_FOR_SPEED :Viaje por {STRING} em até {VELOCITY}
|
STR_TIMETABLE_TRAVEL_FOR_SPEED :Viaje por {STRING} em até {VELOCITY}
|
||||||
STR_TIMETABLE_STAY_FOR :e ficar durante {STRING}
|
STR_TIMETABLE_STAY_FOR :e ficar durante {STRING}
|
||||||
|
@@ -201,28 +201,21 @@ STR_UNITS_POWER_IMPERIAL :{COMMA} к.с.
|
|||||||
STR_UNITS_POWER_METRIC :{COMMA} к.с.
|
STR_UNITS_POWER_METRIC :{COMMA} к.с.
|
||||||
STR_UNITS_POWER_SI :{COMMA} kW
|
STR_UNITS_POWER_SI :{COMMA} kW
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_SHORT_IMPERIAL :{COMMA}т
|
|
||||||
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} т.
|
STR_UNITS_WEIGHT_SHORT_METRIC :{COMMA} т.
|
||||||
STR_UNITS_WEIGHT_SHORT_SI :{COMMA} кг.
|
STR_UNITS_WEIGHT_SHORT_SI :{COMMA} кг.
|
||||||
|
|
||||||
STR_UNITS_WEIGHT_LONG_IMPERIAL :{COMMA} тон{P "" а}
|
|
||||||
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} тон{P "" а}
|
STR_UNITS_WEIGHT_LONG_METRIC :{COMMA} тон{P "" а}
|
||||||
STR_UNITS_WEIGHT_LONG_SI :{COMMA} кг
|
STR_UNITS_WEIGHT_LONG_SI :{COMMA} кг
|
||||||
|
|
||||||
STR_UNITS_VOLUME_SHORT_IMPERIAL :{COMMA}гал
|
|
||||||
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA} л.
|
STR_UNITS_VOLUME_SHORT_METRIC :{COMMA} л.
|
||||||
STR_UNITS_VOLUME_SHORT_SI :{COMMA} м³
|
STR_UNITS_VOLUME_SHORT_SI :{COMMA} м³
|
||||||
|
|
||||||
STR_UNITS_VOLUME_LONG_IMPERIAL :{COMMA} галон{P "" и}
|
|
||||||
STR_UNITS_VOLUME_LONG_METRIC :{COMMA} лит{P ър ри}
|
STR_UNITS_VOLUME_LONG_METRIC :{COMMA} лит{P ър ри}
|
||||||
STR_UNITS_VOLUME_LONG_SI :{COMMA} куб. м.
|
STR_UNITS_VOLUME_LONG_SI :{COMMA} куб. м.
|
||||||
|
|
||||||
STR_UNITS_FORCE_IMPERIAL :{COMMA} lbf
|
|
||||||
STR_UNITS_FORCE_METRIC :{COMMA} kgf
|
|
||||||
STR_UNITS_FORCE_SI :{COMMA} kN
|
STR_UNITS_FORCE_SI :{COMMA} kN
|
||||||
|
|
||||||
STR_UNITS_HEIGHT_IMPERIAL :{COMMA} фут
|
STR_UNITS_HEIGHT_IMPERIAL :{COMMA} фут
|
||||||
STR_UNITS_HEIGHT_METRIC :{COMMA} м
|
|
||||||
STR_UNITS_HEIGHT_SI :{COMMA} м
|
STR_UNITS_HEIGHT_SI :{COMMA} м
|
||||||
|
|
||||||
# Common window strings
|
# Common window strings
|
||||||
@@ -241,16 +234,13 @@ STR_TOOLTIP_CLOSE_WINDOW :{BLACK}Затв
|
|||||||
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Заглавие на прозорец - преместване на прозореца с мишката
|
STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Заглавие на прозорец - преместване на прозореца с мишката
|
||||||
STR_TOOLTIP_SHADE :{BLACK}Прибиране на прозореца - показва само заглавната лента
|
STR_TOOLTIP_SHADE :{BLACK}Прибиране на прозореца - показва само заглавната лента
|
||||||
STR_TOOLTIP_DEBUG :{BLACK}Покажи debug информация за новите графики (NewGRF)
|
STR_TOOLTIP_DEBUG :{BLACK}Покажи debug информация за новите графики (NewGRF)
|
||||||
STR_TOOLTIP_STICKY :{BLACK}Маркиране прозореца като незатворяем от клавиша 'Затваряне всички прозороци'
|
STR_TOOLTIP_STICKY :{BLACK}Маркиране прозореца за незатваряне от клавиша 'Затваряне всички прозороци'
|
||||||
STR_TOOLTIP_RESIZE :{BLACK}Преместете за оразмеряване прозореца
|
STR_TOOLTIP_RESIZE :{BLACK}Преместете за оразмеряване прозореца
|
||||||
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Активирай голям/малък размер на прозореца
|
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Активирай голям/малък размер на прозореца
|
||||||
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Лента за позициониране - превърта списъка нагоре/надолу
|
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Лента за позициониране - превърта списъка нагоре/надолу
|
||||||
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Превъртаща ивица - превърта списъка на ляво/дясно
|
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Превъртаща ивица - превърта списъка на ляво/дясно
|
||||||
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Разруши постройки и др. върху квадрат от картата. Ctrl маркира по диагонал. Shift показва евентуалната цена на разрушението.
|
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Разруши постройки и др. върху квадрат от картата. Ctrl маркира по диагонал. Shift показва евентуалната цена на разрушението.
|
||||||
|
|
||||||
# Show engines button
|
|
||||||
|
|
||||||
|
|
||||||
# Query window
|
# Query window
|
||||||
STR_BUTTON_DEFAULT :{BLACK}По подразбиране
|
STR_BUTTON_DEFAULT :{BLACK}По подразбиране
|
||||||
STR_BUTTON_CANCEL :{BLACK}Отказ
|
STR_BUTTON_CANCEL :{BLACK}Отказ
|
||||||
@@ -288,8 +278,6 @@ STR_SORT_BY_LENGTH :Дължина
|
|||||||
STR_SORT_BY_LIFE_TIME :Оставащо време за експлоатация
|
STR_SORT_BY_LIFE_TIME :Оставащо време за експлоатация
|
||||||
STR_SORT_BY_TIMETABLE_DELAY :Закъснение
|
STR_SORT_BY_TIMETABLE_DELAY :Закъснение
|
||||||
STR_SORT_BY_FACILITY :Вид на гарата
|
STR_SORT_BY_FACILITY :Вид на гарата
|
||||||
STR_SORT_BY_WAITING_TOTAL :Целия чакащ товар
|
|
||||||
STR_SORT_BY_WAITING_AVAILABLE :Наличен чакащ товар
|
|
||||||
STR_SORT_BY_RATING_MAX :Най-голяма оценка на товари
|
STR_SORT_BY_RATING_MAX :Най-голяма оценка на товари
|
||||||
STR_SORT_BY_RATING_MIN :Най-ниска оценка на товари
|
STR_SORT_BY_RATING_MIN :Най-ниска оценка на товари
|
||||||
STR_SORT_BY_ENGINE_ID :Двигател № (класическо сортиране)
|
STR_SORT_BY_ENGINE_ID :Двигател № (класическо сортиране)
|
||||||
@@ -302,7 +290,6 @@ STR_SORT_BY_POWER_VS_RUNNING_COST :Мощност/
|
|||||||
STR_SORT_BY_CARGO_CAPACITY :Товарен капацитет
|
STR_SORT_BY_CARGO_CAPACITY :Товарен капацитет
|
||||||
STR_SORT_BY_RANGE :Обхват
|
STR_SORT_BY_RANGE :Обхват
|
||||||
STR_SORT_BY_POPULATION :Население
|
STR_SORT_BY_POPULATION :Население
|
||||||
STR_SORT_BY_RATING :Рейтинг
|
|
||||||
|
|
||||||
# Tooltips for the main toolbar
|
# Tooltips for the main toolbar
|
||||||
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Пауза
|
STR_TOOLBAR_TOOLTIP_PAUSE_GAME :{BLACK}Пауза
|
||||||
@@ -315,7 +302,6 @@ STR_TOOLBAR_TOOLTIP_DISPLAY_SUBSIDIES :{BLACK}Пока
|
|||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Списък със станциите на компанията
|
STR_TOOLBAR_TOOLTIP_DISPLAY_LIST_OF_COMPANY_STATIONS :{BLACK}Списък със станциите на компанията
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Показване на финансова информация за компанията
|
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_FINANCES :{BLACK}Показване на финансова информация за компанията
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Покажи обща информация за компанията
|
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_GENERAL :{BLACK}Покажи обща информация за компанията
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_GOALS_LIST :{BLACK}Покази списък с целите
|
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Покажи графиките
|
STR_TOOLBAR_TOOLTIP_DISPLAY_GRAPHS :{BLACK}Покажи графиките
|
||||||
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Покажи класирането на компаниите
|
STR_TOOLBAR_TOOLTIP_DISPLAY_COMPANY_LEAGUE :{BLACK}Покажи класирането на компаниите
|
||||||
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Инвестирай в нова индустрия
|
STR_TOOLBAR_TOOLTIP_FUND_CONSTRUCTION_OF_NEW :{BLACK}Инвестирай в нова индустрия
|
||||||
@@ -471,7 +457,7 @@ STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Превклю
|
|||||||
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Превключва оцветяване на замърсените блокове
|
STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Превключва оцветяване на замърсените блокове
|
||||||
############ range ends here
|
############ range ends here
|
||||||
|
|
||||||
############ range for ordinal numbers used for the place in the highscore window
|
############ range for days starts (also used for the place in the highscore window)
|
||||||
STR_ORDINAL_NUMBER_1ST :1-ви
|
STR_ORDINAL_NUMBER_1ST :1-ви
|
||||||
STR_ORDINAL_NUMBER_2ND :2-ри
|
STR_ORDINAL_NUMBER_2ND :2-ри
|
||||||
STR_ORDINAL_NUMBER_3RD :3-ти
|
STR_ORDINAL_NUMBER_3RD :3-ти
|
||||||
@@ -487,40 +473,22 @@ STR_ORDINAL_NUMBER_12TH :12-ти
|
|||||||
STR_ORDINAL_NUMBER_13TH :13-ти
|
STR_ORDINAL_NUMBER_13TH :13-ти
|
||||||
STR_ORDINAL_NUMBER_14TH :14-ти
|
STR_ORDINAL_NUMBER_14TH :14-ти
|
||||||
STR_ORDINAL_NUMBER_15TH :15-ти
|
STR_ORDINAL_NUMBER_15TH :15-ти
|
||||||
############ range for ordinal numbers ends
|
STR_ORDINAL_NUMBER_16TH :16-ти
|
||||||
|
STR_ORDINAL_NUMBER_17TH :17-ти
|
||||||
############ range for days starts
|
STR_ORDINAL_NUMBER_18TH :18-ти
|
||||||
STR_DAY_NUMBER_1ST :1-ви
|
STR_ORDINAL_NUMBER_19TH :19-ти
|
||||||
STR_DAY_NUMBER_2ND :2-ри
|
STR_ORDINAL_NUMBER_20TH :20-ти
|
||||||
STR_DAY_NUMBER_3RD :3-ти
|
STR_ORDINAL_NUMBER_21ST :21-ви
|
||||||
STR_DAY_NUMBER_4TH :4-ти
|
STR_ORDINAL_NUMBER_22ND :22-ри
|
||||||
STR_DAY_NUMBER_5TH :5-и
|
STR_ORDINAL_NUMBER_23RD :23-ти
|
||||||
STR_DAY_NUMBER_6TH :6-и
|
STR_ORDINAL_NUMBER_24TH :24-ти
|
||||||
STR_DAY_NUMBER_7TH :7-и
|
STR_ORDINAL_NUMBER_25TH :25-ти
|
||||||
STR_DAY_NUMBER_8TH :8-и
|
STR_ORDINAL_NUMBER_26TH :26-ти
|
||||||
STR_DAY_NUMBER_9TH :9-ти
|
STR_ORDINAL_NUMBER_27TH :27-ми
|
||||||
STR_DAY_NUMBER_10TH :10-ти
|
STR_ORDINAL_NUMBER_28TH :28-и
|
||||||
STR_DAY_NUMBER_11TH :11-ти
|
STR_ORDINAL_NUMBER_29TH :29-и
|
||||||
STR_DAY_NUMBER_12TH :12-ти
|
STR_ORDINAL_NUMBER_30TH :30-ти
|
||||||
STR_DAY_NUMBER_13TH :13-ти
|
STR_ORDINAL_NUMBER_31ST :31-ви
|
||||||
STR_DAY_NUMBER_14TH :14-ти
|
|
||||||
STR_DAY_NUMBER_15TH :15-ти
|
|
||||||
STR_DAY_NUMBER_16TH :16-ти
|
|
||||||
STR_DAY_NUMBER_17TH :17-ти
|
|
||||||
STR_DAY_NUMBER_18TH :18-ти
|
|
||||||
STR_DAY_NUMBER_19TH :19-ти
|
|
||||||
STR_DAY_NUMBER_20TH :20-ти
|
|
||||||
STR_DAY_NUMBER_21ST :21-ви
|
|
||||||
STR_DAY_NUMBER_22ND :22-ри
|
|
||||||
STR_DAY_NUMBER_23RD :23-ти
|
|
||||||
STR_DAY_NUMBER_24TH :24-ти
|
|
||||||
STR_DAY_NUMBER_25TH :25-ти
|
|
||||||
STR_DAY_NUMBER_26TH :26-ти
|
|
||||||
STR_DAY_NUMBER_27TH :27-ми
|
|
||||||
STR_DAY_NUMBER_28TH :28-и
|
|
||||||
STR_DAY_NUMBER_29TH :29-и
|
|
||||||
STR_DAY_NUMBER_30TH :30-ти
|
|
||||||
STR_DAY_NUMBER_31ST :31-ви
|
|
||||||
############ range for days ends
|
############ range for days ends
|
||||||
|
|
||||||
############ range for months starts
|
############ range for months starts
|
||||||
@@ -823,11 +791,13 @@ STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE
|
|||||||
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} чака в депото
|
STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} чака в депото
|
||||||
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} чака в хангара
|
STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} чака в хангара
|
||||||
|
|
||||||
# Order review system / warnings
|
# Start of order review system
|
||||||
|
# DON'T ADD OR REMOVE LINES HERE
|
||||||
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} има прекалено малко задачи
|
STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}{VEHICLE} има прекалено малко задачи
|
||||||
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} има празна задача
|
STR_NEWS_VEHICLE_HAS_VOID_ORDER :{WHITE}{VEHICLE} има празна задача
|
||||||
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} има дублирани задачи
|
STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}{VEHICLE} има дублирани задачи
|
||||||
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} има невалидна спирка в задачите
|
STR_NEWS_VEHICLE_HAS_INVALID_ENTRY :{WHITE}{VEHICLE} има невалидна спирка в задачите
|
||||||
|
# end of order system
|
||||||
|
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} започва да остарява
|
STR_NEWS_VEHICLE_IS_GETTING_OLD :{WHITE}{VEHICLE} започва да остарява
|
||||||
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} е много остаряло
|
STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE} е много остаряло
|
||||||
@@ -906,8 +876,6 @@ STR_GAME_OPTIONS_CURRENCY_LTL :Литовск
|
|||||||
STR_GAME_OPTIONS_CURRENCY_KRW :Южнокорейски Вон (KRW)
|
STR_GAME_OPTIONS_CURRENCY_KRW :Южнокорейски Вон (KRW)
|
||||||
STR_GAME_OPTIONS_CURRENCY_ZAR :Южноафрикански Ранд (ZAR)
|
STR_GAME_OPTIONS_CURRENCY_ZAR :Южноафрикански Ранд (ZAR)
|
||||||
STR_GAME_OPTIONS_CURRENCY_CUSTOM :друга...
|
STR_GAME_OPTIONS_CURRENCY_CUSTOM :друга...
|
||||||
STR_GAME_OPTIONS_CURRENCY_GEL :Грузинско лари (ГЕЛ)
|
|
||||||
STR_GAME_OPTIONS_CURRENCY_IRR :Ирански Риал (ИРР)
|
|
||||||
############ end of currency region
|
############ end of currency region
|
||||||
|
|
||||||
|
|
||||||
@@ -949,13 +917,11 @@ STR_GAME_OPTIONS_TOWN_NAME_CATALAN :каталон
|
|||||||
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Автозаписване
|
STR_GAME_OPTIONS_AUTOSAVE_FRAME :{BLACK}Автозаписване
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Интервала между две автозаписваня
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Интервала между две автозаписваня
|
||||||
|
|
||||||
############ start of autosave dropdown
|
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :изключено
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :изключено
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :всеки месец
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_1_MONTH :всеки месец
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :всеки 3 месеца
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_3_MONTHS :всеки 3 месеца
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :всеки 6 месеца
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_6_MONTHS :всеки 6 месеца
|
||||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :всеки 12 месеца
|
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_12_MONTHS :всеки 12 месеца
|
||||||
############ end of autosave dropdown
|
|
||||||
|
|
||||||
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Език
|
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Език
|
||||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Избор на език
|
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Избор на език
|
||||||
@@ -984,7 +950,6 @@ STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Избе
|
|||||||
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} повреден файл{P "" s}
|
STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} повреден файл{P "" s}
|
||||||
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Допълнителна информация за пакетът базовата музика
|
STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Допълнителна информация за пакетът базовата музика
|
||||||
|
|
||||||
STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Неуспешно извличане на списък с поддържаните резолюции
|
|
||||||
STR_ERROR_FULLSCREEN_FAILED :{WHITE}Проблем при включване на режим "цял екран"
|
STR_ERROR_FULLSCREEN_FAILED :{WHITE}Проблем при включване на режим "цял екран"
|
||||||
|
|
||||||
# Custom currency window
|
# Custom currency window
|
||||||
@@ -1084,6 +1049,7 @@ STR_CONFIG_SETTING_TYPE_GAME_INGAME :Настрой
|
|||||||
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Настройки на компанията (запаметени в записа; влияят само на нови игри)
|
STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Настройки на компанията (запаметени в записа; влияят само на нови игри)
|
||||||
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Настройки на компанията (запаметени в записа; влияят само на текущата компания)
|
STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Настройки на компанията (запаметени в записа; влияят само на текущата компания)
|
||||||
|
|
||||||
|
STR_CONFIG_SETTING_RESTRICT_LABEL :{BLACK}Покажи:
|
||||||
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Ограничи долният списък да показва само променените настройки
|
STR_CONFIG_SETTING_RESTRICT_DROPDOWN_HELPTEXT :{BLACK}Ограничи долният списък да показва само променените настройки
|
||||||
STR_CONFIG_SETTING_RESTRICT_BASIC :Прости настройки
|
STR_CONFIG_SETTING_RESTRICT_BASIC :Прости настройки
|
||||||
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Разширени настройки
|
STR_CONFIG_SETTING_RESTRICT_ADVANCED :Разширени настройки
|
||||||
@@ -1098,7 +1064,6 @@ STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Игрови н
|
|||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Игрови настройки (съхраняват се в записаната игра; важат само за текущата игра)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Игрови настройки (съхраняват се в записаната игра; важат само за текущата игра)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Настройки за компанията (съхраняват се в записаната игра; важат само за нови игри)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Настройки за компанията (съхраняват се в записаната игра; важат само за нови игри)
|
||||||
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Настройки за компанията (съхраняват се в записаната игра; важат само за текущата компания)
|
STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Настройки за компанията (съхраняват се в записаната игра; важат само за текущата компания)
|
||||||
STR_CONFIG_SETTINGS_NONE :{WHITE}- Нищо -
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_OFF :изключено
|
STR_CONFIG_SETTING_OFF :изключено
|
||||||
STR_CONFIG_SETTING_ON :включено
|
STR_CONFIG_SETTING_ON :включено
|
||||||
@@ -1139,9 +1104,9 @@ STR_CONFIG_SETTING_SUBSIDY_MULTIPLIER_HELPTEXT :Задава к
|
|||||||
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Цени на конструкции: {STRING}
|
STR_CONFIG_SETTING_CONSTRUCTION_COSTS :Цени на конструкции: {STRING}
|
||||||
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Задава ниво то на конструиране и цени за закупуване
|
STR_CONFIG_SETTING_CONSTRUCTION_COSTS_HELPTEXT :Задава ниво то на конструиране и цени за закупуване
|
||||||
STR_CONFIG_SETTING_RECESSIONS :Рецесии: {STRING}
|
STR_CONFIG_SETTING_RECESSIONS :Рецесии: {STRING}
|
||||||
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Ако е разрешено, рецесии могат да се появяват на всеки няколко години. По време на рецесия цялото производство е значително намалено (връща се на предишно ниво след края на рецесията)
|
STR_CONFIG_SETTING_RECESSIONS_HELPTEXT :Ако е разрешено рецесии могат да се появяват на всеки няколко години. По време на рецесия цялото производство е значително намалено (връща се на предишно ниво след края на рецесията)
|
||||||
STR_CONFIG_SETTING_TRAIN_REVERSING :Забрани обръщане на посоката на влакове в гарите: {STRING}
|
STR_CONFIG_SETTING_TRAIN_REVERSING :Забрани обръщане на посоката на влакове в гарите: {STRING}
|
||||||
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Ако е избрано, влаковете няма да обръщат на не-терминални гари, ако има по-кратък път до целта им при обръщане.
|
STR_CONFIG_SETTING_TRAIN_REVERSING_HELPTEXT :Ако е избрано влаковете няма да обръщат на не-терминални гари, ако има по-кратък път до целта им при обръщане.
|
||||||
STR_CONFIG_SETTING_DISASTERS :Бедствия: {STRING}
|
STR_CONFIG_SETTING_DISASTERS :Бедствия: {STRING}
|
||||||
STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Включване/Изключване на бедствия които могат от време на време да блокират или разрушат превозни средства или инфраструктура
|
STR_CONFIG_SETTING_DISASTERS_HELPTEXT :Включване/Изключване на бедствия които могат от време на време да блокират или разрушат превозни средства или инфраструктура
|
||||||
STR_CONFIG_SETTING_CITY_APPROVAL :Отношението на градския съвет към реструктурирането на района: {STRING}
|
STR_CONFIG_SETTING_CITY_APPROVAL :Отношението на градския съвет към реструктурирането на района: {STRING}
|
||||||
@@ -1361,7 +1326,6 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ISO (2008-12-31
|
|||||||
|
|
||||||
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE :Палитра по подразбиране за NewGRF, които не са задали палитра: {STRING}
|
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE :Палитра по подразбиране за NewGRF, които не са задали палитра: {STRING}
|
||||||
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_HELPTEXT :Палитра по подразбиране за NewGRF, за които е зададена от коя се нуждаят
|
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_HELPTEXT :Палитра по подразбиране за NewGRF, за които е зададена от коя се нуждаят
|
||||||
STR_CONFIG_SETTING_NEWGRF_DEFAULT_PALETTE_WIN :Legacy (W) palette
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Игрите започват в пауза: {STRING}
|
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :Игрите започват в пауза: {STRING}
|
||||||
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Ако тази опция бъде активирана, играта автоматично ще бъде паузирана, когато започнете нова игра, това ще ви позволи да изучите по-подробно картата
|
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME_HELPTEXT :Ако тази опция бъде активирана, играта автоматично ще бъде паузирана, когато започнете нова игра, това ще ви позволи да изучите по-подробно картата
|
||||||
@@ -1398,7 +1362,7 @@ STR_CONFIG_SETTING_SOUND_TICKER_HELPTEXT :Звуков с
|
|||||||
STR_CONFIG_SETTING_SOUND_NEWS :Вестник: {STRING}
|
STR_CONFIG_SETTING_SOUND_NEWS :Вестник: {STRING}
|
||||||
STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Звуков сигнал при показването на новини
|
STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Звуков сигнал при показването на новини
|
||||||
STR_CONFIG_SETTING_SOUND_NEW_YEAR :Край на година: {STRING}
|
STR_CONFIG_SETTING_SOUND_NEW_YEAR :Край на година: {STRING}
|
||||||
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Звуков сигнал при проказване на баланса в края на годината сравнен с края на предишната година
|
STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Звуков сигнал при проказване на баланса в края на годината
|
||||||
STR_CONFIG_SETTING_SOUND_CONFIRM :Конструкция: {STRING}
|
STR_CONFIG_SETTING_SOUND_CONFIRM :Конструкция: {STRING}
|
||||||
STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Изпълнявай звуков ефект при успешно конструиране или други действия
|
STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Изпълнявай звуков ефект при успешно конструиране или други действия
|
||||||
STR_CONFIG_SETTING_SOUND_CLICK :Вутона натиска: {STRING}
|
STR_CONFIG_SETTING_SOUND_CLICK :Вутона натиска: {STRING}
|
||||||
@@ -1588,44 +1552,13 @@ STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD :Премахв
|
|||||||
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD_HELPTEXT :Премахва краищата на пътища при финансиране на ремонт на пътя
|
STR_CONFIG_SETTING_MODIFIED_ROAD_REBUILD_HELPTEXT :Премахва краищата на пътища при финансиране на ремонт на пътя
|
||||||
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY :Единици за скорост: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_HELPTEXT :Всеки път при показване на скорости, да бъдат изписвани в избраните мерни единици
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_IMPERIAL :Imperial (mph)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_METRIC :Metric (km/h)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VELOCITY_SI :SI (m/s)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER :Единици на мощност на превозното средство: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_HELPTEXT :Всеки път при показване на мощност, да бъде изписвана в избраните мерни единици
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_IMPERIAL :Imperial (hp)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_METRIC :Metric (hp)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_POWER_SI :SI (kW)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT :Единици за тежина: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_HELPTEXT :Всеки път при показване на тежести, да бъдат изписвани в избраните мерни единици
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_IMPERIAL :Imperial (short t/ton)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_METRIC :Metric (t/tonne)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_WEIGHT_SI :SI (kg)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME :Мерни единици на обем: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_HELPTEXT :Всеки път при показване на обеми, да се изписват в избраните мерни единици
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_IMPERIAL :Imperial (gal)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_METRIC :Metric (l)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_VOLUME_SI :SI (m³)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE :Мерни единици на теглителната сила: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_HELPTEXT :Всеки път при показване на теглителна сила, да бъде изписване в избраните мерни единици
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_IMPERIAL :Imperial (lbf)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_METRIC :Metric (kgf)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_FORCE_SI :SI (kN)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT :Височинна мерна единица: {STRING}
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_HELPTEXT :Всеки път при показване на височините, да се изписват в избраните мерни единици
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_IMPERIAL :Imperial (ft)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_METRIC :Metric (m)
|
|
||||||
STR_CONFIG_SETTING_LOCALISATION_UNITS_HEIGHT_SI :SI (m)
|
|
||||||
|
|
||||||
STR_CONFIG_SETTING_GUI :{ORANGE}Интерфейс
|
STR_CONFIG_SETTING_GUI :{ORANGE}Интерфейс
|
||||||
STR_CONFIG_SETTING_LOCALISATION :{ORANGE}Позициониране
|
|
||||||
STR_CONFIG_SETTING_CONSTRUCTION :{ORANGE}Строене
|
STR_CONFIG_SETTING_CONSTRUCTION :{ORANGE}Строене
|
||||||
STR_CONFIG_SETTING_VEHICLES :{ORANGE}Автомобили
|
STR_CONFIG_SETTING_VEHICLES :{ORANGE}Автомобили
|
||||||
STR_CONFIG_SETTING_STATIONS :{ORANGE}Станции
|
STR_CONFIG_SETTING_STATIONS :{ORANGE}Станции
|
||||||
@@ -1677,7 +1610,6 @@ STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}... save
|
|||||||
STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... пропуска набора от основната графика '{STRING}': не е открит
|
STR_CONFIG_ERROR_INVALID_BASE_GRAPHICS_NOT_FOUND :{WHITE}... пропуска набора от основната графика '{STRING}': не е открит
|
||||||
STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... пропуска набора от основни звуци '{STRING}': не е открит
|
STR_CONFIG_ERROR_INVALID_BASE_SOUNDS_NOT_FOUND :{WHITE}... пропуска набора от основни звуци '{STRING}': не е открит
|
||||||
STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... пропруска набора от основни песни '{STRING}': не е открит
|
STR_CONFIG_ERROR_INVALID_BASE_MUSIC_NOT_FOUND :{WHITE}... пропруска набора от основни песни '{STRING}': не е открит
|
||||||
STR_CONFIG_ERROR_OUT_OF_MEMORY :{WHITE}Отвъд паметта
|
|
||||||
|
|
||||||
# Intro window
|
# Intro window
|
||||||
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
|
STR_INTRO_CAPTION :{WHITE}OpenTTD {REV}
|
||||||
@@ -1799,7 +1731,6 @@ STR_LIVERY_FREIGHT_TRAM :Товарен
|
|||||||
STR_FACE_CAPTION :{WHITE}Избор на лице
|
STR_FACE_CAPTION :{WHITE}Избор на лице
|
||||||
STR_FACE_CANCEL_TOOLTIP :{BLACK}Прекъсване избора на ново лице
|
STR_FACE_CANCEL_TOOLTIP :{BLACK}Прекъсване избора на ново лице
|
||||||
STR_FACE_OK_TOOLTIP :{BLACK}Признавам избора на ново лице
|
STR_FACE_OK_TOOLTIP :{BLACK}Признавам избора на ново лице
|
||||||
STR_MAPGEN_RANDOM :{BLACK}Произволно
|
|
||||||
|
|
||||||
STR_FACE_MALE_BUTTON :{BLACK}Мъж
|
STR_FACE_MALE_BUTTON :{BLACK}Мъж
|
||||||
STR_FACE_MALE_TOOLTIP :{BLACK}Избери мъжки лица
|
STR_FACE_MALE_TOOLTIP :{BLACK}Избери мъжки лица
|
||||||
@@ -1855,10 +1786,6 @@ STR_FACE_TIE_EARRING_TOOLTIP :{BLACK}Cмен
|
|||||||
|
|
||||||
# Network server list
|
# Network server list
|
||||||
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Онлайн играчи
|
STR_NETWORK_SERVER_LIST_CAPTION :{WHITE}Онлайн играчи
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED :{BLACK}Рекламирана
|
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_TOOLTIP :{BLACK}Избери игра измежду рекламирана през интернет или нерекламирана през Локален интернет хост или ЛАН
|
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_NO :Не
|
|
||||||
STR_NETWORK_SERVER_LIST_ADVERTISED_YES :Да
|
|
||||||
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Име на играч:
|
STR_NETWORK_SERVER_LIST_PLAYER_NAME :{BLACK}Име на играч:
|
||||||
STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Чрез това име другите играчи ще ви идентифицират
|
STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP :{BLACK}Чрез това име другите играчи ще ви идентифицират
|
||||||
|
|
||||||
@@ -1917,7 +1844,6 @@ STR_NETWORK_START_SERVER_NEW_GAME_NAME_TOOLTIP :{BLACK}Имет
|
|||||||
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Поставяне на парола
|
STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Поставяне на парола
|
||||||
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Защитаване на вашата игра с парола за да не е публично достъпна
|
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Защитаване на вашата игра с парола за да не е публично достъпна
|
||||||
|
|
||||||
STR_NETWORK_START_SERVER_UNADVERTISED :Не
|
|
||||||
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} клиент{P "" s}
|
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} клиент{P "" s}
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Макс. брой играчи:
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Макс. брой играчи:
|
||||||
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Избор на максималния брой клиенти. Не всички слотове трябва да се попълнят
|
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Избор на максималния брой клиенти. Не всички слотове трябва да се попълнят
|
||||||
@@ -2038,7 +1964,6 @@ STR_NETWORK_CLIENT :Клиент
|
|||||||
STR_NETWORK_SPECTATORS :Наблюдатели
|
STR_NETWORK_SPECTATORS :Наблюдатели
|
||||||
|
|
||||||
STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Въведете количеството пари, което искате да дадете
|
STR_NETWORK_GIVE_MONEY_CAPTION :{WHITE}Въведете количеството пари, което искате да дадете
|
||||||
STR_NETWORK_TOOLBAR_LIST_SPECTATOR :{BLACK}Зрител
|
|
||||||
|
|
||||||
# Network set password
|
# Network set password
|
||||||
STR_COMPANY_PASSWORD_CANCEL :{BLACK}Незапазвай паролата
|
STR_COMPANY_PASSWORD_CANCEL :{BLACK}Незапазвай паролата
|
||||||
@@ -2230,14 +2155,8 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Вклу
|
|||||||
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Направи обектите невидими вместо прозрачни
|
STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Направи обектите невидими вместо прозрачни
|
||||||
|
|
||||||
# Linkgraph legend window
|
# Linkgraph legend window
|
||||||
STR_LINKGRAPH_LEGEND_ALL :{BLACK}Всички
|
|
||||||
STR_LINKGRAPH_LEGEND_NONE :{BLACK}Николко
|
|
||||||
STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Изберете компании, който да се показват
|
|
||||||
|
|
||||||
# Linkgraph legend window and linkgraph legend in smallmap
|
# Linkgraph legend window and linkgraph legend in smallmap
|
||||||
STR_LINKGRAPH_LEGEND_UNUSED :{TINY_FONT}{BLACK}неизползван
|
|
||||||
STR_LINKGRAPH_LEGEND_SATURATED :{TINY_FONT}{BLACK}наситен
|
|
||||||
STR_LINKGRAPH_LEGEND_OVERLOADED :{TINY_FONT}{BLACK}претоварен
|
|
||||||
|
|
||||||
# Base for station construction window(s)
|
# Base for station construction window(s)
|
||||||
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Маркиране на Отбелязаната зона
|
STR_STATION_BUILD_COVERAGE_AREA_TITLE :{BLACK}Маркиране на Отбелязаната зона
|
||||||
@@ -2676,6 +2595,7 @@ STR_MAPGEN_SNOW_LINE_UP :{BLACK}Прем
|
|||||||
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Преместване снежната линия надолу
|
STR_MAPGEN_SNOW_LINE_DOWN :{BLACK}Преместване снежната линия надолу
|
||||||
STR_MAPGEN_RANDOM_SEED :{BLACK}Случайност:
|
STR_MAPGEN_RANDOM_SEED :{BLACK}Случайност:
|
||||||
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Натиснете за въвеждане семе на случайност
|
STR_MAPGEN_RANDOM_SEED_HELP :{BLACK}Натиснете за въвеждане семе на случайност
|
||||||
|
STR_MAPGEN_RANDOM :{BLACK}Произволно
|
||||||
STR_MAPGEN_RANDOM_HELP :{BLACK}Промяна на случайността използване за генериране на терен
|
STR_MAPGEN_RANDOM_HELP :{BLACK}Промяна на случайността използване за генериране на терен
|
||||||
STR_MAPGEN_LAND_GENERATOR :{BLACK}Земегенератор:
|
STR_MAPGEN_LAND_GENERATOR :{BLACK}Земегенератор:
|
||||||
STR_MAPGEN_TREE_PLACER :{BLACK}Дърворазсад:
|
STR_MAPGEN_TREE_PLACER :{BLACK}Дърворазсад:
|
||||||
@@ -2782,8 +2702,6 @@ STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Не е н
|
|||||||
STR_NEWGRF_SETTINGS_DISABLED :{RED}Изключен
|
STR_NEWGRF_SETTINGS_DISABLED :{RED}Изключен
|
||||||
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{G=n}{RED}Несъвместимо с тази версия на OpenTTD
|
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{G=n}{RED}Несъвместимо с тази версия на OpenTTD
|
||||||
|
|
||||||
# NewGRF save preset window
|
|
||||||
|
|
||||||
# NewGRF parameters window
|
# NewGRF parameters window
|
||||||
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Промени параметрите на новите графики (NewGRF)
|
STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}Промени параметрите на новите графики (NewGRF)
|
||||||
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Затвори
|
STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Затвори
|
||||||
@@ -2886,7 +2804,6 @@ STR_NEWGRF_INVALID_ENGINE :<невалид
|
|||||||
STR_NEWGRF_INVALID_INDUSTRYTYPE :<невалдна индустрия>
|
STR_NEWGRF_INVALID_INDUSTRYTYPE :<невалдна индустрия>
|
||||||
|
|
||||||
# Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script).
|
# Placeholders for other invalid stuff, e.g. vehicles that have gone (Game Script).
|
||||||
STR_INVALID_VEHICLE :<невалидно превозно средство>
|
|
||||||
|
|
||||||
# NewGRF scanning window
|
# NewGRF scanning window
|
||||||
STR_NEWGRF_SCAN_CAPTION :{WHITE}Търси NewGRF-и
|
STR_NEWGRF_SCAN_CAPTION :{WHITE}Търси NewGRF-и
|
||||||
@@ -2969,13 +2886,9 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_EXCLUSIVE_TRANSPORT :{YELLOW}Пок
|
|||||||
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW} Подкупването на местната власт за да увеличи рейтинга носи огромен риск ако бъдете хванати.{} Цена: {CURRENCY_LONG}
|
STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW} Подкупването на местната власт за да увеличи рейтинга носи огромен риск ако бъдете хванати.{} Цена: {CURRENCY_LONG}
|
||||||
|
|
||||||
# Goal window
|
# Goal window
|
||||||
STR_GOALS_CAPTION :{WHITE}{COMPANY} Цели
|
|
||||||
STR_GOALS_SPECTATOR_CAPTION :{WHITE}Глобални цели
|
|
||||||
STR_GOALS_GLOBAL_TITLE :{BLACK}Основни цели:
|
STR_GOALS_GLOBAL_TITLE :{BLACK}Основни цели:
|
||||||
STR_GOALS_TEXT :{ORANGE}{STRING}
|
STR_GOALS_TEXT :{ORANGE}{STRING}
|
||||||
STR_GOALS_NONE :{ORANGE}- Никакви -
|
STR_GOALS_NONE :{ORANGE}- Никакви -
|
||||||
STR_GOALS_SPECTATOR_NONE :{ORANGE}- Неприложимо-
|
|
||||||
STR_GOALS_PROGRESS :{ORANGE}напредък{STRING}
|
|
||||||
STR_GOALS_COMPANY_TITLE :{BLACK}Цели на компанията:
|
STR_GOALS_COMPANY_TITLE :{BLACK}Цели на компанията:
|
||||||
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Кликни на задачата за да центрирате камерата на фабрика/град/плочка. Ctrl+Click отваря нов прозорец центриран на фабрика/град/плочка
|
STR_GOALS_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Кликни на задачата за да центрирате камерата на фабрика/град/плочка. Ctrl+Click отваря нов прозорец центриран на фабрика/град/плочка
|
||||||
|
|
||||||
@@ -2986,7 +2899,7 @@ STR_GOAL_QUESTION_CAPTION_WARNING :Внимани
|
|||||||
STR_GOAL_QUESTION_CAPTION_ERROR :Грешка
|
STR_GOAL_QUESTION_CAPTION_ERROR :Грешка
|
||||||
|
|
||||||
### Start of Goal Question button list
|
### Start of Goal Question button list
|
||||||
STR_GOAL_QUESTION_BUTTON_CANCEL :Откажи
|
STR_GOAL_QUESTION_BUTTON_CANCEL :Недобре
|
||||||
STR_GOAL_QUESTION_BUTTON_OK :Добре
|
STR_GOAL_QUESTION_BUTTON_OK :Добре
|
||||||
STR_GOAL_QUESTION_BUTTON_NO :Не
|
STR_GOAL_QUESTION_BUTTON_NO :Не
|
||||||
STR_GOAL_QUESTION_BUTTON_YES :Да
|
STR_GOAL_QUESTION_BUTTON_YES :Да
|
||||||
@@ -3015,9 +2928,6 @@ STR_SUBSIDIES_SUBSIDISED_FROM_TO :{ORANGE}{STRING
|
|||||||
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Натисни върху услугата за да се фокусира върху индустрията/града. Ctrl отваря нов изглед към индустрията/града
|
STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Натисни върху услугата за да се фокусира върху индустрията/града. Ctrl отваря нов изглед към индустрията/града
|
||||||
|
|
||||||
# Story book window
|
# Story book window
|
||||||
STR_STORY_BOOK_NEXT_PAGE :{BLACK}Следваща
|
|
||||||
STR_STORY_BOOK_NEXT_PAGE_TOOLTIP :{BLACK}Отиди на следващата страница
|
|
||||||
STR_STORY_BOOK_INVALID_GOAL_REF :{RED}Невалидна цел
|
|
||||||
|
|
||||||
# Station list window
|
# Station list window
|
||||||
STR_STATION_LIST_TOOLTIP :{BLACK}Имена на станции - натиснете върху името, за да фиксирате главния прозорец върху станцията
|
STR_STATION_LIST_TOOLTIP :{BLACK}Имена на станции - натиснете върху името, за да фиксирате главния прозорец върху станцията
|
||||||
@@ -3046,30 +2956,8 @@ STR_STATIOV_VIEW_EXCLUSIVE_RIGHTS_COMPANY :{YELLOW}{COMPAN
|
|||||||
|
|
||||||
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рейтинги
|
STR_STATION_VIEW_RATINGS_BUTTON :{BLACK}Рейтинги
|
||||||
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Покажи нивото на обслужване
|
STR_STATION_VIEW_RATINGS_TOOLTIP :{BLACK}Покажи нивото на обслужване
|
||||||
STR_STATION_VIEW_SUPPLY_RATINGS_TITLE :{BLACK}Месечни доставки и местен рейтинг:
|
|
||||||
|
|
||||||
STR_STATION_VIEW_GROUP :{BLACK}По група
|
|
||||||
STR_STATION_VIEW_WAITING_STATION :Станция: Изчакване
|
|
||||||
STR_STATION_VIEW_WAITING_AMOUNT :Сума: Изчакване
|
|
||||||
STR_STATION_VIEW_PLANNED_STATION :Станция: Планирано
|
|
||||||
STR_STATION_VIEW_PLANNED_AMOUNT :Количество: Планирано
|
|
||||||
STR_STATION_VIEW_FROM :{YELLOW}{CARGO_SHORT} от {STATION}
|
|
||||||
STR_STATION_VIEW_VIA :{YELLOW}{CARGO_SHORT} посредством {STATION}
|
|
||||||
STR_STATION_VIEW_TO :{YELLOW}{CARGO_SHORT} до {STATION}
|
|
||||||
STR_STATION_VIEW_FROM_ANY :{RED}{CARGO_SHORT} от неизвестна станция
|
|
||||||
STR_STATION_VIEW_TO_ANY :{RED}{CARGO_SHORT} за която и да е гара
|
|
||||||
STR_STATION_VIEW_VIA_ANY :{RED}{CARGO_SHORT} посредством която и да е гара
|
|
||||||
STR_STATION_VIEW_FROM_HERE :{GREEN}{CARGO_SHORT} от тази гара
|
|
||||||
STR_STATION_VIEW_VIA_HERE :{GREEN}{CARGO_SHORT} спиране на тази гара
|
|
||||||
STR_STATION_VIEW_TO_HERE :{GREEN}{CARGO_SHORT} до тази станция
|
|
||||||
STR_STATION_VIEW_NONSTOP :{YELLOW}{CARGO_SHORT} без прекъсване
|
|
||||||
|
|
||||||
STR_STATION_VIEW_GROUP_S_V_D :Източник-Чрез-Дестинация
|
|
||||||
STR_STATION_VIEW_GROUP_S_D_V :Източник-Дестинация-Посредством
|
|
||||||
STR_STATION_VIEW_GROUP_V_S_D :Посредством-Източник-Дестинация
|
|
||||||
STR_STATION_VIEW_GROUP_V_D_S :Посредством-Дестинация-Източник
|
|
||||||
STR_STATION_VIEW_GROUP_D_S_V :Дестинация-Източник-Посредством
|
|
||||||
STR_STATION_VIEW_GROUP_D_V_S :Посока-през-Източника
|
|
||||||
|
|
||||||
############ range for rating starts
|
############ range for rating starts
|
||||||
STR_CARGO_RATING_APPALLING :Плачевно
|
STR_CARGO_RATING_APPALLING :Плачевно
|
||||||
@@ -3212,7 +3100,6 @@ STR_INDUSTRY_VIEW_PRODUCTION_LAST_MONTH_TITLE :{BLACK}Прои
|
|||||||
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% превозено)
|
STR_INDUSTRY_VIEW_TRANSPORTED :{YELLOW}{CARGO_LONG}{STRING}{BLACK} ({COMMA}% превозено)
|
||||||
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Фокусиране на основният изглед върху индустрията. Ctrl+Click отваря прозорец на нов изглед върху индустрията.
|
STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Фокусиране на основният изглед върху индустрията. Ctrl+Click отваря прозорец на нов изглед върху индустрията.
|
||||||
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Ниво на производство: {YELLOW}{COMMA}%
|
STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Ниво на производство: {YELLOW}{COMMA}%
|
||||||
STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}Индустрията обяви незабавна ликвидация!
|
|
||||||
|
|
||||||
############ range for requires starts
|
############ range for requires starts
|
||||||
STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Нуждае се от: {YELLOW}{STRING}{STRING}
|
STR_INDUSTRY_VIEW_REQUIRES_CARGO :{BLACK}Нуждае се от: {YELLOW}{STRING}{STRING}
|
||||||
@@ -3929,8 +3816,6 @@ STR_AI_SETTINGS_START_DELAY :Броят дн
|
|||||||
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} readme of {STRING}
|
STR_TEXTFILE_README_CAPTION :{WHITE}{STRING} readme of {STRING}
|
||||||
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} Дневник на промените на {STRING}
|
STR_TEXTFILE_CHANGELOG_CAPTION :{WHITE}{STRING} Дневник на промените на {STRING}
|
||||||
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} лиценз на {STRING}
|
STR_TEXTFILE_LICENCE_CAPTION :{WHITE}{STRING} лиценз на {STRING}
|
||||||
STR_TEXTFILE_WRAP_TEXT :{WHITE}Реорганизирай текста
|
|
||||||
STR_TEXTFILE_WRAP_TEXT_TOOLTIP :{BLACK}Реорганизирай текста така, че изцяло да се помести в прозореца
|
|
||||||
STR_TEXTFILE_VIEW_README :{BLACK}Отвори readme
|
STR_TEXTFILE_VIEW_README :{BLACK}Отвори readme
|
||||||
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Дневник на промените
|
STR_TEXTFILE_VIEW_CHANGELOG :{BLACK}Дневник на промените
|
||||||
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Лиценз
|
STR_TEXTFILE_VIEW_LICENCE :{BLACK}Лиценз
|
||||||
@@ -4308,10 +4193,6 @@ STR_ERROR_CAN_T_CHANGE_SERVICING :{WHITE}Инте
|
|||||||
|
|
||||||
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... машината е унищожена
|
STR_ERROR_VEHICLE_IS_DESTROYED :{WHITE}... машината е унищожена
|
||||||
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL :{WHITE}Никакви превозни средства няма да бъдат налични
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_AT_ALL_EXPLANATION :{WHITE}Промени своята NewGRF конфигурация
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_YET :{WHITE}Няма налични превозни средства все още
|
|
||||||
STR_ERROR_NO_VEHICLES_AVAILABLE_YET_EXPLANATION :{WHITE}Започни нова игра след {DATE_SHORT} или използвай NewGRF , който показва ранни превозни средства
|
|
||||||
|
|
||||||
# Specific vehicle errors
|
# Specific vehicle errors
|
||||||
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Влака не може да пропусне сигнала при опасност...
|
STR_ERROR_CAN_T_MAKE_TRAIN_PASS_SIGNAL :{WHITE}Влака не може да пропусне сигнала при опасност...
|
||||||
@@ -4813,7 +4694,6 @@ STR_JUST_DATE_ISO :{DATE_ISO}
|
|||||||
STR_JUST_STRING :{STRING}
|
STR_JUST_STRING :{STRING}
|
||||||
STR_JUST_STRING_STRING :{STRING}{STRING}
|
STR_JUST_STRING_STRING :{STRING}{STRING}
|
||||||
STR_JUST_RAW_STRING :{STRING}
|
STR_JUST_RAW_STRING :{STRING}
|
||||||
STR_JUST_BIG_RAW_STRING :{BIG_FONT}{STRING}
|
|
||||||
|
|
||||||
# Slightly 'raw' stringcodes with colour or size
|
# Slightly 'raw' stringcodes with colour or size
|
||||||
STR_BLACK_COMMA :{BLACK}{COMMA}
|
STR_BLACK_COMMA :{BLACK}{COMMA}
|
||||||
|
1083
src/lang/catalan.txt
1083
src/lang/catalan.txt
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user