diff --git a/.gitignore b/.gitignore
index 4bf58b05c1..a6be172bab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,6 +29,7 @@ docs/source/*
media/openttd.desktop
media/openttd.desktop.install
objs/*
+projects/.vs
projects/Debug
projects/Release
projects/*.ncb
diff --git a/.hgignore b/.hgignore
index 17b2557f80..3cf61bde69 100644
--- a/.hgignore
+++ b/.hgignore
@@ -22,6 +22,7 @@ Makefile.bundle
media/openttd.desktop
media/openttd.desktop.install
objs/*
+projects/.vs
projects/*.ncb
projects/*.suo
projects/*.sdf
diff --git a/bin/baseset/openttd.grf b/bin/baseset/openttd.grf
index 6d979b5d79..5d124f3f8f 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 2ed8a5a59c..9d0db3e2af 100644
--- a/bin/baseset/orig_dos.obg
+++ b/bin/baseset/orig_dos.obg
@@ -77,7 +77,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
TRGC.GRF = ed446637e034104c5559b32c18afe78d
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
-ORIG_EXTRA.GRF = 0b10a95c0adee710ecca9c3d676be4f3
+ORIG_EXTRA.GRF = 67bcfac5911667309d86b7749ea8d08c
[origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
diff --git a/bin/baseset/orig_dos_de.obg b/bin/baseset/orig_dos_de.obg
index 598d8ed89d..754ab5a2d4 100644
--- a/bin/baseset/orig_dos_de.obg
+++ b/bin/baseset/orig_dos_de.obg
@@ -75,7 +75,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
TRGC.GRF = ed446637e034104c5559b32c18afe78d
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
-ORIG_EXTRA.GRF = 0b10a95c0adee710ecca9c3d676be4f3
+ORIG_EXTRA.GRF = 67bcfac5911667309d86b7749ea8d08c
[origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
diff --git a/bin/baseset/orig_extra.grf b/bin/baseset/orig_extra.grf
index 46faff3916..728a8b2555 100644
Binary files a/bin/baseset/orig_extra.grf and b/bin/baseset/orig_extra.grf differ
diff --git a/bin/baseset/orig_win.obg b/bin/baseset/orig_win.obg
index 2b7d43478d..ec00781488 100644
--- a/bin/baseset/orig_win.obg
+++ b/bin/baseset/orig_win.obg
@@ -76,7 +76,7 @@ TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
-ORIG_EXTRA.GRF = 0b10a95c0adee710ecca9c3d676be4f3
+ORIG_EXTRA.GRF = 67bcfac5911667309d86b7749ea8d08c
[origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
diff --git a/media/extra_grf/airports.nfo b/media/extra_grf/airports.nfo
index 8feb813baf..45cd25de04 100644
--- a/media/extra_grf/airports.nfo
+++ b/media/extra_grf/airports.nfo
@@ -23,3 +23,16 @@
-1 sprites/airports.png 8bpp 82 88 64 31 -31 0 normal
-1 sprites/airports.png 8bpp 162 88 64 31 -31 0 normal
-1 sprites/airports.png 8bpp 242 88 64 31 -31 0 normal
+ -1 * 0 0C "Climate specific sprites by PaulC"
+ -1 * 0 07 83 01 \7! 01 03
+ -1 * 0 05 90 02 0D
+ -1 sprites/airports.png 8bpp 320 88 64 31 -31 0 normal
+ -1 sprites/airports.png 8bpp 400 88 64 31 -31 0 normal
+ -1 * 0 07 83 01 \7! 02 03
+ -1 * 0 05 90 02 0D
+ -1 sprites/airports.png 8bpp 480 88 64 31 -31 0 normal
+ -1 sprites/airports.png 8bpp 560 88 64 31 -31 0 normal
+ -1 * 0 07 83 01 \7! 03 03
+ -1 * 0 05 90 02 0D
+ -1 sprites/airports.png 8bpp 640 88 64 31 -31 0 normal
+ -1 sprites/airports.png 8bpp 720 88 64 31 -31 0 normal
diff --git a/media/extra_grf/airports.png b/media/extra_grf/airports.png
index fd63355b1f..5fb9618bc5 100644
Binary files a/media/extra_grf/airports.png and b/media/extra_grf/airports.png differ
diff --git a/media/extra_grf/airports_orig_extra.nfo b/media/extra_grf/airports_orig_extra.nfo
new file mode 100644
index 0000000000..f2a8dc8327
--- /dev/null
+++ b/media/extra_grf/airports_orig_extra.nfo
@@ -0,0 +1,12 @@
+//
+// $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 "Climate specific airport sprite by PaulC"
+ -1 * 0 07 83 01 \7! 03 02
+ -1 * 0 0A 01 01 2F 08
+ -1 sprites/airports.png 8bpp 20 170 42 39 -19 -21 normal
diff --git a/media/extra_grf/orig_extra.nfo b/media/extra_grf/orig_extra.nfo
index 534badab03..a1173a58c1 100644
--- a/media/extra_grf/orig_extra.nfo
+++ b/media/extra_grf/orig_extra.nfo
@@ -78,6 +78,7 @@
#include "chars_orig_extra.nfo"
#include "shore.nfo"
#include "fix_graphics.nfo"
+#include "airports_orig_extra.nfo"
#include "canals_extra.nfo"
#include "rivers/rapids.nfo"
#include "rivers/temperate.nfo"
diff --git a/os/debian/copyright b/os/debian/copyright
index ab62f66a42..05cbfc4328 100644
--- a/os/debian/copyright
+++ b/os/debian/copyright
@@ -5,7 +5,7 @@ Source: http://www.openttd.org
Files: *
-Copyright: © 2004-2017 Ludvig Strigeous and others.
+Copyright: © 2004-2018 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/rpm/openttd.spec b/os/rpm/openttd.spec
index 9685624462..27acc1b7df 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-2017 The OpenTTD developers
+# Copyright (c) 2007-2018 The OpenTTD developers
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
diff --git a/readme.txt b/readme.txt
index e378bd5d22..5f6598b9a2 100644
--- a/readme.txt
+++ b/readme.txt
@@ -680,6 +680,7 @@ http://homer.rice.edu/~sandmann/cwsdpmi/csdpmi5s.zip
X.X) Credits
---- -------
The OpenTTD team (in alphabetical order):
+ Grzegorz Duczyński (adf88) - General coding (since 1.7.2)
Albert Hofkamp (Alberth) - GUI expert (since 0.7)
Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)
Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)
diff --git a/src/company_manager_face.h b/src/company_manager_face.h
index 993e539cc7..511f85b7d5 100644
--- a/src/company_manager_face.h
+++ b/src/company_manager_face.h
@@ -78,7 +78,7 @@ static const CompanyManagerFaceBitsInfo _cmf_info[] = {
/* CMFV_MOUSTACHE */ { 13, 2, { 3, 0, 3, 0 }, { 0x367, 0, 0x397, 0 } }, ///< Depends on CMFV_HAS_MOUSTACHE
/* CMFV_LIPS */ { 13, 4, { 12, 10, 9, 9 }, { 0x35B, 0x351, 0x3A5, 0x3C8 } }, ///< Depends on !CMFV_HAS_MOUSTACHE
/* CMFV_NOSE */ { 17, 3, { 8, 4, 4, 5 }, { 0x349, 0x34C, 0x393, 0x3B3 } }, ///< Depends on !CMFV_HAS_MOUSTACHE
- /* CMFV_HAIR */ { 20, 4, { 9, 5, 5, 4 }, { 0x382, 0x38B, 0x3D4, 0x3D9 } },
+ /* CMFV_HAIR */ { 20, 4, { 9, 5, 5, 5 }, { 0x382, 0x38B, 0x3D4, 0x3D9 } },
/* CMFV_JACKET */ { 24, 2, { 3, 3, 3, 3 }, { 0x36B, 0x378, 0x36B, 0x378 } },
/* CMFV_COLLAR */ { 26, 2, { 4, 4, 4, 4 }, { 0x36E, 0x37B, 0x36E, 0x37B } },
/* CMFV_TIE_EARRING */ { 28, 3, { 6, 3, 6, 3 }, { 0x372, 0x37F, 0x372, 0x3D1 } }, ///< Depends on CMFV_HAS_TIE_EARRING
diff --git a/src/economy.cpp b/src/economy.cpp
index e9537d8c74..56dd5ae985 100644
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -685,12 +685,16 @@ static void CompanyCheckBankrupt(Company *c)
*/
static void CompaniesGenStatistics()
{
- Station *st;
+ /* Check for bankruptcy each month */
+ Company *c;
+ FOR_ALL_COMPANIES(c) {
+ CompanyCheckBankrupt(c);
+ }
Backup cur_company(_current_company, FILE_LINE);
- Company *c;
if (!_settings_game.economy.infrastructure_maintenance) {
+ Station *st;
FOR_ALL_STATIONS(st) {
cur_company.Change(st->owner);
CommandCost cost(EXPENSES_PROPERTY, _price[PR_STATION_VALUE] >> 1);
@@ -719,11 +723,6 @@ static void CompaniesGenStatistics()
}
cur_company.Restore();
- /* Check for bankruptcy each month */
- FOR_ALL_COMPANIES(c) {
- CompanyCheckBankrupt(c);
- }
-
/* Only run the economic statics and update company stats every 3rd month (1st of quarter). */
if (!HasBit(1 << 0 | 1 << 3 | 1 << 6 | 1 << 9, _cur_month)) return;
diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt
index 93cd95dd5b..9164f1365b 100644
--- a/src/lang/afrikaans.txt
+++ b/src/lang/afrikaans.txt
@@ -2686,7 +2686,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Maatskappy-besi
STR_ABOUT_OPENTTD :{WHITE}Oor OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Oorspronklike kopiereg {COPYRIGHT} 1995 Chris Sawyer, Alle regte voorbehou
STR_ABOUT_VERSION :{BLACK}OpenTTD uitgawe {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Die OpenTTD span
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Die OpenTTD span
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spaar Spel
diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt
index bcf53e7bc5..fdae7d0f80 100644
--- a/src/lang/arabic_egypt.txt
+++ b/src/lang/arabic_egypt.txt
@@ -2318,7 +2318,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :ارض مملو
STR_ABOUT_OPENTTD :{WHITE}حول النسخة المفتوحة
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}الحقوق الاصلية {COPYRIGHT} كريس سوير 1995 , جميع الحقوق محفوظة
STR_ABOUT_VERSION :{BLACK}النسخة المفتوحة رقم {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}النسخة المفتوحة {COPYRIGHT}2002-2017 فريق النسخة المفتوحة
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}النسخة المفتوحة {COPYRIGHT}2002-2018 فريق النسخة المفتوحة
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}حفظ اللعبة
diff --git a/src/lang/basque.txt b/src/lang/basque.txt
index b7436c579f..c93b72693e 100644
--- a/src/lang/basque.txt
+++ b/src/lang/basque.txt
@@ -2590,7 +2590,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Konpainia jabe
STR_ABOUT_OPENTTD :{WHITE}OpenTTD-ri buruz
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD bertsioa {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Gordetako jokoa
diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt
index 261bd6c10f..8d9f249a03 100644
--- a/src/lang/belarusian.txt
+++ b/src/lang/belarusian.txt
@@ -3018,7 +3018,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Зямля на
STR_ABOUT_OPENTTD :{WHITE}Аб OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Арыґінальныя аўтарскія правы {COPYRIGHT} 1995 Chris Sawyer. Усе правы абароненыя.
STR_ABOUT_VERSION :{BLACK}OpenTTD вэрсія {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002–2017 Каманда распрацоўнікаў OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002–2018 Каманда распрацоўнікаў OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Захаваць гульню
diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt
index 936ee49984..62ebb9d410 100644
--- a/src/lang/brazilian_portuguese.txt
+++ b/src/lang/brazilian_portuguese.txt
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :O terreno é pr
STR_ABOUT_OPENTTD :{WHITE}Sobre o OpenTTD...
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Todos os direitos reservados
STR_ABOUT_VERSION :{BLACK}OpenTTD versão {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 A equipe do OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 A equipe do OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Salvar Jogo
diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt
index 251ee3bb80..8b1d962e2d 100644
--- a/src/lang/bulgarian.txt
+++ b/src/lang/bulgarian.txt
@@ -2624,7 +2624,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Земя, пр
STR_ABOUT_OPENTTD :{WHITE}Относно OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Авторски права {COPYRIGHT} 1995 Крис Сойер (Chris Sawyer), Всички права са запазени
STR_ABOUT_VERSION :{BLACK}OpenTTD версия {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Запази играта
diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt
index a59814d743..c397775934 100644
--- a/src/lang/catalan.txt
+++ b/src/lang/catalan.txt
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :terreny propiet
STR_ABOUT_OPENTTD :{WHITE}Quant a l'OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer. Tots els drets reservats.
STR_ABOUT_VERSION :{BLACK}Versió {REV} de l'OpenTTD
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 L'equip de l'OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 L'equip de l'OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Desa la Partida
diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt
index bbe368ce68..525cf795fd 100644
--- a/src/lang/croatian.txt
+++ b/src/lang/croatian.txt
@@ -2785,7 +2785,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Zemlja u posjed
STR_ABOUT_OPENTTD :{WHITE}O OpenTTD-u
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Izvorno autorsko pravo {COPYRIGHT} 1995 Chris Sawyer, sva prava pridržana
STR_ABOUT_VERSION :{BLACK}OpenTTD verzija {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD tim
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD tim
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spremi igru
diff --git a/src/lang/czech.txt b/src/lang/czech.txt
index 4dce27d826..7057440650 100644
--- a/src/lang/czech.txt
+++ b/src/lang/czech.txt
@@ -2782,7 +2782,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Půda vlastněn
STR_ABOUT_OPENTTD :{WHITE}O OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Původní copyright: {COPYRIGHT} 1995 Chris Sawyer, všechna práva vyhrazena
STR_ABOUT_VERSION :{BLACK}OpenTTD verze {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Tým OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Tým OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Uložit hru
diff --git a/src/lang/danish.txt b/src/lang/danish.txt
index b7d0b856ec..7d71c8a5e9 100644
--- a/src/lang/danish.txt
+++ b/src/lang/danish.txt
@@ -1373,6 +1373,8 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Fra
STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Venstreklik-scrolling: {STRING}
STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Aktiver rulle kortet ved at trække den med venstre museknap. Dette er især nyttigt, når du bruger en touch-screen til at rulle
+STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Luk vindue ved højre-klik: {STRING}
+STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Lukker vinduet ved at højreklikke inde i det. Deaktiverer værktøjstip ved at højreklikke!
STR_CONFIG_SETTING_AUTOSAVE :Auto gem: {STRING}
STR_CONFIG_SETTING_AUTOSAVE_HELPTEXT :Vælg interval mellem automatisk gemte spil
@@ -1762,6 +1764,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Tjek for
STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}Vis computerspiller/spilscript indstillinger
STR_INTRO_TOOLTIP_QUIT :{BLACK}Afslut 'OpenTTD'
+STR_INTRO_BASESET :{BLACK} Det aktuelt valgte base grafiksæt mangler {NUM} sprite {P "" s}. Se venligst efter opdateringer til basesættet.
STR_INTRO_TRANSLATION :{BLACK}Denne oversættelse mangler {NUM} streng{P "" e}. Hjælp venligst med at gøre OpenTTD bedre ved at tilmelde dig som oversætter. Se readme.txt for detaljer.
# Quit window
@@ -2588,6 +2591,7 @@ STR_LAND_AREA_INFORMATION_AIRPORTTILE_NAME :{BLACK}Lufthavn
STR_LAND_AREA_INFORMATION_NEWGRF_NAME :{BLACK}NewGRF: {LTBLUE}{STRING}
STR_LAND_AREA_INFORMATION_CARGO_ACCEPTED :{BLACK}Accepteret last: {LTBLUE}
STR_LAND_AREA_INFORMATION_CARGO_EIGHTS :({COMMA}/8 {STRING})
+STR_LANG_AREA_INFORMATION_RAIL_TYPE :{BLACK}Tog type: {LTBLUE}{STRING}
STR_LANG_AREA_INFORMATION_RAIL_SPEED_LIMIT :{BLACK}Togspors hastighedsgrænse: {LTBLUE}{VELOCITY}
STR_LANG_AREA_INFORMATION_ROAD_SPEED_LIMIT :{BLACK}Vej hastighedsbegrænsning: {LTBLUE}{VELOCITY}
@@ -2603,13 +2607,13 @@ STR_LAI_CLEAR_DESCRIPTION_DESERT :Ørken
STR_LAI_RAIL_DESCRIPTION_TRACK :Jernbane spor
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_SIGNALS :Jernbane spor med bloksignaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRESIGNALS :Jernbane spor med with pre-signaler
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Jernbane spor med udgangssignaler
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXITSIGNALS :Jernbane spor med udgangs-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBOSIGNALS :Jernbane spor med kombinerede signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBSSIGNALS :Jernbane spor med rute-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NOENTRYSIGNALS :Jernbane spor med en-vejs-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PRESIGNALS :Jernbane spor med blok- og pre-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_EXITSIGNALS :Jernbane spor med blok- og udgangs-signaler
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Jernbane spor med blok og kombinerede signaler
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_COMBOSIGNALS :Jernbane spor med blok- og kombinerede signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_PBSSIGNALS :Jernbane spor med blok- og rute-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_NORMAL_NOENTRYSIGNALS :Jernbane spor med blok og en-vejs rute-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PRE_EXITSIGNALS :Jernbane spor med pre- og udgangs-signaler
@@ -2620,7 +2624,7 @@ STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_COMBOSIGNALS :Jernbane spor m
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_PBSSIGNALS :Jernbane spor med udgangs- og rute-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_EXIT_NOENTRYSIGNALS :Jernbane spor med udgangs- og en-vejs rute-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_PBSSIGNALS :Jernbane spor med kombinerede og rute-signaler
-STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Jernbane spor med kombinerede og en-vejs rute-signaler
+STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_COMBO_NOENTRYSIGNALS :Jernbane spor med kombinationede- og en-vejs rute-signaler
STR_LAI_RAIL_DESCRIPTION_TRACK_WITH_PBS_NOENTRYSIGNALS :Jernbane spor med rute- og en-vejs rute-signaler
STR_LAI_RAIL_DESCRIPTION_TRAIN_DEPOT :Jernbane togdepot
@@ -2686,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Land ejet af se
STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, Alle rettigheder reserveret
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD teamet
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD teamet
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Gem spil
@@ -3293,6 +3297,9 @@ STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO :{BLACK}Kræver:
STR_INDUSTRY_VIEW_REQUIRES_CARGO_CARGO_CARGO :{BLACK}Kræver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
+STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Kræver:
+STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING}
+STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT :{YELLOW}{STRING}{BLACK}: {CARGO_SHORT} venter{STRING}
############ range for produces starts
STR_INDUSTRY_VIEW_PRODUCES_CARGO :{BLACK}Producerer: {YELLOW}{STRING}{STRING}
@@ -3361,6 +3368,10 @@ STR_GROUP_REMOVE_ALL_VEHICLES :Fjern alle kør
STR_GROUP_RENAME_CAPTION :{BLACK}Omdøb en gruppe
+STR_GROUP_PROFIT_THIS_YEAR :Afkast i år:
+STR_GROUP_PROFIT_LAST_YEAR :Afkast sidste år:
+STR_GROUP_OCCUPANCY :Nuværende brug:
+STR_GROUP_OCCUPANCY_VALUE :{NUM}%
# Build vehicle window
STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nye jernbanekøretøjer
@@ -3393,6 +3404,7 @@ STR_PURCHASE_INFO_ALL_TYPES :Alle lasttyper
STR_PURCHASE_INFO_ALL_BUT :Alle undtagen {CARGO_LIST}
STR_PURCHASE_INFO_MAX_TE :{BLACK}Maks. trækkraft: {GOLD}{FORCE}
STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Rækkevidde: {GOLD}{COMMA} felter
+STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}Fly type: {GOLD}{STRING}
STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}Togvalgsliste - klik på et køretøj for mere information
STR_BUY_VEHICLE_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK}Liste over køretøjstyper - klik på køretøj for information
@@ -3527,6 +3539,10 @@ STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magnetskinnelok
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER :{BLACK}Pris: {CURRENCY_LONG} Vægt: {WEIGHT_SHORT}{}Hastighed: {VELOCITY} Styrke: {POWER}{}Driftsomkostninger: {CURRENCY_LONG}/år{}Kapacitet: {CARGO_LONG}
STR_ENGINE_PREVIEW_COST_WEIGHT_SPEED_POWER_MAX_TE :{BLACK}Pris: {CURRENCY_LONG} Vægt: {WEIGHT_SHORT}{}Hastighed: {VELOCITY} Hestekræfter: {POWER} Maks. Trækkraft: {6:FORCE}{}Driftsomkostning: {4:CURRENCY_LONG}/år{}Kapacitet: {5:CARGO_LONG}
STR_ENGINE_PREVIEW_COST_MAX_SPEED_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Maks. hast.: {VELOCITY}{}Kapacitet: {CARGO_LONG}{}Driftsomkostninger: {CURRENCY_LONG}/år
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed: {VELOCITY}{}Aircraft type: {STRING}{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed: {VELOCITY}{}Fly type: {STRING}{}Kapacitet: {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed: {VELOCITY}{}Fly type: {STRING} Rækkevidde: {COMMA} felter{}Kapacitet: {CARGO_LONG}, {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år
+STR_ENGINE_PREVIEW_COST_MAX_SPEED_TYPE_RANGE_CAP_RUNCOST :{BLACK}Pris: {CURRENCY_LONG} Max. Hastighed{VELOCITY}{}Fly type: {STRING} Rækkevidde: {COMMA} felter{}Kapacitet: {CARGO_LONG}{}Omkostninger: {CURRENCY_LONG}/år
# Autoreplace window
STR_REPLACE_VEHICLES_WHITE :{WHITE}Udskift {STRING} - {STRING}
@@ -3556,6 +3572,7 @@ STR_REPLACE_HELP_STOP_BUTTON :{BLACK}Tryk for
STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK}Skift imellem lokomotiv- og vognudskiftningsvindue
STR_REPLACE_ENGINES :Lokomotiver
STR_REPLACE_WAGONS :Vogne
+STR_REPLACE_ALL_RAILTYPE :Alle jernbanevogne
STR_REPLACE_HELP_RAILTYPE :{BLACK}Vælg den skinne type, du ønsker at udskifte lokomotiver til
STR_REPLACE_HELP_REPLACE_INFO_TAB :{BLACK}Viser hvilket køretøj det valgte køretøj til venstre bliver udskiftet med, hvis det udskiftes
@@ -3648,6 +3665,8 @@ STR_VEHICLE_INFO_AGE :{COMMA} år ({C
STR_VEHICLE_INFO_AGE_RED :{RED}{COMMA} år ({COMMA})
STR_VEHICLE_INFO_MAX_SPEED :{BLACK}Maks. hast.: {LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_MAX_SPEED_TYPE :{BLACK}Max. hastighed: {LTBLUE}{VELOCITY} {BLACK}Fly type: {LTBLUE}{STRING}
+STR_VEHICLE_INFO_MAX_SPEED_TYPE_RANGE :{BLACK}Max. hastighed: {LTBLUE}{VELOCITY} {BLACK}Fly type: {LTBLUE}{STRING} {BLACK}Rækkevidde: {LTBLUE}{COMMA} felter
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED :{BLACK}Vægt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Effekt: {LTBLUE}{POWER}{BLACK} Maks. hast.: {LTBLUE}{VELOCITY}
STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE :{BLACK}Vægt: {LTBLUE}{WEIGHT_SHORT} {BLACK}Effekt: {LTBLUE}{POWER}{BLACK} Maks. hast.: {LTBLUE}{VELOCITY} {BLACK}Maks. trækkraft: {LTBLUE}{FORCE}
diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt
index 523be0f371..4bce4e6b5a 100644
--- a/src/lang/dutch.txt
+++ b/src/lang/dutch.txt
@@ -2689,7 +2689,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terrein in bedr
STR_ABOUT_OPENTTD :{WHITE}Over OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Originele copyright {COPYRIGHT} 1995 Chris Sawyer, alle rechten voorbehouden
STR_ABOUT_VERSION :{BLACK}OpenTTD versie {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Het OpenTTD-team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Het OpenTTD-team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spel Opslaan
diff --git a/src/lang/english.txt b/src/lang/english.txt
index c826a75ecd..76e472212d 100644
--- a/src/lang/english.txt
+++ b/src/lang/english.txt
@@ -3148,7 +3148,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Company-owned l
STR_ABOUT_OPENTTD :{WHITE}About OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Save Game
diff --git a/src/lang/english_AU.txt b/src/lang/english_AU.txt
index 13fb3bdacc..8ef9a61798 100644
--- a/src/lang/english_AU.txt
+++ b/src/lang/english_AU.txt
@@ -2660,7 +2660,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Company-owned l
STR_ABOUT_OPENTTD :{WHITE}About OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Save Game
diff --git a/src/lang/english_US.txt b/src/lang/english_US.txt
index 72b643531b..852974bebb 100644
--- a/src/lang/english_US.txt
+++ b/src/lang/english_US.txt
@@ -2689,7 +2689,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Company-owned l
STR_ABOUT_OPENTTD :{WHITE}About OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Save Game
diff --git a/src/lang/esperanto.txt b/src/lang/esperanto.txt
index 25231a3bbc..8a1ceafd7e 100644
--- a/src/lang/esperanto.txt
+++ b/src/lang/esperanto.txt
@@ -2263,7 +2263,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Kompanie poseda
STR_ABOUT_OPENTTD :{WHITE}Pri OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Origina kopirajto {COPYRIGHT} 1995 Chris Sawyer, Ĉiuj rajtoj rezervitaj
STR_ABOUT_VERSION :{BLACK}OpenTTD-versio {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 La teamo de OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 La teamo de OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Konservu Ludon
diff --git a/src/lang/estonian.txt b/src/lang/estonian.txt
index 42220470ca..0b98ac9150 100644
--- a/src/lang/estonian.txt
+++ b/src/lang/estonian.txt
@@ -2743,7 +2743,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ettevõtte maa
STR_ABOUT_OPENTTD :{WHITE}OpenTTD lisainfo
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Algne autorikaitse {COPYRIGHT} 1995 Chris Sawyer, kõik õigused kaitstud
STR_ABOUT_VERSION :{BLACK}OpenTTD osa {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 OpenTTD meeskond
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD meeskond
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Mängu salvestamine
diff --git a/src/lang/faroese.txt b/src/lang/faroese.txt
index 6bc1b6bb6b..9aaaaa5827 100644
--- a/src/lang/faroese.txt
+++ b/src/lang/faroese.txt
@@ -2425,7 +2425,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ogn hjá fyrit
STR_ABOUT_OPENTTD :{WHITE}Um OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Upprunalig upphavsrættindi {COPYRIGHT} 1995 Chris Sawyer, Øll rættindi umbiðin
STR_ABOUT_VERSION :{BLACK}OpenTTD útgáva {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD toymi
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD toymi
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Goym spæl
diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt
index 52838ade0e..9b3f1ca0b6 100644
--- a/src/lang/finnish.txt
+++ b/src/lang/finnish.txt
@@ -2689,7 +2689,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Yhtiön omistam
STR_ABOUT_OPENTTD :{WHITE}Tietoja OpenTTD:stä
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Alkuperäiset oikeudet {COPYRIGHT} 1995 Chris Sawyer, kaikki oikeudet pidätetään
STR_ABOUT_VERSION :{BLACK}OpenTTD-versio {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Tallenna peli
diff --git a/src/lang/french.txt b/src/lang/french.txt
index 58b9b54fab..7f98aa23c0 100644
--- a/src/lang/french.txt
+++ b/src/lang/french.txt
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terrain apparte
STR_ABOUT_OPENTTD :{WHITE}À propos de OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Tous droits réservés
STR_ABOUT_VERSION :{BLACK}OpenTTD version {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 L'équipe OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 L'équipe OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sauvegarder la partie
diff --git a/src/lang/gaelic.txt b/src/lang/gaelic.txt
index 8120ea0771..8b24de2bb0 100644
--- a/src/lang/gaelic.txt
+++ b/src/lang/gaelic.txt
@@ -2930,7 +2930,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tìr a' chompan
STR_ABOUT_OPENTTD :{WHITE}Mu dheidhinn OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Còir-lethbhreac tùsail {COPYRIGHT} 1995 Chris Sawyer, a h-uile còir glèidhte
STR_ABOUT_VERSION :{BLACK}OpenTTD tionndadh {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 An sgioba OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 An sgioba OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sàbhail an geama
diff --git a/src/lang/galician.txt b/src/lang/galician.txt
index 1f876da9bd..fd8622eb6c 100644
--- a/src/lang/galician.txt
+++ b/src/lang/galician.txt
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreo propieda
STR_ABOUT_OPENTTD :{WHITE}Acerca de OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright orixinal {COPYRIGHT} 1995 Chris Sawyer, Tódolos dereitos reservados
STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 O equipo de OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 O equipo de OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Gravar partida
diff --git a/src/lang/german.txt b/src/lang/german.txt
index 51b512d928..9d3ca8a361 100644
--- a/src/lang/german.txt
+++ b/src/lang/german.txt
@@ -3141,7 +3141,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Firmeneigenes G
STR_ABOUT_OPENTTD :{WHITE}OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Transport Tycoon-Urheberrecht {COPYRIGHT} 1995 Chris Sawyer, alle Rechte vorbehalten
STR_ABOUT_VERSION :{BLACK}OpenTTD-Version {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD-Team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-Team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spiel speichern
diff --git a/src/lang/greek.txt b/src/lang/greek.txt
index 9cabb3d3eb..d090021710 100644
--- a/src/lang/greek.txt
+++ b/src/lang/greek.txt
@@ -1479,6 +1479,7 @@ STR_CONFIG_SETTING_RIGHT_MOUSE_BTN_EMU_OFF :Απενεργ
STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING :Μετάβαση με αριστερό κλικ: {STRING}
STR_CONFIG_SETTING_LEFT_MOUSE_BTN_SCROLLING_HELPTEXT :Ενεργοποίηση της κύλισης του χάρτη σύροντας τον με το αριστερό κουμπί του ποντικιού. Αυτό είναι ιδιαίτερα χρήσιμο για την κύλιση όταν χρησιμοποιείται οθόνη αφής
+STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE :Κλείσιμο παραθύρου με δεξί-κλικ: {STRING}
STR_CONFIG_SETTING_RIGHT_MOUSE_WND_CLOSE_HELPTEXT :Κλείνει το παράθυρο με δεξί πάτημα μέσα του. Απενεργοποιεί την ανάδυση επεξηγήσεων με το δεξί κουμπί!
STR_CONFIG_SETTING_AUTOSAVE :Αυτόματο σώσιμο: {STRING}
@@ -2795,7 +2796,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ιδιοκτη
STR_ABOUT_OPENTTD :{WHITE}Σχετικά με το OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Αρχικά Πνευματικά Δικαιώματα {COPYRIGHT} 1995 Chris Sawyer, Όλα τα δικαιώματα διατηρούνται
STR_ABOUT_VERSION :{BLACK}Έκδοση OpenTTD{REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Η ομάδα του OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Η ομάδα του OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Αποθήκευση Παιχνιδιού
diff --git a/src/lang/hebrew.txt b/src/lang/hebrew.txt
index 9f185a0ecd..28cc472c21 100644
--- a/src/lang/hebrew.txt
+++ b/src/lang/hebrew.txt
@@ -2703,7 +2703,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :שטח בבעל
STR_ABOUT_OPENTTD :{WHITE}OpenTTD אודות
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}כל הזכויות שמורות , {COPYRIGHT}1995 כריס סויר - זכויות יוצרים מקוריות
STR_ABOUT_VERSION :{BLACK}{REV} גירסה , OpenTTD
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}שמור משחק
diff --git a/src/lang/hungarian.txt b/src/lang/hungarian.txt
index 12e9afb547..f3504fe200 100644
--- a/src/lang/hungarian.txt
+++ b/src/lang/hungarian.txt
@@ -2753,7 +2753,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Vállalat álta
STR_ABOUT_OPENTTD :{WHITE}Az OpenTTD-ről
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Eredeti copyright {COPYRIGHT} 1995 Chris Sawyer, Minden jog fenntartva
STR_ABOUT_VERSION :{BLACK}OpenTTD {REV} verzió
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 Az OpenTTD csapat
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 Az OpenTTD csapat
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Játék mentése
diff --git a/src/lang/icelandic.txt b/src/lang/icelandic.txt
index fa28797f6b..b32716b058 100644
--- a/src/lang/icelandic.txt
+++ b/src/lang/icelandic.txt
@@ -2534,7 +2534,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Land í eigu fy
STR_ABOUT_OPENTTD :{WHITE}Um OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Upphaflegur höfundarréttur {COPYRIGHT} 1995 Chris Sawyer, Öll réttindi áskilin
STR_ABOUT_VERSION :{BLACK}OpenTTD útgáfa {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 OpenTTD hópurinn
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD hópurinn
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Vista leik
diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt
index 87a6aef315..2dbdff43d4 100644
--- a/src/lang/indonesian.txt
+++ b/src/lang/indonesian.txt
@@ -2685,7 +2685,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tanah milik Per
STR_ABOUT_OPENTTD :{WHITE}Tentang OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hak Cipta asli {COPYRIGHT} 1995 Chris Sawyer, Hak Cipta dilindungi
STR_ABOUT_VERSION :{BLACK}OpenTTD versi {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Tim OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Tim OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Simpan Permainan
diff --git a/src/lang/irish.txt b/src/lang/irish.txt
index 9c1ffa7de6..6a0db06aa5 100644
--- a/src/lang/irish.txt
+++ b/src/lang/irish.txt
@@ -2685,7 +2685,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Talamh faoi úi
STR_ABOUT_OPENTTD :{WHITE}Maidir le OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Cóipcheart bunaidh {COPYRIGHT} 1995 Chris Sawyer, Gach ceart ar cosaint
STR_ABOUT_VERSION :{BLACK}OpenTTD leagan {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 An fhoireann OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 An fhoireann OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sábháil an Cluiche
diff --git a/src/lang/italian.txt b/src/lang/italian.txt
index 2acf91d973..6ddbc12dee 100644
--- a/src/lang/italian.txt
+++ b/src/lang/italian.txt
@@ -2719,7 +2719,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno possedu
STR_ABOUT_OPENTTD :{WHITE}Informazioni su OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright originale {COPYRIGHT} 1995 Chris Sawyer, Tutti i diritti riservati
STR_ABOUT_VERSION :{BLACK}OpenTTD versione {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Il team OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Il team OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Salva partita
diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt
index a0de7363fa..78b63d2f89 100644
--- a/src/lang/japanese.txt
+++ b/src/lang/japanese.txt
@@ -2686,7 +2686,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :社有地
STR_ABOUT_OPENTTD :{WHITE}OpenTTDについて
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}オリジナル版権{COPYRIGHT} 1995 Chris Sawyer All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD バージョン {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}ゲームを保存
diff --git a/src/lang/korean.txt b/src/lang/korean.txt
index 881b9d2a63..d6f13f2fc9 100644
--- a/src/lang/korean.txt
+++ b/src/lang/korean.txt
@@ -3148,7 +3148,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :회사 소유
STR_ABOUT_OPENTTD :{WHITE}OpenTTD에 대해서
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD 버전 {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD 개발팀
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD 개발팀
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}게임 저장
diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt
index 654f2a1502..d12931c842 100644
--- a/src/lang/latvian.txt
+++ b/src/lang/latvian.txt
@@ -2626,7 +2626,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Uzņēmumam pie
STR_ABOUT_OPENTTD :{WHITE}Par OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Oriģināla autortiesības {COPYRIGHT} 1995 Kriss Sojers. Visas tiesības paturētas
STR_ABOUT_VERSION :{BLACK}OpenTTD versija {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD darba grupa
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD darba grupa
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Saglabāt spēli
diff --git a/src/lang/lithuanian.txt b/src/lang/lithuanian.txt
index 4b4016d1d9..2acbde332a 100644
--- a/src/lang/lithuanian.txt
+++ b/src/lang/lithuanian.txt
@@ -2904,7 +2904,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Kompanijos žem
STR_ABOUT_OPENTTD :{WHITE}Apie OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Pradinės versijos teisės priklauso {COPYRIGHT} 1995 Chris Sawyer, Visos teisės saugomos
STR_ABOUT_VERSION :{BLACK}OpenTTD versija {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 OpenTTD komanda
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD komanda
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Išsaugoti žaidimą
diff --git a/src/lang/luxembourgish.txt b/src/lang/luxembourgish.txt
index c0dc2fad19..90b60c019f 100644
--- a/src/lang/luxembourgish.txt
+++ b/src/lang/luxembourgish.txt
@@ -2689,7 +2689,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Land am Firmenb
STR_ABOUT_OPENTTD :{WHITE}Iwwert OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original Copyright {COPYRIGHT} 1995 Chris Sawyer, All Rechter virbehalen
STR_ABOUT_VERSION :{BLACK}OpenTTD Versioun {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 D'OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 D'OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spill späicheren
diff --git a/src/lang/malay.txt b/src/lang/malay.txt
index 5178749e89..db07b3f389 100644
--- a/src/lang/malay.txt
+++ b/src/lang/malay.txt
@@ -2404,7 +2404,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tanah dimiliki
STR_ABOUT_OPENTTD :{WHITE}Tentang OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hakcipta Asal {COPYRIGHT} 1995 Chris Sawyer, Hakcipta terpelihara
STR_ABOUT_VERSION :{BLACK}OpenTTD versi {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Simpankan Permainan
diff --git a/src/lang/norwegian_bokmal.txt b/src/lang/norwegian_bokmal.txt
index b4cae9ee5f..e574968469 100644
--- a/src/lang/norwegian_bokmal.txt
+++ b/src/lang/norwegian_bokmal.txt
@@ -2693,7 +2693,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Firma-eid lando
STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Opprinnelig opphavsbeskyttet {COPYRIGHT} 1995 Chris Sawyer, Alle rettigheter reservert
STR_ABOUT_VERSION :{BLACK}OpenTTD versjon {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD-teamet
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-teamet
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Lagre spill
diff --git a/src/lang/norwegian_nynorsk.txt b/src/lang/norwegian_nynorsk.txt
index 5cada2f560..375f8586ba 100644
--- a/src/lang/norwegian_nynorsk.txt
+++ b/src/lang/norwegian_nynorsk.txt
@@ -2606,7 +2606,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Feltet eigast a
STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Opphaveleg opphavsbeskytta av {COPYRIGHT} 1995 Chris Sawyer, Alle rettigheiter reservert
STR_ABOUT_VERSION :{BLACK}OpenTTD versjon {REV}. Oversett til nynorsk av Thor Morten Skogrand med fleire.
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD-teamet
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-teamet
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Lagre spel
diff --git a/src/lang/polish.txt b/src/lang/polish.txt
index 654fdd9b46..d175a6dbee 100644
--- a/src/lang/polish.txt
+++ b/src/lang/polish.txt
@@ -3069,7 +3069,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Teren w posiada
STR_ABOUT_OPENTTD :{WHITE}OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Prawa Autorskie {COPYRIGHT} 1995 Chris Sawyer, Wszelkie prawa zastrzeżone
STR_ABOUT_VERSION :{BLACK}OpenTTD wersja {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 Zespół OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 Zespół OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Zapisz grę
diff --git a/src/lang/portuguese.txt b/src/lang/portuguese.txt
index 69f37a4bb6..bbbbca51a1 100644
--- a/src/lang/portuguese.txt
+++ b/src/lang/portuguese.txt
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno proprie
STR_ABOUT_OPENTTD :{WHITE}Sobre o OpenTTD...
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Direitos de autor originais {COPYRIGHT} 1995 Chris Sawyer, Todos os direitos reservados
STR_ABOUT_VERSION :{BLACK}OpenTTD versão {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 A equipa do OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 A equipa do OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Guardar Jogo
diff --git a/src/lang/romanian.txt b/src/lang/romanian.txt
index 706922c5d6..b94b7242c0 100644
--- a/src/lang/romanian.txt
+++ b/src/lang/romanian.txt
@@ -2650,7 +2650,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Teren în propr
STR_ABOUT_OPENTTD :{WHITE}Despre OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Toate drepturile rezervate
STR_ABOUT_VERSION :{BLACK}OpenTTD versiunea {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Echipa OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Echipa OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Salvează joc
diff --git a/src/lang/russian.txt b/src/lang/russian.txt
index 7300280398..8c2a322441 100644
--- a/src/lang/russian.txt
+++ b/src/lang/russian.txt
@@ -2875,7 +2875,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Земля в
STR_ABOUT_OPENTTD :{WHITE}Об OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Оригинальные авторские права {COPYRIGHT} 1995 Chris Sawyer. Все права защищены.
STR_ABOUT_VERSION :{BLACK}OpenTTD версия {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Команда разработчиков OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Команда разработчиков OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Сохранить игру
diff --git a/src/lang/serbian.txt b/src/lang/serbian.txt
index 27ddb3e5df..76e6e7369c 100644
--- a/src/lang/serbian.txt
+++ b/src/lang/serbian.txt
@@ -2880,7 +2880,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Zemljište u po
STR_ABOUT_OPENTTD :{WHITE}O OpenTTD-u
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Originalni kopirajt {COPYRIGHT} 1995 Chris Sawyer, Sva prava zadržana
STR_ABOUT_VERSION :{BLACK}OpenTTD verzija {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD tim
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD tim
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Sačuvaj poziciju
diff --git a/src/lang/simplified_chinese.txt b/src/lang/simplified_chinese.txt
index f449a2ee04..38523e5597 100644
--- a/src/lang/simplified_chinese.txt
+++ b/src/lang/simplified_chinese.txt
@@ -2686,7 +2686,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :公司属地
STR_ABOUT_OPENTTD :{WHITE}关于 OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}原始版权由 {COPYRIGHT} 1995 Chris Sawyer 所有,保留一切权力。
STR_ABOUT_VERSION :{BLACK}OpenTTD 版本 {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD 团队
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD 团队
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}保存游戏
diff --git a/src/lang/slovak.txt b/src/lang/slovak.txt
index 436179e991..286e335e82 100644
--- a/src/lang/slovak.txt
+++ b/src/lang/slovak.txt
@@ -2753,7 +2753,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Spoločnosťou
STR_ABOUT_OPENTTD :{WHITE}OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Pôvodný copyright: {COPYRIGHT} 1995 Chris Sawyer, všetky práva vyhradené
STR_ABOUT_VERSION :{BLACK}OpenTTD verzia {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 team OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 team OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Uložiť hru
diff --git a/src/lang/slovenian.txt b/src/lang/slovenian.txt
index 65da3caea9..a15efc34bb 100644
--- a/src/lang/slovenian.txt
+++ b/src/lang/slovenian.txt
@@ -2839,7 +2839,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ozemlje v lasti
STR_ABOUT_OPENTTD :{WHITE}O OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Prvotne avtorske pravice {COPYRIGHT} 1995 Chris Sawyer, vse pravice pridržane
STR_ABOUT_VERSION :{BLACK}OpenTTD različica {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 ekipa OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 ekipa OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Shrani igro
diff --git a/src/lang/spanish.txt b/src/lang/spanish.txt
index 79d2b11eee..0c050301b7 100644
--- a/src/lang/spanish.txt
+++ b/src/lang/spanish.txt
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno propied
STR_ABOUT_OPENTTD :{WHITE}Acerca de OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright Original {COPYRIGHT} 1995 Chris Sawyer, Todos los derechos reservados
STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 El equipo OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 El equipo OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Guardar Juego
diff --git a/src/lang/spanish_MX.txt b/src/lang/spanish_MX.txt
index d56e83f354..13e6fa4e8a 100644
--- a/src/lang/spanish_MX.txt
+++ b/src/lang/spanish_MX.txt
@@ -1857,7 +1857,7 @@ STR_FACE_FEMALE_BUTTON :{BLACK}Mujer
STR_FACE_FEMALE_TOOLTIP :{BLACK}Elegir cara femenina
STR_FACE_NEW_FACE_BUTTON :{BLACK}Nueva cara
STR_FACE_NEW_FACE_TOOLTIP :{BLACK}Generar cara al azar
-STR_FACE_ADVANCED :{BLACK}Avanzada
+STR_FACE_ADVANCED :{BLACK}Avanzado
STR_FACE_ADVANCED_TOOLTIP :{BLACK}Selección avanzada de caras
STR_FACE_SIMPLE :{BLACK}Simple
STR_FACE_SIMPLE_TOOLTIP :{BLACK}Selección simple de caras
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Terreno propied
STR_ABOUT_OPENTTD :{WHITE}Acerca de OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, Todos los derechos reservados
STR_ABOUT_VERSION :{BLACK}OpenTTD versión {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017, el equipo de OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018, el equipo de OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Guardar partida
@@ -4493,7 +4493,7 @@ STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1 :Edificio de ofi
STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1 :Conjunto habitacional pequeño
STR_TOWN_BUILDING_NAME_CHURCH_1 :Iglesia
STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1 :Complejo de oficinas
-STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1 :Casas de pueblo
+STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1 :Casas adosadas
STR_TOWN_BUILDING_NAME_HOTEL_1 :Hotel
STR_TOWN_BUILDING_NAME_STATUE_1 :Estatua
STR_TOWN_BUILDING_NAME_FOUNTAIN_1 :Fuente
diff --git a/src/lang/swedish.txt b/src/lang/swedish.txt
index 2d2f3d87bd..20925f717c 100644
--- a/src/lang/swedish.txt
+++ b/src/lang/swedish.txt
@@ -2689,7 +2689,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Mark som ägs a
STR_ABOUT_OPENTTD :{WHITE}Om OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Ursprunglig upphovsrätt {COPYRIGHT} 1995 Chris Sawyer, Alla rättigheter hävdas
STR_ABOUT_VERSION :{BLACK}OpenTTD-version {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD-teamet
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD-teamet
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spara spel
diff --git a/src/lang/tamil.txt b/src/lang/tamil.txt
index 901a80659f..4f0d0ec3ec 100644
--- a/src/lang/tamil.txt
+++ b/src/lang/tamil.txt
@@ -2376,7 +2376,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :நிறுவ
STR_ABOUT_OPENTTD :{WHITE}OpenTTD-ஐ பற்றி
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}அசல் உரிமைகள் {COPYRIGHT} 1995 கிறிஸ் சாயர், எல்லா உரிமைகளும் பதிவுசெய்யப்பட்டது
STR_ABOUT_VERSION :{BLACK}OpenTTD பதிப்பு {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD குழுமம்
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD குழுமம்
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}ஆட்டத்தை பதிவு செய்
diff --git a/src/lang/thai.txt b/src/lang/thai.txt
index 13e1554cb5..48313376ba 100644
--- a/src/lang/thai.txt
+++ b/src/lang/thai.txt
@@ -2633,7 +2633,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :บริษั
STR_ABOUT_OPENTTD :{WHITE}เกี่ยวกับ OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}ลิขสิทธิ์เดิม {COPYRIGHT} ค.ศ.1995 ของ Chris Sawyer, สงวนลิขสิทธิ์
STR_ABOUT_VERSION :{BLACK}OpenTTD รุ่นที่ {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}ลิขสิทธิ์ OpenTTD {COPYRIGHT}2002-2017 ของ The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}ลิขสิทธิ์ OpenTTD {COPYRIGHT}2002-2018 ของ The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}บันทึกเกม
diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt
index c010b21c73..42967a154d 100644
--- a/src/lang/traditional_chinese.txt
+++ b/src/lang/traditional_chinese.txt
@@ -2685,7 +2685,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :公司所有土
STR_ABOUT_OPENTTD :{WHITE}關於 OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}原著作權為 {COPYRIGHT} 1995 Chris Sawyer,保留所有權利
STR_ABOUT_VERSION :{BLACK}OpenTTD 版本 {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD 開發小組
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD 開發小組
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}儲存遊戲
diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt
index 3d5fd14121..a73dc599a1 100644
--- a/src/lang/turkish.txt
+++ b/src/lang/turkish.txt
@@ -2690,7 +2690,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Satın alınmı
STR_ABOUT_OPENTTD :{WHITE}OpenTTD Hakkında
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Telif hakkı {COPYRIGHT} 1995 Chris Sawyer, Her hakkı saklıdır
STR_ABOUT_VERSION :{BLACK}OpenTTD sürüm {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 OpenTTD ekibi
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 OpenTTD ekibi
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Oyunu Kaydet
diff --git a/src/lang/ukrainian.txt b/src/lang/ukrainian.txt
index d7a32295ef..a76e0df2a1 100644
--- a/src/lang/ukrainian.txt
+++ b/src/lang/ukrainian.txt
@@ -2816,7 +2816,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Ця ділян
STR_ABOUT_OPENTTD :{WHITE}Про OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Авторське право {COPYRIGHT} 1995 Кріс Сойєр, Всі права захищені
STR_ABOUT_VERSION :{BLACK}OpenTTD версія {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 команда OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 команда OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Зберегти гру
diff --git a/src/lang/unfinished/frisian.txt b/src/lang/unfinished/frisian.txt
index 2b0b989323..051b62c843 100644
--- a/src/lang/unfinished/frisian.txt
+++ b/src/lang/unfinished/frisian.txt
@@ -2475,7 +2475,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Lân fan bedriu
STR_ABOUT_OPENTTD :{WHITE}Oer OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Orizjineel copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD-ferzje {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 It OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 It OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spul Opslaan
diff --git a/src/lang/unfinished/ido.txt b/src/lang/unfinished/ido.txt
index ff0ad37f4e..4f4d4846ff 100644
--- a/src/lang/unfinished/ido.txt
+++ b/src/lang/unfinished/ido.txt
@@ -776,7 +776,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_HEADQUARTERS :Stabeyo di komp
# About OpenTTD window
STR_ABOUT_VERSION :{BLACK}OpenTTD versiono {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 La kruo OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 La kruo OpenTTD
# Save/load game/scenario
STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Ludo Detali
diff --git a/src/lang/unfinished/macedonian.txt b/src/lang/unfinished/macedonian.txt
index f3b4cbaaec..6a0157c5a8 100644
--- a/src/lang/unfinished/macedonian.txt
+++ b/src/lang/unfinished/macedonian.txt
@@ -1202,7 +1202,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Компани
STR_ABOUT_OPENTTD :{WHITE}За OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Оригинален copyright {COPYRIGHT} 1995 Chris Sawyer, Сите права се задржани
STR_ABOUT_VERSION :{BLACK}OpenTTD верзија {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 OpenTTD тимот
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 OpenTTD тимот
# Save/load game/scenario
STR_SAVELOAD_LOAD_BUTTON :{BLACK}Оптоварување
diff --git a/src/lang/unfinished/persian.txt b/src/lang/unfinished/persian.txt
index d0d98af5bd..e0360680a0 100644
--- a/src/lang/unfinished/persian.txt
+++ b/src/lang/unfinished/persian.txt
@@ -2387,7 +2387,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :زمین خری
STR_ABOUT_OPENTTD :{WHITE}OpenTTD در باره ی
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Original copyright {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD ویرایش {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 The OpenTTD team
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 The OpenTTD team
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}ذخیره ی بازی
diff --git a/src/lang/vietnamese.txt b/src/lang/vietnamese.txt
index efc1d9f83a..e2f819d318 100644
--- a/src/lang/vietnamese.txt
+++ b/src/lang/vietnamese.txt
@@ -2689,7 +2689,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Đất công ty
STR_ABOUT_OPENTTD :{WHITE}Về OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Nguyên tác bản quyền {COPYRIGHT} 1995 Chris Sawyer, All rights reserved
STR_ABOUT_VERSION :{BLACK}OpenTTD phiên bản {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2017 Nhóm OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2018 Nhóm OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Lưu Ván Chơi
diff --git a/src/lang/welsh.txt b/src/lang/welsh.txt
index ffb0bd17ba..fe1c655ca8 100644
--- a/src/lang/welsh.txt
+++ b/src/lang/welsh.txt
@@ -2686,7 +2686,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :Tir cwmni
STR_ABOUT_OPENTTD :{WHITE}Gwybodaeth am OpenTTD
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}Hawlfraint Wreiddiol {COPYRIGHT} 1995 Chris Sawyer, Holl cedwir pob hawl
STR_ABOUT_VERSION :{BLACK}fersiwn OpenTTD {REV}
-STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2017 Y tîm OpenTTD
+STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-2018 Y tîm OpenTTD
# Save/load game/scenario
STR_SAVELOAD_SAVE_CAPTION :{WHITE}Cadw Gêm
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp
index 1d30af3c3f..6a378802c6 100644
--- a/src/misc_gui.cpp
+++ b/src/misc_gui.cpp
@@ -409,6 +409,7 @@ static const char * const _credits[] = {
"Original graphics by Simon Foster",
"",
"The OpenTTD team (in alphabetical order):",
+ " Grzegorz Duczy\xC5\x84ski (adf88) - General coding (since 1.7.2)",
" Albert Hofkamp (Alberth) - GUI expert (since 0.7)",
" Matthijs Kooijman (blathijs) - Pathfinder-guru, Debian port (since 0.3)",
" Ulf Hermann (fonsinchen) - Cargo Distribution (since 1.3)",
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index 76cbc6dafe..1c418ef1ba 100644
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -12,6 +12,7 @@
#include "stdafx.h"
#include
+#include
#include "debug.h"
#include "fileio_func.h"
@@ -3752,7 +3753,7 @@ static ChangeInfoResult AirportChangeInfo(uint airport, int numinfo, int prop, B
}
case 0x0A: { // Set airport layout
- as->num_table = buf->ReadByte(); // Number of layaouts
+ as->num_table = buf->ReadByte(); // Number of layouts
free(as->rotation);
as->rotation = MallocT(as->num_table);
uint32 defsize = buf->ReadDWord(); // Total size of the definition
@@ -4695,16 +4696,63 @@ static void NewSpriteGroup(ByteReader *buf)
group->adjusts = MallocT(group->num_adjusts);
MemCpyT(group->adjusts, adjusts.Begin(), group->num_adjusts);
- group->num_ranges = buf->ReadByte();
- if (group->num_ranges > 0) group->ranges = CallocT(group->num_ranges);
-
- for (uint i = 0; i < group->num_ranges; i++) {
- group->ranges[i].group = GetGroupFromGroupID(setid, type, buf->ReadWord());
- group->ranges[i].low = buf->ReadVarSize(varsize);
- group->ranges[i].high = buf->ReadVarSize(varsize);
+ std::vector ranges;
+ ranges.resize(buf->ReadByte());
+ for (uint i = 0; i < ranges.size(); i++) {
+ ranges[i].group = GetGroupFromGroupID(setid, type, buf->ReadWord());
+ ranges[i].low = buf->ReadVarSize(varsize);
+ ranges[i].high = buf->ReadVarSize(varsize);
}
group->default_group = GetGroupFromGroupID(setid, type, buf->ReadWord());
+ group->error_group = ranges.size() > 0 ? ranges[0].group : group->default_group;
+ /* nvar == 0 is a special case -- we turn our value into a callback result */
+ group->calculated_result = ranges.size() == 0;
+
+ /* Sort ranges ascending. When ranges overlap, this may required clamping or splitting them */
+ std::vector bounds;
+ for (uint i = 0; i < ranges.size(); i++) {
+ bounds.push_back(ranges[i].low);
+ if (ranges[i].high != UINT32_MAX) bounds.push_back(ranges[i].high + 1);
+ }
+ std::sort(bounds.begin(), bounds.end());
+ bounds.erase(std::unique(bounds.begin(), bounds.end()), bounds.end());
+
+ std::vector target;
+ for (uint j = 0; j < bounds.size(); ++j) {
+ uint32 v = bounds[j];
+ const SpriteGroup *t = group->default_group;
+ for (uint i = 0; i < ranges.size(); i++) {
+ if (ranges[i].low <= v && v <= ranges[i].high) {
+ t = ranges[i].group;
+ break;
+ }
+ }
+ target.push_back(t);
+ }
+ assert(target.size() == bounds.size());
+
+ std::vector optimised;
+ for (uint j = 0; j < bounds.size(); ) {
+ if (target[j] != group->default_group) {
+ DeterministicSpriteGroupRange r;
+ r.group = target[j];
+ r.low = bounds[j];
+ while (j < bounds.size() && target[j] == r.group) {
+ j++;
+ }
+ r.high = j < bounds.size() ? bounds[j] - 1 : UINT32_MAX;
+ optimised.push_back(r);
+ } else {
+ j++;
+ }
+ }
+
+ group->num_ranges = optimised.size();
+ if (group->num_ranges > 0) {
+ group->ranges = MallocT(group->num_ranges);
+ MemCpyT(group->ranges, &optimised.front(), group->num_ranges);
+ }
break;
}
diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp
index 6db12f7373..0863d09861 100644
--- a/src/newgrf_airport.cpp
+++ b/src/newgrf_airport.cpp
@@ -26,7 +26,18 @@ struct AirportScopeResolver : public ScopeResolver {
byte layout; ///< Layout of the airport to build.
TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks.
- AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, byte airport_id, byte layout);
+ /**
+ * Constructor of the scope resolver for an airport.
+ * @param ro Surrounding resolver.
+ * @param tile %Tile for the callback, only valid for airporttile callbacks.
+ * @param st %Station of the airport for which the callback is run, or \c NULL for build gui.
+ * @param airport_id Type of airport for which the callback is run.
+ * @param layout Layout of the airport to build.
+ */
+ AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, byte airport_id, byte layout)
+ : ScopeResolver(ro), st(st), airport_id(airport_id), layout(layout), tile(tile)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
@@ -242,22 +253,6 @@ AirportResolverObject::AirportResolverObject(TileIndex tile, Station *st, byte a
this->root_spritegroup = AirportSpec::Get(airport_id)->grf_prop.spritegroup[0];
}
-/**
- * Constructor of the scope resolver for an airport.
- * @param ro Surrounding resolver.
- * @param tile %Tile for the callback, only valid for airporttile callbacks.
- * @param st %Station of the airport for which the callback is run, or \c NULL for build gui.
- * @param airport_id Type of airport for which the callback is run.
- * @param layout Layout of the airport to build.
- */
-AirportScopeResolver::AirportScopeResolver(ResolverObject &ro, TileIndex tile, Station *st, byte airport_id, byte layout) : ScopeResolver(ro)
-{
- this->st = st;
- this->airport_id = airport_id;
- this->layout = layout;
- this->tile = tile;
-}
-
SpriteID GetCustomAirportSprite(const AirportSpec *as, byte layout)
{
AirportResolverObject object(INVALID_TILE, NULL, as->GetIndex(), layout);
diff --git a/src/newgrf_airporttiles.cpp b/src/newgrf_airporttiles.cpp
index 5eb24f670f..2d3a5129c9 100644
--- a/src/newgrf_airporttiles.cpp
+++ b/src/newgrf_airporttiles.cpp
@@ -222,21 +222,6 @@ AirportTileResolverObject::AirportTileResolverObject(const AirportTileSpec *ats,
this->root_spritegroup = ats->grf_prop.spritegroup[0];
}
-/**
- * Constructor of the scope resolver specific for airport tiles.
- * @param ats Specification of the airport tiles.
- * @param tile %Tile for the callback, only valid for airporttile callbacks.
- * @param st Station of the airport for which the callback is run, or \c NULL for build gui.
- */
-AirportTileScopeResolver::AirportTileScopeResolver(ResolverObject &ro, const AirportTileSpec *ats, TileIndex tile, Station *st) : ScopeResolver(ro)
-{
- assert(st != NULL);
-
- this->st = st;
- this->airport_id = st->airport.type;
- this->tile = tile;
-}
-
uint16 GetAirportTileCallback(CallbackID callback, uint32 param1, uint32 param2, const AirportTileSpec *ats, Station *st, TileIndex tile, int extra_data = 0)
{
AirportTileResolverObject object(ats, tile, st, callback, param1, param2);
diff --git a/src/newgrf_airporttiles.h b/src/newgrf_airporttiles.h
index 4d25aa9240..dc04642037 100644
--- a/src/newgrf_airporttiles.h
+++ b/src/newgrf_airporttiles.h
@@ -17,6 +17,7 @@
#include "newgrf_animation_type.h"
#include "newgrf_commons.h"
#include "newgrf_spritegroup.h"
+#include "station_base.h"
/** Scope resolver for handling the tiles of an airport. */
struct AirportTileScopeResolver : public ScopeResolver {
@@ -24,7 +25,18 @@ struct AirportTileScopeResolver : public ScopeResolver {
byte airport_id; ///< Type of airport for which the callback is run.
TileIndex tile; ///< Tile for the callback, only valid for airporttile callbacks.
- AirportTileScopeResolver(ResolverObject &ro, const AirportTileSpec *ats, TileIndex tile, Station *st);
+ /**
+ * Constructor of the scope resolver specific for airport tiles.
+ * @param ats Specification of the airport tiles.
+ * @param tile %Tile for the callback, only valid for airporttile callbacks.
+ * @param st Station of the airport for which the callback is run, or \c NULL for build gui.
+ */
+ AirportTileScopeResolver(ResolverObject &ro, const AirportTileSpec *ats, TileIndex tile, Station *st)
+ : ScopeResolver(ro), st(st), tile(tile)
+ {
+ assert(st != NULL);
+ this->airport_id = st->airport.type;
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
diff --git a/src/newgrf_canal.cpp b/src/newgrf_canal.cpp
index cba19cbdba..3438bb9850 100644
--- a/src/newgrf_canal.cpp
+++ b/src/newgrf_canal.cpp
@@ -25,7 +25,10 @@ WaterFeature _water_feature[CF_END];
struct CanalScopeResolver : public ScopeResolver {
TileIndex tile; ///< Tile containing the canal.
- CanalScopeResolver(ResolverObject &ro, TileIndex tile);
+ CanalScopeResolver(ResolverObject &ro, TileIndex tile)
+ : ScopeResolver(ro), tile(tile)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
@@ -110,11 +113,6 @@ struct CanalResolverObject : public ResolverObject {
return group->loaded[0];
}
-CanalScopeResolver::CanalScopeResolver(ResolverObject &ro, TileIndex tile) : ScopeResolver(ro)
-{
- this->tile = tile;
-}
-
/**
* Canal resolver constructor.
* @param feature Which canal feature we want.
diff --git a/src/newgrf_engine.cpp b/src/newgrf_engine.cpp
index e0d36cb756..f5ec7c86ef 100644
--- a/src/newgrf_engine.cpp
+++ b/src/newgrf_engine.cpp
@@ -943,21 +943,6 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
return in_motion ? group->loaded[set] : group->loading[set];
}
-/**
- * Scope resolver of a single vehicle.
- * @param ro Surrounding resolver.
- * @param engine_type Engine type
- * @param v %Vehicle being resolved.
- * @param info_view Indicates if the item is being drawn in an info window.
- */
-VehicleScopeResolver::VehicleScopeResolver(ResolverObject &ro, EngineID engine_type, const Vehicle *v, bool info_view)
- : ScopeResolver(ro)
-{
- this->v = v;
- this->self_type = engine_type;
- this->info_view = info_view;
-}
-
/**
* Get the grf file associated with an engine type.
* @param engine_type Engine to query.
diff --git a/src/newgrf_engine.h b/src/newgrf_engine.h
index 6406b0f4e3..51adb0b7fb 100644
--- a/src/newgrf_engine.h
+++ b/src/newgrf_engine.h
@@ -26,7 +26,17 @@ struct VehicleScopeResolver : public ScopeResolver {
EngineID self_type; ///< Type of the vehicle.
bool info_view; ///< Indicates if the item is being drawn in an info window.
- VehicleScopeResolver(ResolverObject &ro, EngineID engine_type, const Vehicle *v, bool info_view);
+ /**
+ * Scope resolver of a single vehicle.
+ * @param ro Surrounding resolver.
+ * @param engine_type Engine type
+ * @param v %Vehicle being resolved.
+ * @param info_view Indicates if the item is being drawn in an info window.
+ */
+ VehicleScopeResolver(ResolverObject &ro, EngineID engine_type, const Vehicle *v, bool info_view)
+ : ScopeResolver(ro), v(v), self_type(engine_type), info_view(info_view)
+ {
+ }
void SetVehicle(const Vehicle *v) { this->v = v; }
diff --git a/src/newgrf_generic.cpp b/src/newgrf_generic.cpp
index 9bd77239aa..6606422154 100644
--- a/src/newgrf_generic.cpp
+++ b/src/newgrf_generic.cpp
@@ -31,7 +31,16 @@ struct GenericScopeResolver : public ScopeResolver {
uint8 count;
uint8 station_size;
- GenericScopeResolver(ResolverObject &ro, bool ai_callback);
+ /**
+ * Generic scope resolver.
+ * @param ro Surrounding resolver.
+ * @param ai_callback Callback comes from the AI.
+ */
+ GenericScopeResolver(ResolverObject &ro, bool ai_callback)
+ : ScopeResolver(ro), cargo_type(0), default_selection(0), src_industry(0), dst_industry(0), distance(0),
+ event(), count(0), station_size(0), ai_callback(ai_callback)
+ {
+ }
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
@@ -145,24 +154,6 @@ GenericResolverObject::GenericResolverObject(bool ai_callback, CallbackID callba
{
}
-/**
- * Generic scope resolver.
- * @param ro Surrounding resolver.
- * @param ai_callback Callback comes from the AI.
- */
-GenericScopeResolver::GenericScopeResolver(ResolverObject &ro, bool ai_callback) : ScopeResolver(ro)
-{
- this->cargo_type = 0;
- this->default_selection = 0;
- this->src_industry = 0;
- this->dst_industry = 0;
- this->distance = 0;
- this->event = (AIConstructionEvent)0;
- this->count = 0;
- this->station_size = 0;
- this->ai_callback = ai_callback;
-}
-
/**
* Follow a generic feature callback list and return the first successful
diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp
index ece353c7d4..f553a8d659 100644
--- a/src/newgrf_house.cpp
+++ b/src/newgrf_house.cpp
@@ -34,28 +34,6 @@ static HouseClassMapping _class_mapping[HOUSE_CLASS_MAX];
HouseOverrideManager _house_mngr(NEW_HOUSE_OFFSET, NUM_HOUSES, INVALID_HOUSE_ID);
-/**
- * Constructor of a house scope resolver.
- * @param ro Surrounding resolver.
- * @param house_id House type being queried.
- * @param tile %Tile containing the house.
- * @param town %Town containing the house.
- * @param not_yet_constructed House is still under construction.
- * @param initial_random_bits Random bits during construction checks.
- * @param watched_cargo_triggers Cargo types that triggered the watched cargo callback.
- */
-HouseScopeResolver::HouseScopeResolver(ResolverObject &ro, HouseID house_id, TileIndex tile, Town *town,
- bool not_yet_constructed, uint8 initial_random_bits, uint32 watched_cargo_triggers)
- : ScopeResolver(ro)
-{
- this->house_id = house_id;
- this->tile = tile;
- this->town = town;
- this->not_yet_constructed = not_yet_constructed;
- this->initial_random_bits = initial_random_bits;
- this->watched_cargo_triggers = watched_cargo_triggers;
-}
-
/**
* Retrieve the grf file associated with a house.
* @param house_id House to query.
diff --git a/src/newgrf_house.h b/src/newgrf_house.h
index 7d19c3f669..0d9d6c8a07 100644
--- a/src/newgrf_house.h
+++ b/src/newgrf_house.h
@@ -27,8 +27,22 @@ struct HouseScopeResolver : public ScopeResolver {
uint16 initial_random_bits; ///< Random bits during construction checks.
uint32 watched_cargo_triggers; ///< Cargo types that triggered the watched cargo callback.
+ /**
+ * Constructor of a house scope resolver.
+ * @param ro Surrounding resolver.
+ * @param house_id House type being queried.
+ * @param tile %Tile containing the house.
+ * @param town %Town containing the house.
+ * @param not_yet_constructed House is still under construction.
+ * @param initial_random_bits Random bits during construction checks.
+ * @param watched_cargo_triggers Cargo types that triggered the watched cargo callback.
+ */
HouseScopeResolver(ResolverObject &ro, HouseID house_id, TileIndex tile, Town *town,
- bool not_yet_constructed, uint8 initial_random_bits, uint32 watched_cargo_triggers);
+ bool not_yet_constructed, uint8 initial_random_bits, uint32 watched_cargo_triggers)
+ : ScopeResolver(ro), house_id(house_id), tile(tile), town(town), not_yet_constructed(not_yet_constructed),
+ initial_random_bits(initial_random_bits), watched_cargo_triggers(watched_cargo_triggers)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp
index 9f227a9f58..7815ba36af 100644
--- a/src/newgrf_industries.cpp
+++ b/src/newgrf_industries.cpp
@@ -457,23 +457,6 @@ TownScopeResolver *IndustriesResolverObject::GetTown()
return this->town_scope;
}
-/**
- * Scope resolver for industries.
- * @param ro Surrounding resolver.
- * @param tile %Tile owned by the industry.
- * @param industry %Industry being resolved.
- * @param type Type of the industry.
- * @param random_bits Random bits of the new industry.
- */
-IndustriesScopeResolver::IndustriesScopeResolver(ResolverObject &ro, TileIndex tile, Industry *industry, IndustryType type, uint32 random_bits)
- : ScopeResolver(ro)
-{
- this->tile = tile;
- this->industry = industry;
- this->type = type;
- this->random_bits = random_bits;
-}
-
/**
* Perform an industry callback.
* @param callback The callback to perform.
diff --git a/src/newgrf_industries.h b/src/newgrf_industries.h
index 45b0333a67..fa809fcd73 100644
--- a/src/newgrf_industries.h
+++ b/src/newgrf_industries.h
@@ -21,7 +21,18 @@ struct IndustriesScopeResolver : public ScopeResolver {
IndustryType type; ///< Type of the industry.
uint32 random_bits; ///< Random bits of the new industry.
- IndustriesScopeResolver(ResolverObject &ro, TileIndex tile, Industry *industry, IndustryType type, uint32 random_bits = 0);
+ /**
+ * Scope resolver for industries.
+ * @param ro Surrounding resolver.
+ * @param tile %Tile owned by the industry.
+ * @param industry %Industry being resolved.
+ * @param type Type of the industry.
+ * @param random_bits Random bits of the new industry.
+ */
+ IndustriesScopeResolver(ResolverObject &ro, TileIndex tile, Industry *industry, IndustryType type, uint32 random_bits = 0)
+ : ScopeResolver(ro), tile(tile), industry(industry), type(type), random_bits(random_bits)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
diff --git a/src/newgrf_industrytiles.cpp b/src/newgrf_industrytiles.cpp
index ba4af6a382..747829f452 100644
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -146,18 +146,6 @@ IndustryTileResolverObject::IndustryTileResolverObject(IndustryGfx gfx, TileInde
this->root_spritegroup = GetIndustryTileSpec(gfx)->grf_prop.spritegroup[0];
}
-/**
- * Constructor of the scope resolver for the industry tile.
- * @param ro Surrounding resolver.
- * @param industry %Industry owning the tile.
- * @param tile %Tile of the industry.
- */
-IndustryTileScopeResolver::IndustryTileScopeResolver(ResolverObject &ro, Industry *industry, TileIndex tile) : ScopeResolver(ro)
-{
- this->industry = industry;
- this->tile = tile;
-}
-
static void IndustryDrawTileLayout(const TileInfo *ti, const TileLayoutSpriteGroup *group, byte rnd_colour, byte stage, IndustryGfx gfx)
{
const DrawTileSprites *dts = group->ProcessRegisters(&stage);
diff --git a/src/newgrf_industrytiles.h b/src/newgrf_industrytiles.h
index 2af064054d..6051c1062b 100644
--- a/src/newgrf_industrytiles.h
+++ b/src/newgrf_industrytiles.h
@@ -21,7 +21,16 @@ struct IndustryTileScopeResolver : public ScopeResolver {
Industry *industry; ///< Industry owning the tiles.
TileIndex tile; ///< %Tile being resolved.
- IndustryTileScopeResolver(ResolverObject &ro, Industry *industry, TileIndex tile);
+ /**
+ * Constructor of the scope resolver for the industry tile.
+ * @param ro Surrounding resolver.
+ * @param industry %Industry owning the tile.
+ * @param tile %Tile of the industry.
+ */
+ IndustryTileScopeResolver(ResolverObject &ro, Industry *industry, TileIndex tile)
+ : ScopeResolver(ro), industry(industry), tile(tile)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp
index 058d5e0c00..78bbc52443 100644
--- a/src/newgrf_object.cpp
+++ b/src/newgrf_object.cpp
@@ -128,21 +128,6 @@ bool NewGRFClass::IsUIAvailable(uint index) const
INSTANTIATE_NEWGRF_CLASS_METHODS(ObjectClass, ObjectSpec, ObjectClassID, OBJECT_CLASS_MAX)
-/**
- * Constructor of an object scope resolver.
- * @param ro Surrounding resolver.
- * @param obj Object being resolved.
- * @param tile %Tile of the object.
- * @param view View of the object.
- */
-ObjectScopeResolver::ObjectScopeResolver(ResolverObject &ro, Object *obj, TileIndex tile, uint8 view)
- : ScopeResolver(ro)
-{
- this->obj = obj;
- this->tile = tile;
- this->view = view;
-}
-
/* virtual */ uint32 ObjectScopeResolver::GetRandomBits() const
{
return IsValidTile(this->tile) && IsTileType(this->tile, MP_OBJECT) ? GetObjectRandomBits(this->tile) : 0;
diff --git a/src/newgrf_object.h b/src/newgrf_object.h
index cbd06b6f6d..69e1a3299c 100644
--- a/src/newgrf_object.h
+++ b/src/newgrf_object.h
@@ -104,7 +104,17 @@ struct ObjectScopeResolver : public ScopeResolver {
TileIndex tile; ///< The tile related to the object.
uint8 view; ///< The view of the object.
- ObjectScopeResolver(ResolverObject &ro, Object *obj, TileIndex tile, uint8 view = 0);
+ /**
+ * Constructor of an object scope resolver.
+ * @param ro Surrounding resolver.
+ * @param obj Object being resolved.
+ * @param tile %Tile of the object.
+ * @param view View of the object.
+ */
+ ObjectScopeResolver(ResolverObject &ro, Object *obj, TileIndex tile, uint8 view = 0)
+ : ScopeResolver(ro), obj(obj), tile(tile), view(view)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp
index 8a074db974..624b0eca84 100644
--- a/src/newgrf_railtype.cpp
+++ b/src/newgrf_railtype.cpp
@@ -67,18 +67,6 @@
return NULL;
}
-/**
- * Constructor of the railtype scope resolvers.
- * @param ro Surrounding resolver.
- * @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead.
- * @param context Are we resolving sprites for the upper halftile, or on a bridge?
- */
-RailTypeScopeResolver::RailTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context) : ScopeResolver(ro)
-{
- this->tile = tile;
- this->context = context;
-}
-
/**
* Resolver object for rail types.
* @param rti Railtype. NULL in NewGRF Inspect window.
diff --git a/src/newgrf_railtype.h b/src/newgrf_railtype.h
index 4c68e7d1db..5fadcd2ab5 100644
--- a/src/newgrf_railtype.h
+++ b/src/newgrf_railtype.h
@@ -21,7 +21,16 @@ struct RailTypeScopeResolver : public ScopeResolver {
TileIndex tile; ///< Tracktile. For track on a bridge this is the southern bridgehead.
TileContext context; ///< Are we resolving sprites for the upper halftile, or on a bridge?
- RailTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context);
+ /**
+ * Constructor of the railtype scope resolvers.
+ * @param ro Surrounding resolver.
+ * @param tile %Tile containing the track. For track on a bridge this is the southern bridgehead.
+ * @param context Are we resolving sprites for the upper halftile, or on a bridge?
+ */
+ RailTypeScopeResolver(ResolverObject &ro, TileIndex tile, TileContext context)
+ : ScopeResolver(ro), tile(tile), context(context)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp
index 8c1e8dc46d..90ccf7c132 100644
--- a/src/newgrf_spritegroup.cpp
+++ b/src/newgrf_spritegroup.cpp
@@ -10,6 +10,7 @@
/** @file newgrf_spritegroup.cpp Handling of primarily NewGRF action 2. */
#include "stdafx.h"
+#include
#include "debug.h"
#include "newgrf_spritegroup.h"
#include "core/pool_func.hpp"
@@ -61,11 +62,7 @@ RandomizedSpriteGroup::~RandomizedSpriteGroup()
static inline uint32 GetVariable(const ResolverObject &object, ScopeResolver *scope, byte variable, uint32 parameter, bool *available)
{
- /* First handle variables common with Action7/9/D */
uint32 value;
- if (GetGlobalVariable(variable, &value, object.grffile)) return value;
-
- /* Non-common variable */
switch (variable) {
case 0x0C: return object.callback;
case 0x10: return object.callback_param1;
@@ -80,18 +77,14 @@ static inline uint32 GetVariable(const ResolverObject &object, ScopeResolver *sc
if (object.grffile == NULL) return 0;
return object.grffile->GetParam(parameter);
- /* Not a common variable, so evaluate the feature specific variables */
- default: return scope->GetVariable(variable, parameter, available);
+ default:
+ /* First handle variables common with Action7/9/D */
+ if (variable < 0x40 && GetGlobalVariable(variable, &value, object.grffile)) return value;
+ /* Not a common variable, so evaluate the feature specific variables */
+ return scope->GetVariable(variable, parameter, available);
}
}
-ScopeResolver::ScopeResolver(ResolverObject &ro)
- : ro(ro)
-{
-}
-
-ScopeResolver::~ScopeResolver() {}
-
/**
* Get a few random bits. Default implementation has no random bits.
* @return Random bits.
@@ -131,27 +124,6 @@ ScopeResolver::~ScopeResolver() {}
*/
/* virtual */ void ScopeResolver::StorePSA(uint reg, int32 value) {}
-/**
- * Resolver constructor.
- * @param grffile NewGRF file associated with the object (or \c NULL if none).
- * @param callback Callback code being resolved (default value is #CBID_NO_CALLBACK).
- * @param callback_param1 First parameter (var 10) of the callback (only used when \a callback is also set).
- * @param callback_param2 Second parameter (var 18) of the callback (only used when \a callback is also set).
- */
-ResolverObject::ResolverObject(const GRFFile *grffile, CallbackID callback, uint32 callback_param1, uint32 callback_param2)
- : default_scope(*this)
-{
- this->callback = callback;
- this->callback_param1 = callback_param1;
- this->callback_param2 = callback_param2;
- this->ResetState();
-
- this->grffile = grffile;
- this->root_spritegroup = NULL;
-}
-
-ResolverObject::~ResolverObject() {}
-
/**
* Get the real sprites of the grf.
* @param group Group to get.
@@ -196,11 +168,9 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ScopeResolver
value >>= adjust->shift_num;
value &= adjust->and_mask;
- if (adjust->type != DSGA_TYPE_NONE) value += (S)adjust->add_val;
-
switch (adjust->type) {
- case DSGA_TYPE_DIV: value = (S)value / (S)adjust->divmod_val; break;
- case DSGA_TYPE_MOD: value = (S)value % (S)adjust->divmod_val; break;
+ case DSGA_TYPE_DIV: value = ((S)value + (S)adjust->add_val) / (S)adjust->divmod_val; break;
+ case DSGA_TYPE_MOD: value = ((S)value + (S)adjust->add_val) % (S)adjust->divmod_val; break;
case DSGA_TYPE_NONE: break;
}
@@ -235,6 +205,11 @@ static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ScopeResolver
bool _sprite_group_resolve_check_veh_check = false;
VehicleType _sprite_group_resolve_check_veh_type;
+static bool RangeHighComparator(const DeterministicSpriteGroupRange& range, uint32 value)
+{
+ return range.high < value;
+}
+
const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) const
{
uint32 last_value = 0;
@@ -315,7 +290,7 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con
if (!available) {
/* Unsupported variable: skip further processing and return either
* the group from the first range or the default group. */
- return SpriteGroup::Resolve(this->num_ranges > 0 ? this->ranges[0].group : this->default_group, object, false);
+ return SpriteGroup::Resolve(this->error_group, object, false);
}
switch (this->size) {
@@ -329,7 +304,7 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con
object.last_value = last_value;
- if (this->num_ranges == 0) {
+ if (this->calculated_result) {
/* nvar == 0 is a special case -- we turn our value into a callback result */
if (value != CALLBACK_FAILED) value = GB(value, 0, 15);
static CallbackResultSpriteGroup nvarzero(0, true);
@@ -337,9 +312,17 @@ const SpriteGroup *DeterministicSpriteGroup::Resolve(ResolverObject &object) con
return &nvarzero;
}
- for (i = 0; i < this->num_ranges; i++) {
- if (this->ranges[i].low <= value && value <= this->ranges[i].high) {
- return SpriteGroup::Resolve(this->ranges[i].group, object, false);
+ if (this->num_ranges > 4) {
+ DeterministicSpriteGroupRange *lower = std::lower_bound(this->ranges + 0, this->ranges + this->num_ranges, value, RangeHighComparator);
+ if (lower != this->ranges + this->num_ranges && lower->low <= value) {
+ assert(lower->low <= value && value <= lower->high);
+ return SpriteGroup::Resolve(lower->group, object, false);
+ }
+ } else {
+ for (i = 0; i < this->num_ranges; i++) {
+ if (this->ranges[i].low <= value && value <= this->ranges[i].high) {
+ return SpriteGroup::Resolve(this->ranges[i].group, object, false);
+ }
}
}
diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h
index a0ae6ce511..6adf7c2ac8 100644
--- a/src/newgrf_spritegroup.h
+++ b/src/newgrf_spritegroup.h
@@ -174,13 +174,16 @@ struct DeterministicSpriteGroup : SpriteGroup {
VarSpriteGroupScope var_scope;
DeterministicSpriteGroupSize size;
uint num_adjusts;
- byte num_ranges;
+ uint num_ranges;
+ bool calculated_result;
DeterministicSpriteGroupAdjust *adjusts;
DeterministicSpriteGroupRange *ranges; // Dynamically allocated
/* Dynamically allocated, this is the sole owner */
const SpriteGroup *default_group;
+ const SpriteGroup *error_group; // was first range, before sorting ranges
+
protected:
const SpriteGroup *Resolve(ResolverObject &object) const;
};
@@ -288,8 +291,8 @@ struct IndustryProductionSpriteGroup : SpriteGroup {
struct ScopeResolver {
ResolverObject &ro; ///< Surrounding resolver object.
- ScopeResolver(ResolverObject &ro);
- virtual ~ScopeResolver();
+ ScopeResolver(ResolverObject &ro) : ro(ro) {}
+ virtual ~ScopeResolver() {}
virtual uint32 GetRandomBits() const;
virtual uint32 GetTriggers() const;
@@ -305,8 +308,20 @@ struct ScopeResolver {
* to get the results of callbacks, rerandomisations or normal sprite lookups.
*/
struct ResolverObject {
- ResolverObject(const GRFFile *grffile, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0);
- virtual ~ResolverObject();
+ /**
+ * Resolver constructor.
+ * @param grffile NewGRF file associated with the object (or \c NULL if none).
+ * @param callback Callback code being resolved (default value is #CBID_NO_CALLBACK).
+ * @param callback_param1 First parameter (var 10) of the callback (only used when \a callback is also set).
+ * @param callback_param2 Second parameter (var 18) of the callback (only used when \a callback is also set).
+ */
+ ResolverObject(const GRFFile *grffile, CallbackID callback = CBID_NO_CALLBACK, uint32 callback_param1 = 0, uint32 callback_param2 = 0)
+ : default_scope(*this), callback(callback), callback_param1(callback_param1), callback_param2(callback_param2), grffile(grffile), root_spritegroup(NULL)
+ {
+ this->ResetState();
+ }
+
+ virtual ~ResolverObject() {}
ScopeResolver default_scope; ///< Default implementation of the grf scope.
diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp
index 458e8c0335..dee2755a3b 100644
--- a/src/newgrf_station.cpp
+++ b/src/newgrf_station.cpp
@@ -578,23 +578,6 @@ StationResolverObject::~StationResolverObject()
delete this->town_scope;
}
-/**
- * Constructor for station scopes.
- * @param ro Surrounding resolver.
- * @param statspec Station (type) specification.
- * @param st Instance of the station.
- * @param tile %Tile of the station.
- */
-StationScopeResolver::StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile)
- : ScopeResolver(ro)
-{
- this->tile = tile;
- this->st = st;
- this->statspec = statspec;
- this->cargo_type = CT_INVALID;
- this->axis = INVALID_AXIS;
-}
-
/**
* Resolve sprites for drawing a station tile.
* @param statspec Station spec
diff --git a/src/newgrf_station.h b/src/newgrf_station.h
index f6a39efb15..5413a4c08f 100644
--- a/src/newgrf_station.h
+++ b/src/newgrf_station.h
@@ -30,7 +30,17 @@ struct StationScopeResolver : public ScopeResolver {
CargoID cargo_type; ///< Type of cargo of the station.
Axis axis; ///< Station axis, used only for the slope check callback.
- StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile);
+ /**
+ * Constructor for station scopes.
+ * @param ro Surrounding resolver.
+ * @param statspec Station (type) specification.
+ * @param st Instance of the station.
+ * @param tile %Tile of the station.
+ */
+ StationScopeResolver(ResolverObject &ro, const StationSpec *statspec, BaseStation *st, TileIndex tile)
+ : ScopeResolver(ro), tile(tile), st(st), statspec(statspec), cargo_type(CT_INVALID), axis(INVALID_AXIS)
+ {
+ }
/* virtual */ uint32 GetRandomBits() const;
/* virtual */ uint32 GetTriggers() const;
diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp
index a084b9c753..9eec19c469 100644
--- a/src/newgrf_town.cpp
+++ b/src/newgrf_town.cpp
@@ -16,18 +16,6 @@
#include "safeguards.h"
-/**
- * Resolver of a town scope.
- * @param ro Surrounding resolver.
- * @param t %Town of the scope.
- * @param readonly Scope may change persistent storage of the town.
- */
-TownScopeResolver::TownScopeResolver(ResolverObject &ro, Town *t, bool readonly) : ScopeResolver(ro)
-{
- this->t = t;
- this->readonly = readonly;
-}
-
/* virtual */ uint32 TownScopeResolver::GetVariable(byte variable, uint32 parameter, bool *available) const
{
switch (variable) {
diff --git a/src/newgrf_town.h b/src/newgrf_town.h
index b14a174f40..3376816c9c 100644
--- a/src/newgrf_town.h
+++ b/src/newgrf_town.h
@@ -25,7 +25,16 @@ struct TownScopeResolver : public ScopeResolver {
Town *t; ///< %Town of the scope.
bool readonly; ///< When set, persistent storage of the town is read-only,
- TownScopeResolver(ResolverObject &ro, Town *t, bool readonly);
+ /**
+ * Resolver of a town scope.
+ * @param ro Surrounding resolver.
+ * @param t %Town of the scope.
+ * @param readonly Scope may change persistent storage of the town.
+ */
+ TownScopeResolver(ResolverObject &ro, Town *t, bool readonly)
+ : ScopeResolver(ro), t(t), readonly(readonly)
+ {
+ }
virtual uint32 GetVariable(byte variable, uint32 parameter, bool *available) const;
virtual void StorePSA(uint reg, int32 value);
diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in
index fca129c6a6..b96b0faa9f 100644
--- a/src/os/windows/ottdres.rc.in
+++ b/src/os/windows/ottdres.rc.in
@@ -100,7 +100,7 @@ BEGIN
VALUE "FileDescription", "OpenTTD\0"
VALUE "FileVersion", "!!VERSION!!\0"
VALUE "InternalName", "openttd\0"
- VALUE "LegalCopyright", "Copyright \xA9 OpenTTD Developers 2002-2017. All Rights Reserved.\0"
+ VALUE "LegalCopyright", "Copyright \xA9 OpenTTD Developers 2002-2018. All Rights Reserved.\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "openttd.exe\0"
VALUE "PrivateBuild", "\0"
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp
index f4a2cbc1d5..cfb63546ea 100644
--- a/src/saveload/saveload.cpp
+++ b/src/saveload/saveload.cpp
@@ -272,8 +272,9 @@
* 194 26881 1.5.x, 1.6.0
* 195 27572 1.6.x
* 196 27778 1.7.x
+ * 197 27978
*/
-extern const uint16 SAVEGAME_VERSION = 196; ///< Current savegame version of OpenTTD.
+extern const uint16 SAVEGAME_VERSION = 197; ///< Current savegame version of OpenTTD.
const uint16 SAVEGAME_VERSION_EXT = 0x8000; ///< Savegame extension indicator mask
SavegameType _savegame_type; ///< type of savegame we are loading
diff --git a/src/table/elrail_data.h b/src/table/elrail_data.h
index 102ad42644..6915360035 100644
--- a/src/table/elrail_data.h
+++ b/src/table/elrail_data.h
@@ -310,10 +310,10 @@ enum WireSpriteOffset {
WSO_X_NE_UP,
WSO_Y_NW_DOWN,
- WSO_ENTRANCE_NE,
- WSO_ENTRANCE_SE,
WSO_ENTRANCE_SW,
WSO_ENTRANCE_NW,
+ WSO_ENTRANCE_NE,
+ WSO_ENTRANCE_SE,
};
struct SortableSpriteStruct {
@@ -400,10 +400,10 @@ static const SortableSpriteStruct RailCatenarySpriteData_Depot[] = {
};
static const SortableSpriteStruct RailCatenarySpriteData_Tunnel[] = {
- { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE tunnel exit
- { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE tunnel exit
- { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW tunnel exit
- { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW tunnel exit
+ { WSO_ENTRANCE_SW, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for NE tunnel (SW facing exit)
+ { WSO_ENTRANCE_NW, 7, 0, 1, 15, 1, ELRAIL_ELEVATION }, //! Wire for SE tunnel (NW facing exit)
+ { WSO_ENTRANCE_NE, 0, 7, 15, 1, 1, ELRAIL_ELEVATION }, //! Wire for SW tunnel (NE facing exit)
+ { WSO_ENTRANCE_SE, 7, 0, 1, 15, 1, ELRAIL_ELEVATION } //! Wire for NW tunnel (SE facing exit)
};
diff --git a/src/table/settings.ini b/src/table/settings.ini
index 0708fc3023..74723e75b0 100644
--- a/src/table/settings.ini
+++ b/src/table/settings.ini
@@ -2744,7 +2744,7 @@ cat = SC_BASIC
base = GameSettings
var = game_creation.variety
type = SLE_UINT8
-flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
+from = 197
guiflags = SGF_MULTISTRING | SGF_NEWGAME_ONLY
def = 0
min = 0
diff --git a/src/tile_type.h b/src/tile_type.h
index 0d720925da..c02ba4fc45 100644
--- a/src/tile_type.h
+++ b/src/tile_type.h
@@ -18,6 +18,8 @@ static const uint TILE_PIXELS = 32; ///< Pixel distan
static const uint TILE_HEIGHT = 8; ///< Height of a height level in world coordinate AND in pixels in #ZOOM_LVL_BASE.
static const uint MAX_BUILDING_PIXELS = 200; ///< Maximum height of a building in pixels in #ZOOM_LVL_BASE. (Also applies to "bridge buildings" on the bridge floor.)
+static const int MAX_VEHICLE_PIXEL_X = 192; ///< Maximum width of a vehicle in pixels in #ZOOM_LVL_BASE.
+static const int MAX_VEHICLE_PIXEL_Y = 96; ///< Maximum height of a vehicle in pixels in #ZOOM_LVL_BASE.
static const uint MAX_TILE_HEIGHT = 255; ///< Maximum allowed tile height
diff --git a/src/vehicle.cpp b/src/vehicle.cpp
index 110cb5538b..7289fbf5ec 100644
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -66,7 +66,30 @@
#include "safeguards.h"
-#define GEN_HASH(x, y) ((GB((y), 6 + ZOOM_LVL_SHIFT, 6) << 6) + GB((x), 7 + ZOOM_LVL_SHIFT, 6))
+/* Number of bits in the hash to use from each vehicle coord */
+static const uint GEN_HASHX_BITS = 6;
+static const uint GEN_HASHY_BITS = 6;
+
+/* Size of each hash bucket */
+static const uint GEN_HASHX_BUCKET_BITS = 7;
+static const uint GEN_HASHY_BUCKET_BITS = 6;
+
+/* Compute hash for vehicle coord */
+#define GEN_HASHX(x) GB((x), GEN_HASHX_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHX_BITS)
+#define GEN_HASHY(y) (GB((y), GEN_HASHY_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHY_BITS) << GEN_HASHX_BITS)
+#define GEN_HASH(x, y) (GEN_HASHY(y) + GEN_HASHX(x))
+
+/* Maximum size until hash repeats */
+static const int GEN_HASHX_SIZE = 1 << (GEN_HASHX_BUCKET_BITS + GEN_HASHX_BITS + ZOOM_LVL_SHIFT);
+static const int GEN_HASHY_SIZE = 1 << (GEN_HASHY_BUCKET_BITS + GEN_HASHY_BITS + ZOOM_LVL_SHIFT);
+
+/* Increments to reach next bucket in hash table */
+static const int GEN_HASHX_INC = 1;
+static const int GEN_HASHY_INC = 1 << GEN_HASHX_BITS;
+
+/* Mask to wrap-around buckets */
+static const uint GEN_HASHX_MASK = (1 << GEN_HASHX_BITS) - 1;
+static const uint GEN_HASHY_MASK = ((1 << GEN_HASHY_BITS) - 1) << GEN_HASHX_BITS;
VehicleID _new_vehicle_id;
uint16 _returned_refit_capacity; ///< Stores the capacity after a refit operation.
@@ -708,7 +731,7 @@ static void UpdateVehicleTileHash(Vehicle *v, bool remove)
v->hash_tile_current = new_hash;
}
-static Vehicle *_vehicle_viewport_hash[0x1000];
+static Vehicle *_vehicle_viewport_hash[1 << (GEN_HASHX_BITS + GEN_HASHY_BITS)];
static void UpdateVehicleViewportHash(Vehicle *v, int x, int y)
{
diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp
index a6b62235fd..e9f8f78621 100644
--- a/src/water_cmd.cpp
+++ b/src/water_cmd.cpp
@@ -73,7 +73,7 @@ static const uint8 _flood_from_dirs[] = {
*/
static inline void MarkTileDirtyIfCanalOrRiver(TileIndex tile)
{
- if (IsTileType(tile, MP_WATER) && (IsCanal(tile) || IsRiver(tile))) MarkTileDirtyByTile(tile);
+ if (IsValidTile(tile) && IsTileType(tile, MP_WATER) && (IsCanal(tile) || IsRiver(tile))) MarkTileDirtyByTile(tile);
}
/**