Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a82f21f24d | ||
|
|
46908fb63a | ||
|
|
8efa99f445 | ||
|
|
c6251426d9 | ||
|
|
9026736cc1 | ||
|
|
b7a2166962 | ||
|
|
8ea68421b1 | ||
|
|
afc5962881 | ||
|
|
9239381d56 | ||
|
|
9dded61af9 | ||
|
|
8fbc5c090b | ||
|
|
00bdd316d7 | ||
|
|
f34284f1a0 | ||
|
|
c77659c995 | ||
|
|
e6877d0823 | ||
|
|
beba12f9d6 | ||
|
|
95fd4ec649 | ||
|
|
0fa41c7493 | ||
|
|
60cbcf0742 | ||
|
|
e38a4e1e57 | ||
|
|
5965f184c2 | ||
|
|
db20c7f461 | ||
|
|
e2e8872e82 | ||
|
|
4750d2836c | ||
|
|
b1c31f9500 | ||
|
|
a6879e9180 | ||
|
|
5eb7d49024 | ||
|
|
69c0332813 | ||
|
|
b11942cf44 | ||
|
|
ef6995e8d4 | ||
|
|
c0fd2b969b | ||
|
|
683778fd7a | ||
|
|
63eeadef17 | ||
|
|
e526b2ccd3 | ||
|
|
b61ef7e0d2 | ||
|
|
120d76c5c1 | ||
|
|
316ecb07ee | ||
|
|
2c21f52e1d | ||
|
|
0a8e9e9757 | ||
|
|
6bfec89fcf | ||
|
|
1f39a31eb7 | ||
|
|
abc0325ef1 | ||
|
|
54451a18c6 | ||
|
|
d3e9e8c2ce |
@@ -38,10 +38,14 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
commit-checker: {}
|
commit-checker:
|
||||||
linux-amd64-clang-3.8: {}
|
Tag: 'commit-checker'
|
||||||
linux-amd64-gcc-6: {}
|
linux-amd64-clang-3.8:
|
||||||
linux-i386-gcc-6: {}
|
Tag: 'linux-amd64-clang-3.8'
|
||||||
|
linux-amd64-gcc-6:
|
||||||
|
Tag: 'linux-amd64-gcc-6'
|
||||||
|
linux-i386-gcc-6:
|
||||||
|
Tag: 'linux-i386-gcc-6'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- template: azure-pipelines/templates/ci-git-rebase.yml
|
- template: azure-pipelines/templates/ci-git-rebase.yml
|
||||||
@@ -50,7 +54,7 @@ jobs:
|
|||||||
- template: azure-pipelines/templates/linux-build.yml
|
- template: azure-pipelines/templates/linux-build.yml
|
||||||
parameters:
|
parameters:
|
||||||
Image: compile-farm-ci
|
Image: compile-farm-ci
|
||||||
Tag: $(Agent.JobName)
|
Tag: $(Tag)
|
||||||
|
|
||||||
- job: macos
|
- job: macos
|
||||||
displayName: 'MacOS'
|
displayName: 'MacOS'
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ steps:
|
|||||||
${{ if eq(parameters.Image, 'compile-farm-ci') }}:
|
${{ if eq(parameters.Image, 'compile-farm-ci') }}:
|
||||||
displayName: 'Build and test'
|
displayName: 'Build and test'
|
||||||
# Run the commit-checker only if it is a Pull Request
|
# Run the commit-checker only if it is a Pull Request
|
||||||
condition: and(succeeded(), or(ne(variables['Agent.JobName'], 'commit-checker'), eq(variables['Build.Reason'], 'PullRequest')))
|
condition: and(succeeded(), or(not(contains(variables['Agent.JobName'], 'commit-checker')), eq(variables['Build.Reason'], 'PullRequest')))
|
||||||
inputs:
|
inputs:
|
||||||
command: 'Run an image'
|
command: 'Run an image'
|
||||||
imageName: openttd/${{ parameters.Image }}:${{ parameters.Tag }}
|
imageName: openttd/${{ parameters.Image }}:${{ parameters.Tag }}
|
||||||
|
|||||||
@@ -110,14 +110,22 @@ jobs:
|
|||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
linux-ubuntu-xenial-i386-gcc: {}
|
linux-ubuntu-xenial-i386-gcc:
|
||||||
linux-ubuntu-xenial-amd64-gcc: {}
|
Tag: 'linux-ubuntu-xenial-i386-gcc'
|
||||||
linux-ubuntu-bionic-i386-gcc: {}
|
linux-ubuntu-xenial-amd64-gcc:
|
||||||
linux-ubuntu-bionic-amd64-gcc: {}
|
Tag: 'linux-ubuntu-xenial-amd64-gcc'
|
||||||
linux-debian-jessie-i386-gcc: {}
|
linux-ubuntu-bionic-i386-gcc:
|
||||||
linux-debian-jessie-amd64-gcc: {}
|
Tag: 'linux-ubuntu-bionic-i386-gcc'
|
||||||
linux-debian-stretch-i386-gcc: {}
|
linux-ubuntu-bionic-amd64-gcc:
|
||||||
linux-debian-stretch-amd64-gcc: {}
|
Tag: 'linux-ubuntu-bionic-amd64-gcc'
|
||||||
|
linux-debian-jessie-i386-gcc:
|
||||||
|
Tag: 'linux-debian-jessie-i386-gcc'
|
||||||
|
linux-debian-jessie-amd64-gcc:
|
||||||
|
Tag: 'linux-debian-jessie-amd64-gcc'
|
||||||
|
linux-debian-stretch-i386-gcc:
|
||||||
|
Tag: 'linux-debian-stretch-i386-gcc'
|
||||||
|
linux-debian-stretch-amd64-gcc:
|
||||||
|
Tag: 'linux-debian-stretch-amd64-gcc'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- template: release-fetch-source.yml
|
- template: release-fetch-source.yml
|
||||||
@@ -125,7 +133,7 @@ jobs:
|
|||||||
parameters:
|
parameters:
|
||||||
Image: compile-farm
|
Image: compile-farm
|
||||||
ContainerCommand: '$(Build.BuildNumber)'
|
ContainerCommand: '$(Build.BuildNumber)'
|
||||||
Tag: $(Agent.JobName)
|
Tag: $(Tag)
|
||||||
- template: linux-claim-bundles.yml
|
- template: linux-claim-bundles.yml
|
||||||
- template: release-bundles.yml
|
- template: release-bundles.yml
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,40 @@
|
|||||||
|
1.9.2 (2019-07-07)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
- Change: Set default setting in server browser of "Advertised" to "Yes" (#7568)
|
||||||
|
- Change: Allow building road stops over self-owned one-way/blocked road (#7547)
|
||||||
|
- Fix #7463: Promote scroll mode setting to basic category (#7586)
|
||||||
|
- Fix: Inconsistent GUI scaling (#7539)
|
||||||
|
- Fix #7491: Send company update admin message when bankruptcy counter changes (#7492)
|
||||||
|
- Fix #7553: Check bounds when loading strings (#7554)
|
||||||
|
- Fix: Really increase the maximum number of GameScript texts to 64k (#7555)
|
||||||
|
- Fix: Crash when attempting to load old save game with GRFs set (#7546)
|
||||||
|
- Fix #6507: Don't try to load invalid depots from older savegames (#7546)
|
||||||
|
- Fix: Railtype bits were moved too late, leading to rails under bridges losing their type (#7546)
|
||||||
|
- Fix: Bounds check access to railtype_map (#7529)
|
||||||
|
- Fix: Spurious errors when using more than 32 railtypes (#7533)
|
||||||
|
- Fix #7633: Allow zero-cost track conversion to succeed (#7634)
|
||||||
|
- Fix #7577: Check if linkgraph station index is valid before dereferencing (#7583)
|
||||||
|
- Fix #7224: Drag and drop vehicle group creation does not work correctly (#7581)
|
||||||
|
- Fix #7570: Show Github URL in the crashlog window (#7571)
|
||||||
|
- Fix: Clicking on scrollbar 'thumb' moved position up instantly (#7549)
|
||||||
|
- Fix #7255: Prevent crashlog corruption by only printing the 32 most recent news messages (#7542)
|
||||||
|
- Fix #5685: Check for free wagons in ScriptVehicleList (#7617)
|
||||||
|
- Fix: Make GSGoal.QuestionClient work correctly at least for clients with ID < 2**16 (#7560)
|
||||||
|
- Fix #6666: Mismatched parentheses in RTL languages (#7480)
|
||||||
|
- Fix: [Windows] Various reliability and correctness improvements to MIDI on Windows (#7620)
|
||||||
|
|
||||||
|
|
||||||
|
1.9.1 (2019-04-08)
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
- Fix #6564: Enforce types of arguments for station name strings (#7419)
|
||||||
|
- Fix #7433: Don't use AirportSpec substitute if it's not enabled (#7435)
|
||||||
|
- Fix #7447, #7466, #7476: Missing NewGRF strings due to Action 4 feature check skipping pseudo-feature 48 (#7449)
|
||||||
|
- Fix #6222: Advanced sprite layout sometimes showed incorrect railtype ground tile. (#7460)
|
||||||
|
- Fix #7439: CompanyRemoveReason overwritten by ClientID (#7465)
|
||||||
|
- Fix: [Windows] Incorrect error handling could lead to cascading error windows (#7482)
|
||||||
|
- Fix #7478: Don't remove NewGRF objects on company take-over. (#7483)
|
||||||
|
|
||||||
|
|
||||||
1.9.0 (2019-04-01)
|
1.9.0 (2019-04-01)
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
- Fix #7411: Use industry production callback (if used) on initial industry cargo generation (#7412)
|
- Fix #7411: Use industry production callback (if used) on initial industry cargo generation (#7412)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
OpenTTD's known bugs
|
OpenTTD's known bugs
|
||||||
Last updated: 2019-04-01
|
Last updated: 2019-07-07
|
||||||
Release version: 1.9.0
|
Release version: 1.9.2
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
openttd (1.9.2-0) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream release 1.9.2
|
||||||
|
|
||||||
|
-- OpenTTD <info@openttd.org> Sun, 07 Jul 2019 23:00:00 +0200
|
||||||
|
|
||||||
|
openttd (1.9.1-0) unstable; urgency=low
|
||||||
|
|
||||||
|
* New upstream release 1.9.1
|
||||||
|
|
||||||
|
-- OpenTTD <info@openttd.org> Mon, 08 Apr 2019 20:00:00 +0100
|
||||||
|
|
||||||
openttd (1.9.0-0) unstable; urgency=low
|
openttd (1.9.0-0) unstable; urgency=low
|
||||||
|
|
||||||
* New upstream release 1.9.0
|
* New upstream release 1.9.0
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
set OPENTTD_VERSION=1.9.0
|
set OPENTTD_VERSION=1.9.2
|
||||||
set OPENSFX_VERSION=0.8.0
|
set OPENSFX_VERSION=0.8.0
|
||||||
set NOSOUND_VERSION=0.8.0
|
set NOSOUND_VERSION=0.8.0
|
||||||
set OPENGFX_VERSION=1.2.0
|
set OPENGFX_VERSION=1.2.0
|
||||||
|
|||||||
@@ -17,9 +17,9 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
Name: openttd
|
Name: openttd
|
||||||
Version: 1.9
|
Version: 1.9.2
|
||||||
Release: 0
|
Release: 0
|
||||||
%define srcver 1.9.0
|
%define srcver 1.9.2
|
||||||
Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe
|
Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe
|
||||||
License: GPL-2.0
|
License: GPL-2.0
|
||||||
Group: Amusements/Games/Strategy/Other
|
Group: Amusements/Games/Strategy/Other
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Version numbers to update
|
# Version numbers to update
|
||||||
!define APPV_MAJOR 1
|
!define APPV_MAJOR 1
|
||||||
!define APPV_MINOR 9
|
!define APPV_MINOR 9
|
||||||
!define APPV_MAINT 0
|
!define APPV_MAINT 2
|
||||||
!define APPV_BUILD 5
|
!define APPV_BUILD 0
|
||||||
!define APPV_EXTRA ""
|
!define APPV_EXTRA ""
|
||||||
|
|
||||||
!define APPNAME "OpenTTD" ; Define application name
|
!define APPNAME "OpenTTD" ; Define application name
|
||||||
|
|||||||
@@ -1284,7 +1284,7 @@ struct AIDebugWindow : public Window {
|
|||||||
case WID_AID_RELOAD_TOGGLE:
|
case WID_AID_RELOAD_TOGGLE:
|
||||||
if (ai_debug_company == OWNER_DEITY) break;
|
if (ai_debug_company == OWNER_DEITY) break;
|
||||||
/* First kill the company of the AI, then start a new one. This should start the current AI again */
|
/* First kill the company of the AI, then start a new one. This should start the current AI again */
|
||||||
DoCommandP(0, CCA_DELETE | ai_debug_company << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_DELETE | ai_debug_company << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL);
|
||||||
DoCommandP(0, CCA_NEW_AI | ai_debug_company << 16, 0, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_NEW_AI | ai_debug_company << 16, 0, CMD_COMPANY_CTRL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -805,10 +805,9 @@ void CompanyAdminRemove(CompanyID company_id, CompanyRemoveReason reason)
|
|||||||
* @param flags operation to perform
|
* @param flags operation to perform
|
||||||
* @param p1 various functionality
|
* @param p1 various functionality
|
||||||
* - bits 0..15: CompanyCtrlAction
|
* - bits 0..15: CompanyCtrlAction
|
||||||
* - bits 16..24: CompanyID
|
* - bits 16..23: CompanyID
|
||||||
* @param p2 various depending on CompanyCtrlAction
|
* - bits 24..31: CompanyRemoveReason (with CCA_DELETE)
|
||||||
* - bits 0..31: ClientID (with CCA_NEW)
|
* @param p2 ClientID
|
||||||
* - bits 0..1: CompanyRemoveReason (with CCA_DELETE)
|
|
||||||
* @param text unused
|
* @param text unused
|
||||||
* @return the cost of this operation or an error
|
* @return the cost of this operation or an error
|
||||||
*/
|
*/
|
||||||
@@ -882,7 +881,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
}
|
}
|
||||||
|
|
||||||
case CCA_DELETE: { // Delete a company
|
case CCA_DELETE: { // Delete a company
|
||||||
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p2, 0, 2);
|
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p1, 24, 8);
|
||||||
if (reason >= CRR_END) return CMD_ERROR;
|
if (reason >= CRR_END) return CMD_ERROR;
|
||||||
|
|
||||||
Company *c = Company::GetIfValid(company_id);
|
Company *c = Company::GetIfValid(company_id);
|
||||||
|
|||||||
@@ -836,7 +836,7 @@ DEF_CONSOLE_CMD(ConResetCompany)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* It is safe to remove this company */
|
/* It is safe to remove this company */
|
||||||
DoCommandP(0, CCA_DELETE | index << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_DELETE | index << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL);
|
||||||
IConsolePrint(CC_DEFAULT, "Company deleted.");
|
IConsolePrint(CC_DEFAULT, "Company deleted.");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -1213,7 +1213,7 @@ DEF_CONSOLE_CMD(ConReloadAI)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* First kill the company of the AI, then start a new one. This should start the current AI again */
|
/* First kill the company of the AI, then start a new one. This should start the current AI again */
|
||||||
DoCommandP(0, CCA_DELETE | company_id << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_DELETE | company_id << 16 | CRR_MANUAL << 24, 0,CMD_COMPANY_CTRL);
|
||||||
DoCommandP(0, CCA_NEW_AI | company_id << 16, 0, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_NEW_AI | company_id << 16, 0, CMD_COMPANY_CTRL);
|
||||||
IConsolePrint(CC_DEFAULT, "AI reloaded.");
|
IConsolePrint(CC_DEFAULT, "AI reloaded.");
|
||||||
|
|
||||||
@@ -1250,7 +1250,7 @@ DEF_CONSOLE_CMD(ConStopAI)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now kill the company of the AI. */
|
/* Now kill the company of the AI. */
|
||||||
DoCommandP(0, CCA_DELETE | company_id << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_DELETE | company_id << 16 | CRR_MANUAL << 24, 0, CMD_COMPANY_CTRL);
|
||||||
IConsolePrint(CC_DEFAULT, "AI stopped, company deleted.");
|
IConsolePrint(CC_DEFAULT, "AI stopped, company deleted.");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -12,18 +12,20 @@
|
|||||||
#ifndef ENUM_TYPE_HPP
|
#ifndef ENUM_TYPE_HPP
|
||||||
#define ENUM_TYPE_HPP
|
#define ENUM_TYPE_HPP
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
/** Some enums need to have allowed incrementing (i.e. StationClassID) */
|
/** Some enums need to have allowed incrementing (i.e. StationClassID) */
|
||||||
#define DECLARE_POSTFIX_INCREMENT(type) \
|
#define DECLARE_POSTFIX_INCREMENT(enum_type) \
|
||||||
inline type operator ++(type& e, int) \
|
inline enum_type operator ++(enum_type& e, int) \
|
||||||
{ \
|
{ \
|
||||||
type e_org = e; \
|
enum_type e_org = e; \
|
||||||
e = (type)((int)e + 1); \
|
e = (enum_type)((std::underlying_type<enum_type>::type)e + 1); \
|
||||||
return e_org; \
|
return e_org; \
|
||||||
} \
|
} \
|
||||||
inline type operator --(type& e, int) \
|
inline enum_type operator --(enum_type& e, int) \
|
||||||
{ \
|
{ \
|
||||||
type e_org = e; \
|
enum_type e_org = e; \
|
||||||
e = (type)((int)e - 1); \
|
e = (enum_type)((std::underlying_type<enum_type>::type)e - 1); \
|
||||||
return e_org; \
|
return e_org; \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -31,13 +33,13 @@
|
|||||||
|
|
||||||
/** Operators to allow to work with enum as with type safe bit set in C++ */
|
/** Operators to allow to work with enum as with type safe bit set in C++ */
|
||||||
# define DECLARE_ENUM_AS_BIT_SET(mask_t) \
|
# define DECLARE_ENUM_AS_BIT_SET(mask_t) \
|
||||||
inline mask_t operator | (mask_t m1, mask_t m2) {return (mask_t)((int)m1 | m2);} \
|
inline mask_t operator | (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type<mask_t>::type)m1 | m2);} \
|
||||||
inline mask_t operator & (mask_t m1, mask_t m2) {return (mask_t)((int)m1 & m2);} \
|
inline mask_t operator & (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type<mask_t>::type)m1 & m2);} \
|
||||||
inline mask_t operator ^ (mask_t m1, mask_t m2) {return (mask_t)((int)m1 ^ m2);} \
|
inline mask_t operator ^ (mask_t m1, mask_t m2) {return (mask_t)((std::underlying_type<mask_t>::type)m1 ^ m2);} \
|
||||||
inline mask_t& operator |= (mask_t& m1, mask_t m2) {m1 = m1 | m2; return m1;} \
|
inline mask_t& operator |= (mask_t& m1, mask_t m2) {m1 = m1 | m2; return m1;} \
|
||||||
inline mask_t& operator &= (mask_t& m1, mask_t m2) {m1 = m1 & m2; return m1;} \
|
inline mask_t& operator &= (mask_t& m1, mask_t m2) {m1 = m1 & m2; return m1;} \
|
||||||
inline mask_t& operator ^= (mask_t& m1, mask_t m2) {m1 = m1 ^ m2; return m1;} \
|
inline mask_t& operator ^= (mask_t& m1, mask_t m2) {m1 = m1 ^ m2; return m1;} \
|
||||||
inline mask_t operator ~(mask_t m) {return (mask_t)(~(int)m);}
|
inline mask_t operator ~(mask_t m) {return (mask_t)(~(std::underlying_type<mask_t>::type)m);}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -303,7 +303,7 @@ char *CrashLog::LogGamelog(char *buffer, const char *last) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes any recent news messages to the buffer.
|
* Writes up to 32 recent news messages to the buffer, with the most recent first.
|
||||||
* @param buffer The begin where to write at.
|
* @param buffer The begin where to write at.
|
||||||
* @param last The last position in the buffer to write to.
|
* @param last The last position in the buffer to write to.
|
||||||
* @return the position of the \c '\0' character after the buffer.
|
* @return the position of the \c '\0' character after the buffer.
|
||||||
@@ -312,7 +312,8 @@ char *CrashLog::LogRecentNews(char *buffer, const char *last) const
|
|||||||
{
|
{
|
||||||
buffer += seprintf(buffer, last, "Recent news messages:\n");
|
buffer += seprintf(buffer, last, "Recent news messages:\n");
|
||||||
|
|
||||||
for (NewsItem *news = _oldest_news; news != NULL; news = news->next) {
|
int i = 0;
|
||||||
|
for (NewsItem *news = _latest_news; i < 32 && news != NULL; news = news->prev, i++) {
|
||||||
YearMonthDay ymd;
|
YearMonthDay ymd;
|
||||||
ConvertDateToYMD(news->date, &ymd);
|
ConvertDateToYMD(news->date, &ymd);
|
||||||
buffer += seprintf(buffer, last, "(%i-%02i-%02i) StringID: %u, Type: %u, Ref1: %u, %u, Ref2: %u, %u\n",
|
buffer += seprintf(buffer, last, "(%i-%02i-%02i) StringID: %u, Type: %u, Ref1: %u, %u, Ref2: %u, %u\n",
|
||||||
|
|||||||
@@ -572,8 +572,10 @@ static void CompanyCheckBankrupt(Company *c)
|
|||||||
{
|
{
|
||||||
/* If the company has money again, it does not go bankrupt */
|
/* If the company has money again, it does not go bankrupt */
|
||||||
if (c->money - c->current_loan >= -_economy.max_loan) {
|
if (c->money - c->current_loan >= -_economy.max_loan) {
|
||||||
|
int previous_months_of_bankruptcy = CeilDiv(c->months_of_bankruptcy, 3);
|
||||||
c->months_of_bankruptcy = 0;
|
c->months_of_bankruptcy = 0;
|
||||||
c->bankrupt_asked = 0;
|
c->bankrupt_asked = 0;
|
||||||
|
if (previous_months_of_bankruptcy != 0) CompanyAdminUpdate(c);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,10 +644,15 @@ static void CompanyCheckBankrupt(Company *c)
|
|||||||
* that changing the current company is okay. In case of single
|
* that changing the current company is okay. In case of single
|
||||||
* player we are sure (the above check) that we are not the local
|
* player we are sure (the above check) that we are not the local
|
||||||
* company and thus we won't be moved. */
|
* company and thus we won't be moved. */
|
||||||
if (!_networking || _network_server) DoCommandP(0, CCA_DELETE | (c->index << 16), CRR_BANKRUPT, CMD_COMPANY_CTRL);
|
if (!_networking || _network_server) {
|
||||||
|
DoCommandP(0, CCA_DELETE | (c->index << 16) | (CRR_BANKRUPT << 24), 0, CMD_COMPANY_CTRL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CeilDiv(c->months_of_bankruptcy, 3) != CeilDiv(c->months_of_bankruptcy - 1, 3)) CompanyAdminUpdate(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ GameStrings *LoadTranslations()
|
|||||||
/** Compile the language. */
|
/** Compile the language. */
|
||||||
void GameStrings::Compile()
|
void GameStrings::Compile()
|
||||||
{
|
{
|
||||||
StringData data(1);
|
StringData data(32);
|
||||||
StringListReader master_reader(data, this->raw_strings[0], true, false);
|
StringListReader master_reader(data, this->raw_strings[0], true, false);
|
||||||
master_reader.ParseFile();
|
master_reader.ParseFile();
|
||||||
if (_errors != 0) throw std::exception();
|
if (_errors != 0) throw std::exception();
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ public:
|
|||||||
LEErrorCode status = LE_NO_ERROR;
|
LEErrorCode status = LE_NO_ERROR;
|
||||||
/* ParagraphLayout does not copy "buff", so it must stay valid.
|
/* ParagraphLayout does not copy "buff", so it must stay valid.
|
||||||
* "runs" is copied according to the ICU source, but the documentation does not specify anything, so this might break somewhen. */
|
* "runs" is copied according to the ICU source, but the documentation does not specify anything, so this might break somewhen. */
|
||||||
icu::ParagraphLayout *p = new icu::ParagraphLayout(buff, length, &runs, NULL, NULL, NULL, _current_text_dir == TD_RTL ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR, false, status);
|
icu::ParagraphLayout *p = new icu::ParagraphLayout(buff, length, &runs, NULL, NULL, NULL, _current_text_dir == TD_RTL ? 1 : 0, false, status);
|
||||||
if (status != LE_NO_ERROR) {
|
if (status != LE_NO_ERROR) {
|
||||||
delete p;
|
delete p;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
27
src/goal.cpp
27
src/goal.cpp
@@ -236,10 +236,11 @@ CommandCost CmdSetGoalCompleted(TileIndex tile, DoCommandFlag flags, uint32 p1,
|
|||||||
* @param flags type of operation
|
* @param flags type of operation
|
||||||
* @param p1 various bitstuffed elements
|
* @param p1 various bitstuffed elements
|
||||||
* - p1 = (bit 0 - 15) - Unique ID to use for this question.
|
* - p1 = (bit 0 - 15) - Unique ID to use for this question.
|
||||||
* - p1 = (bit 16 - 23) - Company or client for which this question is.
|
* - p1 = (bit 16 - 31) - Company or client for which this question is.
|
||||||
* - p1 = (bit 24 - 25) - Question type.
|
* @param p2 various bitstuffed elements
|
||||||
* - p1 = (bit 31) - Question target: 0 - company, 1 - client.
|
* - p2 = (bit 0 - 17) - Buttons of the question.
|
||||||
* @param p2 Buttons of the question.
|
* - p2 = (bit 29 - 30) - Question type.
|
||||||
|
* - p2 = (bit 31) - Question target: 0 - company, 1 - client.
|
||||||
* @param text Text of the question.
|
* @param text Text of the question.
|
||||||
* @return the cost of this operation or an error
|
* @return the cost of this operation or an error
|
||||||
*/
|
*/
|
||||||
@@ -248,36 +249,38 @@ CommandCost CmdGoalQuestion(TileIndex tile, DoCommandFlag flags, uint32 p1, uint
|
|||||||
uint16 uniqueid = (GoalType)GB(p1, 0, 16);
|
uint16 uniqueid = (GoalType)GB(p1, 0, 16);
|
||||||
CompanyID company = (CompanyID)GB(p1, 16, 8);
|
CompanyID company = (CompanyID)GB(p1, 16, 8);
|
||||||
#ifdef ENABLE_NETWORK
|
#ifdef ENABLE_NETWORK
|
||||||
ClientIndex client = (ClientIndex)GB(p1, 16, 8);
|
ClientID client = (ClientID)GB(p1, 16, 16);
|
||||||
#endif
|
#endif
|
||||||
byte type = GB(p1, 24, 2);
|
|
||||||
bool is_client = HasBit(p1, 31);
|
assert_compile(GOAL_QUESTION_BUTTON_COUNT < 29);
|
||||||
|
uint32 button_mask = GB(p2, 0, GOAL_QUESTION_BUTTON_COUNT);
|
||||||
|
byte type = GB(p2, 29, 2);
|
||||||
|
bool is_client = HasBit(p2, 31);
|
||||||
|
|
||||||
if (_current_company != OWNER_DEITY) return CMD_ERROR;
|
if (_current_company != OWNER_DEITY) return CMD_ERROR;
|
||||||
if (StrEmpty(text)) return CMD_ERROR;
|
if (StrEmpty(text)) return CMD_ERROR;
|
||||||
if (is_client) {
|
if (is_client) {
|
||||||
#ifdef ENABLE_NETWORK
|
#ifdef ENABLE_NETWORK
|
||||||
if (!NetworkClientInfo::IsValidID(client)) return CMD_ERROR;
|
if (NetworkClientInfo::GetByClientID(client) == nullptr) return CMD_ERROR;
|
||||||
#else
|
#else
|
||||||
return CMD_ERROR;
|
return CMD_ERROR;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR;
|
if (company != INVALID_COMPANY && !Company::IsValidID(company)) return CMD_ERROR;
|
||||||
}
|
}
|
||||||
if (CountBits(p2) < 1 || CountBits(p2) > 3) return CMD_ERROR;
|
if (CountBits(button_mask) < 1 || CountBits(button_mask) > 3) return CMD_ERROR;
|
||||||
if (p2 >= (1 << GOAL_QUESTION_BUTTON_COUNT)) return CMD_ERROR;
|
|
||||||
if (type >= GOAL_QUESTION_TYPE_COUNT) return CMD_ERROR;
|
if (type >= GOAL_QUESTION_TYPE_COUNT) return CMD_ERROR;
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
if (is_client) {
|
if (is_client) {
|
||||||
#ifdef ENABLE_NETWORK
|
#ifdef ENABLE_NETWORK
|
||||||
if (NetworkClientInfo::Get(client)->client_id != _network_own_client_id) return CommandCost();
|
if (client != _network_own_client_id) return CommandCost();
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (company == INVALID_COMPANY && !Company::IsValidID(_local_company)) return CommandCost();
|
if (company == INVALID_COMPANY && !Company::IsValidID(_local_company)) return CommandCost();
|
||||||
if (company != INVALID_COMPANY && company != _local_company) return CommandCost();
|
if (company != INVALID_COMPANY && company != _local_company) return CommandCost();
|
||||||
}
|
}
|
||||||
ShowGoalQuestion(uniqueid, type, p2, text);
|
ShowGoalQuestion(uniqueid, type, button_mask, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
|
|||||||
@@ -536,7 +536,7 @@ CommandCost CmdAddVehicleGroup(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
|||||||
|
|
||||||
if (new_g == NEW_GROUP) {
|
if (new_g == NEW_GROUP) {
|
||||||
/* Create new group. */
|
/* Create new group. */
|
||||||
CommandCost ret = CmdCreateGroup(0, flags, v->type, 0, NULL);
|
CommandCost ret = CmdCreateGroup(0, flags, v->type, INVALID_GROUP, NULL);
|
||||||
if (ret.Failed()) return ret;
|
if (ret.Failed()) return ret;
|
||||||
|
|
||||||
new_g = _new_group_id;
|
new_g = _new_group_id;
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ STR_SORT_BY_TIMETABLE_DELAY :تاخير جد
|
|||||||
STR_SORT_BY_FACILITY :نوع المحطة
|
STR_SORT_BY_FACILITY :نوع المحطة
|
||||||
STR_SORT_BY_RATING_MAX :اعلى نسبة شحن
|
STR_SORT_BY_RATING_MAX :اعلى نسبة شحن
|
||||||
STR_SORT_BY_RATING_MIN :اقل نسبة شحن
|
STR_SORT_BY_RATING_MIN :اقل نسبة شحن
|
||||||
STR_SORT_BY_ENGINE_ID :نوع المحرك (قياسي(
|
STR_SORT_BY_ENGINE_ID :نوع المحرك (قياسي)
|
||||||
STR_SORT_BY_COST :التكلفة
|
STR_SORT_BY_COST :التكلفة
|
||||||
STR_SORT_BY_POWER :الطاقة
|
STR_SORT_BY_POWER :الطاقة
|
||||||
STR_SORT_BY_TRACTIVE_EFFORT :قوة الجذب
|
STR_SORT_BY_TRACTIVE_EFFORT :قوة الجذب
|
||||||
@@ -1147,7 +1147,7 @@ STR_CONFIG_SETTING_INDUSTRY_DENSITY :الكثافة
|
|||||||
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :إختر مقدار الصناعات التي يجب تكوينها وعلى اي مستوى يجب ان تكون خلال اللعبة
|
STR_CONFIG_SETTING_INDUSTRY_DENSITY_HELPTEXT :إختر مقدار الصناعات التي يجب تكوينها وعلى اي مستوى يجب ان تكون خلال اللعبة
|
||||||
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :ارتفاع خط الثلج: {STRING}
|
STR_CONFIG_SETTING_SNOWLINE_HEIGHT :ارتفاع خط الثلج: {STRING}
|
||||||
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :تحكم على اي ارتفاع يبدأ نزول الثلج في المناطق القطبية,تؤثر الثلوج على مستوى تطور القطاع الصناعي ونمو المدن
|
STR_CONFIG_SETTING_SNOWLINE_HEIGHT_HELPTEXT :تحكم على اي ارتفاع يبدأ نزول الثلج في المناطق القطبية,تؤثر الثلوج على مستوى تطور القطاع الصناعي ونمو المدن
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :خشونة التضاريس (صفر التكوين فقط ) :({STRING}
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN :خشونة التضاريس: {STRING}
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis only)إختر تكرار الهضبات: الاراض المستويه تحتوي على البضع منها,هضبات موزعه عرضيا اكثر,الاراض الوعرة تحتوي الكثير من الهضاب,التي من الممكن ان تكون متكررة
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_HELPTEXT :(TerraGenesis only)إختر تكرار الهضبات: الاراض المستويه تحتوي على البضع منها,هضبات موزعه عرضيا اكثر,الاراض الوعرة تحتوي الكثير من الهضاب,التي من الممكن ان تكون متكررة
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :ناعم جدا
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :ناعم جدا
|
||||||
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :ناعم
|
STR_CONFIG_SETTING_ROUGHNESS_OF_TERRAIN_SMOOTH :ناعم
|
||||||
@@ -1946,7 +1946,7 @@ STR_RAIL_TOOLBAR_MAGLEV_CONSTRUCTION_CAPTION :بناء الس
|
|||||||
|
|
||||||
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}بناء سكة حديد
|
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}بناء سكة حديد
|
||||||
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}بناء سكة القطار باستخدام البناء التلقائي
|
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}بناء سكة القطار باستخدام البناء التلقائي
|
||||||
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}بناء ورشة قطارات (لصيانة و شراء القطارات).
|
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}بناء ورشة قطارات (لصيانة و شراء القطارات)
|
||||||
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}غير السكة الى نقطة عبور
|
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}غير السكة الى نقطة عبور
|
||||||
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}بناء محطة قطار. مفتاح كنترول يسمح بضم المحطات
|
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}بناء محطة قطار. مفتاح كنترول يسمح بضم المحطات
|
||||||
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}بناء إشارات السكك الحديدية.
|
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}بناء إشارات السكك الحديدية.
|
||||||
@@ -2028,7 +2028,7 @@ STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAMWAY_SECTION :{BLACK}بناء
|
|||||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}بناء الطرق باستخدام النظام الآلي
|
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOROAD :{BLACK}بناء الطرق باستخدام النظام الآلي
|
||||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}بناء سكة القطار باستخدام النظام الآلي
|
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_AUTOTRAM :{BLACK}بناء سكة القطار باستخدام النظام الآلي
|
||||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}بناء ورشة صيانة لعربات الطرق (لشراء و صيانة العربات).
|
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}بناء ورشة صيانة لعربات الطرق (لشراء و صيانة العربات).
|
||||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}بناء ورشة لصيانة عربات الترام (لشراء و صيانة عربات الترام).
|
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}بناء ورشة لصيانة عربات الترام (لشراء و صيانة عربات الترام)
|
||||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}بناء محطة باصات
|
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_BUS_STATION :{BLACK}بناء محطة باصات
|
||||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}بناء محطة ركاب ترام.
|
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_PASSENGER_TRAM_STATION :{BLACK}بناء محطة ركاب ترام.
|
||||||
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}بناء محطة تحميل عربات. مفتاح كنترول يسمح بمجاورة المحطات.
|
STR_ROAD_TOOLBAR_TOOLTIP_BUILD_TRUCK_LOADING_BAY :{BLACK}بناء محطة تحميل عربات. مفتاح كنترول يسمح بمجاورة المحطات.
|
||||||
@@ -2590,7 +2590,8 @@ STR_EDIT_SIGN_SIGN_OSKTITLE :{BLACK}ادخل
|
|||||||
# Town directory window
|
# Town directory window
|
||||||
STR_TOWN_DIRECTORY_CAPTION :{WHITE}مدن/ بلدات
|
STR_TOWN_DIRECTORY_CAPTION :{WHITE}مدن/ بلدات
|
||||||
STR_TOWN_DIRECTORY_NONE :{ORANGE}-بدون-
|
STR_TOWN_DIRECTORY_NONE :{ORANGE}-بدون-
|
||||||
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{TOWN}{BLACK} ) {COMMA})
|
STR_TOWN_DIRECTORY_TOWN :{ORANGE}{RLE}{TOWN}{BLACK} {RLM}({COMMA})
|
||||||
|
STR_TOWN_DIRECTORY_CITY :{ORANGE}{RLE}{TOWN}{YELLOW} (مدينة){BLACK} {RLM}({COMMA})
|
||||||
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}اسم المدينة - اضغط على الاسم لتوسيط الشاشة عليها. اضغط + كنترول لفتح شاشة عرض جديدة للضاحية.
|
STR_TOWN_DIRECTORY_LIST_TOOLTIP :{BLACK}اسم المدينة - اضغط على الاسم لتوسيط الشاشة عليها. اضغط + كنترول لفتح شاشة عرض جديدة للضاحية.
|
||||||
STR_TOWN_POPULATION :{BLACK}سكان العالم: {COMMA}
|
STR_TOWN_POPULATION :{BLACK}سكان العالم: {COMMA}
|
||||||
|
|
||||||
@@ -2678,7 +2679,7 @@ STR_STATION_LIST_STATION :{YELLOW}{STATIO
|
|||||||
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
|
STR_STATION_LIST_WAYPOINT :{YELLOW}{WAYPOINT}
|
||||||
STR_STATION_LIST_NONE :{YELLOW}- بدون -
|
STR_STATION_LIST_NONE :{YELLOW}- بدون -
|
||||||
STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}اختر جميع المرافق
|
STR_STATION_LIST_SELECT_ALL_FACILITIES :{BLACK}اختر جميع المرافق
|
||||||
STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}اختر كل انواع الشحن (حتى غير المنتظرة(
|
STR_STATION_LIST_SELECT_ALL_TYPES :{BLACK}اختر كل انواع الشحن (حتى غير المنتظرة)
|
||||||
STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}لا يوجد اي شحنة منتظرة
|
STR_STATION_LIST_NO_WAITING_CARGO :{BLACK}لا يوجد اي شحنة منتظرة
|
||||||
|
|
||||||
# Station view window
|
# Station view window
|
||||||
@@ -2897,7 +2898,7 @@ STR_PURCHASE_INFO_SPEED_OCEAN :{BLACK}السر
|
|||||||
STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}السرعة في القناة/النهر: {GOLD}{VELOCITY}
|
STR_PURCHASE_INFO_SPEED_CANAL :{BLACK}السرعة في القناة/النهر: {GOLD}{VELOCITY}
|
||||||
STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}تكلفة التشغيل: {GOLD}{CURRENCY_LONG}/ سنة
|
STR_PURCHASE_INFO_RUNNINGCOST :{BLACK}تكلفة التشغيل: {GOLD}{CURRENCY_LONG}/ سنة
|
||||||
STR_PURCHASE_INFO_CAPACITY :{BLACK}السعة: {GOLD}{CARGO_LONG} {STRING}
|
STR_PURCHASE_INFO_CAPACITY :{BLACK}السعة: {GOLD}{CARGO_LONG} {STRING}
|
||||||
STR_PURCHASE_INFO_REFITTABLE :)قابل لتغيير(
|
STR_PURCHASE_INFO_REFITTABLE :(قابل لتغيي)
|
||||||
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}تصميم: {GOLD}{NUM}{BLACK} العمر الافتراضي: {GOLD}{COMMA} سنة
|
STR_PURCHASE_INFO_DESIGNED_LIFE :{BLACK}تصميم: {GOLD}{NUM}{BLACK} العمر الافتراضي: {GOLD}{COMMA} سنة
|
||||||
STR_PURCHASE_INFO_RELIABILITY :{BLACK}الاعتمادية القصوى: {GOLD}{COMMA}%
|
STR_PURCHASE_INFO_RELIABILITY :{BLACK}الاعتمادية القصوى: {GOLD}{COMMA}%
|
||||||
STR_PURCHASE_INFO_COST :{BLACK}التكلفة: {GOLD}{CURRENCY_LONG}
|
STR_PURCHASE_INFO_COST :{BLACK}التكلفة: {GOLD}{CURRENCY_LONG}
|
||||||
@@ -3193,7 +3194,7 @@ STR_VEHICLE_DETAILS_TRAIN_TOTAL_CARGO_TOOLTIP :{BLACK} عرض
|
|||||||
STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}السعة: {LTBLUE}
|
STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}السعة: {LTBLUE}
|
||||||
|
|
||||||
# Vehicle refit
|
# Vehicle refit
|
||||||
STR_REFIT_CAPTION :{WHITE}{VEHICLE} )تغيير(
|
STR_REFIT_CAPTION :{WHITE}{VEHICLE} (تغيير)
|
||||||
STR_REFIT_TITLE :{GOLD}اختر نوع الحمولة ...
|
STR_REFIT_TITLE :{GOLD}اختر نوع الحمولة ...
|
||||||
STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}السعة الجديدة: {GOLD}{CARGO_LONG}{}{BLACK}تكلفة التغيير: {RED}{CURRENCY_LONG}
|
STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}السعة الجديدة: {GOLD}{CARGO_LONG}{}{BLACK}تكلفة التغيير: {RED}{CURRENCY_LONG}
|
||||||
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}السعة الجديدة: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}تكلفة اعادة التهيئة: {RED}{CURRENCY_LONG}
|
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}السعة الجديدة: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}تكلفة اعادة التهيئة: {RED}{CURRENCY_LONG}
|
||||||
@@ -3415,7 +3416,7 @@ STR_TIMETABLE_RESET_LATENESS :{BLACK}اعد
|
|||||||
STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}عدل وقت التاخير للعداد حتى تصل المركبة في الوقت المحدد
|
STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}عدل وقت التاخير للعداد حتى تصل المركبة في الوقت المحدد
|
||||||
|
|
||||||
STR_TIMETABLE_AUTOFILL :{BLACK}تهيئة تلقائية
|
STR_TIMETABLE_AUTOFILL :{BLACK}تهيئة تلقائية
|
||||||
STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}املأ الجدولة تلقائيا بقيم الرحلة التالية (مفتاح كنترول لمحاولة ابقائ وقت الانتظار).
|
STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}مفتاح كنترول لمحاولة ابقائ وقت الانتظار (املأ الجدولة تلقائيا بقيم الرحلة التالية)
|
||||||
|
|
||||||
STR_TIMETABLE_EXPECTED :{BLACK}متوقع
|
STR_TIMETABLE_EXPECTED :{BLACK}متوقع
|
||||||
STR_TIMETABLE_SCHEDULED :{BLACK}مجدول
|
STR_TIMETABLE_SCHEDULED :{BLACK}مجدول
|
||||||
|
|||||||
@@ -4586,7 +4586,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... гэ
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... няправільны кірунак дарогі
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... няправільны кірунак дарогі
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... на прахадных прыпынках нельга рабіць павароты
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... на прахадных прыпынках нельга рабіць павароты
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... на прахадных прыпынках нельга рабіць скрыжаваньнi
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... на прахадных прыпынках нельга рабіць скрыжаваньнi
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... дарога аднабаковая ці заблакавана
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Немагчыма выдаліць частку станцыi...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Немагчыма выдаліць частку станцыi...
|
||||||
|
|||||||
@@ -4276,7 +4276,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... é u
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... rua na direção errada
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... rua na direção errada
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... paradas "drive-thru" não podem ter esquinas
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... paradas "drive-thru" não podem ter esquinas
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... paradas "drive-thru" não podem ter junções
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... paradas "drive-thru" não podem ter junções
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... rua é mão única ou está bloqueada
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossível remover parte da estação...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossível remover parte da estação...
|
||||||
|
|||||||
@@ -4317,7 +4317,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... aque
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... sentit de la carretera en la direcció incorrecta
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... sentit de la carretera en la direcció incorrecta
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les estacions d'autobús de pas no poden tenir cantonades
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les estacions d'autobús de pas no poden tenir cantonades
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les estacions d'autobús de pas no poden tenir interseccions
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les estacions d'autobús de pas no poden tenir interseccions
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la carretera és d'un sol sentit o està blocada.
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No es pot treure part de la estació...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No es pot treure part de la estació...
|
||||||
|
|||||||
@@ -3120,7 +3120,7 @@ STR_NEWGRF_LIST_MISSING :{RED}Nedostaju
|
|||||||
STR_NEWGRF_BROKEN :{WHITE}Ponašanje NewGRF '{0:STRING}' će vjerojatno uzrokovati deharmonizaciju i/ili rušenje igre
|
STR_NEWGRF_BROKEN :{WHITE}Ponašanje NewGRF '{0:STRING}' će vjerojatno uzrokovati deharmonizaciju i/ili rušenje igre
|
||||||
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Promijenjen status motoriziranog vagona za '{1:ENGINE}' kad vozilo nije u spremištu.
|
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Promijenjen status motoriziranog vagona za '{1:ENGINE}' kad vozilo nije u spremištu.
|
||||||
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Ovo mijenja dužinu vozila za '{1:ENGINE}' kada vozilo nije unutar spremišta
|
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Ovo mijenja dužinu vozila za '{1:ENGINE}' kada vozilo nije unutar spremišta
|
||||||
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Promijenilo je kapacitet vozila za '{1:ENGINE}' kada nije u spremšta ili se remontira
|
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Promijenilo je kapacitet vozila za '{1:ENGINE}' kada nije u spremištu ili se prenamjenjuje
|
||||||
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Vlak'{VEHICLE}' koji pripada tvrtci '{COMPANY}' neispravne je dužine. Uzrok problema je vjerojatno u NewGRF datotekama. Igra će se možda deharmonizirati ili srušiti
|
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Vlak'{VEHICLE}' koji pripada tvrtci '{COMPANY}' neispravne je dužine. Uzrok problema je vjerojatno u NewGRF datotekama. Igra će se možda deharmonizirati ili srušiti
|
||||||
|
|
||||||
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' daje netočne informacije
|
STR_NEWGRF_BUGGY :{WHITE}NewGRF '{0:STRING}' daje netočne informacije
|
||||||
@@ -3903,9 +3903,9 @@ STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Nosivost
|
|||||||
STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Prenamijeni)
|
STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Prenamijeni)
|
||||||
STR_REFIT_TITLE :{GOLD}Odaberi vrstu tereta za prijevoz:
|
STR_REFIT_TITLE :{GOLD}Odaberi vrstu tereta za prijevoz:
|
||||||
STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova nosivost: {GOLD}{CARGO_LONG}{}{BLACK}Cijena prenamjene: {RED}{CURRENCY_LONG}
|
STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Nova nosivost: {GOLD}{CARGO_LONG}{}{BLACK}Cijena prenamjene: {RED}{CURRENCY_LONG}
|
||||||
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Novi kapacitet: {GOLD}{CARGO_LONG}{}{BLACK}Prihod od remonta: {GREEN}{CURRENCY_LONG}
|
STR_REFIT_NEW_CAPACITY_INCOME_FROM_REFIT :{BLACK}Novi kapacitet: {GOLD}{CARGO_LONG}{}{BLACK}Prihod od prenamjene: {GREEN}{CURRENCY_LONG}
|
||||||
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Novi kapacitet: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Trošak remonta: {RED}{CURRENCY_LONG}
|
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Novi kapacitet: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Cijena prenamjene: {RED}{CURRENCY_LONG}
|
||||||
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Novi kapacitet: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Prihod od remonta: {GREEN}{CURRENCY_LONG}
|
STR_REFIT_NEW_CAPACITY_INCOME_FROM_AIRCRAFT_REFIT :{BLACK}Novi kapacitet: {GOLD}{CARGO_LONG}, {GOLD}{CARGO_LONG}{}{BLACK}Prihod od prenamjene: {GREEN}{CURRENCY_LONG}
|
||||||
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Odaberi vozila za remont. Povlačenje mišem dopušta odabir više vozila. Klik na prazninu će označiti cijelo vozilo. Ctrl+Klik će označiti vozilo i niz koji slijedi.
|
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Odaberi vozila za remont. Povlačenje mišem dopušta odabir više vozila. Klik na prazninu će označiti cijelo vozilo. Ctrl+Klik će označiti vozilo i niz koji slijedi.
|
||||||
|
|
||||||
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Odaberi vrstu tereta koju će vlak prevoziti
|
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Odaberi vrstu tereta koju će vlak prevoziti
|
||||||
@@ -4413,7 +4413,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ovo
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... cesta je orijentirana u krivom smjeru
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... cesta je orijentirana u krivom smjeru
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... prolazne postaje ne mogu imati zavoje
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... prolazne postaje ne mogu imati zavoje
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... prolazne postaje ne mogu imati raskrižja
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... prolazne postaje ne mogu imati raskrižja
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... cesta je jednosmjerna ili je blokirana
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nije moguće ukloniti dio postaje...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nije moguće ukloniti dio postaje...
|
||||||
|
|||||||
@@ -4339,7 +4339,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... tato
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... silnice je otočena jiným směrem
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... silnice je otočena jiným směrem
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... průjezdné zastávky nemohou být v zatáčce
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... průjezdné zastávky nemohou být v zatáčce
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... průjezdné zastávky nemohou být na křižovatce
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... průjezdné zastávky nemohou být na křižovatce
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... silnice je jednosměrná nebo uzavřená.
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nelze odstranit část stanice...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nelze odstranit část stanice...
|
||||||
|
|||||||
@@ -4317,7 +4317,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... denn
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... vejen peger i den forkerte retning
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... vejen peger i den forkerte retning
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive-through stops kan ikke have hjørner
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive-through stops kan ikke have hjørner
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive-through stops kan ikke have kryds
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive-through stops kan ikke have kryds
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}vejen er ensrettet eller blokeret
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ikke fjerne en del af en station...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ikke fjerne en del af en station...
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ STR_QUANTITY_NOTHING :
|
|||||||
STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}passagier{P "" s}
|
STR_QUANTITY_PASSENGERS :{COMMA}{NBSP}passagier{P "" s}
|
||||||
STR_QUANTITY_COAL :{WEIGHT_LONG} kolen
|
STR_QUANTITY_COAL :{WEIGHT_LONG} kolen
|
||||||
STR_QUANTITY_MAIL :{COMMA}{NBSP}zak{P "" ken} post
|
STR_QUANTITY_MAIL :{COMMA}{NBSP}zak{P "" ken} post
|
||||||
STR_QUANTITY_OIL :{VOLUME_LONG} Vaten olie
|
STR_QUANTITY_OIL :{VOLUME_LONG} vaten olie
|
||||||
STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}stuk{P "" s} vee
|
STR_QUANTITY_LIVESTOCK :{COMMA}{NBSP}stuk{P "" s} vee
|
||||||
STR_QUANTITY_GOODS :{COMMA}{NBSP}krat{P "" ten} goederen
|
STR_QUANTITY_GOODS :{COMMA}{NBSP}krat{P "" ten} goederen
|
||||||
STR_QUANTITY_GRAIN :{WEIGHT_LONG} graan
|
STR_QUANTITY_GRAIN :{WEIGHT_LONG} graan
|
||||||
@@ -2856,7 +2856,7 @@ STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Verander
|
|||||||
# Map generation progress
|
# Map generation progress
|
||||||
STR_GENERATION_WORLD :{WHITE}Bezig met wereldontwikkeling...
|
STR_GENERATION_WORLD :{WHITE}Bezig met wereldontwikkeling...
|
||||||
STR_GENERATION_ABORT :{BLACK}Stop
|
STR_GENERATION_ABORT :{BLACK}Stop
|
||||||
STR_GENERATION_ABORT_CAPTION :{WHITE}Stop Wereldontwikkeling
|
STR_GENERATION_ABORT_CAPTION :{WHITE}Wereldontwikkeling stoppen
|
||||||
STR_GENERATION_ABORT_MESSAGE :{YELLOW}Weet je zeker dat je de actie wilt stoppen?
|
STR_GENERATION_ABORT_MESSAGE :{YELLOW}Weet je zeker dat je de actie wilt stoppen?
|
||||||
STR_GENERATION_PROGRESS :{WHITE}{NUM}% compleet
|
STR_GENERATION_PROGRESS :{WHITE}{NUM}% compleet
|
||||||
STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM}
|
STR_GENERATION_PROGRESS_NUM :{BLACK}{NUM} / {NUM}
|
||||||
@@ -4317,7 +4317,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... deze
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... weg is in de verkeerde richting
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... weg is in de verkeerde richting
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... doorrij haltes kunnen geen bochten hebben
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... doorrij haltes kunnen geen bochten hebben
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... doorrij haltes kunnen geen kruisingen hebben
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... doorrij haltes kunnen geen kruisingen hebben
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... weg is eenrichtingsverkeer of geblokkeerd
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan deel van station niet verwijderen...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan deel van station niet verwijderen...
|
||||||
|
|||||||
@@ -4317,7 +4317,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... this
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive through stops can't have junctions
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive through stops can't have junctions
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... road is one way or blocked
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Can't remove part of station...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Can't remove part of station...
|
||||||
|
|||||||
@@ -4317,7 +4317,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... this
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... road facing in the wrong direction
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... drive through stops can't have corners
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive through stops can't have junctions
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... drive through stops can't have junctions
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... road is one way or blocked
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Can't remove part of station...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Can't remove part of station...
|
||||||
|
|||||||
@@ -4284,7 +4284,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... see
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... tee on vales suunas
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... tee on vales suunas
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... nurgad ei saa läbisõidupeatustes olla
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... nurgad ei saa läbisõidupeatustes olla
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... ristmikud ei saa olla läbisõidupeatustes
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... ristmikud ei saa olla läbisõidupeatustes
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... tee on ühesuunaline või blokeeritud
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Siinset jaamablokki ei saa lammutada...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Siinset jaamablokki ei saa lammutada...
|
||||||
|
|||||||
@@ -4317,7 +4317,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... kunt
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... tie on väärin päin
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... tie on väärin päin
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... läpiajettavissa pysäkeissä ei voi olla mutkia
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... läpiajettavissa pysäkeissä ei voi olla mutkia
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... läpiajettavissa pysäkeissä ei voi olla risteyksiä
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... läpiajettavissa pysäkeissä ei voi olla risteyksiä
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... tie on yksisuuntainen tai suljettu
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Aseman osaa ei voi poistaa...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Aseman osaa ei voi poistaa...
|
||||||
|
|||||||
@@ -3025,13 +3025,14 @@ STR_NEWGRF_LIST_MISSING :{RED}Modules ma
|
|||||||
STR_NEWGRF_BROKEN :{WHITE}Le comportement du NewGRF "{0:STRING}" peut provoquer des erreurs de synchronisation et/ou des plantages
|
STR_NEWGRF_BROKEN :{WHITE}Le comportement du NewGRF "{0:STRING}" peut provoquer des erreurs de synchronisation et/ou des plantages
|
||||||
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Il a modifié l'état de wagon motorisé pour "{1:ENGINE}" en dehors du dépôt
|
STR_NEWGRF_BROKEN_POWERED_WAGON :{WHITE}Il a modifié l'état de wagon motorisé pour "{1:ENGINE}" en dehors du dépôt
|
||||||
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Il a modifié la longueur de véhicule pour "{1:ENGINE}" en dehors du dépôt
|
STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Il a modifié la longueur de véhicule pour "{1:ENGINE}" en dehors du dépôt
|
||||||
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Il a changé la capacité pour '{1:ENGINE}' hors d'un dépôt ou d'un réaménagement
|
STR_NEWGRF_BROKEN_CAPACITY :{WHITE}Il a changé la capacité pour "{1:ENGINE}" hors d'un dépôt ou d'un réaménagement
|
||||||
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Le train "{VEHICLE}" appartenant à "{COMPANY}" a une longueur invalide. Cela est probablement dû à des problèmes avec des NewGRFs, et peut provoquer des erreurs de synchronisation ou planter le jeu.
|
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Le train "{VEHICLE}" appartenant à "{COMPANY}" a une longueur invalide. Cela est probablement dû à des problèmes avec des NewGRFs, et peut provoquer des erreurs de synchronisation ou planter le jeu.
|
||||||
|
|
||||||
STR_NEWGRF_BUGGY :{WHITE}Le module NewGRF "{0:STRING}" fournit une information incorrecte
|
STR_NEWGRF_BUGGY :{WHITE}Le module NewGRF "{0:STRING}" fournit une information incorrecte
|
||||||
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Les informations de cargaison/réaménagement pour "{1:ENGINE}" après sa construction sont différentes de celles de la liste d'achat. Cela peut causer un échec de réaménagement lors de l'auto-renouvellement/remplacement.
|
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Les informations de cargaison/réaménagement pour "{1:ENGINE}" après sa construction sont différentes de celles de la liste d'achat. Cela peut causer un échec de réaménagement lors de l'auto-renouvellement/remplacement.
|
||||||
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}"{1:STRING}" a causé une boucle infinie dans la fonction de rappel de production
|
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}"{1:STRING}" a causé une boucle infinie dans la fonction de rappel de production
|
||||||
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}Callback {1:HEX} a retourné un résultat invalide {2:HEX}
|
STR_NEWGRF_BUGGY_UNKNOWN_CALLBACK_RESULT :{WHITE}La fonction de rappel {1:HEX} a retourné un résultat invalide {2:HEX}
|
||||||
|
STR_NEWGRF_BUGGY_INVALID_CARGO_PRODUCTION_CALLBACK :{WHITE}"{1:STRING}" a renvoyé un type de cargaison invalide dans la fonction de rappel de production à {2:HEX}
|
||||||
|
|
||||||
# 'User removed essential NewGRFs'-placeholders for stuff without specs
|
# 'User removed essential NewGRFs'-placeholders for stuff without specs
|
||||||
STR_NEWGRF_INVALID_CARGO :<marchandise invalide>
|
STR_NEWGRF_INVALID_CARGO :<marchandise invalide>
|
||||||
@@ -4317,7 +4318,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... cett
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... mauvaise orientation de la route
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... mauvaise orientation de la route
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les arrêts ne peuvent pas avoir de virages
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... les arrêts ne peuvent pas avoir de virages
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les arrêts ne peuvent pas avoir de jonctions
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... les arrêts ne peuvent pas avoir de jonctions
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la route est à sens unique ou bloquée
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossible de supprimer une partie de la gare...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossible de supprimer une partie de la gare...
|
||||||
|
|||||||
@@ -4496,7 +4496,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... tha
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... tha comhair an rathaid cearr
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... tha comhair an rathaid cearr
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... chan urrainn dha dh’oiseanan a bhith aig stèiseanan draibhidh troimhe
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... chan urrainn dha dh’oiseanan a bhith aig stèiseanan draibhidh troimhe
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... chan urrainn dha ghoibhlean a bhith aig stèiseanan draibhidh troimhe
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... chan urrainn dha ghoibhlean a bhith aig stèiseanan draibhidh troimhe
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... rathad aon-shligheach no bacte
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Cha ghabh pàirt dhen stèisean toirt air falbh...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Cha ghabh pàirt dhen stèisean toirt air falbh...
|
||||||
|
|||||||
@@ -4302,7 +4302,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... dies
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... Straße verläuft in die falsche Richtung
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... Straße verläuft in die falsche Richtung
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... Bus- und Lkw-Haltestellen können nicht um die Kurve gehen
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... Bus- und Lkw-Haltestellen können nicht um die Kurve gehen
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... Bus- und Lkw-Haltestellen können keine Abzweigung haben
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... Bus- und Lkw-Haltestellen können keine Abzweigung haben
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}...Einbahnstraße oder blockierter Weg
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Dieser Teil der Station kann nicht entfernt werden...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Dieser Teil der Station kann nicht entfernt werden...
|
||||||
|
|||||||
@@ -4430,7 +4430,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... αυ
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... ο δρόμος βλέπει σε λάθος κατεύθυνση
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... ο δρόμος βλέπει σε λάθος κατεύθυνση
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... οι μη τερματικοί σταθμοί δε μπορούν να έχουν στροφές
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... οι μη τερματικοί σταθμοί δε μπορούν να έχουν στροφές
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... οι μη τερματικοί σταθμοί δε μπορούν να έχουν διασταυρώσεις
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... οι μη τερματικοί σταθμοί δε μπορούν να έχουν διασταυρώσεις
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... ο δρόμος είναι μονόδρομος η μπλοκαρισμένος
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Δεν μπορεί να αφαιρεθεί μέρος του σταθμού...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Δεν μπορεί να αφαιρεθεί μέρος του σταθμού...
|
||||||
|
|||||||
@@ -4275,7 +4275,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... כב
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}הכביש פונה לכיוון לא נכון...
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}הכביש פונה לכיוון לא נכון...
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... לתחנות "על הדרך" לא יכולות להיות פינות
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... לתחנות "על הדרך" לא יכולות להיות פינות
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... לתחנות "על הדרך" לא יכולות להיות צמתים
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... לתחנות "על הדרך" לא יכולות להיות צמתים
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... הדרך חד כיוונית או חסומה
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}... לא ניתן לבטל חלק מהתחנה
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}... לא ניתן לבטל חלק מהתחנה
|
||||||
|
|||||||
@@ -4381,7 +4381,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ez e
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... az út a másik irányba vezet
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... az út a másik irányba vezet
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... áthaladó megállóhelyeken nem lehet kanyar
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... áthaladó megállóhelyeken nem lehet kanyar
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... áthaladó megállóhelyeken nem lehet elágazás
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... áthaladó megállóhelyeken nem lehet elágazás
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... az út egyirányú vagy blokkolt
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nem lehet eltávolítani az állomás részét...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nem lehet eltávolítani az állomás részét...
|
||||||
|
|||||||
@@ -4249,7 +4249,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... jala
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... menghadap pada arah yang salah
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... menghadap pada arah yang salah
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... terminal lintas-lalu tak bisa memiliki sudut
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... terminal lintas-lalu tak bisa memiliki sudut
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... terminal lintas-lalu tak bisa memiliki simpangan
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... terminal lintas-lalu tak bisa memiliki simpangan
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... jalannya satu arah atau terhalang
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Tidak dapat menghapus bagian dari stasiun...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Tidak dapat menghapus bagian dari stasiun...
|
||||||
|
|||||||
@@ -4347,7 +4347,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ques
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... strada rivolta nella direzione sbagliata
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... strada rivolta nella direzione sbagliata
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... le fermate passanti non possono trovarsi in curva
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... le fermate passanti non possono trovarsi in curva
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... le fermate passanti non possono avere raccordi
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... le fermate passanti non possono avere raccordi
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la strada è bloccata o a senso unico
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossibile rimuovere parte della stazione...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Impossibile rimuovere parte della stazione...
|
||||||
|
|||||||
@@ -4318,7 +4318,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... 여
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... 도로의 방향과 일치하지 않습니다.
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... 도로의 방향과 일치하지 않습니다.
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... 도로 통과 정류장은 곡선도로에 건설할 수 없습니다.
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... 도로 통과 정류장은 곡선도로에 건설할 수 없습니다.
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... 도로 통과 정류장은 교차로에 건설할 수 없습니다.
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... 도로 통과 정류장은 교차로에 건설할 수 없습니다.
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... 도로가 일방통행이거나 막혔습니다
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}역의 일부를 제거할 수 없습니다...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}역의 일부를 제거할 수 없습니다...
|
||||||
|
|||||||
@@ -4479,7 +4479,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... via
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... viae directio non convenit
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... viae directio non convenit
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... stationi perviae non licet esse curva
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... stationi perviae non licet esse curva
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... stationi perviae non licet compita habere
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... stationi perviae non licet compita habere
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... via est monodromus vel obstructa
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Non licet partem stationis removere...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Non licet partem stationis removere...
|
||||||
|
|||||||
@@ -4276,7 +4276,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... d'St
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... Strooss geet an dei falsch Richtung
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... Strooss geet an dei falsch Richtung
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... Duerchfahrtstops kënnen keng Kéiren hunn
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... Duerchfahrtstops kënnen keng Kéiren hunn
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... Duerchfahrtstops kënnen keng Kräizungen hunn
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... Duerchfahrtstops kënnen keng Kräizungen hunn
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... Einbahnstrooss oder blockéiert
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kann den Deel vun der Gare net ofrappen...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kann den Deel vun der Gare net ofrappen...
|
||||||
|
|||||||
@@ -4322,7 +4322,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... denn
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... veien vender i feil retning
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... veien vender i feil retning
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... gjennomkjøringsstopper kan ikke ha hjørner
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... gjennomkjøringsstopper kan ikke ha hjørner
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... gjennomkjøringsstopper kan ikke ha kryss
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... gjennomkjøringsstopper kan ikke ha kryss
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... veien er enveiskjørt eller blokkert
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ikke fjerne del av stasjonen...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ikke fjerne del av stasjonen...
|
||||||
|
|||||||
@@ -4666,7 +4666,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ta d
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... droga jest zorientowana w złym kierunku
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... droga jest zorientowana w złym kierunku
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... przystanki przelotowe nie mogą mieć zakrętów
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... przystanki przelotowe nie mogą mieć zakrętów
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... przystanki przelotowe nie mogą mieć skrzyżowań
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... przystanki przelotowe nie mogą mieć skrzyżowań
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... droga jest jednokierunkowa lub zablokowana
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nie można usunąć części stacji...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Nie można usunąć części stacji...
|
||||||
|
|||||||
@@ -4318,7 +4318,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... estrada orientada na direcção incorrecta
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... estrada orientada na direcção incorrecta
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... estações de passagem não podem ter curvas
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... estações de passagem não podem ter curvas
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... estações de passagem não podem ter cruzamentos
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... estações de passagem não podem ter cruzamentos
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... estrada de sentido único ou bloqueada
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Não é possível remover parte da estação...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Não é possível remover parte da estação...
|
||||||
|
|||||||
@@ -4507,7 +4507,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... эт
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... неверное направление дороги
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... неверное направление дороги
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... на проходных остановках нельзя делать повороты
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... на проходных остановках нельзя делать повороты
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... на проходных остановках нельзя делать перекрёстки
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... на проходных остановках нельзя делать перекрёстки
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... дорога односторонняя или заблокирована
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Невозможно удалить часть станции...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Невозможно удалить часть станции...
|
||||||
|
|||||||
@@ -4443,7 +4443,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ova
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... ulica je okrenuta u drugom pravcu
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... ulica je okrenuta u drugom pravcu
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... stajalište ne može biti na krivini
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... stajalište ne može biti na krivini
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... stajalište ne može biti na raskrsnici
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... stajalište ne može biti na raskrsnici
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... put je jednosmeran ili blokiran.
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Deo stanice se ne može ukloniti...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Deo stanice se ne može ukloniti...
|
||||||
|
|||||||
@@ -4268,7 +4268,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... carretera en la dirección incorrecta
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... carretera en la dirección incorrecta
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... las estaciones de autobús de paso no pueden tener esquinas
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... las estaciones de autobús de paso no pueden tener esquinas
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... las estaciones de autobús de paso no pueden tener intersecciones
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... las estaciones de autobús de paso no pueden tener intersecciones
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... carretera de un solo sentido o bloqueada
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No se puede retirar parte de la estación...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No se puede retirar parte de la estación...
|
||||||
|
|||||||
@@ -4318,7 +4318,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... esta
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... carretera en el sentido incorrecto
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... carretera en el sentido incorrecto
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... las estaciones y paradas intermedias no pueden ponerse sobre esquinas
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... las estaciones y paradas intermedias no pueden ponerse sobre esquinas
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... las estaciones y paradas intermedias no pueden ponerse sobre intersecciones
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... las estaciones y paradas intermedias no pueden ponerse sobre intersecciones
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... la carretera está bloqueada o es de un solo sentido
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No se puede quitar parte de la estación...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}No se puede quitar parte de la estación...
|
||||||
|
|||||||
@@ -4301,7 +4301,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... dett
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... vägen pekar i fel riktning
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... vägen pekar i fel riktning
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... genomfartshållplatser kan inte ha gatuhörn
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... genomfartshållplatser kan inte ha gatuhörn
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... genomfartshållplatser kan inte ha korsningar
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... genomfartshållplatser kan inte ha korsningar
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... vägen är enkelriktad eller blockerad
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ej ta bort del av station...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Kan ej ta bort del av station...
|
||||||
|
|||||||
@@ -4310,7 +4310,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... bu y
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... yol yanlış yönde
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... yol yanlış yönde
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... yol üstü duraklar köşe üzerine inşa edilemez
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... yol üstü duraklar köşe üzerine inşa edilemez
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... yol üstü duraklar kavşak üzerine inşa edilemez
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... yol üstü duraklar kavşak üzerine inşa edilemez
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... yol tek yön ya da engellenmiş
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}İstasyonun parçasi kaldırılamaz...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}İstasyonun parçasi kaldırılamaz...
|
||||||
|
|||||||
@@ -4446,7 +4446,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... ця
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... дорога не в тому напрямку
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... дорога не в тому напрямку
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... проїзні зупинки не можуть мати поворотів
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... проїзні зупинки не можуть мати поворотів
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... проїзні зупинки не можуть мати перехресть
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... проїзні зупинки не можуть мати перехресть
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... дорога одностороння або заблокована
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Не можна зруйнувати частину станції...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Не можна зруйнувати частину станції...
|
||||||
|
|||||||
@@ -4279,7 +4279,6 @@ STR_ERROR_DRIVE_THROUGH_ON_TOWN_ROAD :{WHITE}... đâ
|
|||||||
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... đường quay mặt sai hướng
|
STR_ERROR_DRIVE_THROUGH_DIRECTION :{WHITE}... đường quay mặt sai hướng
|
||||||
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... đi qua điểm dừng không thể đi qua góc
|
STR_ERROR_DRIVE_THROUGH_CORNER :{WHITE}... đi qua điểm dừng không thể đi qua góc
|
||||||
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... đi qua điểm dừng không thể có ngã rẽ
|
STR_ERROR_DRIVE_THROUGH_JUNCTION :{WHITE}... đi qua điểm dừng không thể có ngã rẽ
|
||||||
STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD :{WHITE}... đường 1 chiều hoặc bị chặn
|
|
||||||
|
|
||||||
# Station destruction related errors
|
# Station destruction related errors
|
||||||
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Không thể xoá bỏ một phần của ga...
|
STR_ERROR_CAN_T_REMOVE_PART_OF_STATION :{WHITE}Không thể xoá bỏ một phần của ga...
|
||||||
|
|||||||
@@ -205,6 +205,16 @@ void ZoomInOrOutToCursorWindow(bool in, Window *w)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FixTitleGameZoom()
|
||||||
|
{
|
||||||
|
if (_game_mode != GM_MENU) return;
|
||||||
|
|
||||||
|
ViewPort *vp = FindWindowByClass(WC_MAIN_WINDOW)->viewport;
|
||||||
|
vp->zoom = _gui_zoom;
|
||||||
|
vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
|
||||||
|
vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct NWidgetPart _nested_main_window_widgets[] = {
|
static const struct NWidgetPart _nested_main_window_widgets[] = {
|
||||||
NWidget(NWID_VIEWPORT, INVALID_COLOUR, WID_M_VIEWPORT), SetResize(1, 1),
|
NWidget(NWID_VIEWPORT, INVALID_COLOUR, WID_M_VIEWPORT), SetResize(1, 1),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -538,19 +538,19 @@ static void TransmitChannelMsg(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, by
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TransmitSysex(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, byte *&msg_start, size_t &remaining)
|
static void TransmitSysex(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, const byte *&msg_start, size_t &remaining)
|
||||||
{
|
{
|
||||||
/* Find end of message. */
|
/* Find end of message. */
|
||||||
byte *msg_end = msg_start;
|
const byte *msg_end = msg_start;
|
||||||
while (*msg_end != MIDIST_ENDSYSEX) msg_end++;
|
while (*msg_end != MIDIST_ENDSYSEX) msg_end++;
|
||||||
msg_end++; // Also include SysEx end byte.
|
msg_end++; // Also include SysEx end byte.
|
||||||
|
|
||||||
if (buffer->PackUnstructured(rt, 0, msg_end - msg_start, msg_start) == E_OUTOFMEMORY) {
|
if (buffer->PackUnstructured(rt, 0, msg_end - msg_start, const_cast<LPBYTE>(msg_start)) == E_OUTOFMEMORY) {
|
||||||
/* Buffer is full, clear it and try again. */
|
/* Buffer is full, clear it and try again. */
|
||||||
_port->PlayBuffer(buffer);
|
_port->PlayBuffer(buffer);
|
||||||
buffer->Flush();
|
buffer->Flush();
|
||||||
|
|
||||||
buffer->PackUnstructured(rt, 0, msg_end - msg_start, msg_start);
|
buffer->PackUnstructured(rt, 0, msg_end - msg_start, const_cast<LPBYTE>(msg_start));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update position in buffer. */
|
/* Update position in buffer. */
|
||||||
@@ -558,9 +558,11 @@ static void TransmitSysex(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, byte *&
|
|||||||
msg_start = msg_end;
|
msg_start = msg_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TransmitSysexConst(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, byte *msg_start, size_t length)
|
static void TransmitStandardSysex(IDirectMusicBuffer *buffer, REFERENCE_TIME rt, MidiSysexMessage msg)
|
||||||
{
|
{
|
||||||
TransmitSysex(buffer, rt, msg_start, length);
|
size_t length = 0;
|
||||||
|
const byte *data = MidiGetStandardSysexMessage(msg, length);
|
||||||
|
TransmitSysex(buffer, rt, data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Transmit 'Note off' messages to all MIDI channels. */
|
/** Transmit 'Note off' messages to all MIDI channels. */
|
||||||
@@ -571,27 +573,16 @@ static void TransmitNotesOff(IDirectMusicBuffer *buffer, REFERENCE_TIME block_ti
|
|||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_SUSTAINSW, 0);
|
TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_SUSTAINSW, 0);
|
||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_MODE_RESETALLCTRL, 0);
|
TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_MODE_RESETALLCTRL, 0);
|
||||||
}
|
}
|
||||||
/* Explicitly flush buffer to make sure the note off messages are processed
|
|
||||||
* before we send any additional control messages. */
|
/* Performing a GM reset stops all sound and resets all parameters. */
|
||||||
|
TransmitStandardSysex(_buffer, block_time + 20, MidiSysexMessage::ResetGM);
|
||||||
|
TransmitStandardSysex(_buffer, block_time + 30, MidiSysexMessage::RolandSetReverb);
|
||||||
|
|
||||||
|
/* Explicitly flush buffer to make sure the messages are processed,
|
||||||
|
* as we want sound to stop immediately. */
|
||||||
_port->PlayBuffer(_buffer);
|
_port->PlayBuffer(_buffer);
|
||||||
_buffer->Flush();
|
_buffer->Flush();
|
||||||
|
|
||||||
/* Some songs change the "Pitch bend range" registered parameter. If
|
|
||||||
* this doesn't get reset, everything else will start sounding wrong. */
|
|
||||||
for (int ch = 0; ch < 16; ch++) {
|
|
||||||
/* Running status, only need status for first message
|
|
||||||
* Select RPN 00.00, set value to 02.00, and de-select again */
|
|
||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDIST_CONTROLLER | ch, MIDICT_RPN_SELECT_LO, 0x00);
|
|
||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDICT_RPN_SELECT_HI, 0x00);
|
|
||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDICT_DATAENTRY, 0x02);
|
|
||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDICT_DATAENTRY_LO, 0x00);
|
|
||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDICT_RPN_SELECT_LO, 0x7F);
|
|
||||||
TransmitChannelMsg(_buffer, block_time + 10, MIDICT_RPN_SELECT_HI, 0x7F);
|
|
||||||
|
|
||||||
_port->PlayBuffer(_buffer);
|
|
||||||
_buffer->Flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wait until message time has passed. */
|
/* Wait until message time has passed. */
|
||||||
Sleep(Clamp((block_time - cur_time) / MS_TO_REFTIME, 5, 1000));
|
Sleep(Clamp((block_time - cur_time) / MS_TO_REFTIME, 5, 1000));
|
||||||
}
|
}
|
||||||
@@ -616,13 +607,6 @@ static void MidiThreadProc(void *)
|
|||||||
REFERENCE_TIME cur_time;
|
REFERENCE_TIME cur_time;
|
||||||
clock->GetTime(&cur_time);
|
clock->GetTime(&cur_time);
|
||||||
|
|
||||||
/* Standard "Enable General MIDI" message */
|
|
||||||
static byte gm_enable_sysex[] = { 0xF0, 0x7E, 0x00, 0x09, 0x01, 0xF7 };
|
|
||||||
TransmitSysexConst(_buffer, cur_time, &gm_enable_sysex[0], sizeof(gm_enable_sysex));
|
|
||||||
/* Roland-specific reverb room control, used by the original game */
|
|
||||||
static byte roland_reverb_sysex[] = { 0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x30, 0x02, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x09, 0xF7 };
|
|
||||||
TransmitSysexConst(_buffer, cur_time, &roland_reverb_sysex[0], sizeof(roland_reverb_sysex));
|
|
||||||
|
|
||||||
_port->PlayBuffer(_buffer);
|
_port->PlayBuffer(_buffer);
|
||||||
_buffer->Flush();
|
_buffer->Flush();
|
||||||
|
|
||||||
@@ -665,7 +649,7 @@ static void MidiThreadProc(void *)
|
|||||||
_playback.do_start = false;
|
_playback.do_start = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Turn all notes off in case we are seeking between music titles. */
|
/* Reset playback device between songs. */
|
||||||
clock->GetTime(&cur_time);
|
clock->GetTime(&cur_time);
|
||||||
TransmitNotesOff(_buffer, block_time, cur_time);
|
TransmitNotesOff(_buffer, block_time, cur_time);
|
||||||
|
|
||||||
@@ -751,7 +735,7 @@ static void MidiThreadProc(void *)
|
|||||||
block_time = playback_start_time + block.realtime * MIDITIME_TO_REFTIME;
|
block_time = playback_start_time + block.realtime * MIDITIME_TO_REFTIME;
|
||||||
DEBUG(driver, 9, "DMusic thread: Streaming block " PRINTF_SIZE " (cur=" OTTD_PRINTF64 ", block=" OTTD_PRINTF64 ")", current_block, (long long)(current_time / MS_TO_REFTIME), (long long)(block_time / MS_TO_REFTIME));
|
DEBUG(driver, 9, "DMusic thread: Streaming block " PRINTF_SIZE " (cur=" OTTD_PRINTF64 ", block=" OTTD_PRINTF64 ")", current_block, (long long)(current_time / MS_TO_REFTIME), (long long)(block_time / MS_TO_REFTIME));
|
||||||
|
|
||||||
byte *data = block.data.Begin();
|
const byte *data = block.data.Begin();
|
||||||
size_t remaining = block.data.Length();
|
size_t remaining = block.data.Length();
|
||||||
byte last_status = 0;
|
byte last_status = 0;
|
||||||
while (remaining > 0) {
|
while (remaining > 0) {
|
||||||
|
|||||||
@@ -141,4 +141,19 @@ enum MidiController {
|
|||||||
MIDICT_MODE_POLY = 127,
|
MIDICT_MODE_POLY = 127,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Well-known MIDI system exclusive message values for use with the MidiGetStandardSysexMessage function. */
|
||||||
|
enum class MidiSysexMessage {
|
||||||
|
/** Reset device to General MIDI defaults */
|
||||||
|
ResetGM,
|
||||||
|
/** Reset device to (Roland) General Standard defaults */
|
||||||
|
ResetGS,
|
||||||
|
/** Reset device to (Yamaha) XG defaults */
|
||||||
|
ResetXG,
|
||||||
|
/** Set up Roland SoundCanvas reverb room as TTD does */
|
||||||
|
RolandSetReverb,
|
||||||
|
};
|
||||||
|
|
||||||
|
const byte *MidiGetStandardSysexMessage(MidiSysexMessage msg, size_t &length);
|
||||||
|
|
||||||
#endif /* MUSIC_MIDI_H */
|
#endif /* MUSIC_MIDI_H */
|
||||||
|
|||||||
@@ -27,6 +27,37 @@
|
|||||||
|
|
||||||
static MidiFile *_midifile_instance = NULL;
|
static MidiFile *_midifile_instance = NULL;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieve a well-known MIDI system exclusive message.
|
||||||
|
* @param msg Which sysex message to retrieve
|
||||||
|
* @param[out] length Receives the length of the returned buffer
|
||||||
|
* @return Pointer to byte buffer with sysex message
|
||||||
|
*/
|
||||||
|
const byte *MidiGetStandardSysexMessage(MidiSysexMessage msg, size_t &length)
|
||||||
|
{
|
||||||
|
static byte reset_gm_sysex[] = { 0xF0, 0x7E, 0x7F, 0x09, 0x01, 0xF7 };
|
||||||
|
static byte reset_gs_sysex[] = { 0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x00, 0x7F, 0x00, 0x41, 0xF7 };
|
||||||
|
static byte reset_xg_sysex[] = { 0xF0, 0x43, 0x10, 0x4C, 0x00, 0x00, 0x7E, 0x00, 0xF7 };
|
||||||
|
static byte roland_reverb_sysex[] = { 0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x30, 0x02, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x09, 0xF7 };
|
||||||
|
|
||||||
|
switch (msg) {
|
||||||
|
case MidiSysexMessage::ResetGM:
|
||||||
|
length = lengthof(reset_gm_sysex);
|
||||||
|
return reset_gm_sysex;
|
||||||
|
case MidiSysexMessage::ResetGS:
|
||||||
|
length = lengthof(reset_gs_sysex);
|
||||||
|
return reset_gs_sysex;
|
||||||
|
case MidiSysexMessage::ResetXG:
|
||||||
|
length = lengthof(reset_xg_sysex);
|
||||||
|
return reset_xg_sysex;
|
||||||
|
case MidiSysexMessage::RolandSetReverb:
|
||||||
|
length = lengthof(roland_reverb_sysex);
|
||||||
|
return roland_reverb_sysex;
|
||||||
|
default:
|
||||||
|
NOT_REACHED();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Owning byte buffer readable as a stream.
|
* Owning byte buffer readable as a stream.
|
||||||
* RAII-compliant to make teardown in error situations easier.
|
* RAII-compliant to make teardown in error situations easier.
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ static struct {
|
|||||||
CRITICAL_SECTION lock; ///< synchronization for playback status fields
|
CRITICAL_SECTION lock; ///< synchronization for playback status fields
|
||||||
|
|
||||||
bool playing; ///< flag indicating that playback is active
|
bool playing; ///< flag indicating that playback is active
|
||||||
bool do_start; ///< flag for starting playback of next_file at next opportunity
|
int do_start; ///< flag for starting playback of next_file at next opportunity
|
||||||
bool do_stop; ///< flag for stopping playback at next opportunity
|
bool do_stop; ///< flag for stopping playback at next opportunity
|
||||||
byte current_volume; ///< current effective volume setting
|
byte current_volume; ///< current effective volume setting
|
||||||
byte new_volume; ///< volume setting to change to
|
byte new_volume; ///< volume setting to change to
|
||||||
@@ -73,10 +73,10 @@ static void TransmitChannelMsg(byte status, byte p1, byte p2 = 0)
|
|||||||
midiOutShortMsg(_midi.midi_out, status | (p1 << 8) | (p2 << 16));
|
midiOutShortMsg(_midi.midi_out, status | (p1 << 8) | (p2 << 16));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TransmitSysex(byte *&msg_start, size_t &remaining)
|
static void TransmitSysex(const byte *&msg_start, size_t &remaining)
|
||||||
{
|
{
|
||||||
/* find end of message */
|
/* find end of message */
|
||||||
byte *msg_end = msg_start;
|
const byte *msg_end = msg_start;
|
||||||
while (*msg_end != MIDIST_ENDSYSEX) msg_end++;
|
while (*msg_end != MIDIST_ENDSYSEX) msg_end++;
|
||||||
msg_end++; /* also include sysex end byte */
|
msg_end++; /* also include sysex end byte */
|
||||||
|
|
||||||
@@ -97,9 +97,11 @@ static void TransmitSysex(byte *&msg_start, size_t &remaining)
|
|||||||
msg_start = msg_end;
|
msg_start = msg_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void TransmitSysexConst(byte *msg_start, size_t length)
|
static void TransmitStandardSysex(MidiSysexMessage msg)
|
||||||
{
|
{
|
||||||
TransmitSysex(msg_start, length);
|
size_t length = 0;
|
||||||
|
const byte *data = MidiGetStandardSysexMessage(msg, length);
|
||||||
|
TransmitSysex(data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -108,82 +110,94 @@ static void TransmitSysexConst(byte *msg_start, size_t length)
|
|||||||
*/
|
*/
|
||||||
void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DWORD_PTR)
|
void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DWORD_PTR)
|
||||||
{
|
{
|
||||||
/* Try to check playback status changes.
|
/* Ensure only one timer callback is running at once, and prevent races on status flags */
|
||||||
* If _midi is already locked, skip checking for this cycle and try again
|
if (!TryEnterCriticalSection(&_midi.lock)) return;
|
||||||
* next cycle, instead of waiting for locks in the realtime callback. */
|
|
||||||
if (TryEnterCriticalSection(&_midi.lock)) {
|
/* check for stop */
|
||||||
/* check for stop */
|
if (_midi.do_stop) {
|
||||||
if (_midi.do_stop) {
|
DEBUG(driver, 2, "Win32-MIDI: timer: do_stop is set");
|
||||||
DEBUG(driver, 2, "Win32-MIDI: timer: do_stop is set");
|
midiOutReset(_midi.midi_out);
|
||||||
midiOutReset(_midi.midi_out);
|
_midi.playing = false;
|
||||||
_midi.playing = false;
|
_midi.do_stop = false;
|
||||||
_midi.do_stop = false;
|
LeaveCriticalSection(&_midi.lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for start/restart/change song */
|
||||||
|
if (_midi.do_start != 0) {
|
||||||
|
/* Have a delay between playback start steps, prevents jumbled-together notes at the start of song */
|
||||||
|
if (timeGetTime() - _midi.playback_start_time < 50) {
|
||||||
LeaveCriticalSection(&_midi.lock);
|
LeaveCriticalSection(&_midi.lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
DEBUG(driver, 2, "Win32-MIDI: timer: do_start step %d", _midi.do_start);
|
||||||
|
|
||||||
/* check for start/restart/change song */
|
if (_midi.do_start == 1) {
|
||||||
if (_midi.do_start) {
|
/* Send "all notes off" */
|
||||||
DEBUG(driver, 2, "Win32-MIDI: timer: do_start is set");
|
midiOutReset(_midi.midi_out);
|
||||||
if (_midi.playing) {
|
_midi.playback_start_time = timeGetTime();
|
||||||
midiOutReset(_midi.midi_out);
|
_midi.do_start = 2;
|
||||||
/* Some songs change the "Pitch bend range" registered
|
|
||||||
* parameter. If this doesn't get reset, everything else
|
LeaveCriticalSection(&_midi.lock);
|
||||||
* will start sounding wrong. */
|
return;
|
||||||
for (int ch = 0; ch < 16; ch++) {
|
} else if (_midi.do_start == 2) {
|
||||||
/* Running status, only need status for first message */
|
/* Reset the device to General MIDI defaults */
|
||||||
/* Select RPN 00.00, set value to 02.00, and unselect again */
|
TransmitStandardSysex(MidiSysexMessage::ResetGM);
|
||||||
TransmitChannelMsg(MIDIST_CONTROLLER | ch, MIDICT_RPN_SELECT_LO, 0x00);
|
_midi.playback_start_time = timeGetTime();
|
||||||
TransmitChannelMsg(MIDICT_RPN_SELECT_HI, 0x00);
|
_midi.do_start = 3;
|
||||||
TransmitChannelMsg(MIDICT_DATAENTRY, 0x02);
|
|
||||||
TransmitChannelMsg(MIDICT_DATAENTRY_LO, 0x00);
|
LeaveCriticalSection(&_midi.lock);
|
||||||
TransmitChannelMsg(MIDICT_RPN_SELECT_LO, 0x7F);
|
return;
|
||||||
TransmitChannelMsg(MIDICT_RPN_SELECT_HI, 0x7F);
|
} else if (_midi.do_start == 3) {
|
||||||
}
|
/* Set up device-specific effects */
|
||||||
}
|
TransmitStandardSysex(MidiSysexMessage::RolandSetReverb);
|
||||||
|
_midi.playback_start_time = timeGetTime();
|
||||||
|
_midi.do_start = 4;
|
||||||
|
|
||||||
|
LeaveCriticalSection(&_midi.lock);
|
||||||
|
return;
|
||||||
|
} else if (_midi.do_start == 4) {
|
||||||
|
/* Load the new file */
|
||||||
_midi.current_file.MoveFrom(_midi.next_file);
|
_midi.current_file.MoveFrom(_midi.next_file);
|
||||||
std::swap(_midi.next_segment, _midi.current_segment);
|
std::swap(_midi.next_segment, _midi.current_segment);
|
||||||
_midi.current_segment.start_block = 0;
|
_midi.current_segment.start_block = 0;
|
||||||
_midi.playback_start_time = timeGetTime();
|
_midi.playback_start_time = timeGetTime();
|
||||||
_midi.playing = true;
|
_midi.playing = true;
|
||||||
_midi.do_start = false;
|
_midi.do_start = 0;
|
||||||
_midi.current_block = 0;
|
_midi.current_block = 0;
|
||||||
|
|
||||||
MemSetT<byte>(_midi.channel_volumes, 127, lengthof(_midi.channel_volumes));
|
MemSetT<byte>(_midi.channel_volumes, 127, lengthof(_midi.channel_volumes));
|
||||||
} else if (!_midi.playing) {
|
|
||||||
/* not playing, stop the timer */
|
|
||||||
DEBUG(driver, 2, "Win32-MIDI: timer: not playing, stopping timer");
|
|
||||||
timeKillEvent(uTimerID);
|
|
||||||
_midi.timer_id = 0;
|
|
||||||
LeaveCriticalSection(&_midi.lock);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
} else if (!_midi.playing) {
|
||||||
/* check for volume change */
|
/* not playing, stop the timer */
|
||||||
static int volume_throttle = 0;
|
DEBUG(driver, 2, "Win32-MIDI: timer: not playing, stopping timer");
|
||||||
if (_midi.current_volume != _midi.new_volume) {
|
timeKillEvent(uTimerID);
|
||||||
if (volume_throttle == 0) {
|
_midi.timer_id = 0;
|
||||||
DEBUG(driver, 2, "Win32-MIDI: timer: volume change");
|
|
||||||
_midi.current_volume = _midi.new_volume;
|
|
||||||
volume_throttle = 20 / _midi.time_period;
|
|
||||||
for (int ch = 0; ch < 16; ch++) {
|
|
||||||
int vol = ScaleVolume(_midi.channel_volumes[ch], _midi.current_volume);
|
|
||||||
TransmitChannelMsg(MIDIST_CONTROLLER | ch, MIDICT_CHANVOLUME, vol);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
volume_throttle--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LeaveCriticalSection(&_midi.lock);
|
LeaveCriticalSection(&_midi.lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check for volume change */
|
||||||
|
static int volume_throttle = 0;
|
||||||
|
if (_midi.current_volume != _midi.new_volume) {
|
||||||
|
if (volume_throttle == 0) {
|
||||||
|
DEBUG(driver, 2, "Win32-MIDI: timer: volume change");
|
||||||
|
_midi.current_volume = _midi.new_volume;
|
||||||
|
volume_throttle = 20 / _midi.time_period;
|
||||||
|
for (int ch = 0; ch < 16; ch++) {
|
||||||
|
byte vol = ScaleVolume(_midi.channel_volumes[ch], _midi.current_volume);
|
||||||
|
TransmitChannelMsg(MIDIST_CONTROLLER | ch, MIDICT_CHANVOLUME, vol);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
volume_throttle--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* skip beginning of file? */
|
/* skip beginning of file? */
|
||||||
if (_midi.current_segment.start > 0 && _midi.current_block == 0 && _midi.current_segment.start_block == 0) {
|
if (_midi.current_segment.start > 0 && _midi.current_block == 0 && _midi.current_segment.start_block == 0) {
|
||||||
/* find first block after start time and pretend playback started earlier
|
/* find first block after start time and pretend playback started earlier
|
||||||
* this is to allow all blocks prior to the actual start to still affect playback,
|
* this is to allow all blocks prior to the actual start to still affect playback,
|
||||||
* as they may contain important controller and program changes */
|
* as they may contain important controller and program changes */
|
||||||
uint preload_bytes = 0;
|
uint preload_bytes = 0;
|
||||||
for (size_t bl = 0; bl < _midi.current_file.blocks.size(); bl++) {
|
for (size_t bl = 0; bl < _midi.current_file.blocks.size(); bl++) {
|
||||||
MidiFile::DataBlock &block = _midi.current_file.blocks[bl];
|
MidiFile::DataBlock &block = _midi.current_file.blocks[bl];
|
||||||
@@ -200,7 +214,7 @@ void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DW
|
|||||||
* The delay compensation is needed to avoid time-compression of following messages.
|
* The delay compensation is needed to avoid time-compression of following messages.
|
||||||
*/
|
*/
|
||||||
DEBUG(driver, 2, "Win32-MIDI: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes);
|
DEBUG(driver, 2, "Win32-MIDI: timer: start from block %d (ticktime %d, realtime %.3f, bytes %d)", (int)bl, (int)block.ticktime, ((int)block.realtime) / 1000.0, (int)preload_bytes);
|
||||||
_midi.playback_start_time -= block.realtime / 1000 - preload_bytes * 1000 / 3125;
|
_midi.playback_start_time -= block.realtime / 1000 - (DWORD)(preload_bytes * 1000 / 3125);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -229,7 +243,7 @@ void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DW
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte *data = block.data.Begin();
|
const byte *data = block.data.Begin();
|
||||||
size_t remaining = block.data.Length();
|
size_t remaining = block.data.Length();
|
||||||
byte last_status = 0;
|
byte last_status = 0;
|
||||||
while (remaining > 0) {
|
while (remaining > 0) {
|
||||||
@@ -308,25 +322,28 @@ void CALLBACK TimerCallback(UINT uTimerID, UINT, DWORD_PTR dwUser, DWORD_PTR, DW
|
|||||||
_midi.do_stop = true;
|
_midi.do_stop = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LeaveCriticalSection(&_midi.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MusicDriver_Win32::PlaySong(const MusicSongInfo &song)
|
void MusicDriver_Win32::PlaySong(const MusicSongInfo &song)
|
||||||
{
|
{
|
||||||
DEBUG(driver, 2, "Win32-MIDI: PlaySong: entry");
|
DEBUG(driver, 2, "Win32-MIDI: PlaySong: entry");
|
||||||
|
|
||||||
|
MidiFile new_song;
|
||||||
|
if (!new_song.LoadSong(song)) return;
|
||||||
|
DEBUG(driver, 2, "Win32-MIDI: PlaySong: Loaded song");
|
||||||
|
|
||||||
EnterCriticalSection(&_midi.lock);
|
EnterCriticalSection(&_midi.lock);
|
||||||
|
|
||||||
if (!_midi.next_file.LoadSong(song)) {
|
_midi.next_file.MoveFrom(new_song);
|
||||||
LeaveCriticalSection(&_midi.lock);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_midi.next_segment.start = song.override_start;
|
_midi.next_segment.start = song.override_start;
|
||||||
_midi.next_segment.end = song.override_end;
|
_midi.next_segment.end = song.override_end;
|
||||||
_midi.next_segment.loop = song.loop;
|
_midi.next_segment.loop = song.loop;
|
||||||
|
|
||||||
DEBUG(driver, 2, "Win32-MIDI: PlaySong: setting flag");
|
DEBUG(driver, 2, "Win32-MIDI: PlaySong: setting flag");
|
||||||
_midi.do_stop = _midi.playing;
|
_midi.do_stop = _midi.playing;
|
||||||
_midi.do_start = true;
|
_midi.do_start = 1;
|
||||||
|
|
||||||
if (_midi.timer_id == 0) {
|
if (_midi.timer_id == 0) {
|
||||||
DEBUG(driver, 2, "Win32-MIDI: PlaySong: starting timer");
|
DEBUG(driver, 2, "Win32-MIDI: PlaySong: starting timer");
|
||||||
@@ -347,7 +364,7 @@ void MusicDriver_Win32::StopSong()
|
|||||||
|
|
||||||
bool MusicDriver_Win32::IsSongPlaying()
|
bool MusicDriver_Win32::IsSongPlaying()
|
||||||
{
|
{
|
||||||
return _midi.playing || _midi.do_start;
|
return _midi.playing || (_midi.do_start != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MusicDriver_Win32::SetVolume(byte vol)
|
void MusicDriver_Win32::SetVolume(byte vol)
|
||||||
@@ -381,14 +398,6 @@ const char *MusicDriver_Win32::Start(const char * const *parm)
|
|||||||
|
|
||||||
midiOutReset(_midi.midi_out);
|
midiOutReset(_midi.midi_out);
|
||||||
|
|
||||||
/* Standard "Enable General MIDI" message */
|
|
||||||
static byte gm_enable_sysex[] = { 0xF0, 0x7E, 0x00, 0x09, 0x01, 0xF7 };
|
|
||||||
TransmitSysexConst(&gm_enable_sysex[0], sizeof(gm_enable_sysex));
|
|
||||||
|
|
||||||
/* Roland-specific reverb room control, used by the original game */
|
|
||||||
static byte roland_reverb_sysex[] = { 0xF0, 0x41, 0x10, 0x42, 0x12, 0x40, 0x01, 0x30, 0x02, 0x04, 0x00, 0x40, 0x40, 0x00, 0x00, 0x09, 0xF7 };
|
|
||||||
TransmitSysexConst(&roland_reverb_sysex[0], sizeof(roland_reverb_sysex));
|
|
||||||
|
|
||||||
/* prepare multimedia timer */
|
/* prepare multimedia timer */
|
||||||
TIMECAPS timecaps;
|
TIMECAPS timecaps;
|
||||||
if (timeGetDevCaps(&timecaps, sizeof(timecaps)) == MMSYSERR_NOERROR) {
|
if (timeGetDevCaps(&timecaps, sizeof(timecaps)) == MMSYSERR_NOERROR) {
|
||||||
|
|||||||
@@ -1675,7 +1675,7 @@ static void NetworkAutoCleanCompanies()
|
|||||||
/* Is the company empty for autoclean_unprotected-months, and is there no protection? */
|
/* Is the company empty for autoclean_unprotected-months, and is there no protection? */
|
||||||
if (_settings_client.network.autoclean_unprotected != 0 && _network_company_states[c->index].months_empty > _settings_client.network.autoclean_unprotected && StrEmpty(_network_company_states[c->index].password)) {
|
if (_settings_client.network.autoclean_unprotected != 0 && _network_company_states[c->index].months_empty > _settings_client.network.autoclean_unprotected && StrEmpty(_network_company_states[c->index].password)) {
|
||||||
/* Shut the company down */
|
/* Shut the company down */
|
||||||
DoCommandP(0, CCA_DELETE | c->index << 16, CRR_AUTOCLEAN, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_DELETE | c->index << 16 | CRR_AUTOCLEAN << 24, 0, CMD_COMPANY_CTRL);
|
||||||
IConsolePrintF(CC_DEFAULT, "Auto-cleaned company #%d with no password", c->index + 1);
|
IConsolePrintF(CC_DEFAULT, "Auto-cleaned company #%d with no password", c->index + 1);
|
||||||
}
|
}
|
||||||
/* Is the company empty for autoclean_protected-months, and there is a protection? */
|
/* Is the company empty for autoclean_protected-months, and there is a protection? */
|
||||||
@@ -1689,7 +1689,7 @@ static void NetworkAutoCleanCompanies()
|
|||||||
/* Is the company empty for autoclean_novehicles-months, and has no vehicles? */
|
/* Is the company empty for autoclean_novehicles-months, and has no vehicles? */
|
||||||
if (_settings_client.network.autoclean_novehicles != 0 && _network_company_states[c->index].months_empty > _settings_client.network.autoclean_novehicles && vehicles_in_company[c->index] == 0) {
|
if (_settings_client.network.autoclean_novehicles != 0 && _network_company_states[c->index].months_empty > _settings_client.network.autoclean_novehicles && vehicles_in_company[c->index] == 0) {
|
||||||
/* Shut the company down */
|
/* Shut the company down */
|
||||||
DoCommandP(0, CCA_DELETE | c->index << 16, CRR_AUTOCLEAN, CMD_COMPANY_CTRL);
|
DoCommandP(0, CCA_DELETE | c->index << 16 | CRR_AUTOCLEAN << 24, 0, CMD_COMPANY_CTRL);
|
||||||
IConsolePrintF(CC_DEFAULT, "Auto-cleaned company #%d with no vehicles", c->index + 1);
|
IConsolePrintF(CC_DEFAULT, "Auto-cleaned company #%d with no vehicles", c->index + 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -5480,7 +5480,8 @@ static void RailTypeMapSpriteGroup(ByteReader *buf, uint8 idcount)
|
|||||||
{
|
{
|
||||||
uint8 *railtypes = AllocaM(uint8, idcount);
|
uint8 *railtypes = AllocaM(uint8, idcount);
|
||||||
for (uint i = 0; i < idcount; i++) {
|
for (uint i = 0; i < idcount; i++) {
|
||||||
railtypes[i] = _cur.grffile->railtype_map[buf->ReadByte()];
|
uint8 id = buf->ReadByte();
|
||||||
|
railtypes[i] = id < RAILTYPE_END ? _cur.grffile->railtype_map[id] : INVALID_RAILTYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 cidcount = buf->ReadByte();
|
uint8 cidcount = buf->ReadByte();
|
||||||
@@ -5688,7 +5689,7 @@ static void FeatureNewName(ByteReader *buf)
|
|||||||
bool new_scheme = _cur.grffile->grf_version >= 7;
|
bool new_scheme = _cur.grffile->grf_version >= 7;
|
||||||
|
|
||||||
uint8 feature = buf->ReadByte();
|
uint8 feature = buf->ReadByte();
|
||||||
if (feature >= GSF_END) {
|
if (feature >= GSF_END && feature != 0x48) {
|
||||||
grfmsg(1, "FeatureNewName: Unsupported feature 0x%02X, skipping", feature);
|
grfmsg(1, "FeatureNewName: Unsupported feature 0x%02X, skipping", feature);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ struct GRFLoadedFeatures {
|
|||||||
uint64 used_liveries; ///< Bitmask of #LiveryScheme used by the defined engines.
|
uint64 used_liveries; ///< Bitmask of #LiveryScheme used by the defined engines.
|
||||||
bool has_newhouses; ///< Set if there are any newhouses loaded.
|
bool has_newhouses; ///< Set if there are any newhouses loaded.
|
||||||
bool has_newindustries; ///< Set if there are any newindustries loaded.
|
bool has_newindustries; ///< Set if there are any newindustries loaded.
|
||||||
ShoreReplacement shore; ///< It which way shore sprites were replaced.
|
ShoreReplacement shore; ///< In which way shore sprites were replaced.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ AirportSpec AirportSpec::specs[NUM_AIRPORTS]; ///< Airport specifications.
|
|||||||
assert(type < lengthof(AirportSpec::specs));
|
assert(type < lengthof(AirportSpec::specs));
|
||||||
const AirportSpec *as = &AirportSpec::specs[type];
|
const AirportSpec *as = &AirportSpec::specs[type];
|
||||||
if (type >= NEW_AIRPORT_OFFSET && !as->enabled) {
|
if (type >= NEW_AIRPORT_OFFSET && !as->enabled) {
|
||||||
|
if (_airport_mngr.GetGRFID(type) == 0) return as;
|
||||||
byte subst_id = _airport_mngr.GetSubstituteID(type);
|
byte subst_id = _airport_mngr.GetSubstituteID(type);
|
||||||
if (subst_id == AT_INVALID) return as;
|
if (subst_id == AT_INVALID) return as;
|
||||||
as = &AirportSpec::specs[subst_id];
|
as = &AirportSpec::specs[subst_id];
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ const NewsItem *_statusbar_news_item = NULL;
|
|||||||
|
|
||||||
static uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages
|
static uint MIN_NEWS_AMOUNT = 30; ///< preferred minimum amount of news messages
|
||||||
static uint _total_news = 0; ///< current number of news items
|
static uint _total_news = 0; ///< current number of news items
|
||||||
NewsItem *_oldest_news = NULL; ///< head of news items queue
|
static NewsItem *_oldest_news = NULL; ///< head of news items queue
|
||||||
static NewsItem *_latest_news = NULL; ///< tail of news items queue
|
NewsItem *_latest_news = NULL; ///< tail of news items queue
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Forced news item.
|
* Forced news item.
|
||||||
@@ -54,7 +54,7 @@ static NewsItem *_latest_news = NULL; ///< tail of news items queue
|
|||||||
* If the message being shown was forced by the user, a pointer is stored
|
* If the message being shown was forced by the user, a pointer is stored
|
||||||
* in _forced_news. Otherwise, \a _forced_news variable is NULL.
|
* in _forced_news. Otherwise, \a _forced_news variable is NULL.
|
||||||
*/
|
*/
|
||||||
static const NewsItem *_forced_news = NULL; ///< item the user has asked for
|
static const NewsItem *_forced_news = NULL;
|
||||||
|
|
||||||
/** Current news item (last item shown regularly). */
|
/** Current news item (last item shown regularly). */
|
||||||
static const NewsItem *_current_news = NULL;
|
static const NewsItem *_current_news = NULL;
|
||||||
@@ -331,6 +331,11 @@ struct NewsWindow : Window {
|
|||||||
*size = maxdim(*size, GetSpriteSize(SPR_GRADIENT));
|
*size = maxdim(*size, GetSpriteSize(SPR_GRADIENT));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WID_N_MGR_NAME:
|
||||||
|
SetDParamStr(0, static_cast<const CompanyNewsInformation *>(this->ni->free_data)->president_name);
|
||||||
|
str = STR_JUST_RAW_STRING;
|
||||||
|
break;
|
||||||
|
|
||||||
case WID_N_MESSAGE:
|
case WID_N_MESSAGE:
|
||||||
CopyInDParam(0, this->ni->params, lengthof(this->ni->params));
|
CopyInDParam(0, this->ni->params, lengthof(this->ni->params));
|
||||||
str = this->ni->string_id;
|
str = this->ni->string_id;
|
||||||
|
|||||||
@@ -17,6 +17,6 @@
|
|||||||
void ShowLastNewsMessage();
|
void ShowLastNewsMessage();
|
||||||
void ShowMessageHistory();
|
void ShowMessageHistory();
|
||||||
|
|
||||||
extern NewsItem *_oldest_news;
|
extern NewsItem *_latest_news;
|
||||||
|
|
||||||
#endif /* NEWS_GUI_H */
|
#endif /* NEWS_GUI_H */
|
||||||
|
|||||||
@@ -772,9 +772,10 @@ static void ChangeTileOwner_Object(TileIndex tile, Owner old_owner, Owner new_ow
|
|||||||
|
|
||||||
bool do_clear = false;
|
bool do_clear = false;
|
||||||
|
|
||||||
if (IsObjectType(tile, OBJECT_OWNED_LAND) && new_owner != INVALID_OWNER) {
|
ObjectType type = GetObjectType(tile);
|
||||||
|
if ((type == OBJECT_OWNED_LAND || type >= NEW_OBJECT_OFFSET) && new_owner != INVALID_OWNER) {
|
||||||
SetTileOwner(tile, new_owner);
|
SetTileOwner(tile, new_owner);
|
||||||
} else if (IsObjectType(tile, OBJECT_STATUE)) {
|
} else if (type == OBJECT_STATUE) {
|
||||||
Town *t = Object::GetByTile(tile)->town;
|
Town *t = Object::GetByTile(tile)->town;
|
||||||
ClrBit(t->statues, old_owner);
|
ClrBit(t->statues, old_owner);
|
||||||
if (new_owner != INVALID_OWNER && !HasBit(t->statues, new_owner)) {
|
if (new_owner != INVALID_OWNER && !HasBit(t->statues, new_owner)) {
|
||||||
|
|||||||
@@ -62,6 +62,7 @@
|
|||||||
#include "town.h"
|
#include "town.h"
|
||||||
#include "subsidy_func.h"
|
#include "subsidy_func.h"
|
||||||
#include "gfx_layout.h"
|
#include "gfx_layout.h"
|
||||||
|
#include "viewport_func.h"
|
||||||
#include "viewport_sprite_sorter.h"
|
#include "viewport_sprite_sorter.h"
|
||||||
#include "framerate_type.h"
|
#include "framerate_type.h"
|
||||||
|
|
||||||
@@ -339,6 +340,7 @@ static void LoadIntroGame(bool load_newgrfs = true)
|
|||||||
SetLocalCompany(COMPANY_FIRST);
|
SetLocalCompany(COMPANY_FIRST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FixTitleGameZoom();
|
||||||
_pause_mode = PM_UNPAUSED;
|
_pause_mode = PM_UNPAUSED;
|
||||||
_cursor.fix_at = false;
|
_cursor.fix_at = false;
|
||||||
|
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ public:
|
|||||||
char message[1024];
|
char message[1024];
|
||||||
seprintf(message, lastof(message),
|
seprintf(message, lastof(message),
|
||||||
"Please send the generated crash information and the last (auto)save to the developers. "
|
"Please send the generated crash information and the last (auto)save to the developers. "
|
||||||
"This will greatly help debugging. The correct place to do this is http://bugs.openttd.org.\n\n"
|
"This will greatly help debugging. The correct place to do this is https://github.com/OpenTTD/OpenTTD/issues.\n\n"
|
||||||
"Generated file(s):\n%s\n%s\n%s",
|
"Generated file(s):\n%s\n%s\n%s",
|
||||||
this->filename_log, this->filename_save, this->filename_screenshot);
|
this->filename_log, this->filename_save, this->filename_screenshot);
|
||||||
|
|
||||||
|
|||||||
@@ -582,7 +582,7 @@ static bool _expanded;
|
|||||||
static const TCHAR _crash_desc[] =
|
static const TCHAR _crash_desc[] =
|
||||||
_T("A serious fault condition occurred in the game. The game will shut down.\n")
|
_T("A serious fault condition occurred in the game. The game will shut down.\n")
|
||||||
_T("Please send the crash information and the crash.dmp file (if any) to the developers.\n")
|
_T("Please send the crash information and the crash.dmp file (if any) to the developers.\n")
|
||||||
_T("This will greatly help debugging. The correct place to do this is http://bugs.openttd.org. ")
|
_T("This will greatly help debugging. The correct place to do this is https://github.com/OpenTTD/OpenTTD/issues. ")
|
||||||
_T("The information contained in the report is displayed below.\n")
|
_T("The information contained in the report is displayed below.\n")
|
||||||
_T("Press \"Emergency save\" to attempt saving the game. Generated file(s):\n")
|
_T("Press \"Emergency save\" to attempt saving the game. Generated file(s):\n")
|
||||||
_T("%s");
|
_T("%s");
|
||||||
|
|||||||
@@ -79,8 +79,8 @@ END
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,9,0,!!ISODATE!!
|
FILEVERSION 1,9,2,!!ISODATE!!
|
||||||
PRODUCTVERSION 1,9,0,!!ISODATE!!
|
PRODUCTVERSION 1,9,2,!!ISODATE!!
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ bool LoadLibraryList(Function proc[], const char *dll)
|
|||||||
void ShowOSErrorBox(const char *buf, bool system)
|
void ShowOSErrorBox(const char *buf, bool system)
|
||||||
{
|
{
|
||||||
MyShowCursor(true);
|
MyShowCursor(true);
|
||||||
MessageBox(GetActiveWindow(), OTTD2FS(buf), _T("Error!"), MB_ICONSTOP);
|
MessageBox(GetActiveWindow(), OTTD2FS(buf), _T("Error!"), MB_ICONSTOP | MB_TASKMODAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OSOpenBrowser(const char *url)
|
void OSOpenBrowser(const char *url)
|
||||||
|
|||||||
@@ -1565,6 +1565,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
|
|
||||||
CommandCost cost(EXPENSES_CONSTRUCTION);
|
CommandCost cost(EXPENSES_CONSTRUCTION);
|
||||||
CommandCost error = CommandCost(STR_ERROR_NO_SUITABLE_RAILROAD_TRACK); // by default, there is no track to convert.
|
CommandCost error = CommandCost(STR_ERROR_NO_SUITABLE_RAILROAD_TRACK); // by default, there is no track to convert.
|
||||||
|
bool found_convertible_track = false; // whether we actually did convert some track (see bug #7633)
|
||||||
|
|
||||||
TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(area_start, area_end) : new OrthogonalTileIterator(area_start, area_end);
|
TileIterator *iter = diagonal ? (TileIterator *)new DiagonalTileIterator(area_start, area_end) : new OrthogonalTileIterator(area_start, area_end);
|
||||||
for (; (tile = *iter) != INVALID_TILE; ++(*iter)) {
|
for (; (tile = *iter) != INVALID_TILE; ++(*iter)) {
|
||||||
@@ -1660,6 +1661,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
InvalidateWindowData(WC_VEHICLE_DEPOT, tile);
|
InvalidateWindowData(WC_VEHICLE_DEPOT, tile);
|
||||||
InvalidateWindowData(WC_BUILD_VEHICLE, tile);
|
InvalidateWindowData(WC_BUILD_VEHICLE, tile);
|
||||||
}
|
}
|
||||||
|
found_convertible_track = true;
|
||||||
cost.AddCost(RailConvertCost(type, totype));
|
cost.AddCost(RailConvertCost(type, totype));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -1671,6 +1673,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
YapfNotifyTrackLayoutChange(tile, RemoveFirstTrack(&tracks));
|
YapfNotifyTrackLayoutChange(tile, RemoveFirstTrack(&tracks));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
found_convertible_track = true;
|
||||||
cost.AddCost(RailConvertCost(type, totype) * CountBits(GetTrackBits(tile)));
|
cost.AddCost(RailConvertCost(type, totype) * CountBits(GetTrackBits(tile)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1733,6 +1736,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
found_convertible_track = true;
|
||||||
cost.AddCost((GetTunnelBridgeLength(tile, endtile) + 2) * RailConvertCost(type, totype));
|
cost.AddCost((GetTunnelBridgeLength(tile, endtile) + 2) * RailConvertCost(type, totype));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1743,6 +1747,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
YapfNotifyTrackLayoutChange(tile, track);
|
YapfNotifyTrackLayoutChange(tile, track);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
found_convertible_track = true;
|
||||||
cost.AddCost(RailConvertCost(type, totype));
|
cost.AddCost(RailConvertCost(type, totype));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1760,7 +1765,7 @@ CommandCost CmdConvertRail(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete iter;
|
delete iter;
|
||||||
return (cost.GetCost() == 0) ? error : cost;
|
return found_convertible_track ? cost : error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CommandCost RemoveTrainDepot(TileIndex tile, DoCommandFlag flags)
|
static CommandCost RemoveTrainDepot(TileIndex tile, DoCommandFlag flags)
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ const byte _openttd_revision_tagged = !!ISTAG!!;
|
|||||||
* final release will always have a lower version number than the released
|
* final release will always have a lower version number than the released
|
||||||
* version, thus making comparisons on specific revisions easy.
|
* version, thus making comparisons on specific revisions easy.
|
||||||
*/
|
*/
|
||||||
const uint32 _openttd_newgrf_version = 1 << 28 | 9 << 24 | 0 << 20 | !!ISSTABLETAG!! << 19 | 28004;
|
const uint32 _openttd_newgrf_version = 1 << 28 | 9 << 24 | 2 << 20 | !!ISSTABLETAG!! << 19 | 28004;
|
||||||
|
|
||||||
#ifdef __MORPHOS__
|
#ifdef __MORPHOS__
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1132,6 +1132,38 @@ bool AfterLoadGame()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Railtype moved from m3 to m8 in version SLV_EXTEND_RAILTYPES. */
|
||||||
|
if (IsSavegameVersionBefore(SLV_EXTEND_RAILTYPES)) {
|
||||||
|
for (TileIndex t = 0; t < map_size; t++) {
|
||||||
|
switch (GetTileType(t)) {
|
||||||
|
case MP_RAILWAY:
|
||||||
|
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MP_ROAD:
|
||||||
|
if (IsLevelCrossing(t)) {
|
||||||
|
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MP_STATION:
|
||||||
|
if (HasStationRail(t)) {
|
||||||
|
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MP_TUNNELBRIDGE:
|
||||||
|
if (GetTunnelBridgeTransportType(t) == TRANSPORT_RAIL) {
|
||||||
|
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (IsSavegameVersionBefore(SLV_42)) {
|
if (IsSavegameVersionBefore(SLV_42)) {
|
||||||
Vehicle *v;
|
Vehicle *v;
|
||||||
|
|
||||||
@@ -1213,38 +1245,6 @@ bool AfterLoadGame()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Railtype moved from m3 to m8 in version SLV_EXTEND_RAILTYPES. */
|
|
||||||
if (IsSavegameVersionBefore(SLV_EXTEND_RAILTYPES)) {
|
|
||||||
for (TileIndex t = 0; t < map_size; t++) {
|
|
||||||
switch (GetTileType(t)) {
|
|
||||||
case MP_RAILWAY:
|
|
||||||
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MP_ROAD:
|
|
||||||
if (IsLevelCrossing(t)) {
|
|
||||||
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MP_STATION:
|
|
||||||
if (HasStationRail(t)) {
|
|
||||||
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MP_TUNNELBRIDGE:
|
|
||||||
if (GetTunnelBridgeTransportType(t) == TRANSPORT_RAIL) {
|
|
||||||
SetRailType(t, (RailType)GB(_m[t].m3, 0, 4));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Elrails got added in rev 24 */
|
/* Elrails got added in rev 24 */
|
||||||
if (IsSavegameVersionBefore(SLV_24)) {
|
if (IsSavegameVersionBefore(SLV_24)) {
|
||||||
RailType min_rail = RAILTYPE_ELECTRIC;
|
RailType min_rail = RAILTYPE_ELECTRIC;
|
||||||
@@ -1893,6 +1893,7 @@ bool AfterLoadGame()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (IsSavegameVersionBefore(SLV_62)) {
|
if (IsSavegameVersionBefore(SLV_62)) {
|
||||||
|
GroupStatistics::UpdateAfterLoad(); // Ensure statistics pool is initialised before trying to delete vehicles
|
||||||
/* Remove all trams from savegames without tram support.
|
/* Remove all trams from savegames without tram support.
|
||||||
* There would be trams without tram track under causing crashes sooner or later. */
|
* There would be trams without tram track under causing crashes sooner or later. */
|
||||||
RoadVehicle *v;
|
RoadVehicle *v;
|
||||||
@@ -2304,6 +2305,14 @@ bool AfterLoadGame()
|
|||||||
if (IsSavegameVersionBefore(SLV_128)) {
|
if (IsSavegameVersionBefore(SLV_128)) {
|
||||||
const Depot *d;
|
const Depot *d;
|
||||||
FOR_ALL_DEPOTS(d) {
|
FOR_ALL_DEPOTS(d) {
|
||||||
|
/* At some point, invalid depots were saved into the game (possibly those removed in the past?)
|
||||||
|
* Remove them here, so they don't cause issues further down the line */
|
||||||
|
if (!IsDepotTile(d->xy)) {
|
||||||
|
DEBUG(sl, 0, "Removing invalid depot %d at %d, %d", d->index, TileX(d->xy), TileY(d->xy));
|
||||||
|
delete d;
|
||||||
|
d = nullptr;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
_m[d->xy].m2 = d->index;
|
_m[d->xy].m2 = d->index;
|
||||||
if (IsTileType(d->xy, MP_WATER)) _m[GetOtherShipDepotTile(d->xy)].m2 = d->index;
|
if (IsTileType(d->xy, MP_WATER)) _m[GetOtherShipDepotTile(d->xy)].m2 = d->index;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -233,7 +233,8 @@ void AfterLoadLinkGraphs()
|
|||||||
LinkGraph *lg;
|
LinkGraph *lg;
|
||||||
FOR_ALL_LINK_GRAPHS(lg) {
|
FOR_ALL_LINK_GRAPHS(lg) {
|
||||||
for (NodeID node_id = 0; node_id < lg->Size(); ++node_id) {
|
for (NodeID node_id = 0; node_id < lg->Size(); ++node_id) {
|
||||||
(*lg)[node_id].UpdateLocation(Station::Get((*lg)[node_id].Station())->xy);
|
const Station *st = Station::GetIfValid((*lg)[node_id].Station());
|
||||||
|
if (st != nullptr) (*lg)[node_id].UpdateLocation(st->xy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,7 +242,8 @@ void AfterLoadLinkGraphs()
|
|||||||
FOR_ALL_LINK_GRAPH_JOBS(lgj) {
|
FOR_ALL_LINK_GRAPH_JOBS(lgj) {
|
||||||
lg = &(const_cast<LinkGraph &>(lgj->Graph()));
|
lg = &(const_cast<LinkGraph &>(lgj->Graph()));
|
||||||
for (NodeID node_id = 0; node_id < lg->Size(); ++node_id) {
|
for (NodeID node_id = 0; node_id < lg->Size(); ++node_id) {
|
||||||
(*lg)[node_id].UpdateLocation(Station::Get((*lg)[node_id].Station())->xy);
|
const Station *st = Station::GetIfValid((*lg)[node_id].Station());
|
||||||
|
if (st != nullptr) (*lg)[node_id].UpdateLocation(st->xy);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2889,36 +2889,3 @@ void FileToSaveLoad::SetTitle(const char *title)
|
|||||||
{
|
{
|
||||||
strecpy(this->title, title, lastof(this->title));
|
strecpy(this->title, title, lastof(this->title));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
* Function to get the type of the savegame by looking at the file header.
|
|
||||||
* NOTICE: Not used right now, but could be used if extensions of savegames are garbled
|
|
||||||
* @param file Savegame to be checked
|
|
||||||
* @return SL_OLD_LOAD or SL_LOAD of the file
|
|
||||||
*/
|
|
||||||
int GetSavegameType(char *file)
|
|
||||||
{
|
|
||||||
const SaveLoadFormat *fmt;
|
|
||||||
uint32 hdr;
|
|
||||||
FILE *f;
|
|
||||||
int mode = SL_OLD_LOAD;
|
|
||||||
|
|
||||||
f = fopen(file, "rb");
|
|
||||||
if (fread(&hdr, sizeof(hdr), 1, f) != 1) {
|
|
||||||
DEBUG(sl, 0, "Savegame is obsolete or invalid format");
|
|
||||||
mode = SL_LOAD; // don't try to get filename, just show name as it is written
|
|
||||||
} else {
|
|
||||||
/* see if we have any loader for this type. */
|
|
||||||
for (fmt = _saveload_formats; fmt != endof(_saveload_formats); fmt++) {
|
|
||||||
if (fmt->tag == hdr) {
|
|
||||||
mode = SL_LOAD; // new type of savegame
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(f);
|
|
||||||
return mode;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
*
|
*
|
||||||
* \b 1.9.0
|
* \b 1.9.0
|
||||||
*
|
*
|
||||||
* 1.9.0 is not yet released. The following changes are not set in stone yet.
|
|
||||||
* API additions:
|
* API additions:
|
||||||
* \li AIAirport::GetMonthlyMaintenanceCost
|
* \li AIAirport::GetMonthlyMaintenanceCost
|
||||||
* \li AIGroup::SetParent
|
* \li AIGroup::SetParent
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
*
|
*
|
||||||
* \b 1.9.0
|
* \b 1.9.0
|
||||||
*
|
*
|
||||||
* 1.9.0 is not yet released. The following changes are not set in stone yet.
|
|
||||||
* API additions:
|
* API additions:
|
||||||
* \li GSAirport::GetMonthlyMaintenanceCost
|
* \li GSAirport::GetMonthlyMaintenanceCost
|
||||||
* \li GSClient
|
* \li GSClient
|
||||||
|
|||||||
@@ -109,7 +109,7 @@
|
|||||||
return g != NULL && g->completed;
|
return g != NULL && g->completed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ bool ScriptGoal::DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons)
|
/* static */ bool ScriptGoal::DoQuestion(uint16 uniqueid, uint32 target, bool is_client, Text *question, QuestionType type, uint32 buttons)
|
||||||
{
|
{
|
||||||
CCountedPtr<Text> counter(question);
|
CCountedPtr<Text> counter(question);
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
EnforcePrecondition(false, buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT));
|
EnforcePrecondition(false, buttons < (1 << ::GOAL_QUESTION_BUTTON_COUNT));
|
||||||
EnforcePrecondition(false, (int)type < ::GOAL_QUESTION_TYPE_COUNT);
|
EnforcePrecondition(false, (int)type < ::GOAL_QUESTION_TYPE_COUNT);
|
||||||
|
|
||||||
return ScriptObject::DoCommand(0, uniqueid | (target << 16) | (type << 24) | (is_client ? (1 << 31) : 0), buttons, CMD_GOAL_QUESTION, text);
|
return ScriptObject::DoCommand(0, uniqueid | (target << 16), buttons | (type << 29) | (is_client ? (1 << 31) : 0), CMD_GOAL_QUESTION, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons)
|
/* static */ bool ScriptGoal::Question(uint16 uniqueid, ScriptCompany::CompanyID company, Text *question, QuestionType type, int buttons)
|
||||||
@@ -138,8 +138,9 @@
|
|||||||
EnforcePrecondition(false, ScriptGame::IsMultiplayer());
|
EnforcePrecondition(false, ScriptGame::IsMultiplayer());
|
||||||
EnforcePrecondition(false, ScriptClient::ResolveClientID(client) != ScriptClient::CLIENT_INVALID);
|
EnforcePrecondition(false, ScriptClient::ResolveClientID(client) != ScriptClient::CLIENT_INVALID);
|
||||||
#ifdef ENABLE_NETWORK
|
#ifdef ENABLE_NETWORK
|
||||||
ClientIndex c = NetworkClientInfo::GetByClientID((::ClientID)client)->index;
|
/* Can only send 16 bits of client_id before proper fix is implemented */
|
||||||
return DoQuestion(uniqueid, c, true, question, type, buttons);
|
EnforcePrecondition(false, client < (1 << 16));
|
||||||
|
return DoQuestion(uniqueid, client, true, question, type, buttons);
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ protected:
|
|||||||
/**
|
/**
|
||||||
* Does common checks and asks the question.
|
* Does common checks and asks the question.
|
||||||
*/
|
*/
|
||||||
static bool DoQuestion(uint16 uniqueid, uint8 target, bool is_client, Text *question, QuestionType type, int buttons);
|
static bool DoQuestion(uint16 uniqueid, uint32 target, bool is_client, Text *question, QuestionType type, uint32 buttons);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SCRIPT_GOAL_HPP */
|
#endif /* SCRIPT_GOAL_HPP */
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "script_station.hpp"
|
#include "script_station.hpp"
|
||||||
#include "../../depot_map.h"
|
#include "../../depot_map.h"
|
||||||
#include "../../vehicle_base.h"
|
#include "../../vehicle_base.h"
|
||||||
|
#include "../../train.h"
|
||||||
|
|
||||||
#include "../../safeguards.h"
|
#include "../../safeguards.h"
|
||||||
|
|
||||||
@@ -23,7 +24,7 @@ ScriptVehicleList::ScriptVehicleList()
|
|||||||
{
|
{
|
||||||
const Vehicle *v;
|
const Vehicle *v;
|
||||||
FOR_ALL_VEHICLES(v) {
|
FOR_ALL_VEHICLES(v) {
|
||||||
if ((v->owner == ScriptObject::GetCompany() || ScriptObject::GetCompany() == OWNER_DEITY) && v->IsPrimaryVehicle()) this->AddItem(v->index);
|
if ((v->owner == ScriptObject::GetCompany() || ScriptObject::GetCompany() == OWNER_DEITY) && (v->IsPrimaryVehicle() || (v->type == VEH_TRAIN && ::Train::From(v)->IsFreeWagon()))) this->AddItem(v->index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "stringfilter_type.h"
|
#include "stringfilter_type.h"
|
||||||
#include "querystring_gui.h"
|
#include "querystring_gui.h"
|
||||||
#include "fontcache.h"
|
#include "fontcache.h"
|
||||||
|
#include "zoom_func.h"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -557,6 +558,7 @@ struct GameOptionsWindow : Window {
|
|||||||
_gui_zoom = (ZoomLevel)(ZOOM_LVL_OUT_4X - index);
|
_gui_zoom = (ZoomLevel)(ZOOM_LVL_OUT_4X - index);
|
||||||
UpdateCursorSize();
|
UpdateCursorSize();
|
||||||
UpdateAllVirtCoords();
|
UpdateAllVirtCoords();
|
||||||
|
FixTitleGameZoom();
|
||||||
ReInitAllWindows();
|
ReInitAllWindows();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -995,9 +995,12 @@ static CommandCost CheckFlatLandRoadStop(TileArea tile_area, DoCommandFlag flags
|
|||||||
if (ret.Failed()) return ret;
|
if (ret.Failed()) return ret;
|
||||||
}
|
}
|
||||||
num_roadbits += CountBits(GetRoadBits(cur_tile, ROADTYPE_ROAD));
|
num_roadbits += CountBits(GetRoadBits(cur_tile, ROADTYPE_ROAD));
|
||||||
}
|
|
||||||
|
|
||||||
if (GetDisallowedRoadDirections(cur_tile) != DRD_NONE) return_cmd_error(STR_ERROR_DRIVE_THROUGH_ON_ONEWAY_ROAD);
|
if (GetDisallowedRoadDirections(cur_tile) != DRD_NONE) {
|
||||||
|
CommandCost ret = CheckOwnership(road_owner);
|
||||||
|
if (ret.Failed()) return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* There is a tram, check if we can build road+tram stop over it. */
|
/* There is a tram, check if we can build road+tram stop over it. */
|
||||||
if (HasBit(cur_rts, ROADTYPE_TRAM)) {
|
if (HasBit(cur_rts, ROADTYPE_TRAM)) {
|
||||||
@@ -2639,21 +2642,29 @@ bool SplitGroundSpriteForOverlay(const TileInfo *ti, SpriteID *ground, RailTrack
|
|||||||
bool snow_desert;
|
bool snow_desert;
|
||||||
switch (*ground) {
|
switch (*ground) {
|
||||||
case SPR_RAIL_TRACK_X:
|
case SPR_RAIL_TRACK_X:
|
||||||
|
case SPR_MONO_TRACK_X:
|
||||||
|
case SPR_MGLV_TRACK_X:
|
||||||
snow_desert = false;
|
snow_desert = false;
|
||||||
*overlay_offset = RTO_X;
|
*overlay_offset = RTO_X;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPR_RAIL_TRACK_Y:
|
case SPR_RAIL_TRACK_Y:
|
||||||
|
case SPR_MONO_TRACK_Y:
|
||||||
|
case SPR_MGLV_TRACK_Y:
|
||||||
snow_desert = false;
|
snow_desert = false;
|
||||||
*overlay_offset = RTO_Y;
|
*overlay_offset = RTO_Y;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPR_RAIL_TRACK_X_SNOW:
|
case SPR_RAIL_TRACK_X_SNOW:
|
||||||
|
case SPR_MONO_TRACK_X_SNOW:
|
||||||
|
case SPR_MGLV_TRACK_X_SNOW:
|
||||||
snow_desert = true;
|
snow_desert = true;
|
||||||
*overlay_offset = RTO_X;
|
*overlay_offset = RTO_X;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SPR_RAIL_TRACK_Y_SNOW:
|
case SPR_RAIL_TRACK_Y_SNOW:
|
||||||
|
case SPR_MONO_TRACK_Y_SNOW:
|
||||||
|
case SPR_MGLV_TRACK_Y_SNOW:
|
||||||
snow_desert = true;
|
snow_desert = true;
|
||||||
*overlay_offset = RTO_Y;
|
*overlay_offset = RTO_Y;
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "toolbar_gui.h"
|
#include "toolbar_gui.h"
|
||||||
#include "core/geometry_func.hpp"
|
#include "core/geometry_func.hpp"
|
||||||
#include "guitimer_func.h"
|
#include "guitimer_func.h"
|
||||||
|
#include "zoom_func.h"
|
||||||
|
|
||||||
#include "widgets/statusbar_widget.h"
|
#include "widgets/statusbar_widget.h"
|
||||||
|
|
||||||
@@ -166,7 +167,7 @@ struct StatusBarWindow : Window {
|
|||||||
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_PAUSED, TC_FROMSTRING, SA_HOR_CENTER);
|
DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, STR_STATUSBAR_PAUSED, TC_FROMSTRING, SA_HOR_CENTER);
|
||||||
} else if (this->ticker_scroll < TICKER_STOP && FindWindowById(WC_NEWS_WINDOW, 0) == NULL && _statusbar_news_item != NULL && _statusbar_news_item->string_id != 0) {
|
} else if (this->ticker_scroll < TICKER_STOP && FindWindowById(WC_NEWS_WINDOW, 0) == NULL && _statusbar_news_item != NULL && _statusbar_news_item->string_id != 0) {
|
||||||
/* Draw the scrolling news text */
|
/* Draw the scrolling news text */
|
||||||
if (!DrawScrollingStatusText(_statusbar_news_item, this->ticker_scroll, r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) {
|
if (!DrawScrollingStatusText(_statusbar_news_item, ScaleGUITrad(this->ticker_scroll), r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, r.top + WD_FRAMERECT_TOP, r.bottom)) {
|
||||||
InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED);
|
InvalidateWindowData(WC_STATUS_BAR, 0, SBI_NEWS_DELETED);
|
||||||
if (Company::IsValidID(_local_company)) {
|
if (Company::IsValidID(_local_company)) {
|
||||||
/* This is the default text */
|
/* This is the default text */
|
||||||
|
|||||||
21
src/stdafx.h
21
src/stdafx.h
@@ -257,6 +257,13 @@
|
|||||||
# if !defined(FT_EXPORT)
|
# if !defined(FT_EXPORT)
|
||||||
# define FT_EXPORT( x ) extern "C" x CDECL
|
# define FT_EXPORT( x ) extern "C" x CDECL
|
||||||
# endif
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* liblzma from vcpkg (before 5.2.4-2) used to patch lzma.h to define LZMA_API_STATIC for static builds */
|
||||||
|
# if defined(WITH_LZMA)
|
||||||
|
# if !defined(LZMA_API_STATIC)
|
||||||
|
# define LZMA_API_STATIC
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#define strcasecmp stricmp
|
#define strcasecmp stricmp
|
||||||
@@ -319,13 +326,15 @@
|
|||||||
|
|
||||||
/* MSVCRT of course has to have a different syntax for long long *sigh* */
|
/* MSVCRT of course has to have a different syntax for long long *sigh* */
|
||||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||||
#define OTTD_PRINTF64 "%I64d"
|
# define OTTD_PRINTF64 "%I64d"
|
||||||
#define OTTD_PRINTFHEX64 "%I64x"
|
# define OTTD_PRINTFHEX64 "%I64x"
|
||||||
#define PRINTF_SIZE "%Iu"
|
# define PRINTF_SIZE "%Iu"
|
||||||
|
# define PRINTF_SIZEX "%IX"
|
||||||
#else
|
#else
|
||||||
#define OTTD_PRINTF64 "%lld"
|
# define OTTD_PRINTF64 "%lld"
|
||||||
#define OTTD_PRINTFHEX64 "%llx"
|
# define OTTD_PRINTFHEX64 "%llx"
|
||||||
#define PRINTF_SIZE "%zu"
|
# define PRINTF_SIZE "%zu"
|
||||||
|
# define PRINTF_SIZEX "%zX"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef unsigned char byte;
|
typedef unsigned char byte;
|
||||||
|
|||||||
@@ -29,12 +29,12 @@ struct LangString {
|
|||||||
char *name; ///< Name of the string.
|
char *name; ///< Name of the string.
|
||||||
char *english; ///< English text.
|
char *english; ///< English text.
|
||||||
char *translated; ///< Translated text.
|
char *translated; ///< Translated text.
|
||||||
uint16 hash_next; ///< Next hash entry.
|
size_t hash_next; ///< Next hash entry.
|
||||||
uint16 index; ///< The index in the language file.
|
size_t index; ///< The index in the language file.
|
||||||
int line; ///< Line of string in source-file.
|
int line; ///< Line of string in source-file.
|
||||||
Case *translated_case; ///< Cases of the translation.
|
Case *translated_case; ///< Cases of the translation.
|
||||||
|
|
||||||
LangString(const char *name, const char *english, int index, int line);
|
LangString(const char *name, const char *english, size_t index, int line);
|
||||||
~LangString();
|
~LangString();
|
||||||
void FreeTranslation();
|
void FreeTranslation();
|
||||||
};
|
};
|
||||||
@@ -42,10 +42,10 @@ struct LangString {
|
|||||||
/** Information about the currently known strings. */
|
/** Information about the currently known strings. */
|
||||||
struct StringData {
|
struct StringData {
|
||||||
LangString **strings; ///< Array of all known strings.
|
LangString **strings; ///< Array of all known strings.
|
||||||
uint16 *hash_heads; ///< Hash table for the strings.
|
size_t *hash_heads; ///< Hash table for the strings.
|
||||||
size_t tabs; ///< The number of 'tabs' of strings.
|
size_t tabs; ///< The number of 'tabs' of strings.
|
||||||
size_t max_strings; ///< The maximum number of strings.
|
size_t max_strings; ///< The maximum number of strings.
|
||||||
int next_string_id; ///< The next string ID to allocate.
|
size_t next_string_id;///< The next string ID to allocate.
|
||||||
|
|
||||||
StringData(size_t tabs);
|
StringData(size_t tabs);
|
||||||
~StringData();
|
~StringData();
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ Case::~Case()
|
|||||||
* @param index The index in the string table.
|
* @param index The index in the string table.
|
||||||
* @param line The line this string was found on.
|
* @param line The line this string was found on.
|
||||||
*/
|
*/
|
||||||
LangString::LangString(const char *name, const char *english, int index, int line) :
|
LangString::LangString(const char *name, const char *english, size_t index, int line) :
|
||||||
name(stredup(name)), english(stredup(english)), translated(NULL),
|
name(stredup(name)), english(stredup(english)), translated(NULL),
|
||||||
hash_next(0), index(index), line(line), translated_case(NULL)
|
hash_next(0), index(index), line(line), translated_case(NULL)
|
||||||
{
|
{
|
||||||
@@ -90,7 +90,7 @@ void LangString::FreeTranslation()
|
|||||||
StringData::StringData(size_t tabs) : tabs(tabs), max_strings(tabs * TAB_SIZE)
|
StringData::StringData(size_t tabs) : tabs(tabs), max_strings(tabs * TAB_SIZE)
|
||||||
{
|
{
|
||||||
this->strings = CallocT<LangString *>(max_strings);
|
this->strings = CallocT<LangString *>(max_strings);
|
||||||
this->hash_heads = CallocT<uint16>(max_strings);
|
this->hash_heads = CallocT<size_t>(max_strings);
|
||||||
this->next_string_id = 0;
|
this->next_string_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,9 +144,9 @@ void StringData::Add(const char *s, LangString *ls)
|
|||||||
*/
|
*/
|
||||||
LangString *StringData::Find(const char *s)
|
LangString *StringData::Find(const char *s)
|
||||||
{
|
{
|
||||||
int idx = this->hash_heads[this->HashStr(s)];
|
size_t idx = this->hash_heads[this->HashStr(s)];
|
||||||
|
|
||||||
while (--idx >= 0) {
|
while (idx-- > 0) {
|
||||||
LangString *ls = this->strings[idx];
|
LangString *ls = this->strings[idx];
|
||||||
|
|
||||||
if (strcmp(ls->name, s) == 0) return ls;
|
if (strcmp(ls->name, s) == 0) return ls;
|
||||||
@@ -764,7 +764,7 @@ void StringReader::HandleString(char *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this->data.strings[this->data.next_string_id] != NULL) {
|
if (this->data.strings[this->data.next_string_id] != NULL) {
|
||||||
strgen_error("String ID 0x%X for '%s' already in use by '%s'", this->data.next_string_id, str, this->data.strings[this->data.next_string_id]->name);
|
strgen_error("String ID 0x" PRINTF_SIZEX " for '%s' already in use by '%s'", this->data.next_string_id, str, this->data.strings[this->data.next_string_id]->name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -830,11 +830,15 @@ void StringReader::ParseFile()
|
|||||||
strecpy(_lang.digit_decimal_separator, ".", lastof(_lang.digit_decimal_separator));
|
strecpy(_lang.digit_decimal_separator, ".", lastof(_lang.digit_decimal_separator));
|
||||||
|
|
||||||
_cur_line = 1;
|
_cur_line = 1;
|
||||||
while (this->ReadLine(buf, lastof(buf)) != NULL) {
|
while (this->data.next_string_id < this->data.max_strings && this->ReadLine(buf, lastof(buf)) != NULL) {
|
||||||
rstrip(buf);
|
rstrip(buf);
|
||||||
this->HandleString(buf);
|
this->HandleString(buf);
|
||||||
_cur_line++;
|
_cur_line++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->data.next_string_id == this->data.max_strings) {
|
||||||
|
strgen_error("Too many strings, maximum allowed is " PRINTF_SIZE, this->data.max_strings);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -78,7 +78,10 @@ int64 StringParameters::GetInt64(WChar type)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (this->type != NULL) {
|
if (this->type != NULL) {
|
||||||
assert(this->type[this->offset] == 0 || this->type[this->offset] == type);
|
if (this->type[this->offset] != 0 && this->type[this->offset] != type) {
|
||||||
|
DEBUG(misc, 0, "Trying to read string parameter with wrong type");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
this->type[this->offset] = type;
|
this->type[this->offset] = type;
|
||||||
}
|
}
|
||||||
return this->data[this->offset++];
|
return this->data[this->offset++];
|
||||||
@@ -1416,8 +1419,9 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64 args_array[] = {STR_TOWN_NAME, st->town->index, st->index};
|
uint64 args_array[] = {STR_TOWN_NAME, st->town->index, st->index};
|
||||||
StringParameters tmp_params(args_array);
|
WChar types_array[] = {0, SCC_TOWN_NAME, SCC_NUM};
|
||||||
|
StringParameters tmp_params(args_array, 3, types_array);
|
||||||
buff = GetStringWithArgs(buff, str, &tmp_params, last);
|
buff = GetStringWithArgs(buff, str, &tmp_params, last);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -333,6 +333,7 @@ bool FindSubsidyTownCargoRoute()
|
|||||||
|
|
||||||
/* Select a random town. */
|
/* Select a random town. */
|
||||||
const Town *src_town = Town::GetRandom();
|
const Town *src_town = Town::GetRandom();
|
||||||
|
if (src_town->cache.population < SUBSIDY_CARGO_MIN_POPULATION) return false;
|
||||||
|
|
||||||
CargoTypes town_cargo_produced = src_town->cargo_produced;
|
CargoTypes town_cargo_produced = src_town->cargo_produced;
|
||||||
|
|
||||||
|
|||||||
@@ -2574,6 +2574,7 @@ max = 3
|
|||||||
str = STR_CONFIG_SETTING_SCROLLMODE
|
str = STR_CONFIG_SETTING_SCROLLMODE
|
||||||
strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT
|
strhelp = STR_CONFIG_SETTING_SCROLLMODE_HELPTEXT
|
||||||
strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT
|
strval = STR_CONFIG_SETTING_SCROLLMODE_DEFAULT
|
||||||
|
cat = SC_BASIC
|
||||||
|
|
||||||
[SDTC_BOOL]
|
[SDTC_BOOL]
|
||||||
var = gui.smooth_scroll
|
var = gui.smooth_scroll
|
||||||
@@ -3730,7 +3731,7 @@ var = network.lan_internet
|
|||||||
type = SLE_UINT8
|
type = SLE_UINT8
|
||||||
flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
|
flags = SLF_NOT_IN_SAVE | SLF_NO_NETWORK_SYNC
|
||||||
guiflags = SGF_NETWORK_ONLY
|
guiflags = SGF_NETWORK_ONLY
|
||||||
def = 0
|
def = 1
|
||||||
min = 0
|
min = 0
|
||||||
max = 1
|
max = 1
|
||||||
|
|
||||||
|
|||||||
@@ -402,8 +402,11 @@ static const SpriteID SPR_MONO_SINGLE_SOUTH = 1090;
|
|||||||
static const SpriteID SPR_MONO_SINGLE_EAST = 1091;
|
static const SpriteID SPR_MONO_SINGLE_EAST = 1091;
|
||||||
static const SpriteID SPR_MONO_SINGLE_WEST = 1092;
|
static const SpriteID SPR_MONO_SINGLE_WEST = 1092;
|
||||||
static const SpriteID SPR_MONO_TRACK_Y = 1093;
|
static const SpriteID SPR_MONO_TRACK_Y = 1093;
|
||||||
|
static const SpriteID SPR_MONO_TRACK_X = 1094;
|
||||||
static const SpriteID SPR_MONO_TRACK_BASE = 1100;
|
static const SpriteID SPR_MONO_TRACK_BASE = 1100;
|
||||||
static const SpriteID SPR_MONO_TRACK_N_S = 1117;
|
static const SpriteID SPR_MONO_TRACK_N_S = 1117;
|
||||||
|
static const SpriteID SPR_MONO_TRACK_Y_SNOW = 1119;
|
||||||
|
static const SpriteID SPR_MONO_TRACK_X_SNOW = 1120;
|
||||||
static const SpriteID SPR_MGLV_SINGLE_X = 1169;
|
static const SpriteID SPR_MGLV_SINGLE_X = 1169;
|
||||||
static const SpriteID SPR_MGLV_SINGLE_Y = 1170;
|
static const SpriteID SPR_MGLV_SINGLE_Y = 1170;
|
||||||
static const SpriteID SPR_MGLV_SINGLE_NORTH = 1171;
|
static const SpriteID SPR_MGLV_SINGLE_NORTH = 1171;
|
||||||
@@ -411,7 +414,10 @@ static const SpriteID SPR_MGLV_SINGLE_SOUTH = 1172;
|
|||||||
static const SpriteID SPR_MGLV_SINGLE_EAST = 1173;
|
static const SpriteID SPR_MGLV_SINGLE_EAST = 1173;
|
||||||
static const SpriteID SPR_MGLV_SINGLE_WEST = 1174;
|
static const SpriteID SPR_MGLV_SINGLE_WEST = 1174;
|
||||||
static const SpriteID SPR_MGLV_TRACK_Y = 1175;
|
static const SpriteID SPR_MGLV_TRACK_Y = 1175;
|
||||||
|
static const SpriteID SPR_MGLV_TRACK_X = 1176;
|
||||||
static const SpriteID SPR_MGLV_TRACK_BASE = 1182;
|
static const SpriteID SPR_MGLV_TRACK_BASE = 1182;
|
||||||
|
static const SpriteID SPR_MGLV_TRACK_Y_SNOW = 1184;
|
||||||
|
static const SpriteID SPR_MGLV_TRACK_X_SNOW = 1185;
|
||||||
static const SpriteID SPR_MGLV_TRACK_N_S = 1199;
|
static const SpriteID SPR_MGLV_TRACK_N_S = 1199;
|
||||||
static const SpriteID SPR_WAYPOINT_X_1 = SPR_OPENTTD_BASE + 78;
|
static const SpriteID SPR_WAYPOINT_X_1 = SPR_OPENTTD_BASE + 78;
|
||||||
static const SpriteID SPR_WAYPOINT_X_2 = SPR_OPENTTD_BASE + 79;
|
static const SpriteID SPR_WAYPOINT_X_2 = SPR_OPENTTD_BASE + 79;
|
||||||
|
|||||||
@@ -1991,7 +1991,7 @@ static const char * const _name_romanian_real[] = {
|
|||||||
"Motru",
|
"Motru",
|
||||||
"N\xC4\x83s\xC4\x83ud",
|
"N\xC4\x83s\xC4\x83ud",
|
||||||
"N\xC4\x83vodari",
|
"N\xC4\x83vodari",
|
||||||
"Odobe\xC8x99ti",
|
"Odobe\xC8\x99ti",
|
||||||
"Olteni\xC8\x9B""a",
|
"Olteni\xC8\x9B""a",
|
||||||
"One\xC8\x99ti",
|
"One\xC8\x99ti",
|
||||||
"Oradea",
|
"Oradea",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ void MarkAllViewportsDirty(int left, int top, int right, int bottom);
|
|||||||
bool DoZoomInOutWindow(ZoomStateChange how, Window *w);
|
bool DoZoomInOutWindow(ZoomStateChange how, Window *w);
|
||||||
void ZoomInOrOutToCursorWindow(bool in, Window * w);
|
void ZoomInOrOutToCursorWindow(bool in, Window * w);
|
||||||
Point GetTileZoomCenterWindow(bool in, Window * w);
|
Point GetTileZoomCenterWindow(bool in, Window * w);
|
||||||
|
void FixTitleGameZoom();
|
||||||
void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out);
|
void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2634,7 +2634,7 @@ static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest,
|
|||||||
NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
|
NWidgetResizeBase *nwrb = dynamic_cast<NWidgetResizeBase *>(*dest);
|
||||||
if (nwrb != NULL) {
|
if (nwrb != NULL) {
|
||||||
assert(parts->u.xy.x >= 0 && parts->u.xy.y >= 0);
|
assert(parts->u.xy.x >= 0 && parts->u.xy.y >= 0);
|
||||||
nwrb->SetMinimalSize(parts->u.xy.x, parts->u.xy.y);
|
nwrb->SetMinimalSize(ScaleGUITrad(parts->u.xy.x), ScaleGUITrad(parts->u.xy.y));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2664,7 +2664,7 @@ static int MakeNWidget(const NWidgetPart *parts, int count, NWidgetBase **dest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
case WPT_PADDING:
|
case WPT_PADDING:
|
||||||
if (*dest != NULL) (*dest)->SetPadding(parts->u.padding.top, parts->u.padding.right, parts->u.padding.bottom, parts->u.padding.left);
|
if (*dest != NULL) (*dest)->SetPadding(ScaleGUITrad(parts->u.padding.top), ScaleGUITrad(parts->u.padding.right), ScaleGUITrad(parts->u.padding.bottom), ScaleGUITrad(parts->u.padding.left));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WPT_PIPSPACE: {
|
case WPT_PIPSPACE: {
|
||||||
|
|||||||
@@ -2414,7 +2414,7 @@ static void HandleScrollbarScrolling(Window *w)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Find the item we want to move to and make sure it's inside bounds. */
|
/* Find the item we want to move to and make sure it's inside bounds. */
|
||||||
int pos = min(max(0, i + _scrollbar_start_pos) * sb->GetCount() / _scrollbar_size, max(0, sb->GetCount() - sb->GetCapacity()));
|
int pos = min(RoundDivSU(max(0, i + _scrollbar_start_pos) * sb->GetCount(), _scrollbar_size), max(0, sb->GetCount() - sb->GetCapacity()));
|
||||||
if (rtl) pos = max(0, sb->GetCount() - sb->GetCapacity() - pos);
|
if (rtl) pos = max(0, sb->GetCount() - sb->GetCapacity() - pos);
|
||||||
if (pos != sb->GetPosition()) {
|
if (pos != sb->GetPosition()) {
|
||||||
sb->SetPosition(pos);
|
sb->SetPosition(pos);
|
||||||
|
|||||||
Reference in New Issue
Block a user