diff --git a/.gitignore b/.gitignore
index cb1e9d1599..5aa8cb7849 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@ bin/ai/*
bin/baseset/*
!bin/baseset/openttd.grf
!bin/baseset/opntitle.dat
+!bin/baseset/orig_extra.grf
!bin/baseset/orig_*.obg
!bin/baseset/orig_*.obs
!bin/baseset/no_sound.obs
@@ -33,6 +34,8 @@ projects/*.sdf
projects/*.opensdf
projects/*.vcproj.*.user
projects/*.vcxproj.user
+projects/*.VC.db
+projects/*.VC.opendb
src/rev.cpp
src/os/windows/ottdres.rc
diff --git a/Doxyfile b/Doxyfile
index 957ba60e19..58d7f0a89a 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -195,7 +195,7 @@ EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
-PREDEFINED = ENABLE_NETWORK WITH_ZLIB WITH_LZO WITH_LZMA WITH_SDL WITH_PNG WITH_FONTCONFIG WITH_FREETYPE WITH_ICU UNICODE _UNICODE _GNU_SOURCE FINAL=
+PREDEFINED = ENABLE_NETWORK WITH_ZLIB WITH_LZO WITH_LZMA WITH_SDL WITH_PNG WITH_FONTCONFIG WITH_FREETYPE WITH_ICU_SORT WITH_ICU_LAYOUT UNICODE _UNICODE _GNU_SOURCE FINAL=
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
#---------------------------------------------------------------------------
diff --git a/Makefile.bundle.in b/Makefile.bundle.in
index 63edb62d97..4366cf10a1 100644
--- a/Makefile.bundle.in
+++ b/Makefile.bundle.in
@@ -84,7 +84,7 @@ endif
$(Q)cp "$(BIN_DIR)/scripts/"* "$(BUNDLE_DIR)/scripts/"
ifdef MENU_DIR
$(Q)cp "$(ROOT_DIR)/media/openttd.desktop" "$(BUNDLE_DIR)/media/"
- $(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | $(SORT) | $(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.filter.awk" >> "$(BUNDLE_DIR)/media/openttd.desktop"
+ $(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | LC_ALL=C $(SORT) | $(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.filter.awk" >> "$(BUNDLE_DIR)/media/openttd.desktop"
$(Q)sed s/=openttd/=$(BINARY_NAME)/g "$(BUNDLE_DIR)/media/openttd.desktop" > "$(ROOT_DIR)/media/openttd.desktop.install"
endif
ifeq ($(TTD), openttd.exe)
@@ -172,6 +172,7 @@ install: bundle
$(Q)install -d "$(INSTALL_BINARY_DIR)"
$(Q)install -d "$(INSTALL_ICON_DIR)"
$(Q)install -d "$(INSTALL_DATA_DIR)/ai"
+ $(Q)install -d "$(INSTALL_DATA_DIR)/game"
$(Q)install -d "$(INSTALL_DATA_DIR)/baseset"
$(Q)install -d "$(INSTALL_DATA_DIR)/lang"
$(Q)install -d "$(INSTALL_DATA_DIR)/scripts"
@@ -182,6 +183,7 @@ else
endif
$(Q)install -m 644 "$(BUNDLE_DIR)/lang/"* "$(INSTALL_DATA_DIR)/lang"
$(Q)install -m 644 "$(BUNDLE_DIR)/ai/"* "$(INSTALL_DATA_DIR)/ai"
+ $(Q)install -m 644 "$(BUNDLE_DIR)/game/"* "$(INSTALL_DATA_DIR)/game"
$(Q)install -m 644 "$(BUNDLE_DIR)/baseset/"* "$(INSTALL_DATA_DIR)/baseset"
$(Q)install -m 644 "$(BUNDLE_DIR)/scripts/"* "$(INSTALL_DATA_DIR)/scripts"
ifndef DO_NOT_INSTALL_DOCS
diff --git a/Makefile.grf.in b/Makefile.grf.in
index c2d058d597..1625b9e4c0 100644
--- a/Makefile.grf.in
+++ b/Makefile.grf.in
@@ -5,16 +5,13 @@
# 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 .
#
-# Building requires GRFCodec and NFORenum. Older versions of GRFCodec are
-# known to miscompile the graphics.
+# Building requires GRFCodec.
#
-# Recent nightlies (including sources) of both can be found at:
+# Recent versions (including sources) can be found at:
# http://www.openttd.org/download-grfcodec
-# http://www.openttd.org/download-nforenum
#
-# The mercurial repository of both can be found at:
+# The mercurial repository can be found at:
# http://hg.openttdcoop.org/grfcodec
-# http://hg.openttdcoop.org/nforenum
#
@@ -47,22 +44,18 @@ PNG_FILES := $(GRF_DIR)/*.png $(GRF_DIR)/rivers/*.png
# Build the GRF.
ifdef GRFCODEC
-all: $(BIN_DIR)/openttd.grf $(BIN_DIR)/orig_dos.obg $(BIN_DIR)/orig_dos_de.obg $(BIN_DIR)/orig_win.obg $(BIN_DIR)/orig_dos.obs $(BIN_DIR)/orig_win.obs $(BIN_DIR)/no_sound.obs $(BIN_DIR)/orig_win.obm $(BIN_DIR)/no_music.obm
+all: $(BIN_DIR)/openttd.grf $(BIN_DIR)/orig_extra.grf $(BIN_DIR)/orig_dos.obg $(BIN_DIR)/orig_dos_de.obg $(BIN_DIR)/orig_win.obg $(BIN_DIR)/orig_dos.obs $(BIN_DIR)/orig_win.obs $(BIN_DIR)/no_sound.obs $(BIN_DIR)/orig_win.obm $(BIN_DIR)/no_music.obm
else
all:
endif
-# Make sure the sprites directory exists.
-$(OBJS_DIR)/sprites:
- $(Q)-mkdir "$@"
-
$(OBJS_DIR)/langfiles.tmp: $(LANG_DIR)/*.txt
$(E) '$(STAGE) Collecting baseset translations'
$(Q) cat $^ > $@
-$(BIN_DIR)/%.obg: $(BASESET_DIR)/%.obg $(BIN_DIR)/openttd.grf $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/translations.awk
+$(BIN_DIR)/%.obg: $(BASESET_DIR)/%.obg $(BIN_DIR)/orig_extra.grf $(OBJS_DIR)/langfiles.tmp $(BASESET_DIR)/translations.awk
$(E) '$(STAGE) Updating $(notdir $@)'
- $(Q) sed 's/^OPENTTD.GRF = *[0-9a-f]*$$/OPENTTD.GRF = '`$(MD5SUM) $(BIN_DIR)/openttd.grf | sed 's@ .*@@'`'/' $< > $@.tmp
+ $(Q) sed 's/^ORIG_EXTRA.GRF = *[0-9a-f]*$$/ORIG_EXTRA.GRF = '`$(MD5SUM) $(BIN_DIR)/orig_extra.grf | sed 's@ .*@@'`'/' $< > $@.tmp
$(Q) awk -v langfiles='$(OBJS_DIR)/langfiles.tmp' -f $(BASESET_DIR)/translations.awk $@.tmp >$@
$(Q) rm $@.tmp
@@ -75,8 +68,9 @@ $(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 $< >$@
# 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) $(GRF_DIR)/assemble_nfo.awk
$(E) '$(STAGE) Assembling openttd.nfo'
+ $(Q)-mkdir -p $(OBJS_DIR)/sprites
$(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) $(NFORENUM) -s $(OBJS_DIR)/sprites/openttd.nfo
@@ -84,6 +78,17 @@ $(BIN_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites $(GRF_DIR)
$(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/openttd.grf
$(Q)cp $(OBJS_DIR)/openttd.grf $(BIN_DIR)/openttd.grf
+# The copy operation of PNG_FILES is duplicated from the target 'openttd.grf', thus those targets may not run in parallel.
+$(BIN_DIR)/orig_extra.grf: $(PNG_FILES) $(NFO_FILES) $(GRF_DIR)/assemble_nfo.awk | $(BIN_DIR)/openttd.grf
+ $(E) '$(STAGE) Assembling orig_extra.nfo'
+ $(Q)-mkdir -p $(OBJS_DIR)/sprites
+ $(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null
+ $(Q) awk -f $(GRF_DIR)/assemble_nfo.awk $(GRF_DIR)/orig_extra.nfo > $(OBJS_DIR)/sprites/orig_extra.nfo
+ $(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/orig_extra.nfo
+ $(E) '$(STAGE) Compiling orig_extra.grf'
+ $(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/orig_extra.grf
+ $(Q)cp $(OBJS_DIR)/orig_extra.grf $(BIN_DIR)/orig_extra.grf
+
# Clean up temporary files.
clean:
$(Q)rm -f *.bak *.grf
diff --git a/Makefile.in b/Makefile.in
index 0d50fc1b1e..d33d8a0d2a 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -152,7 +152,7 @@ mrproper:
distclean: mrproper
maintainer-clean: distclean
- $(Q)rm -f $(BIN_DIR)/baseset/openttd.grf $(BIN_DIR)/baseset/*.obg $(BIN_DIR)/baseset/*.obs $(BIN_DIR)/baseset/*.obm
+ $(Q)rm -f $(BIN_DIR)/baseset/openttd.grf $(BIN_DIR)/baseset/orig_extra.grf $(BIN_DIR)/baseset/*.obg $(BIN_DIR)/baseset/*.obs $(BIN_DIR)/baseset/*.obm
depend:
@for dir in $(SRC_DIRS); do \
diff --git a/Makefile.src.in b/Makefile.src.in
index 1d654d283f..0e190a4e62 100644
--- a/Makefile.src.in
+++ b/Makefile.src.in
@@ -210,7 +210,7 @@ endif
{ \
print $$0 \
} \
- ' < Makefile.dep.tmp | sed 's@ *@ @g;s@ $$@@' | $(SORT) > Makefile.dep
+ ' < Makefile.dep.tmp | sed 's@ *@ @g;s@ $$@@' | LC_ALL=C $(SORT) > Makefile.dep
$(Q)rm -f Makefile.dep.tmp Makefile.dep.tmp.bak
diff --git a/bin/ai/compat_1.6.nut b/bin/ai/compat_1.6.nut
index fe985b90d0..8fb518e1b5 100644
--- a/bin/ai/compat_1.6.nut
+++ b/bin/ai/compat_1.6.nut
@@ -6,3 +6,5 @@
* 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 .
*/
+
+AILog.Info("1.6 API compatibility in effect.");
diff --git a/bin/ai/compat_1.7.nut b/bin/ai/compat_1.7.nut
new file mode 100644
index 0000000000..1290443c4d
--- /dev/null
+++ b/bin/ai/compat_1.7.nut
@@ -0,0 +1,10 @@
+/* $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 .
+ */
+
+GSLog.Info("1.7 API compatibility in effect.");
diff --git a/bin/ai/compat_1.8.nut b/bin/ai/compat_1.8.nut
new file mode 100644
index 0000000000..fe985b90d0
--- /dev/null
+++ b/bin/ai/compat_1.8.nut
@@ -0,0 +1,8 @@
+/* $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 .
+ */
diff --git a/bin/ai/regression/regression_info.nut b/bin/ai/regression/regression_info.nut
index 4e7aec7568..f908ae28ac 100644
--- a/bin/ai/regression/regression_info.nut
+++ b/bin/ai/regression/regression_info.nut
@@ -6,7 +6,7 @@ class Regression extends AIInfo {
function GetShortName() { return "REGR"; }
function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; }
function GetVersion() { return 1; }
- function GetAPIVersion() { return "1.6"; }
+ function GetAPIVersion() { return "1.8"; }
function GetDate() { return "2007-03-18"; }
function CreateInstance() { return "Regression"; }
}
diff --git a/bin/baseset/no_music.obm b/bin/baseset/no_music.obm
index f782d23ea0..7a70e3b55d 100644
--- a/bin/baseset/no_music.obm
+++ b/bin/baseset/no_music.obm
@@ -12,7 +12,7 @@ description.af_ZA = 'n Musiek stel sonder enige musiek.
description.ar_EG = مجموعة موسيقى بدون موسيقى
description.be_BY = "Пусты" набор музычнага афармлення, які не зьмяшчае ніякай музыкі.
description.bg_BG = Празен музикален пакет.
-description.ca_ES = Un joc de música sense cap música.
+description.ca_ES = Una llista de música sense cap peça.
description.cs_CZ = Prázná hudební sada.
description.cy_GB = Pecyn cerddoriaeth heb unrhyw gerddoriaeth ynddo.
description.da_DK = En musikpakke uden musik.
@@ -21,13 +21,16 @@ description.el_GR = Ένα πάκετο μουσικής χωρίς πραγμα
description.en_AU = A music pack without actual music.
description.en_US = A music pack without actual music.
description.es_ES = Un conjunto de música vacío.
+description.es_MX = Paquete de música vacío
description.et_EE = Muusikakogu ilma muusikata.
+description.eu_ES = Musika gabeko musika paketea.
description.fi_FI = Musiikkipaketti, jossa ei ole musiikkia.
description.fr_FR = Un pack de musiques sans musiques.
description.ga_IE = Pacáiste ceoil gan aon cheol iarbhír ann.
description.gd_GB = Pacaid ciùil anns nach eil fonn sam bith.
description.gl_ES = Un conxunto de músicas sen ningunha música.
-description.hr_HR = Muzički paket bez ikakve muzike.
+description.he_IL = אוסף מנגינות ללא מנגינות.
+description.hr_HR = Glazbeni paket bez ikakve glazbe.
description.hu_HU = Zenei alapcsomag zene nélkül.
description.id_ID = Paket musik tanpa musik sungguhan.
description.is_IS = Tónlistarpakki sem er í raun án tónlistar.
@@ -38,6 +41,7 @@ description.la_VA = Sarcina musicae sine ulla musica.
description.lb_LU = E Musikpack ouni aktuell Musik.
description.lt_LT = Muzikos pakas be muzikos.
description.lv_LV = Mūzikas kopa bez mūzikas
+description.ms_MY = Pek muzik tanpa muzik sebenar.
description.nb_NO = En musikkpakke uten noe musikk.
description.nl_NL = Een muziekset zonder muziek.
description.nn_NO = Ei musikkpakke utan noko musikk.
diff --git a/bin/baseset/no_sound.obs b/bin/baseset/no_sound.obs
index 9954845a35..8bd8d30fe0 100644
--- a/bin/baseset/no_sound.obs
+++ b/bin/baseset/no_sound.obs
@@ -12,7 +12,7 @@ description.af_ZA = 'n Klank stel sonder enige klanke.
description.ar_EG = مجموعة صوت بدوت اصوات مضافة
description.be_BY = "Пусты" набор гукавога афармленьня, які не зьмяшчае ніякіх гукаў.
description.bg_BG = Празен звуков пакет.
-description.ca_ES = Un joc de sons sense cap so.
+description.ca_ES = Una llista de sons buida.
description.cs_CZ = Prázdná sada zvuků.
description.cy_GB = Pecyn sain heb unrhyw effeithiau sain ynddo.
description.da_DK = En lydpakke uden lyde.
@@ -21,6 +21,7 @@ description.el_GR = Ένα πάκετο ήχων χώρις ήχους.
description.en_AU = 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_MX = Paquete de sonidos vacío
description.et_EE = Helikogu ilma helideta.
description.eu_ES = Soinurik gabeko soinu pakete bat
description.fi_FI = Äänipaketti, jossa ei ole ääniä.
@@ -28,6 +29,7 @@ description.fr_FR = Un pack de sons sans sons.
description.ga_IE = Pacáiste fuaimeanna gan aon fhuaimeanna ann.
description.gd_GB = Pacaid fhuaimean anns nach eil fuaim sam bith.
description.gl_ES = Un conxunto de sons sen ningún son
+description.he_IL = אוסף צלילים ללא צלילים.
description.hr_HR = Zvučni paket bez ikakvih zvukova.
description.hu_HU = Hang alapcsomag hangok nélkül.
description.id_ID = Paket efek suara tanpa suara apapun.
@@ -38,6 +40,7 @@ description.ko_KR = 아무런 효과음도 없는 효과음 팩입니다.
description.la_VA = Sarcina sonorum sine ullis sonis.
description.lb_LU = E Soundpack ouni iergendee Sound.
description.lt_LT = Garsų pakas be jokių garsų.
+description.lv_LV = Skaņu kopa bez skaņas.
description.nb_NO = En lydpakke uten noen lyder.
description.nl_NL = Een geluidset zonder geluid.
description.nn_NO = Ei lydpakke utan nokon lydar.
diff --git a/bin/baseset/openttd.grf b/bin/baseset/openttd.grf
index efe35ffd38..168d00fbd8 100644
Binary files a/bin/baseset/openttd.grf and b/bin/baseset/openttd.grf differ
diff --git a/bin/baseset/orig_dos.obg b/bin/baseset/orig_dos.obg
index ffe230ccf2..7222400af0 100644
--- a/bin/baseset/orig_dos.obg
+++ b/bin/baseset/orig_dos.obg
@@ -13,7 +13,7 @@ description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS uitgawe grafieke.
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الرسومية نسخة الدوس
description.be_BY = Арыґінальная ґрафіка з 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 del Transport Tycoon Deluxe pel DOS.
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (verze pro DOS).
description.cy_GB = Graffeg gwreiddiol fersiwn DOS o Transport Tycoon Deluxe.
description.da_DK = Originalgrafik fra Transport Tycoon Deluxe DOS-version.
@@ -22,12 +22,15 @@ description.el_GR = Αρχικά γραφικά από το Transport Tycoon Del
description.en_AU = Original Transport Tycoon Deluxe DOS edition graphics.
description.en_US = Original Transport Tycoon Deluxe DOS edition graphics.
description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión DOS.
+description.es_MX = Gráficos originales de Transport Tycoon Deluxe para DOS.
description.et_EE = Algse Transport Tycoon Deluxe DOSi versiooni graafika.
+description.eu_ES = Transport Tycoon Deluxe originaleko DOS edizioko grafikoak.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen DOS-version grafiikat.
description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version DOS).
description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán DOS.
description.gd_GB = Grafaigeachd aig an deasachadh DOS tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Graficos da edición orixinal de Transport Tycoon Deluxe para DOS.
+description.he_IL = גרפיקות Transport Tycoon Deluxe המקורי בגרסת DOS.
description.hr_HR = Originalna grafika za Transport Tycoon Deluxe DOS izdanje.
description.hu_HU = Az eredeti Transport Tycoon Deluxe DOS verziójának grafikája.
description.id_ID = Grafik orisinil Transport Tycoon Deluxe versi DOS.
@@ -38,6 +41,8 @@ description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 도스 에
description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe DOS.
description.lb_LU = Original Transport Tycoon Deluxe DOS Editioun Grafik.
description.lt_LT = Originali Transport Tycoon Deluxe DOS leidimo grafika.
+description.lv_LV = Oriģinālā Transport Tycoon Deluxe DOS izdevuma grafika.
+description.ms_MY = Grafik asal Transport Tycoon Deluxe DOS edition.
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for DOS.
description.nl_NL = Originele graphics van de Transport Tycoon Deluxe DOS-versie.
description.nn_NO = Original grafikk frå Transport Tycoon Deluxe for DOS.
@@ -59,21 +64,21 @@ description.zh_CN = 运输大亨DOS豪华版原版图形包.
description.zh_TW = 原版 Transport Tycoon Deluxe DOS 版的圖形。
[files]
-base = TRG1.GRF
-logos = TRGI.GRF
-arctic = TRGC.GRF
-tropical = TRGH.GRF
-toyland = TRGT.GRF
-extra = OPENTTD.GRF
+base = TRG1.GRF
+logos = TRGI.GRF
+arctic = TRGC.GRF
+tropical = TRGH.GRF
+toyland = TRGT.GRF
+extra = ORIG_EXTRA.GRF
[md5s]
-TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
-TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
-TRGC.GRF = ed446637e034104c5559b32c18afe78d
-TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
-TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
-OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc
+TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
+TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
+TRGC.GRF = ed446637e034104c5559b32c18afe78d
+TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
+TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
+ORIG_EXTRA.GRF = 73b921a42814c47a84945b7e9add5d9f
[origin]
-default = You can find it on your Transport Tycoon Deluxe CD-ROM.
-OPENTTD.GRF = This file was part of your OpenTTD installation.
+default = You can find it on your Transport Tycoon Deluxe CD-ROM.
+ORIG_EXTRA.GRF = This file was part of your OpenTTD installation.
diff --git a/bin/baseset/orig_dos.obs b/bin/baseset/orig_dos.obs
index 5ae658692d..ce2d6d22e6 100644
--- a/bin/baseset/orig_dos.obs
+++ b/bin/baseset/orig_dos.obs
@@ -12,7 +12,7 @@ description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS uitgawe klanke.
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الصوتية نسخة الدوس
description.be_BY = Арыґінальны набор гукавога афармленьня з гульні 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 del Transport Tycoon Deluxe pel DOS.
description.cs_CZ = Původní sada zvuků Transport Tycoon Deluxe (verze pro DOS).
description.cy_GB = Effeithiau sain gwreiddiol fersiwn DOS o Transport Tycoon Deluxe.
description.da_DK = Originallyd fra Transport Tycoon Deluxe DOS-version.
@@ -21,12 +21,15 @@ description.el_GR = Αρχικοί ήχοι από το Transport Tycoon Deluxe
description.en_AU = Original Transport Tycoon Deluxe DOS edition sounds.
description.en_US = Original Transport Tycoon Deluxe DOS edition sounds.
description.es_ES = Sonidos originales de Transport Tycoon Deluxe versión DOS.
+description.es_MX = Sonidos originales de Transport Tycoon Deluxe para DOS.
description.et_EE = Algse Transport Tycoon Deluxe DOSi versiooni helid.
+description.eu_ES = Transport Tycoon Deluxe originaleko DOS edizioko soinuak.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen DOS-version äänet.
description.fr_FR = Sons originaux de Transport Tycoon Deluxe (version DOS).
description.ga_IE = Fuaimeanna bunaidh Transport Tycoon Deluxe, eagrán DOS.
description.gd_GB = Fuaimean aig an deasachadh DOS tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Sons da edición orixinal de Transport Tycoon Deluxe para DOS.
+description.he_IL = צלילי Transport Tycoon Deluxe המקורי בגרסת DOS.
description.hr_HR = Originalni zvukovi za Transport Tycoon Deluxe DOS izdanje.
description.hu_HU = Az eredeti Transport Tycoon Deluxe DOS verziójának hangjai.
description.id_ID = Efek suara orisinil Transport Tycoon Deluxe versi DOS.
diff --git a/bin/baseset/orig_dos_de.obg b/bin/baseset/orig_dos_de.obg
index 5649613eef..676840f788 100644
--- a/bin/baseset/orig_dos_de.obg
+++ b/bin/baseset/orig_dos_de.obg
@@ -13,7 +13,7 @@ description.af_ZA = Oorspronklike Transport Tycoon Deluxe DOS (German) uitgawe g
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الالمانية نسخة الدوس
description.be_BY = Арыґінальная ґрафіка зь нямецкай версіі 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 del Transport Tycoon Deluxe (alemany) pel DOS.
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (německá verze pro DOS).
description.cy_GB = Graffeg gwreiddiol fersiwn DOS (Almaenig) o Transport Tycoon Deluxe.
description.da_DK = Originalgrafik fra Transport Tycoon Deluxe DOS (Tysk) version.
@@ -22,12 +22,14 @@ description.el_GR = Αρχικά γραφικά από το Transport Tycoon Del
description.en_AU = Original Transport Tycoon Deluxe DOS (German) edition graphics.
description.en_US = Original Transport Tycoon Deluxe DOS (German) edition graphics.
description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión DOS (Alemán).
+description.es_MX = Gráficos originales de Transport Tycoon Deluxe para DOS (en alemán).
description.et_EE = Algse Transport Tycoon Deluxe DOSi (Saksa) versiooni graafika.
description.fi_FI = Alkuperäiset Saksassa julkaistun Transport Tycoon Deluxen DOS-version grafiikat.
description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version DOS allemande).
description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán DOS (Gearmánach).
description.gd_GB = Grafaigeachd aig an deasachadh DOS (Gearmailteach) tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Graficos da edición orixinal (alemá) de Transport Tycoon Deluxe para DOS.
+description.he_IL = גרפיקות Transport Tycoon Deluxe המקורי בגרסת DOS (גרמנית).
description.hr_HR = Originalna grafika za Transport Tycoon Deluxe DOS (Njemački) izdanje.
description.hu_HU = Az eredeti Transport Tycoon Deluxe DOS (német) verziójának grafikája.
description.id_ID = Grafik orisinil Transport Tycoon Deluxe versi DOS (Jerman).
@@ -38,6 +40,7 @@ description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 도스 에
description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe DOS (Germanica).
description.lb_LU = Original Transport Tycoon Deluxe DOS (Däitsch) Editioun Grafik.
description.lt_LT = Originali Transport Tycoon Deluxe DOS (Vokiečių) leidimo grafika.
+description.lv_LV = Oriģinālā Transport Tycoon Deluxe DOS (vācu) izdevuma grafika.
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for DOS (tysk).
description.nl_NL = Originele graphics van de Duitse Transport Tycoon Deluxe DOS-versie.
description.nn_NO = Original grafikk frå Transport Tycoon Deluxe for DOS (tysk).
@@ -59,21 +62,21 @@ description.zh_CN = 运输大亨DOS豪华德语版原版图形包.
description.zh_TW = 原版 Transport Tycoon Deluxe DOS 版 (德國版) 的圖形。
[files]
-base = TRG1.GRF
-logos = TRGI.GRF
-arctic = TRGC.GRF
-tropical = TRGH.GRF
-toyland = TRGT.GRF
-extra = OPENTTD.GRF
+base = TRG1.GRF
+logos = TRGI.GRF
+arctic = TRGC.GRF
+tropical = TRGH.GRF
+toyland = TRGT.GRF
+extra = ORIG_EXTRA.GRF
[md5s]
-TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
-TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
-TRGC.GRF = ed446637e034104c5559b32c18afe78d
-TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
-TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
-OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc
+TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
+TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
+TRGC.GRF = ed446637e034104c5559b32c18afe78d
+TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
+TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
+ORIG_EXTRA.GRF = 73b921a42814c47a84945b7e9add5d9f
[origin]
-default = You can find it on your Transport Tycoon Deluxe CD-ROM.
-OPENTTD.GRF = This file was part of your OpenTTD installation.
+default = You can find it on your Transport Tycoon Deluxe CD-ROM.
+ORIG_EXTRA.GRF = This file was part of your OpenTTD installation.
diff --git a/bin/baseset/orig_extra.grf b/bin/baseset/orig_extra.grf
new file mode 100644
index 0000000000..168c415a5d
Binary files /dev/null and b/bin/baseset/orig_extra.grf differ
diff --git a/bin/baseset/orig_win.obg b/bin/baseset/orig_win.obg
index f9bd77934c..049a3dca9b 100644
--- a/bin/baseset/orig_win.obg
+++ b/bin/baseset/orig_win.obg
@@ -13,7 +13,7 @@ description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe grafie
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الرسومية نسخة وندوز
description.be_BY = Арыґінальная ґрафіка з 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 del Transport Tycoon Deluxe pel Windows.
description.cs_CZ = Původní sada grafik Transport Tycoon Deluxe (verze pro Windows).
description.cy_GB = Graffeg gwreiddiol fersiwn Windows o Transport Tycoon Deluxe.
description.da_DK = Originalgrafik fra Transport Tycoon Deluxe Windows-version.
@@ -22,12 +22,14 @@ description.el_GR = Αρχικά γραφικά από το Transport Tycoon Del
description.en_AU = Original Transport Tycoon Deluxe Windows edition graphics.
description.en_US = Original Transport Tycoon Deluxe Windows edition graphics.
description.es_ES = Gráficos originales de Transport Tycoon Deluxe versión Windows.
+description.es_MX = Gráficos originales de Transport Tycoon Deluxe para Windows.
description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni graafika.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen Windows-version grafiikat.
description.fr_FR = Graphiques originaux de Transport Tycoon Deluxe (version Windows).
description.ga_IE = Grafaicí bunaidhTransport Tycoon Deluxe, eagrán Windows.
description.gd_GB = Grafaigeachd aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Graficos da edición orixinal de Transport Tycoon Deluxe para Windows.
+description.he_IL = גרפיקות Transport Tycoon Deluxe המקורי בגרסת Windows.
description.hr_HR = Originalna grafika za Transport Tycoon Deluxe Windows izdanje.
description.hu_HU = Az eredeti Transport Tycoon Deluxe Windows verziójának grafikája.
description.id_ID = Grafik orisinil Transport Tycoon Deluxe versi Windows.
@@ -38,6 +40,8 @@ description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에
description.la_VA = Graphica ex editione originale Transport Tycoon Deluxe Windows.
description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Grafik.
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo grafika.
+description.lv_LV = Oriģinālā Transport Tycoon Deluxe Windows izdevuma grafika.
+description.ms_MY = Grafik asal Transport Tycoon Deluxe edisi Windows.
description.nb_NO = Original grafikk fra Transport Tycoon Deluxe for Windows.
description.nl_NL = Originele graphics van de Transport Tycoon Deluxe Windows-versie.
description.nn_NO = Original grafikk frå Transport Tycoon Deluxe for Windows.
@@ -59,21 +63,21 @@ description.zh_CN = 运输大亨Windows豪华版原版图形包.
description.zh_TW = 原版 Transport Tycoon Deluxe Windows 版的圖形。
[files]
-base = TRG1R.GRF
-logos = TRGIR.GRF
-arctic = TRGCR.GRF
-tropical = TRGHR.GRF
-toyland = TRGTR.GRF
-extra = OPENTTD.GRF
+base = TRG1R.GRF
+logos = TRGIR.GRF
+arctic = TRGCR.GRF
+tropical = TRGHR.GRF
+toyland = TRGTR.GRF
+extra = ORIG_EXTRA.GRF
[md5s]
-TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358
-TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
-TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
-TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
-TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
-OPENTTD.GRF = 505d96061556d3bb5cec6234096ec5bc
+TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358
+TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
+TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
+TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
+TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
+ORIG_EXTRA.GRF = 73b921a42814c47a84945b7e9add5d9f
[origin]
-default = You can find it on your Transport Tycoon Deluxe CD-ROM.
-OPENTTD.GRF = This file was part of your OpenTTD installation.
+default = You can find it on your Transport Tycoon Deluxe CD-ROM.
+ORIG_EXTRA.GRF = This file was part of your OpenTTD installation.
diff --git a/bin/baseset/orig_win.obm b/bin/baseset/orig_win.obm
index 080e8e293b..8e2053e043 100644
--- a/bin/baseset/orig_win.obm
+++ b/bin/baseset/orig_win.obm
@@ -12,7 +12,7 @@ description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe musiek
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الموسيقية نسخة وندوز
description.be_BY = Арыґінальны набор музычнага афармленьня з гульні 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 del Transport Tycoon Deluxe pel Windows.
description.cs_CZ = Původní hudba Transport Tycoon Deluxe (verze pro Windows).
description.cy_GB = Cerddoriaeth gwreiddiol fersion Windows o Transport Tycoon Deluxe.
description.da_DK = Originalmusik fra Transport Tycoon Deluxe Windows-version.
@@ -21,13 +21,15 @@ description.el_GR = Αρχική μουσική από το Transport Tycoon Del
description.en_AU = Original Transport Tycoon Deluxe Windows edition music.
description.en_US = Original Transport Tycoon Deluxe Windows edition music.
description.es_ES = Música original de Transport Tycoon Deluxe versión Windows.
+description.es_MX = Música original de Transport Tycoon Deluxe para Windows.
description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni muusika.
description.fi_FI = Alkuperäinen Transport Tycoon Deluxen Windows-version musiikki.
description.fr_FR = Musiques originales de Transport Tycoon Deluxe (version Windows).
description.ga_IE = Ceol bunaidh Transport Tycoon Deluxe, eagrán Windows.
description.gd_GB = Ceòl aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Música da edición orixinal de Transport Tycoon Deluxe para Windows.
-description.hr_HR = Originalna muzika za Transport Tycoon Deluxe Windows izdanje.
+description.he_IL = מנגינות Transport Tycoon Deluxe המקורי בגרסת Windows.
+description.hr_HR = Originalna glazba za Transport Tycoon Deluxe Windows izdanje.
description.hu_HU = Az eredeti Transport Tycoon Deluxe Windows verziójának zenéje.
description.id_ID = Musik pengiring orisinil Transport Tycoon Deluxe versi Windows.
description.is_IS = Upprunalega tónlistin úr Transport Tycoon Deluxe Windows útgáfunni.
@@ -35,9 +37,10 @@ description.it_IT = Musica originale di Transport Tycoon Deluxe, edizione Window
description.ja_JP = Transport Tycoon Deluxe オリジナル版 音楽 (Windows)
description.ko_KR = 오리지널 트랜스포트 타이쿤 디럭스 윈도 에디션의 음악입니다.
description.la_VA = Musica ex editione originale Transport Tycoon Deluxe Windows.
-description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Music.
+description.lb_LU = Original Transport Tycoon Deluxe Windows Editioun Musik.
description.lt_LT = Originali Transport Tycoon Deluxe Windows leidimo muzika.
description.lv_LV = Oriģinālā Transport Tycoon Deluxe Windows izdevuma mūzika.
+description.ms_MY = Muzik asal Transport Tycoon Deluxe edisi Windows.
description.nb_NO = Original musikk fra Transport Tycoon Deluxe for Windows.
description.nl_NL = Originele muziek van de Transport Tycoon Deluxe Windows-versie.
description.nn_NO = Original musikk frå Transport Tycoon Deluxe for Windows.
diff --git a/bin/baseset/orig_win.obs b/bin/baseset/orig_win.obs
index 33164e9584..c3e5fb7693 100644
--- a/bin/baseset/orig_win.obs
+++ b/bin/baseset/orig_win.obs
@@ -12,7 +12,7 @@ description.af_ZA = Oorspronklike Transport Tycoon Deluxe Windows uitgawe klanke
description.ar_EG = النسخة الاصلية من ترانسبورت تايكون ديلوكس الصوتية نسخة وندوز
description.be_BY = Арыґінальны набор гукавога афармленьня з гульні 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 del Transport Tycoon Deluxe pel Windows.
description.cs_CZ = Původní sada zvuků Transport Tycoon Deluxe (verze pro Windows).
description.cy_GB = Effeithiau sain gwreiddiol fersiwn Windows o Transport Tycoon Deluxe.
description.da_DK = Originallyd fra Transport Tycoon Deluxe Windows-version.
@@ -21,12 +21,15 @@ description.el_GR = Αρχικοί ήχοι από το Transport Tycoon Deluxe
description.en_AU = Original Transport Tycoon Deluxe Windows edition sounds.
description.en_US = Original Transport Tycoon Deluxe Windows edition sounds.
description.es_ES = Sonidos originales de Transport Tycoon Deluxe versión Windows.
+description.es_MX = Sonidos originales de Transport Tycoon Deluxe para Windows.
description.et_EE = Algse Transport Tycoon Deluxe Windowsi versiooni helid.
+description.eu_ES = Transport Tycoon Deluxe originaleko Windows edizioko grafikoak.
description.fi_FI = Alkuperäiset Transport Tycoon Deluxen Windows-version äänet.
description.fr_FR = Sons originaux de Transport Tycoon Deluxe (version Windows).
description.ga_IE = Fuaimeanna bunaidh Transport Tycoon Deluxe, eagrán Windows.
description.gd_GB = Fuaimean aig an deasachadh Windows tùsail aig Transport Tycoon Deluxe.
description.gl_ES = Sons da edición orixinal de Transport Tycoon Deluxe para Windows.
+description.he_IL = צלילי Transport Tycoon Deluxe המקורי בגרסת Windows.
description.hr_HR = Originalni zvukovi za Transport Tycoon Deluxe Windows izdanje.
description.hu_HU = Az eredeti Transport Tycoon Deluxe Windows verziójának hangjai.
description.id_ID = Efek suara orisinil Transport Tycoon Deluxe versi Windows.
diff --git a/bin/game/compat_1.6.nut b/bin/game/compat_1.6.nut
index fe985b90d0..d25189db2a 100644
--- a/bin/game/compat_1.6.nut
+++ b/bin/game/compat_1.6.nut
@@ -6,3 +6,5 @@
* 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 .
*/
+
+GSLog.Info("1.6 API compatibility in effect.");
diff --git a/bin/game/compat_1.7.nut b/bin/game/compat_1.7.nut
new file mode 100644
index 0000000000..1290443c4d
--- /dev/null
+++ b/bin/game/compat_1.7.nut
@@ -0,0 +1,10 @@
+/* $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 .
+ */
+
+GSLog.Info("1.7 API compatibility in effect.");
diff --git a/bin/game/compat_1.8.nut b/bin/game/compat_1.8.nut
new file mode 100644
index 0000000000..fe985b90d0
--- /dev/null
+++ b/bin/game/compat_1.8.nut
@@ -0,0 +1,8 @@
+/* $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 .
+ */
diff --git a/changelog.txt b/changelog.txt
index 4fa211c9f9..89b3babf84 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -1,30 +1,185 @@
+1.6.1 (2016-07-01)
+------------------------------------------------------------------------
+- Fix: Compilation and optimisation issues with GCC6 (r27606, r27605, r27595)
+- Fix: Compilation with --disable-network [FS#6481] (r27602)
+- Fix: [NewGRF] shift-and-add-divide/modulo varadjusts use signed division/modulo (r27600)
+- Fix: Company 0 could accept engine previews before they were offered (r27598)
+
+
+1.6.1-RC1 (2016-06-01)
+------------------------------------------------------------------------
+- Feature: Mexican Spanish (r27564, r27553, r27552)
+- Change: Performance improvement for dedicated servers by skipping drawing calls earlier in the process [FS#6402] (r27579)
+- Fix: Automatic servicing of road vehicles compared path finder costs with tile distances, thus vehicles went to depots which were factor 100 too far away [FS#6410] (r27586)
+- Fix: Enforce a non-zero load amount for all vehicles, so that vehicles can process their cargo reservations [FS#6437] (r27585, r27584)
+- Fix: Do not decrease the column width of depot windows when vehicles with high unitnumbers leave [FS#6415] (r27583)
+- Fix: Button size computation in script configuration window [FS#6461] (r27581)
+- Fix: [NewGRF] Set date of last service on construction also for wagons and articulated parts [FS#6395] (r27580)
+- Fix: Vehicles could not be hidden from the purchase list when they were in exclusive preview [FS#6454] (r27578)
+- Fix: Dock and roadstop picker, client list and town authority window did not auto-resize according to their content when they were positioned at the bottom of the screen [FS#6386] (r27577)
+- Fix: Various incorrect but uncritical size computations in the content client [FS#6449] (r27576, r27570)
+- Fix: Memory leak when disabling palette animation [FS#6404] (r27575)
+- Fix: [NewGRF] The house id as returned by house variable 66 was incorrect when querying neighboured tiles [FS#6432] (r27574)
+- Fix: [Build] Compilation failure with gcc 6.1 due to headers included after safeguards.h [FS#6467] (r27573)
+- Fix: Convenience savegame bump to distinguish 1.6 savegames from 1.5 savegames [FS#6442] (r27572)
+- Fix: [Build] Force sorting to be locale independent, so files are always ordered the same and by that token better diff-able (r27562, r27558)
+- Fix: Typos in comments and string (r27561, r27560)
+- Fix: [Build] bashism that caused different CFLAGS with bash vs dash (r27557)
+- Fix: Use a more appropiate sound effect for convert-rail (r27547)
+- Fix: Remove SetFill from vehicle GUI buttons, so that the viewport is resized instead of them in case of long window titles (r27546)
+- Fix: [Script] Generation of API wrappers (r27545, r27544, r27543)
+- Fix: [Windows] ICU got disabled for Windows builds, breaking RTL support [FS#6427] (r27542)
+- Fix: [NewGRF] Station spritelayouts did not accept the var10 flag for the palette [FS#6435] (r27534)
+
+
+1.6.0 (2016-04-01)
+------------------------------------------------------------------------
+(None)
+
+
+1.6.0-RC1 (2016-03-01)
+------------------------------------------------------------------------
+- Feature: [NewGRF] Allow custom sound IDs in RV property 0x12, ship property 0x10 and aircraft property 0x12 (r27507)
+- Feature: When viewing online content of a particular type, hide content of other types unless they have been (auto)selected for download (r27469, r27468, r27444)
+- Feature: [NewGRF] Move sprite 8 positions in sprite aligner with ctrl+click [FS#6241] (r27451)
+- Feature: Lower the sell-vehicle and sell-chain buttons in the train depot GUI while dragging a vehicle over it [FS#6391] (r27450, r27446)
+- Feature: Make the object placement GUI an independent window (r27438, r27397, r27346)
+- Feature: [Build] Project files and compilation with MSVC2015 (r27385, r27382, r27381, r27380, r27379)
+- Feature: [NewGRF] Allow railtype NewGRF to define separate sprites for the fences on either track side [FS#6315] (r27354, r27343)
+- Feature: [NewGRF] Increase the maximum amount of industry types to 128 per NewGRF and 240 in total (r27279)
+- Feature: Make Ctrl+Remove-Roadstop also remove the road, just like for rail stations [FS#6252] (r27251)
+- Change: [NewGRF] Allow static NewGRF to enable the second rocky tile set (r27497)
+- Change: Round loading percentage in loading indicators and conditional orders towards 50%, so that 0% and 100% mean completely empty or full (r27426)
+- Change: [Build] Rework the configure system to make more use of pkg-config (r27377:r27366, r27361, r27360)
+- Change: Enable YAPF cache debugging with desync debug level 2 (r27332)
+- Change: [strgen] Default plural subparameter position for CARGO_xxx string control codes is subparameter 1 (r27295)
+- Change: [NewGRF] Translate industry variable A6 (r27267)
+- Change: Do not consider cargo that is already being loaded as waiting cargo wrt. the station rating [FS#6165] (r27256)
+- Change: Tune down terrain generation to reduce amount of long slopes (r27230)
+- Change: Generate more detailed curves at the coast (r27229)
+- Change: Slightly more water in the non-custom sea levels (r27228)
+- Change: Be more lenient about road stop removal when at least one stop could be removed [FS#6262] (r27225)
+- Fix: [Win32] Stdin/out/err need to be re-assigned differently if the runtime lib of MSVC2015 is used (r27481)
+- Fix: [Haiku] On Haiku use the appropriate system variable to obtain the include dir [FS#6401] (r27472)
+
+
+1.5.3 (2015-12-01)
+------------------------------------------------------------------------
+(None)
+
+
+1.5.3-RC1 (2015-11-01)
+------------------------------------------------------------------------
+- Fix: When selecting a refit cargo for orders, do not check whether the vehicle is in a depot or station, and do not ask whether the vehicle currently allows station-refitting. Also hide the refit cost for orders, it is not predictable (r27428)
+- Fix: Use the NewGRF railtype sorting order in the infrastructure window (r27427)
+- Fix: Crash when switching to or taking over companies, when an order window of a vehicle of the new company was opened. Now close those windows [FS#5842] (r27425)
+- Fix: Towns did not connect roads to existing roads, unless they had only a single roadbit. Otoh, towns also tried to connect to single roadbit tiles such as tunnels and depots, even though they were not connectable in the direction of interest [FS#6374] (r27424)
+- Fix: When towns expanded single-bit roadtiles using a grid-layout, they used the layout position of the neighbouring tile (r27423)
+- Fix: Aircraft picked the wrong airport entry point, if airports were rotated by 180 degree [FS#6341] (r27422)
+- Fix: Consider text and icon sizes when drawing the client list [FS#6265] (r27421)
+- Fix: GrowTownAtRoad sometimes returned false, even when a house was built [FS#6362] (r27420)
+- Fix: CmdSellRailWagon did not revert all actions properly when no orderlist could be allocated [FS#6369] (r27419)
+- Fix: Desync due to incorrect storage of segments with different railtype in the YAPF cache [FS#6329] [FS#6379] (r27418)
+- Fix: When a dedicated server was paused with no clients, the master server advertisement interval was slowed, causing deadvertisement of the server [FS#6368] (r27400)
+- Fix: [Makefile] Game script directory and compat*.nut were never installed on *nix (r27399)
+- Fix: There are two different availability conditions for fdatasync in the manpage. Use them both, since at least on some MinGW versions one is not enough (r27389)
+- Fix: win32 sound driver failed to report errors (r27383)
+- Fix: Clickareas in settings tree were misaligned when the filter warning was displayed, if the setting height was defined by the icons instead of the font [FS#6358] (r27366)
+- Fix: Center settings filter warning also vertically, and also in case of multiple lines (r27365)
+
+
+1.5.2 (2015-09-01)
+------------------------------------------------------------------------
+(None)
+
+
+1.5.2-RC1 (2015-08-01)
+------------------------------------------------------------------------
+- Change: Auto-complete partial roads when building level-crossings [FS#6283] (r27309)
+- Fix: Do not rerandomise the town name when only cost-estimating the founding [FS#6332] (r27341)
+- Fix: Make variety distribution not assume that sea level is at height 0.2 / 3 * TGPGetMaxHeight() [FS#6335] (r27331, r27330, r27329, r27328)
+- Fix: Remove corner-case optimisation for line drawing, which failed for dashed lines (r27324)
+- Fix: Clipping of inclined lines did not account for the 'horizontal width' being bigger than the 'real width' (r27323, r27322)
+- Fix: Incorrect owner assignment when adding/removing road/tram to/from bridges [FS#6317] (r27313, r27312)
+- Fix: Mark infrastructure window dirty in more cases (r27311)
+- Fix: Prevent breaking of tram-reversal points by adding more road pieces [FS#6283] (r27308)
+- Fix: Error message window with manager face failed with GUI zoom [FS#6259] (r27307)
+- Fix: Account for road-bridges and drive-through-stops in CanFollowRoad [FS#6320] (r27306, r27305)
+- Fix: Password window layout with GUI zoom [FS#6321] (r27304, r27303)
+- Fix: Speed-only timetables got assigned times in stations [FS#6313] (r27302, r27301)
+- Fix: Enforce the company's default service intervals when purchasing another company [FS#6254] (r27282, r27281)
+- Fix: Cloning/autoreplace/autorenew did not copy custom service intervals (r27280)
+
+
+1.5.1 (2015-06-01)
+------------------------------------------------------------------------
+(None)
+
+
+1.5.1-RC1 (2015-05-08)
+------------------------------------------------------------------------
+- Fix: Do not consider road junctions with trivial dead ends as branch points during town growth [FS#6245] (r27260, r27259, r27244)
+- Fix: ScriptList::RemoveList failed to remove a list from itself [FS#6287] (r27258)
+- Fix: Combined button+dropdown widgets in order and autoreplace GUI had incorrect hitbox when using GUI zoom [FS#6270] (r27255)
+- Fix: When building a lock on DC_AUTO-removable water-based objects, the water class was always set to canal [FS#6264] (r27254)
+- Fix: When crossing tram tracks with railroads, cost of extra roads was not being counted [FS#6282] (r27253)
+- Fix: Invalid infrastructure counting when crossing tram tracks with railroads [FS#6281] (r27252)
+- Fix: Broken error message in configure [FS#6286] (r27250)
+- Fix: In some cases town growth failure was considered as success [FS#6240] (r27249, r27247)
+- Fix: Town labels on smallmap and zoomed-out viewports were not centered [FS#6257] (r27248)
+- Fix: Removing a rail waypoint used the remove-rail-station cost [FS#6251] (r27245)
+- Fix: Duplicate frees due to pool item classes not having copy constructors [FS#6285] (r27243)
+- Fix: Crash when no AIs were installed due to improper handling of non-ASCII characters by the string pointer lexer [FS#6272] (r27233)
+- Fix: Compilation on DragonflyBSD [FS#6274] (r27224, r27223)
+- Fix: Use the current maximum speed as limited by bridges, orders etc. for all vehicle types alike when considering increased smoke emissions of vehicles [FS#6278] (r27222)
+- Fix: Multi-value keys in the desktop entry shall end with a trailing separator (r27221)
+- Fix: Draw path reservation on the whole bridge, not only on the bridge heads (r27209)
+- Fix: Draw correct overlay sprites for path reservations on bridges and tunnels (r27208)
+
+
+1.5.0 (2015-04-01)
+------------------------------------------------------------------------
+- Fix: [NewGRF] Add Misc. GRF Feature Flag 6 to enable the second rocky tile set [FS#6260] (r27200)
+
+
+1.5.0-RC1 (2015-03-18)
+------------------------------------------------------------------------
+- Feature: [NewGRF] Display relative offset changes in the sprite aligner [FS#6236] (r27174)
+- Fix: Original road vehicle acceleration crashed for vehicles taking over [FS#6255] (r27190)
+- Fix: GCC 5 compilation (r27185, r27183)
+- Fix: Data race due to lazy initialisation of objects [FS#5969] (r27178)
+- Fix: Compilation with MinGW64 (r27176)
+- Fix: Use the regular clipping functions in the sprite aligner instead of some magic [FS#6237] (r27173)
+- Fix: Windows randomly drops SetCursorPos calls, breaking the RMB-scrolling [FS#6238] (r27172)
+
+
1.5.0-beta2 (2015-02-24)
------------------------------------------------------------------------
-- Feature: [NoGo] Game scripts can point to a location, station, industry, or town when publishing news. (r27164)
-- Feature: Allow changing max heightlevel in scenario editor. (r27151)
-- Feature: Make use of both rocky tile sets from the base graphics. (r27117)
-- Change: Scale (non-custom) default window sizes according to GUI zoom. (r27147)
-- Change: Make statusbar and chat-entry window use the same width as the toolbar. (r27146)
-- Change: The chatbox-width setting now uses percent of screen width instead of pixels. (r27144)
-- Change: [NewGRF] Interpret negative positions in industry layouts depending on GRF version. (r27138)
-- Fix: [SDL, Windows] Right-mouse-button scrolling scrolled/jumped too far, when OpenTTD lagged during mouse event processing. (r27167)
-- Fix: Toolbars were not invalidated when changing max-vehicles settings. [FS#6204] (r27163)
-- Fix: Tile selection was drawn outside of map in some cases. [FS#6208] (r27162)
-- Fix: Reimplement the viewport drawing algorithm. [FS#6156] [FS#6206] (r27161)
-- Fix: Issues with smallmap and viewport coordinates and transformations. (r27160, r27159, r27158)
-- Fix: Mark bridge middle tiles dirty when building/removing/changing bridges. (r27157)
-- Fix: Rounding and unit-conversion inconsistencies in calls to MarkAllViewportsDirty. (r27148)
-- Fix: Oilrig empty-tile checks were incorrect due to wrong TileIndexDiff->TileIndexDiffC conversion. (r27137)
-- Fix: Misalignment in generate world window in case of small fonts. (r27135)
-- Fix: Dragging of free wagons in depot failed with GUI zoom. (r27133)
-- Fix: Reduce memory footprint of map array by shuffling its members. [FS#6218] (r27132, r27126)
-- Fix: Dropdown- and tooltip-windows should not steal the focus. (r27131)
-- Fix: [NewGRF] Action 7/9 condition 0A failed for present, but disabled, NewGRF. (r27119)
-- Fix: Road vehicles could not reverse to be sent to depots when the following tile has the right type to run on, but could not be entered. [FS#6183] (r27107)
-- Fix: Use the actual max speed of the vehicle in front when determining if a RV can overtake. [FS#6176] (r27106)
-- Fix: grow_counter was not properly bounded by growth_rate, but by some other value used to calculate growth_rate. [FS#6195] (r27105)
-- Fix: [Script] Support 64 bits integers in ScriptLists. [FS#6194] (r27104)
-- Fix: [Script] Money values would end up wrong in strings when outside the bounds of a 32 bits integer. [FS#6194] (r27102)
+- Feature: [NoGo] Game scripts can point to a location, station, industry, or town when publishing news (r27164)
+- Feature: Allow changing max heightlevel in scenario editor (r27151)
+- Feature: Make use of both rocky tile sets from the base graphics (r27117)
+- Change: Scale (non-custom) default window sizes according to GUI zoom (r27147)
+- Change: Make statusbar and chat-entry window use the same width as the toolbar (r27146)
+- Change: The chatbox-width setting now uses percent of screen width instead of pixels (r27144)
+- Change: [NewGRF] Interpret negative positions in industry layouts depending on GRF version (r27138)
+- Fix: [SDL, Windows] Right-mouse-button scrolling scrolled/jumped too far, when OpenTTD lagged during mouse event processing (r27167)
+- Fix: Toolbars were not invalidated when changing max-vehicles settings [FS#6204] (r27163)
+- Fix: Tile selection was drawn outside of map in some cases [FS#6208] (r27162)
+- Fix: Reimplement the viewport drawing algorithm [FS#6156] [FS#6206] (r27161)
+- Fix: Issues with smallmap and viewport coordinates and transformations (r27160, r27159, r27158)
+- Fix: Mark bridge middle tiles dirty when building/removing/changing bridges (r27157)
+- Fix: Rounding and unit-conversion inconsistencies in calls to MarkAllViewportsDirty (r27148)
+- Fix: Oilrig empty-tile checks were incorrect due to wrong TileIndexDiff->TileIndexDiffC conversion (r27137)
+- Fix: Misalignment in generate world window in case of small fonts (r27135)
+- Fix: Dragging of free wagons in depot failed with GUI zoom (r27133)
+- Fix: Reduce memory footprint of map array by shuffling its members [FS#6218] (r27132, r27126)
+- Fix: Dropdown- and tooltip-windows should not steal the focus (r27131)
+- Fix: [NewGRF] Action 7/9 condition 0A failed for present, but disabled, NewGRF (r27119)
+- Fix: Road vehicles could not reverse to be sent to depots when the following tile has the right type to run on, but could not be entered [FS#6183] (r27107)
+- Fix: Use the actual max speed of the vehicle in front when determining if a RV can overtake [FS#6176] (r27106)
+- Fix: grow_counter was not properly bounded by growth_rate, but by some other value used to calculate growth_rate [FS#6195] (r27105)
+- Fix: [Script] Support 64 bits integers in ScriptLists [FS#6194] (r27104)
+- Fix: [Script] Money values would end up wrong in strings when outside the bounds of a 32 bits integer [FS#6194] (r27102)
1.5.0-beta1 (2014-12-24)
diff --git a/config.lib b/config.lib
index 72c8fb0dca..3d10aaa3fd 100644
--- a/config.lib
+++ b/config.lib
@@ -29,6 +29,7 @@ set_default() {
strip=""
lipo=""
awk="awk"
+ pkg_config="pkg-config"
os="DETECT"
endian="AUTO"
cpu_type="DETECT"
@@ -84,7 +85,8 @@ set_default() {
with_libtimidity="1"
with_freetype="1"
with_fontconfig="1"
- with_icu="1"
+ with_icu_layout="1"
+ with_icu_sort="1"
static_icu="0"
with_psp_config="1"
with_threads="1"
@@ -105,6 +107,7 @@ set_default() {
strip
lipo
awk
+ pkg_config
os
endian
cpu_type
@@ -159,7 +162,8 @@ set_default() {
with_libtimidity
with_freetype
with_fontconfig
- with_icu
+ with_icu_layout
+ with_icu_sort
static_icu
with_psp_config
with_threads
@@ -213,6 +217,8 @@ detect_params() {
--windres=*) windres="$optarg";;
--awk) prev_p="awk";;
--awk=*) awk="$optarg";;
+ --pkg-config) prev_p="pkg_config";;
+ --pkg-config=*) pkg_config="$optarg";;
--strip) prev_p="strip";;
--strip=*) strip="$optarg";;
--lipo) prev_p="lipo";;
@@ -383,12 +389,18 @@ detect_params() {
--without-libfontconfig) with_fontconfig="0";;
--with-libfontconfig=*) with_fontconfig="$optarg";;
- --with-icu) with_icu="2";;
- --without-icu) with_icu="0";;
- --with-icu=*) with_icu="$optarg";;
- --with-libicu) with_icu="2";;
- --without-libicu) with_icu="0";;
- --with-libicu=*) with_icu="$optarg";;
+ --with-icu) with_icu_layout="2";with_icu_sort="2";;
+ --without-icu) with_icu_layout="0";with_icu_sort="0";;
+ --with-icu=*) with_icu_layout="$optarg";with_icu_sort="$optarg";;
+ --with-libicu) with_icu_layout="2";with_icu_sort="2";;
+ --without-libicu) with_icu_layout="0";with_icu_sort="0";;
+ --with-libicu=*) with_icu_layout="$optarg";with_icu_sort="$optarg";;
+ --with-icu-layout) with_icu_layout="2";;
+ --without-icu-layout) with_icu_layout="0";;
+ --with-icu-layout=*) with_icu_layout="$optarg";;
+ --with-icu-sort) with_icu_sort="2";;
+ --without-icu-sort) with_icu_sort="0";;
+ --with-icu-sort=*) with_icu_sort="$optarg";;
--static-icu) static_icu="1";;
--static-icu=*) static_icu="$optarg";;
--static-libicu) static_icu="1";;
@@ -526,10 +538,10 @@ check_params() {
log 1 " PREPROCESSOR is only available for OSX"
exit 1
fi
- # OS only allows DETECT, UNIX, OSX, FREEBSD, OPENBSD, MORPHOS, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP
- if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP)$'`" ]; then
+ # OS only allows DETECT, UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, MORPHOS, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP
+ if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP)$'`" ]; then
log 1 "configure: error: invalid option --os=$os"
- log 1 " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP]"
+ log 1 " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|DRAGONFLY|OPENBSD|NETBSD|HPUX|MORPHOS|BEOS|HAIKU|SUNOS|CYGWIN|MINGW|OS2|DOS|WINCE|PSP]"
exit 1
fi
# cpu_type can be either 32 or 64
@@ -787,7 +799,7 @@ check_params() {
pre_detect_with_zlib=$with_zlib
detect_zlib
- if [ "$with_zlib" = "0" ] || [ -z "$zlib" ]; then
+ if [ "$with_zlib" = "0" ] || [ -z "$zlib-config" ]; then
log 1 "WARNING: zlib was not detected or disabled"
log 1 "WARNING: OpenTTD doesn't require zlib, but it does mean that many features"
log 1 "WARNING: (like loading most old savegames/scenarios, loading heightmaps,"
@@ -838,7 +850,8 @@ check_params() {
detect_png
detect_freetype
detect_fontconfig
- detect_icu
+ detect_icu_layout
+ detect_icu_sort
detect_pspconfig
detect_libtimidity
@@ -1054,7 +1067,7 @@ check_params() {
fi
if [ "$doc_dir" = "1" ]; then
- if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
+ if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
doc_dir="share/doc/openttd"
else
doc_dir="$data_dir/docs"
@@ -1064,7 +1077,7 @@ check_params() {
fi
if [ "$icon_theme_dir" = "1" ]; then
- if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
+ if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
icon_theme_dir="share/icons/hicolor"
else
icon_theme_dir=""
@@ -1098,7 +1111,7 @@ check_params() {
if [ "$man_dir" = "1" ]; then
# add manpage on UNIX systems
- if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OSX" ]; then
+ if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OSX" ]; then
man_dir="share/man/man6"
else
man_dir=""
@@ -1109,7 +1122,7 @@ check_params() {
if [ "$menu_dir" = "1" ]; then
# add a freedesktop menu item only for some UNIX systems
- if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
+ if [ "$os" = "UNIX" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ]; then
menu_dir="share/applications"
else
menu_dir=""
@@ -1272,7 +1285,7 @@ make_compiler_cflags() {
# -W alone doesn't enable all warnings enabled by -Wall; on the other hand,
# -Weverything enables too many useless warnings that can't be disabled (as of 3.0)
- flags="$flags -Wall -W"
+ flags="$flags -Wall -W -Wextra"
# warning: unused parameter '...'
flags="$flags -Wno-unused-parameter"
@@ -1313,13 +1326,20 @@ make_compiler_cflags() {
flags="$flags -Wno-unused-variable"
fi
+ if [ "$cc_version" -ge "33" ]; then
+ # clang completed C++11 support in version 3.3
+ flags="$flags -std=c++11"
+ fi
+
# rdynamic is used to get useful stack traces from crash reports.
ldflags="$ldflags -rdynamic"
else
# Enable some things only for certain GCC versions
- cc_version=`$1 -dumpversion | cut -c 1,3`
+ # cc_version = major_version * 100 + minor_version
+ # For example: "3.3" -> 303, "4.9.2" -> 409, "6" -> 600, "23.5" -> 2305
+ cc_version=`$1 -dumpversion | $awk -F . '{printf "%d%02d", $1, $2}'`
- if [ $cc_version -lt 33 ]; then
+ if [ $cc_version -lt 303 ]; then
log 1 "configure: error: gcc older than 3.3 can't compile OpenTTD because of its poor template support"
exit 1
fi
@@ -1332,20 +1352,20 @@ make_compiler_cflags() {
if [ $enable_assert -eq 0 ]; then
# Do not warn about unused variables when building without asserts
flags="$flags -Wno-unused-variable"
- if [ $cc_version -ge 46 ]; then
+ if [ $cc_version -ge 406 ]; then
# GCC 4.6 gives more warnings, disable them too
flags="$flags -Wno-unused-but-set-variable"
flags="$flags -Wno-unused-but-set-parameter"
fi
fi
- if [ $cc_version -ge 34 ]; then
+ if [ $cc_version -ge 304 ]; then
# Warn when a variable is used to initialise itself:
# int a = a;
flags="$flags -Winit-self"
fi
- if [ $cc_version -ge 40 ]; then
+ if [ $cc_version -ge 400 ]; then
# GCC 4.0+ complains about that we break strict-aliasing.
# On most places we don't see how to fix it, and it doesn't
# break anything. So disable strict-aliasing to make the
@@ -1356,7 +1376,7 @@ make_compiler_cflags() {
flags="$flags -Wcast-qual"
fi
- if [ $cc_version -ge 42 ]; then
+ if [ $cc_version -ge 402 ]; then
# GCC 4.2+ automatically assumes that signed overflows do
# not occur in signed arithmetics, whereas we are not
# sure that they will not happen. It furthermore complains
@@ -1367,33 +1387,42 @@ make_compiler_cflags() {
flags="$flags -Wnon-virtual-dtor"
fi
- if [ $cc_version -ge 43 ]; then
+ if [ $cc_version -ge 403 ] && [ $cc_version -lt 600 ]; then
# Use gnu++0x mode so static_assert() is available.
# Don't use c++0x, it breaks mingw (with gcc 4.4.0).
cxxflags="$cxxflags -std=gnu++0x"
fi
- if [ $cc_version -eq 45 ]; then
+ if [ $cc_version -eq 405 ]; then
# Prevent optimisation supposing enums are in a range specified by the standard
# For details, see http://gcc.gnu.org/PR43680
flags="$flags -fno-tree-vrp"
fi
- if [ $cc_version -ge 47 ]; then
+ if [ $cc_version -eq 407 ]; then
# Disable -Wnarrowing which gives many warnings, such as:
# warning: narrowing conversion of '...' from 'unsigned int' to 'int' inside { } [-Wnarrowing]
# They are valid according to the C++ standard, but useless.
cxxflags="$cxxflags -Wno-narrowing"
+ fi
+
+ if [ $cc_version -ge 407 ]; then
# Disable bogus 'attempt to free a non-heap object' warning
flags="$flags -Wno-free-nonheap-object"
fi
+ if [ $cc_version -ge 600 ]; then
+ # -flifetime-dse=2 (default since GCC 6) doesn't play
+ # well with our custom pool item allocator
+ cxxflags="$cxxflags -flifetime-dse=1 -std=gnu++14"
+ fi
+
if [ "$enable_lto" != "0" ]; then
# GCC 4.5 outputs '%{flto}', GCC 4.6 outputs '%{flto*}'
has_lto=`$1 -dumpspecs | grep '\%{flto'`
if [ -n "$has_lto" ]; then
# Use LTO only if we see LTO exists and is requested
- if [ $cc_version -lt 46 ]; then
+ if [ $cc_version -lt 406 ]; then
flags="$flags -flto"
else
flags="$flags -flto=jobserver"
@@ -1477,7 +1506,7 @@ make_cflags_and_ldflags() {
fi
if [ $enable_debug -le 2 ]; then
- cc_host_is_gcc=`basename "$cc_host" | grep "gcc" &>/dev/null`
+ cc_host_is_gcc=`basename "$cc_host" | grep "gcc" 2>/dev/null`
if [ -n "$cc_host_is_gcc" ]; then
# Define only when compiling with GCC. Some GLIBC versions use GNU
# extensions in a way that breaks build with at least ICC.
@@ -1485,14 +1514,14 @@ make_cflags_and_ldflags() {
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
fi
- cc_build_is_gcc=`basename "$cc_build" | grep "gcc" &>/dev/null`
+ cc_build_is_gcc=`basename "$cc_build" | grep "gcc" 2>/dev/null`
if [ -n "$cc_build_is_gcc" ]; then
# Just add -O1 to the tools needed for building.
CFLAGS_BUILD="$CFLAGS_BUILD -D_FORTIFY_SOURCE=2 -O1"
fi
fi
- if [ "$os" = "OSX" ] && [ $cc_version -eq 40 ]; then
+ if [ "$os" = "OSX" ] && [ $cc_version -eq 400 ]; then
# Apple's GCC 4.0 has a compiler bug for x86_64 with (higher) optimization,
# wrongly optimizing ^= in loops. This disables the failing optimisation.
CFLAGS="$CFLAGS -fno-expensive-optimizations"
@@ -1516,7 +1545,7 @@ make_cflags_and_ldflags() {
LDFLAGS="$LDFLAGS -mwin32"
fi
if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then
- if [ $cc_version -lt 46 ]; then
+ if [ $cc_version -lt 406 ]; then
flags="$flags -mno-cygwin"
LDFLAGS="$LDFLAGS -mno-cygwin"
fi
@@ -1529,16 +1558,16 @@ make_cflags_and_ldflags() {
LIBS="$LIBS -lws2_32 -lwinmm -lgdi32 -ldxguid -lole32 -limm32"
- if [ $cc_version -ge 44 ]; then
+ if [ $cc_version -ge 404 ]; then
LDFLAGS_BUILD="$LDFLAGS_BUILD -static-libgcc -static-libstdc++"
fi
- if [ $cc_version -ge 47 ]; then
+ if [ $cc_version -ge 407 ]; then
CFLAGS="$CFLAGS -mno-ms-bitfields"
fi
fi
fi
- if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "FREEBSD" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "DOS" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ] && [ "$os" != "OS2" ]; then
+ if [ "$os" != "CYGWIN" ] && [ "$os" != "HAIKU" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "DOS" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ] && [ "$os" != "OS2" ]; then
LIBS="$LIBS -lpthread"
fi
@@ -1565,10 +1594,6 @@ make_cflags_and_ldflags() {
LIBS="$LIBS -pthread"
fi
- if [ "$os" = "FREEBSD" ]; then
- LIBS="$LIBS -lpthread"
- fi
-
if [ "$os" = "OSX" ]; then
LDFLAGS="$LDFLAGS -framework Cocoa"
@@ -1586,23 +1611,6 @@ make_cflags_and_ldflags() {
CFLAGS="$OSX_SYSROOT $CFLAGS"
LDFLAGS="$OSX_LD_SYSROOT $LDFLAGS"
fi
-
- if [ "$enable_universal" = "0" ] && [ $cc_version -gt 40 ]; then
- # Only set the min version when not doing an universal build.
- # Universal builds set the version elsewhere.
- if [ "$cpu_type" = "64" ]; then
- CFLAGS="$CFLAGS -mmacosx-version-min=10.5"
- else
- gcc_cpu=`$cc_host -dumpmachine`
- if [ "`echo $gcc_cpu | cut -c 1-3`" = "ppc" -o "`echo $gcc_cpu | cut -c 1-7`" = "powerpc" ]; then
- # PowerPC build can run on 10.3
- CFLAGS="$CFLAGS -mmacosx-version-min=10.3"
- else
- # Intel is only available starting from 10.4
- CFLAGS="$CFLAGS -mmacosx-version-min=10.4"
- fi
- fi
- fi
fi
if [ "$os" = "BEOS" ] || [ "$os" = "HAIKU" ]; then
@@ -1610,7 +1618,7 @@ make_cflags_and_ldflags() {
fi
# Most targets act like UNIX, just with some additions
- if [ "$os" = "BEOS" ] || [ "$os" = "HAIKU" ] || [ "$os" = "OSX" ] || [ "$os" = "MORPHOS" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OS2" ]; then
+ if [ "$os" = "BEOS" ] || [ "$os" = "HAIKU" ] || [ "$os" = "OSX" ] || [ "$os" = "MORPHOS" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "DRAGONFLY" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "NETBSD" ] || [ "$os" = "HPUX" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OS2" ]; then
CFLAGS="$CFLAGS -DUNIX"
fi
# And others like Windows
@@ -1657,12 +1665,13 @@ make_cflags_and_ldflags() {
fi
if [ "$with_zlib" != "0" ]; then
- if [ "$enable_static" != "0" ] && [ "$os" != "OSX" ]; then
- LIBS="$LIBS $zlib"
- else
- LIBS="$LIBS -lz"
- fi
CFLAGS="$CFLAGS -DWITH_ZLIB"
+ CFLAGS="$CFLAGS `$zlib_config --cflags | tr '\n\r' ' '`"
+ if [ "$enable_static" != "0" ]; then
+ LIBS="$LIBS `$zlib_config --libs --static | tr '\n\r' ' '`"
+ else
+ LIBS="$LIBS `$zlib_config --libs | tr '\n\r' ' '`"
+ fi
fi
if [ -n "$lzma_config" ]; then
@@ -1708,13 +1717,7 @@ make_cflags_and_ldflags() {
CFLAGS="$CFLAGS `$png_config --cflags | tr '\n\r' ' '`"
if [ "$enable_static" != "0" ]; then
- if [ "$os" = "OSX" ]; then
- # fontconfig_config goes via pkg-config on all systems, which doesn't know --prefix
- # 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
- LIBS="$LIBS `$png_config --libs --static | tr '\n\r' ' '`"
- fi
+ LIBS="$LIBS `$png_config --libs --static | tr '\n\r' ' '`"
else
LIBS="$LIBS `$png_config --libs | tr '\n\r' ' '`"
fi
@@ -1725,13 +1728,7 @@ make_cflags_and_ldflags() {
CFLAGS="$CFLAGS `$fontconfig_config --cflags | tr '\n\r' ' '`"
if [ "$enable_static" != "0" ]; then
- if [ "$os" = "OSX" ]; then
- # fontconfig_config goes via pkg-config on all systems, which doesn't know --prefix
- # 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 `$fontconfig_config --variable=prefix`/lib/libfontconfig.a `$fontconfig_config --libs --static | sed s@-lfontconfig@@`"
- else
- LIBS="$LIBS `$fontconfig_config --libs --static | tr '\n\r' ' '`"
- fi
+ LIBS="$LIBS `$fontconfig_config --libs --static | tr '\n\r' ' '`"
else
LIBS="$LIBS `$fontconfig_config --libs | tr '\n\r' ' '`"
fi
@@ -1742,26 +1739,31 @@ make_cflags_and_ldflags() {
CFLAGS="$CFLAGS `$freetype_config --cflags | tr '\n\r' ' '`"
if [ "$enable_static" != "0" ]; then
- if [ "$os" = "OSX" ]; then
- LIBS="$LIBS `$freetype_config --prefix`/lib/libfreetype.a"
- else
- # Is it possible to do static with freetype, if so: how?
- LIBS="$LIBS `$freetype_config --libs | tr '\n\r' ' '`"
- fi
+ LIBS="$LIBS `$freetype_config --libs --static | tr '\n\r' ' '`"
else
LIBS="$LIBS `$freetype_config --libs | tr '\n\r' ' '`"
fi
fi
- if [ -n "$icu_config" ]; then
- CFLAGS="$CFLAGS -DWITH_ICU"
- CFLAGS="$CFLAGS `$icu_config --cppflags | tr '\n\r' ' '`"
+ if [ -n "$icu_layout_config" ]; then
+ CFLAGS="$CFLAGS -DWITH_ICU_LAYOUT"
+ CFLAGS="$CFLAGS `$icu_layout_config --cflags | tr '\n\r' ' '`"
- # Some icu-configs have the 'feature' of not adding a space where others do add the space
if [ "$static_icu" != "0" ]; then
- LIBS="$LIBS `$icu_config --ldflags-searchpath` `($icu_config --ldflags-libsonly; $icu_config --ldflags-layout) | tr '\n\r' ' ' | sed s/licu/lsicu/g`"
+ LIBS="$LIBS `$icu_layout_config --libs --static | tr '\n\r' ' ' | sed s/-licu/-lsicu/g`"
else
- LIBS="$LIBS `$icu_config --ldflags-searchpath` `($icu_config --ldflags-libsonly; $icu_config --ldflags-layout) | tr '\n\r' ' '`"
+ LIBS="$LIBS `$icu_layout_config --libs | tr '\n\r' ' '`"
+ fi
+ fi
+
+ if [ -n "$icu_sort_config" ]; then
+ CFLAGS="$CFLAGS -DWITH_ICU_SORT"
+ CFLAGS="$CFLAGS `$icu_sort_config --cflags | tr '\n\r' ' '`"
+
+ if [ "$static_icu" != "0" ]; then
+ LIBS="$LIBS `$icu_sort_config --libs --static | tr '\n\r' ' ' | sed s/-licu/-lsicu/g`"
+ else
+ LIBS="$LIBS `$icu_sort_config --libs | tr '\n\r' ' '`"
fi
fi
@@ -1771,18 +1773,20 @@ make_cflags_and_ldflags() {
# GCC 4.0+ doesn't like the DirectX includes (gives tons of
# warnings on it we won't be able to fix). For now just
# suppress those warnings.
- if [ $cc_version -ge 40 ]; then
+ if [ $cc_version -ge 400 ]; then
CFLAGS="$CFLAGS -Wno-non-virtual-dtor"
fi
fi
- if [ -n "$libtimidity" ]; then
- if [ "$enable_static" != "0" ]; then
- LIBS="$LIBS $libtimidity"
- else
- LIBS="$LIBS -ltimidity"
- fi
+ if [ -n "$libtimidity_config" ]; then
CFLAGS="$CFLAGS -DLIBTIMIDITY"
+ CFLAGS="$CFLAGS `$libtimidity_config --cflags | tr '\n\r' ' '`"
+
+ if [ "$enable_static" != "0" ]; then
+ LIBS="$LIBS `$libtimidity_config --libs --static | tr '\n\r' ' '`"
+ else
+ LIBS="$LIBS `$libtimidity_config --libs | tr '\n\r' ' '`"
+ fi
fi
if [ "$with_iconv" != "0" ]; then
@@ -1942,9 +1946,26 @@ check_compiler() {
log 2 " exit code $ret"
if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then
- log 1 "checking $1... $compiler not found"
- log 1 "I couldn't detect any $6 binary for $3"
- exit 1
+ if [ -z "$5" ]; then
+ log 1 "checking $1... $compiler not found"
+ log 1 "I couldn't detect any $6 binary for $3"
+ exit 1
+ else
+ compiler="$3-$5"
+ fi
+ machine=`eval $compiler $9 2>/dev/null`
+ ret=$?
+ eval "$2=\"$compiler\""
+
+ log 2 "executing $compiler $9"
+ log 2 " returned $machine"
+ log 2 " exit code $ret"
+
+ if ( [ -z "$machine" ] && [ "$8" != "3" ] ) || [ "$ret" != "0" ]; then
+ log 1 "checking $1... $compiler not found"
+ log 1 "I couldn't detect any $5 binary for $3"
+ exit 1
+ fi
fi
if [ "$machine" != "$3" ] && ( [ "$8" = "0" ] || [ "$8" = "1" ] ); then
@@ -2268,52 +2289,54 @@ detect_awk() {
detect_os() {
if [ "$os" = "DETECT" ]; then
- # Detect UNIX, OSX, FREEBSD, OPENBSD, NETBSD, HPUX, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP
+ # Detect UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, HPUX, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP
# Try first via dumpmachine, then via uname
os=`echo "$host" | tr '[A-Z]' '[a-z]' | $awk '
- /linux/ { print "UNIX"; exit}
- /darwin/ { print "OSX"; exit}
- /freebsd/ { print "FREEBSD"; exit}
- /openbsd/ { print "OPENBSD"; exit}
- /netbsd/ { print "NETBSD"; exit}
- /hp-ux/ { print "HPUX"; exit}
- /morphos/ { print "MORPHOS"; exit}
- /beos/ { print "BEOS"; exit}
- /haiku/ { print "HAIKU"; exit}
- /sunos/ { print "SUNOS"; exit}
- /solaris/ { print "SUNOS"; exit}
- /cygwin/ { print "CYGWIN"; exit}
- /mingw/ { print "MINGW"; exit}
- /os2/ { print "OS2"; exit}
- /dos/ { print "DOS"; exit}
- /wince/ { print "WINCE"; exit}
- /psp/ { print "PSP"; exit}
+ /linux/ { print "UNIX"; exit}
+ /darwin/ { print "OSX"; exit}
+ /freebsd/ { print "FREEBSD"; exit}
+ /dragonfly/ { print "DRAGONFLY"; exit}
+ /openbsd/ { print "OPENBSD"; exit}
+ /netbsd/ { print "NETBSD"; exit}
+ /hp-ux/ { print "HPUX"; exit}
+ /morphos/ { print "MORPHOS"; exit}
+ /beos/ { print "BEOS"; exit}
+ /haiku/ { print "HAIKU"; exit}
+ /sunos/ { print "SUNOS"; exit}
+ /solaris/ { print "SUNOS"; exit}
+ /cygwin/ { print "CYGWIN"; exit}
+ /mingw/ { print "MINGW"; exit}
+ /os2/ { print "OS2"; exit}
+ /dos/ { print "DOS"; exit}
+ /wince/ { print "WINCE"; exit}
+ /psp/ { print "PSP"; exit}
'`
if [ -z "$os" ]; then
os=`LC_ALL=C uname | tr '[A-Z]' '[a-z]' | $awk '
- /linux/ { print "UNIX"; exit}
- /darwin/ { print "OSX"; exit}
- /freebsd/ { print "FREEBSD"; exit}
- /openbsd/ { print "OPENBSD"; exit}
- /netbsd/ { print "NETBSD"; exit}
- /hp-ux/ { print "HPUX"; exit}
- /morphos/ { print "MORPHOS"; exit}
- /beos/ { print "BEOS"; exit}
- /haiku/ { print "HAIKU"; exit}
- /sunos/ { print "SUNOS"; exit}
- /cygwin/ { print "CYGWIN"; exit}
- /mingw/ { print "MINGW"; exit}
- /os\/2/ { print "OS2"; exit}
- /gnu/ { print "UNIX"; exit}
+ /linux/ { print "UNIX"; exit}
+ /darwin/ { print "OSX"; exit}
+ /freebsd/ { print "FREEBSD"; exit}
+ /dragonfly/ { print "DRAGONFLY"; exit}
+ /openbsd/ { print "OPENBSD"; exit}
+ /netbsd/ { print "NETBSD"; exit}
+ /hp-ux/ { print "HPUX"; exit}
+ /morphos/ { print "MORPHOS"; exit}
+ /beos/ { print "BEOS"; exit}
+ /haiku/ { print "HAIKU"; exit}
+ /sunos/ { print "SUNOS"; exit}
+ /cygwin/ { print "CYGWIN"; exit}
+ /mingw/ { print "MINGW"; exit}
+ /os\/2/ { print "OS2"; exit}
+ /gnu/ { print "UNIX"; exit}
'`
fi
if [ -z "$os" ]; then
log 1 "detecting OS... none detected"
log 1 "I couldn't detect your OS. Please use --os=OS to force one"
- log 1 "Allowed values are: UNIX, OSX, FREEBSD, OPENBSD, NETBSD, MORPHOS, HPUX, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP"
+ log 1 "Allowed values are: UNIX, OSX, FREEBSD, DRAGONFLY, OPENBSD, NETBSD, MORPHOS, HPUX, BEOS, HAIKU, SUNOS, CYGWIN, MINGW, OS2, DOS, WINCE, and PSP"
exit 1
fi
@@ -2351,7 +2374,7 @@ detect_allegro() {
return 0
fi
- # By default on OSX we don't use SDL. The rest is auto-detect
+ # By default on OSX we don't use Allegro. The rest is auto-detect
if [ "$with_allegro" = "1" ] && [ "$os" = "OSX" ] && [ "$with_cocoa" != "0" ]; then
log 1 "checking Allegro... OSX, skipping"
@@ -2359,33 +2382,7 @@ detect_allegro() {
return 0
fi
- if [ "$with_allegro" = "1" ] || [ "$with_allegro" = "" ] || [ "$with_allegro" = "2" ]; then
- allegro_config="allegro-config"
- else
- allegro_config="$with_allegro"
- fi
-
- version=`$allegro_config --version 2>/dev/null`
- ret=$?
- log 2 "executing $allegro_config --version"
- log 2 " returned $version"
- log 2 " exit code $ret"
-
- if [ -z "$version" ] || [ "$ret" != "0" ]; then
- log 1 "checking Allegro... not found"
-
- # It was forced, so it should be found.
- if [ "$with_allegro" != "1" ]; then
- log 1 "configure: error: allegro-config couldn't be found"
- log 1 "configure: error: you supplied '$with_allegro', but it seems invalid"
- exit 1
- fi
-
- allegro_config=""
- return 0
- fi
-
- log 1 "checking Allegro... found"
+ detect_pkg_config "$with_allegro" "allegro" "allegro_config" "4.4"
}
@@ -2431,33 +2428,7 @@ detect_sdl() {
sleep 5
fi
- if [ "$with_sdl" = "1" ] || [ "$with_sdl" = "" ] || [ "$with_sdl" = "2" ]; then
- sdl_config="sdl-config"
- else
- sdl_config="$with_sdl"
- fi
-
- version=`$sdl_config --version 2>/dev/null`
- ret=$?
- log 2 "executing $sdl_config --version"
- log 2 " returned $version"
- log 2 " exit code $ret"
-
- if [ -z "$version" ] || [ "$ret" != "0" ]; then
- log 1 "checking SDL... not found"
-
- # It was forced, so it should be found.
- if [ "$with_sdl" != "1" ]; then
- log 1 "configure: error: sdl-config couldn't be found"
- log 1 "configure: error: you supplied '$with_sdl', but it seems invalid"
- exit 1
- fi
-
- sdl_config=""
- return 0
- fi
-
- log 1 "checking SDL... found"
+ detect_pkg_config "$with_sdl" "sdl" "sdl_config" "1.2"
}
detect_osx_sdk() {
@@ -2638,10 +2609,13 @@ detect_library() {
fi
fi
if [ -z "$res" ] && [ "$os" = "HAIKU" ]; then
- eval "$2=`ls -1 /boot/common/include/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
+ if [ -z "$includeDir" ]; then
+ includeDir=`finddir B_SYSTEM_HEADERS_DIRECTORY`
+ fi
+ eval "$2=`ls -1 $includeDir/$4*.h 2>/dev/null | egrep \"\/$5\$\"`"
eval "res=\$$2"
if [ -z "$res" ]; then
- log 2 " trying /boot/common/include/$4$5... no"
+ log 2 " trying $includeDir/$4$5... no"
fi
fi
@@ -2710,7 +2684,7 @@ detect_library() {
}
detect_zlib() {
- detect_library "$with_zlib" "zlib" "libz.a" "" "zlib.h"
+ detect_pkg_config "$with_zlib" "zlib" "zlib_config" "1.2"
}
detect_lzo2() {
@@ -2718,7 +2692,7 @@ detect_lzo2() {
}
detect_libtimidity() {
- detect_library "$with_libtimidity" "libtimidity" "libtimidity.a" "" "timidity.h"
+ detect_pkg_config "$with_libtimidity" "libtimidity" "libtimidity_config" "0.1" "1"
}
detect_pkg_config() {
@@ -2726,6 +2700,7 @@ detect_pkg_config() {
# $2 - package name ('liblzma')
# $3 - config name ('lzma_config', sets $lzma_config)
# $4 - minimum module version ('2.3')
+ # $5 - check for dedicated, 1 is "skif if dedicated"
# 0 means no, 1 is auto-detect, 2 is force
if [ "$1" = "0" ]; then
@@ -2735,10 +2710,17 @@ detect_pkg_config() {
return 0
fi
+ if [ "$5" = "1" ] && [ "$1" = "1" ] && [ "$enable_dedicated" != "0" ]; then
+ log 1 "checking $2... dedicated server, skipping"
+
+ eval "$3=\"\""
+ return 0
+ fi
+
log 2 "detecting $2"
if [ "$1" = "1" ] || [ "$1" = "" ] || [ "$1" = "2" ]; then
- pkg_config_call="pkg-config $2"
+ pkg_config_call="$pkg_config $2"
else
pkg_config_call="$1"
fi
@@ -2760,7 +2742,7 @@ detect_pkg_config() {
# It was forced, so it should be found.
if [ "$1" != "1" ]; then
- log 1 "configure: error: pkg-config $2 couldn't be found"
+ log 1 "configure: error: $pkg_config $2 couldn't be found"
log 1 "configure: error: you supplied '$1', but it seems invalid"
exit 1
fi
@@ -2782,89 +2764,11 @@ detect_xdg_basedir() {
}
detect_png() {
- # 0 means no, 1 is auto-detect, 2 is force
- if [ "$with_png" = "0" ]; then
- log 1 "checking libpng... disabled"
-
- png_config=""
- return 0
- fi
-
- if [ "$with_zlib" = "0" ] || [ -z "$zlib" ]; then
- if [ "$with_png" != "1" ]; then
- log 1 "checking libpng... no zlib"
- log 1 "ERROR: libpng was forced, but zlib was not detected / disabled."
- log 1 "ERROR: libpng depends on zlib."
-
- exit 1
- fi
-
- log 1 "checking libpng... no zlib, skipping"
-
- png_config=""
- return 0
- fi
-
detect_pkg_config "$with_png" "libpng" "png_config" "1.2"
}
detect_freetype() {
- # 0 means no, 1 is auto-detect, 2 is force
- if [ "$with_freetype" = "0" ]; then
- log 1 "checking libfreetype... disabled"
-
- freetype_config=""
- return 0
- fi
- if [ "$with_freetype" = "1" ] && [ "$enable_dedicated" != "0" ]; then
- log 1 "checking libfreetype... dedicated server, skipping"
-
- freetype_config=""
- return 0
- fi
-
- if [ "$with_zlib" = "0" ] || [ -z "$zlib" ]; then
- if [ "$with_freetype" != "1" ]; then
- log 1 "checking libfreetype... no zlib"
- log 1 "ERROR: libfreetype was forced, but zlib was not detected / disabled."
- log 1 "ERROR: libfreetype depends on zlib."
-
- exit 1
- fi
-
- log 1 "checking libfreetype... no zlib, skipping"
-
- freetype_config=""
- return 0
- fi
-
- if [ "$with_freetype" = "1" ] || [ "$with_freetype" = "" ] || [ "$with_freetype" = "2" ]; then
- freetype_config="freetype-config"
- else
- freetype_config="$with_freetype"
- fi
-
- version=`$freetype_config --version 2>/dev/null`
- ret=$?
- log 2 "executing freetype_config --version"
- log 2 " returned $version"
- log 2 " exit code $ret"
-
- if [ -z "$version" ] || [ "$ret" != "0" ]; then
- log 1 "checking libfreetype... not found"
-
- # It was forced, so it should be found.
- if [ "$with_freetype" != "1" ]; then
- log 1 "configure: error: freetype-config couldn't be found"
- log 1 "configure: error: you supplied '$with_freetype', but it seems invalid"
- exit 1
- fi
-
- freetype_config=""
- return 0
- fi
-
- log 1 "checking libfreetype... found"
+ detect_pkg_config "$with_freetype" "freetype2" "freetype_config" "2.2" "1"
}
detect_fontconfig() {
@@ -2875,19 +2779,6 @@ detect_fontconfig() {
fontconfig_config=""
return 0
fi
- if [ "$with_fontconfig" = "1" ] && [ "$enable_dedicated" != "0" ]; then
- log 1 "checking libfontconfig... dedicated server, skipping"
-
- fontconfig_config=""
- return 0
- fi
- if [ "$with_fontconfig" != "2" ] && [ -z "$freetype_config" ]; then
- log 1 "checking libfontconfig... no freetype, skipping"
-
- fontconfig_config=""
- return 0
- fi
-
if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ] || [ "$os" = "WINCE" ]; then
log 1 "checking libfontconfig... WIN32, skipping"
fontconfig_config=""
@@ -2900,57 +2791,15 @@ detect_fontconfig() {
return 0
fi
- detect_pkg_config "$with_fontconfig" "fontconfig" "fontconfig_config" "2.3"
+ detect_pkg_config "$with_fontconfig" "fontconfig" "fontconfig_config" "2.3" "1"
}
-detect_icu() {
- # 0 means no, 1 is auto-detect, 2 is force
- if [ "$with_icu" = "0" ]; then
- log 1 "checking libicu... disabled"
+detect_icu_layout() {
+ detect_pkg_config "$with_icu_layout" "icu-lx" "icu_layout_config" "4.8" "1"
+}
- icu_config=""
- return 0
- fi
- if [ "$with_icu" = "1" ] && [ "$enable_dedicated" != "0" ]; then
- log 1 "checking libicu... dedicated server, skipping"
-
- icu_config=""
- return 0
- fi
-
- if [ "$with_icu" = "1" ] || [ "$with_icu" = "" ] || [ "$with_icu" = "2" ]; then
- icu_config="icu-config"
- else
- icu_config="$with_icu"
- fi
-
- version=`$icu_config --version 2>/dev/null`
- ret=$?
- check_version '3.6' "$version"
- version_ok=$?
- log 2 "executing $icu_config --version"
- 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 libicu... needs at least version 3.6.0, icu NOT enabled"
- else
- log 1 "checking libicu... not found"
- fi
-
- # It was forced, so it should be found.
- if [ "$with_icu" != "1" ]; then
- log 1 "configure: error: icu-config couldn't be found"
- log 1 "configure: error: you supplied '$with_icuconfig', but it seems invalid"
- exit 1
- fi
-
- icu_config=""
- return 0
- fi
-
- log 1 "checking libicu... found"
+detect_icu_sort() {
+ detect_pkg_config "$with_icu_sort" "icu-i18n" "icu_sort_config" "4.8" "1"
}
detect_pspconfig() {
@@ -3590,11 +3439,12 @@ showhelp() {
echo " --windres=WINDRES the windres to use [HOST-windres]"
echo " --strip=STRIP the strip to use [HOST-strip]"
echo " --awk=AWK the awk to use in configure [awk]"
+ echo " --pkg-config=PKG-CONFIG the pkg-config to use in configure [pkg-config]"
echo " --lipo=LIPO the lipo to use (OSX ONLY) [HOST-lipo]"
echo " --os=OS the OS we are compiling for [DETECT]"
- echo " DETECT/UNIX/OSX/FREEBSD/OPENBSD/NETBSD/"
- echo " MORPHOS/HPUX/BEOS/SUNOS/CYGWIN/MINGW/OS2/"
- echo " DOS/WINCE/PSP/HAIKU"
+ echo " DETECT/UNIX/OSX/FREEBSD/DRAGONFLY/OPENBSD/"
+ echo " NETBSD/MORPHOS/HPUX/BEOS/SUNOS/CYGWIN/"
+ echo " MINGW/OS2/DOS/WINCE/PSP/HAIKU"
echo " --endian=ENDIAN set the endian of the HOST (AUTO/LE/BE)"
echo ""
echo "Paths:"
@@ -3664,23 +3514,30 @@ showhelp() {
echo " --with-midi=midi define which midi-player to use"
echo " --with-midi-arg=arg define which args to use for the"
echo " midi-player"
- echo " --with-libtimidity enables libtimidity support"
- echo " --with-allegro[=allegro-config]"
+ echo " --with-libtimidity[=\"pkg-config libtimidity\"]"
+ echo " enables libtimidity support"
+ echo " --with-allegro[=\"pkg-config allegro\"]"
echo " enables Allegro video driver support"
echo " --with-cocoa enables COCOA video driver (OSX ONLY)"
- echo " --with-sdl[=sdl-config] enables SDL video driver support"
- echo " --with-zlib[=zlib.a] enables zlib support"
+ echo " --with-sdl[=\"pkg-config sdl\"] enables SDL video driver support"
+ echo " --with-zlib[=\"pkg-config zlib\"]"
+ echo " enables zlib support"
echo " --with-liblzma[=\"pkg-config liblzma\"]"
echo " enables liblzma support"
echo " --with-liblzo2[=liblzo2.a] enables liblzo2 support"
- echo " --with-png[=libpng-config] enables libpng support"
- echo " --with-freetype[=freetype-config]"
+ echo " --with-png[=\"pkg-config libpng\"]"
+ echo " enables libpng support"
+ echo " --with-freetype[=\"pkg-config freetype2\"]"
echo " enables libfreetype support"
echo " --with-fontconfig[=\"pkg-config fontconfig\"]"
echo " enables fontconfig support"
echo " --with-xdg-basedir[=\"pkg-config libxdg-basedir\"]"
echo " enables XDG base directory support"
- echo " --with-icu[=icu-config] enables icu (used for right-to-left support)"
+ echo " --with-icu enables icu components for layout and sorting"
+ echo " --with-icu-layout[=\"pkg-config icu-lx\"]"
+ echo " enables icu components for layouting (right-to-left support)"
+ echo " --with-icu-sort[=\"pkg-config icu-i18n\"]"
+ echo " enables icu components for locale specific string sorting"
echo " --static-icu try to link statically (libsicu instead of"
echo " libicu; can fail as the new name is guessed)"
echo " --with-iconv[=iconv-path] enables iconv support"
diff --git a/configure b/configure
index 6b2c9d87b7..5edbca1867 100755
--- a/configure
+++ b/configure
@@ -149,7 +149,7 @@ AWKCOMMAND='
# Read the source.list and process it
# Please escape ALL " within ` because e.g. "" terminates the string in some sh implementations
-SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | $awk \"$AWKCOMMAND\" | $PIPE_SORT`"
+SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | $awk \"$AWKCOMMAND\" | LC_ALL=C $PIPE_SORT`"
OBJS_C="` echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.c$/ { gsub(\".c$\", \".o\", $0); print $0; }'`"
OBJS_CPP="`echo \"$SRCS\" | $awk ' { ORS = \" \" } /\.cpp$/ { gsub(\".cpp$\", \".o\", $0); print $0; }'`"
diff --git a/known-bugs.txt b/known-bugs.txt
index 34aca33002..f5ae731018 100644
--- a/known-bugs.txt
+++ b/known-bugs.txt
@@ -1,6 +1,6 @@
OpenTTD's known bugs
-Last updated: 2015-02-24
-Release version: 1.5.0-beta2
+Last updated: 2016-07-01
+Release version: 1.6.1
------------------------------------------------------------------------
diff --git a/media/baseset/orig_dos.obg b/media/baseset/orig_dos.obg
index b4cde64007..f9db843af1 100644
--- a/media/baseset/orig_dos.obg
+++ b/media/baseset/orig_dos.obg
@@ -11,21 +11,21 @@ palette = DOS
!! description STR_BASEGRAPHICS_DOS_DESCRIPTION
[files]
-base = TRG1.GRF
-logos = TRGI.GRF
-arctic = TRGC.GRF
-tropical = TRGH.GRF
-toyland = TRGT.GRF
-extra = OPENTTD.GRF
+base = TRG1.GRF
+logos = TRGI.GRF
+arctic = TRGC.GRF
+tropical = TRGH.GRF
+toyland = TRGT.GRF
+extra = ORIG_EXTRA.GRF
[md5s]
-TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
-TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
-TRGC.GRF = ed446637e034104c5559b32c18afe78d
-TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
-TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
-OPENTTD.GRF =
+TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
+TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
+TRGC.GRF = ed446637e034104c5559b32c18afe78d
+TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
+TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
+ORIG_EXTRA.GRF =
[origin]
-default = You can find it on your Transport Tycoon Deluxe CD-ROM.
-OPENTTD.GRF = This file was part of your OpenTTD installation.
+default = You can find it on your Transport Tycoon Deluxe CD-ROM.
+ORIG_EXTRA.GRF = This file was part of your OpenTTD installation.
diff --git a/media/baseset/orig_dos_de.obg b/media/baseset/orig_dos_de.obg
index 8cfcc27074..4e12582727 100644
--- a/media/baseset/orig_dos_de.obg
+++ b/media/baseset/orig_dos_de.obg
@@ -11,21 +11,21 @@ palette = DOS
!! description STR_BASEGRAPHICS_DOS_DE_DESCRIPTION
[files]
-base = TRG1.GRF
-logos = TRGI.GRF
-arctic = TRGC.GRF
-tropical = TRGH.GRF
-toyland = TRGT.GRF
-extra = OPENTTD.GRF
+base = TRG1.GRF
+logos = TRGI.GRF
+arctic = TRGC.GRF
+tropical = TRGH.GRF
+toyland = TRGT.GRF
+extra = ORIG_EXTRA.GRF
[md5s]
-TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
-TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
-TRGC.GRF = ed446637e034104c5559b32c18afe78d
-TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
-TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
-OPENTTD.GRF =
+TRG1.GRF = 9311676280e5b14077a8ee41c1b42192
+TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
+TRGC.GRF = ed446637e034104c5559b32c18afe78d
+TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
+TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
+ORIG_EXTRA.GRF =
[origin]
-default = You can find it on your Transport Tycoon Deluxe CD-ROM.
-OPENTTD.GRF = This file was part of your OpenTTD installation.
+default = You can find it on your Transport Tycoon Deluxe CD-ROM.
+ORIG_EXTRA.GRF = This file was part of your OpenTTD installation.
diff --git a/media/baseset/orig_win.obg b/media/baseset/orig_win.obg
index 82a5c2a616..393b5d3013 100644
--- a/media/baseset/orig_win.obg
+++ b/media/baseset/orig_win.obg
@@ -11,21 +11,21 @@ palette = Windows
!! description STR_BASEGRAPHICS_WIN_DESCRIPTION
[files]
-base = TRG1R.GRF
-logos = TRGIR.GRF
-arctic = TRGCR.GRF
-tropical = TRGHR.GRF
-toyland = TRGTR.GRF
-extra = OPENTTD.GRF
+base = TRG1R.GRF
+logos = TRGIR.GRF
+arctic = TRGCR.GRF
+tropical = TRGHR.GRF
+toyland = TRGTR.GRF
+extra = ORIG_EXTRA.GRF
[md5s]
-TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358
-TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
-TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
-TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
-TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
-OPENTTD.GRF =
+TRG1R.GRF = b04ce593d8c5016e07473a743d7d3358
+TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
+TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
+TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
+TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
+ORIG_EXTRA.GRF =
[origin]
-default = You can find it on your Transport Tycoon Deluxe CD-ROM.
-OPENTTD.GRF = This file was part of your OpenTTD installation.
+default = You can find it on your Transport Tycoon Deluxe CD-ROM.
+ORIG_EXTRA.GRF = This file was part of your OpenTTD installation.
diff --git a/media/extra_grf/canals.nfo b/media/extra_grf/canals.nfo
index c0d0275f35..e464762ee6 100644
--- a/media/extra_grf/canals.nfo
+++ b/media/extra_grf/canals.nfo
@@ -6,7 +6,7 @@
// 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 .
//
- -1 * 0 0C "Canal graphics by George / PaulC"
+ -1 * 0 0C "Canal graphics by George"
-1 * 3 05 08 41
// Canal slopes
-1 sprites/canal_locks.png 8bpp 66 8 64 23 -31 0 normal
@@ -77,95 +77,3 @@
-1 sprites/canals.png 8bpp 446 10 24 16 -11 -6 normal
// Canal icon
-1 sprites/canal_locks.png 8bpp 50 232 20 20 0 0 normal
-
-// Differentiation for the climates starts here
-
-// Canal edges (arctic snowy)
- -1 * 4 01 05 01 \b12
- -1 sprites/canals.png 8bpp 30 40 45 22 -11 -1 normal
- -1 sprites/canals.png 8bpp 94 40 41 21 -8 10 normal
- -1 sprites/canals.png 8bpp 142 40 42 21 -31 10 normal
- -1 sprites/canals.png 8bpp 190 40 43 22 -31 -1 normal
- -1 sprites/canals.png 8bpp 238 40 22 22 11 4 normal
- -1 sprites/canals.png 8bpp 270 40 24 16 -11 15 normal
- -1 sprites/canals.png 8bpp 302 40 23 23 -31 4 normal
- -1 sprites/canals.png 8bpp 334 40 24 18 -11 -1 normal
- -1 sprites/canals.png 8bpp 366 40 12 11 21 10 normal
- -1 sprites/canals.png 8bpp 398 40 19 10 -8 21 normal
- -1 sprites/canals.png 8bpp 430 40 11 10 -31 10 normal
- -1 sprites/canals.png 8bpp 446 40 24 16 -11 -6 normal
- -1 * 7 02 05 10 01 00 00 00
-
-// Canal edges (arctic normal)
- -1 * 4 01 05 01 \b12
- -1 sprites/canals.png 8bpp 30 70 45 22 -11 -1 normal
- -1 sprites/canals.png 8bpp 94 70 41 21 -8 10 normal
- -1 sprites/canals.png 8bpp 142 70 42 21 -31 10 normal
- -1 sprites/canals.png 8bpp 190 70 43 22 -31 -1 normal
- -1 sprites/canals.png 8bpp 238 70 22 22 11 4 normal
- -1 sprites/canals.png 8bpp 270 70 24 16 -11 15 normal
- -1 sprites/canals.png 8bpp 302 70 23 23 -31 4 normal
- -1 sprites/canals.png 8bpp 334 70 24 18 -11 -1 normal
- -1 sprites/canals.png 8bpp 366 70 12 11 21 10 normal
- -1 sprites/canals.png 8bpp 398 70 19 10 -8 21 normal
- -1 sprites/canals.png 8bpp 430 70 11 10 -31 10 normal
- -1 sprites/canals.png 8bpp 446 70 24 16 -11 -6 normal
- -1 * 7 02 05 11 01 00 00 00
-// Choose the right arctic canal edges
- -1 * 14 02 05 12 81 81 00 FF 01 10 00 04 04 11 00
- -1 * 6 07 83 01 \7! 01 01
- -1 * 7 03 05 01 02 00 12 00
-
-// Canal edges (tropic desert)
- -1 * 4 01 05 01 \b12
- -1 sprites/canals.png 8bpp 30 100 45 22 -11 -1 normal
- -1 sprites/canals.png 8bpp 94 100 41 21 -8 10 normal
- -1 sprites/canals.png 8bpp 142 100 42 21 -31 10 normal
- -1 sprites/canals.png 8bpp 190 100 43 22 -31 -1 normal
- -1 sprites/canals.png 8bpp 238 100 22 22 11 4 normal
- -1 sprites/canals.png 8bpp 270 100 24 16 -11 15 normal
- -1 sprites/canals.png 8bpp 302 100 23 23 -31 4 normal
- -1 sprites/canals.png 8bpp 334 100 24 18 -11 -1 normal
- -1 sprites/canals.png 8bpp 366 100 12 11 21 10 normal
- -1 sprites/canals.png 8bpp 398 100 19 10 -8 21 normal
- -1 sprites/canals.png 8bpp 430 100 11 10 -31 10 normal
- -1 sprites/canals.png 8bpp 446 100 24 16 -11 -6 normal
- -1 * 7 02 05 13 01 00 00 00
-
-// Canal edges (tropic rainforest)
- -1 * 4 01 05 01 \b12
- -1 sprites/canals.png 8bpp 30 130 45 22 -11 -1 normal
- -1 sprites/canals.png 8bpp 94 130 41 21 -8 10 normal
- -1 sprites/canals.png 8bpp 142 130 42 21 -31 10 normal
- -1 sprites/canals.png 8bpp 190 130 43 22 -31 -1 normal
- -1 sprites/canals.png 8bpp 238 130 22 22 11 4 normal
- -1 sprites/canals.png 8bpp 270 130 24 16 -11 15 normal
- -1 sprites/canals.png 8bpp 302 130 23 23 -31 4 normal
- -1 sprites/canals.png 8bpp 334 130 24 18 -11 -1 normal
- -1 sprites/canals.png 8bpp 366 130 12 11 21 10 normal
- -1 sprites/canals.png 8bpp 398 130 19 10 -8 21 normal
- -1 sprites/canals.png 8bpp 430 130 11 10 -31 10 normal
- -1 sprites/canals.png 8bpp 446 130 24 16 -11 -6 normal
- -1 * 7 02 05 14 01 00 00 00
-// Choose the right tropic canal edges
- -1 * 14 02 05 15 81 81 00 FF 01 13 00 01 01 14 00
- -1 * 6 07 83 01 \7! 02 01
- -1 * 7 03 05 01 02 00 15 00
-
-// Canal edges (toyland)
- -1 * 4 01 05 01 \b12
- -1 sprites/canals.png 8bpp 30 160 45 22 -11 -1 normal
- -1 sprites/canals.png 8bpp 94 160 41 21 -8 10 normal
- -1 sprites/canals.png 8bpp 142 160 42 21 -31 10 normal
- -1 sprites/canals.png 8bpp 190 160 43 22 -31 -1 normal
- -1 sprites/canals.png 8bpp 238 160 22 22 11 4 normal
- -1 sprites/canals.png 8bpp 270 160 24 16 -11 15 normal
- -1 sprites/canals.png 8bpp 302 160 23 23 -31 4 normal
- -1 sprites/canals.png 8bpp 334 160 24 18 -11 -1 normal
- -1 sprites/canals.png 8bpp 366 160 12 11 21 10 normal
- -1 sprites/canals.png 8bpp 398 160 19 10 -8 21 normal
- -1 sprites/canals.png 8bpp 430 160 11 10 -31 10 normal
- -1 sprites/canals.png 8bpp 446 160 24 16 -11 -6 normal
- -1 * 7 02 05 16 01 00 00 00
- -1 * 6 07 83 01 \7! 03 01
- -1 * 7 03 05 01 02 00 16 00
diff --git a/media/extra_grf/canals_extra.nfo b/media/extra_grf/canals_extra.nfo
new file mode 100644
index 0000000000..3103886233
--- /dev/null
+++ b/media/extra_grf/canals_extra.nfo
@@ -0,0 +1,101 @@
+//
+// $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 .
+//
+ -1 * 0 0C "Extra canal graphics by PaulC"
+
+// Differentiation for the climates starts here
+
+// Canal edges (arctic snowy)
+ -1 * 4 01 05 01 \b12
+ -1 sprites/canals.png 8bpp 30 40 45 22 -11 -1 normal
+ -1 sprites/canals.png 8bpp 94 40 41 21 -8 10 normal
+ -1 sprites/canals.png 8bpp 142 40 42 21 -31 10 normal
+ -1 sprites/canals.png 8bpp 190 40 43 22 -31 -1 normal
+ -1 sprites/canals.png 8bpp 238 40 22 22 11 4 normal
+ -1 sprites/canals.png 8bpp 270 40 24 16 -11 15 normal
+ -1 sprites/canals.png 8bpp 302 40 23 23 -31 4 normal
+ -1 sprites/canals.png 8bpp 334 40 24 18 -11 -1 normal
+ -1 sprites/canals.png 8bpp 366 40 12 11 21 10 normal
+ -1 sprites/canals.png 8bpp 398 40 19 10 -8 21 normal
+ -1 sprites/canals.png 8bpp 430 40 11 10 -31 10 normal
+ -1 sprites/canals.png 8bpp 446 40 24 16 -11 -6 normal
+ -1 * 7 02 05 10 01 00 00 00
+
+// Canal edges (arctic normal)
+ -1 * 4 01 05 01 \b12
+ -1 sprites/canals.png 8bpp 30 70 45 22 -11 -1 normal
+ -1 sprites/canals.png 8bpp 94 70 41 21 -8 10 normal
+ -1 sprites/canals.png 8bpp 142 70 42 21 -31 10 normal
+ -1 sprites/canals.png 8bpp 190 70 43 22 -31 -1 normal
+ -1 sprites/canals.png 8bpp 238 70 22 22 11 4 normal
+ -1 sprites/canals.png 8bpp 270 70 24 16 -11 15 normal
+ -1 sprites/canals.png 8bpp 302 70 23 23 -31 4 normal
+ -1 sprites/canals.png 8bpp 334 70 24 18 -11 -1 normal
+ -1 sprites/canals.png 8bpp 366 70 12 11 21 10 normal
+ -1 sprites/canals.png 8bpp 398 70 19 10 -8 21 normal
+ -1 sprites/canals.png 8bpp 430 70 11 10 -31 10 normal
+ -1 sprites/canals.png 8bpp 446 70 24 16 -11 -6 normal
+ -1 * 7 02 05 11 01 00 00 00
+// Choose the right arctic canal edges
+ -1 * 14 02 05 12 81 81 00 FF 01 10 00 04 04 11 00
+ -1 * 6 07 83 01 \7! 01 01
+ -1 * 7 03 05 01 02 00 12 00
+
+// Canal edges (tropic desert)
+ -1 * 4 01 05 01 \b12
+ -1 sprites/canals.png 8bpp 30 100 45 22 -11 -1 normal
+ -1 sprites/canals.png 8bpp 94 100 41 21 -8 10 normal
+ -1 sprites/canals.png 8bpp 142 100 42 21 -31 10 normal
+ -1 sprites/canals.png 8bpp 190 100 43 22 -31 -1 normal
+ -1 sprites/canals.png 8bpp 238 100 22 22 11 4 normal
+ -1 sprites/canals.png 8bpp 270 100 24 16 -11 15 normal
+ -1 sprites/canals.png 8bpp 302 100 23 23 -31 4 normal
+ -1 sprites/canals.png 8bpp 334 100 24 18 -11 -1 normal
+ -1 sprites/canals.png 8bpp 366 100 12 11 21 10 normal
+ -1 sprites/canals.png 8bpp 398 100 19 10 -8 21 normal
+ -1 sprites/canals.png 8bpp 430 100 11 10 -31 10 normal
+ -1 sprites/canals.png 8bpp 446 100 24 16 -11 -6 normal
+ -1 * 7 02 05 13 01 00 00 00
+
+// Canal edges (tropic rainforest)
+ -1 * 4 01 05 01 \b12
+ -1 sprites/canals.png 8bpp 30 130 45 22 -11 -1 normal
+ -1 sprites/canals.png 8bpp 94 130 41 21 -8 10 normal
+ -1 sprites/canals.png 8bpp 142 130 42 21 -31 10 normal
+ -1 sprites/canals.png 8bpp 190 130 43 22 -31 -1 normal
+ -1 sprites/canals.png 8bpp 238 130 22 22 11 4 normal
+ -1 sprites/canals.png 8bpp 270 130 24 16 -11 15 normal
+ -1 sprites/canals.png 8bpp 302 130 23 23 -31 4 normal
+ -1 sprites/canals.png 8bpp 334 130 24 18 -11 -1 normal
+ -1 sprites/canals.png 8bpp 366 130 12 11 21 10 normal
+ -1 sprites/canals.png 8bpp 398 130 19 10 -8 21 normal
+ -1 sprites/canals.png 8bpp 430 130 11 10 -31 10 normal
+ -1 sprites/canals.png 8bpp 446 130 24 16 -11 -6 normal
+ -1 * 7 02 05 14 01 00 00 00
+// Choose the right tropic canal edges
+ -1 * 14 02 05 15 81 81 00 FF 01 13 00 01 01 14 00
+ -1 * 6 07 83 01 \7! 02 01
+ -1 * 7 03 05 01 02 00 15 00
+
+// Canal edges (toyland)
+ -1 * 4 01 05 01 \b12
+ -1 sprites/canals.png 8bpp 30 160 45 22 -11 -1 normal
+ -1 sprites/canals.png 8bpp 94 160 41 21 -8 10 normal
+ -1 sprites/canals.png 8bpp 142 160 42 21 -31 10 normal
+ -1 sprites/canals.png 8bpp 190 160 43 22 -31 -1 normal
+ -1 sprites/canals.png 8bpp 238 160 22 22 11 4 normal
+ -1 sprites/canals.png 8bpp 270 160 24 16 -11 15 normal
+ -1 sprites/canals.png 8bpp 302 160 23 23 -31 4 normal
+ -1 sprites/canals.png 8bpp 334 160 24 18 -11 -1 normal
+ -1 sprites/canals.png 8bpp 366 160 12 11 21 10 normal
+ -1 sprites/canals.png 8bpp 398 160 19 10 -8 21 normal
+ -1 sprites/canals.png 8bpp 430 160 11 10 -31 10 normal
+ -1 sprites/canals.png 8bpp 446 160 24 16 -11 -6 normal
+ -1 * 7 02 05 16 01 00 00 00
+ -1 * 6 07 83 01 \7! 03 01
+ -1 * 7 03 05 01 02 00 16 00
diff --git a/media/extra_grf/openttd.nfo b/media/extra_grf/openttd.nfo
index 66149a37e5..7ece5c7149 100644
--- a/media/extra_grf/openttd.nfo
+++ b/media/extra_grf/openttd.nfo
@@ -60,10 +60,11 @@
00
// GRF ID, must start with FF so it gets ignored
- -1 * 0 08 08 FF "OTT"
+//@@WARNING DISABLE 101
+ -1 * 0 08 08 FF FF FF FE
// Name of the GRF
- "OpenTTD's base graphics " 00
+ "OpenTTD's default and fallback extra graphics" 00
// Description of the GRF.
"License: GNU General Public License version 2" 0D
@@ -86,7 +87,6 @@
#include "canals.nfo"
#include "oneway.nfo"
#include "tramtracks.nfo"
-#include "shore.nfo"
#include "sloped_tracks.nfo"
#include "airports.nfo"
#include "roadstops.nfo"
@@ -97,11 +97,5 @@
#include "airport_preview.nfo"
#include "chars.nfo"
#include "mono.nfo"
-#include "fix_graphics.nfo"
-#include "rivers/rapids.nfo"
-#include "rivers/temperate.nfo"
-#include "rivers/arctic.nfo"
-#include "rivers/tropic.nfo"
-#include "rivers/toyland.nfo"
#include "tunnel_portals.nfo"
#include "palette.nfo"
diff --git a/media/extra_grf/orig_extra.nfo b/media/extra_grf/orig_extra.nfo
new file mode 100644
index 0000000000..03a8ff6741
--- /dev/null
+++ b/media/extra_grf/orig_extra.nfo
@@ -0,0 +1,85 @@
+// Automatically generated by GRFCODEC. Do not modify!
+// (Info version 32)
+// Format: spritenum imagefile depth xpos ypos xsize ysize xrel yrel zoom flags
+//
+// $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 .
+//
+// Sources for extra graphics to complement the original graphics.
+// Checks whether the correct version of OpenTTD is used before
+// allowing it to be used.
+//
+
+//
+// Number of sprites, it is wrong, but GRFcodec automagically gets it right.
+//
+ 0 * 4 00 00 00 00
+
+
+//
+// Check whether we are running OTTD or not.
+//
+ -1 * 0 07 9D 04 \7= 01 00 00 00 01
+ -1 * 0 0B 03 7F FF 80 " is not for TTDPatch. Use ttdpatch(w).grf." 00
+
+
+//
+// Check for OTTD's version number
+//
+
+// First step... Variable A1 might not exist. If that's the case it always
+// skips. As we do not want to skip out of the whole testing, we skip over
+// the real version check.
+ -1 * 0 07 A1 04 \7= FF FF FF FF 02
+
+// Real version check.
+ -1 * 0 07 A1 04 \7> \w20304 01 01 03
+
+// If the version check is supported, the string is translateable via OpenTTD
+// itself. Use it!.
+
+ -1 * 0 0B 03 7F 06 "1.1 (or trunk r20304)" 00
+
+// Some OTTD versions before r11130 did support Action B, so use the English
+// phrase there
+ -1 * 0 0B 03 7F FF "Requires OpenTTD version 1.1 (or trunk r20304) or better." 00
+
+// Final fallback. No Action B support, just skip to the end of the file.
+ -1 * 0 07 A1 04 \7= FF FF FF FF 00
+
+// We are a DOS paletted NewGRF, so tell OpenTTD that. Then it can actually
+// do the right thing. Yay for that feature as that means no duplicate NewGRF!
+ -1 * 0 14
+ "C" "INFO"
+ "B" "PALS" \w1 "D"
+ 00
+ 00
+
+// GRF ID, must start with FF so it gets ignored
+//@@WARNING DISABLE 101
+ -1 * 0 08 08 FF "OTT"
+
+// Name of the GRF
+ "Original baseset extra graphics" 00
+
+// Description of the GRF.
+ "License: GNU General Public License version 2" 0D
+ "Andrew Parkhouse: rivers" 0D
+ "Addi and PaulC: original graphics fixes" 0D
+ "OpenTTD developers: other graphics" 00
+
+//
+// The real data of the GRF is acquired from several subfiles.
+//
+#include "shore.nfo"
+#include "fix_graphics.nfo"
+#include "canals_extra.nfo"
+#include "rivers/rapids.nfo"
+#include "rivers/temperate.nfo"
+#include "rivers/arctic.nfo"
+#include "rivers/tropic.nfo"
+#include "rivers/toyland.nfo"
diff --git a/media/extra_grf/shore.nfo b/media/extra_grf/shore.nfo
index 70fae8f4d8..7b7c12ad3b 100644
--- a/media/extra_grf/shore.nfo
+++ b/media/extra_grf/shore.nfo
@@ -47,7 +47,7 @@
-1 sprites/shore.png 8bpp 82 200 64 32 -31 -1 normal
-1 sprites/shore.png 8bpp 162 200 64 31 -31 -8 normal
-1 * 6 07 83 01 \7! 03 0C
- -1 * 44 0C "Missing shore tile graphics for the toyland climate"
+ -1 * 52 0C "Missing shore tile graphics for the toyland climate"
-1 * 3 05 0D 0A
-1 sprites/shore.png 8bpp 290 200 64 15 -31 0 normal
-1 sprites/shore.png 8bpp 370 200 64 31 -31 -8 normal
diff --git a/media/openttd.desktop.in b/media/openttd.desktop.in
index c037e3c75b..513ff712df 100644
--- a/media/openttd.desktop.in
+++ b/media/openttd.desktop.in
@@ -9,4 +9,4 @@ Exec=!!TTD!!
Terminal=false
Categories=!!MENU_GROUP!!
Comment=A clone of Transport Tycoon Deluxe
-Keywords=game;simulation;transport;tycoon;deluxe;economics;multiplayer;money;train;ship;bus;truck;aircraft;cargo
+Keywords=game;simulation;transport;tycoon;deluxe;economics;multiplayer;money;train;ship;bus;truck;aircraft;cargo;
diff --git a/os/debian/changelog b/os/debian/changelog
index d56400af01..c8cf30794b 100644
--- a/os/debian/changelog
+++ b/os/debian/changelog
@@ -1,3 +1,75 @@
+openttd (1.6.1-0) unstable; urgency=low
+
+ * New upstream release 1.6.1
+
+ -- OpenTTD Fri, 01 Jul 2016 00:00:00 +0200
+
+openttd (1.6.1~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.6.1-RC1
+
+ -- OpenTTD Wed, 01 Jun 2016 21:00:00 +0200
+
+openttd (1.6.0-0) unstable; urgency=low
+
+ * New upstream release 1.6.0
+
+ -- OpenTTD Fri, 01 Apr 2016 21:00:00 +0200
+
+openttd (1.6.0~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.6.0-RC1
+
+ -- OpenTTD Tue, 01 Mar 2016 21:00:00 +0100
+
+openttd (1.5.3-0) unstable; urgency=low
+
+ * New upstream release 1.5.3
+
+ -- OpenTTD Tue, 01 Dec 2015 21:00:00 +0100
+
+openttd (1.5.3~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.5.3-RC1
+
+ -- OpenTTD Sun, 01 Nov 2015 14:00:00 +0100
+
+openttd (1.5.2-0) unstable; urgency=low
+
+ * New upstream release 1.5.2
+
+ -- OpenTTD Tue, 01 Sep 2015 21:00:00 +0200
+
+openttd (1.5.2~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.5.2-RC1
+
+ -- OpenTTD Sat, 01 Aug 2015 13:00:00 +0200
+
+openttd (1.5.1-0) unstable; urgency=low
+
+ * New upstream release 1.5.1
+
+ -- OpenTTD Mon, 01 Jun 2015 21:00:00 +0200
+
+openttd (1.5.1~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.5.1-RC1
+
+ -- OpenTTD Fri, 08 May 2015 21:00:00 +0200
+
+openttd (1.5.0-0) unstable; urgency=low
+
+ * New upstream release 1.5.0
+
+ -- OpenTTD Wed, 01 Apr 2015 21:00:00 +0200
+
+openttd (1.5.0~RC1-0) unstable; urgency=low
+
+ * New upstream release 1.5.0-RC1
+
+ -- OpenTTD Wed, 18 Mar 2015 21:00:00 +0100
+
openttd (1.5.0~beta2-0) unstable; urgency=low
* New upstream release 1.5.0-beta2
diff --git a/os/debian/copyright b/os/debian/copyright
index be573b4825..ab62f66a42 100644
--- a/os/debian/copyright
+++ b/os/debian/copyright
@@ -5,7 +5,7 @@ Source: http://www.openttd.org
Files: *
-Copyright: © 2004-2012 Ludvig Strigeous and others.
+Copyright: © 2004-2017 Ludvig Strigeous and others.
License: GPL-2.0
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2.0 as
diff --git a/os/os2/installer/make_installer.cmd b/os/os2/installer/make_installer.cmd
index 6fe6dace66..5e30e4c354 100644
--- a/os/os2/installer/make_installer.cmd
+++ b/os/os2/installer/make_installer.cmd
@@ -1,6 +1,6 @@
@echo off
-set OPENTTD_VERSION=1.6.0
+set OPENTTD_VERSION=1.8.0
set OPENSFX_VERSION=0.8.0
set NOSOUND_VERSION=0.8.0
set OPENGFX_VERSION=1.2.0
diff --git a/os/rpm/openttd.spec b/os/rpm/openttd.spec
index 5ad5a53cab..9685624462 100644
--- a/os/rpm/openttd.spec
+++ b/os/rpm/openttd.spec
@@ -2,7 +2,7 @@
# spec file for package openttd
#
# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
-# Copyright (c) 2007-2012 The OpenTTD developers
+# Copyright (c) 2007-2017 The OpenTTD developers
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,9 +17,9 @@
#
Name: openttd
-Version: 1.6.beta1
+Version: 1.8.beta1
Release: 0
-%define srcver 1.6.0-beta1
+%define srcver 1.8.0-beta1
Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe
License: GPL-2.0
Group: Amusements/Games/Strategy/Other
diff --git a/os/windows/installer/install.nsi b/os/windows/installer/install.nsi
index ebe9ed3dcd..76a87b37dd 100644
--- a/os/windows/installer/install.nsi
+++ b/os/windows/installer/install.nsi
@@ -1,6 +1,6 @@
# Version numbers to update
!define APPV_MAJOR 1
-!define APPV_MINOR 6
+!define APPV_MINOR 8
!define APPV_MAINT 0
!define APPV_BUILD 0
!define APPV_EXTRA "-beta1"
@@ -408,6 +408,7 @@ Section "Uninstall"
; Baseset files
Delete "$INSTDIR\baseset\opntitle.dat"
Delete "$INSTDIR\baseset\openttd.grf"
+ Delete "$INSTDIR\baseset\orig_extra.grf"
Delete "$INSTDIR\baseset\orig_win.obg"
Delete "$INSTDIR\baseset\orig_dos.obg"
Delete "$INSTDIR\baseset\orig_dos_de.obg"
diff --git a/projects/dpi_aware.manifest b/projects/dpi_aware.manifest
new file mode 100644
index 0000000000..6f04161596
--- /dev/null
+++ b/projects/dpi_aware.manifest
@@ -0,0 +1,7 @@
+
+
+
+ True/PM
+
+
+
diff --git a/projects/generate b/projects/generate
index 42b684d2af..bd177bf71b 100755
--- a/projects/generate
+++ b/projects/generate
@@ -22,6 +22,15 @@ then
exit 1
fi
+# openttd_vs140.sln is for MSVC 2015
+# openttd_vs140.vcxproj is for MSVC 2015
+# openttd_vs140.vcxproj.filters is for MSVC 2015
+# langs_vs140.vcxproj is for MSVC 2015
+# strgen_vs140.vcxproj is for MSVC 2015
+# strgen_vs140.vcxproj.filters is for MSVC 2015
+# generate_vs140.vcxproj is for MSVC 2015
+# version_vs140.vcxproj is for MSVC 2015
+
# openttd_vs100.sln is for MSVC 2010
# openttd_vs100.vcxproj is for MSVC 2010
# openttd_vs100.vcxproj.filters is for MSVC 2010
@@ -306,11 +315,17 @@ generate "$openttd" "openttd_vs80.vcproj"
generate "$openttd" "openttd_vs90.vcproj"
generate "$openttdvcxproj" "openttd_vs100.vcxproj"
generate "$openttdfiles" "openttd_vs100.vcxproj.filters" "$openttdfilters"
+generate "$openttdvcxproj" "openttd_vs140.vcxproj"
+generate "$openttdfiles" "openttd_vs140.vcxproj.filters" "$openttdfilters"
generate "$lang" "langs_vs80.vcproj"
generate "$lang" "langs_vs90.vcproj"
generate "$langvcxproj" "langs_vs100.vcxproj"
generate "$langfiles" "langs_vs100.vcxproj.filters"
+generate "$langvcxproj" "langs_vs140.vcxproj"
+generate "$langfiles" "langs_vs140.vcxproj.filters"
generate "$settings" "settings_vs80.vcproj" "$settingscommand"
generate "$settings" "settings_vs90.vcproj" "$settingscommand"
generate "$settingsvcxproj" "settings_vs100.vcxproj" "$settingscommand"
generate "$settingsfiles" "settings_vs100.vcxproj.filters"
+generate "$settingsvcxproj" "settings_vs140.vcxproj" "$settingscommand"
+generate "$settingsfiles" "settings_vs140.vcxproj.filters"
diff --git a/projects/generate.vbs b/projects/generate.vbs
index 4e1e886873..6692b45e7f 100755
--- a/projects/generate.vbs
+++ b/projects/generate.vbs
@@ -10,6 +10,15 @@ Option Explicit
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
+' openttd_vs140.sln is for MSVC 2015
+' openttd_vs140.vcxproj is for MSVC 2015
+' openttd_vs140.vcxproj.filters is for MSVC 2015
+' langs_vs140.vcxproj is for MSVC 2015
+' strgen_vs140.vcxproj is for MSVC 2015
+' strgen_vs140.vcxproj.filters is for MSVC 2015
+' generate_vs140.vcxproj is for MSVC 2015
+' version_vs140.vcxproj is for MSVC 2015
+
' openttd_vs100.sln is for MSVC 2010
' openttd_vs100.vcxproj is for MSVC 2010
' openttd_vs100.vcxproj.filters is for MSVC 2010
@@ -369,6 +378,8 @@ generate openttd, ROOT_DIR & "/projects/openttd_vs80.vcproj", Null
generate openttd, ROOT_DIR & "/projects/openttd_vs90.vcproj", Null
generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs100.vcxproj", Null
generate openttdfiles, ROOT_DIR & "/projects/openttd_vs100.vcxproj.filters", openttdfilters
+generate openttdvcxproj, ROOT_DIR & "/projects/openttd_vs140.vcxproj", Null
+generate openttdfiles, ROOT_DIR & "/projects/openttd_vs140.vcxproj.filters", openttdfilters
Dim lang, langvcxproj, langfiles
lang = load_lang_data(ROOT_DIR & "/src/lang", langvcxproj, langfiles)
@@ -376,6 +387,8 @@ generate lang, ROOT_DIR & "/projects/langs_vs80.vcproj", Null
generate lang, ROOT_DIR & "/projects/langs_vs90.vcproj", Null
generate langvcxproj, ROOT_DIR & "/projects/langs_vs100.vcxproj", Null
generate langfiles, ROOT_DIR & "/projects/langs_vs100.vcxproj.filters", Null
+generate langvcxproj, ROOT_DIR & "/projects/langs_vs140.vcxproj", Null
+generate langfiles, ROOT_DIR & "/projects/langs_vs140.vcxproj.filters", Null
Dim settings, settingsvcxproj, settingscommand, settingsfiles
settings = load_settings_data(ROOT_DIR & "/src/table", settingsvcxproj, settingscommand, settingsfiles)
@@ -383,3 +396,5 @@ generate settings, ROOT_DIR & "/projects/settings_vs80.vcproj", settingscommand
generate settings, ROOT_DIR & "/projects/settings_vs90.vcproj", settingscommand
generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs100.vcxproj", settingscommand
generate settingsfiles, ROOT_DIR & "/projects/settings_vs100.vcxproj.filters", Null
+generate settingsvcxproj, ROOT_DIR & "/projects/settings_vs140.vcxproj", settingscommand
+generate settingsfiles, ROOT_DIR & "/projects/settings_vs140.vcxproj.filters", Null
diff --git a/projects/generate_vs140.vcxproj b/projects/generate_vs140.vcxproj
new file mode 100644
index 0000000000..67b1b7712c
--- /dev/null
+++ b/projects/generate_vs140.vcxproj
@@ -0,0 +1,40 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ generate
+ {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}
+ generate
+
+
+
+ Utility
+ v140
+
+
+
+
+
+
+
+
+
+
+
+
+ Document
+ Running %27generate.vbs%27 ...
+ cscript "$(ProjectDir)generate.vbs"
+ %(FullPath);%(AdditionalInputs)
+ $(SolutionDir)openttd_vs80.vcproj;$(SolutionDir)openttd_vs90.vcproj;$(SolutionDir)openttd_vs100.vcxproj;$(SolutionDir)openttd_vs100.vcxproj.filters;$(SolutionDir)langs_vs80.vcproj;$(SolutionDir)langs_vs90.vcproj;$(SolutionDir)langs_vs100.vcxproj;%(Outputs)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/langs_vs100.vcxproj b/projects/langs_vs100.vcxproj
index 078a7b374a..fc77e03bec 100644
--- a/projects/langs_vs100.vcxproj
+++ b/projects/langs_vs100.vcxproj
@@ -317,6 +317,12 @@
..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
..\bin\lang\slovenian.lng;%(Outputs)
+
+ Generating spanish_MX language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\spanish_MX.lng;%(Outputs)
+
Generating spanish language file
..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
diff --git a/projects/langs_vs100.vcxproj.filters b/projects/langs_vs100.vcxproj.filters
index fb16aa64e0..0afc8c969a 100644
--- a/projects/langs_vs100.vcxproj.filters
+++ b/projects/langs_vs100.vcxproj.filters
@@ -142,6 +142,9 @@
Translations
+
+ Translations
+
Translations
diff --git a/projects/langs_vs140.vcxproj b/projects/langs_vs140.vcxproj
new file mode 100644
index 0000000000..b866630d00
--- /dev/null
+++ b/projects/langs_vs140.vcxproj
@@ -0,0 +1,390 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ langs
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}
+ langs
+ MakeFileProj
+
+
+
+ Utility
+ false
+ v140
+
+
+
+
+
+
+
+
+
+ ..\bin\lang\
+ ..\objs\langs\
+
+
+
+ Generating strings.h
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table
+
+
+ ./langs.tlb
+
+
+
+
+
+
+ Generating english language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\english.lng;%(Outputs)
+
+
+ Generating afrikaans language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\afrikaans.lng;%(Outputs)
+
+
+ Generating arabic_egypt language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\arabic_egypt.lng;%(Outputs)
+
+
+ Generating basque language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\basque.lng;%(Outputs)
+
+
+ Generating belarusian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\belarusian.lng;%(Outputs)
+
+
+ Generating brazilian_portuguese language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\brazilian_portuguese.lng;%(Outputs)
+
+
+ Generating bulgarian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\bulgarian.lng;%(Outputs)
+
+
+ Generating catalan language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\catalan.lng;%(Outputs)
+
+
+ Generating croatian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\croatian.lng;%(Outputs)
+
+
+ Generating czech language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\czech.lng;%(Outputs)
+
+
+ Generating danish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\danish.lng;%(Outputs)
+
+
+ Generating dutch language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\dutch.lng;%(Outputs)
+
+
+ Generating english_AU language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\english_AU.lng;%(Outputs)
+
+
+ Generating english_US language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\english_US.lng;%(Outputs)
+
+
+ Generating esperanto language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\esperanto.lng;%(Outputs)
+
+
+ Generating estonian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\estonian.lng;%(Outputs)
+
+
+ Generating faroese language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\faroese.lng;%(Outputs)
+
+
+ Generating finnish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\finnish.lng;%(Outputs)
+
+
+ Generating french language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\french.lng;%(Outputs)
+
+
+ Generating gaelic language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\gaelic.lng;%(Outputs)
+
+
+ Generating galician language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\galician.lng;%(Outputs)
+
+
+ Generating german language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\german.lng;%(Outputs)
+
+
+ Generating greek language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\greek.lng;%(Outputs)
+
+
+ Generating hebrew language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\hebrew.lng;%(Outputs)
+
+
+ Generating hungarian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\hungarian.lng;%(Outputs)
+
+
+ Generating icelandic language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\icelandic.lng;%(Outputs)
+
+
+ Generating indonesian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\indonesian.lng;%(Outputs)
+
+
+ Generating irish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\irish.lng;%(Outputs)
+
+
+ Generating italian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\italian.lng;%(Outputs)
+
+
+ Generating japanese language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\japanese.lng;%(Outputs)
+
+
+ Generating korean language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\korean.lng;%(Outputs)
+
+
+ Generating latin language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\latin.lng;%(Outputs)
+
+
+ Generating latvian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\latvian.lng;%(Outputs)
+
+
+ Generating lithuanian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\lithuanian.lng;%(Outputs)
+
+
+ Generating luxembourgish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\luxembourgish.lng;%(Outputs)
+
+
+ Generating malay language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\malay.lng;%(Outputs)
+
+
+ Generating norwegian_bokmal language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\norwegian_bokmal.lng;%(Outputs)
+
+
+ Generating norwegian_nynorsk language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\norwegian_nynorsk.lng;%(Outputs)
+
+
+ Generating polish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\polish.lng;%(Outputs)
+
+
+ Generating portuguese language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\portuguese.lng;%(Outputs)
+
+
+ Generating romanian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\romanian.lng;%(Outputs)
+
+
+ Generating russian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\russian.lng;%(Outputs)
+
+
+ Generating serbian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\serbian.lng;%(Outputs)
+
+
+ Generating simplified_chinese language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\simplified_chinese.lng;%(Outputs)
+
+
+ Generating slovak language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\slovak.lng;%(Outputs)
+
+
+ Generating slovenian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\slovenian.lng;%(Outputs)
+
+
+ Generating spanish_MX language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\spanish_MX.lng;%(Outputs)
+
+
+ Generating spanish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\spanish.lng;%(Outputs)
+
+
+ Generating swedish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\swedish.lng;%(Outputs)
+
+
+ Generating tamil language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\tamil.lng;%(Outputs)
+
+
+ Generating thai language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\thai.lng;%(Outputs)
+
+
+ Generating traditional_chinese language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\traditional_chinese.lng;%(Outputs)
+
+
+ Generating turkish language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\turkish.lng;%(Outputs)
+
+
+ Generating ukrainian language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\ukrainian.lng;%(Outputs)
+
+
+ Generating vietnamese language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\vietnamese.lng;%(Outputs)
+
+
+ Generating welsh language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\welsh.lng;%(Outputs)
+
+
+
+
+ {a133a442-bd0a-4ade-b117-ad7545e4bdd1}
+ false
+
+
+
+
+
+
diff --git a/projects/langs_vs140.vcxproj.filters b/projects/langs_vs140.vcxproj.filters
new file mode 100644
index 0000000000..0afc8c969a
--- /dev/null
+++ b/projects/langs_vs140.vcxproj.filters
@@ -0,0 +1,176 @@
+
+
+
+
+ {2a164580-9033-4a01-974b-b21da507efda}
+
+
+
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+ Translations
+
+
+
diff --git a/projects/langs_vs140.vcxproj.filters.in b/projects/langs_vs140.vcxproj.filters.in
new file mode 100644
index 0000000000..0d60ee9595
--- /dev/null
+++ b/projects/langs_vs140.vcxproj.filters.in
@@ -0,0 +1,12 @@
+
+
+
+
+ {2a164580-9033-4a01-974b-b21da507efda}
+
+
+
+
+!!FILES!!
+
+
diff --git a/projects/langs_vs140.vcxproj.in b/projects/langs_vs140.vcxproj.in
new file mode 100644
index 0000000000..f75ef9d6b5
--- /dev/null
+++ b/projects/langs_vs140.vcxproj.in
@@ -0,0 +1,61 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ langs
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}
+ langs
+ MakeFileProj
+
+
+
+ Utility
+ false
+ v140
+
+
+
+
+
+
+
+
+
+ ..\bin\lang\
+ ..\objs\langs\
+
+
+
+ Generating strings.h
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table
+
+
+ ./langs.tlb
+
+
+
+
+
+
+ Generating english language file
+ ..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"
+ ..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)
+ ..\bin\lang\english.lng;%(Outputs)
+
+!!FILES!!
+
+
+
+ {a133a442-bd0a-4ade-b117-ad7545e4bdd1}
+ false
+
+
+
+
+
+
diff --git a/projects/langs_vs80.vcproj b/projects/langs_vs80.vcproj
index 1413a80d27..e683d57353 100644
--- a/projects/langs_vs80.vcproj
+++ b/projects/langs_vs80.vcproj
@@ -738,6 +738,21 @@
/>
+
+
+
+
+
diff --git a/projects/langs_vs90.vcproj b/projects/langs_vs90.vcproj
index db6fef1a43..c1f028233e 100644
--- a/projects/langs_vs90.vcproj
+++ b/projects/langs_vs90.vcproj
@@ -739,6 +739,21 @@
/>
+
+
+
+
+
diff --git a/projects/openttd_vs100.vcxproj b/projects/openttd_vs100.vcxproj
index cfff536145..9c3b107866 100644
--- a/projects/openttd_vs100.vcxproj
+++ b/projects/openttd_vs100.vcxproj
@@ -102,7 +102,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- 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)
+ WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
true
Sync
MultiThreaded
@@ -145,6 +145,9 @@
MachineX86
true
+
+ dpi_aware.manifest
+
@@ -156,7 +159,7 @@
/MP %(AdditionalOptions)
Disabled
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebug
@@ -188,6 +191,9 @@
MachineX86
+
+ dpi_aware.manifest
+
@@ -204,7 +210,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- 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)
+ WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
true
Sync
MultiThreaded
@@ -244,6 +250,9 @@
MachineX64
true
+
+ dpi_aware.manifest
+
@@ -256,7 +265,7 @@
/MP %(AdditionalOptions)
Disabled
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebug
@@ -289,6 +298,9 @@
1048576
MachineX64
+
+ dpi_aware.manifest
+
@@ -898,6 +910,7 @@
+
diff --git a/projects/openttd_vs100.vcxproj.filters b/projects/openttd_vs100.vcxproj.filters
index b5dcdfc5a5..06800ffdaf 100644
--- a/projects/openttd_vs100.vcxproj.filters
+++ b/projects/openttd_vs100.vcxproj.filters
@@ -1923,6 +1923,9 @@
Tables
+
+ Tables
+
Tables
diff --git a/projects/openttd_vs100.vcxproj.in b/projects/openttd_vs100.vcxproj.in
index 7a4f0bce81..c8e71c4234 100644
--- a/projects/openttd_vs100.vcxproj.in
+++ b/projects/openttd_vs100.vcxproj.in
@@ -102,7 +102,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- 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)
+ WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
true
Sync
MultiThreaded
@@ -145,6 +145,9 @@
MachineX86
true
+
+ dpi_aware.manifest
+
@@ -156,7 +159,7 @@
/MP %(AdditionalOptions)
Disabled
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebug
@@ -188,6 +191,9 @@
MachineX86
+
+ dpi_aware.manifest
+
@@ -204,7 +210,7 @@
Size
true
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- 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)
+ WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
true
Sync
MultiThreaded
@@ -244,6 +250,9 @@
MachineX64
true
+
+ dpi_aware.manifest
+
@@ -256,7 +265,7 @@
/MP %(AdditionalOptions)
Disabled
..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
- WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebug
@@ -289,6 +298,9 @@
1048576
MachineX64
+
+ dpi_aware.manifest
+
!!FILES!!
diff --git a/projects/openttd_vs140.sln b/projects/openttd_vs140.sln
new file mode 100644
index 0000000000..d256cfa495
--- /dev/null
+++ b/projects/openttd_vs140.sln
@@ -0,0 +1,94 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.23107.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "openttd", "openttd_vs140.vcxproj", "{668328A0-B40E-4CDB-BD72-D0064424414A}"
+ ProjectSection(ProjectDependencies) = postProject
+ {0817F629-589E-4A3B-B81A-8647BC571E35} = {0817F629-589E-4A3B-B81A-8647BC571E35}
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7} = {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "strgen", "strgen_vs140.vcxproj", "{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "langs", "langs_vs140.vcxproj", "{0F066B23-18DF-4284-8265-F4A5E7E3B966}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "version", "version_vs140.vcxproj", "{1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "generate", "generate_vs140.vcxproj", "{2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "settings_vs140.vcxproj", "{0817F629-589E-4A3B-B81A-8647BC571E35}"
+ ProjectSection(ProjectDependencies) = postProject
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7} = {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settingsgen", "settingsgen_vs140.vcxproj", "{E9548DE9-F089-49B7-93A6-30BE2CC311C7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64
+ {668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.Build.0 = Debug|Win32
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.ActiveCfg = Debug|Win32
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.Build.0 = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.ActiveCfg = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|Win32.Build.0 = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.ActiveCfg = Debug|Win32
+ {0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release|x64.Build.0 = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|Win32.Build.0 = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.ActiveCfg = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Debug|x64.Build.0 = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.ActiveCfg = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|Win32.Build.0 = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.ActiveCfg = Debug|Win32
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}.Release|x64.Build.0 = Debug|Win32
+ {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|Win32.ActiveCfg = Debug|Win32
+ {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Debug|x64.ActiveCfg = Debug|Win32
+ {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|Win32.ActiveCfg = Debug|Win32
+ {2F31FD79-D1AC-43C4-89F3-B0D5E4E53E34}.Release|x64.ActiveCfg = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|Win32.Build.0 = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.ActiveCfg = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Debug|x64.Build.0 = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.ActiveCfg = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|Win32.Build.0 = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.ActiveCfg = Debug|Win32
+ {0817F629-589E-4A3B-B81A-8647BC571E35}.Release|x64.Build.0 = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|Win32.Build.0 = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.ActiveCfg = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Debug|x64.Build.0 = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.ActiveCfg = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|Win32.Build.0 = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.ActiveCfg = Debug|Win32
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}.Release|x64.Build.0 = Debug|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(DPCodeReviewSolutionGUID) = preSolution
+ DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000}
+ EndGlobalSection
+EndGlobal
diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj
new file mode 100644
index 0000000000..eb8494167d
--- /dev/null
+++ b/projects/openttd_vs140.vcxproj
@@ -0,0 +1,1323 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ openttd
+ {668328A0-B40E-4CDB-BD72-D0064424414A}
+ openttd
+
+
+
+ Application
+ false
+ Unicode
+ v140
+
+
+ Application
+ false
+ Unicode
+ true
+ v140
+
+
+ Application
+ false
+ Unicode
+ v140
+
+
+ Application
+ false
+ Unicode
+ true
+ v140
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ false
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ false
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+
+ AllRules.ruleset
+
+
+ AllRules.ruleset
+
+
+ AllRules.ruleset
+
+
+ AllRules.ruleset
+
+
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(ProjectDir)..\bin
+
+
+
+ .\Release/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Full
+ AnySuitable
+ true
+ Size
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
+ true
+ Sync
+ MultiThreaded
+ 4Bytes
+ false
+ true
+
+
+
+
+
+
+ All
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ FastCall
+ Default
+ true
+ true
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ %(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ true
+ false
+
+
+ MachineX86
+ true
+ 5.01
+
+
+ PerMonitorHighDPIAware
+
+
+
+
+ .\Debug/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Disabled
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ FastCall
+ Default
+ true
+ true
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ false
+
+
+ MachineX86
+ 5.01
+
+
+ PerMonitorHighDPIAware
+
+
+
+
+ X64
+ .\Release/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Full
+ AnySuitable
+ true
+ Size
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
+ true
+ Sync
+ MultiThreaded
+ Default
+ false
+ true
+
+
+
+
+
+
+ All
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ FastCall
+ Default
+ true
+ true
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ %(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ true
+ MachineX64
+ true
+ 5.02
+
+
+ PerMonitorHighDPIAware
+
+
+
+
+ X64
+ .\Debug/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Disabled
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+
+
+
+
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ Cdecl
+ Default
+ true
+ true
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ MachineX64
+ 5.02
+
+
+ PerMonitorHighDPIAware
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {0f066b23-18df-4284-8265-f4a5e7e3b966}
+ false
+
+
+ {a133a442-bd0a-4ade-b117-ad7545e4bdd1}
+ false
+
+
+ {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec}
+ false
+
+
+
+
diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters
new file mode 100644
index 0000000000..06800ffdaf
--- /dev/null
+++ b/projects/openttd_vs140.vcxproj.filters
@@ -0,0 +1,3050 @@
+
+
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000000}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000001}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000002}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000003}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000004}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000005}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000006}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000007}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000008}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000009}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000010}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000011}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000012}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000013}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000014}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000015}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000016}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000017}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000018}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000019}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000020}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000021}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000022}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000023}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000024}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000025}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000026}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000027}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000028}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000029}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000030}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000031}
+
+
+ {c76ff9f1-1e62-46d8-8d55-000000000032}
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ Core Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ GUI Source Code
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Widgets
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Command handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Save/Load handlers
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ Tables
+
+
+ MD5
+
+
+ MD5
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Script
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ Squirrel headers
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI Core
+
+
+ AI API
+
+
+ Game API
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Game Core
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Script API Implementation
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Blitters
+
+
+ Drivers
+
+
+ Drivers
+
+
+ Drivers
+
+
+ Sprite loaders
+
+
+ Sprite loaders
+
+
+ Sprite loaders
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ NewGRF
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Map Accessors
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Misc
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Network Core
+
+
+ Pathfinder
+
+
+ Pathfinder
+
+
+ Pathfinder
+
+
+ Pathfinder
+
+
+ Pathfinder
+
+
+ Pathfinder
+
+
+ NPF
+
+
+ NPF
+
+
+ NPF
+
+
+ NPF
+
+
+ NPF
+
+
+ NPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ YAPF
+
+
+ Video
+
+
+ Video
+
+
+ Video
+
+
+ Video
+
+
+ Music
+
+
+ Music
+
+
+ Music
+
+
+ Sound
+
+
+ Sound
+
+
+ Sound
+
+
+ Windows files
+
+
+ Windows files
+
+
+ Windows files
+
+
+ Threading
+
+
+ Threading
+
+
+
+
+
+
+
diff --git a/projects/openttd_vs140.vcxproj.filters.in b/projects/openttd_vs140.vcxproj.filters.in
new file mode 100644
index 0000000000..cda491072c
--- /dev/null
+++ b/projects/openttd_vs140.vcxproj.filters.in
@@ -0,0 +1,13 @@
+
+
+
+!!FILTERS!!
+
+
+!!FILES!!
+
+
+
+
+
+
diff --git a/projects/openttd_vs140.vcxproj.in b/projects/openttd_vs140.vcxproj.in
new file mode 100644
index 0000000000..9d873283fa
--- /dev/null
+++ b/projects/openttd_vs140.vcxproj.in
@@ -0,0 +1,344 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ openttd
+ {668328A0-B40E-4CDB-BD72-D0064424414A}
+ openttd
+
+
+
+ Application
+ false
+ Unicode
+ v140
+
+
+ Application
+ false
+ Unicode
+ true
+ v140
+
+
+ Application
+ false
+ Unicode
+ v140
+
+
+ Application
+ false
+ Unicode
+ true
+ v140
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ false
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ false
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+
+ AllRules.ruleset
+
+
+ AllRules.ruleset
+
+
+ AllRules.ruleset
+
+
+ AllRules.ruleset
+
+
+ $(SolutionDir)..\objs\$(Platform)\$(Configuration)\
+ $(ProjectDir)..\bin
+
+
+
+ .\Release/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Full
+ AnySuitable
+ true
+ Size
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)
+ true
+ Sync
+ MultiThreaded
+ 4Bytes
+ false
+ true
+
+
+
+
+
+
+ All
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ FastCall
+ Default
+ true
+ true
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ %(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ true
+ false
+
+
+ MachineX86
+ true
+ 5.01
+
+
+ PerMonitorHighDPIAware
+
+
+
+
+ .\Debug/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Disabled
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ FastCall
+ Default
+ true
+ true
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ false
+
+
+ MachineX86
+ 5.01
+
+
+ PerMonitorHighDPIAware
+
+
+
+
+ X64
+ .\Release/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Full
+ AnySuitable
+ true
+ Size
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)
+ true
+ Sync
+ MultiThreaded
+ Default
+ false
+ true
+
+
+
+
+
+
+ All
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ FastCall
+ Default
+ true
+ true
+
+
+ NDEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ %(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ true
+ MachineX64
+ true
+ 5.02
+
+
+ PerMonitorHighDPIAware
+
+
+
+
+ X64
+ .\Debug/openttd.tlb
+
+
+
+
+ /J /Zc:throwingNew %(AdditionalOptions)
+ Disabled
+ true
+ ..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)
+ WIN32;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)
+ EnableFastChecks
+ MultiThreadedDebug
+
+
+
+
+
+
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ false
+ true
+ ProgramDatabase
+ Cdecl
+ Default
+ true
+ true
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ 0x0809
+
+
+ winmm.lib;ws2_32.lib;imm32.lib;libpng.lib;zlibstat.lib;lzo2.lib;liblzma.lib;libfreetype2.lib;icuuc.lib;icuin.lib;icudt.lib;icule.lib;iculx.lib;%(AdditionalDependencies)
+ true
+ LIBCMT.lib;%(IgnoreSpecificDefaultLibraries)
+ true
+ Windows
+ 1048576
+ 1048576
+ MachineX64
+ 5.02
+
+
+ PerMonitorHighDPIAware
+
+
+
+!!FILES!!
+
+
+
+
+
+
+
+ {0f066b23-18df-4284-8265-f4a5e7e3b966}
+ false
+
+
+ {a133a442-bd0a-4ade-b117-ad7545e4bdd1}
+ false
+
+
+ {1a2b3c5e-1c23-41a5-9c9b-acba2aa75fec}
+ false
+
+
+
+
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index 17c2d8d4f1..70dcab226a 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -52,7 +52,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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\";WITH_ASSERT"
+ 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_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -156,7 +156,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
@@ -257,7 +257,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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;WITH_ASSERT"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -362,7 +362,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
@@ -2890,6 +2890,10 @@
RelativePath=".\..\src\table\strgen_tables.h"
>
+
+
diff --git a/projects/openttd_vs80.vcproj.in b/projects/openttd_vs80.vcproj.in
index 57938f9e91..587871dca0 100644
--- a/projects/openttd_vs80.vcproj.in
+++ b/projects/openttd_vs80.vcproj.in
@@ -52,7 +52,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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\";WITH_ASSERT"
+ 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_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -156,7 +156,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
@@ -257,7 +257,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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;WITH_ASSERT"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -362,7 +362,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj
index 666760ce78..dd722d085d 100644
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -53,7 +53,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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\";WITH_ASSERT"
+ 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_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -155,7 +155,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
@@ -255,7 +255,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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;WITH_ASSERT"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -359,7 +359,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
@@ -2887,6 +2887,10 @@
RelativePath=".\..\src\table\strgen_tables.h"
>
+
+
diff --git a/projects/openttd_vs90.vcproj.in b/projects/openttd_vs90.vcproj.in
index 2793927bdb..ce90ab5f29 100644
--- a/projects/openttd_vs90.vcproj.in
+++ b/projects/openttd_vs90.vcproj.in
@@ -53,7 +53,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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\";WITH_ASSERT"
+ 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_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -155,7 +155,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
@@ -255,7 +255,7 @@
FavorSizeOrSpeed="2"
OmitFramePointers="true"
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;WITH_ASSERT"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
StringPooling="true"
ExceptionHandling="1"
RuntimeLibrary="0"
@@ -359,7 +359,7 @@
AdditionalOptions="/MP"
Optimization="0"
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
- PreprocessorDefinitions="WIN32;_DEBUG;_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;_DEBUG;_CONSOLE;WITH_SSE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU_SORT;WITH_ICU_LAYOUT;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
diff --git a/projects/settings_vs140.vcxproj b/projects/settings_vs140.vcxproj
new file mode 100644
index 0000000000..4fe07dbd64
--- /dev/null
+++ b/projects/settings_vs140.vcxproj
@@ -0,0 +1,54 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ settings
+ {0817F629-589E-4A3B-B81A-8647BC571E35}
+ settings
+
+
+
+ Makefile
+ v140
+
+
+
+
+
+
+
+
+
+..\objs\settings\settings_gen.exe -o ..\objs\settings\table\settings.h -b ..\src\table\settings.h.preamble -a ..\src\table\settings.h.postamble ..\src\table\company_settings.ini ..\src\table\currency_settings.ini ..\src\table\gameopt_settings.ini ..\src\table\misc_settings.ini ..\src\table\settings.ini ..\src\table\win32_settings.ini ..\src\table\window_settings.ini
+
+
+
+ ..\objs\settings\table\
+ ..\objs\settings\table\
+ $(SettingsCommandLine)
+ $(SettingsCommandLine)
+ del ..\objs\settings\table\settings.h
+ ..\objs\settings\table\settings.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/settings_vs140.vcxproj.filters b/projects/settings_vs140.vcxproj.filters
new file mode 100644
index 0000000000..8caf9fa0a6
--- /dev/null
+++ b/projects/settings_vs140.vcxproj.filters
@@ -0,0 +1,35 @@
+
+
+
+
+ {21deca6c-8df4-4f34-9dad-17d7781cd5a0}
+
+
+
+
+ INI
+
+
+ INI
+
+
+ INI
+
+
+ INI
+
+
+ INI
+
+
+ INI
+
+
+ INI
+
+
+
+
+
+
+
diff --git a/projects/settings_vs140.vcxproj.filters.in b/projects/settings_vs140.vcxproj.filters.in
new file mode 100644
index 0000000000..08f90670d2
--- /dev/null
+++ b/projects/settings_vs140.vcxproj.filters.in
@@ -0,0 +1,15 @@
+
+
+
+
+ {21deca6c-8df4-4f34-9dad-17d7781cd5a0}
+
+
+
+!!FILES!!
+
+
+
+
+
+
diff --git a/projects/settings_vs140.vcxproj.in b/projects/settings_vs140.vcxproj.in
new file mode 100644
index 0000000000..71ea738dcf
--- /dev/null
+++ b/projects/settings_vs140.vcxproj.in
@@ -0,0 +1,48 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ settings
+ {0817F629-589E-4A3B-B81A-8647BC571E35}
+ settings
+
+
+
+ Makefile
+ v140
+
+
+
+
+
+
+
+
+
+!!FILTERS!!
+
+
+
+ ..\objs\settings\table\
+ ..\objs\settings\table\
+ $(SettingsCommandLine)
+ $(SettingsCommandLine)
+ del ..\objs\settings\table\settings.h
+ ..\objs\settings\table\settings.h
+
+
+!!FILES!!
+
+
+
+
+
+
+
+
+
diff --git a/projects/settingsgen_vs140.vcxproj b/projects/settingsgen_vs140.vcxproj
new file mode 100644
index 0000000000..fc6d079e8e
--- /dev/null
+++ b/projects/settingsgen_vs140.vcxproj
@@ -0,0 +1,83 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ settingsgen
+ {E9548DE9-F089-49B7-93A6-30BE2CC311C7}
+ settings
+
+
+
+ Application
+ MultiByte
+ v140
+
+
+
+
+
+
+
+
+
+ <_ProjectFileVersion>10.0.30319.1
+ ..\objs\settings\
+ ..\objs\settings\
+ settings_gen
+
+
+
+
+
+
+
+ %(Inputs)
+
+
+ MinSpace
+ Size
+ SETTINGSGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ All
+ $(IntDir)$(TargetName).pdb
+ Level3
+ true
+ ProgramDatabase
+ MultiThreadedDebug
+
+
+ $(OutDir)settings_gen.exe
+ true
+ false
+
+
+ Console
+ 5.01
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/settingsgen_vs140.vcxproj.filters b/projects/settingsgen_vs140.vcxproj.filters
new file mode 100644
index 0000000000..c8afe0c8ed
--- /dev/null
+++ b/projects/settingsgen_vs140.vcxproj.filters
@@ -0,0 +1,32 @@
+
+
+
+
+ {a4678737-b3b3-4be5-9db1-fa6ccd164c59}
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/strgen_vs140.vcxproj b/projects/strgen_vs140.vcxproj
new file mode 100644
index 0000000000..ebf56a4daf
--- /dev/null
+++ b/projects/strgen_vs140.vcxproj
@@ -0,0 +1,95 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ strgen
+ {A133A442-BD0A-4ADE-B117-AD7545E4BDD1}
+ strgen
+
+
+
+ Application
+ false
+ MultiByte
+ v140
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)..\objs\strgen\
+ $(SolutionDir)..\objs\strgen\
+ false
+ AllRules.ruleset
+
+
+
+
+
+ .\Debug/strgen.tlb
+
+
+
+
+ /MP %(AdditionalOptions)
+ MinSpace
+ Size
+ STRGEN;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)
+ Default
+ MultiThreadedDebug
+
+
+ All
+ $(IntDir)
+ $(IntDir)
+ $(IntDir)$(TargetName).pdb
+ Level3
+ true
+ true
+ ProgramDatabase
+
+
+ _DEBUG;%(PreprocessorDefinitions)
+ 0x041d
+
+
+ true
+ true
+ $(IntDir)strgen.pdb
+ Console
+ false
+
+
+ MachineX86
+ 5.01
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/strgen_vs140.vcxproj.filters b/projects/strgen_vs140.vcxproj.filters
new file mode 100644
index 0000000000..58864ee691
--- /dev/null
+++ b/projects/strgen_vs140.vcxproj.filters
@@ -0,0 +1,35 @@
+
+
+
+
+ {5894294c-d4dc-41f0-be31-e56cff4e0405}
+ cpp;c;cxx;rc;def;r;odl;idl;hpj;bat
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/projects/version_vs140.vcxproj b/projects/version_vs140.vcxproj
new file mode 100644
index 0000000000..baf374bca0
--- /dev/null
+++ b/projects/version_vs140.vcxproj
@@ -0,0 +1,42 @@
+
+
+
+
+ Debug
+ Win32
+
+
+
+ version
+ {1A2B3C5E-1C23-41A5-9C9B-ACBA2AA75FEC}
+ version
+
+
+
+ Makefile
+ MultiByte
+ v140
+
+
+
+
+
+
+
+
+
+ $(SolutionDir)..\objs\version\
+ $(SolutionDir)..\objs\version\
+ cscript "$(ProjectDir)/determineversion.vbs"
+ cscript "$(ProjectDir)/determineversion.vbs"
+ ..\src\rev.cpp
+ del ..\src\rev.cpp
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/readme.txt b/readme.txt
index 79420b978d..e378bd5d22 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,5 +1,5 @@
-Last updated: 2015-02-24
-Release version: 1.5.0-beta2
+Last updated: 2016-07-01
+Release version: 1.6.1
------------------------------------------------------------------------
@@ -308,9 +308,9 @@ chosen main OpenTTD directory:
32bpp Sets: newgrf (or a subdirectory thereof)
Music Sets: baseset (or a subdirectory thereof)
AIs: ai (or a subdirectory thereof)
- AI Libraries: ai/libraries (or a subdirectory thereof)
+ AI Libraries: ai/library (or a subdirectory thereof)
Game Scripts (GS): game (or a subdirectory thereof)
- GS Libraries: game/libraries (or a subdirectory thereof)
+ GS Libraries: game/library (or a subdirectory thereof)
Savegames: save
Automatic Savegames: save/autosave
Scenarios: scenario
diff --git a/source.list b/source.list
index 3b66ab9fca..df35cdd26e 100644
--- a/source.list
+++ b/source.list
@@ -664,6 +664,7 @@ table/roadveh_movement.h
table/sprites.h
table/station_land.h
table/strgen_tables.h
+table/string_colours.h
../objs/langs/table/strings.h
table/town_land.h
table/townname.h
diff --git a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp
index 67b299bcec..540975fb5c 100644
--- a/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp
+++ b/src/3rdparty/squirrel/sqstdlib/sqstdaux.cpp
@@ -119,10 +119,10 @@ static SQInteger _sqstd_aux_printerror(HSQUIRRELVM v)
const SQChar *sErr = 0;
if(sq_gettop(v)>=1) {
if(SQ_SUCCEEDED(sq_getstring(v,2,&sErr))) {
- pf(v,"\nAN ERROR HAS OCCURED [%s]\n",sErr);
+ pf(v,"\nAN ERROR HAS OCCURRED [%s]\n",sErr);
}
else{
- pf(v,"\nAN ERROR HAS OCCURED [unknown]\n");
+ pf(v,"\nAN ERROR HAS OCCURRED [unknown]\n");
}
sqstd_printcallstack(v);
}
diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp
index 8374f7f315..0d769bf1f7 100644
--- a/src/3rdparty/squirrel/squirrel/sqapi.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp
@@ -798,7 +798,8 @@ SQRESULT sq_setdelegate(HSQUIRRELVM v,SQInteger idx)
switch(type) {
case OT_TABLE:
if(type(mt) == OT_TABLE) {
- if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delagate cycle"); v->Pop();}
+ if(!_table(self)->SetDelegate(_table(mt))) return sq_throwerror(v, "delagate cycle");
+ v->Pop();}
else if(type(mt)==OT_NULL) {
_table(self)->SetDelegate(NULL); v->Pop(); }
else return sq_aux_invalidtype(v,type);
@@ -1261,10 +1262,28 @@ struct BufState{
WChar buf_lexfeed(SQUserPointer file)
{
- BufState *buf=(BufState*)file;
- if(buf->size<(buf->ptr+1))
- return 0;
- return buf->buf[buf->ptr++];
+ /* Convert an UTF-8 character into a WChar */
+ BufState *buf = (BufState *)file;
+ const char *p = &buf->buf[buf->ptr];
+
+ if (buf->size < buf->ptr + 1) return 0;
+
+ /* Read the first character, and get the length based on UTF-8 specs. If invalid, bail out. */
+ uint len = Utf8EncodedCharLen(*p);
+ if (len == 0) {
+ buf->ptr++;
+ return -1;
+ }
+
+ /* Read the remaining bits. */
+ if (buf->size < buf->ptr + len) return 0;
+ buf->ptr += len;
+
+ /* Convert the character, and when definitely invalid, bail out as well. */
+ WChar c;
+ if (Utf8Decode(&c, p) != len) return -1;
+
+ return c;
}
SQRESULT sq_compilebuffer(HSQUIRRELVM v,const SQChar *s,SQInteger size,const SQChar *sourcename,SQBool raiseerror) {
diff --git a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp
index 2cc5f3d344..ace9d201e9 100644
--- a/src/3rdparty/squirrel/squirrel/sqcompiler.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqcompiler.cpp
@@ -57,7 +57,7 @@ typedef sqvector ExpStateVec;
class SQCompiler
{
public:
- SQCompiler(SQVM *v, SQLEXREADFUNC rg, SQUserPointer up, const SQChar* sourcename, bool raiseerror, bool lineinfo) : _lex(_ss(v), rg, up,ThrowError,this)
+ SQCompiler(SQVM *v, SQLEXREADFUNC rg, SQUserPointer up, const SQChar* sourcename, bool raiseerror, bool lineinfo) : _token(0), _fs(NULL), _lex(_ss(v), rg, up, ThrowError, this), _debugline(0), _debugop(0)
{
_vm=v;
_sourcename = SQString::Create(_ss(v), sourcename);
diff --git a/src/3rdparty/squirrel/squirrel/sqdebug.cpp b/src/3rdparty/squirrel/squirrel/sqdebug.cpp
index 74272e432a..b163fae52e 100644
--- a/src/3rdparty/squirrel/squirrel/sqdebug.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqdebug.cpp
@@ -105,7 +105,7 @@ void SQVM::Raise_IdxError(const SQObject &o)
void SQVM::Raise_CompareError(const SQObject &o1, const SQObject &o2)
{
SQObjectPtr oval1 = PrintObjVal(o1), oval2 = PrintObjVal(o2);
- Raise_Error("comparsion between '%.50s' and '%.50s'", _stringval(oval1), _stringval(oval2));
+ Raise_Error("comparison between '%.50s' and '%.50s'", _stringval(oval1), _stringval(oval2));
}
diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp
index 0c557d790b..101a97d0a9 100644
--- a/src/ai/ai_gui.cpp
+++ b/src/ai/ai_gui.cpp
@@ -28,6 +28,7 @@
#include "../widgets/dropdown_type.h"
#include "../widgets/dropdown_func.h"
#include "../hotkeys.h"
+#include "../core/geometry_func.hpp"
#include "ai.hpp"
#include "ai_gui.hpp"
@@ -305,7 +306,6 @@ struct AISettingsWindow : public Window {
timeout(0)
{
this->ai_config = GetConfig(slot);
- this->RebuildVisibleSettings();
this->CreateNestedTree();
this->vscroll = this->GetScrollbar(WID_AIS_SCROLLBAR);
@@ -313,7 +313,7 @@ struct AISettingsWindow : public Window {
this->SetWidgetDisabledState(WID_AIS_RESET, _game_mode != GM_MENU && Company::IsValidID(this->slot));
- this->vscroll->SetCount((int)this->visible_settings.size());
+ this->RebuildVisibleSettings();
}
virtual void SetStringParameters(int widget) const
@@ -341,6 +341,8 @@ struct AISettingsWindow : public Window {
visible_settings.push_back(&(*it));
}
}
+
+ this->vscroll->SetCount((int)this->visible_settings.size());
}
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
@@ -530,21 +532,23 @@ struct AISettingsWindow : public Window {
virtual void OnQueryTextFinished(char *str)
{
if (StrEmpty(str)) return;
- ScriptConfigItemList::const_iterator it = this->ai_config->GetConfigList()->begin();
+ VisibleSettingsList::const_iterator it = this->visible_settings.begin();
for (int i = 0; i < this->clicked_row; i++) it++;
- if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return;
+ const ScriptConfigItem config_item = **it;
+ if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
int32 value = atoi(str);
- this->ai_config->SetSetting((*it).name, value);
+ this->ai_config->SetSetting(config_item.name, value);
this->SetDirty();
}
virtual void OnDropdownSelect(int widget, int index)
{
assert(this->clicked_dropdown);
- ScriptConfigItemList::const_iterator it = this->ai_config->GetConfigList()->begin();
+ VisibleSettingsList::const_iterator it = this->visible_settings.begin();
for (int i = 0; i < this->clicked_row; i++) it++;
- if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return;
- this->ai_config->SetSetting((*it).name, index);
+ const ScriptConfigItem config_item = **it;
+ if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
+ this->ai_config->SetSetting(config_item.name, index);
this->SetDirty();
}
@@ -766,6 +770,22 @@ struct AIConfigWindow : public Window {
this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM;
size->height = 8 * this->line_height;
break;
+
+ case WID_AIC_CHANGE: {
+ SetDParam(0, STR_AI_CONFIG_CHANGE_GAMESCRIPT);
+ Dimension dim = GetStringBoundingBox(STR_AI_CONFIG_CHANGE);
+
+ SetDParam(0, STR_AI_CONFIG_CHANGE_NONE);
+ dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE));
+
+ SetDParam(0, STR_AI_CONFIG_CHANGE_AI);
+ dim = maxdim(dim, GetStringBoundingBox(STR_AI_CONFIG_CHANGE));
+
+ dim.width += padding.width;
+ dim.height += padding.height;
+ *size = maxdim(*size, dim);
+ break;
+ }
}
}
@@ -901,8 +921,7 @@ struct AIConfigWindow : public Window {
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
} else {
#if defined(ENABLE_NETWORK)
- ShowNetworkContentListWindow(NULL, CONTENT_TYPE_AI);
- _network_content_client.RequestContentList(CONTENT_TYPE_GAME);
+ ShowNetworkContentListWindow(NULL, CONTENT_TYPE_AI, CONTENT_TYPE_GAME);
#endif
}
break;
diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp
index ec7c896cee..2afd5d4199 100644
--- a/src/ai/ai_info.cpp
+++ b/src/ai/ai_info.cpp
@@ -28,7 +28,8 @@ static bool CheckAPIVersion(const char *api_version)
{
return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 ||
strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0 ||
- strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0;
+ strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0 || strcmp(api_version, "1.7") == 0 ||
+ strcmp(api_version, "1.8") == 0;
}
#if defined(WIN32)
diff --git a/src/aircraft.h b/src/aircraft.h
index 0805ae8ec6..f0ca1c4abb 100644
--- a/src/aircraft.h
+++ b/src/aircraft.h
@@ -93,7 +93,7 @@ struct Aircraft FINAL : public SpecializedVehicle {
void UpdateDeltaXY(Direction direction);
ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_AIRCRAFT_INC : EXPENSES_AIRCRAFT_RUN; }
bool IsPrimaryVehicle() const { return this->IsNormalAircraft(); }
- SpriteID GetImage(Direction direction, EngineImageType image_type) const;
+ void GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const;
int GetDisplaySpeed() const { return this->cur_speed; }
int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
int GetSpeedOldUnits() const { return this->vcache.cached_max_speed * 10 / 128; }
@@ -141,7 +141,7 @@ struct Aircraft FINAL : public SpecializedVehicle {
*/
#define FOR_ALL_AIRCRAFT(var) FOR_ALL_VEHICLES_OF_TYPE(Aircraft, var)
-SpriteID GetRotorImage(const Aircraft *v, EngineImageType image_type);
+void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result);
Station *GetTargetAirportIfValid(const Aircraft *v);
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index 18dcbea27b..c9cddbf97d 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -152,64 +152,69 @@ static StationID FindNearestHangar(const Aircraft *v)
return index;
}
-SpriteID Aircraft::GetImage(Direction direction, EngineImageType image_type) const
+void Aircraft::GetImage(Direction direction, EngineImageType image_type, VehicleSpriteSeq *result) const
{
uint8 spritenum = this->spritenum;
if (is_custom_sprite(spritenum)) {
- SpriteID sprite = GetCustomVehicleSprite(this, direction, image_type);
- if (sprite != 0) return sprite;
+ GetCustomVehicleSprite(this, direction, image_type, result);
+ if (result->IsValid()) return;
spritenum = this->GetEngine()->original_image_index;
}
assert(IsValidImageIndex(spritenum));
- return direction + _aircraft_sprite[spritenum];
+ result->Set(direction + _aircraft_sprite[spritenum]);
}
-SpriteID GetRotorImage(const Aircraft *v, EngineImageType image_type)
+void GetRotorImage(const Aircraft *v, EngineImageType image_type, VehicleSpriteSeq *result)
{
assert(v->subtype == AIR_HELICOPTER);
const Aircraft *w = v->Next()->Next();
if (is_custom_sprite(v->spritenum)) {
- SpriteID sprite = GetCustomRotorSprite(v, false, image_type);
- if (sprite != 0) return sprite;
+ GetCustomRotorSprite(v, false, image_type, result);
+ if (result->IsValid()) return;
}
/* Return standard rotor sprites if there are no custom sprites for this helicopter */
- return SPR_ROTOR_STOPPED + w->state;
+ result->Set(SPR_ROTOR_STOPPED + w->state);
}
-static SpriteID GetAircraftIcon(EngineID engine, EngineImageType image_type)
+static void GetAircraftIcon(EngineID engine, EngineImageType image_type, VehicleSpriteSeq *result)
{
const Engine *e = Engine::Get(engine);
uint8 spritenum = e->u.air.image_index;
if (is_custom_sprite(spritenum)) {
- SpriteID sprite = GetCustomVehicleIcon(engine, DIR_W, image_type);
- if (sprite != 0) return sprite;
+ GetCustomVehicleIcon(engine, DIR_W, image_type, result);
+ if (result->IsValid()) return;
spritenum = e->original_image_index;
}
assert(IsValidImageIndex(spritenum));
- return DIR_W + _aircraft_sprite[spritenum];
+ result->Set(DIR_W + _aircraft_sprite[spritenum]);
}
void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type)
{
- SpriteID sprite = GetAircraftIcon(engine, image_type);
- const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL);
+ VehicleSpriteSeq seq;
+ GetAircraftIcon(engine, image_type, &seq);
+
+ Rect rect;
+ seq.GetBounds(&rect);
preferred_x = Clamp(preferred_x,
- left - UnScaleGUI(real_sprite->x_offs),
- right - UnScaleGUI(real_sprite->width) - UnScaleGUI(real_sprite->x_offs));
- DrawSprite(sprite, pal, preferred_x, y);
+ left - UnScaleGUI(rect.left),
+ right - UnScaleGUI(rect.right));
+
+ seq.Draw(preferred_x, y, pal, pal == PALETTE_CRASH);
if (!(AircraftVehInfo(engine)->subtype & AIR_CTOL)) {
- SpriteID rotor_sprite = GetCustomRotorIcon(engine, image_type);
- if (rotor_sprite == 0) rotor_sprite = SPR_ROTOR_STOPPED;
- DrawSprite(rotor_sprite, PAL_NONE, preferred_x, y - ScaleGUITrad(5));
+ VehicleSpriteSeq rotor_seq;
+ GetCustomRotorIcon(engine, image_type, &rotor_seq);
+ if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED);
+ rotor_seq.Draw(preferred_x, y - ScaleGUITrad(5), PAL_NONE, false);
}
}
@@ -224,12 +229,16 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en
*/
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type)
{
- const Sprite *spr = GetSprite(GetAircraftIcon(engine, image_type), ST_NORMAL);
+ VehicleSpriteSeq seq;
+ GetAircraftIcon(engine, image_type, &seq);
- width = UnScaleGUI(spr->width);
- height = UnScaleGUI(spr->height);
- xoffs = UnScaleGUI(spr->x_offs);
- yoffs = UnScaleGUI(spr->y_offs);
+ Rect rect;
+ seq.GetBounds(&rect);
+
+ width = UnScaleGUI(rect.right - rect.left + 1);
+ height = UnScaleGUI(rect.bottom - rect.top + 1);
+ xoffs = UnScaleGUI(rect.left);
+ yoffs = UnScaleGUI(rect.top);
}
/**
@@ -317,7 +326,8 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
v->date_of_last_service = _date;
v->build_year = u->build_year = _cur_year;
- v->cur_image = u->cur_image = SPR_IMG_QUERY;
+ v->sprite_seq.Set(SPR_IMG_QUERY);
+ u->sprite_seq.Set(SPR_IMG_QUERY);
v->random_bits = VehicleRandomBits();
u->random_bits = VehicleRandomBits();
@@ -349,7 +359,7 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
w->vehstatus = VS_HIDDEN | VS_UNCLICKABLE;
w->spritenum = 0xFF;
w->subtype = AIR_ROTOR;
- w->cur_image = SPR_ROTOR_STOPPED;
+ w->sprite_seq.Set(SPR_ROTOR_STOPPED);
w->random_bits = VehicleRandomBits();
/* Use rotor's air.state to store the rotor animation frame */
w->state = HRS_ROTOR_STOPPED;
@@ -468,21 +478,21 @@ static void HelicopterTickHandler(Aircraft *v)
int tick = ++u->tick_counter;
int spd = u->cur_speed >> 4;
- SpriteID img;
+ VehicleSpriteSeq seq;
if (spd == 0) {
u->state = HRS_ROTOR_STOPPED;
- img = GetRotorImage(v, EIT_ON_MAP);
- if (u->cur_image == img) return;
+ GetRotorImage(v, EIT_ON_MAP, &seq);
+ if (u->sprite_seq == seq) return;
} else if (tick >= spd) {
u->tick_counter = 0;
u->state++;
if (u->state > HRS_ROTOR_MOVING_3) u->state = HRS_ROTOR_MOVING_1;
- img = GetRotorImage(v, EIT_ON_MAP);
+ GetRotorImage(v, EIT_ON_MAP, &seq);
} else {
return;
}
- u->cur_image = img;
+ u->sprite_seq = seq;
u->UpdatePositionAndViewport();
}
@@ -502,7 +512,9 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z)
v->UpdatePosition();
v->UpdateViewport(true, false);
- if (v->subtype == AIR_HELICOPTER) v->Next()->Next()->cur_image = GetRotorImage(v, EIT_ON_MAP);
+ if (v->subtype == AIR_HELICOPTER) {
+ GetRotorImage(v, EIT_ON_MAP, &v->Next()->Next()->sprite_seq);
+ }
Aircraft *u = v->Next();
@@ -513,7 +525,7 @@ void SetAircraftPosition(Aircraft *v, int x, int y, int z)
safe_y = Clamp(u->y_pos, 0, MapMaxY() * TILE_SIZE);
u->z_pos = GetSlopePixelZ(safe_x, safe_y);
- u->cur_image = v->cur_image;
+ u->sprite_seq.CopyWithoutPalette(v->sprite_seq); // the shadow is never coloured
u->UpdatePositionAndViewport();
@@ -809,7 +821,7 @@ static byte AircraftGetEntryPoint(const Aircraft *v, const AirportFTAClass *apc,
/* We are northwest or southeast of the airport */
dir = delta_y < 0 ? DIAGDIR_NW : DIAGDIR_SE;
}
- dir = ChangeDiagDir(dir, (DiagDirDiff)ReverseDiagDir(DirToDiagDir(rotation)));
+ dir = ChangeDiagDir(dir, DiagDirDifference(DIAGDIR_NE, DirToDiagDir(rotation)));
return apc->entry_points[dir];
}
@@ -1237,7 +1249,9 @@ void Aircraft::MarkDirty()
{
this->colourmap = PAL_NONE;
this->UpdateViewport(true, false);
- if (this->subtype == AIR_HELICOPTER) this->Next()->Next()->cur_image = GetRotorImage(this, EIT_ON_MAP);
+ if (this->subtype == AIR_HELICOPTER) {
+ GetRotorImage(this, EIT_ON_MAP, &this->Next()->Next()->sprite_seq);
+ }
}
diff --git a/src/aircraft_gui.cpp b/src/aircraft_gui.cpp
index c3379d3951..6693b1f8ad 100644
--- a/src/aircraft_gui.cpp
+++ b/src/aircraft_gui.cpp
@@ -83,11 +83,14 @@ void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID s
{
bool rtl = _current_text_dir == TD_RTL;
- SpriteID sprite = v->GetImage(rtl ? DIR_E : DIR_W, image_type);
- const Sprite *real_sprite = GetSprite(sprite, ST_NORMAL);
+ VehicleSpriteSeq seq;
+ v->GetImage(rtl ? DIR_E : DIR_W, image_type, &seq);
- int width = UnScaleGUI(real_sprite->width);
- int x_offs = UnScaleGUI(real_sprite->x_offs);
+ Rect rect;
+ seq.GetBounds(&rect);
+
+ int width = UnScaleGUI(rect.right - rect.left + 1);
+ int x_offs = UnScaleGUI(rect.left);
int x = rtl ? right - width - x_offs : left - x_offs;
bool helicopter = v->subtype == AIR_HELICOPTER;
@@ -95,17 +98,18 @@ void DrawAircraftImage(const Vehicle *v, int left, int right, int y, VehicleID s
int heli_offs = 0;
PaletteID pal = (v->vehstatus & VS_CRASHED) ? PALETTE_CRASH : GetVehiclePalette(v);
- DrawSprite(sprite, pal, x, y + y_offs);
+ seq.Draw(x, y + y_offs, pal, (v->vehstatus & VS_CRASHED) != 0);
if (helicopter) {
const Aircraft *a = Aircraft::From(v);
- SpriteID rotor_sprite = GetCustomRotorSprite(a, true, image_type);
- if (rotor_sprite == 0) rotor_sprite = SPR_ROTOR_STOPPED;
+ VehicleSpriteSeq rotor_seq;
+ GetCustomRotorSprite(a, true, image_type, &rotor_seq);
+ if (!rotor_seq.IsValid()) rotor_seq.Set(SPR_ROTOR_STOPPED);
heli_offs = ScaleGUITrad(5);
- DrawSprite(rotor_sprite, PAL_NONE, x, y + y_offs - heli_offs);
+ rotor_seq.Draw(x, y + y_offs - heli_offs, PAL_NONE, false);
}
if (v->index == selection) {
x += x_offs;
- y += UnScaleGUI(real_sprite->y_offs) + y_offs - heli_offs;
- DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(real_sprite->height) + heli_offs + 1, COLOUR_WHITE, FR_BORDERONLY);
+ y += UnScaleGUI(rect.top) + y_offs - heli_offs;
+ DrawFrameRect(x - 1, y - 1, x + width + 1, y + UnScaleGUI(rect.bottom - rect.top + 1) + heli_offs + 1, COLOUR_WHITE, FR_BORDERONLY);
}
}
diff --git a/src/articulated_vehicles.cpp b/src/articulated_vehicles.cpp
index 193c5ac4a8..04c9f95a97 100644
--- a/src/articulated_vehicles.cpp
+++ b/src/articulated_vehicles.cpp
@@ -433,6 +433,7 @@ void AddArticulatedParts(Vehicle *first)
v->x_pos = first->x_pos;
v->y_pos = first->y_pos;
v->z_pos = first->z_pos;
+ v->date_of_last_service = first->date_of_last_service;
v->build_year = first->build_year;
v->vehstatus = first->vehstatus & ~VS_STOPPED;
@@ -440,7 +441,7 @@ void AddArticulatedParts(Vehicle *first)
v->max_age = 0;
v->engine_type = engine_type;
v->value = 0;
- v->cur_image = SPR_IMG_QUERY;
+ v->sprite_seq.Set(SPR_IMG_QUERY);
v->random_bits = VehicleRandomBits();
if (flip_image) v->spritenum++;
diff --git a/src/autoreplace_gui.cpp b/src/autoreplace_gui.cpp
index 691042a1d5..1074d1dd78 100644
--- a/src/autoreplace_gui.cpp
+++ b/src/autoreplace_gui.cpp
@@ -87,7 +87,7 @@ class ReplaceVehicleWindow : public Window {
byte sort_criteria; ///< Criteria of sorting vehicles.
bool descending_sort_order; ///< Order of sorting vehicles.
bool show_hidden_engines; ///< Whether to show the hidden engines.
- RailType sel_railtype; ///< Type of rail tracks selected.
+ RailType sel_railtype; ///< Type of rail tracks selected. #INVALID_RAILTYPE to show all.
Scrollbar *vscroll[2];
/**
@@ -104,7 +104,7 @@ class ReplaceVehicleWindow : public Window {
/* Ensure that the wagon/engine selection fits the engine. */
if ((rvi->railveh_type == RAILVEH_WAGON) == show_engines) return false;
- if (draw_left && show_engines) {
+ if (draw_left && this->sel_railtype != INVALID_RAILTYPE) {
/* Ensure that the railtype is specific to the selected one */
if (rvi->railtype != this->sel_railtype) return false;
}
@@ -211,24 +211,7 @@ class ReplaceVehicleWindow : public Window {
public:
ReplaceVehicleWindow(WindowDesc *desc, VehicleType vehicletype, GroupID id_g) : Window(desc)
{
- if (vehicletype == VEH_TRAIN) {
- /* For rail vehicles find the most used vehicle type, which is usually
- * better than 'just' the first/previous vehicle type. */
- uint type_count[RAILTYPE_END];
- memset(type_count, 0, sizeof(type_count));
-
- const Engine *e;
- FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
- if (e->u.rail.railveh_type == RAILVEH_WAGON) continue;
- type_count[e->u.rail.railtype] += GetGroupNumEngines(_local_company, id_g, e->index);
- }
-
- this->sel_railtype = RAILTYPE_BEGIN;
- for (RailType rt = RAILTYPE_BEGIN; rt < RAILTYPE_END; rt++) {
- if (type_count[this->sel_railtype] < type_count[rt]) this->sel_railtype = rt;
- }
- }
-
+ this->sel_railtype = INVALID_RAILTYPE;
this->replace_engines = true; // start with locomotives (all other vehicles will not read this bool)
this->engines[0].ForceRebuild();
this->engines[1].ForceRebuild();
@@ -288,12 +271,9 @@ public:
break;
}
- case WID_RV_TRAIN_ENGINEWAGON_TOGGLE: {
- StringID str = this->GetWidget(widget)->widget_data;
- SetDParam(0, STR_REPLACE_ENGINES);
- Dimension d = GetStringBoundingBox(str);
- SetDParam(0, STR_REPLACE_WAGONS);
- d = maxdim(d, GetStringBoundingBox(str));
+ case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: {
+ Dimension d = GetStringBoundingBox(STR_REPLACE_ENGINES);
+ d = maxdim(d, GetStringBoundingBox(STR_REPLACE_WAGONS));
d.width += padding.width;
d.height += padding.height;
*size = maxdim(*size, d);
@@ -367,7 +347,7 @@ public:
break;
}
- case WID_RV_TRAIN_ENGINEWAGON_TOGGLE:
+ case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN:
SetDParam(0, this->replace_engines ? STR_REPLACE_ENGINES : STR_REPLACE_WAGONS);
break;
}
@@ -432,12 +412,8 @@ public:
this->SetWidgetDisabledState(WID_RV_STOP_REPLACE, this->sel_engine[0] == INVALID_ENGINE || !EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group));
if (this->window_number == VEH_TRAIN) {
- /* sets the colour of that art thing */
- this->GetWidget(WID_RV_TRAIN_FLUFF_LEFT)->colour = _company_colours[_local_company];
- this->GetWidget(WID_RV_TRAIN_FLUFF_RIGHT)->colour = _company_colours[_local_company];
-
/* Show the selected railtype in the pulldown menu */
- this->GetWidget(WID_RV_TRAIN_RAILTYPE_DROPDOWN)->widget_data = GetRailTypeInfo(sel_railtype)->strings.replace_text;
+ this->GetWidget(WID_RV_TRAIN_RAILTYPE_DROPDOWN)->widget_data = sel_railtype == INVALID_RAILTYPE ? STR_REPLACE_ALL_RAILTYPE : GetRailTypeInfo(sel_railtype)->strings.replace_text;
}
this->DrawWidgets();
@@ -483,15 +459,16 @@ public:
DisplayVehicleSortDropDown(this, static_cast(this->window_number), this->sort_criteria, WID_RV_SORT_DROPDOWN);
break;
- case WID_RV_TRAIN_ENGINEWAGON_TOGGLE:
- this->replace_engines = !(this->replace_engines);
- this->engines[0].ForceRebuild();
- this->reset_sel_engine = true;
- this->SetDirty();
+ case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: {
+ DropDownList *list = new DropDownList();
+ *list->Append() = new DropDownListStringItem(STR_REPLACE_ENGINES, 1, false);
+ *list->Append() = new DropDownListStringItem(STR_REPLACE_WAGONS, 0, false);
+ ShowDropDownList(this, list, this->replace_engines ? 1 : 0, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN);
break;
+ }
case WID_RV_TRAIN_RAILTYPE_DROPDOWN: // Railtype selection dropdown menu
- ShowDropDownList(this, GetRailTypeDropDownList(true), sel_railtype, WID_RV_TRAIN_RAILTYPE_DROPDOWN);
+ ShowDropDownList(this, GetRailTypeDropDownList(true, true), sel_railtype, WID_RV_TRAIN_RAILTYPE_DROPDOWN);
break;
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: // toggle renew_keep_length
@@ -566,6 +543,14 @@ public:
break;
}
+ case WID_RV_TRAIN_ENGINEWAGON_DROPDOWN: {
+ this->replace_engines = index != 0;
+ this->engines[0].ForceRebuild();
+ this->reset_sel_engine = true;
+ this->SetDirty();
+ break;
+ }
+
case WID_RV_START_REPLACE:
this->ReplaceClick_StartReplace(index != 0);
break;
@@ -611,7 +596,13 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
- NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
+ NWidget(NWID_VERTICAL),
+ NWidget(NWID_HORIZONTAL),
+ NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_RAILTYPE_DROPDOWN), SetMinimalSize(136, 12), SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE), SetFill(1, 0), SetResize(1, 0),
+ NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_ENGINEWAGON_DROPDOWN), SetDataTip(STR_BLACK_STRING, STR_REPLACE_ENGINE_WAGON_SELECT_HELP),
+ EndContainer(),
+ NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 0), EndContainer(),
+ EndContainer(),
NWidget(NWID_VERTICAL),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 1),
@@ -631,20 +622,16 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
- NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
+ NWidget(NWID_VERTICAL),
+ NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
+ NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_TRAIN_WAGONREMOVE_TOGGLE), SetMinimalSize(138, 12), SetDataTip(STR_REPLACE_REMOVE_WAGON, STR_REPLACE_REMOVE_WAGON_HELP), SetFill(1, 0), SetResize(1, 0),
+ EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB), SetResize(1, 0),
EndContainer(),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(150, 12), SetDataTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON),
- EndContainer(),
- NWidget(NWID_HORIZONTAL),
- NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_TRAIN_ENGINEWAGON_TOGGLE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_ENGINE_WAGON_SELECT, STR_REPLACE_ENGINE_WAGON_SELECT_HELP),
- NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_TRAIN_FLUFF_LEFT), SetMinimalSize(15, 12), EndContainer(),
- NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_RV_TRAIN_RAILTYPE_DROPDOWN), SetMinimalSize(136, 12), SetDataTip(0x0, STR_REPLACE_HELP_RAILTYPE), SetResize(1, 0),
- NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_TRAIN_FLUFF_RIGHT), SetMinimalSize(16, 12), EndContainer(),
- NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_TRAIN_WAGONREMOVE_TOGGLE), SetMinimalSize(138, 12), SetDataTip(STR_REPLACE_REMOVE_WAGON, STR_REPLACE_REMOVE_WAGON_HELP),
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
EndContainer(),
};
diff --git a/src/base_consist.cpp b/src/base_consist.cpp
index c7fcdec217..200512786c 100644
--- a/src/base_consist.cpp
+++ b/src/base_consist.cpp
@@ -44,4 +44,8 @@ void BaseConsist::CopyConsistPropertiesFrom(const BaseConsist *src)
if (HasBit(src->vehicle_flags, VF_TIMETABLE_STARTED)) SetBit(this->vehicle_flags, VF_TIMETABLE_STARTED);
if (HasBit(src->vehicle_flags, VF_AUTOFILL_TIMETABLE)) SetBit(this->vehicle_flags, VF_AUTOFILL_TIMETABLE);
if (HasBit(src->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME)) SetBit(this->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME);
+ if (HasBit(src->vehicle_flags, VF_SERVINT_IS_PERCENT) != HasBit(this->vehicle_flags, VF_SERVINT_IS_PERCENT)) {
+ ToggleBit(this->vehicle_flags, VF_SERVINT_IS_PERCENT);
+ }
+ if (HasBit(src->vehicle_flags, VF_SERVINT_IS_CUSTOM)) SetBit(this->vehicle_flags, VF_SERVINT_IS_CUSTOM);
}
diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp
index a3083e40b3..532ad23cc7 100644
--- a/src/blitter/32bpp_anim.cpp
+++ b/src/blitter/32bpp_anim.cpp
@@ -20,6 +20,11 @@
/** Instantiation of the 32bpp with animation blitter factory. */
static FBlitter_32bppAnim iFBlitter_32bppAnim;
+Blitter_32bppAnim::~Blitter_32bppAnim()
+{
+ free(this->anim_buf);
+}
+
template
inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom)
{
@@ -34,13 +39,14 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
}
Colour *dst = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
- uint16 *anim = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left;
+ assert(_screen.pitch == this->anim_buf_pitch); // precondition for translating 'bp->dst' into an 'anim_buf' offset below.
+ uint16 *anim = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_pitch + bp->left;
const byte *remap = bp->remap; // store so we don't have to access it via bp everytime
for (int y = 0; y < bp->height; y++) {
Colour *dst_ln = dst + bp->pitch;
- uint16 *anim_ln = anim + this->anim_buf_width;
+ uint16 *anim_ln = anim + this->anim_buf_pitch;
const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
src_px++;
@@ -274,9 +280,8 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height,
}
Colour *udst = (Colour *)dst;
- uint16 *anim;
-
- anim = this->anim_buf + ((uint32 *)dst - (uint32 *)_screen.dst_ptr);
+ assert(_screen.pitch == this->anim_buf_pitch); // precondition for translating 'dst' into an 'anim_buf' offset below.
+ uint16 *anim = this->anim_buf + ((uint32 *)dst - (uint32 *)_screen.dst_ptr);
if (pal == PALETTE_TO_TRANSPARENT) {
do {
@@ -287,7 +292,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height,
anim++;
}
udst = udst - width + _screen.pitch;
- anim = anim - width + this->anim_buf_width;
+ anim = anim - width + this->anim_buf_pitch;
} while (--height);
return;
}
@@ -300,7 +305,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height,
anim++;
}
udst = udst - width + _screen.pitch;
- anim = anim - width + this->anim_buf_width;
+ anim = anim - width + this->anim_buf_pitch;
} while (--height);
return;
}
@@ -314,7 +319,8 @@ void Blitter_32bppAnim::SetPixel(void *video, int x, int y, uint8 colour)
/* Set the colour in the anim-buffer too, if we are rendering to the screen */
if (_screen_disable_anim) return;
- this->anim_buf[((uint32 *)video - (uint32 *)_screen.dst_ptr) + x + y * this->anim_buf_width] = colour | (DEFAULT_BRIGHTNESS << 8);
+ assert(_screen.pitch == this->anim_buf_pitch); // precondition for translating 'video' into an 'anim_buf' offset below.
+ this->anim_buf[((uint32 *)video - (uint32 *)_screen.dst_ptr) + x + y * this->anim_buf_pitch] = colour | (DEFAULT_BRIGHTNESS << 8);
}
void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colour)
@@ -326,9 +332,8 @@ void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colou
}
Colour colour32 = LookupColourInPalette(colour);
- uint16 *anim_line;
-
- anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
+ assert(_screen.pitch == this->anim_buf_pitch); // precondition for translating 'video' into an 'anim_buf' offset below.
+ uint16 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
do {
Colour *dst = (Colour *)video;
@@ -342,7 +347,7 @@ void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colou
anim++;
}
video = (uint32 *)video + _screen.pitch;
- anim_line += this->anim_buf_width;
+ anim_line += this->anim_buf_pitch;
} while (--height);
}
@@ -352,6 +357,7 @@ void Blitter_32bppAnim::CopyFromBuffer(void *video, const void *src, int width,
assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
Colour *dst = (Colour *)video;
const uint32 *usrc = (const uint32 *)src;
+ assert(_screen.pitch == this->anim_buf_pitch); // precondition for translating 'video' into an 'anim_buf' offset below.
uint16 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
for (; height > 0; height--) {
@@ -365,7 +371,7 @@ void Blitter_32bppAnim::CopyFromBuffer(void *video, const void *src, int width,
/* Copy back the anim-buffer */
memcpy(anim_line, usrc, width * sizeof(uint16));
usrc = (const uint32 *)((const uint16 *)usrc + width);
- anim_line += this->anim_buf_width;
+ anim_line += this->anim_buf_pitch;
/* Okay, it is *very* likely that the image we stored is using
* the wrong palette animated colours. There are two things we
@@ -392,11 +398,11 @@ void Blitter_32bppAnim::CopyToBuffer(const void *video, void *dst, int width, in
assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
uint32 *udst = (uint32 *)dst;
const uint32 *src = (const uint32 *)video;
- const uint16 *anim_line;
if (this->anim_buf == NULL) return;
- anim_line = ((const uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
+ assert(_screen.pitch == this->anim_buf_pitch); // precondition for translating 'video' into an 'anim_buf' offset below.
+ const uint16 *anim_line = ((const uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
for (; height > 0; height--) {
memcpy(udst, src, width * sizeof(uint32));
@@ -405,7 +411,7 @@ void Blitter_32bppAnim::CopyToBuffer(const void *video, void *dst, int width, in
/* Copy the anim-buffer */
memcpy(udst, anim_line, width * sizeof(uint16));
udst = (uint32 *)((uint16 *)udst + width);
- anim_line += this->anim_buf_width;
+ anim_line += this->anim_buf_pitch;
}
}
@@ -417,8 +423,8 @@ void Blitter_32bppAnim::ScrollBuffer(void *video, int &left, int &top, int &widt
/* We need to scroll the anim-buffer too */
if (scroll_y > 0) {
- dst = this->anim_buf + left + (top + height - 1) * this->anim_buf_width;
- src = dst - scroll_y * this->anim_buf_width;
+ dst = this->anim_buf + left + (top + height - 1) * this->anim_buf_pitch;
+ src = dst - scroll_y * this->anim_buf_pitch;
/* Adjust left & width */
if (scroll_x >= 0) {
@@ -431,13 +437,13 @@ void Blitter_32bppAnim::ScrollBuffer(void *video, int &left, int &top, int &widt
uint th = height - scroll_y;
for (; th > 0; th--) {
memcpy(dst, src, tw * sizeof(uint16));
- src -= this->anim_buf_width;
- dst -= this->anim_buf_width;
+ src -= this->anim_buf_pitch;
+ dst -= this->anim_buf_pitch;
}
} else {
/* Calculate pointers */
- dst = this->anim_buf + left + top * this->anim_buf_width;
- src = dst - scroll_y * this->anim_buf_width;
+ dst = this->anim_buf + left + top * this->anim_buf_pitch;
+ src = dst - scroll_y * this->anim_buf_pitch;
/* Adjust left & width */
if (scroll_x >= 0) {
@@ -452,8 +458,8 @@ void Blitter_32bppAnim::ScrollBuffer(void *video, int &left, int &top, int &widt
uint th = height + scroll_y;
for (; th > 0; th--) {
memmove(dst, src, tw * sizeof(uint16));
- src += this->anim_buf_width;
- dst += this->anim_buf_width;
+ src += this->anim_buf_pitch;
+ dst += this->anim_buf_pitch;
}
}
@@ -490,6 +496,7 @@ void Blitter_32bppAnim::PaletteAnimate(const Palette &palette)
anim++;
}
dst += _screen.pitch - this->anim_buf_width;
+ anim += this->anim_buf_pitch - this->anim_buf_width;
}
/* Make sure the backend redraws the whole screen */
@@ -503,11 +510,13 @@ Blitter::PaletteAnimation Blitter_32bppAnim::UsePaletteAnimation()
void Blitter_32bppAnim::PostResize()
{
- if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height) {
+ if (_screen.width != this->anim_buf_width || _screen.height != this->anim_buf_height ||
+ _screen.pitch != this->anim_buf_pitch) {
/* The size of the screen changed; we can assume we can wipe all data from our buffer */
free(this->anim_buf);
- this->anim_buf = CallocT(_screen.width * _screen.height);
this->anim_buf_width = _screen.width;
this->anim_buf_height = _screen.height;
+ this->anim_buf_pitch = _screen.pitch;
+ this->anim_buf = CallocT(this->anim_buf_height * this->anim_buf_pitch);
}
}
diff --git a/src/blitter/32bpp_anim.hpp b/src/blitter/32bpp_anim.hpp
index e707c4437d..1b35c17663 100644
--- a/src/blitter/32bpp_anim.hpp
+++ b/src/blitter/32bpp_anim.hpp
@@ -20,14 +20,20 @@ protected:
uint16 *anim_buf; ///< In this buffer we keep track of the 8bpp indexes so we can do palette animation
int anim_buf_width; ///< The width of the animation buffer.
int anim_buf_height; ///< The height of the animation buffer.
+ int anim_buf_pitch; ///< The pitch of the animation buffer.
Palette palette; ///< The current palette.
public:
Blitter_32bppAnim() :
anim_buf(NULL),
anim_buf_width(0),
- anim_buf_height(0)
- {}
+ anim_buf_height(0),
+ anim_buf_pitch(0)
+ {
+ this->palette = _cur_palette;
+ }
+
+ ~Blitter_32bppAnim();
/* virtual */ void Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom);
/* virtual */ void DrawColourMappingRect(void *dst, int width, int height, PaletteID pal);
diff --git a/src/blitter/32bpp_anim_sse4.cpp b/src/blitter/32bpp_anim_sse4.cpp
index 7d4b66fca6..987cb0c6ac 100644
--- a/src/blitter/32bpp_anim_sse4.cpp
+++ b/src/blitter/32bpp_anim_sse4.cpp
@@ -35,7 +35,8 @@ inline void Blitter_32bppSSE4_Anim::Draw(const Blitter::BlitterParams *bp, ZoomL
{
const byte * const remap = bp->remap;
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;
+ assert(_screen.pitch == this->anim_buf_pitch); // precondition for translating 'bp->dst' into an 'anim_buf' offset below.
+ uint16 *anim_line = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_pitch + bp->left;
int effective_width = bp->width;
/* Find where to start reading in the source sprite. */
@@ -353,7 +354,7 @@ next_line:
if (mode != BM_TRANSPARENT) src_mv_line += si->sprite_width;
src_rgba_line = (const Colour*) ((const byte*) src_rgba_line + si->sprite_line_size);
dst_line += bp->pitch;
- anim_line += this->anim_buf_width;
+ anim_line += this->anim_buf_pitch;
}
}
IGNORE_UNINITIALIZED_WARNING_STOP
diff --git a/src/build_vehicle_gui.cpp b/src/build_vehicle_gui.cpp
index bd4bf3b59b..655a18d7f8 100644
--- a/src/build_vehicle_gui.cpp
+++ b/src/build_vehicle_gui.cpp
@@ -719,7 +719,15 @@ static int DrawShipPurchaseInfo(int left, int right, int y, EngineID engine_numb
return y;
}
-/* Draw aircraft specific details */
+/**
+ * Draw aircraft specific details in the buy window.
+ * @param left Left edge of the window to draw in.
+ * @param right Right edge of the window to draw in.
+ * @param y Top of the area to draw in.
+ * @param engine_number Engine to display.
+ * @param refittable If set, the aircraft can be refitted.
+ * @return Bottom of the used area.
+ */
static int DrawAircraftPurchaseInfo(int left, int right, int y, EngineID engine_number, bool refittable)
{
const Engine *e = Engine::Get(engine_number);
@@ -755,6 +763,12 @@ static int DrawAircraftPurchaseInfo(int left, int right, int y, EngineID engine_
DrawString(left, right, y, STR_PURCHASE_INFO_RUNNINGCOST);
y += FONT_HEIGHT_NORMAL;
+ /* Aircraft type */
+ SetDParam(0, e->GetAircraftTypeText());
+ DrawString(left, right, y, STR_PURCHASE_INFO_AIRCRAFT_TYPE);
+ y += FONT_HEIGHT_NORMAL;
+
+ /* Aircraft range, if available. */
uint16 range = e->GetRange();
if (range != 0) {
SetDParam(0, range);
diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp
index 2e9589aee2..f9eb88df54 100644
--- a/src/clear_cmd.cpp
+++ b/src/clear_cmd.cpp
@@ -56,7 +56,7 @@ void DrawHillyLandTile(const TileInfo *ti)
if (ti->tileh != SLOPE_FLAT) {
DrawGroundSprite(SPR_FLAT_ROUGH_LAND + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
} else {
- DrawGroundSprite(_landscape_clear_sprites_rough[GB(ti->x ^ ti->y, 4, 3)], PAL_NONE);
+ DrawGroundSprite(_landscape_clear_sprites_rough[GB(TileHash(ti->x, ti->y), 0, 3)], PAL_NONE);
}
}
diff --git a/src/command_func.h b/src/command_func.h
index c4cc51e3da..3369475675 100644
--- a/src/command_func.h
+++ b/src/command_func.h
@@ -81,7 +81,7 @@ CommandCallback CcBuildBridge;
/* dock_gui.cpp */
CommandCallback CcBuildDocks;
-CommandCallback CcBuildCanal;
+CommandCallback CcPlaySound_SPLAT_WATER;
/* depot_gui.cpp */
CommandCallback CcCloneVehicle;
@@ -97,19 +97,19 @@ CommandCallback CcAddVehicleNewGroup;
CommandCallback CcBuildIndustry;
/* main_gui.cpp */
-CommandCallback CcPlaySound10;
+CommandCallback CcPlaySound_EXPLOSION;
CommandCallback CcPlaceSign;
CommandCallback CcTerraform;
CommandCallback CcGiveMoney;
/* rail_gui.cpp */
-CommandCallback CcPlaySound1E;
+CommandCallback CcPlaySound_SPLAT_RAIL;
CommandCallback CcRailDepot;
CommandCallback CcStation;
CommandCallback CcBuildRailTunnel;
/* road_gui.cpp */
-CommandCallback CcPlaySound1D;
+CommandCallback CcPlaySound_SPLAT_OTHER;
CommandCallback CcBuildRoadTunnel;
CommandCallback CcRoadDepot;
CommandCallback CcRoadStop;
diff --git a/src/company_base.h b/src/company_base.h
index 6385d60495..4d76e6251a 100644
--- a/src/company_base.h
+++ b/src/company_base.h
@@ -45,17 +45,17 @@ struct CompanyInfrastructure {
}
};
-typedef Pool CompanyPool;
+typedef Pool CompanyPool;
extern CompanyPool _company_pool;
/** Statically loadable part of Company pool item */
struct CompanyProperties {
uint32 name_2; ///< Parameter of #name_1.
- uint16 name_1; ///< Name of the company if the user did not change it.
+ StringID name_1; ///< Name of the company if the user did not change it.
char *name; ///< Name of the company if the user changed it.
- uint16 president_name_1; ///< Name of the president if the user did not change it.
+ StringID president_name_1; ///< Name of the president if the user did not change it.
uint32 president_name_2; ///< Parameter of #president_name_1
char *president_name; ///< Name of the president if the user changed it.
diff --git a/src/company_gui.cpp b/src/company_gui.cpp
index 1343acb91b..0be6679583 100644
--- a/src/company_gui.cpp
+++ b/src/company_gui.cpp
@@ -1764,7 +1764,8 @@ struct CompanyInfrastructureWindow : Window
if (this->railtypes != RAILTYPES_NONE) {
/* Draw name of each valid railtype. */
- for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
+ RailType rt;
+ FOR_ALL_SORTED_RAILTYPES(rt) {
if (HasBit(this->railtypes, rt)) {
SetDParam(0, GetRailTypeInfo(rt)->strings.name);
DrawString(r.left + offs_left, r.right - offs_right, y += FONT_HEIGHT_NORMAL, STR_WHITE_STRING);
@@ -1781,7 +1782,8 @@ struct CompanyInfrastructureWindow : Window
case WID_CI_RAIL_COUNT: {
/* Draw infrastructure count for each valid railtype. */
uint32 rail_total = c->infrastructure.GetRailTotal();
- for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
+ RailType rt;
+ FOR_ALL_SORTED_RAILTYPES(rt) {
if (HasBit(this->railtypes, rt)) {
this->DrawCountLine(r, y, c->infrastructure.rail[rt], RailMaintenanceCost(rt, c->infrastructure.rail[rt], rail_total));
}
diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp
index 8d9e04113d..9cfc8e8f9d 100644
--- a/src/console_cmds.cpp
+++ b/src/console_cmds.cpp
@@ -45,6 +45,38 @@
/* scriptfile handling */
static bool _script_running; ///< Script is running (used to abort execution when #ConReturn is encountered).
+/** File list storage for the console, for caching the last 'ls' command. */
+class ConsoleFileList : public FileList {
+public:
+ ConsoleFileList() : FileList()
+ {
+ this->file_list_valid = false;
+ }
+
+ /** Declare the file storage cache as being invalid, also clears all stored files. */
+ void InvalidateFileList()
+ {
+ this->Clear();
+ this->file_list_valid = false;
+ }
+
+ /**
+ * (Re-)validate the file storage cache. Only makes a change if the storage was invalid, or if \a force_reload.
+ * @param Always reload the file storage cache.
+ */
+ void ValidateFileList(bool force_reload = false)
+ {
+ if (force_reload || !this->file_list_valid) {
+ this->BuildFileList(FT_SAVEGAME, SLO_LOAD);
+ this->file_list_valid = true;
+ }
+ }
+
+ bool file_list_valid; ///< If set, the file list is valid.
+};
+
+static ConsoleFileList _console_file_list; ///< File storage cache for the console.
+
/* console command defines */
#define DEF_CONSOLE_CMD(function) static bool function(byte argc, char *argv[])
#define DEF_CONSOLE_HOOK(function) static ConsoleHookResult function(bool echo)
@@ -286,7 +318,7 @@ DEF_CONSOLE_CMD(ConSave)
char *filename = str_fmt("%s.sav", argv[1]);
IConsolePrint(CC_DEFAULT, "Saving map...");
- if (SaveOrLoad(filename, SL_SAVE, SAVE_DIR) != SL_OK) {
+ if (SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, SAVE_DIR) != SL_OK) {
IConsolePrint(CC_ERROR, "Saving map failed");
} else {
IConsolePrintF(CC_DEFAULT, "Map successfully saved to %s", filename);
@@ -315,42 +347,6 @@ DEF_CONSOLE_CMD(ConSaveConfig)
return true;
}
-/**
- * Get savegame file informations.
- * @param file The savegame filename to return information about. Can be the actual name
- * or a numbered entry into the filename list.
- * @return FiosItem The information on the file.
- */
-static const FiosItem *GetFiosItem(const char *file)
-{
- _saveload_mode = SLD_LOAD_GAME;
- BuildFileList();
-
- for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) {
- if (strcmp(file, item->name) == 0) return item;
- if (strcmp(file, item->title) == 0) return item;
- }
-
- /* If no name matches, try to parse it as number */
- char *endptr;
- int i = strtol(file, &endptr, 10);
- if (file == endptr || *endptr != '\0') i = -1;
-
- if (IsInsideMM(i, 0, _fios_items.Length())) return _fios_items.Get(i);
-
- /* As a last effort assume it is an OpenTTD savegame and
- * that the ".sav" part was not given. */
- char long_file[MAX_PATH];
- seprintf(long_file, lastof(long_file), "%s.sav", file);
- for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) {
- if (strcmp(long_file, item->name) == 0) return item;
- if (strcmp(long_file, item->title) == 0) return item;
- }
-
- return NULL;
-}
-
-
DEF_CONSOLE_CMD(ConLoad)
{
if (argc == 0) {
@@ -361,24 +357,21 @@ DEF_CONSOLE_CMD(ConLoad)
if (argc != 2) return false;
const char *file = argv[1];
- const FiosItem *item = GetFiosItem(file);
+ _console_file_list.ValidateFileList();
+ const FiosItem *item = _console_file_list.FindItem(file);
if (item != NULL) {
- switch (item->type) {
- case FIOS_TYPE_FILE: case FIOS_TYPE_OLDFILE: {
- _switch_mode = SM_LOAD_GAME;
- SetFiosType(item->type);
-
- strecpy(_file_to_saveload.name, FiosBrowseTo(item), lastof(_file_to_saveload.name));
- strecpy(_file_to_saveload.title, item->title, lastof(_file_to_saveload.title));
- break;
- }
- default: IConsolePrintF(CC_ERROR, "%s: Not a savegame.", file);
+ if (GetAbstractFileType(item->type) == FT_SAVEGAME) {
+ _switch_mode = SM_LOAD_GAME;
+ _file_to_saveload.SetMode(item->type);
+ _file_to_saveload.SetName(FiosBrowseTo(item));
+ _file_to_saveload.SetTitle(item->title);
+ } else {
+ IConsolePrintF(CC_ERROR, "%s: Not a savegame.", file);
}
} else {
IConsolePrintF(CC_ERROR, "%s: No such file or directory.", file);
}
- FiosFreeSavegameList();
return true;
}
@@ -393,7 +386,8 @@ DEF_CONSOLE_CMD(ConRemove)
if (argc != 2) return false;
const char *file = argv[1];
- const FiosItem *item = GetFiosItem(file);
+ _console_file_list.ValidateFileList();
+ const FiosItem *item = _console_file_list.FindItem(file);
if (item != NULL) {
if (!FiosDelete(item->name)) {
IConsolePrintF(CC_ERROR, "%s: Failed to delete file", file);
@@ -402,7 +396,7 @@ DEF_CONSOLE_CMD(ConRemove)
IConsolePrintF(CC_ERROR, "%s: No such file or directory.", file);
}
- FiosFreeSavegameList();
+ _console_file_list.InvalidateFileList();
return true;
}
@@ -415,13 +409,11 @@ DEF_CONSOLE_CMD(ConListFiles)
return true;
}
- BuildFileList();
-
- for (uint i = 0; i < _fios_items.Length(); i++) {
- IConsolePrintF(CC_DEFAULT, "%d) %s", i, _fios_items[i].title);
+ _console_file_list.ValidateFileList(true);
+ for (uint i = 0; i < _console_file_list.Length(); i++) {
+ IConsolePrintF(CC_DEFAULT, "%d) %s", i, _console_file_list[i].title);
}
- FiosFreeSavegameList();
return true;
}
@@ -436,7 +428,8 @@ DEF_CONSOLE_CMD(ConChangeDirectory)
if (argc != 2) return false;
const char *file = argv[1];
- const FiosItem *item = GetFiosItem(file);
+ _console_file_list.ValidateFileList(true);
+ const FiosItem *item = _console_file_list.FindItem(file);
if (item != NULL) {
switch (item->type) {
case FIOS_TYPE_DIR: case FIOS_TYPE_DRIVE: case FIOS_TYPE_PARENT:
@@ -448,7 +441,7 @@ DEF_CONSOLE_CMD(ConChangeDirectory)
IConsolePrintF(CC_ERROR, "%s: No such file or directory.", file);
}
- FiosFreeSavegameList();
+ _console_file_list.InvalidateFileList();
return true;
}
@@ -462,8 +455,8 @@ DEF_CONSOLE_CMD(ConPrintWorkingDirectory)
}
/* XXX - Workaround for broken file handling */
- FiosGetSavegameList(SLD_LOAD_GAME);
- FiosFreeSavegameList();
+ _console_file_list.ValidateFileList(true);
+ _console_file_list.InvalidateFileList();
FiosGetDescText(&path, NULL);
IConsolePrint(CC_DEFAULT, path);
diff --git a/src/core/pool_func.hpp b/src/core/pool_func.hpp
index 4648f50d18..5569addbd7 100644
--- a/src/core/pool_func.hpp
+++ b/src/core/pool_func.hpp
@@ -121,7 +121,7 @@ DEFINE_POOL_METHOD(inline void *)::AllocateItem(size_t size, size_t index)
item = (Titem *)MallocT(size);
}
this->data[index] = item;
- item->index = (uint)index;
+ item->index = (Tindex)(uint)index;
return item;
}
diff --git a/src/core/smallvec_type.hpp b/src/core/smallvec_type.hpp
index 62de176a54..8676265d26 100644
--- a/src/core/smallvec_type.hpp
+++ b/src/core/smallvec_type.hpp
@@ -256,6 +256,8 @@ public:
/**
* Get the number of items in the list.
+ *
+ * @return The number of items in the list.
*/
inline uint Length() const
{
diff --git a/src/crashlog.cpp b/src/crashlog.cpp
index e8290a7c3f..53a85e442c 100644
--- a/src/crashlog.cpp
+++ b/src/crashlog.cpp
@@ -36,6 +36,38 @@
#include
+#ifdef WITH_ALLEGRO
+# include
+#endif /* WITH_ALLEGRO */
+#ifdef WITH_FONTCONFIG
+# include
+#endif /* WITH_FONTCONFIG */
+#ifdef WITH_PNG
+ /* pngconf.h, included by png.h doesn't like something in the
+ * freetype headers. As such it's not alphabetically sorted. */
+# include
+#endif /* WITH_PNG */
+#ifdef WITH_FREETYPE
+# include
+# include FT_FREETYPE_H
+#endif /* WITH_FREETYPE */
+#if defined(WITH_ICU_LAYOUT) || defined(WITH_ICU_SORT)
+# include
+#endif /* WITH_ICU_SORT || WITH_ICU_LAYOUT */
+#ifdef WITH_LZMA
+# include
+#endif
+#ifdef WITH_LZO
+#include
+#endif
+#ifdef WITH_SDL
+# include "sdl.h"
+# include
+#endif /* WITH_SDL */
+#ifdef WITH_ZLIB
+# include
+#endif
+
#include "safeguards.h"
/* static */ const char *CrashLog::message = NULL;
@@ -180,39 +212,6 @@ char *CrashLog::LogConfiguration(char *buffer, const char *last) const
return buffer;
}
-/* Include these here so it's close to where it's actually used. */
-#ifdef WITH_ALLEGRO
-# include
-#endif /* WITH_ALLEGRO */
-#ifdef WITH_FONTCONFIG
-# include
-#endif /* WITH_FONTCONFIG */
-#ifdef WITH_PNG
- /* pngconf.h, included by png.h doesn't like something in the
- * freetype headers. As such it's not alphabetically sorted. */
-# include
-#endif /* WITH_PNG */
-#ifdef WITH_FREETYPE
-# include
-# include FT_FREETYPE_H
-#endif /* WITH_FREETYPE */
-#ifdef WITH_ICU
-# include
-#endif /* WITH_ICU */
-#ifdef WITH_LZMA
-# include
-#endif
-#ifdef WITH_LZO
-#include
-#endif
-#ifdef WITH_SDL
-# include "sdl.h"
-# include
-#endif /* WITH_SDL */
-#ifdef WITH_ZLIB
-# include
-#endif
-
/**
* Writes information (versions) of the used libraries.
* @param buffer The begin where to write at.
@@ -241,14 +240,19 @@ char *CrashLog::LogLibraries(char *buffer, const char *last) const
buffer += seprintf(buffer, last, " FreeType: %d.%d.%d\n", major, minor, patch);
#endif /* WITH_FREETYPE */
-#ifdef WITH_ICU
+#if defined(WITH_ICU_LAYOUT) || defined(WITH_ICU_SORT)
/* 4 times 0-255, separated by dots (.) and a trailing '\0' */
char buf[4 * 3 + 3 + 1];
UVersionInfo ver;
u_getVersion(ver);
u_versionToString(ver, buf);
- buffer += seprintf(buffer, last, " ICU: %s\n", buf);
-#endif /* WITH_ICU */
+#ifdef WITH_ICU_SORT
+ buffer += seprintf(buffer, last, " ICU i18n: %s\n", buf);
+#endif
+#ifdef WITH_ICU_LAYOUT
+ buffer += seprintf(buffer, last, " ICU lx: %s\n", buf);
+#endif
+#endif /* WITH_ICU_SORT || WITH_ICU_LAYOUT */
#ifdef WITH_LZMA
buffer += seprintf(buffer, last, " LZMA: %s\n", lzma_version_string());
@@ -384,7 +388,7 @@ bool CrashLog::WriteSavegame(char *filename, const char *filename_last) const
seprintf(filename, filename_last, "%scrash.sav", _personal_dir);
/* Don't do a threaded saveload. */
- return SaveOrLoad(filename, SL_SAVE, NO_DIRECTORY, false) == SL_OK;
+ return SaveOrLoad(filename, SLO_SAVE, DFT_GAME_FILE, NO_DIRECTORY, false) == SL_OK;
} catch (...) {
return false;
}
diff --git a/src/depot_gui.cpp b/src/depot_gui.cpp
index fe75708ddf..47eefc65e9 100644
--- a/src/depot_gui.cpp
+++ b/src/depot_gui.cpp
@@ -229,6 +229,7 @@ struct DepotWindow : Window {
VehicleID vehicle_over; ///< Rail vehicle over which another one is dragged, \c INVALID_VEHICLE if none.
VehicleType type;
bool generate_list;
+ int hovered_widget; ///< Index of the widget being hovered during drag/drop. -1 if no drag is in progress.
VehicleList vehicle_list;
VehicleList wagon_list;
uint unitnumber_digits;
@@ -243,6 +244,7 @@ struct DepotWindow : Window {
this->sel = INVALID_VEHICLE;
this->vehicle_over = INVALID_VEHICLE;
this->generate_list = true;
+ this->hovered_widget = -1;
this->type = type;
this->num_columns = 1; // for non-trains this gets set in FinishInitNested()
this->unitnumber_digits = 2;
@@ -503,15 +505,12 @@ struct DepotWindow : Window {
this->sel = INVALID_VEHICLE;
TrainDepotMoveVehicle(v, sel, gdvp.head);
} else if (v != NULL) {
- bool rtl = _current_text_dir == TD_RTL;
- int image = v->GetImage(rtl ? DIR_E : DIR_W, EIT_IN_DEPOT);
- SetObjectToPlaceWnd(image, GetVehiclePalette(v), HT_DRAG, this);
+ SetObjectToPlaceWnd(SPR_CURSOR_MOUSE, PAL_NONE, HT_DRAG, this);
+ SetMouseCursorVehicle(v, EIT_IN_DEPOT);
+ _cursor.vehchain = _ctrl_pressed;
this->sel = v->index;
this->SetDirty();
-
- _cursor.short_vehicle_offset = v->IsGroundVehicle() ? (16 - v->GetGroundVehicleCache()->cached_veh_length * 2) * (rtl ? -1 : 1) : 0;
- _cursor.vehchain = _ctrl_pressed;
}
break;
}
@@ -661,7 +660,8 @@ struct DepotWindow : Window {
DepotSortList(&this->vehicle_list);
uint new_unitnumber_digits = GetUnitNumberDigits(this->vehicle_list);
- if (this->unitnumber_digits != new_unitnumber_digits) {
+ /* Only increase the size; do not decrease to prevent constant changes */
+ if (this->unitnumber_digits < new_unitnumber_digits) {
this->unitnumber_digits = new_unitnumber_digits;
this->ReInit();
}
@@ -867,11 +867,29 @@ struct DepotWindow : Window {
this->sel = INVALID_VEHICLE;
this->vehicle_over = INVALID_VEHICLE;
this->SetWidgetDirty(WID_D_MATRIX);
+
+ if (this->hovered_widget != -1) {
+ this->SetWidgetLoweredState(this->hovered_widget, false);
+ this->SetWidgetDirty(this->hovered_widget);
+ this->hovered_widget = -1;
+ }
}
virtual void OnMouseDrag(Point pt, int widget)
{
- if (this->type != VEH_TRAIN || this->sel == INVALID_VEHICLE) return;
+ if (this->sel == INVALID_VEHICLE) return;
+ if (widget != this->hovered_widget) {
+ if (this->hovered_widget == WID_D_SELL || this->hovered_widget == WID_D_SELL_CHAIN) {
+ this->SetWidgetLoweredState(this->hovered_widget, false);
+ this->SetWidgetDirty(this->hovered_widget);
+ }
+ this->hovered_widget = widget;
+ if (this->hovered_widget == WID_D_SELL || this->hovered_widget == WID_D_SELL_CHAIN) {
+ this->SetWidgetLoweredState(this->hovered_widget, true);
+ this->SetWidgetDirty(this->hovered_widget);
+ }
+ }
+ if (this->type != VEH_TRAIN) return;
/* A rail vehicle is dragged.. */
if (widget != WID_D_MATRIX) { // ..outside of the depot matrix.
@@ -958,7 +976,9 @@ struct DepotWindow : Window {
default:
this->sel = INVALID_VEHICLE;
this->SetDirty();
+ break;
}
+ this->hovered_widget = -1;
_cursor.vehchain = false;
}
diff --git a/src/direction_func.h b/src/direction_func.h
index 8889485842..12aee58639 100644
--- a/src/direction_func.h
+++ b/src/direction_func.h
@@ -61,11 +61,11 @@ static inline Direction ReverseDir(Direction d)
/**
- * Calculate the difference between to directions
+ * Calculate the difference between two directions
*
* @param d0 The first direction as the base
* @param d1 The second direction as the offset from the base
- * @return The difference how the second directions drifts of the first one.
+ * @return The difference how the second direction drifts of the first one.
*/
static inline DirDiff DirDifference(Direction d0, Direction d1)
{
@@ -79,7 +79,7 @@ static inline DirDiff DirDifference(Direction d0, Direction d1)
/**
* Applies two differences together
*
- * This function adds two differences together and return the resulting
+ * This function adds two differences together and returns the resulting
* difference. So adding two DIRDIFF_REVERSE together results in the
* DIRDIFF_SAME difference.
*
@@ -123,6 +123,20 @@ static inline DiagDirection ReverseDiagDir(DiagDirection d)
return (DiagDirection)(2 ^ d);
}
+/**
+ * Calculate the difference between two DiagDirection values
+ *
+ * @param d0 The first direction as the base
+ * @param d1 The second direction as the offset from the base
+ * @return The difference how the second direction drifts of the first one.
+ */
+static inline DiagDirDiff DiagDirDifference(DiagDirection d0, DiagDirection d1)
+{
+ assert(IsValidDiagDirection(d0));
+ assert(IsValidDiagDirection(d1));
+ /* Cast to uint so compiler can use bitmask. Result can never be negative. */
+ return (DiagDirDiff)((uint)(d0 - d1) % 4);
+}
/**
* Applies a difference on a DiagDirection
diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp
index d75e2d460e..98978ddfb0 100644
--- a/src/disaster_vehicle.cpp
+++ b/src/disaster_vehicle.cpp
@@ -112,7 +112,7 @@ void DisasterVehicle::UpdateImage()
{
SpriteID img = this->image_override;
if (img == 0) img = _disaster_images[this->subtype][this->direction];
- this->cur_image = img;
+ this->sprite_seq.Set(img);
}
/**
@@ -499,7 +499,8 @@ static bool DisasterTick_Helicopter_Rotors(DisasterVehicle *v)
v->tick_counter++;
if (HasBit(v->tick_counter, 0)) return true;
- if (++v->cur_image > SPR_ROTOR_MOVING_3) v->cur_image = SPR_ROTOR_MOVING_1;
+ SpriteID &cur_image = v->sprite_seq.seq[0].sprite;
+ if (++cur_image > SPR_ROTOR_MOVING_3) cur_image = SPR_ROTOR_MOVING_1;
v->UpdatePositionAndViewport();
diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp
index f6699daeff..79eaa89b14 100644
--- a/src/dock_gui.cpp
+++ b/src/dock_gui.cpp
@@ -48,7 +48,7 @@ void CcBuildDocks(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
}
-void CcBuildCanal(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
+void CcPlaySound_SPLAT_WATER(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
{
if (result.Succeeded() && _settings_client.sound.confirm) SndPlayTileFx(SND_02_SPLAT_WATER, tile);
}
@@ -235,10 +235,10 @@ struct BuildDocksToolbarWindow : Window {
GUIPlaceProcDragXY(select_proc, start_tile, end_tile);
break;
case DDSP_CREATE_WATER:
- DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_BUILD_CANALS), CcBuildCanal);
+ DoCommandP(end_tile, start_tile, (_game_mode == GM_EDITOR && _ctrl_pressed) ? WATER_CLASS_SEA : WATER_CLASS_CANAL, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_BUILD_CANALS), CcPlaySound_SPLAT_WATER);
break;
case DDSP_CREATE_RIVER:
- DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcBuildCanal);
+ DoCommandP(end_tile, start_tile, WATER_CLASS_RIVER, CMD_BUILD_CANAL | CMD_MSG(STR_ERROR_CAN_T_PLACE_RIVERS), CcPlaySound_SPLAT_WATER);
break;
default: break;
@@ -433,7 +433,7 @@ public:
* Never make the window smaller to avoid oscillating if the size change affects the acceptance.
* (This is the case, if making the window bigger moves the mouse into the window.) */
if (top > bottom) {
- ResizeWindow(this, 0, top - bottom);
+ ResizeWindow(this, 0, top - bottom, false);
}
}
diff --git a/src/economy.cpp b/src/economy.cpp
index 37a89b3f25..7461d34b77 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -300,7 +300,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
/* Single player cheated to AI company.
* There are no spectators in single player, so we must pick some other company. */
assert(!_networking);
- Backup cur_company(_current_company, FILE_LINE);
+ Backup cur_company2(_current_company, FILE_LINE);
Company *c;
FOR_ALL_COMPANIES(c) {
if (c->index != old_owner) {
@@ -308,7 +308,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
break;
}
}
- cur_company.Restore();
+ cur_company2.Restore();
assert(old_owner != _local_company);
}
@@ -431,11 +431,38 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
FreeUnitIDGenerator(VEH_SHIP, new_owner), FreeUnitIDGenerator(VEH_AIRCRAFT, new_owner)
};
+ /* Override company settings to new company defaults in case we need to convert them.
+ * This is required as the CmdChangeServiceInt doesn't copy the supplied value when it is non-custom
+ */
+ if (new_owner != INVALID_OWNER) {
+ Company *old_company = Company::Get(old_owner);
+ Company *new_company = Company::Get(new_owner);
+
+ old_company->settings.vehicle.servint_aircraft = new_company->settings.vehicle.servint_aircraft;
+ old_company->settings.vehicle.servint_trains = new_company->settings.vehicle.servint_trains;
+ old_company->settings.vehicle.servint_roadveh = new_company->settings.vehicle.servint_roadveh;
+ old_company->settings.vehicle.servint_ships = new_company->settings.vehicle.servint_ships;
+ old_company->settings.vehicle.servint_ispercent = new_company->settings.vehicle.servint_ispercent;
+ }
+
Vehicle *v;
FOR_ALL_VEHICLES(v) {
if (v->owner == old_owner && IsCompanyBuildableVehicleType(v->type)) {
assert(new_owner != INVALID_OWNER);
+ /* Correct default values of interval settings while maintaining custom set ones.
+ * This prevents invalid values on mismatching company defaults being accepted.
+ */
+ if (!v->ServiceIntervalIsCustom()) {
+ Company *new_company = Company::Get(new_owner);
+
+ /* Technically, passing the interval is not needed as the command will query the default value itself.
+ * However, do not rely on that behaviour.
+ */
+ int interval = CompanyServiceInterval(new_company, v->type);
+ DoCommand(v->tile, v->index, interval | (new_company->settings.vehicle.servint_ispercent << 17), DC_EXEC | DC_BANKRUPT, CMD_CHANGE_SERVICE_INT);
+ }
+
v->owner = new_owner;
/* Owner changes, clear cache */
@@ -1290,7 +1317,8 @@ static uint GetLoadAmount(Vehicle *v)
/* Scale load amount the same as capacity */
if (HasBit(e->info.misc_flags, EF_NO_DEFAULT_CARGO_MULTIPLIER) && !air_mail) load_amount = CeilDiv(load_amount * CargoSpec::Get(v->cargo_type)->multiplier, 0x100);
- return load_amount;
+ /* Zero load amount breaks a lot of things. */
+ return max(1u, load_amount);
}
/**
@@ -1615,15 +1643,14 @@ static void LoadUnloadVehicle(Vehicle *front)
if (v->cargo_cap == 0) continue;
artic_part++;
- uint load_amount = GetLoadAmount(v);
-
GoodsEntry *ge = &st->goods[v->cargo_type];
if (HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) && (front->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) {
uint cargo_count = v->cargo.UnloadCount();
- uint amount_unloaded = _settings_game.order.gradual_loading ? min(cargo_count, load_amount) : cargo_count;
+ uint amount_unloaded = _settings_game.order.gradual_loading ? min(cargo_count, GetLoadAmount(v)) : cargo_count;
bool remaining = false; // Are there cargo entities in this vehicle that can still be unloaded here?
+ assert(payment != NULL);
payment->SetCargo(v->cargo_type);
if (!HasBit(ge->status, GoodsEntry::GES_ACCEPTANCE) && v->cargo.ActionCount(VehicleCargoList::MTA_DELIVER) > 0) {
@@ -1725,8 +1752,8 @@ static void LoadUnloadVehicle(Vehicle *front)
* has capacity for it, load it on the vehicle. */
uint cap_left = v->cargo_cap - v->cargo.StoredCount();
if (cap_left > 0 && (v->cargo.ActionCount(VehicleCargoList::MTA_LOAD) > 0 || ge->cargo.AvailableCount() > 0)) {
- if (_settings_game.order.gradual_loading) cap_left = min(cap_left, load_amount);
if (v->cargo.StoredCount() == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO);
+ if (_settings_game.order.gradual_loading) cap_left = min(cap_left, GetLoadAmount(v));
uint loaded = ge->cargo.Load(cap_left, &v->cargo, st->xy, next_station);
if (v->cargo.ActionCount(VehicleCargoList::MTA_LOAD) > 0) {
diff --git a/src/effectvehicle.cpp b/src/effectvehicle.cpp
index 209b78d2e9..5921cd190e 100644
--- a/src/effectvehicle.cpp
+++ b/src/effectvehicle.cpp
@@ -22,10 +22,26 @@
#include "safeguards.h"
+/**
+ * Increment the sprite unless it has reached the end of the animation.
+ * @param v Vehicle to increment sprite of.
+ * @param last Last sprite of animation.
+ * @return true if the sprite was incremented, false if the end was reached.
+ */
+static bool IncrementSprite(EffectVehicle *v, SpriteID last)
+{
+ if (v->sprite_seq.seq[0].sprite != last) {
+ v->sprite_seq.seq[0].sprite++;
+ return true;
+ } else {
+ return false;
+ }
+}
+
static void ChimneySmokeInit(EffectVehicle *v)
{
uint32 r = Random();
- v->cur_image = SPR_CHIMNEY_SMOKE_0 + GB(r, 0, 3);
+ v->sprite_seq.Set(SPR_CHIMNEY_SMOKE_0 + GB(r, 0, 3));
v->progress = GB(r, 16, 3);
}
@@ -40,10 +56,8 @@ static bool ChimneySmokeTick(EffectVehicle *v)
return false;
}
- if (v->cur_image != SPR_CHIMNEY_SMOKE_7) {
- v->cur_image++;
- } else {
- v->cur_image = SPR_CHIMNEY_SMOKE_0;
+ if (!IncrementSprite(v, SPR_CHIMNEY_SMOKE_7)) {
+ v->sprite_seq.Set(SPR_CHIMNEY_SMOKE_0);
}
v->progress = 7;
v->UpdatePositionAndViewport();
@@ -54,7 +68,7 @@ static bool ChimneySmokeTick(EffectVehicle *v)
static void SteamSmokeInit(EffectVehicle *v)
{
- v->cur_image = SPR_STEAM_SMOKE_0;
+ v->sprite_seq.Set(SPR_STEAM_SMOKE_0);
v->progress = 12;
}
@@ -70,9 +84,7 @@ static bool SteamSmokeTick(EffectVehicle *v)
}
if ((v->progress & 0xF) == 4) {
- if (v->cur_image != SPR_STEAM_SMOKE_4) {
- v->cur_image++;
- } else {
+ if (!IncrementSprite(v, SPR_STEAM_SMOKE_4)) {
delete v;
return false;
}
@@ -86,7 +98,7 @@ static bool SteamSmokeTick(EffectVehicle *v)
static void DieselSmokeInit(EffectVehicle *v)
{
- v->cur_image = SPR_DIESEL_SMOKE_0;
+ v->sprite_seq.Set(SPR_DIESEL_SMOKE_0);
v->progress = 0;
}
@@ -98,13 +110,11 @@ static bool DieselSmokeTick(EffectVehicle *v)
v->z_pos++;
v->UpdatePositionAndViewport();
} else if ((v->progress & 7) == 1) {
- if (v->cur_image != SPR_DIESEL_SMOKE_5) {
- v->cur_image++;
- v->UpdatePositionAndViewport();
- } else {
+ if (!IncrementSprite(v, SPR_DIESEL_SMOKE_5)) {
delete v;
return false;
}
+ v->UpdatePositionAndViewport();
}
return true;
@@ -112,7 +122,7 @@ static bool DieselSmokeTick(EffectVehicle *v)
static void ElectricSparkInit(EffectVehicle *v)
{
- v->cur_image = SPR_ELECTRIC_SPARK_0;
+ v->sprite_seq.Set(SPR_ELECTRIC_SPARK_0);
v->progress = 1;
}
@@ -122,13 +132,12 @@ static bool ElectricSparkTick(EffectVehicle *v)
v->progress++;
} else {
v->progress = 0;
- if (v->cur_image != SPR_ELECTRIC_SPARK_5) {
- v->cur_image++;
- v->UpdatePositionAndViewport();
- } else {
+
+ if (!IncrementSprite(v, SPR_ELECTRIC_SPARK_5)) {
delete v;
return false;
}
+ v->UpdatePositionAndViewport();
}
return true;
@@ -136,7 +145,7 @@ static bool ElectricSparkTick(EffectVehicle *v)
static void SmokeInit(EffectVehicle *v)
{
- v->cur_image = SPR_SMOKE_0;
+ v->sprite_seq.Set(SPR_SMOKE_0);
v->progress = 12;
}
@@ -152,9 +161,7 @@ static bool SmokeTick(EffectVehicle *v)
}
if ((v->progress & 0xF) == 4) {
- if (v->cur_image != SPR_SMOKE_4) {
- v->cur_image++;
- } else {
+ if (!IncrementSprite(v, SPR_SMOKE_4)) {
delete v;
return false;
}
@@ -168,7 +175,7 @@ static bool SmokeTick(EffectVehicle *v)
static void ExplosionLargeInit(EffectVehicle *v)
{
- v->cur_image = SPR_EXPLOSION_LARGE_0;
+ v->sprite_seq.Set(SPR_EXPLOSION_LARGE_0);
v->progress = 0;
}
@@ -176,13 +183,11 @@ static bool ExplosionLargeTick(EffectVehicle *v)
{
v->progress++;
if ((v->progress & 3) == 0) {
- if (v->cur_image != SPR_EXPLOSION_LARGE_F) {
- v->cur_image++;
- v->UpdatePositionAndViewport();
- } else {
+ if (!IncrementSprite(v, SPR_EXPLOSION_LARGE_F)) {
delete v;
return false;
}
+ v->UpdatePositionAndViewport();
}
return true;
@@ -190,7 +195,7 @@ static bool ExplosionLargeTick(EffectVehicle *v)
static void BreakdownSmokeInit(EffectVehicle *v)
{
- v->cur_image = SPR_BREAKDOWN_SMOKE_0;
+ v->sprite_seq.Set(SPR_BREAKDOWN_SMOKE_0);
v->progress = 0;
}
@@ -198,10 +203,8 @@ static bool BreakdownSmokeTick(EffectVehicle *v)
{
v->progress++;
if ((v->progress & 7) == 0) {
- if (v->cur_image != SPR_BREAKDOWN_SMOKE_3) {
- v->cur_image++;
- } else {
- v->cur_image = SPR_BREAKDOWN_SMOKE_0;
+ if (!IncrementSprite(v, SPR_BREAKDOWN_SMOKE_3)) {
+ v->sprite_seq.Set(SPR_BREAKDOWN_SMOKE_0);
}
v->UpdatePositionAndViewport();
}
@@ -217,7 +220,7 @@ static bool BreakdownSmokeTick(EffectVehicle *v)
static void ExplosionSmallInit(EffectVehicle *v)
{
- v->cur_image = SPR_EXPLOSION_SMALL_0;
+ v->sprite_seq.Set(SPR_EXPLOSION_SMALL_0);
v->progress = 0;
}
@@ -225,13 +228,11 @@ static bool ExplosionSmallTick(EffectVehicle *v)
{
v->progress++;
if ((v->progress & 3) == 0) {
- if (v->cur_image != SPR_EXPLOSION_SMALL_B) {
- v->cur_image++;
- v->UpdatePositionAndViewport();
- } else {
+ if (!IncrementSprite(v, SPR_EXPLOSION_SMALL_B)) {
delete v;
return false;
}
+ v->UpdatePositionAndViewport();
}
return true;
@@ -239,7 +240,7 @@ static bool ExplosionSmallTick(EffectVehicle *v)
static void BulldozerInit(EffectVehicle *v)
{
- v->cur_image = SPR_BULLDOZER_NE;
+ v->sprite_seq.Set(SPR_BULLDOZER_NE);
v->progress = 0;
v->animation_state = 0;
v->animation_substate = 0;
@@ -290,7 +291,7 @@ static bool BulldozerTick(EffectVehicle *v)
if ((v->progress & 7) == 0) {
const BulldozerMovement *b = &_bulldozer_movement[v->animation_state];
- v->cur_image = SPR_BULLDOZER_NE + b->image;
+ v->sprite_seq.Set(SPR_BULLDOZER_NE + b->image);
v->x_pos += _inc_by_dir[b->direction].x;
v->y_pos += _inc_by_dir[b->direction].y;
@@ -312,7 +313,7 @@ static bool BulldozerTick(EffectVehicle *v)
static void BubbleInit(EffectVehicle *v)
{
- v->cur_image = SPR_BUBBLE_GENERATE_0;
+ v->sprite_seq.Set(SPR_BUBBLE_GENERATE_0);
v->spritenum = 0;
v->progress = 0;
}
@@ -475,8 +476,8 @@ static bool BubbleTick(EffectVehicle *v)
if ((v->progress & 3) != 0) return true;
if (v->spritenum == 0) {
- v->cur_image++;
- if (v->cur_image < SPR_BUBBLE_GENERATE_3) {
+ v->sprite_seq.seq[0].sprite++;
+ if (v->sprite_seq.seq[0].sprite < SPR_BUBBLE_GENERATE_3) {
v->UpdatePositionAndViewport();
return true;
}
@@ -521,7 +522,7 @@ static bool BubbleTick(EffectVehicle *v)
v->x_pos += b->x;
v->y_pos += b->y;
v->z_pos += b->z;
- v->cur_image = SPR_BUBBLE_0 + b->image;
+ v->sprite_seq.Set(SPR_BUBBLE_0 + b->image);
v->UpdatePositionAndViewport();
diff --git a/src/elrail.cpp b/src/elrail.cpp
index 1927be03e5..9fdfb57a3d 100644
--- a/src/elrail.cpp
+++ b/src/elrail.cpp
@@ -89,7 +89,7 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
{
switch (GetTileType(t)) {
case MP_RAILWAY:
- if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
+ if (!HasRailCatenary(GetRailType(t))) return TRACK_BIT_NONE;
switch (GetRailTileType(t)) {
case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS:
return GetTrackBits(t);
@@ -99,7 +99,8 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
break;
case MP_TUNNELBRIDGE:
- if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
+ if (GetTunnelBridgeTransportType(t) != TRANSPORT_RAIL) return TRACK_BIT_NONE;
+ if (!HasRailCatenary(GetRailType(t))) return TRACK_BIT_NONE;
if (override != NULL && (IsTunnel(t) || GetTunnelBridgeLength(t, GetOtherBridgeEnd(t)) > 0)) {
*override = 1 << GetTunnelBridgeDirection(t);
}
@@ -107,12 +108,12 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
case MP_ROAD:
if (!IsLevelCrossing(t)) return TRACK_BIT_NONE;
- if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
+ if (!HasRailCatenary(GetRailType(t))) return TRACK_BIT_NONE;
return GetCrossingRailBits(t);
case MP_STATION:
if (!HasStationRail(t)) return TRACK_BIT_NONE;
- if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
+ if (!HasRailCatenary(GetRailType(t))) return TRACK_BIT_NONE;
return TrackToTrackBits(GetRailStationTrack(t));
default:
@@ -135,7 +136,7 @@ static TrackBits MaskWireBits(TileIndex t, TrackBits tracks)
* axis that still display wires to preserve visual continuity. */
TileIndex next_tile = TileAddByDiagDir(t, d);
RailType rt = GetTileRailType(next_tile);
- if (rt == INVALID_RAILTYPE || !HasCatenary(rt) ||
+ if (rt == INVALID_RAILTYPE || !HasRailCatenary(rt) ||
((TrackStatusToTrackBits(GetTileTrackStatus(next_tile, TRANSPORT_RAIL, 0)) & DiagdirReachesTracks(d)) == TRACK_BIT_NONE &&
(!HasStationTileRail(next_tile) || GetRailStationAxis(next_tile) != DiagDirToAxis(d) || !CanStationTileHaveWires(next_tile)))) {
neighbour_tdb |= DiagdirReachesTrackdirs(ReverseDiagDir(d));
@@ -241,7 +242,7 @@ static int GetPCPElevation(TileIndex tile, DiagDirection PCPpos)
*
* @param ti The Tileinfo to draw the tile for
*/
-void DrawCatenaryOnTunnel(const TileInfo *ti)
+void DrawRailCatenaryOnTunnel(const TileInfo *ti)
{
/* xmin, ymin, xmax + 1, ymax + 1 of BB */
static const int _tunnel_wire_BB[4][4] = {
@@ -255,7 +256,7 @@ void DrawCatenaryOnTunnel(const TileInfo *ti)
SpriteID wire_base = GetWireBase(ti->tile);
- const SortableSpriteStruct *sss = &CatenarySpriteData_Tunnel[dir];
+ const SortableSpriteStruct *sss = &RailCatenarySpriteData_Tunnel[dir];
const int *BB_data = _tunnel_wire_BB[dir];
AddSortableSpriteToDraw(
wire_base + sss->image_offset, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
@@ -270,7 +271,7 @@ void DrawCatenaryOnTunnel(const TileInfo *ti)
* Draws wires and, if required, pylons on a given tile
* @param ti The Tileinfo to draw the tile for
*/
-static void DrawCatenaryRailway(const TileInfo *ti)
+static void DrawRailCatenaryRailway(const TileInfo *ti)
{
/* Pylons are placed on a tile edge, so we need to take into account
* the track configuration of 2 adjacent tiles. trackconfig[0] stores the
@@ -379,7 +380,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
if (IsTileType(neighbour, MP_STATION) || IsTileType(neighbour, MP_ROAD)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
/* Read the foundations if they are present, and adjust the tileh */
- if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && HasCatenary(GetRailType(neighbour))) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
+ if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && HasRailCatenary(GetRailType(neighbour))) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
if (IsBridgeTile(neighbour)) {
foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetTunnelBridgeDirection(neighbour)));
}
@@ -442,7 +443,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
}
}
- /* The wire above the tunnel is drawn together with the tunnel-roof (see DrawCatenaryOnTunnel()) */
+ /* The wire above the tunnel is drawn together with the tunnel-roof (see DrawRailCatenaryOnTunnel()) */
if (IsTunnelTile(ti->tile)) return;
/* Don't draw a wire under a low bridge */
@@ -478,7 +479,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
assert(PCPconfig != 0); // We have a pylon on neither end of the wire, that doesn't work (since we have no sprites for that)
assert(!IsSteepSlope(tileh[TS_HOME]));
- sss = &CatenarySpriteData[Wires[tileh_selector][t][PCPconfig]];
+ sss = &RailCatenarySpriteData[Wires[tileh_selector][t][PCPconfig]];
/*
* The "wire"-sprite position is inside the tile, i.e. 0 <= sss->?_offset < TILE_SIZE.
@@ -498,7 +499,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
*
* @param ti The Tileinfo to draw the tile for
*/
-void DrawCatenaryOnBridge(const TileInfo *ti)
+void DrawRailCatenaryOnBridge(const TileInfo *ti)
{
TileIndex end = GetSouthernBridgeEnd(ti->tile);
TileIndex start = GetOtherBridgeEnd(end);
@@ -511,15 +512,15 @@ void DrawCatenaryOnBridge(const TileInfo *ti)
Axis axis = GetBridgeAxis(ti->tile);
TLG tlg = GetTLG(ti->tile);
- CatenarySprite offset = (CatenarySprite)(axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH);
+ RailCatenarySprite offset = (RailCatenarySprite)(axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH);
if ((length % 2) && num == length) {
/* Draw the "short" wire on the southern end of the bridge
* only needed if the length of the bridge is odd */
- sss = &CatenarySpriteData[WIRE_X_FLAT_BOTH + offset];
+ sss = &RailCatenarySpriteData[WIRE_X_FLAT_BOTH + offset];
} else {
/* Draw "long" wires on all other tiles of the bridge (one pylon every two tiles) */
- sss = &CatenarySpriteData[WIRE_X_FLAT_SW + (num % 2) + offset];
+ sss = &RailCatenarySpriteData[WIRE_X_FLAT_SW + (num % 2) + offset];
}
height = GetBridgePixelHeight(end);
@@ -558,14 +559,14 @@ void DrawCatenaryOnBridge(const TileInfo *ti)
/**
* Draws overhead wires and pylons for electric railways.
* @param ti The TileInfo struct of the tile being drawn
- * @see DrawCatenaryRailway
+ * @see DrawRailCatenaryRailway
*/
-void DrawCatenary(const TileInfo *ti)
+void DrawRailCatenary(const TileInfo *ti)
{
switch (GetTileType(ti->tile)) {
case MP_RAILWAY:
if (IsRailDepot(ti->tile)) {
- const SortableSpriteStruct *sss = &CatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)];
+ const SortableSpriteStruct *sss = &RailCatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)];
SpriteID wire_base = GetWireBase(ti->tile);
@@ -587,7 +588,7 @@ void DrawCatenary(const TileInfo *ti)
default: return;
}
- DrawCatenaryRailway(ti);
+ DrawRailCatenaryRailway(ti);
}
bool SettingsDisableElrail(int32 p1)
diff --git a/src/elrail_func.h b/src/elrail_func.h
index 60cb782bbf..5cdae20c54 100644
--- a/src/elrail_func.h
+++ b/src/elrail_func.h
@@ -20,7 +20,7 @@
* Test if a rail type has catenary
* @param rt Rail type to test
*/
-static inline bool HasCatenary(RailType rt)
+static inline bool HasRailCatenary(RailType rt)
{
return HasBit(GetRailTypeInfo(rt)->flags, RTF_CATENARY);
}
@@ -29,14 +29,14 @@ static inline bool HasCatenary(RailType rt)
* Test if we should draw rail catenary
* @param rt Rail type to test
*/
-static inline bool HasCatenaryDrawn(RailType rt)
+static inline bool HasRailCatenaryDrawn(RailType rt)
{
- return HasCatenary(rt) && !IsInvisibilitySet(TO_CATENARY) && !_settings_game.vehicle.disable_elrails;
+ return HasRailCatenary(rt) && !IsInvisibilitySet(TO_CATENARY) && !_settings_game.vehicle.disable_elrails;
}
-void DrawCatenary(const TileInfo *ti);
-void DrawCatenaryOnTunnel(const TileInfo *ti);
-void DrawCatenaryOnBridge(const TileInfo *ti);
+void DrawRailCatenary(const TileInfo *ti);
+void DrawRailCatenaryOnTunnel(const TileInfo *ti);
+void DrawRailCatenaryOnBridge(const TileInfo *ti);
bool SettingsDisableElrail(int32 p1); ///< _settings_game.disable_elrail callback
diff --git a/src/engine.cpp b/src/engine.cpp
index f8fc0ee6aa..b0af3bc4df 100644
--- a/src/engine.cpp
+++ b/src/engine.cpp
@@ -48,11 +48,6 @@ EngineOverrideManager _engine_mngr;
*/
static Year _year_engine_aging_stops;
-/**
- * The railtypes that have been or never will be introduced, or
- * an inverse bitmap of rail types that have to be introduced. */
-static uint16 _introduced_railtypes;
-
/** Number of engines of each vehicle type in original engine data */
const uint8 _engine_counts[4] = {
lengthof(_orig_rail_vehicle_info),
@@ -85,6 +80,7 @@ Engine::Engine(VehicleType type, EngineID base)
this->type = type;
this->grf_prop.local_id = base;
this->list_position = base;
+ this->preview_company = INVALID_COMPANY;
/* Check if this base engine is within the original engine data range */
if (base >= _engine_counts[type]) {
@@ -468,7 +464,26 @@ uint16 Engine::GetRange() const
}
/**
- * Initializes the EngineOverrideManager with the default engines.
+ * Get the name of the aircraft type for display purposes.
+ * @return Aircraft type string.
+ */
+StringID Engine::GetAircraftTypeText() const
+{
+ switch (this->type) {
+ case VEH_AIRCRAFT:
+ switch (this->u.air.subtype) {
+ case AIR_HELI: return STR_LIVERY_HELICOPTER;
+ case AIR_CTOL: return STR_LIVERY_SMALL_PLANE;
+ case AIR_CTOL | AIR_FAST: return STR_LIVERY_LARGE_PLANE;
+ default: NOT_REACHED();
+ }
+
+ default: NOT_REACHED();
+ }
+}
+
+/**
+ * Initializes the #EngineOverrideManager with the default engines.
*/
void EngineOverrideManager::ResetToDefaultMapping()
{
@@ -542,29 +557,6 @@ void SetupEngines()
const Engine *e = new Engine(eid->type, eid->internal_id);
assert(e->index == index);
}
-
- _introduced_railtypes = 0;
-}
-
-/**
- * Check whether the railtypes should be introduced.
- */
-static void CheckRailIntroduction()
-{
- /* All railtypes have been introduced. */
- if (_introduced_railtypes == UINT16_MAX || Company::GetPoolSize() == 0) return;
-
- /* We need to find the railtypes that are known to all companies. */
- RailTypes rts = (RailTypes)UINT16_MAX;
-
- /* We are at, or past the introduction date of the rail. */
- Company *c;
- FOR_ALL_COMPANIES(c) {
- c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes, _date);
- rts &= c->avail_railtypes;
- }
-
- _introduced_railtypes |= rts;
}
void ShowEnginePreviewWindow(EngineID engine);
@@ -710,19 +702,6 @@ void StartupEngines()
c->avail_roadtypes = GetCompanyRoadtypes(c->index);
}
- /* Rail types that are invalid or never introduced are marked as
- * being introduced upon start. That way we can easily check whether
- * there is any date related introduction that is still going to
- * happen somewhere in the future. */
- for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
- const RailtypeInfo *rti = GetRailTypeInfo(rt);
- if (rti->label != 0 && IsInsideMM(rti->introduction_date, 0, MAX_DAY)) continue;
-
- SetBit(_introduced_railtypes, rt);
- }
-
- CheckRailIntroduction();
-
/* Invalidate any open purchase lists */
InvalidateWindowClassesData(WC_BUILD_VEHICLE);
}
@@ -819,7 +798,10 @@ static bool IsVehicleTypeDisabled(VehicleType type, bool ai)
/** Daily check to offer an exclusive engine preview to the companies. */
void EnginesDailyLoop()
{
- CheckRailIntroduction();
+ Company *c;
+ FOR_ALL_COMPANIES(c) {
+ c->avail_railtypes = AddDateIntroducedRailTypes(c->avail_railtypes, _date);
+ }
if (_cur_year >= _year_engine_aging_stops) return;
@@ -879,7 +861,7 @@ CommandCost CmdSetVehicleVisibility(TileIndex tile, DoCommandFlag flags, uint32
{
Engine *e = Engine::GetIfValid(GB(p2, 0, 31));
if (e == NULL || _current_company >= MAX_COMPANIES) return CMD_ERROR;
- if ((e->flags & ENGINE_AVAILABLE) == 0 || !HasBit(e->company_avail, _current_company)) return CMD_ERROR;
+ if (!IsEngineBuildable(e->index, e->type, _current_company)) return CMD_ERROR;
if ((flags & DC_EXEC) != 0) {
SB(e->company_hidden, _current_company, 1, GB(p2, 31, 1));
@@ -902,7 +884,7 @@ CommandCost CmdSetVehicleVisibility(TileIndex tile, DoCommandFlag flags, uint32
CommandCost CmdWantEnginePreview(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
{
Engine *e = Engine::GetIfValid(p1);
- if (e == NULL || e->preview_company != _current_company) return CMD_ERROR;
+ if (e == NULL || !(e->flags & ENGINE_EXCLUSIVE_PREVIEW) || e->preview_company != _current_company) return CMD_ERROR;
if (flags & DC_EXEC) AcceptEnginePreview(p1, _current_company);
diff --git a/src/engine_base.h b/src/engine_base.h
index 6a2e6816c3..25c6bfbeb9 100644
--- a/src/engine_base.h
+++ b/src/engine_base.h
@@ -111,6 +111,7 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> {
uint GetDisplayMaxTractiveEffort() const;
Date GetLifeLengthInDays() const;
uint16 GetRange() const;
+ StringID GetAircraftTypeText() const;
/**
* Check whether the engine is hidden in the GUI for the given company.
diff --git a/src/engine_gui.cpp b/src/engine_gui.cpp
index 899543c189..070ad67275 100644
--- a/src/engine_gui.cpp
+++ b/src/engine_gui.cpp
@@ -196,6 +196,7 @@ static StringID GetAircraftEngineInfoString(const Engine *e)
uint i = 0;
SetDParam(i++, e->GetCost());
SetDParam(i++, e->GetDisplayMaxSpeed());
+ SetDParam(i++, e->GetAircraftTypeText());
if (range > 0) SetDParam(i++, range);
SetDParam(i++, cargo);
SetDParam(i++, capacity);
@@ -204,10 +205,10 @@ static StringID GetAircraftEngineInfoString(const Engine *e)
SetDParam(i++, CT_MAIL);
SetDParam(i++, mail_capacity);
SetDParam(i++, e->GetRunningCost());
- return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_CAPACITY_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_CAPACITY_RUNCOST;
+ return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST;
} else {
SetDParam(i++, e->GetRunningCost());
- return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_RANGE_CAPACITY_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST;
+ return range > 0 ? STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST : STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST;
}
}
@@ -224,7 +225,7 @@ static StringID GetRoadVehEngineInfoString(const Engine *e)
SetDParam(2, CT_INVALID);
}
SetDParam(4, e->GetRunningCost());
- return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST;
+ return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST;
} else {
SetDParam(0, e->GetCost());
SetDParam(2, e->GetDisplayMaxSpeed());
@@ -252,7 +253,7 @@ static StringID GetShipEngineInfoString(const Engine *e)
SetDParam(2, e->GetDefaultCargoType());
SetDParam(3, e->GetDisplayDefaultCapacity());
SetDParam(4, e->GetRunningCost());
- return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAPACITY_RUNCOST;
+ return STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST;
}
diff --git a/src/engine_type.h b/src/engine_type.h
index aeebcb3522..8356fda8f8 100644
--- a/src/engine_type.h
+++ b/src/engine_type.h
@@ -158,6 +158,7 @@ enum EngineMiscFlags {
EF_AUTO_REFIT = 4, ///< Automatic refitting is allowed
EF_NO_DEFAULT_CARGO_MULTIPLIER = 5, ///< Use the new capacity algorithm. The default cargotype of the vehicle does not affect capacity multipliers. CB 15 is also called in purchase list.
EF_NO_BREAKDOWN_SMOKE = 6, ///< Do not show black smoke during a breakdown.
+ EF_SPRITE_STACK = 7, ///< Draw vehicle by stacking multiple sprites.
};
/**
diff --git a/src/error_gui.cpp b/src/error_gui.cpp
index 98988de5a0..c8c603afb3 100644
--- a/src/error_gui.cpp
+++ b/src/error_gui.cpp
@@ -182,21 +182,30 @@ public:
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
- if (widget != WID_EM_MESSAGE) return;
+ switch (widget) {
+ case WID_EM_MESSAGE: {
+ 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);
- 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);
+ 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_detailed = (this->detailed_msg == INVALID_STRING_ID) ? 0 : GetStringHeight(this->detailed_msg, text_width);
- 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_detailed = (this->detailed_msg == INVALID_STRING_ID) ? 0 : GetStringHeight(this->detailed_msg, text_width);
+ if (this->textref_stack_size > 0) StopTextRefStackUsage();
- if (this->textref_stack_size > 0) StopTextRefStackUsage();
+ uint panel_height = WD_FRAMERECT_TOP + this->height_summary + WD_FRAMERECT_BOTTOM;
+ if (this->detailed_msg != INVALID_STRING_ID) panel_height += this->height_detailed + WD_PAR_VSEP_WIDE;
- uint panel_height = WD_FRAMERECT_TOP + this->height_summary + WD_FRAMERECT_BOTTOM;
- if (this->detailed_msg != INVALID_STRING_ID) panel_height += this->height_detailed + WD_PAR_VSEP_WIDE;
-
- size->height = max(size->height, panel_height);
+ size->height = max(size->height, panel_height);
+ break;
+ }
+ case WID_EM_FACE: {
+ Dimension face_size = GetSpriteSize(SPR_GRADIENT);
+ size->width = max(size->width, face_size.width);
+ size->height = max(size->height, face_size.height);
+ break;
+ }
+ }
}
virtual Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number)
diff --git a/src/fileio_type.h b/src/fileio_type.h
index 87cb2d1a82..fd3ac84554 100644
--- a/src/fileio_type.h
+++ b/src/fileio_type.h
@@ -14,6 +14,96 @@
#include "core/enum_type.hpp"
+/** The different abstract types of files that the system knows about. */
+enum AbstractFileType {
+ FT_NONE, ///< nothing to do
+ FT_SAVEGAME, ///< old or new savegame
+ FT_SCENARIO, ///< old or new scenario
+ FT_HEIGHTMAP, ///< heightmap file
+
+ FT_INVALID = 7, ///< Invalid or unknown file type.
+ FT_NUMBITS = 3, ///< Number of bits required for storing a #AbstractFileType value.
+ FT_MASK = (1 << FT_NUMBITS) - 1, ///< Bitmask for extracting an abstract file type.
+};
+
+/** Kinds of files in each #AbstractFileType. */
+enum DetailedFileType {
+ /* Save game and scenario files. */
+ DFT_OLD_GAME_FILE, ///< Old save game or scenario file.
+ DFT_GAME_FILE, ///< Save game or scenario file.
+
+ /* Heightmap files. */
+ DFT_HEIGHTMAP_BMP, ///< BMP file.
+ DFT_HEIGHTMAP_PNG, ///< PNG file.
+
+ /* fios 'files' */
+ DFT_FIOS_DRIVE, ///< A drive (letter) entry.
+ DFT_FIOS_PARENT, ///< A parent directory entry.
+ DFT_FIOS_DIR, ///< A directory entry.
+ DFT_FIOS_DIRECT, ///< Direct filename.
+
+ DFT_INVALID = 255, ///< Unknown or invalid file.
+};
+
+/** Operation performed on the file. */
+enum SaveLoadOperation {
+ SLO_CHECK, ///< Load file for checking and/or preview.
+ SLO_LOAD, ///< File is being loaded.
+ SLO_SAVE, ///< File is being saved.
+
+ SLO_INVALID, ///< Unknown file operation.
+};
+
+/**
+ * Construct an enum value for #FiosType as a combination of an abstract and a detailed file type.
+ * @param abstract Abstract file type (one of #AbstractFileType).
+ * @param detailed Detailed file type (one of #DetailedFileType).
+ */
+#define MAKE_FIOS_TYPE(abstract, detailed) ((abstract) | ((detailed) << FT_NUMBITS))
+
+/**
+ * Elements of a file system that are recognized.
+ * Values are a combination of #AbstractFileType and #DetailedFileType.
+ * @see GetAbstractFileType GetDetailedFileType
+ */
+enum FiosType {
+ FIOS_TYPE_DRIVE = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_DRIVE),
+ FIOS_TYPE_PARENT = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_PARENT),
+ FIOS_TYPE_DIR = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_DIR),
+ FIOS_TYPE_DIRECT = MAKE_FIOS_TYPE(FT_NONE, DFT_FIOS_DIRECT),
+
+ FIOS_TYPE_FILE = MAKE_FIOS_TYPE(FT_SAVEGAME, DFT_GAME_FILE),
+ FIOS_TYPE_OLDFILE = MAKE_FIOS_TYPE(FT_SAVEGAME, DFT_OLD_GAME_FILE),
+ FIOS_TYPE_SCENARIO = MAKE_FIOS_TYPE(FT_SCENARIO, DFT_GAME_FILE),
+ FIOS_TYPE_OLD_SCENARIO = MAKE_FIOS_TYPE(FT_SCENARIO, DFT_OLD_GAME_FILE),
+ FIOS_TYPE_PNG = MAKE_FIOS_TYPE(FT_HEIGHTMAP, DFT_HEIGHTMAP_PNG),
+ FIOS_TYPE_BMP = MAKE_FIOS_TYPE(FT_HEIGHTMAP, DFT_HEIGHTMAP_BMP),
+
+ FIOS_TYPE_INVALID = MAKE_FIOS_TYPE(FT_INVALID, DFT_INVALID),
+};
+
+#undef MAKE_FIOS_TYPE
+
+/**
+ * Extract the abstract file type from a #FiosType.
+ * @param fios_type Type to query.
+ * @return The Abstract file type of the \a fios_type.
+ */
+inline AbstractFileType GetAbstractFileType(FiosType fios_type)
+{
+ return static_cast(fios_type & FT_MASK);
+}
+
+/**
+ * Extract the detailed file type from a #FiosType.
+ * @param fios_type Type to query.
+ * @return The Detailed file type of the \a fios_type.
+ */
+inline DetailedFileType GetDetailedFileType(FiosType fios_type)
+{
+ return static_cast(fios_type >> FT_NUMBITS);
+}
+
/**
* The different kinds of subdirectories OpenTTD uses
*/
diff --git a/src/fios.cpp b/src/fios.cpp
index 00ed5a484c..8ed01152f0 100644
--- a/src/fios.cpp
+++ b/src/fios.cpp
@@ -29,17 +29,15 @@
#include "safeguards.h"
/* Variables to display file lists */
-SmallVector _fios_items;
static char *_fios_path;
static const char *_fios_path_last;
-SmallFiosItem _file_to_saveload;
SortingBits _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING;
/* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */
extern bool FiosIsRoot(const char *path);
extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
extern bool FiosIsHiddenFile(const struct dirent *ent);
-extern void FiosGetDrives();
+extern void FiosGetDrives(FileList &file_list);
extern bool FiosGetDiskFreeSpace(const char *path, uint64 *tot);
/* get the name of an oldstyle savegame */
@@ -65,11 +63,72 @@ int CDECL CompareFiosItems(const FiosItem *da, const FiosItem *db)
return r;
}
-/** Free the list of savegames. */
-void FiosFreeSavegameList()
+FileList::~FileList()
{
- _fios_items.Clear();
- _fios_items.Compact();
+ this->Clear();
+}
+
+/**
+ * Construct a file list with the given kind of files, for the stated purpose.
+ * @param abstract_filetype Kind of files to collect.
+ * @param fop Purpose of the collection, either #SLO_LOAD or #SLO_SAVE.
+ */
+void FileList::BuildFileList(AbstractFileType abstract_filetype, SaveLoadOperation fop)
+{
+ this->Clear();
+
+ assert(fop == SLO_LOAD || SLO_SAVE);
+ switch (abstract_filetype) {
+ case FT_NONE:
+ break;
+
+ case FT_SAVEGAME:
+ FiosGetSavegameList(fop, *this);
+ break;
+
+ case FT_SCENARIO:
+ FiosGetScenarioList(fop, *this);
+ break;
+
+ case FT_HEIGHTMAP:
+ FiosGetHeightmapList(fop, *this);
+ break;
+
+ default:
+ NOT_REACHED();
+ }
+}
+
+/**
+ * Find file information of a file by its name from the file list.
+ * @param file The filename to return information about. Can be the actual name
+ * or a numbered entry into the filename list.
+ * @return The information on the file, or \c NULL if the file is not available.
+ */
+const FiosItem *FileList::FindItem(const char *file)
+{
+ for (const FiosItem *item = this->Begin(); item != this->End(); item++) {
+ if (strcmp(file, item->name) == 0) return item;
+ if (strcmp(file, item->title) == 0) return item;
+ }
+
+ /* If no name matches, try to parse it as number */
+ char *endptr;
+ int i = strtol(file, &endptr, 10);
+ if (file == endptr || *endptr != '\0') i = -1;
+
+ if (IsInsideMM(i, 0, this->Length())) return this->Get(i);
+
+ /* As a last effort assume it is an OpenTTD savegame and
+ * that the ".sav" part was not given. */
+ char long_file[MAX_PATH];
+ seprintf(long_file, lastof(long_file), "%s.sav", file);
+ for (const FiosItem *item = this->Begin(); item != this->End(); item++) {
+ if (strcmp(long_file, item->name) == 0) return item;
+ if (strcmp(long_file, item->title) == 0) return item;
+ }
+
+ return NULL;
}
/**
@@ -215,23 +274,24 @@ bool FiosDelete(const char *name)
return unlink(filename) == 0;
}
-typedef FiosType fios_getlist_callback_proc(SaveLoadDialogMode mode, const char *filename, const char *ext, char *title, const char *last);
+typedef FiosType fios_getlist_callback_proc(SaveLoadOperation fop, const char *filename, const char *ext, char *title, const char *last);
/**
* Scanner to scan for a particular type of FIOS file.
*/
class FiosFileScanner : public FileScanner {
- SaveLoadDialogMode mode; ///< The mode we want to search for
+ SaveLoadOperation fop; ///< The kind of file we are looking for.
fios_getlist_callback_proc *callback_proc; ///< Callback to check whether the file may be added
+ FileList &file_list; ///< Destination of the found files.
public:
/**
* Create the scanner
- * @param mode The mode we are in. Some modes don't allow 'parent'.
- * @param callback_proc The function that is called where you need to do the filtering.
+ * @param fop Purpose of collecting the list.
+ * @param callback_proc The function that is called where you need to do the filtering.
+ * @param file_list Destination of the found files.
*/
- FiosFileScanner(SaveLoadDialogMode mode, fios_getlist_callback_proc *callback_proc) :
- mode(mode),
- callback_proc(callback_proc)
+ FiosFileScanner(SaveLoadOperation fop, fios_getlist_callback_proc *callback_proc, FileList &file_list) :
+ fop(fop), callback_proc(callback_proc), file_list(file_list)
{}
/* virtual */ bool AddFile(const char *filename, size_t basepath_length, const char *tar_filename);
@@ -251,14 +311,14 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons
char fios_title[64];
fios_title[0] = '\0'; // reset the title;
- FiosType type = this->callback_proc(this->mode, filename, ext, fios_title, lastof(fios_title));
+ FiosType type = this->callback_proc(this->fop, filename, ext, fios_title, lastof(fios_title));
if (type == FIOS_TYPE_INVALID) return false;
- for (const FiosItem *fios = _fios_items.Begin(); fios != _fios_items.End(); fios++) {
+ for (const FiosItem *fios = file_list.Begin(); fios != file_list.End(); fios++) {
if (strcmp(fios->name, filename) == 0) return false;
}
- FiosItem *fios = _fios_items.Append();
+ FiosItem *fios = file_list.Append();
#ifdef WIN32
struct _stat sb;
if (_tstat(OTTD2FS(filename), &sb) == 0) {
@@ -289,11 +349,12 @@ bool FiosFileScanner::AddFile(const char *filename, size_t basepath_length, cons
/**
* Fill the list of the files in a directory, according to some arbitrary rule.
- * @param mode The mode we are in. Some modes don't allow 'parent'.
- * @param callback_proc The function that is called where you need to do the filtering.
- * @param subdir The directory from where to start (global) searching.
+ * @param fop Purpose of collecting the list.
+ * @param callback_proc The function that is called where you need to do the filtering.
+ * @param subdir The directory from where to start (global) searching.
+ * @param file_list Destination of the found files.
*/
-static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc *callback_proc, Subdirectory subdir)
+static void FiosGetFileList(SaveLoadOperation fop, fios_getlist_callback_proc *callback_proc, Subdirectory subdir, FileList &file_list)
{
struct stat sb;
struct dirent *dirent;
@@ -302,11 +363,11 @@ static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc
int sort_start;
char d_name[sizeof(fios->name)];
- _fios_items.Clear();
+ file_list.Clear();
/* A parent directory link exists if we are not in the root directory */
if (!FiosIsRoot(_fios_path)) {
- fios = _fios_items.Append();
+ fios = file_list.Append();
fios->type = FIOS_TYPE_PARENT;
fios->mtime = 0;
strecpy(fios->name, "..", lastof(fios->name));
@@ -322,7 +383,7 @@ static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc
if (FiosIsValidFile(_fios_path, dirent, &sb) && S_ISDIR(sb.st_mode) &&
(!FiosIsHiddenFile(dirent) || strncasecmp(d_name, PERSONAL_DIR, strlen(d_name)) == 0) &&
strcmp(d_name, ".") != 0 && strcmp(d_name, "..") != 0) {
- fios = _fios_items.Append();
+ fios = file_list.Append();
fios->type = FIOS_TYPE_DIR;
fios->mtime = 0;
strecpy(fios->name, d_name, lastof(fios->name));
@@ -337,27 +398,27 @@ static void FiosGetFileList(SaveLoadDialogMode mode, fios_getlist_callback_proc
{
SortingBits order = _savegame_sort_order;
_savegame_sort_order = SORT_BY_NAME | SORT_ASCENDING;
- QSortT(_fios_items.Begin(), _fios_items.Length(), CompareFiosItems);
+ QSortT(file_list.files.Begin(), file_list.files.Length(), CompareFiosItems);
_savegame_sort_order = order;
}
/* This is where to start sorting for the filenames */
- sort_start = _fios_items.Length();
+ sort_start = file_list.Length();
/* Show files */
- FiosFileScanner scanner(mode, callback_proc);
+ FiosFileScanner scanner(fop, callback_proc, file_list);
if (subdir == NO_DIRECTORY) {
scanner.Scan(NULL, _fios_path, false);
} else {
scanner.Scan(NULL, subdir, true, true);
}
- QSortT(_fios_items.Get(sort_start), _fios_items.Length() - sort_start, CompareFiosItems);
+ QSortT(file_list.Get(sort_start), file_list.Length() - sort_start, CompareFiosItems);
/* Show drives */
- FiosGetDrives();
+ FiosGetDrives(file_list);
- _fios_items.Compact();
+ file_list.Compact();
}
/**
@@ -386,7 +447,7 @@ static void GetFileTitle(const char *file, char *title, const char *last, Subdir
/**
* Callback for FiosGetFileList. It tells if a file is a savegame or not.
- * @param mode Save/load mode.
+ * @param fop Purpose of collecting the list.
* @param file Name of the file to check.
* @param ext A pointer to the extension identifier inside file
* @param title Buffer if a callback wants to lookup the title of the file; NULL to skip the lookup
@@ -395,7 +456,7 @@ static void GetFileTitle(const char *file, char *title, const char *last, Subdir
* @see FiosGetFileList
* @see FiosGetSavegameList
*/
-FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last)
+FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last)
{
/* Show savegame files
* .SAV OpenTTD saved game
@@ -411,7 +472,7 @@ FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file,
return FIOS_TYPE_FILE;
}
- if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) {
+ if (fop == SLO_LOAD) {
if (strcasecmp(ext, ".ss1") == 0 || strcasecmp(ext, ".sv1") == 0 ||
strcasecmp(ext, ".sv2") == 0) {
if (title != NULL) GetOldSaveGameName(file, title, last);
@@ -424,10 +485,11 @@ FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file,
/**
* Get a list of savegames.
- * @param mode Save/load mode.
+ * @param fop Purpose of collecting the list.
+ * @param file_list Destination of the found files.
* @see FiosGetFileList
*/
-void FiosGetSavegameList(SaveLoadDialogMode mode)
+void FiosGetSavegameList(SaveLoadOperation fop, FileList &file_list)
{
static char *fios_save_path = NULL;
static char *fios_save_path_last = NULL;
@@ -441,12 +503,12 @@ void FiosGetSavegameList(SaveLoadDialogMode mode)
_fios_path = fios_save_path;
_fios_path_last = fios_save_path_last;
- FiosGetFileList(mode, &FiosGetSavegameListCallback, NO_DIRECTORY);
+ FiosGetFileList(fop, &FiosGetSavegameListCallback, NO_DIRECTORY, file_list);
}
/**
* Callback for FiosGetFileList. It tells if a file is a scenario or not.
- * @param mode Save/load mode.
+ * @param fop Purpose of collecting the list.
* @param file Name of the file to check.
* @param ext A pointer to the extension identifier inside file
* @param title Buffer if a callback wants to lookup the title of the file
@@ -455,7 +517,7 @@ void FiosGetSavegameList(SaveLoadDialogMode mode)
* @see FiosGetFileList
* @see FiosGetScenarioList
*/
-static FiosType FiosGetScenarioListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last)
+static FiosType FiosGetScenarioListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last)
{
/* Show scenario files
* .SCN OpenTTD style scenario file
@@ -466,7 +528,7 @@ static FiosType FiosGetScenarioListCallback(SaveLoadDialogMode mode, const char
return FIOS_TYPE_SCENARIO;
}
- if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) {
+ if (fop == SLO_LOAD) {
if (strcasecmp(ext, ".sv0") == 0 || strcasecmp(ext, ".ss0") == 0 ) {
GetOldSaveGameName(file, title, last);
return FIOS_TYPE_OLD_SCENARIO;
@@ -478,10 +540,11 @@ static FiosType FiosGetScenarioListCallback(SaveLoadDialogMode mode, const char
/**
* Get a list of scenarios.
- * @param mode Save/load mode.
+ * @param fop Purpose of collecting the list.
+ * @param file_list Destination of the found files.
* @see FiosGetFileList
*/
-void FiosGetScenarioList(SaveLoadDialogMode mode)
+void FiosGetScenarioList(SaveLoadOperation fop, FileList &file_list)
{
static char *fios_scn_path = NULL;
static char *fios_scn_path_last = NULL;
@@ -499,10 +562,11 @@ void FiosGetScenarioList(SaveLoadDialogMode mode)
char base_path[MAX_PATH];
FioGetDirectory(base_path, lastof(base_path), SCENARIO_DIR);
- FiosGetFileList(mode, &FiosGetScenarioListCallback, (mode == SLD_LOAD_SCENARIO && strcmp(base_path, _fios_path) == 0) ? SCENARIO_DIR : NO_DIRECTORY);
+ Subdirectory subdir = (fop == SLO_LOAD && strcmp(base_path, _fios_path) == 0) ? SCENARIO_DIR : NO_DIRECTORY;
+ FiosGetFileList(fop, &FiosGetScenarioListCallback, subdir, file_list);
}
-static FiosType FiosGetHeightmapListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last)
+static FiosType FiosGetHeightmapListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last)
{
/* Show heightmap files
* .PNG PNG Based heightmap files
@@ -548,9 +612,10 @@ static FiosType FiosGetHeightmapListCallback(SaveLoadDialogMode mode, const char
/**
* Get a list of heightmaps.
- * @param mode Save/load mode.
+ * @param fop Purpose of collecting the list.
+ * @param file_list Destination of the found files.
*/
-void FiosGetHeightmapList(SaveLoadDialogMode mode)
+void FiosGetHeightmapList(SaveLoadOperation fop, FileList &file_list)
{
static char *fios_hmap_path = NULL;
static char *fios_hmap_path_last = NULL;
@@ -567,7 +632,8 @@ void FiosGetHeightmapList(SaveLoadDialogMode mode)
char base_path[MAX_PATH];
FioGetDirectory(base_path, lastof(base_path), HEIGHTMAP_DIR);
- FiosGetFileList(mode, &FiosGetHeightmapListCallback, strcmp(base_path, _fios_path) == 0 ? HEIGHTMAP_DIR : NO_DIRECTORY);
+ Subdirectory subdir = strcmp(base_path, _fios_path) == 0 ? HEIGHTMAP_DIR : NO_DIRECTORY;
+ FiosGetFileList(fop, &FiosGetHeightmapListCallback, subdir, file_list);
}
/**
diff --git a/src/fios.h b/src/fios.h
index b26fe00925..5e17e8ee17 100644
--- a/src/fios.h
+++ b/src/fios.h
@@ -81,52 +81,17 @@ extern LoadCheckData _load_check_data;
enum FileSlots {
/**
- * Slot used for the GRF scanning and such. This slot cannot be reused
- * as it will otherwise cause issues when pressing "rescan directories".
- * It can furthermore not be larger than LAST_GRF_SLOT as that complicates
- * the testing for "too much NewGRFs".
+ * Slot used for the GRF scanning and such.
+ * This slot is used for all temporary accesses to files when scanning/testing files,
+ * and thus cannot be used for files, which are continuously accessed during a game.
*/
CONFIG_SLOT = 0,
/** Slot for the sound. */
SOUND_SLOT = 1,
/** First slot usable for (New)GRFs used during the game. */
FIRST_GRF_SLOT = 2,
- /** Last slot usable for (New)GRFs used during the game. */
- LAST_GRF_SLOT = 63,
/** Maximum number of slots. */
- MAX_FILE_SLOTS = 64
-};
-
-/** Mode of the file dialogue window. */
-enum SaveLoadDialogMode {
- SLD_LOAD_GAME, ///< Load a game.
- SLD_LOAD_SCENARIO, ///< Load a scenario.
- SLD_SAVE_GAME, ///< Save a game.
- SLD_SAVE_SCENARIO, ///< Save a scenario.
- SLD_LOAD_HEIGHTMAP, ///< Load a heightmap.
- SLD_SAVE_HEIGHTMAP, ///< Save a heightmap.
-};
-
-/** The different types of files that the system knows about. */
-enum FileType {
- FT_NONE, ///< nothing to do
- FT_SAVEGAME, ///< old or new savegame
- FT_SCENARIO, ///< old or new scenario
- FT_HEIGHTMAP, ///< heightmap file
-};
-
-enum FiosType {
- FIOS_TYPE_DRIVE,
- FIOS_TYPE_PARENT,
- FIOS_TYPE_DIR,
- FIOS_TYPE_FILE,
- FIOS_TYPE_OLDFILE,
- FIOS_TYPE_SCENARIO,
- FIOS_TYPE_OLD_SCENARIO,
- FIOS_TYPE_DIRECT,
- FIOS_TYPE_PNG,
- FIOS_TYPE_BMP,
- FIOS_TYPE_INVALID = 255,
+ MAX_FILE_SLOTS = 128,
};
/** Deals with finding savegames */
@@ -137,12 +102,95 @@ struct FiosItem {
char name[MAX_PATH];
};
-/** Deals with the type of the savegame, independent of extension */
-struct SmallFiosItem {
- int mode; ///< savegame/scenario type (old, new)
- FileType filetype; ///< what type of file are we dealing with
- char name[MAX_PATH]; ///< name
- char title[255]; ///< internal name of the game
+/** List of file information. */
+class FileList {
+public:
+ ~FileList();
+
+ /**
+ * Construct a new entry in the file list.
+ * @return Pointer to the new items to be initialized.
+ */
+ inline FiosItem *Append()
+ {
+ return this->files.Append();
+ }
+
+ /**
+ * Get the number of files in the list.
+ * @return The number of files stored in the list.
+ */
+ inline uint Length() const
+ {
+ return this->files.Length();
+ }
+
+ /**
+ * Get a pointer to the first file information.
+ * @return Address of the first file information.
+ */
+ inline const FiosItem *Begin() const
+ {
+ return this->files.Begin();
+ }
+
+ /**
+ * Get a pointer behind the last file information.
+ * @return Address behind the last file information.
+ */
+ inline const FiosItem *End() const
+ {
+ return this->files.End();
+ }
+
+ /**
+ * Get a pointer to the indicated file information. File information must exist.
+ * @return Address of the indicated existing file information.
+ */
+ inline const FiosItem *Get(uint index) const
+ {
+ return this->files.Get(index);
+ }
+
+ /**
+ * Get a pointer to the indicated file information. File information must exist.
+ * @return Address of the indicated existing file information.
+ */
+ inline FiosItem *Get(uint index)
+ {
+ return this->files.Get(index);
+ }
+
+ inline const FiosItem &operator[](uint index) const
+ {
+ return this->files[index];
+ }
+
+ /**
+ * Get a reference to the indicated file information. File information must exist.
+ * @return The requested file information.
+ */
+ inline FiosItem &operator[](uint index)
+ {
+ return this->files[index];
+ }
+
+ /** Remove all items from the list. */
+ inline void Clear()
+ {
+ this->files.Clear();
+ }
+
+ /** Compact the list down to the smallest block size boundary. */
+ inline void Compact()
+ {
+ this->files.Compact();
+ }
+
+ void BuildFileList(AbstractFileType abstract_filetype, SaveLoadOperation fop);
+ const FiosItem *FindItem(const char *file);
+
+ SmallVector files; ///< The list of files.
};
enum SortingBits {
@@ -154,18 +202,14 @@ enum SortingBits {
DECLARE_ENUM_AS_BIT_SET(SortingBits)
/* Variables to display file lists */
-extern SmallVector _fios_items;
-extern SmallFiosItem _file_to_saveload;
-extern SaveLoadDialogMode _saveload_mode;
extern SortingBits _savegame_sort_order;
-void ShowSaveLoadDialog(SaveLoadDialogMode mode);
+void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop);
-void FiosGetSavegameList(SaveLoadDialogMode mode);
-void FiosGetScenarioList(SaveLoadDialogMode mode);
-void FiosGetHeightmapList(SaveLoadDialogMode mode);
+void FiosGetSavegameList(SaveLoadOperation fop, FileList &file_list);
+void FiosGetScenarioList(SaveLoadOperation fop, FileList &file_list);
+void FiosGetHeightmapList(SaveLoadOperation fop, FileList &file_list);
-void FiosFreeSavegameList();
const char *FiosBrowseTo(const FiosItem *item);
StringID FiosGetDescText(const char **path, uint64 *total_free);
@@ -173,13 +217,8 @@ bool FiosDelete(const char *name);
void FiosMakeHeightmapName(char *buf, const char *name, const char *last);
void FiosMakeSavegameName(char *buf, const char *name, const char *last);
-FiosType FiosGetSavegameListCallback(SaveLoadDialogMode mode, const char *file, const char *ext, char *title, const char *last);
+FiosType FiosGetSavegameListCallback(SaveLoadOperation fop, const char *file, const char *ext, char *title, const char *last);
int CDECL CompareFiosItems(const FiosItem *a, const FiosItem *b);
-extern const TextColour _fios_colours[];
-
-void BuildFileList();
-void SetFiosType(const byte fiostype);
-
#endif /* FIOS_H */
diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp
index 9316deb658..e6cd9625cc 100644
--- a/src/fios_gui.cpp
+++ b/src/fios_gui.cpp
@@ -36,7 +36,6 @@
#include "safeguards.h"
-SaveLoadDialogMode _saveload_mode;
LoadCheckData _load_check_data; ///< Data loaded from save during SL_LOAD_CHECK.
static bool _fios_path_changed;
@@ -187,33 +186,24 @@ static const NWidgetPart _nested_save_dialog_widgets[] = {
EndContainer(),
};
-/** Colours for fios types, indexed by #FiosType. */
-const TextColour _fios_colours[] = {
- TC_LIGHT_BLUE, TC_DARK_GREEN, TC_DARK_GREEN, TC_ORANGE, TC_LIGHT_BROWN,
- TC_ORANGE, TC_LIGHT_BROWN, TC_ORANGE, TC_ORANGE, TC_YELLOW
+/** Text colours of #DetailedFileType fios entries in the window. */
+static const TextColour _fios_colours[] = {
+ TC_LIGHT_BROWN, // DFT_OLD_GAME_FILE
+ TC_ORANGE, // DFT_GAME_FILE
+ TC_YELLOW, // DFT_HEIGHTMAP_BMP
+ TC_ORANGE, // DFT_HEIGHTMAP_PNG
+ TC_LIGHT_BLUE, // DFT_FIOS_DRIVE
+ TC_DARK_GREEN, // DFT_FIOS_PARENT
+ TC_DARK_GREEN, // DFT_FIOS_DIR
+ TC_ORANGE, // DFT_FIOS_DIRECT
};
-void BuildFileList()
-{
- _fios_path_changed = true;
- FiosFreeSavegameList();
- switch (_saveload_mode) {
- case SLD_LOAD_SCENARIO:
- case SLD_SAVE_SCENARIO:
- FiosGetScenarioList(_saveload_mode); break;
- case SLD_SAVE_HEIGHTMAP:
- case SLD_LOAD_HEIGHTMAP:
- FiosGetHeightmapList(_saveload_mode); break;
-
- default: FiosGetSavegameList(_saveload_mode); break;
- }
-
- /* Invalidate saveload window */
- InvalidateWindowData(WC_SAVELOAD, 0, 2, true);
-}
-
-static void MakeSortedSaveGameList()
+/**
+ * Sort the collected list save games prior to displaying it in the save/load gui.
+ * @param [inout] file_list List of save game files found in the directory.
+ */
+static void SortSaveGameList(FileList &file_list)
{
uint sort_start = 0;
uint sort_end = 0;
@@ -222,7 +212,7 @@ static void MakeSortedSaveGameList()
* Drives (A:\ (windows only) are always under the files (FIOS_TYPE_DRIVE)
* Only sort savegames/scenarios, not directories
*/
- for (const FiosItem *item = _fios_items.Begin(); item != _fios_items.End(); item++) {
+ for (const FiosItem *item = file_list.Begin(); item != file_list.End(); item++) {
switch (item->type) {
case FIOS_TYPE_DIR: sort_start++; break;
case FIOS_TYPE_PARENT: sort_start++; break;
@@ -231,15 +221,18 @@ static void MakeSortedSaveGameList()
}
}
- uint s_amount = _fios_items.Length() - sort_start - sort_end;
- QSortT(_fios_items.Get(sort_start), s_amount, CompareFiosItems);
+ uint s_amount = file_list.Length() - sort_start - sort_end;
+ QSortT(file_list.Get(sort_start), s_amount, CompareFiosItems);
}
struct SaveLoadWindow : public Window {
private:
QueryString filename_editbox; ///< Filename editbox.
+ AbstractFileType abstract_filetype; /// Type of file to select.
+ SaveLoadOperation fop; ///< File operation to perform.
+ FileList fios_items; ///< Save game list.
FiosItem o_dir;
- const FiosItem *selected;
+ const FiosItem *selected; ///< Selected game in #fios_items, or \c NULL.
Scrollbar *vscroll;
public:
@@ -250,35 +243,56 @@ public:
this->filename_editbox.text.UpdateSize();
}
- SaveLoadWindow(WindowDesc *desc, SaveLoadDialogMode mode) : Window(desc), filename_editbox(64)
+ SaveLoadWindow(WindowDesc *desc, AbstractFileType abstract_filetype, SaveLoadOperation fop)
+ : Window(desc), filename_editbox(64), abstract_filetype(abstract_filetype), fop(fop)
{
- static const StringID saveload_captions[] = {
- STR_SAVELOAD_LOAD_CAPTION,
- STR_SAVELOAD_LOAD_SCENARIO,
- STR_SAVELOAD_SAVE_CAPTION,
- STR_SAVELOAD_SAVE_SCENARIO,
- STR_SAVELOAD_LOAD_HEIGHTMAP,
- STR_SAVELOAD_SAVE_HEIGHTMAP,
- };
- assert((uint)mode < lengthof(saveload_captions));
+ assert(this->fop == SLO_SAVE || this->fop == SLO_LOAD);
- /* Use an array to define what will be the current file type being handled
- * by current file mode */
- switch (mode) {
- case SLD_SAVE_GAME: this->GenerateFileName(); break;
- case SLD_SAVE_HEIGHTMAP:
- case SLD_SAVE_SCENARIO: this->filename_editbox.text.Assign("UNNAMED"); break;
- default: break;
+ /* For saving, construct an initial file name. */
+ if (this->fop == SLO_SAVE) {
+ switch (this->abstract_filetype) {
+ case FT_SAVEGAME:
+ this->GenerateFileName();
+ break;
+
+ case FT_SCENARIO:
+ case FT_HEIGHTMAP:
+ this->filename_editbox.text.Assign("UNNAMED");
+ break;
+
+ default:
+ NOT_REACHED();
+ }
}
-
this->querystrings[WID_SL_SAVE_OSK_TITLE] = &this->filename_editbox;
this->filename_editbox.ok_button = WID_SL_SAVE_GAME;
this->CreateNestedTree(true);
- if (mode == SLD_LOAD_GAME) this->GetWidget(WID_SL_CONTENT_DOWNLOAD_SEL)->SetDisplayedPlane(SZSP_HORIZONTAL);
- this->GetWidget(WID_SL_CAPTION)->widget_data = saveload_captions[mode];
- this->vscroll = this->GetScrollbar(WID_SL_SCROLLBAR);
+ if (this->fop == SLO_LOAD && this->abstract_filetype == FT_SAVEGAME) {
+ this->GetWidget(WID_SL_CONTENT_DOWNLOAD_SEL)->SetDisplayedPlane(SZSP_HORIZONTAL);
+ }
+ /* Select caption string of the window. */
+ StringID caption_string;
+ switch (this->abstract_filetype) {
+ case FT_SAVEGAME:
+ caption_string = (this->fop == SLO_SAVE) ? STR_SAVELOAD_SAVE_CAPTION : STR_SAVELOAD_LOAD_CAPTION;
+ break;
+
+ case FT_SCENARIO:
+ caption_string = (this->fop == SLO_SAVE) ? STR_SAVELOAD_SAVE_SCENARIO : STR_SAVELOAD_LOAD_SCENARIO;
+ break;
+
+ case FT_HEIGHTMAP:
+ caption_string = (this->fop == SLO_SAVE) ? STR_SAVELOAD_SAVE_HEIGHTMAP : STR_SAVELOAD_LOAD_HEIGHTMAP;
+ break;
+
+ default:
+ NOT_REACHED();
+ }
+ this->GetWidget(WID_SL_CAPTION)->widget_data = caption_string;
+
+ this->vscroll = this->GetScrollbar(WID_SL_SCROLLBAR);
this->FinishInitNested(0);
this->LowerWidget(WID_SL_DRIVES_DIRECTORIES_LIST);
@@ -294,20 +308,18 @@ public:
ResetObjectToPlace();
+ /* Select the initial directory. */
o_dir.type = FIOS_TYPE_DIRECT;
- switch (_saveload_mode) {
- case SLD_SAVE_GAME:
- case SLD_LOAD_GAME:
+ switch (this->abstract_filetype) {
+ case FT_SAVEGAME:
FioGetDirectory(o_dir.name, lastof(o_dir.name), SAVE_DIR);
break;
- case SLD_SAVE_SCENARIO:
- case SLD_LOAD_SCENARIO:
+ case FT_SCENARIO:
FioGetDirectory(o_dir.name, lastof(o_dir.name), SCENARIO_DIR);
break;
- case SLD_SAVE_HEIGHTMAP:
- case SLD_LOAD_HEIGHTMAP:
+ case FT_HEIGHTMAP:
FioGetDirectory(o_dir.name, lastof(o_dir.name), HEIGHTMAP_DIR);
break;
@@ -316,9 +328,7 @@ public:
}
/* Focus the edit box by default in the save windows */
- if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) {
- this->SetFocusedWidget(WID_SL_SAVE_OSK_TITLE);
- }
+ if (this->fop == SLO_SAVE) this->SetFocusedWidget(WID_SL_SAVE_OSK_TITLE);
}
virtual ~SaveLoadWindow()
@@ -327,7 +337,6 @@ public:
if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) {
DoCommandP(0, PM_PAUSED_SAVELOAD, 0, CMD_PAUSE);
}
- FiosFreeSavegameList();
}
virtual void DrawWidget(const Rect &r, int widget) const
@@ -360,13 +369,13 @@ public:
GfxFillRect(r.left + 1, r.top + 1, r.right, r.bottom, PC_BLACK);
uint y = r.top + WD_FRAMERECT_TOP;
- for (uint pos = this->vscroll->GetPosition(); pos < _fios_items.Length(); pos++) {
- const FiosItem *item = _fios_items.Get(pos);
+ for (uint pos = this->vscroll->GetPosition(); pos < this->fios_items.Length(); pos++) {
+ const FiosItem *item = this->fios_items.Get(pos);
if (item == this->selected) {
GfxFillRect(r.left + 1, y, r.right, y + this->resize.step_height, PC_DARK_BLUE);
}
- DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, item->title, _fios_colours[item->type]);
+ DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, item->title, _fios_colours[GetDetailedFileType(item->type)]);
y += this->resize.step_height;
if (y >= this->vscroll->GetCapacity() * this->resize.step_height + r.top + WD_FRAMERECT_TOP) break;
}
@@ -421,7 +430,7 @@ public:
if (y > y_max) break;
/* Hide current date for scenarios */
- if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO) {
+ if (this->abstract_filetype != FT_SCENARIO) {
/* Current date */
SetDParam(0, _load_check_data.current_date);
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_CURRENT_DATE);
@@ -429,7 +438,7 @@ public:
}
/* Hide the NewGRF stuff when saving. We also hide the button. */
- if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
+ if (this->fop == SLO_LOAD && (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO)) {
y += WD_PAR_VSEP_NORMAL;
if (y > y_max) break;
@@ -442,7 +451,7 @@ public:
if (y > y_max) break;
/* Hide the company stuff for scenarios */
- if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO) {
+ if (this->abstract_filetype != FT_SCENARIO) {
y += FONT_HEIGHT_NORMAL;
if (y > y_max) break;
@@ -495,10 +504,10 @@ public:
{
if (_savegame_sort_dirty) {
_savegame_sort_dirty = false;
- MakeSortedSaveGameList();
+ SortSaveGameList(this->fios_items);
}
- this->vscroll->SetCount(_fios_items.Length());
+ this->vscroll->SetCount(this->fios_items.Length());
this->DrawWidgets();
}
@@ -527,14 +536,14 @@ public:
case WID_SL_LOAD_BUTTON:
if (this->selected != NULL && !_load_check_data.HasErrors()) {
const char *name = FiosBrowseTo(this->selected);
- SetFiosType(this->selected->type);
+ _file_to_saveload.SetMode(this->selected->type);
+ _file_to_saveload.SetName(name);
+ _file_to_saveload.SetTitle(this->selected->title);
- strecpy(_file_to_saveload.name, name, lastof(_file_to_saveload.name));
- strecpy(_file_to_saveload.title, this->selected->title, lastof(_file_to_saveload.title));
-
- if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
+ if (this->abstract_filetype == FT_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();
@@ -563,7 +572,7 @@ public:
int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_SL_DRIVES_DIRECTORIES_LIST, WD_FRAMERECT_TOP);
if (y == INT_MAX) return;
- const FiosItem *file = _fios_items.Get(y);
+ const FiosItem *file = this->fios_items.Get(y);
const char *name = FiosBrowseTo(file);
if (name != NULL) {
@@ -572,28 +581,32 @@ public:
this->selected = file;
_load_check_data.Clear();
- if (file->type == FIOS_TYPE_FILE || file->type == FIOS_TYPE_SCENARIO) {
- SaveOrLoad(name, SL_LOAD_CHECK, NO_DIRECTORY, false);
+ if (GetDetailedFileType(file->type) == DFT_GAME_FILE) {
+ /* Other detailed file types cannot be checked before. */
+ SaveOrLoad(name, SLO_CHECK, DFT_GAME_FILE, NO_DIRECTORY, false);
}
this->InvalidateData(1);
}
- if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) {
+ if (this->fop == SLO_SAVE) {
/* Copy clicked name to editbox */
this->filename_editbox.text.Assign(file->title);
this->SetWidgetDirty(WID_SL_SAVE_OSK_TITLE);
}
} else if (!_load_check_data.HasErrors()) {
this->selected = file;
- if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
- this->OnClick(pt, WID_SL_LOAD_BUTTON, 1);
- } else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
- SetFiosType(file->type);
- strecpy(_file_to_saveload.name, name, lastof(_file_to_saveload.name));
- strecpy(_file_to_saveload.title, file->title, lastof(_file_to_saveload.title));
+ if (this->fop == SLO_LOAD) {
+ if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) {
+ this->OnClick(pt, WID_SL_LOAD_BUTTON, 1);
+ } else {
+ assert(this->abstract_filetype == FT_HEIGHTMAP);
+ _file_to_saveload.SetMode(file->type);
+ _file_to_saveload.SetName(name);
+ _file_to_saveload.SetTitle(file->title);
- delete this;
- ShowHeightmapLoad();
+ delete this;
+ ShowHeightmapLoad();
+ }
}
}
} else {
@@ -608,10 +621,11 @@ public:
ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR);
} else {
#if defined(ENABLE_NETWORK)
- switch (_saveload_mode) {
+ assert(this->fop == SLO_LOAD);
+ switch (this->abstract_filetype) {
default: NOT_REACHED();
- case SLD_LOAD_SCENARIO: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_SCENARIO); break;
- case SLD_LOAD_HEIGHTMAP: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_HEIGHTMAP); break;
+ case FT_SCENARIO: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_SCENARIO); break;
+ case FT_HEIGHTMAP: ShowNetworkContentListWindow(NULL, CONTENT_TYPE_HEIGHTMAP); break;
}
#endif
}
@@ -639,9 +653,8 @@ public:
virtual void OnTimeout()
{
- /* This test protects against using widgets 11 and 12 which are only available
- * in those saveload modes. */
- if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP)) return;
+ /* Widgets WID_SL_DELETE_SELECTION and WID_SL_SAVE_GAME only exist when saving to a file. */
+ if (this->fop != SLO_SAVE) return;
if (this->IsWidgetLowered(WID_SL_DELETE_SELECTION)) { // Delete button clicked
if (!FiosDelete(this->filename_editbox.text.buf)) {
@@ -649,10 +662,10 @@ public:
} else {
this->InvalidateData();
/* Reset file name to current date on successful delete */
- if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName();
+ if (this->abstract_filetype == FT_SAVEGAME) GenerateFileName();
}
} else if (this->IsWidgetLowered(WID_SL_SAVE_GAME)) { // Save button clicked
- if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
+ if (this->abstract_filetype == FT_SAVEGAME || this->abstract_filetype == FT_SCENARIO) {
_switch_mode = SM_SAVE_GAME;
FiosMakeSavegameName(_file_to_saveload.name, this->filename_editbox.text.buf, lastof(_file_to_saveload.name));
} else {
@@ -683,28 +696,40 @@ public:
this->selected = NULL;
_load_check_data.Clear();
if (!gui_scope) break;
- BuildFileList();
+
+ _fios_path_changed = true;
+ this->fios_items.BuildFileList(this->abstract_filetype, this->fop);
+ this->vscroll->SetCount(this->fios_items.Length());
+ this->selected = NULL;
+ _load_check_data.Clear();
/* FALL THROUGH */
case 1:
/* Selection changes */
if (!gui_scope) break;
- if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
- this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, this->selected == NULL || _load_check_data.HasErrors());
+
+ if (this->fop != SLO_LOAD) break;
+
+ switch (this->abstract_filetype) {
+ case FT_HEIGHTMAP:
+ this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, this->selected == NULL || _load_check_data.HasErrors());
+ break;
+
+ case FT_SAVEGAME:
+ case FT_SCENARIO: {
+ bool disabled = this->selected == NULL || _load_check_data.HasErrors();
+ if (!_settings_client.gui.UserIsAllowedToChangeNewGRFs()) {
+ disabled |= _load_check_data.HasNewGrfs() && _load_check_data.grf_compatibility == GLC_NOT_FOUND;
+ }
+ this->SetWidgetDisabledState(WID_SL_LOAD_BUTTON, disabled);
+ this->SetWidgetDisabledState(WID_SL_NEWGRF_INFO, !_load_check_data.HasNewGrfs());
+ this->SetWidgetDisabledState(WID_SL_MISSING_NEWGRFS,
+ !_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility == GLC_ALL_GOOD);
+ break;
+ }
+
+ default:
+ NOT_REACHED();
}
- if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
- 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->SetWidgetDisabledState(WID_SL_NEWGRF_INFO,
- !_load_check_data.HasNewGrfs());
- this->SetWidgetDisabledState(WID_SL_MISSING_NEWGRFS,
- !_load_check_data.HasNewGrfs() || _load_check_data.grf_compatibility == GLC_ALL_GOOD);
- }
- break;
- case 2:
- /* _fios_items changed */
- this->vscroll->SetCount(_fios_items.Length());
- this->selected = NULL;
- _load_check_data.Clear();
break;
}
}
@@ -734,70 +759,24 @@ static WindowDesc _save_dialog_desc(
_nested_save_dialog_widgets, lengthof(_nested_save_dialog_widgets)
);
-/**
- * These values are used to convert the file/operations mode into a corresponding file type.
- * So each entry, as expressed by the related comment, is based on the enum
- */
-static const FileType _file_modetotype[] = {
- FT_SAVEGAME, // used for SLD_LOAD_GAME
- FT_SCENARIO, // used for SLD_LOAD_SCENARIO
- FT_SAVEGAME, // used for SLD_SAVE_GAME
- FT_SCENARIO, // used for SLD_SAVE_SCENARIO
- FT_HEIGHTMAP, // used for SLD_LOAD_HEIGHTMAP
- FT_HEIGHTMAP, // used for SLD_SAVE_HEIGHTMAP
-};
-
/**
* Launch save/load dialog in the given mode.
- * @param mode Save/load mode.
+ * @param abstract_filetype Kind of file to handle.
+ * @param fop File operation to perform (load or save).
*/
-void ShowSaveLoadDialog(SaveLoadDialogMode mode)
+void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
{
DeleteWindowById(WC_SAVELOAD, 0);
WindowDesc *sld;
- switch (mode) {
- case SLD_SAVE_GAME:
- case SLD_SAVE_SCENARIO:
- case SLD_SAVE_HEIGHTMAP:
- sld = &_save_dialog_desc; break;
- case SLD_LOAD_HEIGHTMAP:
- sld = &_load_heightmap_dialog_desc; break;
- default:
- sld = &_load_dialog_desc; break;
+ if (fop == SLO_SAVE) {
+ sld = &_save_dialog_desc;
+ } else {
+ /* Dialogue for loading a file. */
+ sld = (abstract_filetype == FT_HEIGHTMAP) ? &_load_heightmap_dialog_desc : &_load_dialog_desc;
}
- _saveload_mode = mode;
- _file_to_saveload.filetype = _file_modetotype[mode];
+ _file_to_saveload.abstract_ftype = abstract_filetype;
- new SaveLoadWindow(sld, mode);
-}
-
-void SetFiosType(const byte fiostype)
-{
- switch (fiostype) {
- case FIOS_TYPE_FILE:
- case FIOS_TYPE_SCENARIO:
- _file_to_saveload.mode = SL_LOAD;
- break;
-
- case FIOS_TYPE_OLDFILE:
- case FIOS_TYPE_OLD_SCENARIO:
- _file_to_saveload.mode = SL_OLD_LOAD;
- break;
-
-#ifdef WITH_PNG
- case FIOS_TYPE_PNG:
- _file_to_saveload.mode = SL_PNG;
- break;
-#endif /* WITH_PNG */
-
- case FIOS_TYPE_BMP:
- _file_to_saveload.mode = SL_BMP;
- break;
-
- default:
- _file_to_saveload.mode = SL_INVALID;
- break;
- }
+ new SaveLoadWindow(sld, abstract_filetype, fop);
}
diff --git a/src/game/game_info.cpp b/src/game/game_info.cpp
index 9bb36d1aa5..05443327f2 100644
--- a/src/game/game_info.cpp
+++ b/src/game/game_info.cpp
@@ -25,7 +25,8 @@
static bool CheckAPIVersion(const char *api_version)
{
return strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0 ||
- strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0;
+ strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0 || strcmp(api_version, "1.7") == 0 ||
+ strcmp(api_version, "1.8") == 0;
}
#if defined(WIN32)
diff --git a/src/game/game_text.hpp b/src/game/game_text.hpp
index 19a31049ec..14da7d9b2e 100644
--- a/src/game/game_text.hpp
+++ b/src/game/game_text.hpp
@@ -14,9 +14,6 @@
#include "../core/smallvec_type.hpp"
-/** The tab we place our strings in. */
-static const uint GAME_TEXT_TAB = 18;
-
const char *GetGameStringPtr(uint id);
void RegisterGameTranslation(class Squirrel *engine);
void ReconsiderGameScriptLanguage();
diff --git a/src/genworld.cpp b/src/genworld.cpp
index 88e1b84a51..5cdb129b9c 100644
--- a/src/genworld.cpp
+++ b/src/genworld.cpp
@@ -77,7 +77,7 @@ static void CleanupGeneration()
{
_generating_world = false;
- if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE);
+ SetMouseCursorBusy(false);
/* Show all vital windows again, because we have hidden them */
if (_gw.threaded && _game_mode != GM_MENU) ShowVitalWindows();
SetModalProgress(false);
@@ -204,7 +204,7 @@ static void _GenerateWorld(void *)
if (_debug_desync_level > 0) {
char name[MAX_PATH];
seprintf(name, lastof(name), "dmp_cmds_%08x_%08x.sav", _settings_game.game_creation.generation_seed, _date);
- SaveOrLoad(name, SL_SAVE, AUTOSAVE_DIR, false);
+ SaveOrLoad(name, SLO_SAVE, DFT_GAME_FILE, AUTOSAVE_DIR, false);
}
} catch (...) {
BasePersistentStorageArray::SwitchMode(PSM_LEAVE_GAMELOOP, true);
@@ -331,7 +331,7 @@ void GenerateWorld(GenWorldMode mode, uint size_x, uint size_y, bool reset_setti
_gw.thread = NULL;
}
- if (!VideoDriver::GetInstance()->HasGUI() || !ThreadObject::New(&_GenerateWorld, NULL, &_gw.thread)) {
+ if (!VideoDriver::GetInstance()->HasGUI() || !ThreadObject::New(&_GenerateWorld, NULL, &_gw.thread, "ottd:genworld")) {
DEBUG(misc, 1, "Cannot create genworld thread, reverting to single-threaded mode");
_gw.threaded = false;
_modal_progress_work_mutex->EndCritical();
diff --git a/src/genworld.h b/src/genworld.h
index 2673354234..ea3faa15fc 100644
--- a/src/genworld.h
+++ b/src/genworld.h
@@ -32,6 +32,17 @@ enum GenWorldMode {
GWM_HEIGHTMAP = 3, ///< Generate a newgame from a heightmap
};
+/** Smoothness presets. */
+enum TgenSmoothness {
+ TGEN_SMOOTHNESS_BEGIN, ///< First smoothness value.
+ TGEN_SMOOTHNESS_VERY_SMOOTH = TGEN_SMOOTHNESS_BEGIN, ///< Smoothness preset 'very smooth'.
+ TGEN_SMOOTHNESS_SMOOTH, ///< Smoothness preset 'smooth'.
+ TGEN_SMOOTHNESS_ROUGH, ///< Smoothness preset 'rough'.
+ TGEN_SMOOTHNESS_VERY_ROUGH, ///< Smoothness preset 'very rough'.
+
+ TGEN_SMOOTHNESS_END, ///< Used to iterate.
+};
+
static const uint CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY = 4; ///< Value for custom sea level in difficulty settings.
static const uint CUSTOM_SEA_LEVEL_MIN_PERCENTAGE = 1; ///< Minimum percentage a user can specify for custom sea level.
static const uint CUSTOM_SEA_LEVEL_MAX_PERCENTAGE = 90; ///< Maximum percentage a user can specify for custom sea level.
diff --git a/src/genworld_gui.cpp b/src/genworld_gui.cpp
index 1e9485b5f6..359709e361 100644
--- a/src/genworld_gui.cpp
+++ b/src/genworld_gui.cpp
@@ -26,6 +26,7 @@
#include "town.h"
#include "core/geometry_func.hpp"
#include "core/random_func.hpp"
+#include "saveload/saveload.h"
#include "progress.h"
#include "error.h"
@@ -403,10 +404,10 @@ struct GenerateLandscapeWindow : public Window {
/* You can't select smoothness / non-water borders if not terragenesis */
if (mode == GLWM_GENERATE) {
- this->SetWidgetDisabledState(WID_GL_SMOOTHNESS_PULLDOWN, _settings_newgame.game_creation.land_generator == 0);
- this->SetWidgetDisabledState(WID_GL_VARIETY_PULLDOWN, _settings_newgame.game_creation.land_generator == 0);
- this->SetWidgetDisabledState(WID_GL_BORDERS_RANDOM, _settings_newgame.game_creation.land_generator == 0 || !_settings_newgame.construction.freeform_edges);
- this->SetWidgetsDisabledState(_settings_newgame.game_creation.land_generator == 0 || !_settings_newgame.construction.freeform_edges || _settings_newgame.game_creation.water_borders == BORDERS_RANDOM,
+ this->SetWidgetDisabledState(WID_GL_SMOOTHNESS_PULLDOWN, _settings_newgame.game_creation.land_generator == LG_ORIGINAL);
+ this->SetWidgetDisabledState(WID_GL_VARIETY_PULLDOWN, _settings_newgame.game_creation.land_generator == LG_ORIGINAL);
+ this->SetWidgetDisabledState(WID_GL_BORDERS_RANDOM, _settings_newgame.game_creation.land_generator == LG_ORIGINAL || !_settings_newgame.construction.freeform_edges);
+ this->SetWidgetsDisabledState(_settings_newgame.game_creation.land_generator == LG_ORIGINAL || !_settings_newgame.construction.freeform_edges || _settings_newgame.game_creation.water_borders == BORDERS_RANDOM,
WID_GL_WATER_NW, WID_GL_WATER_NE, WID_GL_WATER_SE, WID_GL_WATER_SW, WIDGET_LIST_END);
this->SetWidgetLoweredState(WID_GL_BORDERS_RANDOM, _settings_newgame.game_creation.water_borders == BORDERS_RANDOM);
@@ -416,7 +417,7 @@ struct GenerateLandscapeWindow : public Window {
this->SetWidgetLoweredState(WID_GL_WATER_SE, HasBit(_settings_newgame.game_creation.water_borders, BORDER_SE));
this->SetWidgetLoweredState(WID_GL_WATER_SW, HasBit(_settings_newgame.game_creation.water_borders, BORDER_SW));
- this->SetWidgetsDisabledState(_settings_newgame.game_creation.land_generator == 0 && (_settings_newgame.game_creation.landscape == LT_ARCTIC || _settings_newgame.game_creation.landscape == LT_TROPIC),
+ this->SetWidgetsDisabledState(_settings_newgame.game_creation.land_generator == LG_ORIGINAL && (_settings_newgame.game_creation.landscape == LT_ARCTIC || _settings_newgame.game_creation.landscape == LT_TROPIC),
WID_GL_TERRAIN_PULLDOWN, WID_GL_WATER_PULLDOWN, WIDGET_LIST_END);
}
@@ -432,7 +433,7 @@ struct GenerateLandscapeWindow : public Window {
this->SetWidgetDisabledState(WID_GL_SNOW_LEVEL_UP, _settings_newgame.game_creation.snow_line_height >= MAX_SNOWLINE_HEIGHT || _settings_newgame.game_creation.landscape != LT_ARCTIC);
/* Do not allow a custom sea level with the original land generator. */
- if (_settings_newgame.game_creation.land_generator == 0 &&
+ if (_settings_newgame.game_creation.land_generator == LG_ORIGINAL &&
_settings_newgame.difficulty.quantity_sea_lakes == CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY) {
_settings_newgame.difficulty.quantity_sea_lakes = CUSTOM_SEA_LEVEL_MIN_PERCENTAGE;
}
@@ -655,7 +656,7 @@ struct GenerateLandscapeWindow : public Window {
case WID_GL_WATER_PULLDOWN: { // Water quantity
uint32 hidden_mask = 0;
/* Disable custom water level when the original map generator is active. */
- if (_settings_newgame.game_creation.land_generator == 0) {
+ if (_settings_newgame.game_creation.land_generator == LG_ORIGINAL) {
SetBit(hidden_mask, CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY);
}
ShowDropDownMenu(this, _sea_lakes, _settings_newgame.difficulty.quantity_sea_lakes, WID_GL_WATER_PULLDOWN, 0, hidden_mask);
@@ -832,7 +833,7 @@ static void _ShowGenerateLandscape(GenerateLandscapeWindowMode mode)
if (mode == GLWM_HEIGHTMAP) {
/* If the function returns negative, it means there was a problem loading the heightmap */
- if (!GetHeightmapDimensions(_file_to_saveload.name, &x, &y)) return;
+ if (!GetHeightmapDimensions(_file_to_saveload.detail_ftype, _file_to_saveload.name, &x, &y)) return;
}
WindowDesc *desc = (mode == GLWM_HEIGHTMAP) ? &_heightmap_load_desc : &_generate_landscape_desc;
@@ -1190,7 +1191,7 @@ struct GenerateProgressWindow : public Window {
{
switch (widget) {
case WID_GP_ABORT:
- if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE);
+ SetMouseCursorBusy(false);
ShowQuery(
STR_GENERATION_ABORT_CAPTION,
STR_GENERATION_ABORT_MESSAGE,
diff --git a/src/gfx.cpp b/src/gfx.cpp
index 410a2ee961..7195051577 100644
--- a/src/gfx.cpp
+++ b/src/gfx.cpp
@@ -23,6 +23,7 @@
#include "newgrf_debug.h"
#include "table/palettes.h"
+#include "table/string_colours.h"
#include "table/sprites.h"
#include "table/control_codes.h"
@@ -175,40 +176,35 @@ static inline void GfxDoDrawLine(void *video, int x, int y, int x2, int y2, int
assert(width > 0);
- if (y2 == y) {
- /* Special case: horizontal line. */
- blitter->DrawLine(video,
- Clamp(x, 0, screen_width), y,
- Clamp(x2, 0, screen_width), y2,
- screen_width, screen_height, colour, width, dash);
- return;
- }
- if (x2 == x) {
- /* Special case: vertical line. */
- blitter->DrawLine(video,
- x, Clamp(y, 0, screen_height),
- x2, Clamp(y2, 0, screen_height),
- screen_width, screen_height, colour, width, dash);
+ if (y2 == y || x2 == x) {
+ /* Special case: horizontal/vertical line. All checks already done in GfxPreprocessLine. */
+ blitter->DrawLine(video, x, y, x2, y2, screen_width, screen_height, colour, width, dash);
return;
}
int grade_y = y2 - y;
int grade_x = x2 - x;
+ /* Clipping rectangle. Slightly extended so we can ignore the width of the line. */
+ int extra = (int)CeilDiv(3 * width, 4); // not less then "width * sqrt(2) / 2"
+ Rect clip = { -extra, -extra, screen_width - 1 + extra, screen_height - 1 + extra };
+
/* prevent integer overflows. */
int margin = 1;
- while (INT_MAX / abs(grade_y) < max(abs(x), abs(screen_width - x))) {
+ while (INT_MAX / abs(grade_y) < max(abs(clip.left - x), abs(clip.right - x))) {
grade_y /= 2;
grade_x /= 2;
margin *= 2; // account for rounding errors
}
- /* If the line is outside the screen on the same side at X positions 0
- * and screen_width, we don't need to draw anything. */
- int offset_0 = y - x * grade_y / grade_x;
- int offset_width = y + (screen_width - x) * grade_y / grade_x;
- if ((offset_0 > screen_height + width / 2 + margin && offset_width > screen_height + width / 2 + margin) ||
- (offset_0 < -width / 2 - margin && offset_width < -width / 2 - margin)) {
+ /* Imagine that the line is infinitely long and it intersects with
+ * infinitely long left and right edges of the clipping rectangle.
+ * If both intersection points are outside the clipping rectangle
+ * and both on the same side of it, we don't need to draw anything. */
+ int left_isec_y = y + (clip.left - x) * grade_y / grade_x;
+ int right_isec_y = y + (clip.right - x) * grade_y / grade_x;
+ if ((left_isec_y > clip.bottom + margin && right_isec_y > clip.bottom + margin) ||
+ (left_isec_y < clip.top - margin && right_isec_y < clip.top - margin)) {
return;
}
@@ -590,7 +586,7 @@ int GetStringLineCount(StringID str, int maxw)
*/
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion)
{
- Dimension box = {suggestion.width, GetStringHeight(str, suggestion.width)};
+ Dimension box = {suggestion.width, (uint)GetStringHeight(str, suggestion.width)};
return box;
}
@@ -602,7 +598,7 @@ Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestio
*/
Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &suggestion)
{
- Dimension box = {suggestion.width, GetStringHeight(str, suggestion.width)};
+ Dimension box = {suggestion.width, (uint)GetStringHeight(str, suggestion.width)};
return box;
}
@@ -1227,10 +1223,6 @@ void DrawMouseCursor()
if (_screen.dst_ptr == NULL) return;
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
- int x;
- int y;
- int w;
- int h;
/* Redraw mouse cursor but only when it's inside the window */
if (!_cursor.in_window) return;
@@ -1241,36 +1233,44 @@ void DrawMouseCursor()
UndrawMouseCursor();
}
- w = _cursor.size.x;
- x = _cursor.pos.x + _cursor.offs.x + _cursor.short_vehicle_offset;
- if (x < 0) {
- w += x;
- x = 0;
+ /* Determine visible area */
+ int left = _cursor.pos.x + _cursor.total_offs.x;
+ int width = _cursor.total_size.x;
+ if (left < 0) {
+ width += left;
+ left = 0;
}
- if (w > _screen.width - x) w = _screen.width - x;
- if (w <= 0) return;
- _cursor.draw_pos.x = x;
- _cursor.draw_size.x = w;
-
- h = _cursor.size.y;
- y = _cursor.pos.y + _cursor.offs.y;
- if (y < 0) {
- h += y;
- y = 0;
+ if (left + width > _screen.width) {
+ width = _screen.width - left;
}
- if (h > _screen.height - y) h = _screen.height - y;
- if (h <= 0) return;
- _cursor.draw_pos.y = y;
- _cursor.draw_size.y = h;
+ if (width <= 0) return;
- uint8 *buffer = _cursor_backup.Allocate(blitter->BufferSize(w, h));
+ int top = _cursor.pos.y + _cursor.total_offs.y;
+ int height = _cursor.total_size.y;
+ if (top < 0) {
+ height += top;
+ top = 0;
+ }
+ if (top + height > _screen.height) {
+ height = _screen.height - top;
+ }
+ if (height <= 0) return;
+
+ _cursor.draw_pos.x = left;
+ _cursor.draw_pos.y = top;
+ _cursor.draw_size.x = width;
+ _cursor.draw_size.y = height;
+
+ uint8 *buffer = _cursor_backup.Allocate(blitter->BufferSize(_cursor.draw_size.x, _cursor.draw_size.y));
/* Make backup of stuff below cursor */
blitter->CopyToBuffer(blitter->MoveTo(_screen.dst_ptr, _cursor.draw_pos.x, _cursor.draw_pos.y), buffer, _cursor.draw_size.x, _cursor.draw_size.y);
/* Draw cursor on screen */
_cur_dpi = &_screen;
- DrawSprite(_cursor.sprite, _cursor.pal, _cursor.pos.x + _cursor.short_vehicle_offset, _cursor.pos.y);
+ for (uint i = 0; i < _cursor.sprite_count; ++i) {
+ DrawSprite(_cursor.sprite_seq[i].sprite, _cursor.sprite_seq[i].pal, _cursor.pos.x + _cursor.sprite_pos[i].x, _cursor.pos.y + _cursor.sprite_pos[i].y);
+ }
VideoDriver::GetInstance()->MakeDirty(_cursor.draw_pos.x, _cursor.draw_pos.y, _cursor.draw_size.x, _cursor.draw_size.y);
@@ -1529,15 +1529,33 @@ bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int heigh
*/
void UpdateCursorSize()
{
- CursorVars *cv = &_cursor;
- const Sprite *p = GetSprite(GB(cv->sprite, 0, SPRITE_WIDTH), ST_NORMAL);
+ /* Ignore setting any cursor before the sprites are loaded. */
+ if (GetMaxSpriteID() == 0) return;
- cv->size.y = UnScaleGUI(p->height);
- cv->size.x = UnScaleGUI(p->width);
- cv->offs.x = UnScaleGUI(p->x_offs);
- cv->offs.y = UnScaleGUI(p->y_offs);
+ assert_compile(lengthof(_cursor.sprite_seq) == lengthof(_cursor.sprite_pos));
+ assert(_cursor.sprite_count <= lengthof(_cursor.sprite_seq));
+ for (uint i = 0; i < _cursor.sprite_count; ++i) {
+ const Sprite *p = GetSprite(GB(_cursor.sprite_seq[i].sprite, 0, SPRITE_WIDTH), ST_NORMAL);
+ Point offs, size;
+ offs.x = UnScaleGUI(p->x_offs) + _cursor.sprite_pos[i].x;
+ offs.y = UnScaleGUI(p->y_offs) + _cursor.sprite_pos[i].y;
+ size.x = UnScaleGUI(p->width);
+ size.y = UnScaleGUI(p->height);
- cv->dirty = true;
+ if (i == 0) {
+ _cursor.total_offs = offs;
+ _cursor.total_size = size;
+ } else {
+ int right = max(_cursor.total_offs.x + _cursor.total_size.x, offs.x + size.x);
+ int bottom = max(_cursor.total_offs.y + _cursor.total_size.y, offs.y + size.y);
+ if (offs.x < _cursor.total_offs.x) _cursor.total_offs.x = offs.x;
+ if (offs.y < _cursor.total_offs.y) _cursor.total_offs.y = offs.y;
+ _cursor.total_size.x = right - _cursor.total_offs.x;
+ _cursor.total_size.y = bottom - _cursor.total_offs.y;
+ }
+ }
+
+ _cursor.dirty = true;
}
/**
@@ -1547,14 +1565,15 @@ void UpdateCursorSize()
*/
static void SetCursorSprite(CursorID cursor, PaletteID pal)
{
- CursorVars *cv = &_cursor;
- if (cv->sprite == cursor) return;
+ if (_cursor.sprite_count == 1 && _cursor.sprite_seq[0].sprite == cursor && _cursor.sprite_seq[0].pal == pal) return;
+
+ _cursor.sprite_count = 1;
+ _cursor.sprite_seq[0].sprite = cursor;
+ _cursor.sprite_seq[0].pal = pal;
+ _cursor.sprite_pos[0].x = 0;
+ _cursor.sprite_pos[0].y = 0;
- cv->sprite = cursor;
- cv->pal = pal;
UpdateCursorSize();
-
- cv->short_vehicle_offset = 0;
}
static void SwitchAnimatedCursor()
@@ -1563,7 +1582,7 @@ static void SwitchAnimatedCursor()
if (cur == NULL || cur->sprite == AnimCursor::LAST) cur = _cursor.animate_list;
- SetCursorSprite(cur->sprite, _cursor.pal);
+ SetCursorSprite(cur->sprite, _cursor.sprite_seq[0].pal);
_cursor.animate_timeout = cur->display_time;
_cursor.animate_cur = cur + 1;
@@ -1576,6 +1595,19 @@ void CursorTick()
}
}
+/**
+ * Set or unset the ZZZ cursor.
+ * @param busy Whether to show the ZZZ cursor.
+ */
+void SetMouseCursorBusy(bool busy)
+{
+ if (busy) {
+ if (_cursor.sprite_seq[0].sprite == SPR_CURSOR_MOUSE) SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE);
+ } else {
+ if (_cursor.sprite_seq[0].sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE);
+ }
+}
+
/**
* Assign a single non-animated sprite to the cursor.
* @param sprite Sprite to draw for the cursor.
@@ -1599,7 +1631,7 @@ void SetAnimatedMouseCursor(const AnimCursor *table)
{
_cursor.animate_list = table;
_cursor.animate_cur = NULL;
- _cursor.pal = PAL_NONE;
+ _cursor.sprite_seq[0].pal = PAL_NONE;
SwitchAnimatedCursor();
}
diff --git a/src/gfx_func.h b/src/gfx_func.h
index 6576dee4fb..44f5e5059f 100644
--- a/src/gfx_func.h
+++ b/src/gfx_func.h
@@ -142,9 +142,22 @@ void CheckBlitter();
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height);
+/**
+ * Determine where to draw a centred object inside a widget.
+ * @param min The top or left coordinate.
+ * @param max The bottom or right coordinate.
+ * @param size The height or width of the object to draw.
+ * @return Offset of where to start drawing the object.
+ */
+static inline int CenterBounds(int min, int max, uint size)
+{
+ return min + (max - min - size + 1) / 2;
+}
+
/* window.cpp */
void DrawOverlappedWindowForAll(int left, int top, int right, int bottom);
+void SetMouseCursorBusy(bool busy);
void SetMouseCursor(CursorID cursor, PaletteID pal);
void SetAnimatedMouseCursor(const AnimCursor *table);
void CursorTick();
@@ -160,16 +173,16 @@ void GetBroadestDigit(uint *front, uint *next, FontSize size = FS_NORMAL);
int GetCharacterHeight(FontSize size);
-/** Height of characters in the small (#FS_SMALL) font. */
+/** Height of characters in the small (#FS_SMALL) font. @note Some characters may be oversized. */
#define FONT_HEIGHT_SMALL (GetCharacterHeight(FS_SMALL))
-/** Height of characters in the normal (#FS_NORMAL) font. */
+/** Height of characters in the normal (#FS_NORMAL) font. @note Some characters may be oversized. */
#define FONT_HEIGHT_NORMAL (GetCharacterHeight(FS_NORMAL))
-/** Height of characters in the large (#FS_LARGE) font. */
+/** Height of characters in the large (#FS_LARGE) font. @note Some characters may be oversized. */
#define FONT_HEIGHT_LARGE (GetCharacterHeight(FS_LARGE))
-/** Height of characters in the large (#FS_MONO) font. */
+/** Height of characters in the large (#FS_MONO) font. @note Some characters may be oversized. */
#define FONT_HEIGHT_MONO (GetCharacterHeight(FS_MONO))
extern DrawPixelInfo *_cur_dpi;
diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp
index 2dba6a2046..f5463d4015 100644
--- a/src/gfx_layout.cpp
+++ b/src/gfx_layout.cpp
@@ -17,9 +17,9 @@
#include "table/control_codes.h"
-#ifdef WITH_ICU
+#ifdef WITH_ICU_LAYOUT
#include
-#endif /* WITH_ICU */
+#endif /* WITH_ICU_LAYOUT */
#include "safeguards.h"
@@ -42,7 +42,7 @@ Font::Font(FontSize size, TextColour colour) :
assert(size < FS_END);
}
-#ifdef WITH_ICU
+#ifdef WITH_ICU_LAYOUT
/* Implementation details of LEFontInstance */
le_int32 Font::getUnitsPerEM() const
@@ -213,7 +213,7 @@ static ParagraphLayouter *GetParagraphLayout(UChar *buff, UChar *buff_end, FontM
return new ICUParagraphLayout(p);
}
-#endif /* WITH_ICU */
+#endif /* WITH_ICU_LAYOUT */
/*** Paragraph layout ***/
/**
@@ -654,7 +654,7 @@ Layouter::Layouter(const char *str, int maxw, TextColour colour, FontSize fontsi
line.layout->Reflow();
} else {
/* Line is new, layout it */
-#ifdef WITH_ICU
+#ifdef WITH_ICU_LAYOUT
FontState old_state = state;
const char *old_str = str;
diff --git a/src/gfx_layout.h b/src/gfx_layout.h
index 7cd70ce280..0a21d9b0ca 100644
--- a/src/gfx_layout.h
+++ b/src/gfx_layout.h
@@ -19,12 +19,12 @@
#include