diff --git a/.gitignore b/.gitignore index e30aabe37c..3e74133dfe 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ bin/baseset/* !bin/baseset/no_sound.obs !bin/baseset/no_music.obm !bin/baseset/orig_*.obm +!bin/game +bin/game/* +!bin/game/compat*.nut !bin/scripts bin/scripts/* !bin/scripts/*.example diff --git a/Makefile.src.in b/Makefile.src.in index 78413af7c5..29d551c22b 100644 --- a/Makefile.src.in +++ b/Makefile.src.in @@ -94,6 +94,7 @@ VERSION := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ') ISODATE := $(shell echo "$(VERSIONS)" | cut -f 2 -d' ') GITHASH := $(shell echo "$(VERSIONS)" | cut -f 4 -d' ') ISTAG := $(shell echo "$(VERSIONS)" | cut -f 5 -d' ') +ISSTABLETAG := $(shell echo "$(VERSIONS)" | cut -f 6 -d' ') # Make sure we have something in VERSION and ISODATE ifeq ($(VERSION),) @@ -281,10 +282,10 @@ endif # Revision files $(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in - $(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!MODIFIED!!@$(MODIFIED)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g;s@\!\!CONFIGURE_INVOCATION\!\!@$(CONFIGURE_INVOCATION)@g;" > $(SRC_DIR)/rev.cpp + $(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!MODIFIED!!@$(MODIFIED)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g;s@!!ISSTABLETAG!!@$(ISSTABLETAG)@g;s@\!\!CONFIGURE_INVOCATION\!\!@$(CONFIGURE_INVOCATION)@g;" > $(SRC_DIR)/rev.cpp $(SRC_DIR)/os/windows/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/os/windows/ottdres.rc.in - $(Q)cat $(SRC_DIR)/os/windows/ottdres.rc.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g" > $(SRC_DIR)/os/windows/ottdres.rc + $(Q)cat $(SRC_DIR)/os/windows/ottdres.rc.in | sed "s@\!\!ISODATE\!\!@$(ISODATE)@g;s@!!VERSION!!@$(VERSION)@g;s@!!DATE!!@`date +%d.%m.%y`@g;s@!!GITHASH!!@$(GITHASH)@g;s@!!ISTAG!!@$(ISTAG)@g;s@!!ISSTABLETAG!!@$(ISSTABLETAG)@g" > $(SRC_DIR)/os/windows/ottdres.rc FORCE: diff --git a/README.md b/README.md index b62cd2ba7b..544a2ea465 100644 --- a/README.md +++ b/README.md @@ -596,22 +596,22 @@ your operating system: Different types of data or extensions go into different subdirectories of the chosen main OpenTTD directory: -| data type | directory | additional info | -| --- | --- | --- | -| Config File | (no subdirectory) | | -| Screenshots | screenshot | | -| Base Graphics | baseset | (or a subdirectory thereof) | -| Sound Sets | baseset | (or a subdirectory thereof) | -| NewGRFs | newgrf | (or a subdirectory thereof) | -| 32bpp Sets | newgrf | (or a subdirectory thereof) | -| Music Sets | baseset | (or a subdirectory thereof) | -| AIs | ai | (or a subdirectory thereof) | -| AI Libraries | ai/library | (or a subdirectory thereof) | -| Game Scripts (GS) | game | (or a subdirectory thereof) | -| GS Libraries | game/library | (or a subdirectory thereof) | -| Savegames | save | | -| Automatic Savegames | save/autosave | | -| Scenarios | scenario | | +| data type | directory | additional info | +| ------------------- | ----------------- | --------------------------- | +| Config File | (no subdirectory) | | +| Screenshots | screenshot | | +| Base Graphics | baseset | (or a subdirectory thereof) | +| Sound Sets | baseset | (or a subdirectory thereof) | +| NewGRFs | newgrf | (or a subdirectory thereof) | +| 32bpp Sets | newgrf | (or a subdirectory thereof) | +| Music Sets | baseset | (or a subdirectory thereof) | +| AIs | ai | (or a subdirectory thereof) | +| AI Libraries | ai/library | (or a subdirectory thereof) | +| Game Scripts (GS) | game | (or a subdirectory thereof) | +| GS Libraries | game/library | (or a subdirectory thereof) | +| Savegames | save | | +| Automatic Savegames | save/autosave | | +| Scenarios | scenario | | The (automatically created) directory content_download is for OpenTTD's internal use and no files should be added to it or its subdirectories manually. @@ -762,6 +762,12 @@ The following is an explanation of the different statistics: - *World ticks* - Time spent on other world/landscape processing. This includes towns growing, building animations, updates of farmland and trees, and station rating updates. +- *GS/AI total*, *Game script*, and *AI players* - Time spent running logic + for game scripts and AI players. The total may show as less than the current + sum of the individual scripts, this is because AI players at lower + difficulty settings do not run every game tick, and hence contribute less + to the average across all ticks. Keep in mind that the "Current" figure is + also an average, just only over short term. - *Link graph delay* - Time overruns of the cargo distribution link graph update thread. Usually the link graph is updated in a background thread, but these updates need to synchronise with the main game loop occasionally, diff --git a/azure-pipelines-ci.yml b/azure-pipelines-ci.yml index d624f8ce73..789f8f6a32 100644 --- a/azure-pipelines-ci.yml +++ b/azure-pipelines-ci.yml @@ -1,7 +1,9 @@ trigger: - master +- release/* pr: - master +- release/* jobs: - job: windows @@ -55,6 +57,9 @@ jobs: pool: vmImage: 'macOS-10.13' + variables: + MACOSX_DEPLOYMENT_TARGET: 10.9 + steps: - template: azure-pipelines/templates/ci-git-rebase.yml - template: azure-pipelines/templates/osx-dependencies.yml diff --git a/azure-pipelines/templates/osx-dependencies.yml b/azure-pipelines/templates/osx-dependencies.yml index c4b723c58b..0393a56621 100644 --- a/azure-pipelines/templates/osx-dependencies.yml +++ b/azure-pipelines/templates/osx-dependencies.yml @@ -1,11 +1,12 @@ steps: - script: | set -ex - HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config lzo xz libpng + HOMEBREW_NO_AUTO_UPDATE=1 brew install pkg-config lzo xz libpng freetype # Remove the dynamic libraries of these libraries, to ensure we use # the static versions. That is important, as it is unlikely any # end-user has these brew libraries installed. rm /usr/local/Cellar/lzo/*/lib/*.dylib rm /usr/local/Cellar/xz/*/lib/*.dylib rm /usr/local/Cellar/libpng/*/lib/*.dylib + rm /usr/local/Cellar/freetype/*/lib/*.dylib displayName: 'Install dependencies' diff --git a/azure-pipelines/templates/release.yml b/azure-pipelines/templates/release.yml index 86f2be40ed..7628d3c91e 100644 --- a/azure-pipelines/templates/release.yml +++ b/azure-pipelines/templates/release.yml @@ -135,6 +135,9 @@ jobs: vmImage: 'macOS-10.13' dependsOn: source + variables: + MACOSX_DEPLOYMENT_TARGET: 10.9 + steps: - template: release-fetch-source.yml - template: osx-dependencies.yml diff --git a/bin/ai/compat_0.7.nut b/bin/ai/compat_0.7.nut index 98c03c6731..86ab06bba5 100644 --- a/bin/ai/compat_0.7.nut +++ b/bin/ai/compat_0.7.nut @@ -374,3 +374,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.0.nut b/bin/ai/compat_1.0.nut index 627c949cc3..6aa0e1a973 100644 --- a/bin/ai/compat_1.0.nut +++ b/bin/ai/compat_1.0.nut @@ -126,3 +126,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.1.nut b/bin/ai/compat_1.1.nut index a47f3d5b16..3d7b7553ee 100644 --- a/bin/ai/compat_1.1.nut +++ b/bin/ai/compat_1.1.nut @@ -63,3 +63,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.10.nut b/bin/ai/compat_1.10.nut new file mode 100644 index 0000000000..fe985b90d0 --- /dev/null +++ b/bin/ai/compat_1.10.nut @@ -0,0 +1,8 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ diff --git a/bin/ai/compat_1.2.nut b/bin/ai/compat_1.2.nut index 95ccabda24..594ba98352 100644 --- a/bin/ai/compat_1.2.nut +++ b/bin/ai/compat_1.2.nut @@ -15,3 +15,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.3.nut b/bin/ai/compat_1.3.nut index fc8e06bf5e..fb0f41d308 100644 --- a/bin/ai/compat_1.3.nut +++ b/bin/ai/compat_1.3.nut @@ -15,3 +15,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.4.nut b/bin/ai/compat_1.4.nut index 169ead959d..4bbb971604 100644 --- a/bin/ai/compat_1.4.nut +++ b/bin/ai/compat_1.4.nut @@ -15,3 +15,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.5.nut b/bin/ai/compat_1.5.nut index 681a708bee..b006f1733e 100644 --- a/bin/ai/compat_1.5.nut +++ b/bin/ai/compat_1.5.nut @@ -15,3 +15,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.6.nut b/bin/ai/compat_1.6.nut index 5242821d1d..e57a3cb980 100644 --- a/bin/ai/compat_1.6.nut +++ b/bin/ai/compat_1.6.nut @@ -15,3 +15,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.7.nut b/bin/ai/compat_1.7.nut index 93884e6637..ae403d104b 100644 --- a/bin/ai/compat_1.7.nut +++ b/bin/ai/compat_1.7.nut @@ -15,3 +15,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.8.nut b/bin/ai/compat_1.8.nut index f3fa1bc0a6..ecf4accdde 100644 --- a/bin/ai/compat_1.8.nut +++ b/bin/ai/compat_1.8.nut @@ -15,3 +15,10 @@ AIBridge.GetName <- function(bridge_id) { return AIBridge._GetName(bridge_id, AIVehicle.VT_RAIL); } + +/* 1.9 adds parent_group_id to CreateGroup function */ +AIGroup._CreateGroup <- AIGroup.CreateGroup; +AIGroup.CreateGroup <- function(vehicle_type) +{ + return AIGroup._CreateGroup(vehicle_type, AIGroup.GROUP_INVALID); +} diff --git a/bin/ai/compat_1.9.nut b/bin/ai/compat_1.9.nut index fe985b90d0..6dae3ebc0b 100644 --- a/bin/ai/compat_1.9.nut +++ b/bin/ai/compat_1.9.nut @@ -6,3 +6,5 @@ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ + +AILog.Info("1.9 API compatibility in effect."); diff --git a/bin/ai/regression/regression_info.nut b/bin/ai/regression/regression_info.nut index 341d13a085..d5c3f7dd29 100644 --- a/bin/ai/regression/regression_info.nut +++ b/bin/ai/regression/regression_info.nut @@ -6,7 +6,7 @@ class Regression extends AIInfo { function GetShortName() { return "REGR"; } function GetDescription() { return "This runs regression-tests on some commands. On the same map the result should always be the same."; } function GetVersion() { return 1; } - function GetAPIVersion() { return "1.9"; } + function GetAPIVersion() { return "1.10"; } function GetDate() { return "2007-03-18"; } function CreateInstance() { return "Regression"; } } diff --git a/bin/ai/regression/tst_regression/main.nut b/bin/ai/regression/tst_regression/main.nut index 8b92b6f881..7315f33f82 100644 --- a/bin/ai/regression/tst_regression/main.nut +++ b/bin/ai/regression/tst_regression/main.nut @@ -574,7 +574,7 @@ function Regression::Group() local vehicle = AIVehicle.BuildVehicle(10000, 116); print(" AIVehicle.BuildVehicle(): " + vehicle); print(" GetNumEngines(): " + AIGroup.GetNumEngines(AIGroup.GROUP_ALL, 116)); - local group = AIGroup.CreateGroup(AIVehicle.VT_ROAD); + local group = AIGroup.CreateGroup(AIVehicle.VT_ROAD, AIGroup.GROUP_INVALID); print(" CreateGroup(): " + group); print(" MoveVehicle(): " + AIGroup.MoveVehicle(group, vehicle)); print(" GetNumEngines(): " + AIGroup.GetNumEngines(group, 116)); diff --git a/bin/game/compat_1.10.nut b/bin/game/compat_1.10.nut new file mode 100644 index 0000000000..fe985b90d0 --- /dev/null +++ b/bin/game/compat_1.10.nut @@ -0,0 +1,8 @@ +/* $Id$ */ + +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ diff --git a/bin/game/compat_1.9.nut b/bin/game/compat_1.9.nut index fe985b90d0..c2acf9e909 100644 --- a/bin/game/compat_1.9.nut +++ b/bin/game/compat_1.9.nut @@ -6,3 +6,5 @@ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ + +GSLog.Info("1.9 API compatibility in effect."); diff --git a/changelog.txt b/changelog.txt index 7a8651d6e5..1d9f8947ea 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,29 @@ +1.9.0-beta3 (2019-02-24) +------------------------------------------------------------------------ +- Feature: Option to adjust font size separately from GUI size (#7003) +- Feature: Increase maximum number of orders from 64000 to ~16.7m (#7220) +- Add: Show performance of AI and GS in framerate window +- Add: News menu entry and shortcut for deleting all messages (#7240) +- Change: [OSX] Improved scrolling behaviour when using touchpads +- Change: Add scrollbar to cargo legend in cargo payment rates window +- Change: Owner of vehicle with exclusive transport rights may now load cargo from neutral stations (#7256) +- Change: Improved UI behaviour when dragging sound volume sliders with the mouse (#7227) +- Change: Use selected vehicle group as parent when creating a new group (#7224) +- Change: Use SlErrorCorrupt() on pool index error when loading a savegame, instead of terminating (#7219) +- Change: Skip reliability decay if servicing is disabled +- Fix: Remove desert around lakes upon generation +- Fix: Re-sorting file list did not update filtered rows +- Fix #7159: Waiting time at red one-way signals was too short +- Fix #7189: Fluidsynth volume gain too high +- Fix #7004: Cargo flow legend was not properly refreshed after zooming (#7265) +- Fix: Possibility to modify wrong AI/GS settings when switching AI/GS scripts around (#7090, #7091) +- Fix: Use more descriptive "spectator" strings for story book and goal dropdown menus +- Fix #6599: Disable build and rename button in build vehicle window when no vehicle is selected +- Fix: Do not mangle tagged revision strings for network revision strings +- Fix #7151: AI start date deviation was still applied when not set to a random AI (#7223) +- Fix #7197: Invalidate depot buttons when necessary (#7212) +- Doc: [AI] UnshareOrders empties the orders list of the vehicle + 1.9.0-beta2 (2019-02-09) ------------------------------------------------------------------------ - Fix: Non-Windows builds did not get correct git hash diff --git a/config.lib b/config.lib index f44b9d77ea..b4aecfb9b0 100644 --- a/config.lib +++ b/config.lib @@ -844,7 +844,7 @@ check_params() { pre_detect_with_zlib=$with_zlib detect_zlib - if [ "$with_zlib" = "0" ] || [ -z "$zlib-config" ]; then + if [ "$with_zlib" = "0" ] || [ -z "$zlib_config" ]; then log 1 "WARNING: zlib was not detected or disabled" log 1 "WARNING: OpenTTD doesn't require zlib, but it does mean that many features" log 1 "WARNING: (like loading most old savegames/scenarios, loading heightmaps," @@ -1989,12 +1989,10 @@ EOL CFLAGS="$CFLAGS -DWITH_SDL" # SDL must not add _GNU_SOURCE as it breaks many platforms CFLAGS="$CFLAGS `$sdl_config --cflags | sed 's@-D_GNU_SOURCE[^ ]*@@'`" - if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ]; then - if [ "$enable_static" != "0" ]; then - LIBS="$LIBS `$sdl_config --static-libs`" - else - LIBS="$LIBS `$sdl_config --libs`" - fi + if [ "$enable_static" != "0" ]; then + LIBS="$LIBS `$sdl_config --static --libs`" + else + LIBS="$LIBS `$sdl_config --libs`" fi fi diff --git a/docs/landscape.html b/docs/landscape.html index 319036acde..c8ac686c07 100644 --- a/docs/landscape.html +++ b/docs/landscape.html @@ -767,6 +767,7 @@  
    +
  • m1 bits 6..5: water class (sea or land)
  • m1 bits 4..0: owner (normally 10)
  • m2 bits 8..6: ground diff --git a/docs/landscape_grid.html b/docs/landscape_grid.html index 252caec07d..cd5fb3c9e2 100644 --- a/docs/landscape_grid.html +++ b/docs/landscape_grid.html @@ -196,7 +196,7 @@ the array so you can quickly see what is used and what is not. - + diff --git a/findversion.sh b/findversion.sh index df481f9bd7..0a92f1360c 100755 --- a/findversion.sh +++ b/findversion.sh @@ -83,9 +83,15 @@ if [ -d "$ROOT_DIR/.git" ]; then if [ -n "$TAG" ]; then VERSION="${TAG}" ISTAG="1" + if [ -n "`echo \"${TAG}\" | grep \"^[0-9.]*$\"`" ]; then + ISSTABLETAG="1" + else + ISSTABLETAG="0" + fi else VERSION="${ISODATE}-${BRANCH}${hashprefix}${SHORTHASH}" ISTAG="0" + ISSTABLETAG="0" fi elif [ -f "$ROOT_DIR/.ottdrev-vc" ]; then VERSION_DATA="`cat "$ROOT_DIR/.ottdrev-vc" | sed -n -e '1 p;'`" @@ -95,6 +101,7 @@ elif [ -f "$ROOT_DIR/.ottdrev-vc" ]; then MODIFIED="`echo "$VERSION_DATA" | cut -f 3 -d' '`" HASH="`echo "$VERSION_DATA" | cut -f 4 -d' '`" ISTAG="`echo "$VERSION_DATA" | cut -f 5 -d' '`" + ISSTABLETAG="`echo "$VERSION_DATA" | cut -f 6 -d' '`" if [ "$MODIFIED" = "2" ]; then VERSION="`echo "$VERSION" | sed -e 's/M$//'`" fi @@ -121,10 +128,11 @@ else TAG="" VERSION="" ISTAG="0" + ISSTABLETAG="0" fi if [ "$MODIFIED" -eq "2" ]; then VERSION="${VERSION}M" fi -echo "$VERSION $ISODATE $MODIFIED $HASH $ISTAG" +echo "$VERSION $ISODATE $MODIFIED $HASH $ISTAG $ISSTABLETAG" diff --git a/known-bugs.txt b/known-bugs.txt index bcb9c354a9..c02897e501 100644 --- a/known-bugs.txt +++ b/known-bugs.txt @@ -1,6 +1,6 @@ OpenTTD's known bugs -Last updated: 2019-02-09 -Release version: 1.9.0-beta2 +Last updated: 2019-02-24 +Release version: 1.9.0-beta3 ------------------------------------------------------------------------ diff --git a/os/debian/changelog b/os/debian/changelog index e429487ec0..858c15371b 100644 --- a/os/debian/changelog +++ b/os/debian/changelog @@ -1,3 +1,9 @@ +openttd (1.9.0~beta3-0) unstable; urgency=low + + * New upstream release 1.9.0-beta3 + + -- OpenTTD Sun, 24 Feb 2019 23:00:00 +0000 + openttd (1.9.0~beta2-0) unstable; urgency=low * New upstream release 1.9.0-beta2 diff --git a/os/os2/installer/make_installer.cmd b/os/os2/installer/make_installer.cmd index a15198b5f1..3addeca1ae 100644 --- a/os/os2/installer/make_installer.cmd +++ b/os/os2/installer/make_installer.cmd @@ -1,6 +1,6 @@ @echo off -set OPENTTD_VERSION=1.9.0 +set OPENTTD_VERSION=1.10.0 set OPENSFX_VERSION=0.8.0 set NOSOUND_VERSION=0.8.0 set OPENGFX_VERSION=1.2.0 diff --git a/os/rpm/openttd.spec b/os/rpm/openttd.spec index d16230f312..09d19621fe 100644 --- a/os/rpm/openttd.spec +++ b/os/rpm/openttd.spec @@ -17,9 +17,9 @@ # Name: openttd -Version: 1.9.beta2 +Version: 1.10.beta1 Release: 0 -%define srcver 1.9.0-beta2 +%define srcver 1.10.0-beta1 Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe License: GPL-2.0 Group: Amusements/Games/Strategy/Other diff --git a/os/windows/installer/install.nsi b/os/windows/installer/install.nsi index d0c933ca21..a0ca6ee6be 100644 --- a/os/windows/installer/install.nsi +++ b/os/windows/installer/install.nsi @@ -1,9 +1,9 @@ # Version numbers to update !define APPV_MAJOR 1 -!define APPV_MINOR 9 +!define APPV_MINOR 10 !define APPV_MAINT 0 -!define APPV_BUILD 1 -!define APPV_EXTRA "-beta2" +!define APPV_BUILD 0 +!define APPV_EXTRA "-beta1" !define APPNAME "OpenTTD" ; Define application name !define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version @@ -24,6 +24,7 @@ !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "top.bmp" +ManifestDPIAware true BrandingText "OpenTTD Installer" SetCompressor LZMA diff --git a/projects/determineversion.vbs b/projects/determineversion.vbs index e1589dcbf0..a00778f2d1 100755 --- a/projects/determineversion.vbs +++ b/projects/determineversion.vbs @@ -21,7 +21,7 @@ Sub FindReplaceInFile(filename, to_find, replacement) file.Close End Sub -Sub UpdateFile(modified, isodate, version, cur_date, githash, istag, filename) +Sub UpdateFile(modified, isodate, version, cur_date, githash, istag, isstabletag, filename) FSO.CopyFile filename & ".in", filename FindReplaceInFile filename, "!!MODIFIED!!", modified FindReplaceInFile filename, "!!ISODATE!!", isodate @@ -29,11 +29,12 @@ Sub UpdateFile(modified, isodate, version, cur_date, githash, istag, filename) FindReplaceInFile filename, "!!DATE!!", cur_date FindReplaceInFile filename, "!!GITHASH!!", githash FindReplaceInFile filename, "!!ISTAG!!", istag + FindReplaceInFile filename, "!!ISSTABLETAG!!", isstabletag FindReplaceInFile filename, "!!CONFIGURE_INVOCATION!!", "" End Sub Sub UpdateFiles(version) - Dim modified, isodate, cur_date, githash, istag + Dim modified, isodate, cur_date, githash, istag, isstabletag cur_date = DatePart("D", Date) & "." & DatePart("M", Date) & "." & DatePart("YYYY", Date) If InStr(version, Chr(9)) Then @@ -42,20 +43,23 @@ Sub UpdateFiles(version) modified = Mid(isodate, InStr(isodate, Chr(9)) + 1) githash = Mid(modified, InStr(modified, Chr(9)) + 1) istag = Mid(githash, InStr(githash, Chr(9)) + 1) + isstabletag = Mid(istag, InStr(istag, Chr(9)) + 1) ' Remove tails from fields version = Mid(version, 1, InStr(version, Chr(9)) - 1) isodate = Mid(isodate, 1, InStr(isodate, Chr(9)) - 1) modified = Mid(modified, 1, InStr(modified, Chr(9)) - 1) githash = Mid(githash, 1, InStr(githash, Chr(9)) - 1) + istag = Mid(istag, 1, InStr(istag, Chr(9)) - 1) Else isodate = 0 modified = 1 githash = "" istag = 0 + isstabletag = 0 End If - UpdateFile modified, isodate, version, cur_date, githash, istag, "../src/rev.cpp" - UpdateFile modified, isodate, version, cur_date, githash, istag, "../src/os/windows/ottdres.rc" + UpdateFile modified, isodate, version, cur_date, githash, istag, isstabletag, "../src/rev.cpp" + UpdateFile modified, isodate, version, cur_date, githash, istag, isstabletag, "../src/os/windows/ottdres.rc" End Sub Function DetermineVersion() @@ -144,7 +148,7 @@ Function DetermineVersion() DetermineVersion = "norev000" modified = 1 Else - Dim version, hashprefix, istag + Dim version, hashprefix, istag, isstabletag If modified = 0 Then hashprefix = "-g" ElseIf modified = 2 Then @@ -156,12 +160,21 @@ Function DetermineVersion() If tag <> "" Then version = tag istag = 1 + + Set stable_regexp = New RegExp + stable_regexp.Pattern = "^[0-9.]*$" + If stable_regexp.Test(tag) Then + isstabletag = 1 + Else + isstabletag = 0 + End If Else version = isodate & "-" & branch & hashprefix & shorthash istag = 0 + isstabletag = 0 End If - DetermineVersion = version & Chr(9) & isodate & Chr(9) & modified & Chr(9) & hash & Chr(9) & istag + DetermineVersion = version & Chr(9) & isodate & Chr(9) & modified & Chr(9) & hash & Chr(9) & istag & Chr(9) & isstabletag End If End Function diff --git a/projects/openttd_vs140.vcxproj b/projects/openttd_vs140.vcxproj index 0d1b4bf0b5..b595f2152a 100644 --- a/projects/openttd_vs140.vcxproj +++ b/projects/openttd_vs140.vcxproj @@ -422,7 +422,6 @@ - @@ -648,7 +647,6 @@ - diff --git a/projects/openttd_vs140.vcxproj.filters b/projects/openttd_vs140.vcxproj.filters index fa3313c427..ebb4cd334c 100644 --- a/projects/openttd_vs140.vcxproj.filters +++ b/projects/openttd_vs140.vcxproj.filters @@ -357,9 +357,6 @@ Source Files - - Source Files - Source Files @@ -1035,9 +1032,6 @@ Header Files - - Header Files - Header Files diff --git a/projects/openttd_vs141.vcxproj b/projects/openttd_vs141.vcxproj index 549e801008..13692a6252 100644 --- a/projects/openttd_vs141.vcxproj +++ b/projects/openttd_vs141.vcxproj @@ -422,7 +422,6 @@ - @@ -648,7 +647,6 @@ - diff --git a/projects/openttd_vs141.vcxproj.filters b/projects/openttd_vs141.vcxproj.filters index fa3313c427..ebb4cd334c 100644 --- a/projects/openttd_vs141.vcxproj.filters +++ b/projects/openttd_vs141.vcxproj.filters @@ -357,9 +357,6 @@ Source Files - - Source Files - Source Files @@ -1035,9 +1032,6 @@ Header Files - - Header Files - Header Files diff --git a/projects/openttd_vs142.vcxproj b/projects/openttd_vs142.vcxproj index 28f8c96fd1..d72574c139 100644 --- a/projects/openttd_vs142.vcxproj +++ b/projects/openttd_vs142.vcxproj @@ -422,7 +422,6 @@ - @@ -648,7 +647,6 @@ - diff --git a/projects/openttd_vs142.vcxproj.filters b/projects/openttd_vs142.vcxproj.filters index fa3313c427..ebb4cd334c 100644 --- a/projects/openttd_vs142.vcxproj.filters +++ b/projects/openttd_vs142.vcxproj.filters @@ -357,9 +357,6 @@ Source Files - - Source Files - Source Files @@ -1035,9 +1032,6 @@ Header Files - - Header Files - Header Files diff --git a/source.list b/source.list index 747d9c5727..67fc58c744 100644 --- a/source.list +++ b/source.list @@ -84,9 +84,6 @@ rev.cpp road.cpp roadstop.cpp screenshot.cpp -#if SDL - sdl.cpp -#end settings.cpp signal.cpp programmable_signals.cpp @@ -338,7 +335,6 @@ roadveh.h safeguards.h scope.h screenshot.h -sdl.h sound/sdl_s.h video/sdl_v.h schdispatch.h diff --git a/src/ai/ai_core.cpp b/src/ai/ai_core.cpp index d4ff233116..51522edaff 100644 --- a/src/ai/ai_core.cpp +++ b/src/ai/ai_core.cpp @@ -16,6 +16,7 @@ #include "../company_func.h" #include "../network/network.h" #include "../window_func.h" +#include "../framerate_type.h" #include "ai_scanner.hpp" #include "ai_instance.hpp" #include "ai_config.hpp" @@ -79,8 +80,11 @@ const Company *c; FOR_ALL_COMPANIES(c) { if (c->is_ai) { + PerformanceMeasurer framerate((PerformanceElement)(PFE_AI0 + c->index)); cur_company.Change(c->index); c->ai_instance->GameLoop(); + } else { + PerformanceMeasurer::SetInactive((PerformanceElement)(PFE_AI0 + c->index)); } } cur_company.Restore(); @@ -101,6 +105,7 @@ /* static */ void AI::Stop(CompanyID company) { if (_networking && !_network_server) return; + PerformanceMeasurer::SetInactive((PerformanceElement)(PFE_AI0 + company)); Backup cur_company(_current_company, company, FILE_LINE); Company *c = Company::Get(company); diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp index 43a4345460..62ddb2344f 100644 --- a/src/ai/ai_info.cpp +++ b/src/ai/ai_info.cpp @@ -29,7 +29,7 @@ static bool CheckAPIVersion(const char *api_version) return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 || strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0 || strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0 || strcmp(api_version, "1.7") == 0 || - strcmp(api_version, "1.8") == 0 || strcmp(api_version, "1.9") == 0; + strcmp(api_version, "1.8") == 0 || strcmp(api_version, "1.9") == 0 || strcmp(api_version, "1.10") == 0; } #if defined(_WIN32) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 49ab304fb2..1539454e12 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -1370,19 +1370,17 @@ static void CrashAirplane(Aircraft *v) */ static void MaybeCrashAirplane(Aircraft *v) { - if (_settings_game.vehicle.plane_crashes == 0) return; Station *st = Station::Get(v->targetairport); - /* FIXME -- MaybeCrashAirplane -> increase crashing chances of very modern airplanes on smaller than AT_METROPOLITAN airports */ - uint32 prob = (0x4000 << _settings_game.vehicle.plane_crashes); - + uint32 prob; if ((st->airport.GetFTA()->flags & AirportFTAClass::SHORT_STRIP) && (AircraftVehInfo(v->engine_type)->subtype & AIR_FAST) && !_cheats.no_jetcrash.value) { - prob /= 20; + prob = 3276; } else { - prob /= 1500; + if (_settings_game.vehicle.plane_crashes == 0) return; + prob = (0x4000 << _settings_game.vehicle.plane_crashes) / 1500; } if (_settings_game.vehicle.improved_breakdowns && v->breakdown_ctr == 1 && v->breakdown_type == BREAKDOWN_AIRCRAFT_EM_LANDING) { /* Airplanes that are attempting an emergency landing have a 2% chance to crash */ @@ -2174,7 +2172,19 @@ void UpdateAirplanesOnNewStation(const Station *st) FOR_ALL_AIRCRAFT(v) { if (!v->IsNormalAircraft() || v->targetairport != st->index) continue; assert(v->state == FLYING); + + Order *o = &v->current_order; + /* The aircraft is heading to a hangar, but the new station doesn't have one, + * or the aircraft can't land on the new station. Cancel current order. */ + if (o->IsType(OT_GOTO_DEPOT) && !(o->GetDepotOrderType() & ODTFB_PART_OF_ORDERS) && o->GetDestination() == st->index && + (!st->airport.HasHangar() || !CanVehicleUseStation(v, st))) { + o->MakeDummy(); + SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); + } v->pos = v->previous_pos = AircraftGetEntryPoint(v, ap, rotation); UpdateAircraftCache(v); } + + /* Heliports don't have a hangar. Invalidate all go to hangar orders from all aircraft. */ + if (!st->airport.HasHangar()) RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, st->index, true); } diff --git a/src/cargomonitor.cpp b/src/cargomonitor.cpp index 70d6a9c697..f43efa6989 100644 --- a/src/cargomonitor.cpp +++ b/src/cargomonitor.cpp @@ -116,8 +116,9 @@ int32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring) * @param src_type type of \a src. * @param src index of source. * @param st station where the cargo is delivered to. + * @param dest industry index where the cargo is delivered to. */ -void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st) +void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st, IndustryID dest) { if (amount == 0) return; @@ -150,6 +151,7 @@ void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, Sour /* Industry delivery. */ for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) { + if ((*ip)->index != dest) continue; CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index); CargoMonitorMap::iterator iter = _cargo_deliveries.find(num); if (iter != _cargo_deliveries.end()) iter->second += amount; diff --git a/src/cargomonitor.h b/src/cargomonitor.h index aa7cfb3b5f..1e47fc0784 100644 --- a/src/cargomonitor.h +++ b/src/cargomonitor.h @@ -148,6 +148,6 @@ void ClearCargoPickupMonitoring(CompanyID company = INVALID_OWNER); void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER); int32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring); int32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring); -void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st); +void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st, IndustryID dest = INVALID_INDUSTRY); #endif /* CARGOMONITOR_H */ diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 608632379d..c801fe650a 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -711,7 +711,7 @@ public: this->BuildGroupList(company); this->SetRows(); } else { - this->SetSelectedGroup(group); + this->SetSelectedGroup(company, group); } this->FinishInitNested(company); @@ -719,7 +719,7 @@ public: this->InvalidateData(1); } - void SetSelectedGroup(GroupID group) + void SetSelectedGroup(CompanyID company, GroupID group) { this->RaiseWidget(this->livery_class + WID_SCL_CLASS_GENERAL); const Group *g = Group::Get(group); @@ -734,7 +734,7 @@ public: this->LowerWidget(this->livery_class + WID_SCL_CLASS_GENERAL); this->groups.ForceRebuild(); - this->BuildGroupList((CompanyID)this->window_number); + this->BuildGroupList(company); this->SetRows(); /* Position scrollbar to selected group */ @@ -1029,9 +1029,15 @@ public: if (data != -1) { /* data contains a VehicleType, rebuild list if it displayed */ if (this->livery_class == data + LC_GROUP_RAIL) { - if (!Group::IsValidID(this->sel)) this->sel = INVALID_GROUP; this->groups.ForceRebuild(); this->BuildGroupList((CompanyID)this->window_number); + this->SetRows(); + + if (!Group::IsValidID(this->sel)) { + this->sel = INVALID_GROUP; + if (this->groups.Length() > 0) this->sel = this->groups[0]->index; + } + this->SetDirty(); } return; @@ -1103,7 +1109,7 @@ void ShowCompanyLiveryWindow(CompanyID company, GroupID group) if (w == NULL) { new SelectCompanyLiveryWindow(&_select_company_livery_desc, company, group); } else if (group != INVALID_GROUP) { - w->SetSelectedGroup(group); + w->SetSelectedGroup(company, group); } } diff --git a/src/crashlog.cpp b/src/crashlog.cpp index e6c2d7032e..1d3be5b083 100644 --- a/src/crashlog.cpp +++ b/src/crashlog.cpp @@ -66,7 +66,6 @@ #include #endif #ifdef WITH_SDL -# include "sdl.h" # include #endif /* WITH_SDL */ #ifdef WITH_ZLIB @@ -292,14 +291,8 @@ char *CrashLog::LogLibraries(char *buffer, const char *last) const #endif /* WITH_PNG */ #ifdef WITH_SDL -#ifdef DYNAMICALLY_LOADED_SDL - if (SDL_CALL SDL_Linked_Version != NULL) { -#else - { -#endif - const SDL_version *v = SDL_CALL SDL_Linked_Version(); - buffer += seprintf(buffer, last, " SDL: %d.%d.%d\n", v->major, v->minor, v->patch); - } + const SDL_version *v = SDL_Linked_Version(); + buffer += seprintf(buffer, last, " SDL: %d.%d.%d\n", v->major, v->minor, v->patch); #endif /* WITH_SDL */ #ifdef WITH_ZLIB diff --git a/src/economy.cpp b/src/economy.cpp index a6d39f1229..e9d646cb91 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1062,9 +1062,10 @@ static SmallIndustryList _cargo_delivery_destinations; * @param cargo_type Type of cargo delivered * @param num_pieces Amount of cargo delivered * @param source The source of the cargo + * @param company The company delivering the cargo * @return actually accepted pieces of cargo */ -static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint num_pieces, IndustryID source) +static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint num_pieces, IndustryID source, CompanyID company) { /* Find the nearest industrytile to the station sign inside the catchment area, whose industry accepts the cargo. * This fails in three cases: @@ -1097,6 +1098,9 @@ static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint n ind->last_cargo_accepted_at[cargo_index] = _date; num_pieces -= amount; accepted += amount; + + /* Update the cargo monitor. */ + AddCargoDelivery(cargo_type, company, amount, ST_INDUSTRY, source, st, ind->index); } return accepted; @@ -1122,30 +1126,30 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID dest, Ti Station *st = Station::Get(dest); /* Give the goods to the industry. */ - uint accepted = DeliverGoodsToIndustry(st, cargo_type, num_pieces, src_type == ST_INDUSTRY ? src : INVALID_INDUSTRY); + uint accepted_ind = DeliverGoodsToIndustry(st, cargo_type, num_pieces, src_type == ST_INDUSTRY ? src : INVALID_INDUSTRY, company->index); /* If this cargo type is always accepted, accept all */ - if (HasBit(st->always_accepted, cargo_type)) accepted = num_pieces; + uint accepted_total = HasBit(st->always_accepted, cargo_type) ? num_pieces : accepted_ind; /* Update station statistics */ - if (accepted > 0) { + if (accepted_total > 0) { SetBit(st->goods[cargo_type].status, GoodsEntry::GES_EVER_ACCEPTED); SetBit(st->goods[cargo_type].status, GoodsEntry::GES_CURRENT_MONTH); SetBit(st->goods[cargo_type].status, GoodsEntry::GES_ACCEPTED_BIGTICK); } /* Update company statistics */ - company->cur_economy.delivered_cargo[cargo_type] += accepted; + company->cur_economy.delivered_cargo[cargo_type] += accepted_total; /* Increase town's counter for town effects */ const CargoSpec *cs = CargoSpec::Get(cargo_type); - st->town->received[cs->town_effect].new_act += accepted; + st->town->received[cs->town_effect].new_act += accepted_total; /* Determine profit */ - Money profit = GetTransportedGoodsIncome(accepted, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type); + Money profit = GetTransportedGoodsIncome(accepted_total, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type); /* Update the cargo monitor. */ - AddCargoDelivery(cargo_type, company->index, accepted, src_type, src, st); + AddCargoDelivery(cargo_type, company->index, accepted_total - accepted_ind, src_type, src, st); /* Modify profit if a subsidy is in effect */ if (CheckSubsidised(cargo_type, company->index, src_type, src, st)) { diff --git a/src/engine.cpp b/src/engine.cpp index b54d3f8b4b..7467e86f97 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -662,7 +662,14 @@ void StartupOneEngine(Engine *e, Date aging_date) /* Don't randomise the start-date in the first two years after gamestart to ensure availability * of engines in early starting games. * Note: TTDP uses fixed 1922 */ + SavedRandomSeeds saved_seeds; + SaveRandomSeeds(&saved_seeds); + SetRandomSeed(_settings_game.game_creation.generation_seed ^ + ei->base_intro ^ + e->type ^ + e->GetGRFID()); uint32 r = Random(); + e->intro_date = ei->base_intro <= ConvertYMDToDate(_settings_game.game_creation.starting_year + 2, 0, 1) ? ei->base_intro : (Date)GB(r, 0, 9) + ei->base_intro; if (e->intro_date <= _date) { e->age = (aging_date - e->intro_date) >> 5; @@ -682,6 +689,7 @@ void StartupOneEngine(Engine *e, Date aging_date) e->reliability_spd_dec = ei->decay_speed << 2; + RestoreRandomSeeds(saved_seeds); CalcEngineReliability(e); /* prevent certain engines from ever appearing. */ diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 5ec87be1eb..8098465852 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -590,6 +590,7 @@ public: if (_savegame_sort_dirty) { _savegame_sort_dirty = false; SortSaveGameList(this->fios_items); + this->OnInvalidateData(SLIWD_FILTER_CHANGES); } this->DrawWidgets(); diff --git a/src/fontcache.cpp b/src/fontcache.cpp index 7c1ab0704b..54c83d8185 100644 --- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -174,12 +174,12 @@ uint SpriteFontCache::GetGlyphWidth(GlyphID key) { SpriteID sprite = this->GetUnicodeGlyph(key); if (sprite == 0) sprite = this->GetUnicodeGlyph('?'); - return SpriteExists(sprite) ? GetSprite(sprite, ST_FONT)->width + ScaleGUITrad(this->fs != FS_NORMAL ? 1 : 0) : 0; + return SpriteExists(sprite) ? GetSprite(sprite, ST_FONT)->width + ScaleFontTrad(this->fs != FS_NORMAL ? 1 : 0) : 0; } int SpriteFontCache::GetHeight() const { - return ScaleGUITrad(this->height); + return ScaleFontTrad(this->height); } bool SpriteFontCache::GetDrawGlyphShadow() @@ -286,16 +286,18 @@ void FreeTypeFontCache::SetFontSize(FontSize fs, FT_Face face, int pixels) { if (pixels == 0) { /* Try to determine a good height based on the minimal height recommended by the font. */ - int scaled_height = ScaleGUITrad(_default_font_height[this->fs]); + int scaled_height = ScaleFontTrad(_default_font_height[this->fs]); pixels = scaled_height; TT_Header *head = (TT_Header *)FT_Get_Sfnt_Table(this->face, ft_sfnt_head); if (head != NULL) { /* Font height is minimum height plus the difference between the default * height for this font size and the small size. */ - int diff = scaled_height - ScaleGUITrad(_default_font_height[FS_SMALL]); + int diff = scaled_height - ScaleFontTrad(_default_font_height[FS_SMALL]); pixels = Clamp(min(head->Lowest_Rec_PPEM, 20) + diff, scaled_height, MAX_FONT_SIZE); } + } else { + pixels = ScaleFontTrad(pixels); } this->used_size = pixels; @@ -425,6 +427,9 @@ FreeTypeFontCache::~FreeTypeFontCache() */ void FreeTypeFontCache::ClearFontCache() { + /* Font scaling might have changed, determine font size anew if it was automatically selected. */ + if (this->face != NULL) this->SetFontSize(this->fs, this->face, this->req_size); + if (this->glyph_to_sprite == NULL) return; for (int i = 0; i < 256; i++) { @@ -442,9 +447,6 @@ void FreeTypeFontCache::ClearFontCache() this->glyph_to_sprite = NULL; Layouter::ResetFontCache(this->fs); - - /* GUI scaling might have changed, determine font size anew if it was automatically selected. */ - if (this->face != NULL && this->req_size == 0) this->SetFontSize(this->fs, this->face, this->req_size); } FreeTypeFontCache::GlyphEntry *FreeTypeFontCache::GetGlyphPtr(GlyphID key) diff --git a/src/framerate_gui.cpp b/src/framerate_gui.cpp index 908cf81c0b..060b19a4a1 100644 --- a/src/framerate_gui.cpp +++ b/src/framerate_gui.cpp @@ -13,13 +13,18 @@ #include #include "gfx_func.h" #include "window_gui.h" +#include "window_func.h" #include "table/sprites.h" +#include "string_func.h" #include "strings_func.h" #include "console_func.h" #include "console_type.h" #include "guitimer_func.h" +#include "company_base.h" +#include "ai/ai_info.hpp" #include "widgets/framerate_widget.h" +#include "safeguards.h" /** @@ -183,6 +188,23 @@ namespace { PerformanceData(1), // PFE_ACC_DRAWWORLD PerformanceData(60.0), // PFE_VIDEO PerformanceData(1000.0 * 8192 / 44100), // PFE_SOUND + PerformanceData(1), // PFE_ALLSCRIPTS + PerformanceData(1), // PFE_GAMESCRIPT + PerformanceData(1), // PFE_AI0 ... + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), + PerformanceData(1), // PFE_AI14 }; } @@ -215,6 +237,15 @@ PerformanceMeasurer::PerformanceMeasurer(PerformanceElement elem) /** Finish a cycle of a measured element and store the measurement taken. */ PerformanceMeasurer::~PerformanceMeasurer() { + if (this->elem == PFE_ALLSCRIPTS) { + /* Hack to not record scripts total when no scripts are active */ + bool any_active = _pf_data[PFE_GAMESCRIPT].num_valid > 0; + for (uint e = PFE_AI0; e < PFE_MAX; e++) any_active |= _pf_data[e].num_valid > 0; + if (!any_active) { + PerformanceMeasurer::SetInactive(PFE_ALLSCRIPTS); + return; + } + } _pf_data[this->elem].Add(this->start_time, GetPerformanceTimer()); } @@ -224,11 +255,19 @@ void PerformanceMeasurer::SetExpectedRate(double rate) _pf_data[this->elem].expected_rate = rate; } +/** Mark a performance element as not currently in use. */ +/* static */ void PerformanceMeasurer::SetInactive(PerformanceElement elem) +{ + _pf_data[elem].num_valid = 0; + _pf_data[elem].next_index = 0; + _pf_data[elem].prev_index = 0; +} + /** * Indicate that a cycle of "pause" where no processing occurs. * @param elem The element not currently being processed */ -void PerformanceMeasurer::Paused(PerformanceElement elem) +/* static */ void PerformanceMeasurer::Paused(PerformanceElement elem) { _pf_data[elem].AddPause(GetPerformanceTimer()); } @@ -266,6 +305,44 @@ void PerformanceAccumulator::Reset(PerformanceElement elem) void ShowFrametimeGraphWindow(PerformanceElement elem); +static const PerformanceElement DISPLAY_ORDER_PFE[PFE_MAX] = { + PFE_GAMELOOP, + PFE_GL_ECONOMY, + PFE_GL_TRAINS, + PFE_GL_ROADVEHS, + PFE_GL_SHIPS, + PFE_GL_AIRCRAFT, + PFE_GL_LANDSCAPE, + PFE_ALLSCRIPTS, + PFE_GAMESCRIPT, + PFE_AI0, + PFE_AI1, + PFE_AI2, + PFE_AI3, + PFE_AI4, + PFE_AI5, + PFE_AI6, + PFE_AI7, + PFE_AI8, + PFE_AI9, + PFE_AI10, + PFE_AI11, + PFE_AI12, + PFE_AI13, + PFE_AI14, + PFE_GL_LINKGRAPH, + PFE_DRAWING, + PFE_DRAWWORLD, + PFE_VIDEO, + PFE_SOUND, +}; + +static const char * GetAIName(int ai_index) +{ + if (!Company::IsValidAiID(ai_index)) return ""; + return Company::Get(ai_index)->ai_info->GetName(); +} + /** @hideinitializer */ static const NWidgetPart _framerate_window_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -281,14 +358,20 @@ static const NWidgetPart _framerate_window_widgets[] = { NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_RATE_FACTOR), SetDataTip(STR_FRAMERATE_SPEED_FACTOR, STR_FRAMERATE_SPEED_FACTOR_TOOLTIP), EndContainer(), EndContainer(), - NWidget(WWT_PANEL, COLOUR_GREY), - NWidget(NWID_VERTICAL), SetPadding(6), SetPIP(0, 3, 0), - NWidget(NWID_HORIZONTAL), SetPIP(0, 6, 0), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_NAMES), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_CURRENT), - NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_AVERAGE), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_PANEL, COLOUR_GREY), + NWidget(NWID_VERTICAL), SetPadding(6), SetPIP(0, 3, 0), + NWidget(NWID_HORIZONTAL), SetPIP(0, 6, 0), + NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_NAMES), SetScrollbar(WID_FRW_SCROLLBAR), + NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_CURRENT), SetScrollbar(WID_FRW_SCROLLBAR), + NWidget(WWT_EMPTY, COLOUR_GREY, WID_FRW_TIMES_AVERAGE), SetScrollbar(WID_FRW_SCROLLBAR), + EndContainer(), + NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_INFO_DATA_POINTS), SetDataTip(STR_FRAMERATE_DATA_POINTS, 0x0), EndContainer(), - NWidget(WWT_TEXT, COLOUR_GREY, WID_FRW_INFO_DATA_POINTS), SetDataTip(STR_FRAMERATE_DATA_POINTS, 0x0), + EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_FRW_SCROLLBAR), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), EndContainer(), }; @@ -296,6 +379,8 @@ static const NWidgetPart _framerate_window_widgets[] = { struct FramerateWindow : Window { bool small; GUITimer next_update; + int num_active; + int num_displayed; struct CachedDecimal { StringID strid; @@ -332,14 +417,19 @@ struct FramerateWindow : Window { CachedDecimal times_shortterm[PFE_MAX]; ///< cached short term average times CachedDecimal times_longterm[PFE_MAX]; ///< cached long term average times - static const int VSPACING = 3; ///< space between column heading and values + static const int VSPACING = 3; ///< space between column heading and values + static const int MIN_ELEMENTS = 5; ///< smallest number of elements to display FramerateWindow(WindowDesc *desc, WindowNumber number) : Window(desc) { this->InitNested(number); this->small = this->IsShaded(); this->UpdateData(); + this->num_displayed = this->num_active; this->next_update.SetInterval(100); + + /* Window is always initialised to MIN_ELEMENTS height, resize to contain num_displayed */ + ResizeWindow(this, 0, (max(MIN_ELEMENTS, this->num_displayed) - MIN_ELEMENTS) * FONT_HEIGHT_NORMAL); } virtual void OnRealtimeTick(uint delta_ms) @@ -369,9 +459,19 @@ struct FramerateWindow : Window { this->rate_drawing.SetRate(_pf_data[PFE_DRAWING].GetRate(), _pf_data[PFE_DRAWING].expected_rate); + int new_active = 0; for (PerformanceElement e = PFE_FIRST; e < PFE_MAX; e++) { this->times_shortterm[e].SetTime(_pf_data[e].GetAverageDurationMilliseconds(8), MILLISECONDS_PER_TICK); this->times_longterm[e].SetTime(_pf_data[e].GetAverageDurationMilliseconds(NUM_FRAMERATE_POINTS), MILLISECONDS_PER_TICK); + if (_pf_data[e].num_valid > 0) new_active++; + } + + if (new_active != this->num_active) { + this->num_active = new_active; + Scrollbar *sb = this->GetScrollbar(WID_FRW_SCROLLBAR); + sb->SetCount(this->num_active); + sb->SetCapacity(min(this->num_displayed, this->num_active)); + this->ReInit(); } } @@ -425,11 +525,20 @@ struct FramerateWindow : Window { break; case WID_FRW_TIMES_NAMES: { - int linecount = PFE_MAX - PFE_FIRST; size->width = 0; - size->height = FONT_HEIGHT_NORMAL * (linecount + 1) + VSPACING; - for (int line = 0; line < linecount; line++) { - Dimension line_size = GetStringBoundingBox(STR_FRAMERATE_GAMELOOP + line); + size->height = FONT_HEIGHT_NORMAL + VSPACING + MIN_ELEMENTS * FONT_HEIGHT_NORMAL; + resize->width = 0; + resize->height = FONT_HEIGHT_NORMAL; + for (PerformanceElement e : DISPLAY_ORDER_PFE) { + if (_pf_data[e].num_valid == 0) continue; + Dimension line_size; + if (e < PFE_AI0) { + line_size = GetStringBoundingBox(STR_FRAMERATE_GAMELOOP + e); + } else { + SetDParam(0, e - PFE_AI0 + 1); + SetDParamStr(1, GetAIName(e - PFE_AI0)); + line_size = GetStringBoundingBox(STR_FRAMERATE_AI); + } size->width = max(size->width, line_size.width); } break; @@ -437,13 +546,14 @@ struct FramerateWindow : Window { case WID_FRW_TIMES_CURRENT: case WID_FRW_TIMES_AVERAGE: { - int linecount = PFE_MAX - PFE_FIRST; *size = GetStringBoundingBox(STR_FRAMERATE_CURRENT + (widget - WID_FRW_TIMES_CURRENT)); SetDParam(0, 999999); SetDParam(1, 2); Dimension item_size = GetStringBoundingBox(STR_FRAMERATE_MS_GOOD); size->width = max(size->width, item_size.width); - size->height += FONT_HEIGHT_NORMAL * linecount + VSPACING; + size->height += FONT_HEIGHT_NORMAL * MIN_ELEMENTS + VSPACING; + resize->width = 0; + resize->height = FONT_HEIGHT_NORMAL; break; } } @@ -452,14 +562,23 @@ struct FramerateWindow : Window { /** Render a column of formatted average durations */ void DrawElementTimesColumn(const Rect &r, StringID heading_str, const CachedDecimal *values) const { + const Scrollbar *sb = this->GetScrollbar(WID_FRW_SCROLLBAR); + uint16 skip = sb->GetPosition(); + int drawable = this->num_displayed; int y = r.top; DrawString(r.left, r.right, y, heading_str, TC_FROMSTRING, SA_CENTER, true); y += FONT_HEIGHT_NORMAL + VSPACING; - - for (PerformanceElement e = PFE_FIRST; e < PFE_MAX; e++) { - values[e].InsertDParams(0); - DrawString(r.left, r.right, y, values[e].strid, TC_FROMSTRING, SA_RIGHT); - y += FONT_HEIGHT_NORMAL; + for (PerformanceElement e : DISPLAY_ORDER_PFE) { + if (_pf_data[e].num_valid == 0) continue; + if (skip > 0) { + skip--; + } else { + values[e].InsertDParams(0); + DrawString(r.left, r.right, y, values[e].strid, TC_FROMSTRING, SA_RIGHT); + y += FONT_HEIGHT_NORMAL; + drawable--; + if (drawable == 0) break; + } } } @@ -468,11 +587,26 @@ struct FramerateWindow : Window { switch (widget) { case WID_FRW_TIMES_NAMES: { /* Render a column of titles for performance element names */ - int linecount = PFE_MAX - PFE_FIRST; + const Scrollbar *sb = this->GetScrollbar(WID_FRW_SCROLLBAR); + uint16 skip = sb->GetPosition(); + int drawable = this->num_displayed; int y = r.top + FONT_HEIGHT_NORMAL + VSPACING; // first line contains headings in the value columns - for (int i = 0; i < linecount; i++) { - DrawString(r.left, r.right, y, STR_FRAMERATE_GAMELOOP + i, TC_FROMSTRING, SA_LEFT); - y += FONT_HEIGHT_NORMAL; + for (PerformanceElement e : DISPLAY_ORDER_PFE) { + if (_pf_data[e].num_valid == 0) continue; + if (skip > 0) { + skip--; + } else { + if (e < PFE_AI0) { + DrawString(r.left, r.right, y, STR_FRAMERATE_GAMELOOP + e, TC_FROMSTRING, SA_LEFT); + } else { + SetDParam(0, e - PFE_AI0 + 1); + SetDParamStr(1, GetAIName(e - PFE_AI0)); + DrawString(r.left, r.right, y, STR_FRAMERATE_AI, TC_FROMSTRING, SA_LEFT); + } + y += FONT_HEIGHT_NORMAL; + drawable--; + if (drawable == 0) break; + } } break; } @@ -494,19 +628,34 @@ struct FramerateWindow : Window { case WID_FRW_TIMES_CURRENT: case WID_FRW_TIMES_AVERAGE: { /* Open time graph windows when clicking detail measurement lines */ - int line = this->GetRowFromWidget(pt.y, widget, VSPACING, FONT_HEIGHT_NORMAL); - if (line > 0) { - line -= 1; - ShowFrametimeGraphWindow((PerformanceElement)line); + const Scrollbar *sb = this->GetScrollbar(WID_FRW_SCROLLBAR); + int line = sb->GetScrolledRowFromWidget(pt.y - FONT_HEIGHT_NORMAL - VSPACING, this, widget, VSPACING, FONT_HEIGHT_NORMAL); + if (line != INT_MAX) { + line++; + /* Find the visible line that was clicked */ + for (PerformanceElement e : DISPLAY_ORDER_PFE) { + if (_pf_data[e].num_valid > 0) line--; + if (line == 0) { + ShowFrametimeGraphWindow(e); + break; + } + } } break; } } } + + virtual void OnResize() + { + auto *wid = this->GetWidget(WID_FRW_TIMES_NAMES); + this->num_displayed = (wid->current_y - wid->min_y - VSPACING) / FONT_HEIGHT_NORMAL - 1; // subtract 1 for headings + this->GetScrollbar(WID_FRW_SCROLLBAR)->SetCapacity(this->num_displayed); + } }; static WindowDesc _framerate_display_desc( - WDP_AUTO, "framerate_display", 60, 40, + WDP_AUTO, "framerate_display", 0, 0, WC_FRAMERATE_DISPLAY, WC_NONE, 0, _framerate_window_widgets, lengthof(_framerate_window_widgets) @@ -549,7 +698,13 @@ struct FrametimeGraphWindow : Window { { switch (widget) { case WID_FGW_CAPTION: - SetDParam(0, STR_FRAMETIME_CAPTION_GAMELOOP + this->element); + if (this->element < PFE_AI0) { + SetDParam(0, STR_FRAMETIME_CAPTION_GAMELOOP + this->element); + } else { + SetDParam(0, STR_FRAMETIME_CAPTION_AI); + SetDParam(1, this->element - PFE_AI0 + 1); + SetDParamStr(2, GetAIName(this->element - PFE_AI0)); + } break; } } @@ -829,7 +984,10 @@ void ConPrintFramerate() " Viewport drawing", "Video output", "Sound mixing", + "AI/GS scripts total", + "Game script", }; + char ai_name_buf[128]; static const PerformanceElement rate_elements[] = { PFE_GAMELOOP, PFE_DRAWING, PFE_VIDEO }; @@ -848,8 +1006,15 @@ void ConPrintFramerate() for (PerformanceElement e = PFE_FIRST; e < PFE_MAX; e++) { auto &pf = _pf_data[e]; if (pf.num_valid == 0) continue; + const char *name; + if (e < PFE_AI0) { + name = MEASUREMENT_NAMES[e]; + } else { + seprintf(ai_name_buf, lastof(ai_name_buf), "AI %d %s", e - PFE_AI0 + 1, GetAIName(e - PFE_AI0)), + name = ai_name_buf; + } IConsolePrintF(TC_LIGHT_BLUE, "%s times: %.2fms %.2fms %.2fms", - MEASUREMENT_NAMES[e], + name, pf.GetAverageDurationMilliseconds(count1), pf.GetAverageDurationMilliseconds(count2), pf.GetAverageDurationMilliseconds(count3)); diff --git a/src/framerate_type.h b/src/framerate_type.h index 8df9a279a1..3c54e03078 100644 --- a/src/framerate_type.h +++ b/src/framerate_type.h @@ -60,6 +60,23 @@ enum PerformanceElement { PFE_DRAWWORLD, ///< Time spent drawing world viewports in GUI PFE_VIDEO, ///< Speed of painting drawn video buffer. PFE_SOUND, ///< Speed of mixing audio samples + PFE_ALLSCRIPTS, ///< Sum of all GS/AI scripts + PFE_GAMESCRIPT, ///< Game script execution + PFE_AI0, ///< AI execution for player slot 1 + PFE_AI1, ///< AI execution for player slot 2 + PFE_AI2, ///< AI execution for player slot 3 + PFE_AI3, ///< AI execution for player slot 4 + PFE_AI4, ///< AI execution for player slot 5 + PFE_AI5, ///< AI execution for player slot 6 + PFE_AI6, ///< AI execution for player slot 7 + PFE_AI7, ///< AI execution for player slot 8 + PFE_AI8, ///< AI execution for player slot 9 + PFE_AI9, ///< AI execution for player slot 10 + PFE_AI10, ///< AI execution for player slot 11 + PFE_AI11, ///< AI execution for player slot 12 + PFE_AI12, ///< AI execution for player slot 13 + PFE_AI13, ///< AI execution for player slot 14 + PFE_AI14, ///< AI execution for player slot 15 PFE_MAX, ///< End of enum, must be last. }; DECLARE_POSTFIX_INCREMENT(PerformanceElement) @@ -81,6 +98,7 @@ public: PerformanceMeasurer(PerformanceElement elem); ~PerformanceMeasurer(); void SetExpectedRate(double rate); + static void SetInactive(PerformanceElement elem); static void Paused(PerformanceElement elem); }; diff --git a/src/game/game_core.cpp b/src/game/game_core.cpp index 2f95e26224..10b079bee3 100644 --- a/src/game/game_core.cpp +++ b/src/game/game_core.cpp @@ -15,6 +15,7 @@ #include "../company_func.h" #include "../network/network.h" #include "../window_func.h" +#include "../framerate_type.h" #include "game.hpp" #include "game_scanner.hpp" #include "game_config.hpp" @@ -31,8 +32,16 @@ /* static */ void Game::GameLoop() { - if (_networking && !_network_server) return; - if (Game::instance == NULL) return; + if (_networking && !_network_server) { + PerformanceMeasurer::SetInactive(PFE_GAMESCRIPT); + return; + } + if (Game::instance == NULL) { + PerformanceMeasurer::SetInactive(PFE_GAMESCRIPT); + return; + } + + PerformanceMeasurer framerate(PFE_GAMESCRIPT); Game::frame_counter++; diff --git a/src/game/game_info.cpp b/src/game/game_info.cpp index f8c04608b7..0aa3161740 100644 --- a/src/game/game_info.cpp +++ b/src/game/game_info.cpp @@ -26,7 +26,7 @@ static bool CheckAPIVersion(const char *api_version) { return strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0 || strcmp(api_version, "1.4") == 0 || strcmp(api_version, "1.5") == 0 || strcmp(api_version, "1.6") == 0 || strcmp(api_version, "1.7") == 0 || - strcmp(api_version, "1.8") == 0 || strcmp(api_version, "1.9") == 0; + strcmp(api_version, "1.8") == 0 || strcmp(api_version, "1.9") == 0 || strcmp(api_version, "1.10") == 0; } #if defined(_WIN32) diff --git a/src/gfx.cpp b/src/gfx.cpp index 586bc14ab1..b0c055624a 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -58,6 +58,7 @@ static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, static ReusableBuffer _cursor_backup; ZoomLevelByte _gui_zoom; ///< GUI Zoom level +ZoomLevelByte _font_zoom; ///< Font Zoom level /** * The rect for repaint. @@ -1130,13 +1131,14 @@ TextColour GetContrastColour(uint8 background, uint8 threshold) */ void LoadStringWidthTable(bool monospace) { + ClearFontCache(); + for (FontSize fs = monospace ? FS_MONO : FS_BEGIN; fs < (monospace ? FS_END : FS_MONO); fs++) { for (uint i = 0; i != 224; i++) { _stringwidth_table[fs][i] = GetGlyphWidth(fs, i + 32); } } - ClearFontCache(); ReInitAllWindows(); } diff --git a/src/gfx_layout.h b/src/gfx_layout.h index f6fc3b5c71..94cbac073a 100644 --- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -19,6 +19,7 @@ #include #include #include +#include #ifdef WITH_ICU_LAYOUT #include "layout/ParagraphLayout.h" @@ -35,7 +36,7 @@ struct FontState { FontSize fontsize; ///< Current font size. TextColour cur_colour; ///< Current text colour. - std::stack colour_stack; ///< Stack of colours to assist with colour switching. + std::stack> colour_stack; ///< Stack of colours to assist with colour switching. FontState() : fontsize(FS_END), cur_colour(TC_INVALID) {} FontState(TextColour colour, FontSize fontsize) : fontsize(fontsize), cur_colour(colour) {} diff --git a/src/graph_gui.cpp b/src/graph_gui.cpp index 08b99598fa..39df8ab6e2 100644 --- a/src/graph_gui.cpp +++ b/src/graph_gui.cpp @@ -869,35 +869,26 @@ void ShowCompanyValueGraph() /*****************/ struct PaymentRatesGraphWindow : BaseGraphWindow { - bool first_init; ///< This value is true until the first initialization of the window has finished. + uint line_height; ///< Pixel height of each cargo type row. + Scrollbar *vscroll; ///< Cargo list scrollbar. + PaymentRatesGraphWindow(WindowDesc *desc, WindowNumber window_number) : BaseGraphWindow(desc, WID_CPR_GRAPH, STR_JUST_CURRENCY_SHORT) { - this->first_init = true; this->num_on_x_axis = 20; this->num_vert_lines = 20; this->month = 0xFF; this->x_values_start = 10; this->x_values_increment = 10; + this->CreateNestedTree(); + this->vscroll = this->GetScrollbar(WID_CPR_MATRIX_SCROLLBAR); + this->vscroll->SetCount(_sorted_standard_cargo_specs_size); + /* Initialise the dataset */ this->OnHundredthTick(); - this->InitNested(window_number); - - this->UpdateLoweredWidgets(); - } - - virtual void OnInit() - { - /* UpdateLoweredWidgets needs to be called after a language or NewGRF change, but it can't be called before - * InitNested is done. On the first init these functions are called in the correct order by the constructor. */ - if (!this->first_init) { - /* Initialise the dataset */ - this->OnHundredthTick(); - this->UpdateLoweredWidgets(); - } - this->first_init = false; + this->FinishInitNested(window_number); } void UpdateExcludedData() @@ -912,53 +903,64 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { } } - void UpdateLoweredWidgets() - { - for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) { - this->SetWidgetLoweredState(WID_CPR_CARGO_FIRST + i, !HasBit(this->excluded_data, i)); - } - } - virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) { - if (widget < WID_CPR_CARGO_FIRST) { + if (widget != WID_CPR_MATRIX) { BaseGraphWindow::UpdateWidgetSize(widget, size, padding, fill, resize); return; } - const CargoSpec *cs = _sorted_cargo_specs[widget - WID_CPR_CARGO_FIRST]; - SetDParam(0, cs->name); - Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO); - d.width += 14; // colour field - d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; - d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; - *size = maxdim(d, *size); + const CargoSpec *cs; + FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + SetDParam(0, cs->name); + Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO); + d.width += 14; // colour field + d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT; + d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM; + *size = maxdim(d, *size); + } + + this->line_height = size->height; + size->height = this->line_height * 11; /* Default number of cargo types in most climates. */ + resize->width = 0; + resize->height = this->line_height; } virtual void DrawWidget(const Rect &r, int widget) const { - if (widget < WID_CPR_CARGO_FIRST) { + if (widget != WID_CPR_MATRIX) { BaseGraphWindow::DrawWidget(r, widget); return; } - const CargoSpec *cs = _sorted_cargo_specs[widget - WID_CPR_CARGO_FIRST]; bool rtl = _current_text_dir == TD_RTL; - /* Since the buttons have no text, no images, - * both the text and the coloured box have to be manually painted. - * clk_dif will move one pixel down and one pixel to the right - * when the button is clicked */ - byte clk_dif = this->IsWidgetLowered(widget) ? 1 : 0; int x = r.left + WD_FRAMERECT_LEFT; int y = r.top; - int rect_x = clk_dif + (rtl ? r.right - 12 : r.left + WD_FRAMERECT_LEFT); + int pos = this->vscroll->GetPosition(); + int max = pos + this->vscroll->GetCapacity(); - GfxFillRect(rect_x, y + clk_dif, rect_x + 8, y + 5 + clk_dif, PC_BLACK); - GfxFillRect(rect_x + 1, y + 1 + clk_dif, rect_x + 7, y + 4 + clk_dif, cs->legend_colour); - SetDParam(0, cs->name); - DrawString(rtl ? r.left : x + 14 + clk_dif, (rtl ? r.right - 14 + clk_dif : r.right), y + clk_dif, STR_GRAPH_CARGO_PAYMENT_CARGO); + const CargoSpec *cs; + FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + if (pos-- > 0) continue; + if (--max < 0) break; + + bool lowered = !HasBit(_legend_excluded_cargo, cs->Index()); + + /* Redraw box if lowered */ + if (lowered) DrawFrameRect(r.left, y, r.right, y + this->line_height - 1, COLOUR_ORANGE, lowered ? FR_LOWERED : FR_NONE); + + byte clk_dif = lowered ? 1 : 0; + int rect_x = clk_dif + (rtl ? r.right - 12 : r.left + WD_FRAMERECT_LEFT); + + GfxFillRect(rect_x, y + clk_dif, rect_x + 8, y + 5 + clk_dif, PC_BLACK); + GfxFillRect(rect_x + 1, y + 1 + clk_dif, rect_x + 7, y + 4 + clk_dif, cs->legend_colour); + SetDParam(0, cs->name); + DrawString(rtl ? r.left : x + 14 + clk_dif, (rtl ? r.right - 14 + clk_dif : r.right), y + clk_dif, STR_GRAPH_CARGO_PAYMENT_CARGO); + + y += this->line_height; + } } virtual void OnClick(Point pt, int widget, int click_count) @@ -968,7 +970,6 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { /* Remove all cargoes from the excluded lists. */ _legend_excluded_cargo = 0; this->excluded_data = 0; - this->UpdateLoweredWidgets(); this->SetDirty(); break; @@ -981,23 +982,33 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { SetBit(this->excluded_data, i); i++; } - this->UpdateLoweredWidgets(); this->SetDirty(); break; } - default: - if (widget >= WID_CPR_CARGO_FIRST) { - int i = widget - WID_CPR_CARGO_FIRST; - ToggleBit(_legend_excluded_cargo, _sorted_cargo_specs[i]->Index()); - this->ToggleWidgetLoweredState(widget); + case WID_CPR_MATRIX: { + uint row = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_CPR_MATRIX, 0, this->line_height); + if (row >= this->vscroll->GetCount()) return; + + const CargoSpec *cs; + FOR_ALL_SORTED_STANDARD_CARGOSPECS(cs) { + if (row-- > 0) continue; + + ToggleBit(_legend_excluded_cargo, cs->Index()); this->UpdateExcludedData(); this->SetDirty(); + break; } break; + } } } + virtual void OnResize() + { + this->vscroll->SetCapacityFromWidget(this, WID_CPR_MATRIX); + } + virtual void OnGameTick() { /* Override default OnGameTick */ @@ -1031,23 +1042,6 @@ struct PaymentRatesGraphWindow : BaseGraphWindow { } }; -/** Construct the row containing the digit keys. */ -static NWidgetBase *MakeCargoButtons(int *biggest_index) -{ - NWidgetVertical *ver = new NWidgetVertical; - - for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) { - NWidgetBackground *leaf = new NWidgetBackground(WWT_PANEL, COLOUR_ORANGE, WID_CPR_CARGO_FIRST + i, NULL); - leaf->tool_tip = STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO; - leaf->SetFill(1, 0); - leaf->SetLowered(true); - ver->Add(leaf); - } - *biggest_index = WID_CPR_CARGO_FIRST + _sorted_standard_cargo_specs_size - 1; - return ver; -} - - static const NWidgetPart _nested_cargo_payment_rates_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_GREY), @@ -1065,12 +1059,15 @@ static const NWidgetPart _nested_cargo_payment_rates_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_EMPTY, COLOUR_GREY, WID_CPR_GRAPH), SetMinimalSize(495, 0), SetFill(1, 1), SetResize(1, 1), NWidget(NWID_VERTICAL), - NWidget(NWID_SPACER), SetMinimalSize(0, 24), SetFill(0, 0), SetResize(0, 1), + NWidget(NWID_SPACER), SetMinimalSize(0, 24), SetFill(0, 1), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CPR_ENABLE_CARGOES), SetDataTip(STR_GRAPH_CARGO_ENABLE_ALL, STR_GRAPH_CARGO_TOOLTIP_ENABLE_ALL), SetFill(1, 0), NWidget(WWT_PUSHTXTBTN, COLOUR_ORANGE, WID_CPR_DISABLE_CARGOES), SetDataTip(STR_GRAPH_CARGO_DISABLE_ALL, STR_GRAPH_CARGO_TOOLTIP_DISABLE_ALL), SetFill(1, 0), NWidget(NWID_SPACER), SetMinimalSize(0, 4), - NWidgetFunction(MakeCargoButtons), - NWidget(NWID_SPACER), SetMinimalSize(0, 24), SetFill(0, 1), SetResize(0, 1), + NWidget(NWID_HORIZONTAL), + NWidget(WWT_MATRIX, COLOUR_ORANGE, WID_CPR_MATRIX), SetResize(0, 2), SetMatrixDataTip(1, 0, STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO), SetScrollbar(WID_CPR_MATRIX_SCROLLBAR), + NWidget(NWID_VSCROLLBAR, COLOUR_ORANGE, WID_CPR_MATRIX_SCROLLBAR), + EndContainer(), + NWidget(NWID_SPACER), SetMinimalSize(0, 24), SetFill(0, 1), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(5, 0), SetFill(0, 1), SetResize(0, 1), EndContainer(), diff --git a/src/group_cmd.cpp b/src/group_cmd.cpp index 433bd3d6c8..cb1e19f78b 100644 --- a/src/group_cmd.cpp +++ b/src/group_cmd.cpp @@ -422,17 +422,6 @@ CommandCost CmdDeleteGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 return CommandCost(); } -static bool IsUniqueGroupNameForVehicleType(const char *name, VehicleType type) -{ - const Group *g; - - FOR_ALL_GROUPS(g) { - if (g->name != NULL && g->vehicle_type == type && strcmp(g->name, name) == 0) return false; - } - - return true; -} - /** * Alter a group * @param tile unused @@ -456,7 +445,6 @@ CommandCost CmdAlterGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (!reset) { if (Utf8StringLength(text) >= MAX_LENGTH_GROUP_NAME_CHARS) return CMD_ERROR; - if (!IsUniqueGroupNameForVehicleType(text, g->vehicle_type)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE); } if (flags & DC_EXEC) { @@ -524,7 +512,6 @@ CommandCost CmdCreateGroupFromList(TileIndex tile, DoCommandFlag flags, uint32 p if (!StrEmpty(text)) { if (Utf8StringLength(text) >= MAX_LENGTH_GROUP_NAME_CHARS) return CMD_ERROR; - if (!IsUniqueGroupNameForVehicleType(text, vli.vtype)) return_cmd_error(STR_ERROR_NAME_MUST_BE_UNIQUE); } if (flags & DC_EXEC) { diff --git a/src/landscape.cpp b/src/landscape.cpp index 4ad3df5532..d59bf16a35 100644 --- a/src/landscape.cpp +++ b/src/landscape.cpp @@ -1074,6 +1074,9 @@ static bool MakeLake(TileIndex tile, void *user_data) TileIndex t2 = tile + TileOffsByDiagDir(d); if (IsWaterTile(t2)) { MakeRiver(tile, Random()); + /* Remove desert directly around the river tile. */ + TileIndex t = tile; + CircularTileSearch(&t, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, NULL); return false; } } @@ -1145,7 +1148,7 @@ static void River_FoundEndNode(AyStar *aystar, OpenListNode *current) if (!IsWaterTile(tile)) { MakeRiver(tile, Random()); /* Remove desert directly around the river tile. */ - CircularTileSearch(&tile, 5, RiverModifyDesertZone, NULL); + CircularTileSearch(&tile, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, NULL); } } } @@ -1256,6 +1259,9 @@ static bool FlowRiver(TileIndex spring, TileIndex begin) DistanceManhattan(spring, lakeCenter) > _settings_game.game_creation.min_river_length) { end = lakeCenter; MakeRiver(lakeCenter, Random()); + /* Remove desert directly around the river tile. */ + CircularTileSearch(&lakeCenter, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, NULL); + lakeCenter = end; uint range = RandomRange(8) + 3; CircularTileSearch(&lakeCenter, range, MakeLake, &height); /* Call the search a second time so artefacts from going circular in one direction get (mostly) hidden. */ diff --git a/src/lang/afrikaans.txt b/src/lang/afrikaans.txt index 53f4d59ccf..6fe2f57141 100644 --- a/src/lang/afrikaans.txt +++ b/src/lang/afrikaans.txt @@ -985,6 +985,8 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normaal STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dubbel groote STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad grootte + + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Basis-grafikastel STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Kies die basis-grafikastel stel om te gebruik STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} verlore / korrupte ler{P "" s} diff --git a/src/lang/arabic_egypt.txt b/src/lang/arabic_egypt.txt index f80c37f847..0f0c8787d6 100644 --- a/src/lang/arabic_egypt.txt +++ b/src/lang/arabic_egypt.txt @@ -946,6 +946,8 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :تقريب عا STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :تقريب ×2 STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :تقريب ×4 + + STR_GAME_OPTIONS_BASE_GRF :{BLACK} الواجهة الرسومية الاساسية STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK} اختر مجموعة الواجهة الرسومية STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} ملف مفقود او غير صالح diff --git a/src/lang/basque.txt b/src/lang/basque.txt index b9dc7457ef..4d74e8456b 100644 --- a/src/lang/basque.txt +++ b/src/lang/basque.txt @@ -972,6 +972,8 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normala STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Tamaina doblea STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Tamaina laukoitza + + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Grafiko basea markatu STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Aukeratu erabili beharreko grafiko paketea STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} galdutako/hautsitako artxiboa{P "" k} diff --git a/src/lang/belarusian.txt b/src/lang/belarusian.txt index 01a7d5a479..2fa43b6c8b 100644 --- a/src/lang/belarusian.txt +++ b/src/lang/belarusian.txt @@ -1301,6 +1301,8 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Звычайн STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Падвоены STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Пачацвяроны + + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Набор базавай ґрафікі STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Выбар базавага набору ґрафічных аб'ектаў STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} адсутнічаюч{P ы ых ых}/пашкоджан{P ы ых ых} файл{P "" ы аў} diff --git a/src/lang/brazilian_portuguese.txt b/src/lang/brazilian_portuguese.txt index a727b7f5d9..087b74da84 100644 --- a/src/lang/brazilian_portuguese.txt +++ b/src/lang/brazilian_portuguese.txt @@ -992,6 +992,8 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobro STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quádruplo + + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Conjunto de gráficos base STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selecionar o conjunto de gráficos base para usar STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} arquivo{P "" s} faltando/corrompido{P "" s} diff --git a/src/lang/bulgarian.txt b/src/lang/bulgarian.txt index d5a7343cbd..e07a01c6b2 100644 --- a/src/lang/bulgarian.txt +++ b/src/lang/bulgarian.txt @@ -976,6 +976,8 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Нормалн STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Двукратно STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Четирикратно + + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Базов графичен набор STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Изберете базов графичен набор STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} липсващи/повредени файлове diff --git a/src/lang/catalan.txt b/src/lang/catalan.txt index c7ace968d5..5620075c34 100644 --- a/src/lang/catalan.txt +++ b/src/lang/catalan.txt @@ -190,6 +190,8 @@ STR_COLOUR_ORANGE :{G=Masculin}Tar STR_COLOUR_BROWN :{G=Masculin}Marró STR_COLOUR_GREY :{G=Masculin}Gris STR_COLOUR_WHITE :{G=Masculin}Blanc +STR_COLOUR_RANDOM :Aleatori +STR_COLOUR_DEFAULT :Per defecte # Units used in OpenTTD STR_UNITS_VELOCITY_IMPERIAL :{COMMA}{NBSP}mph @@ -465,6 +467,7 @@ STR_TOOLBAR_SOUND_MUSIC :So/música ############ range for message menu starts STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT :Darrer missatge/notícia STR_NEWS_MENU_MESSAGE_HISTORY_MENU :Historial de missatges +STR_NEWS_MENU_DELETE_ALL_MESSAGES :Esborra tots els missatges ############ range ends here ############ range for about menu starts @@ -816,6 +819,7 @@ STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLAC STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(President) STR_NEWS_NEW_TOWN :{BLACK}{BIG_FONT}{STRING} ha patrocinat la construcció d'una nova població, anomenada {TOWN} +STR_NEWS_NEW_TOWN_UNSPONSORED :{BLACK}{BIG_FONT}S'ha fundat una nova població que es diu {TOWN}! STR_NEWS_INDUSTRY_CONSTRUCTION :{BIG_FONT}{BLACK}No{G u va} {STRING} en construcció prop de {TOWN} STR_NEWS_INDUSTRY_PLANTED :{BIG_FONT}{BLACK}S'està plantant {G un una} {G nou nova} {STRING} prop de {TOWN} @@ -928,6 +932,8 @@ STR_GAME_OPTIONS_CURRENCY_ZAR :Rand sud-afric STR_GAME_OPTIONS_CURRENCY_CUSTOM :Personalitzada STR_GAME_OPTIONS_CURRENCY_GEL :Lari georgià (GEL) STR_GAME_OPTIONS_CURRENCY_IRR :Rial iranià (IRR) +STR_GAME_OPTIONS_CURRENCY_RUB :Ruble rus modern (RUB) +STR_GAME_OPTIONS_CURRENCY_MXN :Peso mexicà (MXN) ############ end of currency region STR_GAME_OPTIONS_ROAD_VEHICLES_FRAME :{BLACK}Vehicles de carretera @@ -990,6 +996,13 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Doble STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quàdruple +STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Mida de la lletra +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Seleccioneu la mida de les fonts de la interfície. + +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Doble +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quàdruple + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Conjunt de gràfics base STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Selecciona el conjunt de gràfics base a utilitzar STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} arxiu{P "" s} absent{P "" s} o corromput{P "" s}. @@ -1257,6 +1270,8 @@ STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}No es po STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE :Manteniment de la infraestructura: {STRING} STR_CONFIG_SETTING_INFRASTRUCTURE_MAINTENANCE_HELPTEXT :Quan està activat, la infraestructura provoca costos de manteniment. El cost creix proporcionalment al tamany de la xarxa de transport, afectant en conseqüència més a les companyies grosses que a les petites +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR :Color inicial de la companyia: {STRING} +STR_CONFIG_SETTING_COMPANY_STARTING_COLOUR_HELPTEXT :Escolliu el color inicial de la vostra companyia. STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :Els aeroports mai caduquen: {STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS_HELPTEXT :Activant aquesta opció fa que cada tipus d'aeroport estigui disponible per sempre després de la seva introducció @@ -1815,6 +1830,7 @@ STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Canvia l STR_CHEAT_SETUP_PROD :{LTBLUE}Activa la modificació dels valors de producció: {ORANGE}{STRING} # Livery window +STR_LIVERY_CAPTION :{WHITE}{COMPANY} - Esquema de colors nou STR_LIVERY_GENERAL_TOOLTIP :{BLACK}Mostra esquemes de colors generals STR_LIVERY_TRAIN_TOOLTIP :{BLACK}Mostra els esquemes de colors dels trens @@ -2074,6 +2090,7 @@ STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Desconne STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Servidor protegit: escriviu-ne la contrasenya STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Companyia protegida: escriviu-ne la contrasenya +STR_NETWORK_COMPANY_LIST_CLIENT_LIST_CAPTION :{WHITE}Llista de clients # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Llista de clients @@ -2371,7 +2388,7 @@ STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Senyal p STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Senyal de ruta (elèctric){}Un senyal de ruta permet entrar més d'un tren dins de la mateixa secció de vies. Cal, però, que sigui capaç de reservar una ruta fins un punt de parada segur sense creuar-se amb cap altre tren. Es pot travessar en el sentit contrari al senyal. STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Senyal de ruta d'un sentit (elèctric){}Un senyal de ruta permet entrar més d'un tren dins de la mateixa secció de vies. Cal, però, que sigui capaç de reservar una ruta fins un punt de parada segur sense creuar-se amb cap altre tren. No es pot travessar en el sentit contrari al senyal. STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Conversió de senyals{}Quan aquest botó està premut, si es clica un senyal existent el converteix al tipus de senyal seleccionat. Ctrl+Clic commuta la variant existent. Maj+Clic mostra el cost estimat de conversió. -STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Espaiat entre senyals +STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Distància entre senyals STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Disminueix l'espai entre senyals consecutives situades automàticament quan s'arrossega el ratolí o es manté premuda la tecla Ctrl. STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_INCREASE_TOOLTIP :{BLACK}Augmenta l'espai entre senyals consecutives situades automàticament quan s'arrossega el ratolí o es manté premuda la tecla Ctrl. @@ -2698,36 +2715,39 @@ STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD # Framerate display window STR_FRAMERATE_CAPTION :{WHITE}Fotogrames per segon STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} (x{DECIMAL}) -STR_FRAMERATE_RATE_GAMELOOP :{WHITE}Velocitat de simulació: {STRING} +STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Velocitat de simulació: {STRING} STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Nombre de tics del joc per segon. -STR_FRAMERATE_RATE_BLITTER :{WHITE}Fotogrames per segon: {STRING} +STR_FRAMERATE_RATE_BLITTER :{BLACK}Fotogrames per segon: {STRING} STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Nombre de fotogrames renderitzats per segon. -STR_FRAMERATE_SPEED_FACTOR :{WHITE}Factor de velocitat actual: x{DECIMAL} +STR_FRAMERATE_SPEED_FACTOR :{BLACK}Factor de velocitat actual: x{DECIMAL} STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Quant ràpid va la partida actual, comparant-ho amb l'estimació de la velocitat normal. STR_FRAMERATE_CURRENT :{WHITE}Actual STR_FRAMERATE_AVERAGE :{WHITE}Mitjana -STR_FRAMERATE_DATA_POINTS :{WHITE}Dades basades en {COMMA} mesures. -STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{WHITE}{NBSP}ms -STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{WHITE}{NBSP}ms -STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{WHITE}{NBSP}ms -STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{WHITE}{NBSP}fps -STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{WHITE}{NBSP}fps -STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{WHITE}{NBSP}fps +STR_FRAMERATE_DATA_POINTS :{BLACK}Dades basades en {COMMA} mesures. +STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL}{NBSP}ms +STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL}{NBSP}ms +STR_FRAMERATE_MS_BAD :{RED}{DECIMAL}{NBSP}ms +STR_FRAMERATE_FPS_GOOD :{LTBLUE}{DECIMAL}{NBSP}fps +STR_FRAMERATE_FPS_WARN :{YELLOW}{DECIMAL}{NBSP}fps +STR_FRAMERATE_FPS_BAD :{RED}{DECIMAL}{NBSP}fps STR_FRAMERATE_GRAPH_MILLISECONDS :{TINY_FONT}{COMMA}{NBSP}ms STR_FRAMERATE_GRAPH_SECONDS :{TINY_FONT}{COMMA}{NBSP}s ############ Leave those lines in this order!! -STR_FRAMERATE_GAMELOOP :{WHITE}Total del bucle: -STR_FRAMERATE_GL_ECONOMY :{WHITE} Tractament de la càrrega: -STR_FRAMERATE_GL_TRAINS :{WHITE} Tics de tren: -STR_FRAMERATE_GL_ROADVEHS :{WHITE} Tics de vehicles de carretera: -STR_FRAMERATE_GL_SHIPS :{WHITE} Tics de vaixell: -STR_FRAMERATE_GL_AIRCRAFT :{WHITE} Tics d'aeronau: -STR_FRAMERATE_GL_LANDSCAPE :{WHITE} Tics del mapa: -STR_FRAMERATE_GL_LINKGRAPH :{WHITE} Retard del graf de distribució: -STR_FRAMERATE_DRAWING :{WHITE}Renderitzat de gràfics: -STR_FRAMERATE_DRAWING_VIEWPORTS :{WHITE} Vistes del mapa: -STR_FRAMERATE_VIDEO :{WHITE}Sortida de vídeo: -STR_FRAMERATE_SOUND :{WHITE}Mescla de so: +STR_FRAMERATE_GAMELOOP :{BLACK}Total del bucle: +STR_FRAMERATE_GL_ECONOMY :{BLACK} Tractament de càrrega: +STR_FRAMERATE_GL_TRAINS :{BLACK} Tics de trens: +STR_FRAMERATE_GL_ROADVEHS :{BLACK} Tics de vehicles de carretera: +STR_FRAMERATE_GL_SHIPS :{BLACK} Tics de vaixells: +STR_FRAMERATE_GL_AIRCRAFT :{BLACK} Tics d'aeronaus: +STR_FRAMERATE_GL_LANDSCAPE :{BLACK} Tics del mapa: +STR_FRAMERATE_GL_LINKGRAPH :{BLACK} Retard del graf de distribució: +STR_FRAMERATE_DRAWING :{BLACK}Renderitzat de gràfics: +STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Vistes del mapa: +STR_FRAMERATE_VIDEO :{BLACK}Sortida de vídeo: +STR_FRAMERATE_SOUND :{BLACK}Mescla de so: +STR_FRAMERATE_ALLSCRIPTS :{BLACK} Total GS/IA: +STR_FRAMERATE_GAMESCRIPT :{BLACK} Script de partida: +STR_FRAMERATE_AI :{BLACK} IA {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Bucle @@ -2742,6 +2762,9 @@ STR_FRAMETIME_CAPTION_DRAWING :Renderitzat de STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Renderitzat de la vista del mapa STR_FRAMETIME_CAPTION_VIDEO :Sortida de vídeo STR_FRAMETIME_CAPTION_SOUND :Mescla de so +STR_FRAMETIME_CAPTION_ALLSCRIPTS :Total de scripts d'IA/GS +STR_FRAMETIME_CAPTION_GAMESCRIPT :Script de partida +STR_FRAMETIME_CAPTION_AI :AI {NUM}: {STRING} ############ End of leave-in-this-order @@ -2767,6 +2790,9 @@ STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Detalls STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}No hi ha informació disponible STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} +STR_SAVELOAD_FILTER_TITLE :{BLACK}Cadena de filtre: +STR_SAVELOAD_OVERWRITE_TITLE :{WHITE}Sobreescriu fitxer +STR_SAVELOAD_OVERWRITE_WARNING :{YELLOW}Esteu segur que voleu sobreescriure el fitxer? STR_SAVELOAD_OSKTITLE :{BLACK}Posa el nom amb què desar la partida actual @@ -2884,7 +2910,12 @@ STR_NEWGRF_SETTINGS_VERSION :{BLACK}Versió: STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}Mín. versió compatible: {SILVER}{NUM} STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5sum: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE :{BLACK}Paleta: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :Per defecte (D) +STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :Per defecte (D) / 32 bpp +STR_NEWGRF_SETTINGS_PALETTE_LEGACY :Antic (W) +STR_NEWGRF_SETTINGS_PALETTE_LEGACY_32BPP :Antic (W) / 32 bpp STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Paràmetres: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_PARAMETER_NONE :Cap STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}No hi ha informació disponible STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}No s'ha trobat cap arxiu coincident @@ -2965,6 +2996,8 @@ STR_NEWGRF_ERROR_READ_BOUNDS :S'ha llegit des STR_NEWGRF_ERROR_GRM_FAILED :Els recursos GRF demanats no estan disponibles (sprite {3:NUM}) STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{1:STRING} ha estat desactivat per {STRING} STR_NEWGRF_ERROR_INVALID_SPRITE_LAYOUT :Format de disposició de sprite no vàlid o desconegut (sprite {3:NUM}). +STR_NEWGRF_ERROR_LIST_PROPERTY_TOO_LONG :Hi ha massa elements a la llista de valors de propietats (sprite {3:NUM}, propietat {4:HEX}) +STR_NEWGRF_ERROR_INDPROD_CALLBACK :«Callback» de producció d'indústria no vàlid (sprite {3:NUM}, «{1:STRING}»). # NewGRF related 'general' warnings STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Alerta! @@ -3090,6 +3123,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Suborna # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Objectius STR_GOALS_SPECTATOR_CAPTION :{WHITE}Objectius globals +STR_GOALS_SPECTATOR :Objectius globals STR_GOALS_GLOBAL_TITLE :{BLACK}Objectius globals: STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- Cap - @@ -3138,6 +3172,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Clica al # Story book window STR_STORY_BOOK_CAPTION :{WHITE}Llibre de Partida de {COMPANY} STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Llibre Global de Partida +STR_STORY_BOOK_SPECTATOR :Llibre de partida global STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Pàgina {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Salteu a una pàgina seleccionant-la en aquesta llista desplegable. @@ -3344,6 +3379,9 @@ STR_INDUSTRY_VIEW_LOCATION_TOOLTIP :{BLACK}Centra l STR_INDUSTRY_VIEW_PRODUCTION_LEVEL :{BLACK}Nivell de producció: {YELLOW}{COMMA}% STR_INDUSTRY_VIEW_INDUSTRY_ANNOUNCED_CLOSURE :{YELLOW}La indústria ha anunciat la seva clausura imminent! +STR_INDUSTRY_VIEW_REQUIRES_N_CARGO :{BLACK}Requereix: {YELLOW}{STRING}{STRING} +STR_INDUSTRY_VIEW_PRODUCES_N_CARGO :{BLACK}Produeix: {YELLOW}{STRING}{STRING} +STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION :, {STRING}{STRING} STR_INDUSTRY_VIEW_REQUIRES :{BLACK}Necessita: STR_INDUSTRY_VIEW_ACCEPT_CARGO :{YELLOW}{STRING}{BLACK}{3:STRING} @@ -3401,6 +3439,7 @@ STR_GROUPS_CLICK_ON_GROUP_FOR_TOOLTIP :{BLACK}Grups - STR_GROUP_CREATE_TOOLTIP :{BLACK}Clica per crear un grup STR_GROUP_DELETE_TOOLTIP :{BLACK}Elimina el grup seleccionat STR_GROUP_RENAME_TOOLTIP :{BLACK}Canvia el nom del grup seleccionat +STR_GROUP_LIVERY_TOOLTIP :{BLACK}Canvia l'aspecte dels vehicles del grup seleccionat. STR_GROUP_REPLACE_PROTECTION_TOOLTIP :{BLACK}Clica per protegir aquest grup de l'autosubstitueix global STR_QUERY_GROUP_DELETE_CAPTION :{WHITE}Esborrar grup @@ -3444,6 +3483,7 @@ STR_PURCHASE_INFO_AIRCRAFT_CAPACITY :{BLACK}Capacita STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT :{BLACK}Vagons Automotrius: {GOLD}+{POWER}{BLACK} Pes: {GOLD}+{WEIGHT_SHORT} STR_PURCHASE_INFO_REFITTABLE_TO :{BLACK}Remodelable a: {GOLD}{STRING} STR_PURCHASE_INFO_ALL_TYPES :Totes les càrregues +STR_PURCHASE_INFO_NONE :Cap STR_PURCHASE_INFO_ALL_BUT :Qualsevol excepte {CARGO_LIST} STR_PURCHASE_INFO_MAX_TE :{BLACK}Esforç de tracció màxim: {GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}Abast: {GOLD}{COMMA} cel·les @@ -3843,6 +3883,7 @@ STR_ORDER_CONDITIONAL_AGE :Antiguitat (any STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Necessita revisió STR_ORDER_CONDITIONAL_UNCONDITIONALLY :Sempre STR_ORDER_CONDITIONAL_REMAINING_LIFETIME :Temps de vida restant (anys) +STR_ORDER_CONDITIONAL_MAX_RELIABILITY :Fiabilitat màxima STR_ORDER_CONDITIONAL_COMPARATOR_TOOLTIP :{BLACK}Com comparar les dades del vehicle al valor donat STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :és igual a diff --git a/src/lang/croatian.txt b/src/lang/croatian.txt index 43f934b68b..3d4b2e2ef8 100644 --- a/src/lang/croatian.txt +++ b/src/lang/croatian.txt @@ -562,6 +562,7 @@ STR_TOOLBAR_SOUND_MUSIC :Zvuk/glazba ############ range for message menu starts STR_NEWS_MENU_LAST_MESSAGE_NEWS_REPORT :Poslijednja poruka/vijest STR_NEWS_MENU_MESSAGE_HISTORY_MENU :Povijest poruka +STR_NEWS_MENU_DELETE_ALL_MESSAGES :Obriši sve poruke ############ range ends here ############ range for about menu starts @@ -1090,6 +1091,13 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normalno STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvostruka veličina STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Četvorostruka veličina +STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Veličina fonta +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Odaberite veličinu fonta za sučelje + +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normalno +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dvostruka veličina +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Četvorostruka veličina + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Osnovni set grafike STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Odaberi osnovni grafički set za igru STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} datotek{P a e a} nedostaj{P e u e}/korumpiran{P a e o} @@ -2177,6 +2185,7 @@ STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Odspoji STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Poslužitelj je zaštićen. Unesite zaporku STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Tvrtka je zaštićena. Unesite zaporku +STR_NETWORK_COMPANY_LIST_CLIENT_LIST_CAPTION :{WHITE}Popis klijenata # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Popis klijenata @@ -2831,6 +2840,9 @@ STR_FRAMERATE_DRAWING :{BLACK}Prikaz g STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Prikazi svijeta: STR_FRAMERATE_VIDEO :{BLACK}Video izlaz: STR_FRAMERATE_SOUND :{BLACK}Miksanje zvukova: +STR_FRAMERATE_ALLSCRIPTS :{BLACK} Ukupni broj GS/AI: +STR_FRAMERATE_GAMESCRIPT :{BLACK} Skripta Igre: +STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Petlja igre @@ -2845,6 +2857,9 @@ STR_FRAMETIME_CAPTION_DRAWING :Prikaz grafike STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Prikazi svijeta STR_FRAMETIME_CAPTION_VIDEO :Video izlaz STR_FRAMETIME_CAPTION_SOUND :Miksanje zvukova +STR_FRAMETIME_CAPTION_ALLSCRIPTS :GS/AI broj skripti +STR_FRAMETIME_CAPTION_GAMESCRIPT :Skripta Igre +STR_FRAMETIME_CAPTION_AI :AI {NUM} {STRING} ############ End of leave-in-this-order @@ -3203,6 +3218,7 @@ STR_LOCAL_AUTHORITY_ACTION_TOOLTIP_BRIBE :{YELLOW}Podmiti # Goal window STR_GOALS_CAPTION :{WHITE}{COMPANY} Ciljevi STR_GOALS_SPECTATOR_CAPTION :{WHITE}Globalni ciljevi +STR_GOALS_SPECTATOR :Globalni ciljevi STR_GOALS_GLOBAL_TITLE :{BLACK}Globalni ciljevi: STR_GOALS_TEXT :{ORANGE}{STRING} STR_GOALS_NONE :{ORANGE}- Nijedan - @@ -3251,6 +3267,7 @@ STR_SUBSIDIES_TOOLTIP_CLICK_ON_SERVICE_TO_CENTER :{BLACK}Klikni n # Story book window STR_STORY_BOOK_CAPTION :{WHITE}{COMPANY} Priča STR_STORY_BOOK_SPECTATOR_CAPTION :{WHITE}Globalna priča +STR_STORY_BOOK_SPECTATOR :Globalna knjiga priča STR_STORY_BOOK_TITLE :{YELLOW}{STRING} STR_STORY_BOOK_GENERIC_PAGE_ITEM :Stranica {NUM} STR_STORY_BOOK_SEL_PAGE_TOOLTIP :{BLACK}Preskoči na specifičnu stranicu odabravši je iz liste. diff --git a/src/lang/czech.txt b/src/lang/czech.txt index 9151daf88d..a3576b5186 100644 --- a/src/lang/czech.txt +++ b/src/lang/czech.txt @@ -1076,6 +1076,8 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normální STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dvojnásobná velikost STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Čtyřnásobná velikost + + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Základní sada grafiky STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Zvol základní sadu grafiky STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} chybějící{P "" "" ch}/poškozen{P ý é ých} soubor{P "" y ů} diff --git a/src/lang/danish.txt b/src/lang/danish.txt index 39a4d5f37a..d5806dbfe6 100644 --- a/src/lang/danish.txt +++ b/src/lang/danish.txt @@ -373,7 +373,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :Afslut ############ range for SE file menu starts ############ range for settings menu starts -STR_SETTINGS_MENU_GAME_OPTIONS :Spilvalg +STR_SETTINGS_MENU_GAME_OPTIONS :Opsætning STR_SETTINGS_MENU_CONFIG_SETTINGS_TREE :Indstillinger STR_SETTINGS_MENU_SCRIPT_SETTINGS :AI/spilscript-indstillinger STR_SETTINGS_MENU_NEWGRF_SETTINGS :NewGRF indstillinger @@ -392,7 +392,7 @@ STR_SETTINGS_MENU_TRANSPARENT_SIGNS :Gennemsigtige s ############ range for file menu starts STR_FILE_MENU_SAVE_GAME :Gem spil -STR_FILE_MENU_LOAD_GAME :Hent spil +STR_FILE_MENU_LOAD_GAME :Fortsæt spil STR_FILE_MENU_QUIT_GAME :Forlad spillet STR_FILE_MENU_SEPARATOR : STR_FILE_MENU_EXIT :Afslut @@ -841,7 +841,7 @@ STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL :{BIG_FONT}{BLAC STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM :{BIG_FONT}{BLACK}Insekter foresager kaos ved {INDUSTRY}!{}Produktionen er faldet med 50% STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_SMOOTH :{BIG_FONT}{BLACK}{STRING}produktionen på {INDUSTRY} sænkes med {COMMA}%! -STR_NEWS_TRAIN_IS_WAITING :{WHITE}{VEHICLE} venter i remisen +STR_NEWS_TRAIN_IS_WAITING :{WHITE}{VEHICLE} afventer i remisen STR_NEWS_ROAD_VEHICLE_IS_WAITING :{WHITE}{VEHICLE} venter på værkstedet STR_NEWS_SHIP_IS_WAITING :{WHITE}{VEHICLE} venter i skibsdokken STR_NEWS_AIRCRAFT_IS_WAITING :{WHITE}{VEHICLE} venter i hangaren @@ -893,7 +893,7 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW :{BLACK}Flyt hov STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Bevæg hovedvisningen til samme sted som dette vindue # Game options window -STR_GAME_OPTIONS_CAPTION :{WHITE}Spilvalg +STR_GAME_OPTIONS_CAPTION :{WHITE}Opsætning STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Valutaenhed STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Valg af valutaenhed @@ -996,6 +996,13 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normal STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dobbelt størrelse STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :Quad (4x) størrelse +STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Skriftstørrelse +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Vælg skriftstørrelsen du ønsker i grænsefladen + +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normal +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dobbelt størrelse +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Quad (4x) størrelse + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Basis-grafiksæt STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Vælg det basis-grafiksæt der skal bruges STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} forsvund{P en ne}/ødelagt{P "" e} fil{P "" er} @@ -1416,8 +1423,8 @@ STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE :Vis ankomst og STR_CONFIG_SETTING_TIMETABLE_SHOW_ARRIVAL_DEPARTURE_HELPTEXT :Vis forventede ankomst-og afgangstider i tidsplaner STR_CONFIG_SETTING_QUICKGOTO :Hurtig oprettelse af køretøjsordrer: {STRING} STR_CONFIG_SETTING_QUICKGOTO_HELPTEXT :Forvælg 'gå-til' når du åbner ordrer vinduet -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Standard skinnetype (efter nyt spil/hentet spil): {STRING} -STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Hvilken sportype der skal vælges efter start eller hentning af et spil. 'første tilgængelige' vælger den ældste type spor, 'sidste tilgængelige' vælger den nyeste form for spor, og 'mest anvendte' vælger den type, der i øjeblikket er mest i brug +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE :Standard sportype (efter nyt spil/indlæst spil): {STRING} +STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_HELPTEXT :Hvilken sportype der skal vælges efter start eller indlæsning af et spil. 'Første tilgængelige' vælger den ældste type spor, 'sidste tilgængelige' vælger den nyeste form for spor, og 'mest anvendte' vælger den type, der i øjeblikket er mest i brug STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_FIRST :Første tilgængelige STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_LAST :Sidste tilgængelige STR_CONFIG_SETTING_DEFAULT_RAIL_TYPE_MOST_USED :Mest anvendte @@ -1743,13 +1750,13 @@ STR_CONFIG_ERROR_SPRITECACHE_TOO_BIG :{WHITE}Allokeri STR_INTRO_CAPTION :{WHITE}OpenTTD {REV} STR_INTRO_NEW_GAME :{BLACK}Nyt spil -STR_INTRO_LOAD_GAME :{BLACK}Hent spil +STR_INTRO_LOAD_GAME :{BLACK}Fortsæt spil STR_INTRO_PLAY_SCENARIO :{BLACK}Spil et scenarie STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Spil højdekort STR_INTRO_SCENARIO_EDITOR :{BLACK}Scenarieeditor STR_INTRO_MULTIPLAYER :{BLACK}Netværksspil -STR_INTRO_GAME_OPTIONS :{BLACK}Spilvalg +STR_INTRO_GAME_OPTIONS :{BLACK}Opsætning STR_INTRO_HIGHSCORE :{BLACK} Topresultater STR_INTRO_CONFIG_SETTINGS_TREE :{BLACK}Indstillinger STR_INTRO_NEWGRF_SETTINGS :{BLACK}NewGRF indstillinger @@ -1758,7 +1765,7 @@ STR_INTRO_SCRIPT_SETTINGS :{BLACK}AI/Spils STR_INTRO_QUIT :{BLACK}Afslut STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start et nyt spil. Ctrl+Klik springer kortindstillingerne over. -STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Hent et gemt spil +STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Fortsæt et gemt spil STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Start et nyt spil med et højdekort som landskab STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Start et nyt spil med et brugerdefineret scenarie STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Lav en brugerdefineret verden/scenarie @@ -1769,7 +1776,7 @@ STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Vælg 's STR_INTRO_TOOLTIP_SUB_TROPICAL_LANDSCAPE :{BLACK}Vælg 'subtropisk' landskab STR_INTRO_TOOLTIP_TOYLAND_LANDSCAPE :{BLACK}Vælg 'legetøjsland' landskab -STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Vis spilvalg +STR_INTRO_TOOLTIP_GAME_OPTIONS :{BLACK}Sæt spillet op STR_INTRO_TOOLTIP_HIGHSCORE :{BLACK}Hvis topscoreliste STR_INTRO_TOOLTIP_CONFIG_SETTINGS_TREE :{BLACK}Skærm indstillinger STR_INTRO_TOOLTIP_NEWGRF_SETTINGS :{BLACK}Vis NewGRF-indstillinger @@ -1876,7 +1883,7 @@ STR_FACE_SIMPLE :{BLACK}Simpel STR_FACE_SIMPLE_TOOLTIP :{BLACK}Simpelt valg af ansigt. STR_FACE_LOAD :{BLACK}Hent STR_FACE_LOAD_TOOLTIP :{BLACK}Hent favoritansigt -STR_FACE_LOAD_DONE :{WHITE}Dit favoritansigt er hentet fra OpenTTD-konfigurationsfilen. +STR_FACE_LOAD_DONE :{WHITE}Dit favoritansigt er indlæst fra OpenTTD konfigurationsfilen. STR_FACE_FACECODE :{BLACK}Spiller ansigtsnr. STR_FACE_FACECODE_TOOLTIP :{BLACK}Vis og/eller indstil spillers ansigtsnummer STR_FACE_FACECODE_CAPTION :{WHITE}Vis og/eller indstil spillers ansigtsnummer @@ -2056,8 +2063,8 @@ STR_NETWORK_GAME_LOBBY_PLAYERS :{SILVER}Spiller STR_NETWORK_GAME_LOBBY_NEW_COMPANY :{BLACK}Nyt selskab STR_NETWORK_GAME_LOBBY_NEW_COMPANY_TOOLTIP :{BLACK}Opret et nyt selskab -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Tilskuer spil -STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Se et spil som tilskuer +STR_NETWORK_GAME_LOBBY_SPECTATE_GAME :{BLACK}Tilskuer +STR_NETWORK_GAME_LOBBY_SPECTATE_GAME_TOOLTIP :{BLACK}Tilslut spillet som tilskuer STR_NETWORK_GAME_LOBBY_JOIN_COMPANY :{BLACK}Tilslut dig selskab STR_NETWORK_GAME_LOBBY_JOIN_COMPANY_TOOLTIP :{BLACK}Hjælp med at bestyrre dette selskab @@ -2143,7 +2150,7 @@ STR_NETWORK_ERROR_SERVER_ERROR :{WHITE}Der opst STR_NETWORK_ERROR_WRONG_REVISION :{WHITE}Revisionen af denne klient passer ikke sammen med serverens revision STR_NETWORK_ERROR_WRONG_PASSWORD :{WHITE}Forkert kodeord STR_NETWORK_ERROR_SERVER_FULL :{WHITE}Serveren er fuld -STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Du har forbud mod at bruge denne server +STR_NETWORK_ERROR_SERVER_BANNED :{WHITE}Du er bandlyst fra denne server STR_NETWORK_ERROR_KICKED :{WHITE}Du blev smidt ud af spillet STR_NETWORK_ERROR_CHEATER :{WHITE}Snyderi er ikke tilladt på denne server STR_NETWORK_ERROR_TOO_MANY_COMMANDS :{WHITE}Du sendte for mange kommandoer til serveren @@ -2339,7 +2346,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Ombyg/op STR_RAIL_NAME_RAILROAD :Jernbane STR_RAIL_NAME_ELRAIL :Elektrisk jernbane STR_RAIL_NAME_MONORAIL :Monorail -STR_RAIL_NAME_MAGLEV :Magnetskinne +STR_RAIL_NAME_MAGLEV :Magnetsvævebane # Rail depot construction window STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Retning af remise @@ -2738,6 +2745,9 @@ STR_FRAMERATE_DRAWING :{BLACK}Grafik-t STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Landskabsvisninger: STR_FRAMERATE_VIDEO :{BLACK}Grafik-output: STR_FRAMERATE_SOUND :{BLACK}Lydmiksning: +STR_FRAMERATE_ALLSCRIPTS :{BLACK} Spilscript/AI total: +STR_FRAMERATE_GAMESCRIPT :{BLACK} Spilscript: +STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Spillogik @@ -2752,17 +2762,20 @@ STR_FRAMETIME_CAPTION_DRAWING :Grafik-tegning STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Tegning af landskabsvisninger STR_FRAMETIME_CAPTION_VIDEO :Grafik-output STR_FRAMETIME_CAPTION_SOUND :Lydmiksning +STR_FRAMETIME_CAPTION_ALLSCRIPTS :Spil/AI script total +STR_FRAMETIME_CAPTION_GAMESCRIPT :Spilscript +STR_FRAMETIME_CAPTION_AI :AI {NUM} {STRING} ############ End of leave-in-this-order # Save/load game/scenario STR_SAVELOAD_SAVE_CAPTION :{WHITE}Gem spil -STR_SAVELOAD_LOAD_CAPTION :{WHITE}Hent spil +STR_SAVELOAD_LOAD_CAPTION :{WHITE}Fortsæt spil STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Gem scenarie STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Hent scenarie STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Hent højdekort STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Gem højdekort -STR_SAVELOAD_HOME_BUTTON :{BLACK}Klik her for at gå til det nuværende standard gemme/hente bibliotek +STR_SAVELOAD_HOME_BUTTON :{BLACK}Klik her for at gå til den nuværende standard gem/indlæs mappe STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} fri STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Liste over drev, biblioteker og gemte spilfiler STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Nuværende gemte spils navn @@ -3243,7 +3256,7 @@ STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Vis alle STR_STATION_VIEW_RENAME_STATION_CAPTION :Omdøb stationen/fragtcentralen STR_STATION_VIEW_CLOSE_AIRPORT :{BLACK}Luk lufthavn -STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Undgå at fly lander i denne lufthavn +STR_STATION_VIEW_CLOSE_AIRPORT_TOOLTIP :{BLACK}Forhindre at fly lander i denne lufthavn # Waypoint/buoy view window STR_WAYPOINT_VIEW_CAPTION :{WHITE}{WAYPOINT} @@ -3444,7 +3457,7 @@ STR_GROUP_OCCUPANCY_VALUE :{NUM}% # Build vehicle window STR_BUY_VEHICLE_TRAIN_RAIL_CAPTION :Nye jernbanekøretøjer -STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nyt elektrisk lokomotiv +STR_BUY_VEHICLE_TRAIN_ELRAIL_CAPTION :Nye elektriske jernbanekøretøjer STR_BUY_VEHICLE_TRAIN_MONORAIL_CAPTION :Nye monorailkøretøjer STR_BUY_VEHICLE_TRAIN_MAGLEV_CAPTION :Nye magnetskinnekøretøjer @@ -3572,7 +3585,7 @@ STR_DEPOT_CLONE_AIRCRAFT :{BLACK}Klon fly STR_DEPOT_CLONE_TRAIN_DEPOT_INFO :{BLACK}Dette vil købe en kopi af toget inklusiv alle vogne. Klik på denne knap og så på et tog indeni eller udenfor remisen. Ctrl-klik vil kopiere ordrer. Shift-klik vil vise prisoverslag. STR_DEPOT_CLONE_ROAD_VEHICLE_DEPOT_INFO :{BLACK}Dette vil købe en kopi af køretøjet. Klik på denne knap og så på et køretøj indeni eller udenfor værkstedet. Ctrl-klik vil dele ordrer. Shift-klik viser anslået pris uden køb STR_DEPOT_CLONE_SHIP_DEPOT_INFO :{BLACK}Dette vil købe en kopi af skibet. Klik på denne knap og så på et skib indeni eller udenfor dokken. Ctrl-klik vil dele ordrer. Shift-klik vil vise prisoverslag. -STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Dette vil købe en kopi af et fly. Klik på denne knap og så på et fly indeni eller udenfor hangaren. Ctrl-klik vil dele ordrer. Shift-klik vil vise prisoverslag. +STR_DEPOT_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Dette vil købe en kopi af et fly. Klik på denne knap og så på et fly indeni eller udenfor hangaren. Ctrl-klik vil dele ordrer. Shift-klik viser estimerede omkostninger uden at indkøbe STR_DEPOT_TRAIN_LOCATION_TOOLTIP :{BLACK}Centrer skærmen over remisens lokalitet. Ctrl+Klik åbner et nyt vindue ved remisens lokalitet. STR_DEPOT_ROAD_VEHICLE_LOCATION_TOOLTIP :{BLACK}Centrer skærmen over værkstedets lokalitet. Ctrl+Klik åbner et nyt vindue ved køretøjsværkstedets lokalitet. @@ -3582,7 +3595,7 @@ STR_DEPOT_AIRCRAFT_LOCATION_TOOLTIP :{BLACK}Centrér STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TOOLTIP :{BLACK}Vis en liste over alle tog med denne remise i ordrelisten STR_DEPOT_VEHICLE_ORDER_LIST_ROAD_VEHICLE_TOOLTIP :{BLACK}Vis liste over alle køretøjer med dette værksted i ordrelisten STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TOOLTIP :{BLACK}Vis liste over alle skibe med denne skibsdok i ordrelisten -STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Vis liste over alle fly med en hangar ved denne lufthavn i ordrelisten +STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TOOLTIP :{BLACK}Hent en liste over alle fly der har hvilken som helst hangar ved denne lufthavn i deres ordrer STR_DEPOT_MASS_STOP_DEPOT_TRAIN_TOOLTIP :{BLACK}Klik for at stoppe alle toge i remisen STR_DEPOT_MASS_STOP_DEPOT_ROAD_VEHICLE_TOOLTIP :{BLACK}Klik for at stoppe alle køretøjer i værkstedet @@ -3604,7 +3617,7 @@ STR_ENGINE_PREVIEW_ROAD_VEHICLE :vejkøretøj STR_ENGINE_PREVIEW_AIRCRAFT :fly STR_ENGINE_PREVIEW_SHIP :skib STR_ENGINE_PREVIEW_MONORAIL_LOCOMOTIVE :monoraillokomotiv -STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magnetskinnelokomotiv +STR_ENGINE_PREVIEW_MAGLEV_LOCOMOTIVE :magnettog 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} @@ -4039,7 +4052,7 @@ STR_DATE_YEAR_TOOLTIP :{BLACK}Vælg å # AI debug window -STR_AI_DEBUG :{WHITE}Computerspiller/Spilscript-debug +STR_AI_DEBUG :{WHITE}KI/Spilscript-debug STR_AI_DEBUG_NAME_AND_VERSION :{BLACK}{STRING} (v{NUM}) STR_AI_DEBUG_NAME_TOOLTIP :{BLACK}Navn på scriptet STR_AI_DEBUG_SETTINGS :{BLACK}Indstillinger @@ -4076,7 +4089,7 @@ STR_AI_CONFIG_MOVE_DOWN :{BLACK}Flyt ned STR_AI_CONFIG_MOVE_DOWN_TOOLTIP :{BLACK}Flyt valgte computerspiller ned i listen STR_AI_CONFIG_GAMESCRIPT :{SILVER}Spilscript -STR_AI_CONFIG_AI :{SILVER}AIer +STR_AI_CONFIG_AI :{SILVER}KI'er STR_AI_CONFIG_CHANGE :{BLACK}Vælg {STRING} STR_AI_CONFIG_CHANGE_NONE :Ingen ændringer @@ -4152,7 +4165,7 @@ STR_ERROR_AUTOSAVE_FAILED :{WHITE}Fejl und STR_ERROR_UNABLE_TO_READ_DRIVE :{BLACK}Kan ikke læse drevet STR_ERROR_GAME_SAVE_FAILED :{WHITE}Fejl under gemning af spil{}{STRING} STR_ERROR_UNABLE_TO_DELETE_FILE :{WHITE}Kan ikke slette fil -STR_ERROR_GAME_LOAD_FAILED :{WHITE}Fejl under hentning af spil{}{STRING} +STR_ERROR_GAME_LOAD_FAILED :{WHITE}Fejl under indlæsning af spil{}{STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Intern fejl: {STRING} STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Ødelagt gemt spil - {STRING} STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Spillet er gemt med en nyere version @@ -4166,12 +4179,12 @@ STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Spillet STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Kortgenerering afbrudt...{}... ingen brugbare lokaliteter til byer STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... der er ingen byer i dette scenarie -STR_ERROR_PNGMAP :{WHITE}Kan ikke hente landskab fra PNG... +STR_ERROR_PNGMAP :{WHITE}Kan ikke indlæse landskab fra PNG... STR_ERROR_PNGMAP_FILE_NOT_FOUND :{WHITE}... filen blev ikke fundet. STR_ERROR_PNGMAP_IMAGE_TYPE :{WHITE}... kan ikke konvertere billedtype. Der skal bruges 8 eller 24-bit PNG. STR_ERROR_PNGMAP_MISC :{WHITE}... noget gik galt. Undskyld (Måske en ødelagt fil) -STR_ERROR_BMPMAP :{WHITE}Kan ikke hente landskab fra BMP... +STR_ERROR_BMPMAP :{WHITE}Kan ikke indlæse landskab fra BMP... STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... kunne ikke konvertere billedtypen. STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... billede er for stort diff --git a/src/lang/dutch.txt b/src/lang/dutch.txt index d6b8d927f4..509417e03e 100644 --- a/src/lang/dutch.txt +++ b/src/lang/dutch.txt @@ -812,7 +812,7 @@ STR_NEWS_COMPANY_MERGER_TITLE :{BIG_FONT}{BLAC STR_NEWS_COMPANY_MERGER_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} is verkocht aan {STRING} voor {CURRENCY_LONG}! STR_NEWS_COMPANY_BANKRUPT_TITLE :{BIG_FONT}{BLACK}Failliet! STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} is gesloten door schuldeisers en alle eigendommen zijn verkocht! -STR_NEWS_COMPANY_LAUNCH_TITLE :{BIG_FONT}{BLACK}Nieuw transportbedrijf opgestart! +STR_NEWS_COMPANY_LAUNCH_TITLE :{BIG_FONT}{BLACK}Nieuw transportbedrijf gestart! STR_NEWS_COMPANY_LAUNCH_DESCRIPTION :{BIG_FONT}{BLACK}{STRING} begint werkzaamheden bij {TOWN}! STR_NEWS_MERGER_TAKEOVER_TITLE :{BIG_FONT}{BLACK}{STRING} is overgenomen door {STRING}! STR_PRESIDENT_NAME_MANAGER :{BLACK}{PRESIDENT_NAME}{}(Directeur) @@ -827,7 +827,7 @@ STR_NEWS_INDUSTRY_CLOSURE_GENERAL :{BIG_FONT}{BLAC STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS :{BIG_FONT}{BLACK}Leveringsproblemen noodzaken {STRING} dreigende sluiting aan te kondigen! STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES :{BIG_FONT}{BLACK}Gebrek aan nabije bomen noodzaakt {STRING} dreigende sluitng aan te kondigen! -STR_NEWS_EURO_INTRODUCTION :{BIG_FONT}{BLACK}Europese Monetaire Unie!{}{}De Euro is geïntroduceerd als de enige munt voor alledaagse transacties in jouw land! +STR_NEWS_EURO_INTRODUCTION :{BIG_FONT}{BLACK}Europese Monetaire Unie!{}{}De euro wordt in jouw land ingevoerd als de enige munt voor gewone transacties! STR_NEWS_BEGIN_OF_RECESSION :{BIG_FONT}{BLACK}Wereldwijde recessie!{}{}Financiële experts vrezen het ergste terwijl economie ineenstort! STR_NEWS_END_OF_RECESSION :{BIG_FONT}{BLACK}Recessie voorbij!{}{}Toenemende handel geeft industrie vertrouwen vanwege sterkere economie! @@ -857,7 +857,7 @@ STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD :{WHITE}{VEHICLE STR_NEWS_VEHICLE_IS_GETTING_VERY_OLD_AND :{WHITE}{VEHICLE} is erg oud aan het worden en moet nodig vervangen worden STR_NEWS_TRAIN_IS_STUCK :{WHITE}{VEHICLE} kan geen route vinden om verder te gaan STR_NEWS_VEHICLE_IS_LOST :{WHITE}{VEHICLE} is verdwaald -STR_NEWS_VEHICLE_IS_UNPROFITABLE :{WHITE}Winst van {VEHICLE} was vorig jaar {CURRENCY_LONG} +STR_NEWS_VEHICLE_IS_UNPROFITABLE :{WHITE}Winst van {VEHICLE} was vorig jaar:{}{CURRENCY_LONG} STR_NEWS_AIRCRAFT_DEST_TOO_FAR :{WHITE}{VEHICLE} kan niet naar de volgende bestemming omdat deze buiten bereik ligt STR_NEWS_ORDER_REFIT_FAILED :{WHITE}{VEHICLE} is gestopt omdat een ombouworder is mislukt @@ -880,7 +880,7 @@ STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIG_FONT}{BLAC STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIG_FONT}{BLACK}Subsidie toegekend aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt volgend jaar driedubbel betaald! STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIG_FONT}{BLACK}Subsidie toegekend aan {STRING}!{}{}{STRING}route van {STRING} naar {STRING} krijgt volgend jaar vierdubbel betaald! -STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Verkeerschaos in {TOWN}!{}{}Wegherstelling betaald door {STRING} zorgt voor 6 maanden van miserie bij weggebruikers! +STR_NEWS_ROAD_REBUILDING :{BIG_FONT}{BLACK}Verkeerschaos in {TOWN}!{}{}Wegreconstructie betaald door {STRING} zorgt voor 6 maanden van misère bij weggebruikers! STR_NEWS_EXCLUSIVE_RIGHTS_TITLE :{BIG_FONT}{BLACK}Transportmonopolie! STR_NEWS_EXCLUSIVE_RIGHTS_DESCRIPTION :{BIG_FONT}{BLACK}Gemeentebestuur van {TOWN} tekent contract met {STRING} voor een jaar exclusieve transportrechten! @@ -995,9 +995,16 @@ STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_NORMAL :Normaal STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_2X_ZOOM :Dubbele grootte STR_GAME_OPTIONS_GUI_ZOOM_DROPDOWN_4X_ZOOM :4x Grootte +STR_GAME_OPTIONS_FONT_ZOOM :{BLACK}Lettergrootte +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP :{BLACK}Hiermee kies je hoe groot de letters op het scherm moeten zijn + +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL :Normaal +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM :Dubbele grootte +STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM :Viervoudige grootte + STR_GAME_OPTIONS_BASE_GRF :{BLACK}Basisset voor graphics STR_GAME_OPTIONS_BASE_GRF_TOOLTIP :{BLACK}Kiest de te gebruiken basisset voor grafische elementen -STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} ontbrekend{P "" e}/corrupt{P "" e} bestand{P "" en} +STR_GAME_OPTIONS_BASE_GRF_STATUS :{RED}{NUM} ontbrekend{P "" e}/beschadigd{P "" e} bestand{P "" en} STR_GAME_OPTIONS_BASE_GRF_DESCRIPTION_TOOLTIP :{BLACK}Aanvullende informatie over de basisset voor graphics STR_GAME_OPTIONS_BASE_SFX :{BLACK}Basisset voor geluidseffecten @@ -1006,7 +1013,7 @@ STR_GAME_OPTIONS_BASE_SFX_DESCRIPTION_TOOLTIP :{BLACK}Aanvulle STR_GAME_OPTIONS_BASE_MUSIC :{BLACK}Basisset voor muziek STR_GAME_OPTIONS_BASE_MUSIC_TOOLTIP :{BLACK}Kiest de te gebruiken basisset voor muziek -STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} corrupt{P "" e} bestand{P "" en} +STR_GAME_OPTIONS_BASE_MUSIC_STATUS :{RED}{NUM} beschadigd{P "" e} bestand{P "" en} STR_GAME_OPTIONS_BASE_MUSIC_DESCRIPTION_TOOLTIP :{BLACK}Aanvullende informatie over the basisset voor muziek STR_ERROR_RESOLUTION_LIST_FAILED :{WHITE}Mislukt om een lijst met ondersteunde resoluties op te halen @@ -1016,27 +1023,27 @@ STR_ERROR_FULLSCREEN_FAILED :{WHITE}Modus vo STR_CURRENCY_WINDOW :{WHITE}Aangepaste valuta STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Wisselkoers: {ORANGE}{CURRENCY_LONG} = £ {COMMA} -STR_CURRENCY_DECREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Verlaag de wisselkoers van jouw munteenheid ten opzicht van de Pond (£) -STR_CURRENCY_INCREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Verhoog de wisselkoers van jouw munteenheid ten opzicht van de Pond (£) -STR_CURRENCY_SET_EXCHANGE_RATE_TOOLTIP :{BLACK}Stel de wisselkoers in van jouw munteenheid ten opzichte van de Pond (£) +STR_CURRENCY_DECREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Verlaag de wisselkoers van jouw munteenheid ten opzichte van het pond (£) +STR_CURRENCY_INCREASE_EXCHANGE_RATE_TOOLTIP :{BLACK}Verhoog de wisselkoers van jouw munteenheid ten opzichte van het pond (£) +STR_CURRENCY_SET_EXCHANGE_RATE_TOOLTIP :{BLACK}Stel de wisselkoers in van jouw munteenheid ten opzichte van het pond (£) STR_CURRENCY_SEPARATOR :{LTBLUE}Scheidingsteken: {ORANGE}{STRING} STR_CURRENCY_SET_CUSTOM_CURRENCY_SEPARATOR_TOOLTIP :{BLACK}Stel het scheidingsteken in voor jouw munteenheid STR_CURRENCY_PREFIX :{LTBLUE}Voorvoegsel: {ORANGE}{STRING} -STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}Stel het voorloopteken in voor jouw munteenheid +STR_CURRENCY_SET_CUSTOM_CURRENCY_PREFIX_TOOLTIP :{BLACK}Stel het voorvoegsel in voor jouw munteenheid STR_CURRENCY_SUFFIX :{LTBLUE}Achtervoegsel: {ORANGE}{STRING} -STR_CURRENCY_SET_CUSTOM_CURRENCY_SUFFIX_TOOLTIP :{BLACK}Stel het eindteken in voor jouw munteenheid +STR_CURRENCY_SET_CUSTOM_CURRENCY_SUFFIX_TOOLTIP :{BLACK}Stel het achtervoegsel in voor jouw munteenheid -STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Overgaan op de Euro: {ORANGE}{NUM} -STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Overgaan op de Euro: {ORANGE}nooit -STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Stel het jaar in waarin de Euro wordt geïntroduceerd -STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Eerder naar de Euro -STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Later naar de Euro +STR_CURRENCY_SWITCH_TO_EURO :{LTBLUE}Overgaan op de euro: {ORANGE}{NUM} +STR_CURRENCY_SWITCH_TO_EURO_NEVER :{LTBLUE}Overgaan op de euro: {ORANGE}nooit +STR_CURRENCY_SET_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Stel het jaar in waarin de euro wordt geïntroduceerd +STR_CURRENCY_DECREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Eerder naar de euro +STR_CURRENCY_INCREASE_CUSTOM_CURRENCY_TO_EURO_TOOLTIP :{BLACK}Later naar de euro STR_CURRENCY_PREVIEW :{LTBLUE}Voorbeeld: {ORANGE}{CURRENCY_LONG} -STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 Pound (£) in jouw munteenheid -STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Verander optie van aangepaste valuta +STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10.000 pond (£) in jouw munteenheid +STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Aangepaste valutaparameters wijzigen STR_DIFFICULTY_LEVEL_SETTING_MAXIMUM_NO_COMPETITORS :{LTBLUE}Maximaal aantal tegenstanders: {ORANGE}{COMMA} @@ -1094,7 +1101,7 @@ STR_CITY_APPROVAL_PERMISSIVE :Toegeeflijk STR_CITY_APPROVAL_TOLERANT :Neutraal STR_CITY_APPROVAL_HOSTILE :Vijandig -STR_WARNING_NO_SUITABLE_AI :{WHITE}Geen bruikbare AIs beschikbaar...{}U kunt diverse AI's downloaden via het 'Online Content' systeem +STR_WARNING_NO_SUITABLE_AI :{WHITE}Geen bruikbare AI's beschikbaar...{}Je kunt diverse AI's downloaden via het 'online-inhoud'-systeem # Settings tree window STR_CONFIG_SETTING_TREE_CAPTION :{WHITE}Instellingen @@ -1104,11 +1111,11 @@ STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Alles in STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(geen uitleg beschikbaar) STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Standaardwaarde: {ORANGE}{STRING} STR_CONFIG_SETTING_TYPE :{LTBLUE}Instellingstype: {ORANGE}{STRING} -STR_CONFIG_SETTING_TYPE_CLIENT :Gebruiker instellingen (niet opgeslagen in bestand; heeft invloed op alle spellen) -STR_CONFIG_SETTING_TYPE_GAME_MENU :Spelinstellingen (opgeslagen in bestand; hebben alleen invloed op nieuw spel) -STR_CONFIG_SETTING_TYPE_GAME_INGAME :Spelinstellingen (opgeslagen in bestand; hebben alleen invloed op huidig spel) -STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Bedrijfsinstellingen (Opgeslagen in bestand; hebben alleen invloed op nieuw spel) -STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Bedrijfsinstellingen (Opgeslagen in bestand; hebben alleen invloed op huidig bedrijf) +STR_CONFIG_SETTING_TYPE_CLIENT :Gebruikersinstellingen (niet opgeslagen in bestand; van invloed op alle spellen) +STR_CONFIG_SETTING_TYPE_GAME_MENU :Spelinstellingen (opgeslagen in bestand; alleen van invloed op nieuwe spellen) +STR_CONFIG_SETTING_TYPE_GAME_INGAME :Spelinstellingen (opgeslagen in bestand; alleen van invloed op huidig spel) +STR_CONFIG_SETTING_TYPE_COMPANY_MENU :Bedrijfsinstellingen (opgeslagen in bestand; alleen van invloed op nieuwe spellen) +STR_CONFIG_SETTING_TYPE_COMPANY_INGAME :Bedrijfsinstellingen (opgeslagen in bestand; alleen van invloed op huidig bedrijf) STR_CONFIG_SETTING_RESTRICT_CATEGORY :{BLACK}Categorie: STR_CONFIG_SETTING_RESTRICT_TYPE :{BLACK}Type: @@ -1121,11 +1128,11 @@ STR_CONFIG_SETTING_RESTRICT_CHANGED_AGAINST_NEW :Instellingen me STR_CONFIG_SETTING_TYPE_DROPDOWN_HELPTEXT :{BLACK}Filter de lijst hieronder op bepaalde instellingstypen STR_CONFIG_SETTING_TYPE_DROPDOWN_ALL :Alle instellingen -STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Gebruikersinstellingen (Niet opgeslagen in bestand; heeft betrekking op alle spellen) -STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Spelinstellingen (Opgeslagen in bestand; hebben alleen betrekking op nieuwe spellen) -STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Spelinstellingen (Opgeslagen in bestand; hebben alleen betrekking op huidig spel) -STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Bedrijfsinstellingen (Opgeslagen in bestand; heeft alleen betrekking op nieuwe spellen) -STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Bedrijfsinstellingen (Opgeslagen in bestand; hebben alleen betrekking op huidig bedrijf) +STR_CONFIG_SETTING_TYPE_DROPDOWN_CLIENT :Gebruikersinstellingen (niet opgeslagen in bestand; van invloed op alle spellen) +STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_MENU :Spelinstellingen (opgeslagen in bestand; alleen van invloed op nieuwe spellen) +STR_CONFIG_SETTING_TYPE_DROPDOWN_GAME_INGAME :Spelinstellingen (opgeslagen in bestand; alleen van invloed op huidig spel) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_MENU :Bedrijfsinstellingen (opgeslagen in bestand; alleen van invloed op nieuwe spellen) +STR_CONFIG_SETTING_TYPE_DROPDOWN_COMPANY_INGAME :Bedrijfsinstellingen (opgeslagen in bestand; alleen van invloed op huidig bedrijf) STR_CONFIG_SETTING_CATEGORY_HIDES :{BLACK}Alle zoekresultaten per instelling weergeven{}{SILVER}Categorie {BLACK}naar {WHITE}{STRING} STR_CONFIG_SETTING_TYPE_HIDES :{BLACK}Alle zoekresultaten per instelling weergeven{}{SILVER}Type {BLACK}naar {WHITE}alle instellingstypen STR_CONFIG_SETTING_CATEGORY_AND_TYPE_HIDES :{BLACK}Alle zoekresultaten per instelling weergeven{}{SILVER}Categorie {BLACK}naar {WHITE}{STRING} {BLACK}en {SILVER}type {BLACK}naar {WHITE}Alle instellingstypen @@ -1247,7 +1254,7 @@ STR_CONFIG_SETTING_ALLOW_GIVE_MONEY_HELPTEXT :Geld overmaken STR_CONFIG_SETTING_FREIGHT_TRAINS :Gewichtsfactor voor vracht om zware treinen te simuleren: {STRING} STR_CONFIG_SETTING_FREIGHT_TRAINS_HELPTEXT :Stelt in hoe vracht treinen beïnvloedt. Een hogere waarde maakt het vervoer van vracht veeleisender voor treinen, met name in heuvels. STR_CONFIG_SETTING_PLANE_SPEED :Snelheidsfactor voor vliegtuigen: {STRING} -STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Stel de relatieve snelheid van de vliegtuigen in vergelijking met andere typen voertuigen, om de hoogte van het inkomen van het vervoer door vliegtuigen te verminderen +STR_CONFIG_SETTING_PLANE_SPEED_HELPTEXT :Stel de relatieve snelheid van de vliegtuigen in vergelijking met andere typen voertuigen in om de inkomsten door luchttransport te verminderen STR_CONFIG_SETTING_PLANE_SPEED_VALUE :1 / {COMMA} STR_CONFIG_SETTING_PLANE_CRASHES :Aantal neerstortende vliegtuigen: {STRING} STR_CONFIG_SETTING_PLANE_CRASHES_HELPTEXT :Bepaalt de kans op neerstorten van een vliegtuig @@ -1373,7 +1380,7 @@ STR_CONFIG_SETTING_SCROLLWHEEL_OFF :Uit STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER :Muiswielsnelheid: {STRING} STR_CONFIG_SETTING_SCROLLWHEEL_MULTIPLIER_HELPTEXT :Gevoeligheid van verplaatsen met de instellen STR_CONFIG_SETTING_OSK_ACTIVATION :Toetsenbord op scherm: {STRING} -STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Selecteer de methode om het toetsenbord op het scherm te openen voor tekst invoeren in editboxes alleen met behulp van het aanwijsapparaat. Dit is bedoeld voor kleine apparaten zonder toetsenbord +STR_CONFIG_SETTING_OSK_ACTIVATION_HELPTEXT :Selecteer de methode om het toetsenbord op het scherm te openen voor tekst invoeren in bewerkingsvensters met alleen het aanwijsapparaat. Dit is bedoeld voor kleine apparaten zonder toetsenbord. STR_CONFIG_SETTING_OSK_ACTIVATION_DISABLED :Uitgeschakeld STR_CONFIG_SETTING_OSK_ACTIVATION_DOUBLE_CLICK :Dubbelklik STR_CONFIG_SETTING_OSK_ACTIVATION_SINGLE_CLICK_FOCUS :Enkel klik (met focus) @@ -1434,7 +1441,7 @@ STR_CONFIG_SETTING_SOUND_NEWS_HELPTEXT :Geluidseffect w STR_CONFIG_SETTING_SOUND_NEW_YEAR :Einde jaar: {STRING} STR_CONFIG_SETTING_SOUND_NEW_YEAR_HELPTEXT :Geluidseffect afspelen bij jaaroverzicht van bedrijf t.o.v. vorig jaar STR_CONFIG_SETTING_SOUND_CONFIRM :Bouw: {STRING} -STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Speel geluidseffecten bij succesvolle constructies of andere acties +STR_CONFIG_SETTING_SOUND_CONFIRM_HELPTEXT :Speel geluidseffecten af wanneer constructies of andere acties zijn gelukt STR_CONFIG_SETTING_SOUND_CLICK :Klikgeluid knoppen: {STRING} STR_CONFIG_SETTING_SOUND_CLICK_HELPTEXT :Piep bij het klikken op knoppen STR_CONFIG_SETTING_SOUND_DISASTER :Rampen/ongelukken: {STRING} @@ -1743,8 +1750,8 @@ STR_INTRO_CAPTION :{WHITE}OpenTTD STR_INTRO_NEW_GAME :{BLACK}Nieuw spel STR_INTRO_LOAD_GAME :{BLACK}Spel laden -STR_INTRO_PLAY_SCENARIO :{BLACK}Speel scenario -STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Speel hoogtekaart +STR_INTRO_PLAY_SCENARIO :{BLACK}Scenario spelen +STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Hoogtekaart spelen STR_INTRO_SCENARIO_EDITOR :{BLACK}Scenario bewerken STR_INTRO_MULTIPLAYER :{BLACK}Netwerkspel @@ -1760,8 +1767,8 @@ STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Start ee STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Een opgeslagen spel laden STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Start een nieuw spel, gebruik een hoogtekaart als landschap STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Start een nieuw spel, gebaseerd op een scenario -STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Maak een eigen spelwereld/scenario -STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Start een multiplayerspel +STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Een eigen spelwereld/scenario maken +STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Een netwerkspel spelen STR_INTRO_TOOLTIP_TEMPERATE :{BLACK}Gematigd klimaat STR_INTRO_TOOLTIP_SUB_ARCTIC_LANDSCAPE :{BLACK}Subarctisch klimaat @@ -1777,7 +1784,7 @@ STR_INTRO_TOOLTIP_SCRIPT_SETTINGS :{BLACK}AI-/spel STR_INTRO_TOOLTIP_QUIT :{BLACK}'OpenTTD' afsluiten STR_INTRO_BASESET :{BLACK}De huidige gekozen set grafische elementen mist {NUM} sprite{P "" s}. Controleer of er updates zijn voor deze basisset. -STR_INTRO_TRANSLATION :{BLACK}Deze vertaling mist {NUM} tekst{P "" en}. Help aub om OpenTTD beter te maken door je al vertaler aan te melden. Zie readme.txt voor details. +STR_INTRO_TRANSLATION :{BLACK}Deze vertaling mist {NUM} tekst{P "" en}. Help alsjeblieft mee om OpenTTD beter te maken door je als vertaler aan te melden. Zie readme.txt voor details. # Quit window STR_QUIT_CAPTION :{WHITE}Afsluiten @@ -1852,7 +1859,7 @@ STR_LIVERY_TRUCK :Vrachtwagen STR_LIVERY_PASSENGER_SHIP :Passagiersschip STR_LIVERY_FREIGHT_SHIP :Vrachtschip STR_LIVERY_HELICOPTER :Helikopter -STR_LIVERY_SMALL_PLANE :Klein Vliegtuig +STR_LIVERY_SMALL_PLANE :Klein vliegtuig STR_LIVERY_LARGE_PLANE :Groot Vliegtuig STR_LIVERY_PASSENGER_TRAM :Passagierstram STR_LIVERY_FREIGHT_TRAM :Vrachttram @@ -1877,15 +1884,15 @@ STR_FACE_LOAD :{BLACK}Laden STR_FACE_LOAD_TOOLTIP :{BLACK}Favoriet gezicht laden STR_FACE_LOAD_DONE :{WHITE}Je favoriete gezicht is geladen uit het OpenTTD-configuratiebestand STR_FACE_FACECODE :{BLACK}Gezichtsnummer -STR_FACE_FACECODE_TOOLTIP :{BLACK}Bekijk en/of bewaar gezichtsnummer van de bedrijfspresident -STR_FACE_FACECODE_CAPTION :{WHITE}Bekijk en/of bewaar huidig gezichtsnummer +STR_FACE_FACECODE_TOOLTIP :{BLACK}Gezichtsnummer van directeur bekijken en/of instellen +STR_FACE_FACECODE_CAPTION :{WHITE}Huidig gezichtsnummer bekijken en/of instellen STR_FACE_FACECODE_SET :{WHITE}Nieuwe gezichtsnummercode is opgeslagen -STR_FACE_FACECODE_ERR :{WHITE}Kon gezichtsnummer niet bewaren - het moet een getal zijn tussen 0 en 4.294.967.295! +STR_FACE_FACECODE_ERR :{WHITE}Kon gezichtsnummer voor directeur niet instellen - moet een getal zijn tussen 0 en 4.294.967.295! STR_FACE_SAVE :{BLACK}Opslaan STR_FACE_SAVE_TOOLTIP :{BLACK}Favoriet gezicht opslaan -STR_FACE_SAVE_DONE :{WHITE}Dit gezicht wordt zal worden opgeslagen als jouw favoriet in het OpenTTD-configuratiebestand +STR_FACE_SAVE_DONE :{WHITE}Dit gezicht wordt in het OpenTTD-configuratiebestand opgeslagen als jouw favoriet STR_FACE_EUROPEAN :{BLACK}Europeaans -STR_FACE_SELECT_EUROPEAN :{BLACK}Selecteer Europeaanse gezichten +STR_FACE_SELECT_EUROPEAN :{BLACK}Selecteer Europese gezichten STR_FACE_AFRICAN :{BLACK}Afrikaans STR_FACE_SELECT_AFRICAN :{BLACK}Selecteer Afrikaanse gezichten STR_FACE_YES :Ja @@ -2065,7 +2072,7 @@ STR_NETWORK_CONNECTING_CAPTION :{WHITE}Verbinde ############ Leave those lines in this order!! STR_NETWORK_CONNECTING_1 :{BLACK}(1/6) Verbinden... -STR_NETWORK_CONNECTING_2 :{BLACK}(2/6) Inloggen... +STR_NETWORK_CONNECTING_2 :{BLACK}(2/6) Verifiëren... STR_NETWORK_CONNECTING_3 :{BLACK}(3/6) Wachten... STR_NETWORK_CONNECTING_4 :{BLACK}(4/6) Kaart downloaden... STR_NETWORK_CONNECTING_5 :{BLACK}(5/6) Gegevens verwerken... @@ -2078,7 +2085,7 @@ STR_NETWORK_CONNECTING_WAITING :{BLACK}{NUM} sp STR_NETWORK_CONNECTING_DOWNLOADING_1 :{BLACK}{BYTES} tot dusver gedownload STR_NETWORK_CONNECTING_DOWNLOADING_2 :{BLACK}{BYTES} / {BYTES} opgehaald -STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Verbreek verbinding +STR_NETWORK_CONNECTION_DISCONNECT :{BLACK}Verbinding verbreken STR_NETWORK_NEED_GAME_PASSWORD_CAPTION :{WHITE}Server is beveiligd. Voer wachtwoord in STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION :{WHITE}Bedrijf is beveiligd. Voer wachtwoord in @@ -2086,15 +2093,16 @@ STR_NETWORK_COMPANY_LIST_CLIENT_LIST_CAPTION :{WHITE}Spelersl # Network company list added strings STR_NETWORK_COMPANY_LIST_CLIENT_LIST :Spelerslijst -STR_NETWORK_COMPANY_LIST_SPECTATE :Kijk toe +STR_NETWORK_COMPANY_LIST_SPECTATE :Toekijken STR_NETWORK_COMPANY_LIST_NEW_COMPANY :Nieuw bedrijf # Network client list -STR_NETWORK_CLIENTLIST_KICK :Gooi uit het spel -STR_NETWORK_CLIENTLIST_BAN :Verban uit het spel -STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL :Praat met iedereen -STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY :Praat met het bedrijf -STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT :Praat met deze persoon +STR_NETWORK_CLIENTLIST_KICK :Uit het spel schoppen +STR_NETWORK_CLIENTLIST_BAN :Verbannen +STR_NETWORK_CLIENTLIST_GIVE_MONEY :Geld geven +STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL :Met iedereen praten +STR_NETWORK_CLIENTLIST_SPEAK_TO_COMPANY :Met bedrijf praten +STR_NETWORK_CLIENTLIST_SPEAK_TO_CLIENT :Privébericht STR_NETWORK_SERVER :Server STR_NETWORK_CLIENT :Speler @@ -2205,34 +2213,34 @@ STR_NETWORK_MESSAGE_SERVER_SHUTDOWN :{WHITE}De serve STR_NETWORK_MESSAGE_SERVER_REBOOT :{WHITE}De server wordt opnieuw gestart...{}Wacht alstublieft... # Content downloading window -STR_CONTENT_TITLE :{WHITE}Download extra content +STR_CONTENT_TITLE :{WHITE}Download extra inhoud STR_CONTENT_TYPE_CAPTION :{BLACK}Type -STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Type van de content +STR_CONTENT_TYPE_CAPTION_TOOLTIP :{BLACK}Type inhoud STR_CONTENT_NAME_CAPTION :{BLACK}Naam -STR_CONTENT_NAME_CAPTION_TOOLTIP :{BLACK}Naam van de content +STR_CONTENT_NAME_CAPTION_TOOLTIP :{BLACK}Naam van de inhoud STR_CONTENT_MATRIX_TOOLTIP :{BLACK}Klik op een regel voor details{}Gebruik het selectievakje om het te selecteren voor download -STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Selecteer alles -STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Markeer alle content om te downloaden -STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Selecteer updates -STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Markeer alle updates voor bestaande content om te downloaden -STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Deselecteer alles -STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Markeer alle content om niet te downloaden -STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Zoek externe websites +STR_CONTENT_SELECT_ALL_CAPTION :{BLACK}Alles selecteren +STR_CONTENT_SELECT_ALL_CAPTION_TOOLTIP :{BLACK}Markeer alle inhoud voor download +STR_CONTENT_SELECT_UPDATES_CAPTION :{BLACK}Updates selecteren +STR_CONTENT_SELECT_UPDATES_CAPTION_TOOLTIP :{BLACK}Markeer alle updates voor bestaande inhoud voor download +STR_CONTENT_UNSELECT_ALL_CAPTION :{BLACK}Niets selecteren +STR_CONTENT_UNSELECT_ALL_CAPTION_TOOLTIP :{BLACK}Alle markeringen van inhoud voor download ongedaan maken +STR_CONTENT_SEARCH_EXTERNAL :{BLACK}Externe websites zoeken STR_CONTENT_SEARCH_EXTERNAL_TOOLTIP :{BLACK}Zoek inhoud niet beschikbaar op de server van OpenTTD op websites die niet gekoppeld zijn aan OpenTTD -STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}U verlaat OpenTTD! -STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}De voorwaarden voor het downloaden van content van externe websites variëren.{}U moet naar de externe sites gaan voor instructies hoe de inhoud te installeren in OpenTTD.{}Wil je doorgaan? +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER_CAPTION :{WHITE}Je verlaat OpenTTD! +STR_CONTENT_SEARCH_EXTERNAL_DISCLAIMER :{WHITE}De voorwaarden voor het downloaden van inhoud van externe websites variëren.{}Ga naar de externe website voor instructies over het installeren van de inhoud in OpenTTD.{}Wil je doorgaan? STR_CONTENT_FILTER_TITLE :{BLACK}Tag-/naamfilter: -STR_CONTENT_OPEN_URL :{BLACK}Bezoek website +STR_CONTENT_OPEN_URL :{BLACK}Website bezoeken STR_CONTENT_OPEN_URL_TOOLTIP :{BLACK}Bezoek de website voor deze inhoud STR_CONTENT_DOWNLOAD_CAPTION :{BLACK}Download -STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Start downloaden van geselecteerde content +STR_CONTENT_DOWNLOAD_CAPTION_TOOLTIP :{BLACK}Start met het downloaden van de geselecteerde inhoud STR_CONTENT_TOTAL_DOWNLOAD_SIZE :{SILVER}Totale downloadgrootte: {WHITE}{BYTES} -STR_CONTENT_DETAIL_TITLE :{SILVER}CONTENT INFO +STR_CONTENT_DETAIL_TITLE :{SILVER}INFO OVER INHOUD STR_CONTENT_DETAIL_SUBTITLE_UNSELECTED :{SILVER}Je hebt ervoor gekozen om dit niet te downloaden STR_CONTENT_DETAIL_SUBTITLE_SELECTED :{SILVER}Je hebt ervoor gekozen om dit te downloaden STR_CONTENT_DETAIL_SUBTITLE_AUTOSELECTED :{SILVER}Deze afhankelijkheid is geselecteerd om te downloaden STR_CONTENT_DETAIL_SUBTITLE_ALREADY_HERE :{SILVER}Dit heb je al -STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Deze content is onbekend en kan niet gedownload worden in OpenTTD +STR_CONTENT_DETAIL_SUBTITLE_DOES_NOT_EXIST :{SILVER}Deze inhoud is onbekend en kan niet worden gedownload in OpenTTD STR_CONTENT_DETAIL_UPDATE :{SILVER}Dit is een vervanging voor een bestaande {STRING} STR_CONTENT_DETAIL_NAME :{SILVER}Naam: {WHITE}{STRING} STR_CONTENT_DETAIL_VERSION :{SILVER}Versie: {WHITE}{STRING} @@ -2243,11 +2251,11 @@ STR_CONTENT_DETAIL_FILESIZE :{SILVER}Downloa STR_CONTENT_DETAIL_SELECTED_BECAUSE_OF :{SILVER}Geselecteerd omdat: {WHITE}{STRING} STR_CONTENT_DETAIL_DEPENDENCIES :{SILVER}Afhankelijkheden: {WHITE}{STRING} STR_CONTENT_DETAIL_TAGS :{SILVER}Tags: {WHITE}{STRING} -STR_CONTENT_NO_ZLIB :{WHITE}OpenTTD is gemaakt zonder "zlib"-ondersteuning... +STR_CONTENT_NO_ZLIB :{WHITE}OpenTTD is gemaakt zonder 'zlib'-ondersteuning... STR_CONTENT_NO_ZLIB_SUB :{WHITE}... niet mogelijk gegevens te downloaden # Order of these is important! -STR_CONTENT_TYPE_BASE_GRAPHICS :Basisgraphics +STR_CONTENT_TYPE_BASE_GRAPHICS :Basis-grafische elementen STR_CONTENT_TYPE_NEWGRF :NewGRF STR_CONTENT_TYPE_AI :AI STR_CONTENT_TYPE_AI_LIBRARY :AI-bibliotheek @@ -2255,26 +2263,26 @@ STR_CONTENT_TYPE_SCENARIO :Scenario STR_CONTENT_TYPE_HEIGHTMAP :Hoogtekaart STR_CONTENT_TYPE_BASE_SOUNDS :Basisgeluiden STR_CONTENT_TYPE_BASE_MUSIC :Basismuziek -STR_CONTENT_TYPE_GAME_SCRIPT :Spel script -STR_CONTENT_TYPE_GS_LIBRARY :GS-bibliotheek +STR_CONTENT_TYPE_GAME_SCRIPT :Spelscript +STR_CONTENT_TYPE_GS_LIBRARY :Spelscript-bibliotheek # Content downloading progress window -STR_CONTENT_DOWNLOAD_TITLE :{WHITE}Content aan het downloaden... -STR_CONTENT_DOWNLOAD_INITIALISE :{WHITE}Bestanden aan het opvragen... -STR_CONTENT_DOWNLOAD_FILE :{WHITE}Aan het downloaden: {STRING} ({NUM} of {NUM}) +STR_CONTENT_DOWNLOAD_TITLE :{WHITE}Inhoud wordt gedownload... +STR_CONTENT_DOWNLOAD_INITIALISE :{WHITE}Bezig met bestanden opvragen... +STR_CONTENT_DOWNLOAD_FILE :{WHITE}Bezig met downloaden: {STRING} ({NUM} van {NUM}) STR_CONTENT_DOWNLOAD_COMPLETE :{WHITE}Downloaden is klaar STR_CONTENT_DOWNLOAD_PROGRESS_SIZE :{WHITE}{BYTES} van {BYTES} gedownload ({NUM} %) # Content downloading error messages -STR_CONTENT_ERROR_COULD_NOT_CONNECT :{WHITE}Kon geen verbinding maken met de contentserver... +STR_CONTENT_ERROR_COULD_NOT_CONNECT :{WHITE}Kon geen verbinding maken met de inhoudserver... STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD :{WHITE}Downloaden mislukt... STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_CONNECTION_LOST :{WHITE}... verbinding verbroken STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE :{WHITE}... bestand niet schrijfbaar STR_CONTENT_ERROR_COULD_NOT_EXTRACT :{WHITE}Kon gedownload bestand niet uitpakken -STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Ontbrekende graphics -STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD heeft graphics nodig om te kunnen werken, maar er konden er geen gevonden worden. Staat u toe dat OpenTTD deze graphics downloadt en installeert? -STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Ja, download de graphics +STR_MISSING_GRAPHICS_SET_CAPTION :{WHITE}Ontbrekende grafische elementen +STR_MISSING_GRAPHICS_SET_MESSAGE :{BLACK}OpenTTD heeft grafische elementen nodig om te kunnen werken, maar deze zijn niet gevonden. Wil je dat OpenTTD deze downloadt en installeert? +STR_MISSING_GRAPHICS_YES_DOWNLOAD :{BLACK}Ja, grafische elementen downloaden STR_MISSING_GRAPHICS_NO_QUIT :{BLACK}Nee, OpenTTD afsluiten # Transparency settings window @@ -2291,10 +2299,10 @@ STR_TRANSPARENT_LOADING_TOOLTIP :{BLACK}Transpar STR_TRANSPARENT_INVISIBLE_TOOLTIP :{BLACK}Maak objecten onzichtbaar in plaats van transparant # Linkgraph legend window -STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Vrachtstroomlegende +STR_LINKGRAPH_LEGEND_CAPTION :{BLACK}Vrachtstroomlegenda STR_LINKGRAPH_LEGEND_ALL :{BLACK}Alle STR_LINKGRAPH_LEGEND_NONE :{BLACK}Geen -STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Selecteer weer te geven bedrijven +STR_LINKGRAPH_LEGEND_SELECT_COMPANIES :{BLACK}Weer te geven bedrijven selecteren STR_LINKGRAPH_LEGEND_COMPANY_TOOLTIP :{BLACK}{STRING}{}{COMPANY} # Linkgraph legend window and linkgraph legend in smallmap @@ -2446,8 +2454,8 @@ STR_WATERWAYS_TOOLBAR_BUILD_DEPOT_TOOLTIP :{BLACK}Dok bouw STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Haven bouwen. Houd Ctrl ingedrukt om samen te voegen met ander station. Shift schakelt tussen bouwen/inschatting van de kosten. STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Boei plaatsen, deze kan gebruikt worden voor extra tussenstops. Shift schakelt tussen bouwen/inschatting van de kosten STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Aquaduct bouwen. Shift schakelt tussen bouwen/inschatting van de kosten. -STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Definieer watergebied.{}Maak een kanaal, tenzij Ctrl wordt vastgehouden op zeeniveau, dan zal de omgeving overstromen -STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Leg rivieren aan +STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Hiermee plaats je watermassa's.{}Maakt een kanaal, tenzij je Ctrl vasthoudt op zeeniveau, dan overstroomt de omgeving. +STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Hiermee maak je rivieren # Ship depot construction window STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Richting van dok @@ -2469,7 +2477,7 @@ STR_STATION_BUILD_AIRPORT_LAYOUT_NAME :{BLACK}Layout { STR_AIRPORT_SMALL :Klein STR_AIRPORT_CITY :Stad STR_AIRPORT_METRO :Grootstedelijk -STR_AIRPORT_INTERNATIONAL :Internationaal vliegveld +STR_AIRPORT_INTERNATIONAL :Internationaal STR_AIRPORT_COMMUTER :Forens STR_AIRPORT_INTERCONTINENTAL :Intercontinentaal STR_AIRPORT_HELIPORT :Heliplatform @@ -2515,8 +2523,8 @@ STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Definiee STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Vergroot de landoppervlakte om te verhogen/verlagen STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Verklein de landoppervlakte om te verhogen/verlagen STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Genereer willekeurig land -STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Maak nieuw scenario aan -STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Verwijder landschap +STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Nieuw scenario maken +STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Landschap verwijderen STR_TERRAFORM_RESET_LANDSCAPE_TOOLTIP :{BLACK}Verwijder alle eigendommen van een bedrijf van de kaart STR_QUERY_RESET_LANDSCAPE_CAPTION :{WHITE}Landschap terugstellen @@ -2527,15 +2535,15 @@ STR_FOUND_TOWN_CAPTION :{WHITE}Stadsont STR_FOUND_TOWN_NEW_TOWN_BUTTON :{BLACK}Nieuwe stad STR_FOUND_TOWN_NEW_TOWN_TOOLTIP :{BLACK}Nieuwe stad stichten. Shift+klik geeft alleen de verwachte kosten. STR_FOUND_TOWN_RANDOM_TOWN_BUTTON :{BLACK}Willekeurige stad -STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Sticht stad op willekeurige locatie +STR_FOUND_TOWN_RANDOM_TOWN_TOOLTIP :{BLACK}Hiermee sticht je een stad op een willekeurige locatie STR_FOUND_TOWN_MANY_RANDOM_TOWNS :{BLACK}Veel willekeurige steden -STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Bedek de kaart met willekeurig geplaatste steden +STR_FOUND_TOWN_RANDOM_TOWNS_TOOLTIP :{BLACK}Verspreid willekeurig geplaatste steden over de kaart STR_FOUND_TOWN_NAME_TITLE :{YELLOW}Plaatsnaam: -STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Geef plaatsnaam op -STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Klik om plaatsnaam in te geven +STR_FOUND_TOWN_NAME_EDITOR_TITLE :{BLACK}Plaatsnaam invoeren +STR_FOUND_TOWN_NAME_EDITOR_HELP :{BLACK}Klik om plaatsnaam in te voeren STR_FOUND_TOWN_NAME_RANDOM_BUTTON :{BLACK}Willekeurige naam -STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Genereer willekeurige nieuwe naam +STR_FOUND_TOWN_NAME_RANDOM_TOOLTIP :{BLACK}Genereer een willekeurige nieuwe naam STR_FOUND_TOWN_INITIAL_SIZE_TITLE :{YELLOW}Stadsgrootte: STR_FOUND_TOWN_INITIAL_SIZE_SMALL_BUTTON :{BLACK}Klein @@ -2652,7 +2660,7 @@ STR_LAI_TOWN_INDUSTRY_DESCRIPTION_UNDER_CONSTRUCTION :{STRING} (in aa STR_LAI_TREE_NAME_TREES :Bomen STR_LAI_TREE_NAME_RAINFOREST :Regenwoud -STR_LAI_TREE_NAME_CACTUS_PLANTS :Cactusplanten +STR_LAI_TREE_NAME_CACTUS_PLANTS :Cactussen STR_LAI_STATION_DESCRIPTION_RAILROAD_STATION :Treinstation STR_LAI_STATION_DESCRIPTION_AIRCRAFT_HANGAR :Hangar @@ -2705,7 +2713,7 @@ STR_ABOUT_VERSION :{BLACK}OpenTTD- STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT} 2002-2019 Het OpenTTD-team # Framerate display window -STR_FRAMERATE_CAPTION :{WHITE}Frame rate +STR_FRAMERATE_CAPTION :{WHITE}Framesnelheid STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x) STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Simulatiesnelheid: {STRING} STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Aantal gesimuleerde speltikken per seconde. @@ -2714,7 +2722,7 @@ STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Aantal v STR_FRAMERATE_SPEED_FACTOR :{BLACK}Huidige spelsnelheidsfactor: {DECIMAL}x STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Hoe snel het spel momenteel draait, vergeleken met de verwachte snelheid bij een normale simulatiesnelheid. STR_FRAMERATE_CURRENT :{WHITE}Huidig -STR_FRAMERATE_AVERAGE :{WHITE}Gemiddelde +STR_FRAMERATE_AVERAGE :{WHITE}Gemiddeld STR_FRAMERATE_DATA_POINTS :{BLACK}Gegevens gebaseerd op {COMMA} metingen STR_FRAMERATE_MS_GOOD :{LTBLUE}{DECIMAL} ms STR_FRAMERATE_MS_WARN :{YELLOW}{DECIMAL} ms @@ -2737,6 +2745,9 @@ STR_FRAMERATE_DRAWING :{WHITE}Grafisch STR_FRAMERATE_DRAWING_VIEWPORTS :{BLACK} Wereldkijkvensters: STR_FRAMERATE_VIDEO :{BLACK}Video-uitvoer: STR_FRAMERATE_SOUND :{BLACK}Geluid mengen: +STR_FRAMERATE_ALLSCRIPTS :{BLACK} Spelscript/AI totaal: +STR_FRAMERATE_GAMESCRIPT :{BLACK} Spelscript: +STR_FRAMERATE_AI :{BLACK} AI {NUM} {STRING} ############ End of leave-in-this-order ############ Leave those lines in this order!! STR_FRAMETIME_CAPTION_GAMELOOP :Gameloop @@ -2747,21 +2758,24 @@ STR_FRAMETIME_CAPTION_GL_SHIPS :Scheepstikken STR_FRAMETIME_CAPTION_GL_AIRCRAFT :Vliegtuigtikken STR_FRAMETIME_CAPTION_GL_LANDSCAPE :Wereldtikken STR_FRAMETIME_CAPTION_GL_LINKGRAPH :Link grafiekvertraging -STR_FRAMETIME_CAPTION_DRAWING :Graphics weergeven +STR_FRAMETIME_CAPTION_DRAWING :Grafische elementen realiseren STR_FRAMETIME_CAPTION_DRAWING_VIEWPORTS :Wereldkijkvenster weergeven STR_FRAMETIME_CAPTION_VIDEO :Video-output STR_FRAMETIME_CAPTION_SOUND :Geluid mixen +STR_FRAMETIME_CAPTION_ALLSCRIPTS :Spel-/AI-schripts totaal +STR_FRAMETIME_CAPTION_GAMESCRIPT :Spelscript +STR_FRAMETIME_CAPTION_AI :AI {NUM} {STRING} ############ End of leave-in-this-order # Save/load game/scenario -STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spel Opslaan -STR_SAVELOAD_LOAD_CAPTION :{WHITE}Spel Laden -STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Scenario Opslaan +STR_SAVELOAD_SAVE_CAPTION :{WHITE}Spel opslaan +STR_SAVELOAD_LOAD_CAPTION :{WHITE}Spel laden +STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Scenario opslaan STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Scenario laden STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Hoogtekaart laden -STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Hoogtekaart Opslaan -STR_SAVELOAD_HOME_BUTTON :{BLACK}Klik hier om naar de standaard bewaar-/laadmap te gaan +STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Hoogtekaart opslaan +STR_SAVELOAD_HOME_BUTTON :{BLACK}Klik hier om naar de standaard-opslagmap te gaan STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} vrij STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lijst van schijven, mappen en opgeslagen spellen STR_SAVELOAD_EDITBOX_TOOLTIP :{BLACK}Huidige gekozen naam voor opgeslagen spel @@ -2769,10 +2783,10 @@ STR_SAVELOAD_DELETE_BUTTON :{BLACK}Verwijde STR_SAVELOAD_DELETE_TOOLTIP :{BLACK}Verwijder het momenteel geselecteerde opgeslagen spel STR_SAVELOAD_SAVE_BUTTON :{BLACK}Opslaan STR_SAVELOAD_SAVE_TOOLTIP :{BLACK}Het huidige spel opslaan onder de gekozen naam -STR_SAVELOAD_LOAD_BUTTON :{BLACK}Laad +STR_SAVELOAD_LOAD_BUTTON :{BLACK}Laden STR_SAVELOAD_LOAD_TOOLTIP :{BLACK}Laad het geselecteerde spel STR_SAVELOAD_LOAD_HEIGHTMAP_TOOLTIP :{BLACK}Laad de geselecteerde hoogtekaart -STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Spel details +STR_SAVELOAD_DETAIL_CAPTION :{BLACK}Speldetails STR_SAVELOAD_DETAIL_NOT_AVAILABLE :{BLACK}Geen informatie beschikbaar STR_SAVELOAD_DETAIL_COMPANY_INDEX :{SILVER}{COMMA}: {WHITE}{STRING} STR_SAVELOAD_DETAIL_GRFSTATUS :{SILVER}NewGRF: {WHITE}{STRING} @@ -2811,7 +2825,7 @@ STR_MAPGEN_NORTHWEST :{BLACK}Noordwes STR_MAPGEN_NORTHEAST :{BLACK}Noordoost STR_MAPGEN_SOUTHEAST :{BLACK}Zuidoost STR_MAPGEN_SOUTHWEST :{BLACK}Zuidwest -STR_MAPGEN_BORDER_FREEFORM :{BLACK}Vrij vormen +STR_MAPGEN_BORDER_FREEFORM :{BLACK}Vrije vorm STR_MAPGEN_BORDER_WATER :{BLACK}Water STR_MAPGEN_BORDER_RANDOM :{BLACK}Willekeurig STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Willekeurig @@ -2823,7 +2837,7 @@ STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Grootte: STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_MAX_HEIGHTLEVEL_QUERY_CAPT :{WHITE}Maximale kaarthoogte wijzigen -STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Verander hoogte van sneeuwgrens +STR_MAPGEN_SNOW_LINE_QUERY_CAPT :{WHITE}Hoogte van sneeuwgrens wijzigen STR_MAPGEN_START_DATE_QUERY_CAPT :{WHITE}Verander startjaar # SE Map generation @@ -2849,7 +2863,7 @@ STR_GENERATION_RIVER_GENERATION :{BLACK}Rivierpl STR_GENERATION_TREE_GENERATION :{BLACK}Bosplaatsing STR_GENERATION_OBJECT_GENERATION :{BLACK}Ontwikkeling van onverplaatsbare objecten STR_GENERATION_CLEARING_TILES :{BLACK}Ontwikkeling van ruig en rotsachtig gebied -STR_GENERATION_SETTINGUP_GAME :{BLACK}Spel aan het configureren +STR_GENERATION_SETTINGUP_GAME :{BLACK}Spel wordt geconfigureerd STR_GENERATION_PREPARING_TILELOOP :{BLACK}Bezig met tile-loop STR_GENERATION_PREPARING_SCRIPT :{BLACK}Script loopt STR_GENERATION_PREPARING_GAME :{BLACK}Voorbereiden spel @@ -2887,14 +2901,14 @@ STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Palet om STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Verander het palet van het geselecteerde NewGRF-bestand.{}Gebruik deze mogelijkheid als de afbeeldingen van dit NewGRF-bestand er paars uit zien in het spel STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Wijzigingen doorvoeren -STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Zoek ontbrekende content online -STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP :{BLACK}Kijk of de ontbrekende content online te vinden is +STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Online naar ontbrekende inhoud zoeken +STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_TOOLTIP :{BLACK}Kijk of de ontbrekende inhoud online te vinden is STR_NEWGRF_SETTINGS_FILENAME :{BLACK}Bestandsnaam: {SILVER}{STRING} STR_NEWGRF_SETTINGS_GRF_ID :{BLACK}GRF-ID: {SILVER}{STRING} STR_NEWGRF_SETTINGS_VERSION :{BLACK}Versie: {SILVER}{NUM} STR_NEWGRF_SETTINGS_MIN_VERSION :{BLACK}Laagste compatibele versie: {SILVER}{NUM} -STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5sum: {SILVER}{STRING} +STR_NEWGRF_SETTINGS_MD5SUM :{BLACK}MD5-controlesom: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE :{BLACK}Palet: {SILVER}{STRING} STR_NEWGRF_SETTINGS_PALETTE_DEFAULT :Standaard (D) STR_NEWGRF_SETTINGS_PALETTE_DEFAULT_32BPP :Standaard (D) / 32 bpp @@ -2912,31 +2926,31 @@ STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Niet compa STR_SAVE_PRESET_CAPTION :{WHITE}Voorkeursinstelling opslaan STR_SAVE_PRESET_LIST_TOOLTIP :{BLACK}Lijst met beschikbare voorkeursinstellingen, Selecteer om deze te kopiëren naar de opslagnaam hieronder. STR_SAVE_PRESET_TITLE :{BLACK}Voer een naam in voor de voorkeursinstelling -STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Huidig gekozen naam voor de preset om op te slaan +STR_SAVE_PRESET_EDITBOX_TOOLTIP :{BLACK}Huidige gekozen naam voor de voorkeursinstelling om op te slaan STR_SAVE_PRESET_CANCEL :{BLACK}Annuleren STR_SAVE_PRESET_CANCEL_TOOLTIP :{BLACK}Voorkeursinstelling niet wijzigen STR_SAVE_PRESET_SAVE :{BLACK}Opslaan -STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Sla de huidige preset op naar de huidig gekozen naam +STR_SAVE_PRESET_SAVE_TOOLTIP :{BLACK}Sla de huidige voorkeursinstelling op onder de huidige gekozen naam # NewGRF parameters window STR_NEWGRF_PARAMETERS_CAPTION :{WHITE}NewGRF-parameters wijzigen STR_NEWGRF_PARAMETERS_CLOSE :{BLACK}Sluiten -STR_NEWGRF_PARAMETERS_RESET :{BLACK}Reset +STR_NEWGRF_PARAMETERS_RESET :{BLACK}Terugstellen STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Zet alle parameters naar de standaardwaarde STR_NEWGRF_PARAMETERS_DEFAULT_NAME :Parameter {NUM} STR_NEWGRF_PARAMETERS_SETTING :{STRING}: {ORANGE}{STRING} STR_NEWGRF_PARAMETERS_NUM_PARAM :{LTBLUE}Aantal parameters: {ORANGE}{NUM} # NewGRF inspect window -STR_NEWGRF_INSPECT_CAPTION :{WHITE}Inspecteer - {STRING} +STR_NEWGRF_INSPECT_CAPTION :{WHITE}Inspecteren - {STRING} STR_NEWGRF_INSPECT_PARENT_BUTTON :{BLACK}Huidig -STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Inspecteer het object van het huidige hoofd bestand +STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Inspecteer het object van het bovenliggende element STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} bij {HEX} STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Object STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_RAIL_TYPE :Spoortype -STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}NewGRF variable 60+x parameter (hexadecimaal) +STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}Parameter 60+x voor NewGRF-variabele (hexadecimaal) # Sprite aligner window STR_SPRITE_ALIGNER_CAPTION :{WHITE}Sprite uitlijnen {COMMA} ({STRING}) @@ -2964,7 +2978,7 @@ STR_NEWGRF_ERROR_MSG_ERROR :{RED}Fout: {SIL STR_NEWGRF_ERROR_MSG_FATAL :{RED}Fatale fout: {SILVER}{STRING} STR_NEWGRF_ERROR_FATAL_POPUP :{WHITE}Een fatale NewGRF-fout is ontstaan:{}{STRING} STR_NEWGRF_ERROR_VERSION_NUMBER :{1:STRING} werkt niet met de TTDPatch-versie die is opgegeven door OpenTTD -STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is voor de {STRING} versie van TTD +STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{1:STRING} is voor versie {STRING} van TTD STR_NEWGRF_ERROR_UNSET_SWITCH :{1:STRING} is ontwikkeld voor {STRING} STR_NEWGRF_ERROR_INVALID_PARAMETER :Ongeldige parameter voor {1:STRING}: parameter {STRING} ({NUM}) STR_NEWGRF_ERROR_LOAD_BEFORE :{1:STRING} moet geladen zijn voor {STRING} @@ -2996,7 +3010,7 @@ STR_NEWGRF_TOO_MANY_NEWGRFS :{WHITE}Kan best STR_NEWGRF_COMPATIBLE_LOAD_WARNING :{WHITE}Compatibele GRF(s) geladen voor ontbrekende bestanden STR_NEWGRF_DISABLED_WARNING :{WHITE}Missend(e) GRF-bestand(en) zijn uitgeschakeld STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}Ontbrekend(e) GRF-bestand(en) -STR_NEWGRF_UNPAUSE_WARNING :{WHITE}Het spel vervolgen kan OpenTTD laten vastlopen. Rapporteer geen bugs als het spel vastloopt.{}Weet je zeker dat je het spel wilt vervolgen? +STR_NEWGRF_UNPAUSE_WARNING :{WHITE}Het spel vervolgen kan OpenTTD laten vastlopen. Rapporteer geen fouten als het spel nogmaals vastloopt.{}Weet je zeker dat je het spel wilt vervolgen? # NewGRF status STR_NEWGRF_LIST_NONE :Geen @@ -3028,7 +3042,7 @@ STR_INVALID_VEHICLE :cached_links.clear(); this->cached_stations.clear(); + this->last_update_number = GetWindowUpdateNumber(); } if (this->company_mask == 0) return; @@ -344,6 +345,10 @@ void LinkGraphOverlay::RefreshDrawCache() */ void LinkGraphOverlay::Draw(const DrawPixelInfo *dpi) { + if (this->dirty) { + this->RebuildCache(); + this->dirty = false; + } if (this->last_update_number != GetWindowUpdateNumber()) { this->last_update_number = GetWindowUpdateNumber(); this->RefreshDrawCache(); diff --git a/src/linkgraph/linkgraph_gui.h b/src/linkgraph/linkgraph_gui.h index f213a3245e..c6bda77284 100644 --- a/src/linkgraph/linkgraph_gui.h +++ b/src/linkgraph/linkgraph_gui.h @@ -75,6 +75,9 @@ public: void SetCargoMask(CargoTypes cargo_mask); void SetCompanyMask(uint32 company_mask); + /** Mark the linkgraph dirty to be rebuilt next time Draw() is called. */ + void SetDirty() { this->dirty = true; } + /** Get a bitmask of the currently shown cargoes. */ CargoTypes GetCargoMask() { return this->cargo_mask; } @@ -90,6 +93,7 @@ protected: StationSupplyList cached_stations; ///< Cache for stations to be drawn. Rect cached_region; ///< Region covered by cached_links and cached_stations. uint scale; ///< Width of link lines. + bool dirty; ///< Set if overlay should be rebuilt. uint64 last_update_number = 0; ///< Last window update number Point GetStationMiddle(const Station *st) const; diff --git a/src/main_gui.cpp b/src/main_gui.cpp index 6963a8ef2d..bb236a9520 100644 --- a/src/main_gui.cpp +++ b/src/main_gui.cpp @@ -244,7 +244,7 @@ struct MainWindow : Window return; } - this->viewport->overlay->RebuildCache(); + this->viewport->overlay->SetDirty(); this->GetWidget(WID_M_VIEWPORT)->SetDirty(this); } diff --git a/src/network/network_client.cpp b/src/network/network_client.cpp index 75af11d89b..992cb5c38e 100644 --- a/src/network/network_client.cpp +++ b/src/network/network_client.cpp @@ -126,6 +126,7 @@ struct PacketReader : LoadFilter { void ClientNetworkEmergencySave() { if (!_settings_client.gui.autosave_on_network_disconnect) return; + if (!_networking) return; const char *filename = "netsave.sav"; DEBUG(net, 0, "Client: Performing emergency save (%s)", filename); @@ -215,6 +216,8 @@ void ClientNetworkGameSocketHandler::ClientError(NetworkRecvStatus res) SendError(errorno); } + ClientNetworkEmergencySave(); + _switch_mode = SM_MENU; this->CloseConnection(res); _networking = false; @@ -1181,7 +1184,6 @@ void ClientNetworkGameSocketHandler::CheckConnection() if (lag > 20) { this->NetworkGameSocketHandler::CloseConnection(); ShowErrorMessage(STR_NETWORK_ERROR_LOSTCONNECTION, INVALID_STRING_ID, WL_CRITICAL); - ClientNetworkEmergencySave(); return; } diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 111a572bcf..ae879af71a 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -5919,7 +5919,6 @@ static void GraphicsNew(ByteReader *buf) * B graphics-type What set of graphics the sprites define. * E num-sprites How many sprites are in this set? * V other data Graphics type specific data. Currently unused. */ - /* TODO */ uint8 type = buf->ReadByte(); uint16 num = buf->ReadExtendedByte(); @@ -6335,7 +6334,6 @@ static void SkipIf(ByteReader *buf) * B condition-type * V value * B num-sprites */ - /* TODO: More params. More condition types. */ uint32 cond_val = 0; uint32 mask = 0; bool result; @@ -7021,12 +7019,6 @@ static void ParamSet(ByteReader *buf) src2 = (src2 == 0xFF) ? data : GetParamVal(src2, NULL); } - /* TODO: You can access the parameters of another GRF file by using - * source2=FE, source1=the other GRF's parameter number and data=GRF - * ID. This is only valid with operation 00 (set). If the GRF ID - * cannot be found, a value of 0 is used for the parameter value - * instead. */ - uint32 res; switch (oper) { case 0x00: @@ -7127,13 +7119,13 @@ static void ParamSet(ByteReader *buf) break; } - /* @todo implement */ - case 0x93: // Tile refresh offset to left + /* not implemented */ + case 0x93: // Tile refresh offset to left -- Intended to allow support for larger sprites, not necessary for OTTD case 0x94: // Tile refresh offset to right case 0x95: // Tile refresh offset upwards case 0x96: // Tile refresh offset downwards - case 0x97: // Snow line height - case 0x99: // Global ID offset + case 0x97: // Snow line height -- Better supported by feature 8 property 10h (snow line table) TODO: implement by filling the entire snow line table with the given value + case 0x99: // Global ID offset -- Not necessary since IDs are remapped automatically grfmsg(7, "ParamSet: Skipping unimplemented target 0x%02X", target); break; @@ -8798,7 +8790,6 @@ static void ResetNewGRFErrors() /** * Reset all NewGRF loaded data - * TODO */ void ResetNewGRFData() { diff --git a/src/openttd.cpp b/src/openttd.cpp index 40f7dd1aa4..41d5434283 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1605,8 +1605,11 @@ void StateGameLoop() BasePersistentStorageArray::SwitchMode(PSM_LEAVE_GAMELOOP); #ifndef DEBUG_DUMP_COMMANDS - AI::GameLoop(); - Game::GameLoop(); + { + PerformanceMeasurer framerate(PFE_ALLSCRIPTS); + AI::GameLoop(); + Game::GameLoop(); + } #endif UpdateLandscapingLimits(); diff --git a/src/order_backup.cpp b/src/order_backup.cpp index 4d0a3f6d64..c144e100af 100644 --- a/src/order_backup.cpp +++ b/src/order_backup.cpp @@ -257,15 +257,18 @@ CommandCost CmdClearOrderBackup(TileIndex tile, DoCommandFlag flags, uint32 p1, * Removes an order from all vehicles. Triggers when, say, a station is removed. * @param type The type of the order (OT_GOTO_[STATION|DEPOT|WAYPOINT]). * @param destination The destination. Can be a StationID, DepotID or WaypointID. + * @param hangar Only used for airports in the destination. + * When false, remove airport and hangar orders. + * When true, remove either airport or hangar order. */ -/* static */ void OrderBackup::RemoveOrder(OrderType type, DestinationID destination) +/* static */ void OrderBackup::RemoveOrder(OrderType type, DestinationID destination, bool hangar) { OrderBackup *ob; FOR_ALL_ORDER_BACKUPS(ob) { for (Order *order = ob->orders; order != NULL; order = order->next) { OrderType ot = order->GetType(); if (ot == OT_GOTO_DEPOT && (order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0) continue; - if (ot == OT_IMPLICIT || (IsHangarTile(ob->tile) && ot == OT_GOTO_DEPOT)) ot = OT_GOTO_STATION; + if (ot == OT_IMPLICIT || (IsHangarTile(ob->tile) && ot == OT_GOTO_DEPOT && !hangar)) ot = OT_GOTO_STATION; if (ot == type && order->GetDestination() == destination) { /* Remove the order backup! If a station/depot gets removed, we can't/shouldn't restore those broken orders. */ delete ob; diff --git a/src/order_backup.h b/src/order_backup.h index 59404d5beb..c56bc0ecc6 100644 --- a/src/order_backup.h +++ b/src/order_backup.h @@ -63,7 +63,7 @@ public: static void ClearGroup(GroupID group); static void ClearVehicle(const Vehicle *v); - static void RemoveOrder(OrderType type, DestinationID destination); + static void RemoveOrder(OrderType type, DestinationID destination, bool hangar); }; /** diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 4255b3a1d8..80979ca6d9 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -2284,8 +2284,11 @@ void CheckOrders(const Vehicle *v) * Removes an order from all vehicles. Triggers when, say, a station is removed. * @param type The type of the order (OT_GOTO_[STATION|DEPOT|WAYPOINT]). * @param destination The destination. Can be a StationID, DepotID or WaypointID. + * @param hangar Only used for airports in the destination. + * When false, remove airport and hangar orders. + * When true, remove either airport or hangar order. */ -void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination) +void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, bool hangar) { Vehicle *v; @@ -2296,7 +2299,7 @@ void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination) /* Go through all vehicles */ FOR_ALL_VEHICLES(v) { Order *order = &v->current_order; - if ((v->type == VEH_AIRCRAFT && order->IsType(OT_GOTO_DEPOT) ? OT_GOTO_STATION : order->GetType()) == type && + if ((v->type == VEH_AIRCRAFT && order->IsType(OT_GOTO_DEPOT) && !hangar ? OT_GOTO_STATION : order->GetType()) == type && v->current_order.GetDestination() == destination) { order->MakeDummy(); SetWindowDirty(WC_VEHICLE_VIEW, v->index); @@ -2308,12 +2311,12 @@ void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination) RemoveVehicleOrdersIf(v, [&](const Order *o) { OrderType ot = o->GetType(); if (ot == OT_GOTO_DEPOT && (o->GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0) return false; - if (ot == OT_IMPLICIT || (v->type == VEH_AIRCRAFT && ot == OT_GOTO_DEPOT)) ot = OT_GOTO_STATION; + if (ot == OT_IMPLICIT || (v->type == VEH_AIRCRAFT && ot == OT_GOTO_DEPOT && !hangar)) ot = OT_GOTO_STATION; return (ot == type && o->GetDestination() == destination); }); } - OrderBackup::RemoveOrder(type, destination); + OrderBackup::RemoveOrder(type, destination, hangar); } /** diff --git a/src/order_func.h b/src/order_func.h index 54977181ab..df99394282 100644 --- a/src/order_func.h +++ b/src/order_func.h @@ -17,7 +17,7 @@ #include "company_type.h" /* Functions */ -void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination); +void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, bool hangar = false); void InvalidateVehicleOrder(const Vehicle *v, int data); void CheckOrders(const Vehicle*); void DeleteVehicleOrders(Vehicle *v, bool keep_orderlist = false, bool reset_order_indices = true); diff --git a/src/os/windows/ottdres.rc.in b/src/os/windows/ottdres.rc.in index 76ccd63369..9a54b88ae0 100644 --- a/src/os/windows/ottdres.rc.in +++ b/src/os/windows/ottdres.rc.in @@ -79,8 +79,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,9,0,!!ISODATE!! - PRODUCTVERSION 1,9,0,!!ISODATE!! + FILEVERSION 1,10,0,!!ISODATE!! + PRODUCTVERSION 1,10,0,!!ISODATE!! FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L diff --git a/src/pathfinder/follow_track.hpp b/src/pathfinder/follow_track.hpp index 9c6815da4c..6f4f305336 100644 --- a/src/pathfinder/follow_track.hpp +++ b/src/pathfinder/follow_track.hpp @@ -496,8 +496,6 @@ typedef CFollowTrackT CFollowTrackWater; typedef CFollowTrackT CFollowTrackRoad; typedef CFollowTrackT CFollowTrackRail; -typedef CFollowTrackT CFollowTrackWaterNo90; -typedef CFollowTrackT CFollowTrackRoadNo90; typedef CFollowTrackT CFollowTrackRailNo90; typedef CFollowTrackT CFollowTrackFreeRail; diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp index 6e25edc29f..3480f430e0 100644 --- a/src/pathfinder/npf/npf.cpp +++ b/src/pathfinder/npf/npf.cpp @@ -843,7 +843,7 @@ static TrackdirBits GetDriveableTrackdirBits(TileIndex dst_tile, Trackdir src_tr trackdirbits &= TrackdirReachesTrackdirs(src_trackdir); /* Filter out trackdirs that would make 90 deg turns for trains */ - if (_settings_game.pf.forbid_90_deg && (type == TRANSPORT_RAIL || type == TRANSPORT_WATER)) trackdirbits &= ~TrackdirCrossesTrackdirs(src_trackdir); + if (_settings_game.pf.forbid_90_deg && type == TRANSPORT_RAIL) trackdirbits &= ~TrackdirCrossesTrackdirs(src_trackdir); DEBUG(npf, 6, "After filtering: (%d, %d), possible trackdirs: 0x%X", TileX(dst_tile), TileY(dst_tile), trackdirbits); diff --git a/src/pathfinder/yapf/yapf_road.cpp b/src/pathfinder/yapf/yapf_road.cpp index 801a75677c..92a035fba4 100644 --- a/src/pathfinder/yapf/yapf_road.cpp +++ b/src/pathfinder/yapf/yapf_road.cpp @@ -513,11 +513,11 @@ Trackdir YapfRoadVehicleChooseTrack(const RoadVehicle *v, TileIndex tile, DiagDi { /* default is YAPF type 2 */ typedef Trackdir (*PfnChooseRoadTrack)(const RoadVehicle*, TileIndex, DiagDirection, bool &path_found); - PfnChooseRoadTrack pfnChooseRoadTrack = &CYapfRoad2::stChooseRoadTrack; // default: ExitDir, allow 90-deg + PfnChooseRoadTrack pfnChooseRoadTrack = &CYapfRoad2::stChooseRoadTrack; // default: ExitDir /* check if non-default YAPF type should be used */ if (_settings_game.pf.yapf.disable_node_optimization) { - pfnChooseRoadTrack = &CYapfRoad1::stChooseRoadTrack; // Trackdir, allow 90-deg + pfnChooseRoadTrack = &CYapfRoad1::stChooseRoadTrack; // Trackdir } Trackdir td_ret = pfnChooseRoadTrack(v, tile, enterdir, path_found); @@ -538,7 +538,7 @@ FindDepotData YapfRoadVehicleFindNearestDepot(const RoadVehicle *v, int max_dist /* check if non-default YAPF type should be used */ if (_settings_game.pf.yapf.disable_node_optimization) { - pfnFindNearestDepot = &CYapfRoadAnyDepot1::stFindNearestDepot; // Trackdir, allow 90-deg + pfnFindNearestDepot = &CYapfRoadAnyDepot1::stFindNearestDepot; // Trackdir } return pfnFindNearestDepot(v, tile, trackdir, max_distance); diff --git a/src/pathfinder/yapf/yapf_ship.cpp b/src/pathfinder/yapf/yapf_ship.cpp index b3ffa199fa..d09827bcde 100644 --- a/src/pathfinder/yapf/yapf_ship.cpp +++ b/src/pathfinder/yapf/yapf_ship.cpp @@ -293,25 +293,21 @@ struct CYapfShip_TypesT typedef CYapfCostShipT PfCost; // cost provider }; -/* YAPF type 1 - uses TileIndex/Trackdir as Node key, allows 90-deg turns */ +/* YAPF type 1 - uses TileIndex/Trackdir as Node key */ struct CYapfShip1 : CYapfT > {}; -/* YAPF type 2 - uses TileIndex/DiagDirection as Node key, allows 90-deg turns */ +/* YAPF type 2 - uses TileIndex/DiagDirection as Node key */ struct CYapfShip2 : CYapfT > {}; -/* YAPF type 3 - uses TileIndex/Trackdir as Node key, forbids 90-deg turns */ -struct CYapfShip3 : CYapfT > {}; /** Ship controller helper - path finder invoker */ Track YapfShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found, ShipPathCache &path_cache) { /* default is YAPF type 2 */ typedef Trackdir (*PfnChooseShipTrack)(const Ship*, TileIndex, DiagDirection, TrackBits, bool &path_found, ShipPathCache &path_cache); - PfnChooseShipTrack pfnChooseShipTrack = CYapfShip2::ChooseShipTrack; // default: ExitDir, allow 90-deg + PfnChooseShipTrack pfnChooseShipTrack = CYapfShip2::ChooseShipTrack; // default: ExitDir /* check if non-default YAPF type needed */ - if (_settings_game.pf.forbid_90_deg) { - pfnChooseShipTrack = &CYapfShip3::ChooseShipTrack; // Trackdir, forbid 90-deg - } else if (_settings_game.pf.yapf.disable_node_optimization) { - pfnChooseShipTrack = &CYapfShip1::ChooseShipTrack; // Trackdir, allow 90-deg + if (_settings_game.pf.yapf.disable_node_optimization) { + pfnChooseShipTrack = &CYapfShip1::ChooseShipTrack; // Trackdir } Trackdir td_ret = pfnChooseShipTrack(v, tile, enterdir, tracks, path_found, path_cache); @@ -325,13 +321,11 @@ bool YapfShipCheckReverse(const Ship *v) TileIndex tile = v->tile; typedef bool (*PfnCheckReverseShip)(const Ship*, TileIndex, Trackdir, Trackdir); - PfnCheckReverseShip pfnCheckReverseShip = CYapfShip2::CheckShipReverse; // default: ExitDir, allow 90-deg + PfnCheckReverseShip pfnCheckReverseShip = CYapfShip2::CheckShipReverse; // default: ExitDir /* check if non-default YAPF type needed */ - if (_settings_game.pf.forbid_90_deg) { - pfnCheckReverseShip = &CYapfShip3::CheckShipReverse; // Trackdir, forbid 90-deg - } else if (_settings_game.pf.yapf.disable_node_optimization) { - pfnCheckReverseShip = &CYapfShip1::CheckShipReverse; // Trackdir, allow 90-deg + if (_settings_game.pf.yapf.disable_node_optimization) { + pfnCheckReverseShip = &CYapfShip1::CheckShipReverse; // Trackdir } bool reverse = pfnCheckReverseShip(v, tile, td, td_rev); diff --git a/src/rev.cpp.in b/src/rev.cpp.in index a3972cee75..584f90ef9f 100644 --- a/src/rev.cpp.in +++ b/src/rev.cpp.in @@ -88,7 +88,7 @@ const byte _openttd_revision_tagged = !!ISTAG!!; * final release will always have a lower version number than the released * version, thus making comparisons on specific revisions easy. */ -const uint32 _openttd_newgrf_version = 1 << 28 | 9 << 24 | 0 << 20 | 0 << 19 | 28004; +const uint32 _openttd_newgrf_version = 1 << 28 | 10 << 24 | 0 << 20 | !!ISSTABLETAG!! << 19 | 28004; #ifdef __MORPHOS__ /** diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index d4cd4059e6..de39dcca62 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -269,7 +269,7 @@ enum SaveLoadVersion : uint16 { SLV_185, ///< 185 25620 Storybooks SLV_186, ///< 186 25833 Objects storage SLV_187, ///< 187 25899 Linkgraph - restricted flows - SLV_188, ///< 188 26169 FS#5831 Unify RV travel time + SLV_188, ///< 188 26169 v1.4 FS#5831 Unify RV travel time SLV_189, ///< 189 26450 Heirarchical vehicle subgroups SLV_190, ///< 190 26547 Separate order travel and wait times @@ -293,7 +293,7 @@ enum SaveLoadVersion : uint16 { SLV_GROUP_LIVERIES, ///< 205 PR#7108 Livery storage change and group liveries. SLV_SHIPS_STOP_IN_LOCKS, ///< 206 PR#7150 Ship/lock movement changes. - SLV_FIX_CARGO_MONITOR, ///< 207 PR#7175 Cargo monitor data packing fix to support 64 cargotypes. + SLV_FIX_CARGO_MONITOR, ///< 207 PR#7175 v1.9 Cargo monitor data packing fix to support 64 cargotypes. SL_MAX_VERSION, ///< Highest possible saveload version }; diff --git a/src/script/api/ai/ai_company.hpp.sq b/src/script/api/ai/ai_company.hpp.sq index 7ed55d97b6..ecab99c915 100644 --- a/src/script/api/ai/ai_company.hpp.sq +++ b/src/script/api/ai/ai_company.hpp.sq @@ -21,16 +21,57 @@ void SQAICompany_Register(Squirrel *engine) SQAICompany.PreRegister(engine); SQAICompany.AddConstructor(engine, "x"); - SQAICompany.DefSQConst(engine, ScriptCompany::CURRENT_QUARTER, "CURRENT_QUARTER"); - SQAICompany.DefSQConst(engine, ScriptCompany::EARLIEST_QUARTER, "EARLIEST_QUARTER"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_FIRST, "COMPANY_FIRST"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_LAST, "COMPANY_LAST"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_INVALID, "COMPANY_INVALID"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_SELF, "COMPANY_SELF"); - SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_SPECTATOR, "COMPANY_SPECTATOR"); - SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_MALE, "GENDER_MALE"); - SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_FEMALE, "GENDER_FEMALE"); - SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_INVALID, "GENDER_INVALID"); + SQAICompany.DefSQConst(engine, ScriptCompany::CURRENT_QUARTER, "CURRENT_QUARTER"); + SQAICompany.DefSQConst(engine, ScriptCompany::EARLIEST_QUARTER, "EARLIEST_QUARTER"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_FIRST, "COMPANY_FIRST"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_LAST, "COMPANY_LAST"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_INVALID, "COMPANY_INVALID"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_SELF, "COMPANY_SELF"); + SQAICompany.DefSQConst(engine, ScriptCompany::COMPANY_SPECTATOR, "COMPANY_SPECTATOR"); + SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_MALE, "GENDER_MALE"); + SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_FEMALE, "GENDER_FEMALE"); + SQAICompany.DefSQConst(engine, ScriptCompany::GENDER_INVALID, "GENDER_INVALID"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_DEFAULT, "LS_DEFAULT"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_STEAM, "LS_STEAM"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_DIESEL, "LS_DIESEL"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_ELECTRIC, "LS_ELECTRIC"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_MONORAIL, "LS_MONORAIL"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_MAGLEV, "LS_MAGLEV"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_DMU, "LS_DMU"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_EMU, "LS_EMU"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_STEAM, "LS_PASSENGER_WAGON_STEAM"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_DIESEL, "LS_PASSENGER_WAGON_DIESEL"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_ELECTRIC, "LS_PASSENGER_WAGON_ELECTRIC"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_MONORAIL, "LS_PASSENGER_WAGON_MONORAIL"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_MAGLEV, "LS_PASSENGER_WAGON_MAGLEV"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_FREIGHT_WAGON, "LS_FREIGHT_WAGON"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_BUS, "LS_BUS"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_TRUCK, "LS_TRUCK"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_SHIP, "LS_PASSENGER_SHIP"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_FREIGHT_SHIP, "LS_FREIGHT_SHIP"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_HELICOPTER, "LS_HELICOPTER"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_SMALL_PLANE, "LS_SMALL_PLANE"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_LARGE_PLANE, "LS_LARGE_PLANE"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_TRAM, "LS_PASSENGER_TRAM"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_FREIGHT_TRAM, "LS_FREIGHT_TRAM"); + SQAICompany.DefSQConst(engine, ScriptCompany::LS_INVALID, "LS_INVALID"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_DARK_BLUE, "COLOUR_DARK_BLUE"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_PALE_GREEN, "COLOUR_PALE_GREEN"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_PINK, "COLOUR_PINK"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_YELLOW, "COLOUR_YELLOW"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_RED, "COLOUR_RED"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_LIGHT_BLUE, "COLOUR_LIGHT_BLUE"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_GREEN, "COLOUR_GREEN"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_DARK_GREEN, "COLOUR_DARK_GREEN"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_BLUE, "COLOUR_BLUE"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_CREAM, "COLOUR_CREAM"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_MAUVE, "COLOUR_MAUVE"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_PURPLE, "COLOUR_PURPLE"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_ORANGE, "COLOUR_ORANGE"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_BROWN, "COLOUR_BROWN"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_GREY, "COLOUR_GREY"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_WHITE, "COLOUR_WHITE"); + SQAICompany.DefSQConst(engine, ScriptCompany::COLOUR_INVALID, "COLOUR_INVALID"); SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::ResolveCompanyID, "ResolveCompanyID", 2, ".i"); SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::IsMine, "IsMine", 2, ".i"); @@ -59,6 +100,10 @@ void SQAICompany_Register(Squirrel *engine) SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::GetAutoRenewMonths, "GetAutoRenewMonths", 2, ".i"); SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::SetAutoRenewMoney, "SetAutoRenewMoney", 2, ".i"); SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::GetAutoRenewMoney, "GetAutoRenewMoney", 2, ".i"); + SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::SetPrimaryLiveryColour, "SetPrimaryLiveryColour", 3, ".ii"); + SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::SetSecondaryLiveryColour, "SetSecondaryLiveryColour", 3, ".ii"); + SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::GetPrimaryLiveryColour, "GetPrimaryLiveryColour", 2, ".i"); + SQAICompany.DefSQStaticMethod(engine, &ScriptCompany::GetSecondaryLiveryColour, "GetSecondaryLiveryColour", 2, ".i"); SQAICompany.PostRegister(engine); } diff --git a/src/script/api/ai/ai_group.hpp.sq b/src/script/api/ai/ai_group.hpp.sq index 52ade08d56..5fa50ae1be 100644 --- a/src/script/api/ai/ai_group.hpp.sq +++ b/src/script/api/ai/ai_group.hpp.sq @@ -26,11 +26,13 @@ void SQAIGroup_Register(Squirrel *engine) SQAIGroup.DefSQConst(engine, ScriptGroup::GROUP_INVALID, "GROUP_INVALID"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::IsValidGroup, "IsValidGroup", 2, ".i"); - SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::CreateGroup, "CreateGroup", 2, ".i"); + SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::CreateGroup, "CreateGroup", 3, ".ii"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::DeleteGroup, "DeleteGroup", 2, ".i"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetVehicleType, "GetVehicleType", 2, ".i"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::SetName, "SetName", 3, ".i."); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetName, "GetName", 2, ".i"); + SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::SetParent, "SetParent", 3, ".ii"); + SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetParent, "GetParent", 2, ".i"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::EnableAutoReplaceProtection, "EnableAutoReplaceProtection", 3, ".ib"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetAutoReplaceProtection, "GetAutoReplaceProtection", 2, ".i"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetNumEngines, "GetNumEngines", 3, ".ii"); @@ -40,6 +42,9 @@ void SQAIGroup_Register(Squirrel *engine) SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::SetAutoReplace, "SetAutoReplace", 4, ".iii"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetEngineReplacement, "GetEngineReplacement", 3, ".ii"); SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::StopAutoReplace, "StopAutoReplace", 3, ".ii"); + SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetProfitThisYear, "GetProfitThisYear", 2, ".i"); + SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetProfitLastYear, "GetProfitLastYear", 2, ".i"); + SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetCurrentUsage, "GetCurrentUsage", 2, ".i"); SQAIGroup.PostRegister(engine); } diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp index eb2b3a5013..f3ec539a40 100644 --- a/src/script/api/ai_changelog.hpp +++ b/src/script/api/ai_changelog.hpp @@ -15,14 +15,24 @@ * functions may still be available if you return an older API version * in GetAPIVersion() in info.nut. * + * \b 1.10.0 + * + * This version is not yet released. The following changes are not set in stone yet. + * * \b 1.9.0 * - * 1.9.0 is not yet released. The following changes are not set in stone yet. * API additions: * \li AIAirport::GetMonthlyMaintenanceCost + * \li AIGroup::SetParent + * \li AIGroup::GetParent + * \li AICompany::SetPrimaryLiveryColour + * \li AICompany::SetSecondaryLiveryColour + * \li AICompany::GetPrimaryLiveryColour + * \li AICompany::GetSecondaryLiveryColour * * Other changes: * \li AIBridge::GetName takes one extra parameter to refer the vehicle type + * \li AIGroup::CreateGroup gains parent_group_id parameter * * \b 1.8.0 * diff --git a/src/script/api/game/game_company.hpp.sq b/src/script/api/game/game_company.hpp.sq index 29476fc8aa..626664484a 100644 --- a/src/script/api/game/game_company.hpp.sq +++ b/src/script/api/game/game_company.hpp.sq @@ -21,30 +21,71 @@ void SQGSCompany_Register(Squirrel *engine) SQGSCompany.PreRegister(engine); SQGSCompany.AddConstructor(engine, "x"); - SQGSCompany.DefSQConst(engine, ScriptCompany::CURRENT_QUARTER, "CURRENT_QUARTER"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EARLIEST_QUARTER, "EARLIEST_QUARTER"); - SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_FIRST, "COMPANY_FIRST"); - SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_LAST, "COMPANY_LAST"); - SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_INVALID, "COMPANY_INVALID"); - SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_SELF, "COMPANY_SELF"); - SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_SPECTATOR, "COMPANY_SPECTATOR"); - SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_MALE, "GENDER_MALE"); - SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_FEMALE, "GENDER_FEMALE"); - SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_INVALID, "GENDER_INVALID"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_CONSTRUCTION, "EXPENSES_CONSTRUCTION"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_NEW_VEHICLES, "EXPENSES_NEW_VEHICLES"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_TRAIN_RUN, "EXPENSES_TRAIN_RUN"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_ROADVEH_RUN, "EXPENSES_ROADVEH_RUN"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_AIRCRAFT_RUN, "EXPENSES_AIRCRAFT_RUN"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_SHIP_RUN, "EXPENSES_SHIP_RUN"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_PROPERTY, "EXPENSES_PROPERTY"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_TRAIN_INC, "EXPENSES_TRAIN_INC"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_ROADVEH_INC, "EXPENSES_ROADVEH_INC"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_AIRCRAFT_INC, "EXPENSES_AIRCRAFT_INC"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_SHIP_INC, "EXPENSES_SHIP_INC"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_LOAN_INT, "EXPENSES_LOAN_INT"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_OTHER, "EXPENSES_OTHER"); - SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_INVALID, "EXPENSES_INVALID"); + SQGSCompany.DefSQConst(engine, ScriptCompany::CURRENT_QUARTER, "CURRENT_QUARTER"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EARLIEST_QUARTER, "EARLIEST_QUARTER"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_FIRST, "COMPANY_FIRST"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_LAST, "COMPANY_LAST"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_INVALID, "COMPANY_INVALID"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_SELF, "COMPANY_SELF"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COMPANY_SPECTATOR, "COMPANY_SPECTATOR"); + SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_MALE, "GENDER_MALE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_FEMALE, "GENDER_FEMALE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::GENDER_INVALID, "GENDER_INVALID"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_DEFAULT, "LS_DEFAULT"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_STEAM, "LS_STEAM"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_DIESEL, "LS_DIESEL"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_ELECTRIC, "LS_ELECTRIC"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_MONORAIL, "LS_MONORAIL"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_MAGLEV, "LS_MAGLEV"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_DMU, "LS_DMU"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_EMU, "LS_EMU"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_STEAM, "LS_PASSENGER_WAGON_STEAM"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_DIESEL, "LS_PASSENGER_WAGON_DIESEL"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_ELECTRIC, "LS_PASSENGER_WAGON_ELECTRIC"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_MONORAIL, "LS_PASSENGER_WAGON_MONORAIL"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_WAGON_MAGLEV, "LS_PASSENGER_WAGON_MAGLEV"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_FREIGHT_WAGON, "LS_FREIGHT_WAGON"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_BUS, "LS_BUS"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_TRUCK, "LS_TRUCK"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_SHIP, "LS_PASSENGER_SHIP"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_FREIGHT_SHIP, "LS_FREIGHT_SHIP"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_HELICOPTER, "LS_HELICOPTER"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_SMALL_PLANE, "LS_SMALL_PLANE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_LARGE_PLANE, "LS_LARGE_PLANE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_PASSENGER_TRAM, "LS_PASSENGER_TRAM"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_FREIGHT_TRAM, "LS_FREIGHT_TRAM"); + SQGSCompany.DefSQConst(engine, ScriptCompany::LS_INVALID, "LS_INVALID"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_DARK_BLUE, "COLOUR_DARK_BLUE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_PALE_GREEN, "COLOUR_PALE_GREEN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_PINK, "COLOUR_PINK"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_YELLOW, "COLOUR_YELLOW"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_RED, "COLOUR_RED"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_LIGHT_BLUE, "COLOUR_LIGHT_BLUE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_GREEN, "COLOUR_GREEN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_DARK_GREEN, "COLOUR_DARK_GREEN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_BLUE, "COLOUR_BLUE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_CREAM, "COLOUR_CREAM"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_MAUVE, "COLOUR_MAUVE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_PURPLE, "COLOUR_PURPLE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_ORANGE, "COLOUR_ORANGE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_BROWN, "COLOUR_BROWN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_GREY, "COLOUR_GREY"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_WHITE, "COLOUR_WHITE"); + SQGSCompany.DefSQConst(engine, ScriptCompany::COLOUR_INVALID, "COLOUR_INVALID"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_CONSTRUCTION, "EXPENSES_CONSTRUCTION"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_NEW_VEHICLES, "EXPENSES_NEW_VEHICLES"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_TRAIN_RUN, "EXPENSES_TRAIN_RUN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_ROADVEH_RUN, "EXPENSES_ROADVEH_RUN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_AIRCRAFT_RUN, "EXPENSES_AIRCRAFT_RUN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_SHIP_RUN, "EXPENSES_SHIP_RUN"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_PROPERTY, "EXPENSES_PROPERTY"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_TRAIN_INC, "EXPENSES_TRAIN_INC"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_ROADVEH_INC, "EXPENSES_ROADVEH_INC"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_AIRCRAFT_INC, "EXPENSES_AIRCRAFT_INC"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_SHIP_INC, "EXPENSES_SHIP_INC"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_LOAN_INT, "EXPENSES_LOAN_INT"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_OTHER, "EXPENSES_OTHER"); + SQGSCompany.DefSQConst(engine, ScriptCompany::EXPENSES_INVALID, "EXPENSES_INVALID"); SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::ResolveCompanyID, "ResolveCompanyID", 2, ".i"); SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::SetName, "SetName", 2, ".."); @@ -69,6 +110,10 @@ void SQGSCompany_Register(Squirrel *engine) SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::GetAutoRenewStatus, "GetAutoRenewStatus", 2, ".i"); SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::GetAutoRenewMonths, "GetAutoRenewMonths", 2, ".i"); SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::GetAutoRenewMoney, "GetAutoRenewMoney", 2, ".i"); + SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::SetPrimaryLiveryColour, "SetPrimaryLiveryColour", 3, ".ii"); + SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::SetSecondaryLiveryColour, "SetSecondaryLiveryColour", 3, ".ii"); + SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::GetPrimaryLiveryColour, "GetPrimaryLiveryColour", 2, ".i"); + SQGSCompany.DefSQStaticMethod(engine, &ScriptCompany::GetSecondaryLiveryColour, "GetSecondaryLiveryColour", 2, ".i"); SQGSCompany.PostRegister(engine); } diff --git a/src/script/api/game/game_window.hpp.sq b/src/script/api/game/game_window.hpp.sq index 1ce30e80f5..ce0576b8a1 100644 --- a/src/script/api/game/game_window.hpp.sq +++ b/src/script/api/game/game_window.hpp.sq @@ -548,7 +548,8 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_CPR_FOOTER, "WID_CPR_FOOTER"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_CPR_ENABLE_CARGOES, "WID_CPR_ENABLE_CARGOES"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_CPR_DISABLE_CARGOES, "WID_CPR_DISABLE_CARGOES"); - SQGSWindow.DefSQConst(engine, ScriptWindow::WID_CPR_CARGO_FIRST, "WID_CPR_CARGO_FIRST"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_CPR_MATRIX, "WID_CPR_MATRIX"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_CPR_MATRIX_SCROLLBAR, "WID_CPR_MATRIX_SCROLLBAR"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_CL_BACKGROUND, "WID_CL_BACKGROUND"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_PRD_SCORE_FIRST, "WID_PRD_SCORE_FIRST"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_PRD_SCORE_LAST, "WID_PRD_SCORE_LAST"); @@ -1032,6 +1033,7 @@ void SQGSWindow_Register(Squirrel *engine) SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_RESOLUTION_DROPDOWN, "WID_GO_RESOLUTION_DROPDOWN"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_FULLSCREEN_BUTTON, "WID_GO_FULLSCREEN_BUTTON"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_GUI_ZOOM_DROPDOWN, "WID_GO_GUI_ZOOM_DROPDOWN"); + SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_FONT_ZOOM_DROPDOWN, "WID_GO_FONT_ZOOM_DROPDOWN"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_BASE_GRF_DROPDOWN, "WID_GO_BASE_GRF_DROPDOWN"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_BASE_GRF_STATUS, "WID_GO_BASE_GRF_STATUS"); SQGSWindow.DefSQConst(engine, ScriptWindow::WID_GO_BASE_GRF_TEXTFILE, "WID_GO_BASE_GRF_TEXTFILE"); diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp index 094449d73b..1ba2549734 100644 --- a/src/script/api/game_changelog.hpp +++ b/src/script/api/game_changelog.hpp @@ -15,9 +15,12 @@ * functions may still be available if you return an older API version * in GetAPIVersion() in info.nut. * + * \b 1.10.0 + * + * This version is not yet released. The following changes are not set in stone yet. + * * \b 1.9.0 * - * 1.9.0 is not yet released. The following changes are not set in stone yet. * API additions: * \li GSAirport::GetMonthlyMaintenanceCost * \li GSClient diff --git a/src/script/api/script_company.cpp b/src/script/api/script_company.cpp index a1f40c5e1e..54888c33cb 100644 --- a/src/script/api/script_company.cpp +++ b/src/script/api/script_company.cpp @@ -296,3 +296,33 @@ return ::Company::Get((CompanyID)company)->settings.engine_renew_money; } + +/* static */ bool ScriptCompany::SetPrimaryLiveryColour(LiveryScheme scheme, Colours colour) +{ + return ScriptObject::DoCommand(0, scheme, colour, CMD_SET_COMPANY_COLOUR); +} + +/* static */ bool ScriptCompany::SetSecondaryLiveryColour(LiveryScheme scheme, Colours colour) +{ + return ScriptObject::DoCommand(0, scheme | 1 << 8, colour, CMD_SET_COMPANY_COLOUR); +} + +/* static */ ScriptCompany::Colours ScriptCompany::GetPrimaryLiveryColour(ScriptCompany::LiveryScheme scheme) +{ + if ((::LiveryScheme)scheme < LS_BEGIN || (::LiveryScheme)scheme >= LS_END) return COLOUR_INVALID; + + const Company *c = ::Company::GetIfValid(_current_company); + if (c == NULL) return COLOUR_INVALID; + + return (ScriptCompany::Colours)c->livery[scheme].colour1; +} + +/* static */ ScriptCompany::Colours ScriptCompany::GetSecondaryLiveryColour(ScriptCompany::LiveryScheme scheme) +{ + if ((::LiveryScheme)scheme < LS_BEGIN || (::LiveryScheme)scheme >= LS_END) return COLOUR_INVALID; + + const Company *c = ::Company::GetIfValid(_current_company); + if (c == NULL) return COLOUR_INVALID; + + return (ScriptCompany::Colours)c->livery[scheme].colour2; +} diff --git a/src/script/api/script_company.hpp b/src/script/api/script_company.hpp index dc917500b7..55cb7a9300 100644 --- a/src/script/api/script_company.hpp +++ b/src/script/api/script_company.hpp @@ -14,6 +14,8 @@ #include "script_text.hpp" #include "../../economy_type.h" +#include "../../livery.h" +#include "../../gfx_type.h" /** * Class that handles all company related functions. @@ -46,6 +48,55 @@ public: GENDER_INVALID = -1, ///< An invalid gender. }; + /** List of different livery schemes. */ + enum LiveryScheme { + LS_DEFAULT, ///< Default scheme. + LS_STEAM, ///< Steam engines. + LS_DIESEL, ///< Diesel engines. + LS_ELECTRIC, ///< Electric engines. + LS_MONORAIL, ///< Monorail engines. + LS_MAGLEV, ///< Maglev engines. + LS_DMU, ///< DMUs and their passenger wagons. + LS_EMU, ///< EMUs and their passenger wagons. + LS_PASSENGER_WAGON_STEAM, ///< Passenger wagons attached to steam engines. + LS_PASSENGER_WAGON_DIESEL, ///< Passenger wagons attached to diesel engines. + LS_PASSENGER_WAGON_ELECTRIC, ///< Passenger wagons attached to electric engines. + LS_PASSENGER_WAGON_MONORAIL, ///< Passenger wagons attached to monorail engines. + LS_PASSENGER_WAGON_MAGLEV, ///< Passenger wagons attached to maglev engines. + LS_FREIGHT_WAGON, ///< Freight wagons. + LS_BUS, ///< Buses. + LS_TRUCK, ///< Trucks. + LS_PASSENGER_SHIP, ///< Passenger ships. + LS_FREIGHT_SHIP, ///< Freight ships. + LS_HELICOPTER, ///< Helicopters. + LS_SMALL_PLANE, ///< Small aeroplanes. + LS_LARGE_PLANE, ///< Large aeroplanes. + LS_PASSENGER_TRAM, ///< Passenger trams. + LS_FREIGHT_TRAM, ///< Freight trams. + LS_INVALID = -1, + }; + + /** List of colours. */ + enum Colours { + COLOUR_DARK_BLUE, + COLOUR_PALE_GREEN, + COLOUR_PINK, + COLOUR_YELLOW, + COLOUR_RED, + COLOUR_LIGHT_BLUE, + COLOUR_GREEN, + COLOUR_DARK_GREEN, + COLOUR_BLUE, + COLOUR_CREAM, + COLOUR_MAUVE, + COLOUR_PURPLE, + COLOUR_ORANGE, + COLOUR_BROWN, + COLOUR_GREY, + COLOUR_WHITE, + COLOUR_INVALID = ::INVALID_COLOUR + }; + /** * Types of expenses. * @api -ai @@ -331,6 +382,36 @@ public: * @return The minimum required money for autorenew to work. */ static Money GetAutoRenewMoney(CompanyID company); + + /** + * Set primary colour for your company. + * @param scheme Livery scheme to set. + * @param colour Colour to set. + * @return False if unable to set primary colour of the livery scheme (e.g. colour in use). + */ + static bool SetPrimaryLiveryColour(LiveryScheme scheme, Colours colour); + + /** + * Set secondary colour for your company. + * @param scheme Livery scheme to set. + * @param colour Colour to set. + * @return False if unable to set secondary colour of the livery scheme. + */ + static bool SetSecondaryLiveryColour(LiveryScheme scheme, Colours colour); + + /** + * Get primary colour of a livery for your company. + * @param scheme Livery scheme to get. + * @return Primary colour of livery. + */ + static ScriptCompany::Colours GetPrimaryLiveryColour(LiveryScheme scheme); + + /** + * Get secondary colour of a livery for your company. + * @param scheme Livery scheme to get. + * @return Secondary colour of livery. + */ + static ScriptCompany::Colours GetSecondaryLiveryColour(LiveryScheme scheme); }; DECLARE_POSTFIX_INCREMENT(ScriptCompany::CompanyID) diff --git a/src/script/api/script_group.cpp b/src/script/api/script_group.cpp index cf8dd51a8c..16a50bc17c 100644 --- a/src/script/api/script_group.cpp +++ b/src/script/api/script_group.cpp @@ -17,6 +17,7 @@ #include "../../strings_func.h" #include "../../autoreplace_func.h" #include "../../settings_func.h" +#include "../../vehicle_base.h" #include "table/strings.h" #include "../../safeguards.h" @@ -27,9 +28,9 @@ return g != NULL && g->owner == ScriptObject::GetCompany(); } -/* static */ ScriptGroup::GroupID ScriptGroup::CreateGroup(ScriptVehicle::VehicleType vehicle_type) +/* static */ ScriptGroup::GroupID ScriptGroup::CreateGroup(ScriptVehicle::VehicleType vehicle_type, GroupID parent_group_id) { - if (!ScriptObject::DoCommand(0, (::VehicleType)vehicle_type, INVALID_GROUP, CMD_CREATE_GROUP, NULL, &ScriptInstance::DoCommandReturnGroupID)) return GROUP_INVALID; + if (!ScriptObject::DoCommand(0, (::VehicleType)vehicle_type, parent_group_id, CMD_CREATE_GROUP, NULL, &ScriptInstance::DoCommandReturnGroupID)) return GROUP_INVALID; /* In case of test-mode, we return GroupID 0 */ return (ScriptGroup::GroupID)0; @@ -70,6 +71,22 @@ return GetString(STR_GROUP_NAME); } +/* static */ bool ScriptGroup::SetParent(GroupID group_id, GroupID parent_group_id) +{ + EnforcePrecondition(false, IsValidGroup(group_id)); + EnforcePrecondition(false, IsValidGroup(parent_group_id)); + + return ScriptObject::DoCommand(0, group_id | 1 << 16, parent_group_id, CMD_ALTER_GROUP); +} + +/* static */ ScriptGroup::GroupID ScriptGroup::GetParent(GroupID group_id) +{ + EnforcePrecondition((ScriptGroup::GroupID)INVALID_GROUP, IsValidGroup(group_id)); + + const Group *g = ::Group::GetIfValid(group_id); + return (ScriptGroup::GroupID)g->parent; +} + /* static */ bool ScriptGroup::EnableAutoReplaceProtection(GroupID group_id, bool enable) { EnforcePrecondition(false, IsValidGroup(group_id)); @@ -132,3 +149,48 @@ return ScriptObject::DoCommand(0, group_id << 16, (::INVALID_ENGINE << 16) | engine_id, CMD_SET_AUTOREPLACE); } + +/* static */ Money ScriptGroup::GetProfitThisYear(GroupID group_id) +{ + if (!IsValidGroup(group_id)) return -1; + + Money profit = 0; + + const Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (v->group_id != group_id) continue; + if (!v->IsPrimaryVehicle()) continue; + + profit += v->GetDisplayProfitThisYear(); + } + + return profit; +} + +/* static */ Money ScriptGroup::GetProfitLastYear(GroupID group_id) +{ + if (!IsValidGroup(group_id)) return -1; + + return ::Group::Get(group_id)->statistics.profit_last_year; +} + +/* static */ uint32 ScriptGroup::GetCurrentUsage(GroupID group_id) +{ + if (!IsValidGroup(group_id)) return -1; + + uint32 occupancy = 0; + uint32 vehicle_count = 0; + + const Vehicle *v; + FOR_ALL_VEHICLES(v) { + if (v->group_id != group_id) continue; + if (!v->IsPrimaryVehicle()) continue; + + occupancy += v->trip_occupancy; + vehicle_count++; + } + + if (vehicle_count == 0) return -1; + + return occupancy / vehicle_count; +} diff --git a/src/script/api/script_group.hpp b/src/script/api/script_group.hpp index fd8888a171..9e88eaff1c 100644 --- a/src/script/api/script_group.hpp +++ b/src/script/api/script_group.hpp @@ -42,11 +42,12 @@ public: /** * Create a new group. * @param vehicle_type The type of vehicle to create a group for. + * @param parent_group_id The parent group id to create this group under, INVALID_GROUP for top-level. * @return The GroupID of the new group, or an invalid GroupID when * it failed. Check the return value using IsValidGroup(). In test-mode * 0 is returned if it was successful; any other value indicates failure. */ - static GroupID CreateGroup(ScriptVehicle::VehicleType vehicle_type); + static GroupID CreateGroup(ScriptVehicle::VehicleType vehicle_type, GroupID parent_group_id); /** * Delete the given group. When the deletion succeeds all vehicles in the @@ -84,6 +85,24 @@ public: */ static char *GetName(GroupID group_id); + /** + * Set parent group of a group. + * @param group_id The group to set the parent for. + * @param parent_group_id The parent group to set. + * @pre IsValidGroup(group_id). + * @pre IsValidGroup(parent_group_id). + * @return True if and only if the parent group was changed. + */ + static bool SetParent(GroupID group_id, GroupID parent_group_id); + + /** + * Get parent group of a group. + * @param group_id The group to get the parent of. + * @pre IsValidGroup(group_id). + * @return The group id of the parent group. + */ + static GroupID GetParent(GroupID group_id); + /** * Enable or disable autoreplace protected. If the protection is * enabled, global autoreplace won't affect vehicles in this group. @@ -171,6 +190,30 @@ public: * @return True if and if the replacing was successfully stopped. */ static bool StopAutoReplace(GroupID group_id, EngineID engine_id); + + /** + * Get the current profit of a group. + * @param group_id The group to get the profit of. + * @pre IsValidGroup(group_id). + * @return The current profit the group has. + */ + static Money GetProfitThisYear(GroupID group_id); + + /** + * Get the profit of last year of a group. + * @param group_id The group to get the profit of. + * @pre IsValidGroup(group_id). + * @return The current profit the group had last year. + */ + static Money GetProfitLastYear(GroupID group_id); + + /** + * Get the current vehicle usage of a group. + * @param group_id The group to get the current usage of. + * @pre IsValidGroup(group_id). + * @return The current usage of the group. + */ + static uint32 GetCurrentUsage(GroupID group_id); }; #endif /* SCRIPT_GROUP_HPP */ diff --git a/src/script/api/script_window.hpp b/src/script/api/script_window.hpp index f7c6feeacc..6c178f50ec 100644 --- a/src/script/api/script_window.hpp +++ b/src/script/api/script_window.hpp @@ -1329,6 +1329,7 @@ public: WID_FRW_TIMES_NAMES = ::WID_FRW_TIMES_NAMES, WID_FRW_TIMES_CURRENT = ::WID_FRW_TIMES_CURRENT, WID_FRW_TIMES_AVERAGE = ::WID_FRW_TIMES_AVERAGE, + WID_FRW_SCROLLBAR = ::WID_FRW_SCROLLBAR, }; /** Widgets of the #FrametimeGraphWindow class. */ @@ -1463,7 +1464,8 @@ public: WID_CPR_FOOTER = ::WID_CPR_FOOTER, ///< Footer. WID_CPR_ENABLE_CARGOES = ::WID_CPR_ENABLE_CARGOES, ///< Enable cargoes button. WID_CPR_DISABLE_CARGOES = ::WID_CPR_DISABLE_CARGOES, ///< Disable cargoes button. - WID_CPR_CARGO_FIRST = ::WID_CPR_CARGO_FIRST, ///< First cargo in the list. + WID_CPR_MATRIX = ::WID_CPR_MATRIX, ///< Cargo list. + WID_CPR_MATRIX_SCROLLBAR = ::WID_CPR_MATRIX_SCROLLBAR, ///< Cargo list scrollbar. }; /** Widget of the #CompanyLeagueWindow class. */ @@ -2225,6 +2227,7 @@ public: WID_GO_BASE_MUSIC_STATUS = ::WID_GO_BASE_MUSIC_STATUS, ///< Info about corrupted files etc. WID_GO_BASE_MUSIC_TEXTFILE = ::WID_GO_BASE_MUSIC_TEXTFILE, ///< Open base music readme, changelog (+1) or license (+2). WID_GO_BASE_MUSIC_DESCRIPTION = ::WID_GO_BASE_MUSIC_DESCRIPTION, ///< Description of selected base music set. + WID_GO_FONT_ZOOM_DROPDOWN = ::WID_GO_FONT_ZOOM_DROPDOWN, ///< Dropdown for the font zoom level. }; /** Widgets of the #GameSettingsWindow class. */ diff --git a/src/script/api/template/template_company.hpp.sq b/src/script/api/template/template_company.hpp.sq index 7dc63f24bc..82c10381ab 100644 --- a/src/script/api/template/template_company.hpp.sq +++ b/src/script/api/template/template_company.hpp.sq @@ -19,6 +19,10 @@ namespace SQConvert { template <> inline int Return(HSQUIRRELVM vm, ScriptCompany::CompanyID res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptCompany::Gender GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptCompany::Gender)tmp; } template <> inline int Return(HSQUIRRELVM vm, ScriptCompany::Gender res) { sq_pushinteger(vm, (int32)res); return 1; } + template <> inline ScriptCompany::LiveryScheme GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptCompany::LiveryScheme)tmp; } + template <> inline int Return(HSQUIRRELVM vm, ScriptCompany::LiveryScheme res) { sq_pushinteger(vm, (int32)res); return 1; } + template <> inline ScriptCompany::Colours GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptCompany::Colours)tmp; } + template <> inline int Return(HSQUIRRELVM vm, ScriptCompany::Colours res) { sq_pushinteger(vm, (int32)res); return 1; } template <> inline ScriptCompany::ExpensesType GetParam(ForceType, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (ScriptCompany::ExpensesType)tmp; } template <> inline int Return(HSQUIRRELVM vm, ScriptCompany::ExpensesType res) { sq_pushinteger(vm, (int32)res); return 1; } diff --git a/src/sdl.cpp b/src/sdl.cpp deleted file mode 100644 index 79e9ed2927..0000000000 --- a/src/sdl.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* $Id$ */ - -/* - * This file is part of OpenTTD. - * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. - * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - */ - -/** @file sdl.cpp Implementation of SDL support. */ - -#include "stdafx.h" - -#ifdef WITH_SDL - -#include "sdl.h" -#include - -/** Number of users of the SDL library. */ -static int _sdl_usage; - -#ifdef DYNAMICALLY_LOADED_SDL - -#include "os/windows/win32.h" - -#define M(x) x "\0" -static const char sdl_files[] = - M("sdl.dll") - M("SDL_Init") - M("SDL_InitSubSystem") - M("SDL_GetError") - M("SDL_QuitSubSystem") - M("SDL_UpdateRect") - M("SDL_UpdateRects") - M("SDL_SetColors") - M("SDL_WM_SetCaption") - M("SDL_ShowCursor") - M("SDL_FreeSurface") - M("SDL_PollEvent") - M("SDL_WarpMouse") - M("SDL_GetTicks") - M("SDL_OpenAudio") - M("SDL_PauseAudio") - M("SDL_CloseAudio") - M("SDL_LockSurface") - M("SDL_UnlockSurface") - M("SDL_GetModState") - M("SDL_Delay") - M("SDL_Quit") - M("SDL_SetVideoMode") - M("SDL_EnableKeyRepeat") - M("SDL_EnableUNICODE") - M("SDL_VideoDriverName") - M("SDL_ListModes") - M("SDL_GetKeyState") - M("SDL_LoadBMP_RW") - M("SDL_RWFromFile") - M("SDL_SetColorKey") - M("SDL_WM_SetIcon") - M("SDL_MapRGB") - M("SDL_VideoModeOK") - M("SDL_Linked_Version") - M("") -; -#undef M - -SDLProcs sdl_proc; - -static const char *LoadSdlDLL() -{ - if (sdl_proc.SDL_Init != NULL) { - return NULL; - } - if (!LoadLibraryList((Function *)(void *)&sdl_proc, sdl_files)) { - return "Unable to load sdl.dll"; - } - return NULL; -} - -#endif /* DYNAMICALLY_LOADED_SDL */ - -#include "safeguards.h" - -/** - * Open the SDL library. - * @param x The subsystem to load. - */ -const char *SdlOpen(uint32 x) -{ -#ifdef DYNAMICALLY_LOADED_SDL - { - const char *s = LoadSdlDLL(); - if (s != NULL) return s; - } -#endif - if (_sdl_usage++ == 0) { - if (SDL_CALL SDL_Init(x | SDL_INIT_NOPARACHUTE) == -1) return SDL_CALL SDL_GetError(); - } else if (x != 0) { - if (SDL_CALL SDL_InitSubSystem(x) == -1) return SDL_CALL SDL_GetError(); - } - - return NULL; -} - -/** - * Close the SDL library. - * @param x The subsystem to close. - */ -void SdlClose(uint32 x) -{ - if (x != 0) { - SDL_CALL SDL_QuitSubSystem(x); - } - if (--_sdl_usage == 0) { - SDL_CALL SDL_Quit(); - } -} - -#endif diff --git a/src/sdl.h b/src/sdl.h deleted file mode 100644 index 9033899a59..0000000000 --- a/src/sdl.h +++ /dev/null @@ -1,71 +0,0 @@ -/* $Id$ */ - -/* - * This file is part of OpenTTD. - * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. - * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . - */ - -/** @file sdl.h SDL support. */ - -#ifndef SDL_H -#define SDL_H - -const char *SdlOpen(uint32 x); -void SdlClose(uint32 x); - -#ifdef _WIN32 - #define DYNAMICALLY_LOADED_SDL -#endif - -#ifdef DYNAMICALLY_LOADED_SDL - #include - - struct SDLProcs { - int (SDLCALL *SDL_Init)(Uint32); - int (SDLCALL *SDL_InitSubSystem)(Uint32); - char *(SDLCALL *SDL_GetError)(); - void (SDLCALL *SDL_QuitSubSystem)(Uint32); - void (SDLCALL *SDL_UpdateRect)(SDL_Surface *, Sint32, Sint32, Uint32, Uint32); - void (SDLCALL *SDL_UpdateRects)(SDL_Surface *, int, SDL_Rect *); - int (SDLCALL *SDL_SetColors)(SDL_Surface *, SDL_Color *, int, int); - void (SDLCALL *SDL_WM_SetCaption)(const char *, const char *); - int (SDLCALL *SDL_ShowCursor)(int); - void (SDLCALL *SDL_FreeSurface)(SDL_Surface *); - int (SDLCALL *SDL_PollEvent)(SDL_Event *); - void (SDLCALL *SDL_WarpMouse)(Uint16, Uint16); - uint32 (SDLCALL *SDL_GetTicks)(); - int (SDLCALL *SDL_OpenAudio)(SDL_AudioSpec *, SDL_AudioSpec*); - void (SDLCALL *SDL_PauseAudio)(int); - void (SDLCALL *SDL_CloseAudio)(); - int (SDLCALL *SDL_LockSurface)(SDL_Surface*); - void (SDLCALL *SDL_UnlockSurface)(SDL_Surface*); - SDLMod (SDLCALL *SDL_GetModState)(); - void (SDLCALL *SDL_Delay)(Uint32); - void (SDLCALL *SDL_Quit)(); - SDL_Surface *(SDLCALL *SDL_SetVideoMode)(int, int, int, Uint32); - int (SDLCALL *SDL_EnableKeyRepeat)(int, int); - void (SDLCALL *SDL_EnableUNICODE)(int); - void (SDLCALL *SDL_VideoDriverName)(char *, int); - SDL_Rect **(SDLCALL *SDL_ListModes)(void *, int); - Uint8 *(SDLCALL *SDL_GetKeyState)(int *); - SDL_Surface *(SDLCALL *SDL_LoadBMP_RW)(SDL_RWops *, int); - SDL_RWops *(SDLCALL *SDL_RWFromFile)(const char *, const char *); - int (SDLCALL *SDL_SetColorKey)(SDL_Surface *, Uint32, Uint32); - void (SDLCALL *SDL_WM_SetIcon)(SDL_Surface *, Uint8 *); - Uint32 (SDLCALL *SDL_MapRGB)(SDL_PixelFormat *, Uint8, Uint8, Uint8); - int (SDLCALL *SDL_VideoModeOK)(int, int, int, Uint32); - SDL_version *(SDLCALL *SDL_Linked_Version)(); - int (SDLCALL *SDL_BlitSurface)(SDL_Surface *, SDL_Rect *, SDL_Surface *, SDL_Rect *); - SDL_Surface *(SDLCALL *SDL_CreateRGBSurface)(Uint32, int, int, int, Uint32, Uint32, Uint32, Uint32); - }; - - extern SDLProcs sdl_proc; - - #define SDL_CALL sdl_proc. -#else - #define SDL_CALL -#endif - -#endif /* SDL_H */ diff --git a/src/settings_gui.cpp b/src/settings_gui.cpp index efa6074272..87f6a2ad9f 100644 --- a/src/settings_gui.cpp +++ b/src/settings_gui.cpp @@ -36,6 +36,7 @@ #include "textfile_gui.h" #include "stringfilter_type.h" #include "querystring_gui.h" +#include "fontcache.h" #include @@ -64,6 +65,13 @@ static const StringID _gui_zoom_dropdown[] = { INVALID_STRING_ID, }; +static const StringID _font_zoom_dropdown[] = { + STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_NORMAL, + STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_2X_ZOOM, + STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_4X_ZOOM, + INVALID_STRING_ID, +}; + int _nb_orig_names = SPECSTR_TOWNNAME_LAST - SPECSTR_TOWNNAME_START + 1; ///< Number of original town names. static StringID *_grf_names = NULL; ///< Pointer to town names defined by NewGRFs. static int _nb_grf_names = 0; ///< Number of town names defined by NewGRFs. @@ -302,6 +310,16 @@ struct GameOptionsWindow : Window { break; } + case WID_GO_FONT_ZOOM_DROPDOWN: { + list = new DropDownList(); + *selected_index = ZOOM_LVL_OUT_4X - _font_zoom; + const StringID *items = _font_zoom_dropdown; + for (int i = 0; *items != INVALID_STRING_ID; items++, i++) { + *list->Append() = new DropDownListStringItem(*items, i, false); + } + break; + } + case WID_GO_BASE_GRF_DROPDOWN: list = BuildSetDropDownList(selected_index, (_game_mode == GM_MENU)); break; @@ -331,6 +349,7 @@ struct GameOptionsWindow : Window { case WID_GO_LANG_DROPDOWN: SetDParamStr(0, _current_language->own_name); break; case WID_GO_RESOLUTION_DROPDOWN: SetDParam(0, GetCurRes() == _num_resolutions ? STR_GAME_OPTIONS_RESOLUTION_OTHER : SPECSTR_RESOLUTION_START + GetCurRes()); break; case WID_GO_GUI_ZOOM_DROPDOWN: SetDParam(0, _gui_zoom_dropdown[ZOOM_LVL_OUT_4X - _gui_zoom]); break; + case WID_GO_FONT_ZOOM_DROPDOWN: SetDParam(0, _font_zoom_dropdown[ZOOM_LVL_OUT_4X - _font_zoom]); break; case WID_GO_BASE_GRF_DROPDOWN: SetDParamStr(0, BaseGraphics::GetUsedSet()->name); break; case WID_GO_BASE_GRF_STATUS: SetDParam(0, BaseGraphics::GetUsedSet()->GetNumInvalid()); break; case WID_GO_BASE_SFX_DROPDOWN: SetDParamStr(0, BaseSounds::GetUsedSet()->name); break; @@ -534,10 +553,18 @@ struct GameOptionsWindow : Window { break; case WID_GO_GUI_ZOOM_DROPDOWN: - extern void UpdateFontHeightCache(); GfxClearSpriteCache(); _gui_zoom = (ZoomLevel)(ZOOM_LVL_OUT_4X - index); UpdateCursorSize(); + UpdateAllVirtCoords(); + ReInitAllWindows(); + break; + + case WID_GO_FONT_ZOOM_DROPDOWN: + extern void UpdateFontHeightCache(); + GfxClearSpriteCache(); + _font_zoom = (ZoomLevel)(ZOOM_LVL_OUT_4X - index); + ClearFontCache(); UpdateFontHeightCache(); LoadStringWidthTable(); UpdateAllVirtCoords(); @@ -618,6 +645,9 @@ static const NWidgetPart _nested_game_options_widgets[] = { NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_CURRENCY_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP), SetFill(1, 0), EndContainer(), NWidget(NWID_SPACER), SetMinimalSize(0, 0), SetFill(0, 1), + NWidget(WWT_FRAME, COLOUR_GREY), SetDataTip(STR_GAME_OPTIONS_FONT_ZOOM, STR_NULL), + NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_GO_FONT_ZOOM_DROPDOWN), SetMinimalSize(150, 12), SetDataTip(STR_BLACK_STRING, STR_GAME_OPTIONS_FONT_ZOOM_DROPDOWN_TOOLTIP), SetFill(1, 0), + EndContainer(), EndContainer(), EndContainer(), diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index a28d290e0f..c755330d09 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -494,14 +494,7 @@ static Track ChooseShipTrack(Ship *v, TileIndex tile, DiagDirection enterdir, Tr /* No destination or destination too far, don't invoke pathfinder. */ track = TrackBitsToTrack(v->state); if (!IsDiagonalTrack(track)) track = TrackToOppositeTrack(track); - if (!HasBit(tracks, track)) { - /* Can't continue in same direction so pick first available track. */ - if (_settings_game.pf.forbid_90_deg) { - tracks &= ~TrackCrossesTracks(TrackdirToTrack(v->GetVehicleTrackdir())); - if (tracks == TRACK_BIT_NONE) return INVALID_TRACK; - } - track = FindFirstTrack(tracks); - } + if (!HasBit(tracks, track)) track = FindFirstTrack(tracks); path_found = false; } else { /* Attempt to follow cached path. */ diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index 15adef0890..56af6e6655 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -41,11 +41,11 @@ struct SignList { */ typedef GUIList GUISignList; - static const Sign *last_sign; GUISignList signs; StringFilter string_filter; ///< The match string to be used when the GUIList is (re)-sorted. static bool match_case; ///< Should case sensitive matching be used? + static char default_name[64]; ///< Default sign name, used if Sign::name is NULL. /** * Creates a SignList with filtering disabled by default. @@ -74,19 +74,17 @@ struct SignList { /** Sort signs by their name */ static int CDECL SignNameSorter(const Sign * const *a, const Sign * const *b) { - static char buf_cache[64]; - char buf[64]; + /* Signs are very very rarely using the default text, but there can also be + * a lot of them. Therefore a worthwhile performance gain can be made by + * directly comparing Sign::name instead of going through the string + * system for each comparison. */ + const char *a_name = (*a)->name; + const char *b_name = (*b)->name; - SetDParam(0, (*a)->index); - GetString(buf, STR_SIGN_NAME, lastof(buf)); + if (a_name == NULL) a_name = SignList::default_name; + if (b_name == NULL) b_name = SignList::default_name; - if (*b != last_sign) { - last_sign = *b; - SetDParam(0, (*b)->index); - GetString(buf_cache, STR_SIGN_NAME, lastof(buf_cache)); - } - - int r = strnatcmp(buf, buf_cache); // Sort by name (natural sorting). + int r = strnatcmp(a_name, b_name); // Sort by name (natural sorting). return r != 0 ? r : ((*a)->index - (*b)->index); } @@ -94,21 +92,18 @@ struct SignList { void SortSignsList() { if (!this->signs.Sort(&SignNameSorter)) return; - - /* Reset the name sorter sort cache */ - this->last_sign = NULL; } /** Filter sign list by sign name */ static bool CDECL SignNameFilter(const Sign * const *a, StringFilter &filter) { - /* Get sign string */ - char buf1[MAX_LENGTH_SIGN_NAME_CHARS * MAX_CHAR_LENGTH]; - SetDParam(0, (*a)->index); - GetString(buf1, STR_SIGN_NAME, lastof(buf1)); + /* Same performance benefit as above for sorting. */ + const char *a_name = (*a)->name; + + if (a_name == NULL) a_name = SignList::default_name; filter.ResetState(); - filter.AddLine(buf1); + filter.AddLine(a_name); return filter.GetState(); } @@ -138,8 +133,8 @@ struct SignList { } }; -const Sign *SignList::last_sign = NULL; bool SignList::match_case = false; +char SignList::default_name[64]; /** Enum referring to the Hotkeys in the sign list window */ enum SignListHotkeys { @@ -171,6 +166,15 @@ struct SignListWindow : Window, SignList { this->BuildSortSignList(); } + virtual void OnInit() + { + /* Default sign name, used if Sign::name is NULL. */ + GetString(SignList::default_name, STR_DEFAULT_SIGN_NAME, lastof(SignList::default_name)); + this->signs.ForceResort(); + this->SortSignsList(); + this->SetDirty(); + } + /** * This function sets the filter string of the sign list. The contents of * the edit widget is not updated by this function. Depending on if the @@ -188,7 +192,7 @@ struct SignListWindow : Window, SignList { virtual void OnPaint() { - if (this->signs.NeedRebuild()) this->BuildSortSignList(); + if (!this->IsShaded() && this->signs.NeedRebuild()) this->BuildSortSignList(); this->DrawWidgets(); } diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 94d5e13a20..094af4a0a6 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -1194,7 +1194,7 @@ void SmallMapWindow::SwitchMapType(SmallMapType map_type) this->SetupWidgetData(); - if (map_type == SMT_LINKSTATS) this->overlay->RebuildCache(); + if (map_type == SMT_LINKSTATS) this->overlay->SetDirty(); if (map_type != SMT_INDUSTRY) this->BreakIndustryChainLink(); this->SetDirty(); } @@ -1486,7 +1486,7 @@ int SmallMapWindow::GetPositionOnLegend(Point pt) if (this->overlay->GetCompanyMask() != company_mask) { this->overlay->SetCompanyMask(company_mask); } else { - this->overlay->RebuildCache(); + this->overlay->SetDirty(); } } _smallmap_industry_highlight_state = !_smallmap_industry_highlight_state; diff --git a/src/sound/sdl_s.cpp b/src/sound/sdl_s.cpp index e3fb99eaa7..b37016c24e 100644 --- a/src/sound/sdl_s.cpp +++ b/src/sound/sdl_s.cpp @@ -14,7 +14,6 @@ #include "../stdafx.h" #include "../mixer.h" -#include "../sdl.h" #include "sdl_s.h" #include @@ -38,8 +37,14 @@ const char *SoundDriver_SDL::Start(const char * const *parm) { SDL_AudioSpec spec; - const char *s = SdlOpen(SDL_INIT_AUDIO); - if (s != NULL) return s; + /* Only initialise SDL if the video driver hasn't done it already */ + int ret_code = 0; + if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) { + ret_code = SDL_Init(SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE); + } else if (SDL_WasInit(SDL_INIT_AUDIO) == 0) { + ret_code = SDL_InitSubSystem(SDL_INIT_AUDIO); + } + if (ret_code == -1) return SDL_GetError(); spec.freq = GetDriverParamInt(parm, "hz", 44100); spec.format = AUDIO_S16SYS; @@ -47,15 +52,18 @@ const char *SoundDriver_SDL::Start(const char * const *parm) spec.samples = GetDriverParamInt(parm, "samples", 1024); spec.callback = fill_sound_buffer; MxInitialize(spec.freq); - SDL_CALL SDL_OpenAudio(&spec, &spec); - SDL_CALL SDL_PauseAudio(0); + SDL_OpenAudio(&spec, &spec); + SDL_PauseAudio(0); return NULL; } void SoundDriver_SDL::Stop() { - SDL_CALL SDL_CloseAudio(); - SdlClose(SDL_INIT_AUDIO); + SDL_CloseAudio(); + SDL_QuitSubSystem(SDL_INIT_AUDIO); + if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) { + SDL_Quit(); // If there's nothing left, quit SDL + } } #endif /* WITH_SDL */ diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 2fbcfe4f9a..69a61725c1 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -514,13 +514,13 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty return (void*)GetRawSprite(SPR_IMG_QUERY, ST_NORMAL, allocator); } - if (sprite->type == ST_FONT && ZOOM_LVL_GUI != ZOOM_LVL_NORMAL) { - /* Make ZOOM_LVL_GUI be ZOOM_LVL_NORMAL */ - sprite[ZOOM_LVL_NORMAL].width = sprite[ZOOM_LVL_GUI].width; - sprite[ZOOM_LVL_NORMAL].height = sprite[ZOOM_LVL_GUI].height; - sprite[ZOOM_LVL_NORMAL].x_offs = sprite[ZOOM_LVL_GUI].x_offs; - sprite[ZOOM_LVL_NORMAL].y_offs = sprite[ZOOM_LVL_GUI].y_offs; - sprite[ZOOM_LVL_NORMAL].data = sprite[ZOOM_LVL_GUI].data; + if (sprite->type == ST_FONT && ZOOM_LVL_FONT != ZOOM_LVL_NORMAL) { + /* Make ZOOM_LVL_NORMAL be ZOOM_LVL_FONT */ + sprite[ZOOM_LVL_NORMAL].width = sprite[ZOOM_LVL_FONT].width; + sprite[ZOOM_LVL_NORMAL].height = sprite[ZOOM_LVL_FONT].height; + sprite[ZOOM_LVL_NORMAL].x_offs = sprite[ZOOM_LVL_FONT].x_offs; + sprite[ZOOM_LVL_NORMAL].y_offs = sprite[ZOOM_LVL_FONT].y_offs; + sprite[ZOOM_LVL_NORMAL].data = sprite[ZOOM_LVL_FONT].data; } return BlitterFactory::GetCurrentBlitter()->Encode(sprite, allocator); diff --git a/src/strings.cpp b/src/strings.cpp index 4c2086c127..12759f33a6 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -980,7 +980,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg WChar b = '\0'; uint next_substr_case_index = 0; char *buf_start = buff; - std::stack str_stack; + std::stack> str_stack; str_stack.push(str_arg); for (;;) { diff --git a/src/table/misc_settings.ini b/src/table/misc_settings.ini index 78a4cd25d4..9425ee977a 100644 --- a/src/table/misc_settings.ini +++ b/src/table/misc_settings.ini @@ -310,5 +310,14 @@ min = ZOOM_LVL_MIN max = ZOOM_LVL_OUT_4X cat = SC_BASIC +[SDTG_VAR] +name = ""font_zoom"" +type = SLE_UINT8 +var = _font_zoom +def = ZOOM_LVL_OUT_4X +min = ZOOM_LVL_MIN +max = ZOOM_LVL_OUT_4X +cat = SC_BASIC + [SDTG_END] diff --git a/src/table/settings.ini b/src/table/settings.ini index 92e97a8ec6..beb14df239 100644 --- a/src/table/settings.ini +++ b/src/table/settings.ini @@ -2118,7 +2118,7 @@ type = SLE_UINT32 from = SLV_107 guiflags = SGF_NEWGAME_ONLY def = 10000 -min = 5000 +min = 500 max = 250000 interval = 2500 str = STR_CONFIG_SETTING_SCRIPT_MAX_OPCODES diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index 08e4f5a530..17e0c6d8e2 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -164,9 +164,11 @@ public: int lock_offset = (bottom - top - lock_size.height) / 2; DrawCompanyIcon(company, rtl ? right - this->icon_size.width - WD_FRAMERECT_RIGHT : left + WD_FRAMERECT_LEFT, top + icon_offset); +#ifdef ENABLE_NETWORK if (NetworkCompanyIsPassworded(company)) { DrawSprite(SPR_LOCK, PAL_NONE, rtl ? left + WD_FRAMERECT_LEFT : right - this->lock_size.width - WD_FRAMERECT_RIGHT, top + lock_offset); } +#endif SetDParam(0, company); SetDParam(1, company); diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 49810590f7..938acd0466 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -64,6 +64,31 @@ CargoTypes _town_cargoes_accepted; ///< Bitmap of all cargoes accepted by houses TownPool _town_pool("Town"); INSTANTIATE_POOL_METHODS(Town) +/** + * Check if a town 'owns' a bridge. + * Bridges to not directly have an owner, so we check the tiles adjacent to the bridge ends. + * If either adjacent tile belongs to the town then it will be assumed that the town built + * the bridge. + * @param tile Bridge tile to test + * @param t Town we are interested in + * @return true if town 'owns' a bridge. + */ +static bool TestTownOwnsBridge(TileIndex tile, const Town *t) +{ + if (!IsTileOwner(tile, OWNER_TOWN)) return false; + + TileIndex adjacent = tile + TileOffsByDiagDir(ReverseDiagDir(GetTunnelBridgeDirection(tile))); + bool town_owned = IsTileType(adjacent, MP_ROAD) && IsTileOwner(adjacent, OWNER_TOWN) && GetTownIndex(adjacent) == t->index; + + if (!town_owned) { + /* Or other adjacent road */ + TileIndex adjacent = tile + TileOffsByDiagDir(ReverseDiagDir(GetTunnelBridgeDirection(GetOtherTunnelBridgeEnd(tile)))); + town_owned = IsTileType(adjacent, MP_ROAD) && IsTileOwner(adjacent, OWNER_TOWN) && GetTownIndex(adjacent) == t->index; + } + + return town_owned; +} + Town::~Town() { free(this->name); @@ -95,7 +120,7 @@ Town::~Town() break; case MP_TUNNELBRIDGE: - assert_tile(!IsTileOwner(tile, OWNER_TOWN) || ClosestTownFromTile(tile, UINT_MAX) != this, tile); + assert_tile(!TestTownOwnsBridge(tile, this), tile); break; default: @@ -1245,14 +1270,14 @@ static bool GrowTownWithBridge(const Town *t, const TileIndex tile, const DiagDi const int delta = TileOffsByDiagDir(bridge_dir); if (slope == SLOPE_FLAT) { - /* Bridges starting on flat tiles are only allowed when crossing rivers or rails. */ + /* Bridges starting on flat tiles are only allowed when crossing rivers, rails or one-way roads. */ do { if (bridge_length++ >= 4) { - /* Allow to cross rivers, not big lakes, nor large amounts of rails. */ + /* Allow to cross rivers, not big lakes, nor large amounts of rails or one-way roads. */ return false; } bridge_tile += delta; - } while (IsValidTile(bridge_tile) && ((IsWaterTile(bridge_tile) && !IsSea(bridge_tile)) || (_settings_game.economy.town_bridge_over_rail && IsPlainRailTile(bridge_tile)))); + } while (IsValidTile(bridge_tile) && ((IsWaterTile(bridge_tile) && !IsSea(bridge_tile)) || IsPlainRailTile(bridge_tile) || (IsNormalRoadTile(bridge_tile) && GetDisallowedRoadDirections(bridge_tile) != DRD_NONE))); } else { do { if (bridge_length++ >= 11) { @@ -1260,7 +1285,7 @@ static bool GrowTownWithBridge(const Town *t, const TileIndex tile, const DiagDi return false; } bridge_tile += delta; - } while (IsValidTile(bridge_tile) && (IsWaterTile(bridge_tile) || (_settings_game.economy.town_bridge_over_rail && IsPlainRailTile(bridge_tile)))); + } while (IsValidTile(bridge_tile) && (IsWaterTile(bridge_tile) || IsPlainRailTile(bridge_tile) || (IsNormalRoadTile(bridge_tile) && GetDisallowedRoadDirections(bridge_tile) != DRD_NONE))); } /* no water tiles in between? */ @@ -2984,7 +3009,18 @@ CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if (d->town == t) return CMD_ERROR; } - /* Check all tiles for town ownership. */ + /* Check all tiles for town ownership. First check for bridge tiles, as + * these do not directly have an owner so we need to check adjacent + * tiles. This won't work correctly in the same loop if the adjacent + * tile was already deleted earlier in the loop. */ + for (TileIndex tile = 0; tile < MapSize(); ++tile) { + if (IsTileType(tile, MP_TUNNELBRIDGE) && TestTownOwnsBridge(tile, t)) { + CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); + if (ret.Failed()) return ret; + } + } + + /* Check all remaining tiles for town ownership. */ for (TileIndex tile = 0; tile < MapSize(); ++tile) { bool try_clear = false; switch (GetTileType(tile)) { @@ -2992,10 +3028,6 @@ CommandCost CmdDeleteTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 try_clear = HasTownOwnedRoad(tile) && GetTownIndex(tile) == t->index; break; - case MP_TUNNELBRIDGE: - try_clear = IsTileOwner(tile, OWNER_TOWN) && ClosestTownFromTile(tile, UINT_MAX) == t; - break; - case MP_HOUSE: try_clear = GetTownIndex(tile) == t->index; break; diff --git a/src/tree_map.h b/src/tree_map.h index 0764a22077..a291d563a3 100644 --- a/src/tree_map.h +++ b/src/tree_map.h @@ -13,6 +13,7 @@ #define TREE_MAP_H #include "tile_map.h" +#include "water_map.h" /** * List of tree types along all landscape types. @@ -133,6 +134,7 @@ static inline void SetTreeGroundDensity(TileIndex t, TreeGround g, uint d) assert_tile(IsTileType(t, MP_TREES), t); // XXX incomplete SB(_m[t].m2, 4, 2, d); SB(_m[t].m2, 6, 3, g); + SetWaterClass(t, g == TREE_GROUND_SHORE ? WATER_CLASS_SEA : WATER_CLASS_INVALID); } /** diff --git a/src/video/cocoa/event.mm b/src/video/cocoa/event.mm index 30b6563b68..de812a70d6 100644 --- a/src/video/cocoa/event.mm +++ b/src/video/cocoa/event.mm @@ -575,9 +575,28 @@ static bool QZ_PollEvent() _cursor.wheel++; } /* else: deltaY was 0.0 and we don't want to do anything */ - /* Set the scroll count for scrollwheel scrolling */ - _cursor.h_wheel -= (int)([ event deltaX ] * 5 * _settings_client.gui.scrollwheel_multiplier); - _cursor.v_wheel -= (int)([ event deltaY ] * 5 * _settings_client.gui.scrollwheel_multiplier); + /* Update the scroll count for 2D scrolling */ + CGFloat deltaX; + CGFloat deltaY; + + /* Use precise scrolling-specific deltas if they're supported. */ +#if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7) + if ([event respondsToSelector:@selector(hasPreciseScrollingDeltas)]) { + /* No precise deltas indicates a scroll wheel is being used, so we don't want 2D scrolling. */ + if (![ event hasPreciseScrollingDeltas ]) break; + + deltaX = [ event scrollingDeltaX ] * 0.5f; + deltaY = [ event scrollingDeltaY ] * 0.5f; + } else +#endif + { + deltaX = [ event deltaX ] * 5; + deltaY = [ event deltaY ] * 5; + } + + _cursor.h_wheel -= (int)(deltaX * _settings_client.gui.scrollwheel_multiplier); + _cursor.v_wheel -= (int)(deltaY * _settings_client.gui.scrollwheel_multiplier); + break; #if (MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5) diff --git a/src/video/sdl_v.cpp b/src/video/sdl_v.cpp index e96decb451..8493ae89fc 100644 --- a/src/video/sdl_v.cpp +++ b/src/video/sdl_v.cpp @@ -14,7 +14,6 @@ #include "../stdafx.h" #include "../openttd.h" #include "../gfx_func.h" -#include "../sdl.h" #include "../rev.h" #include "../blitter/factory.hpp" #include "../network/network.h" @@ -73,7 +72,7 @@ static void UpdatePalette(bool init = false) pal[i].unused = 0; } - SDL_CALL SDL_SetColors(_sdl_screen, pal, _local_palette.first_dirty, _local_palette.count_dirty); + SDL_SetColors(_sdl_screen, pal, _local_palette.first_dirty, _local_palette.count_dirty); if (_sdl_screen != _sdl_realscreen && init) { /* When using a shadow surface, also set our palette on the real screen. This lets SDL @@ -96,7 +95,7 @@ static void UpdatePalette(bool init = false) * palette change and the blitting below, so we only set * the real palette during initialisation. */ - SDL_CALL SDL_SetColors(_sdl_realscreen, pal, _local_palette.first_dirty, _local_palette.count_dirty); + SDL_SetColors(_sdl_realscreen, pal, _local_palette.first_dirty, _local_palette.count_dirty); } if (_sdl_screen != _sdl_realscreen && !init) { @@ -110,8 +109,8 @@ static void UpdatePalette(bool init = false) * best mapping of shadow palette colors to real palette * colors from scratch. */ - SDL_CALL SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL); - SDL_CALL SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0); + SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL); + SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0); } } @@ -157,16 +156,16 @@ static void DrawSurfaceToScreen() _num_dirty_rects = 0; if (n > MAX_DIRTY_RECTS) { if (_sdl_screen != _sdl_realscreen) { - SDL_CALL SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL); + SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL); } - SDL_CALL SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0); + SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0); } else { if (_sdl_screen != _sdl_realscreen) { for (int i = 0; i < n; i++) { - SDL_CALL SDL_BlitSurface(_sdl_screen, &_dirty_rects[i], _sdl_realscreen, &_dirty_rects[i]); + SDL_BlitSurface(_sdl_screen, &_dirty_rects[i], _sdl_realscreen, &_dirty_rects[i]); } } - SDL_CALL SDL_UpdateRects(_sdl_realscreen, n, _dirty_rects); + SDL_UpdateRects(_sdl_realscreen, n, _dirty_rects); } } @@ -206,14 +205,14 @@ static const Dimension _default_resolutions[] = { static void GetVideoModes() { - SDL_Rect **modes = SDL_CALL SDL_ListModes(NULL, SDL_SWSURFACE | SDL_FULLSCREEN); + SDL_Rect **modes = SDL_ListModes(NULL, SDL_SWSURFACE | SDL_FULLSCREEN); if (modes == NULL) usererror("sdl: no modes available"); - _all_modes = (SDL_CALL SDL_ListModes(NULL, SDL_SWSURFACE | (_fullscreen ? SDL_FULLSCREEN : 0)) == (void*)-1); + _all_modes = (SDL_ListModes(NULL, SDL_SWSURFACE | (_fullscreen ? SDL_FULLSCREEN : 0)) == (void*)-1); if (modes == (void*)-1) { int n = 0; for (uint i = 0; i < lengthof(_default_resolutions); i++) { - if (SDL_CALL SDL_VideoModeOK(_default_resolutions[i].width, _default_resolutions[i].height, 8, SDL_FULLSCREEN) != 0) { + if (SDL_VideoModeOK(_default_resolutions[i].width, _default_resolutions[i].height, 8, SDL_FULLSCREEN) != 0) { _resolutions[n] = _default_resolutions[i]; if (++n == lengthof(_resolutions)) break; } @@ -264,13 +263,6 @@ static void GetAvailableVideoMode(uint *w, uint *h) *h = _resolutions[best].height; } -#ifdef _WIN32 -/* Let's redefine the LoadBMP macro with because we are dynamically - * loading SDL and need to 'SDL_CALL' all functions */ -#undef SDL_LoadBMP -#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_CALL SDL_RWFromFile(file, "rb"), 1) -#endif - bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) { SDL_Surface *newscreen, *icon; @@ -287,14 +279,14 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) char icon_path[MAX_PATH]; if (FioFindFullPath(icon_path, lastof(icon_path), BASESET_DIR, "openttd.32.bmp") != NULL) { /* Give the application an icon */ - icon = SDL_CALL SDL_LoadBMP(icon_path); + icon = SDL_LoadBMP(icon_path); if (icon != NULL) { /* Get the colourkey, which will be magenta */ - uint32 rgbmap = SDL_CALL SDL_MapRGB(icon->format, 255, 0, 255); + uint32 rgbmap = SDL_MapRGB(icon->format, 255, 0, 255); - SDL_CALL SDL_SetColorKey(icon, SDL_SRCCOLORKEY, rgbmap); - SDL_CALL SDL_WM_SetIcon(icon, NULL); - SDL_CALL SDL_FreeSurface(icon); + SDL_SetColorKey(icon, SDL_SRCCOLORKEY, rgbmap); + SDL_WM_SetIcon(icon, NULL); + SDL_FreeSurface(icon); } } @@ -329,7 +321,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) if (want_hwpalette) DEBUG(driver, 1, "SDL: requesting hardware palette"); /* Free any previously allocated shadow surface */ - if (_sdl_screen != NULL && _sdl_screen != _sdl_realscreen) SDL_CALL SDL_FreeSurface(_sdl_screen); + if (_sdl_screen != NULL && _sdl_screen != _sdl_realscreen) SDL_FreeSurface(_sdl_screen); if (_sdl_realscreen != NULL) { if (_requested_hwpalette != want_hwpalette) { @@ -342,8 +334,8 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) * subsystem to force creating a new window. */ DEBUG(driver, 0, "SDL: Restarting SDL video subsystem, to force hwpalette change"); - SDL_CALL SDL_QuitSubSystem(SDL_INIT_VIDEO); - SDL_CALL SDL_InitSubSystem(SDL_INIT_VIDEO); + SDL_QuitSubSystem(SDL_INIT_VIDEO); + SDL_InitSubSystem(SDL_INIT_VIDEO); ClaimMousePointer(); SetupKeyboard(); } @@ -355,7 +347,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) _requested_hwpalette = want_hwpalette; /* DO NOT CHANGE TO HWSURFACE, IT DOES NOT WORK */ - newscreen = SDL_CALL SDL_SetVideoMode(w, h, bpp, SDL_SWSURFACE | (want_hwpalette ? SDL_HWPALETTE : 0) | (_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE)); + newscreen = SDL_SetVideoMode(w, h, bpp, SDL_SWSURFACE | (want_hwpalette ? SDL_HWPALETTE : 0) | (_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE)); if (newscreen == NULL) { DEBUG(driver, 0, "SDL: Couldn't allocate a window to draw on"); return false; @@ -382,7 +374,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) * we won't create a second shadow surface in this case. */ DEBUG(driver, 1, "SDL: using shadow surface"); - newscreen = SDL_CALL SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, bpp, 0, 0, 0, 0); + newscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, bpp, 0, 0, 0, 0); if (newscreen == NULL) { DEBUG(driver, 0, "SDL: Couldn't allocate a shadow surface to draw on"); return false; @@ -409,7 +401,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) InitPalette(); seprintf(caption, lastof(caption), "OpenTTD %s", _openttd_revision); - SDL_CALL SDL_WM_SetCaption(caption, caption); + SDL_WM_SetCaption(caption, caption); GameSizeChanged(); @@ -418,7 +410,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h) bool VideoDriver_SDL::ClaimMousePointer() { - SDL_CALL SDL_ShowCursor(0); + SDL_ShowCursor(0); return true; } @@ -531,18 +523,18 @@ int VideoDriver_SDL::PollEvent() { SDL_Event ev; - if (!SDL_CALL SDL_PollEvent(&ev)) return -2; + if (!SDL_PollEvent(&ev)) return -2; switch (ev.type) { case SDL_MOUSEMOTION: if (_cursor.UpdateCursorPosition(ev.motion.x, ev.motion.y, true)) { - SDL_CALL SDL_WarpMouse(_cursor.pos.x, _cursor.pos.y); + SDL_WarpMouse(_cursor.pos.x, _cursor.pos.y); } HandleMouseEvents(); break; case SDL_MOUSEBUTTONDOWN: - if (_rightclick_emulate && SDL_CALL SDL_GetModState() & KMOD_CTRL) { + if (_rightclick_emulate && SDL_GetModState() & KMOD_CTRL) { ev.button.button = SDL_BUTTON_RIGHT; } @@ -626,15 +618,23 @@ const char *VideoDriver_SDL::Start(const char * const *parm) char buf[30]; _use_hwpalette = GetDriverParamInt(parm, "hw_palette", 2); - const char *s = SdlOpen(SDL_INIT_VIDEO); - if (s != NULL) return s; + /* Just on the offchance the audio subsystem started before the video system, + * check whether any part of SDL has been initialised before getting here. + * Slightly duplicated with sound/sdl_s.cpp */ + int ret_code = 0; + if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) { + ret_code = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); + } else if (SDL_WasInit(SDL_INIT_VIDEO) == 0) { + ret_code = SDL_InitSubSystem(SDL_INIT_VIDEO); + } + if (ret_code == -1) return SDL_GetError(); GetVideoModes(); if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height)) { - return SDL_CALL SDL_GetError(); + return SDL_GetError(); } - SDL_CALL SDL_VideoDriverName(buf, sizeof buf); + SDL_VideoDriverName(buf, sizeof buf); DEBUG(driver, 1, "SDL: using driver '%s'", buf); MarkWholeScreenDirty(); @@ -647,18 +647,21 @@ const char *VideoDriver_SDL::Start(const char * const *parm) void VideoDriver_SDL::SetupKeyboard() { - SDL_CALL SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); - SDL_CALL SDL_EnableUNICODE(1); + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + SDL_EnableUNICODE(1); } void VideoDriver_SDL::Stop() { - SdlClose(SDL_INIT_VIDEO); + SDL_QuitSubSystem(SDL_INIT_VIDEO); + if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) { + SDL_Quit(); // If there's nothing left, quit SDL + } } void VideoDriver_SDL::MainLoop() { - uint32 cur_ticks = SDL_CALL SDL_GetTicks(); + uint32 cur_ticks = SDL_GetTicks(); uint32 last_cur_ticks = cur_ticks; uint32 next_tick = cur_ticks + MILLISECONDS_PER_TICK; uint32 mod; @@ -700,11 +703,11 @@ void VideoDriver_SDL::MainLoop() while (PollEvent() == -1) {} if (_exit_game) break; - mod = SDL_CALL SDL_GetModState(); + mod = SDL_GetModState(); #if SDL_VERSION_ATLEAST(1, 3, 0) - keys = SDL_CALL SDL_GetKeyboardState(&numkeys); + keys = SDL_GetKeyboardState(&numkeys); #else - keys = SDL_CALL SDL_GetKeyState(&numkeys); + keys = SDL_GetKeyState(&numkeys); #endif #if defined(_DEBUG) if (_shift_pressed) @@ -723,7 +726,7 @@ void VideoDriver_SDL::MainLoop() _fast_forward = 0; } - cur_ticks = SDL_CALL SDL_GetTicks(); + cur_ticks = SDL_GetTicks(); if (cur_ticks >= next_tick || (_fast_forward && !_pause_mode) || cur_ticks < prev_cur_ticks) { _realtime_tick += cur_ticks - last_cur_ticks; last_cur_ticks = cur_ticks; diff --git a/src/water.h b/src/water.h index cb7237fc7c..1b804720ff 100644 --- a/src/water.h +++ b/src/water.h @@ -40,6 +40,7 @@ void DrawShoreTile(Slope tileh); void MakeWaterKeepingClass(TileIndex tile, Owner o); bool RiverModifyDesertZone(TileIndex tile, void *data); +static const uint RIVER_OFFSET_DESERT_DISTANCE = 5; ///< Circular tile search radius to create non-desert around a river tile. bool IsWateredTile(TileIndex tile, Direction from); diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index 9dfd6a16f1..4af9923b80 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -434,7 +434,7 @@ CommandCost CmdBuildCanal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 MakeRiver(tile, Random()); if (_game_mode == GM_EDITOR) { TileIndex tile2 = tile; - CircularTileSearch(&tile2, 5, RiverModifyDesertZone, NULL); + CircularTileSearch(&tile2, RIVER_OFFSET_DESERT_DISTANCE, RiverModifyDesertZone, NULL); } break; diff --git a/src/water_map.h b/src/water_map.h index 0ad2f83fd4..b87f9b2a13 100644 --- a/src/water_map.h +++ b/src/water_map.h @@ -14,7 +14,6 @@ #include "depot_type.h" #include "tile_map.h" -#include "tree_map.h" /** * Bit field layout of m5 for water tiles. @@ -95,7 +94,7 @@ static inline WaterTileType GetWaterTileType(TileIndex t) */ static inline bool HasTileWaterClass(TileIndex t) { - return IsTileType(t, MP_WATER) || IsTileType(t, MP_STATION) || IsTileType(t, MP_INDUSTRY) || IsTileType(t, MP_OBJECT); + return IsTileType(t, MP_WATER) || IsTileType(t, MP_STATION) || IsTileType(t, MP_INDUSTRY) || IsTileType(t, MP_OBJECT) || IsTileType(t, MP_TREES); } /** @@ -205,7 +204,7 @@ static inline bool IsCoast(TileIndex t) */ static inline bool IsCoastTile(TileIndex t) { - return (IsTileType(t, MP_WATER) && IsCoast(t)) || (IsTileType(t, MP_TREES) && GetTreeGround(t) == TREE_GROUND_SHORE); + return (IsTileType(t, MP_WATER) && IsCoast(t)) || (IsTileType(t, MP_TREES) && GetWaterClass(t) != WATER_CLASS_INVALID); } /** diff --git a/src/widgets/framerate_widget.h b/src/widgets/framerate_widget.h index 388599537c..2c82c85e5e 100644 --- a/src/widgets/framerate_widget.h +++ b/src/widgets/framerate_widget.h @@ -22,6 +22,7 @@ enum FramerateWindowWidgets { WID_FRW_TIMES_NAMES, WID_FRW_TIMES_CURRENT, WID_FRW_TIMES_AVERAGE, + WID_FRW_SCROLLBAR, }; /** Widgets of the #FrametimeGraphWindow class. */ diff --git a/src/widgets/graph_widget.h b/src/widgets/graph_widget.h index 840a6c866e..7af5297abf 100644 --- a/src/widgets/graph_widget.h +++ b/src/widgets/graph_widget.h @@ -49,7 +49,8 @@ enum CargoPaymentRatesWidgets { WID_CPR_FOOTER, ///< Footer. WID_CPR_ENABLE_CARGOES, ///< Enable cargoes button. WID_CPR_DISABLE_CARGOES, ///< Disable cargoes button. - WID_CPR_CARGO_FIRST, ///< First cargo in the list. + WID_CPR_MATRIX, ///< Cargo list. + WID_CPR_MATRIX_SCROLLBAR,///< Cargo list scrollbar. }; /** Widget of the #CompanyLeagueWindow class. */ diff --git a/src/widgets/settings_widget.h b/src/widgets/settings_widget.h index 661f788cd7..ac64ac80ae 100644 --- a/src/widgets/settings_widget.h +++ b/src/widgets/settings_widget.h @@ -35,6 +35,7 @@ enum GameOptionsWidgets { WID_GO_BASE_MUSIC_STATUS, ///< Info about corrupted files etc. WID_GO_BASE_MUSIC_TEXTFILE, ///< Open base music readme, changelog (+1) or license (+2). WID_GO_BASE_MUSIC_DESCRIPTION = WID_GO_BASE_MUSIC_TEXTFILE + TFT_END, ///< Description of selected base music set. + WID_GO_FONT_ZOOM_DROPDOWN, ///< Dropdown for the font zoom level. }; /** Widgets of the #GameSettingsWindow class. */ diff --git a/src/window.cpp b/src/window.cpp index 05fa09044e..f8f7460b00 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2443,14 +2443,14 @@ static EventState HandleActiveWidget() return ES_HANDLED; } - /* If cursor hasn't moved, there is nothing to do. */ - if (_cursor.delta.x == 0 && _cursor.delta.y == 0) return ES_HANDLED; - /* Handle scrollbar internally, or dispatch click event */ WidgetType type = w->GetWidget(w->mouse_capture_widget)->type; if (type == NWID_VSCROLLBAR || type == NWID_HSCROLLBAR) { HandleScrollbarScrolling(w); } else { + /* If cursor hasn't moved, there is nothing to do. */ + if (_cursor.delta.x == 0 && _cursor.delta.y == 0) return ES_HANDLED; + Point pt = { _cursor.pos.x - w->left, _cursor.pos.y - w->top }; w->OnClick(pt, w->mouse_capture_widget, 0); } diff --git a/src/zoom_func.h b/src/zoom_func.h index 3aed83eadd..abf69ca61a 100644 --- a/src/zoom_func.h +++ b/src/zoom_func.h @@ -84,4 +84,24 @@ static inline int ScaleGUITrad(int value) return UnScaleGUI(value * ZOOM_LVL_BASE); } +/** + * Short-hand to apply font zoom level. + * @param value Pixel amount at #ZOOM_LVL_BEGIN (full zoom in). + * @return Pixel amount at #ZOOM_LVL_FONT (current interface size). + */ +static inline int UnScaleFont(int value) +{ + return UnScaleByZoom(value, ZOOM_LVL_FONT); +} + +/** + * Scale traditional pixel dimensions to Font zoom level. + * @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size). + * @return Pixel amount at #ZOOM_LVL_FONT (current interface size). + */ +static inline int ScaleFontTrad(int value) +{ + return UnScaleFont(value * ZOOM_LVL_BASE); +} + #endif /* ZOOM_FUNC_H */ diff --git a/src/zoom_type.h b/src/zoom_type.h index 02d678d97b..f3326ed03e 100644 --- a/src/zoom_type.h +++ b/src/zoom_type.h @@ -59,6 +59,8 @@ DECLARE_POSTFIX_INCREMENT(ZoomLevel) typedef SimpleTinyEnumT ZoomLevelByte; extern ZoomLevelByte _gui_zoom; +extern ZoomLevelByte _font_zoom; #define ZOOM_LVL_GUI (_gui_zoom) +#define ZOOM_LVL_FONT (_font_zoom) #endif /* ZOOM_TYPE_H */
    trees XXXX XXXX XXXX XXXXOOO~ ~~~~OXX~ ~~~~ OOOO OOOX XXXX XXXX ~~XX XXXX OOOO OOOO