mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-25 15:39:09 +00:00
Compare commits
49 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0e37571fad | ||
|
05ca97a975 | ||
|
a6a4d7110c | ||
|
83d5c6a88d | ||
|
54ad65d246 | ||
|
bb02a4ec73 | ||
|
d726d793ed | ||
|
b704037039 | ||
|
975b6de604 | ||
|
fc11459405 | ||
|
1971a5a2fe | ||
|
caa1a6fdeb | ||
|
4a031c91db | ||
|
9a04ccdcab | ||
|
b6549a448d | ||
|
b8abfce71d | ||
|
8dfe4d2dca | ||
|
012871f24c | ||
|
7f8b41d956 | ||
|
fcaca9f7ee | ||
|
5ca16c21d3 | ||
|
0603cd6efc | ||
|
4e6310d848 | ||
|
7549982f12 | ||
|
87064a39a6 | ||
|
e4efad8374 | ||
|
7faff38bfb | ||
|
2b5280bedb | ||
|
dd0bc179be | ||
|
2a13e8c184 | ||
|
557be445af | ||
|
12fac2345e | ||
|
adcb6aac5a | ||
|
c70e680e5e | ||
|
50fa7f679f | ||
|
8545ab9c22 | ||
|
9c36498695 | ||
|
d5e69ff1fa | ||
|
908ff68459 | ||
|
b6d5e4d60c | ||
|
d793f89ec3 | ||
|
32aee004c6 | ||
|
5814764af9 | ||
|
e19915d824 | ||
|
9bcd02e389 | ||
|
2ab087f31f | ||
|
9d168228e7 | ||
|
8f8be22bc9 | ||
|
ebb7d2084b |
@@ -10,9 +10,13 @@
|
||||
#
|
||||
|
||||
# The revision is needed for the bundle name and creating an OSX application bundle.
|
||||
ifdef REVISION
|
||||
REV := $(REVISION)
|
||||
else
|
||||
# Detect the revision
|
||||
VERSIONS := $(shell AWK="$(AWK)" "$(ROOT_DIR)/findversion.sh")
|
||||
REV := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ')
|
||||
endif
|
||||
|
||||
# Make sure we have something in REV
|
||||
ifeq ($(REV),)
|
||||
@@ -26,13 +30,11 @@ endif
|
||||
# An OSX application bundle needs the data files, lang files and openttd executable in a different location.
|
||||
ifdef OSXAPP
|
||||
AI_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/ai
|
||||
GAME_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/game
|
||||
BASESET_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/baseset
|
||||
LANG_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/lang
|
||||
TTD_DIR = $(BUNDLE_DIR)/$(OSXAPP)/Contents/MacOS
|
||||
else
|
||||
AI_DIR = $(BUNDLE_DIR)/ai
|
||||
GAME_DIR = $(BUNDLE_DIR)/game
|
||||
BASESET_DIR = $(BUNDLE_DIR)/baseset
|
||||
LANG_DIR = $(BUNDLE_DIR)/lang
|
||||
TTD_DIR = $(BUNDLE_DIR)
|
||||
@@ -47,7 +49,6 @@ bundle: all
|
||||
$(Q)mkdir -p "$(BUNDLE_DIR)/scripts"
|
||||
$(Q)mkdir -p "$(TTD_DIR)"
|
||||
$(Q)mkdir -p "$(AI_DIR)"
|
||||
$(Q)mkdir -p "$(GAME_DIR)"
|
||||
$(Q)mkdir -p "$(BASESET_DIR)"
|
||||
$(Q)mkdir -p "$(LANG_DIR)"
|
||||
ifdef OSXAPP
|
||||
@@ -62,7 +63,6 @@ ifeq ($(OS),UNIX)
|
||||
endif
|
||||
$(Q)cp "$(BIN_DIR)/$(TTD)" "$(TTD_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/ai/"compat_*.nut "$(AI_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/game/"compat_*.nut "$(GAME_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/baseset/"*.grf "$(BASESET_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/baseset/"*.obg "$(BASESET_DIR)/"
|
||||
$(Q)cp "$(BIN_DIR)/baseset/"*.obs "$(BASESET_DIR)/"
|
||||
|
@@ -36,7 +36,6 @@ endif
|
||||
|
||||
GRFCODEC := !!GRFCODEC!!
|
||||
NFORENUM := !!NFORENUM!!
|
||||
CC_BUILD := !!CC_BUILD!!
|
||||
MD5SUM := $(shell [ "$(OS)" = "OSX" ] && echo "md5 -r" || echo "md5sum")
|
||||
|
||||
# Some "should not be changed" settings.
|
||||
@@ -64,7 +63,7 @@ $(BIN_DIR)/openttd.grf: $(OBJS_DIR)/openttd.grf
|
||||
$(OBJS_DIR)/openttd.grf: $(PNG_FILES) $(NFO_FILES) $(OBJS_DIR)/sprites
|
||||
$(E) '$(STAGE) Assembling openttd.nfo'
|
||||
$(Q)-cp $(PNG_FILES) $(OBJS_DIR)/sprites 2> /dev/null
|
||||
$(Q) $(CC_BUILD) -nostdinc -I$(GRF_DIR) -C -E - < "$(GRF_DIR)/openttd.nfo" | sed -e '/^#/d' -e '/^$$/d' > $(OBJS_DIR)/sprites/openttd.nfo
|
||||
$(Q) gcc -I$(GRF_DIR) -C -E - < "$(GRF_DIR)/openttd.nfo" | sed -e '/^#/d' -e '/^$$/d' > $(OBJS_DIR)/sprites/openttd.nfo
|
||||
$(Q) $(NFORENUM) -s $(OBJS_DIR)/sprites/openttd.nfo
|
||||
$(E) '$(STAGE) Compiling openttd.grf'
|
||||
$(Q) $(GRFCODEC) -n -s -e -p1 $(OBJS_DIR)/openttd.grf
|
||||
|
@@ -41,6 +41,7 @@ TTDS = $(SRC_DIRS:%=%/$(TTD))
|
||||
OS = !!OS!!
|
||||
OSXAPP = !!OSXAPP!!
|
||||
LIPO = !!LIPO!!
|
||||
REVISION = !!REVISION!!
|
||||
AWK = !!AWK!!
|
||||
SORT = !!SORT!!
|
||||
DISTCC = !!DISTCC!!
|
||||
|
@@ -6,5 +6,3 @@
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
AILog.Info("1.2 API compatability in effect.");
|
||||
|
@@ -1,8 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
@@ -88,9 +88,9 @@
|
||||
abs( 21): 21
|
||||
|
||||
--AIBase--
|
||||
Rand(): -54346916
|
||||
Rand(): -937374575
|
||||
Rand(): 823953997
|
||||
Rand(): 1259692483
|
||||
Rand(): -1289244298
|
||||
Rand(): -1572996668
|
||||
RandRange(0): 0
|
||||
RandRange(0): 0
|
||||
RandRange(0): 0
|
||||
@@ -98,12 +98,12 @@
|
||||
RandRange(1): 0
|
||||
RandRange(1): 0
|
||||
RandRange(2): 1
|
||||
RandRange(2): 0
|
||||
RandRange(2): 1
|
||||
RandRange(2): 1
|
||||
RandRange(1000000): 966676
|
||||
RandRange(1000000): 289525
|
||||
RandRange(1000000): 170283
|
||||
Chance(1, 2): false
|
||||
RandRange(1000000): 36500
|
||||
RandRange(1000000): 300101
|
||||
RandRange(1000000): 418369
|
||||
Chance(1, 2): true
|
||||
Chance(1, 2): true
|
||||
Chance(1, 2): false
|
||||
|
||||
@@ -420,144 +420,144 @@
|
||||
1098 => 46116
|
||||
1099 => 46158
|
||||
Randomize ListDump:
|
||||
1 => -200078348
|
||||
2 => -29799264
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1006 => -2069479746
|
||||
1007 => -1819131606
|
||||
1008 => -1007163964
|
||||
1009 => -1185394870
|
||||
1010 => -1471365065
|
||||
1011 => 364354366
|
||||
1012 => -1478084253
|
||||
1013 => 405281367
|
||||
1014 => -11170062
|
||||
1015 => 156767750
|
||||
1016 => 1288924796
|
||||
1017 => 1796884876
|
||||
1018 => -1947073702
|
||||
1019 => -1999614238
|
||||
1020 => -231292809
|
||||
1021 => 966621566
|
||||
1022 => -606766557
|
||||
1023 => -1138727825
|
||||
1024 => -749544262
|
||||
1025 => 2004771271
|
||||
1026 => 686734186
|
||||
1027 => 923274744
|
||||
1028 => -1672035149
|
||||
1029 => -1642064950
|
||||
1030 => 1363389551
|
||||
1031 => -559500928
|
||||
1032 => 1656196991
|
||||
1033 => 1655354425
|
||||
1034 => -1027156689
|
||||
1035 => 1952644328
|
||||
1036 => 1217870217
|
||||
1037 => 242274100
|
||||
1038 => 201816080
|
||||
1039 => 2127464758
|
||||
1040 => 446043650
|
||||
1041 => -319728455
|
||||
1042 => 204701002
|
||||
1043 => -571265398
|
||||
1044 => -1422217131
|
||||
1045 => -391208397
|
||||
1046 => -1822628371
|
||||
1047 => -1499755350
|
||||
1048 => -1422137641
|
||||
1049 => 1621693134
|
||||
1051 => -1428728134
|
||||
1052 => -147587573
|
||||
1053 => 681719500
|
||||
1054 => 1172011190
|
||||
1055 => -1834344882
|
||||
1056 => 1157634586
|
||||
1057 => 1902133676
|
||||
1058 => -1967780161
|
||||
1059 => -1618025531
|
||||
1060 => -810220453
|
||||
1061 => 1582854921
|
||||
1062 => -410004643
|
||||
1063 => 1159917159
|
||||
1064 => -1377804984
|
||||
1065 => -738843914
|
||||
1066 => -1578756103
|
||||
1067 => -464090986
|
||||
1068 => 1711504679
|
||||
1069 => 545330655
|
||||
1070 => 379462570
|
||||
1071 => 514511099
|
||||
1072 => -1813251176
|
||||
1073 => 1424958266
|
||||
1074 => -825255131
|
||||
1075 => 539054595
|
||||
1076 => -1764192010
|
||||
1077 => -1243277769
|
||||
1078 => 2017874281
|
||||
1079 => -1972353607
|
||||
1080 => 1879761467
|
||||
1081 => 1638986560
|
||||
1082 => -1832287507
|
||||
1083 => -492411882
|
||||
1084 => 658940812
|
||||
1085 => -1044199400
|
||||
1086 => 1586504918
|
||||
1087 => -125492611
|
||||
1088 => -1562883174
|
||||
1089 => -1013778441
|
||||
1090 => 1560228607
|
||||
1091 => -550265689
|
||||
1092 => 524767105
|
||||
1093 => -713387661
|
||||
1094 => 1425927738
|
||||
1095 => 942653932
|
||||
1096 => 1233220698
|
||||
1097 => 1313602368
|
||||
1098 => -140318584
|
||||
1099 => 1199179892
|
||||
1 => 966621566
|
||||
2 => -606766557
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1006 => -1642064950
|
||||
1007 => 1363389551
|
||||
1008 => -559500928
|
||||
1009 => 1656196991
|
||||
1010 => 1655354425
|
||||
1011 => -1027156689
|
||||
1012 => 1952644328
|
||||
1013 => 1217870217
|
||||
1014 => 242274100
|
||||
1015 => 201816080
|
||||
1016 => 2127464758
|
||||
1017 => 446043650
|
||||
1018 => -319728455
|
||||
1019 => 204701002
|
||||
1020 => -571265398
|
||||
1021 => -1422217131
|
||||
1022 => -391208397
|
||||
1023 => -1822628371
|
||||
1024 => -1499755350
|
||||
1025 => -1422137641
|
||||
1026 => 1621693134
|
||||
1027 => -1428728134
|
||||
1028 => -147587573
|
||||
1029 => 681719500
|
||||
1030 => 1172011190
|
||||
1031 => -1834344882
|
||||
1032 => 1157634586
|
||||
1033 => 1902133676
|
||||
1034 => -1967780161
|
||||
1035 => -1618025531
|
||||
1036 => -810220453
|
||||
1037 => 1582854921
|
||||
1038 => -410004643
|
||||
1039 => 1159917159
|
||||
1040 => -1377804984
|
||||
1041 => -738843914
|
||||
1042 => -1578756103
|
||||
1043 => -464090986
|
||||
1044 => 1711504679
|
||||
1045 => 545330655
|
||||
1046 => 379462570
|
||||
1047 => 514511099
|
||||
1048 => -1813251176
|
||||
1049 => 1424958266
|
||||
1051 => -825255131
|
||||
1052 => 539054595
|
||||
1053 => -1764192010
|
||||
1054 => -1243277769
|
||||
1055 => 2017874281
|
||||
1056 => -1972353607
|
||||
1057 => 1879761467
|
||||
1058 => 1638986560
|
||||
1059 => -1832287507
|
||||
1060 => -492411882
|
||||
1061 => 658940812
|
||||
1062 => -1044199400
|
||||
1063 => 1586504918
|
||||
1064 => -125492611
|
||||
1065 => -1562883174
|
||||
1066 => -1013778441
|
||||
1067 => 1560228607
|
||||
1068 => -550265689
|
||||
1069 => 524767105
|
||||
1070 => -713387661
|
||||
1071 => 1425927738
|
||||
1072 => 942653932
|
||||
1073 => 1233220698
|
||||
1074 => 1313602368
|
||||
1075 => -140318584
|
||||
1076 => 1199179892
|
||||
1077 => 91450916
|
||||
1078 => -1471626821
|
||||
1079 => -552692855
|
||||
1080 => -801295697
|
||||
1081 => 1307607393
|
||||
1082 => -2111765574
|
||||
1083 => 1773729008
|
||||
1084 => -81987003
|
||||
1085 => -1090790034
|
||||
1086 => -843700327
|
||||
1087 => -1306436740
|
||||
1088 => 735656985
|
||||
1089 => -1933491876
|
||||
1090 => 642759863
|
||||
1091 => 255293949
|
||||
1092 => -1052469001
|
||||
1093 => -1043605053
|
||||
1094 => -2080328201
|
||||
1095 => -1825196581
|
||||
1096 => -1789181164
|
||||
1097 => -1636072563
|
||||
1098 => -111321262
|
||||
1099 => 1979741000
|
||||
KeepTop(10):
|
||||
1 => -200078348
|
||||
2 => -29799264
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1006 => -2069479746
|
||||
1007 => -1819131606
|
||||
1 => 966621566
|
||||
2 => -606766557
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1006 => -1642064950
|
||||
1007 => 1363389551
|
||||
KeepBottom(8):
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1006 => -2069479746
|
||||
1007 => -1819131606
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
1006 => -1642064950
|
||||
1007 => 1363389551
|
||||
RemoveBottom(2):
|
||||
1000 => 1630721656
|
||||
1001 => 959306175
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1000 => -1138727825
|
||||
1001 => -749544262
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
RemoveTop(2):
|
||||
1002 => 1527421791
|
||||
1003 => 1259692483
|
||||
1004 => -1289244298
|
||||
1005 => -1572996668
|
||||
1002 => 2004771271
|
||||
1003 => 686734186
|
||||
1004 => 923274744
|
||||
1005 => -1672035149
|
||||
RemoveList({1003, 1004}):
|
||||
1002 => 1527421791
|
||||
1005 => -1572996668
|
||||
1002 => 2004771271
|
||||
1005 => -1672035149
|
||||
KeepList({1003, 1004, 1005}):
|
||||
1005 => -1572996668
|
||||
1005 => -1672035149
|
||||
AddList({1005, 4000, 4001, 4002}):
|
||||
1005 => 1005
|
||||
4000 => 8000
|
||||
@@ -588,7 +588,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
SetName(): false
|
||||
GetLastErrorString(): ERR_NAME_IS_NOT_UNIQUE
|
||||
GetName(): Regression
|
||||
GetPresidentName(): P. Sharkey
|
||||
GetPresidentName(): I. McAlpine
|
||||
SetPresidentName(): true
|
||||
GetPresidentName(): Regression AI
|
||||
GetBankBalance(): 100000
|
||||
@@ -7384,7 +7384,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
HasRoadType(Road): true
|
||||
HasRoadType(Tram): false
|
||||
GetNeighbourRoadCount(): 2
|
||||
RemoveRoad(): false
|
||||
RemoveRoad(): true
|
||||
RemoveRoad(): true
|
||||
RemoveRoad(): false
|
||||
RemoveRoad(): true
|
||||
@@ -8951,7 +8951,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
GetWagonEngineType(): 27
|
||||
GetWagonAge(): 1
|
||||
GetWagonEngineType(): 27
|
||||
GetWagonAge(): 0
|
||||
GetWagonAge(): 1
|
||||
GetWagonEngineType(): 65535
|
||||
GetWagonAge(): -1
|
||||
--Errors--
|
||||
@@ -9148,6 +9148,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
|
||||
GetDestinationType(): 1
|
||||
GetDestinationIndex(): 7
|
||||
GetCargoType(): 0
|
||||
GetNextEvent: instance
|
||||
GetEventType: 6
|
||||
Unknown Event
|
||||
IsEventWaiting: false
|
||||
|
||||
--Math--
|
||||
|
@@ -6,7 +6,7 @@ class Regression extends AIInfo {
|
||||
function GetShortName() { return "REGR"; }
|
||||
function GetDescription() { return "This runs regression-tests on all commands. On the same map the result should always be the same."; }
|
||||
function GetVersion() { return 1; }
|
||||
function GetAPIVersion() { return "1.3"; }
|
||||
function GetAPIVersion() { return "1.2"; }
|
||||
function GetDate() { return "2007-03-18"; }
|
||||
function CreateInstance() { return "Regression"; }
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
|
||||
TRGC.GRF = ed446637e034104c5559b32c18afe78d
|
||||
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
|
||||
TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
|
||||
OPENTTD.GRF = c683a77e1a43aed7db29ef318b166dd9
|
||||
OPENTTD.GRF = 51f9d2b8a29a079e83486db13509336c
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
|
||||
TRGC.GRF = ed446637e034104c5559b32c18afe78d
|
||||
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
|
||||
TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
|
||||
OPENTTD.GRF = c683a77e1a43aed7db29ef318b166dd9
|
||||
OPENTTD.GRF = 51f9d2b8a29a079e83486db13509336c
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
@@ -55,7 +55,7 @@ TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
|
||||
TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
|
||||
TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
|
||||
TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
|
||||
OPENTTD.GRF = c683a77e1a43aed7db29ef318b166dd9
|
||||
OPENTTD.GRF = 51f9d2b8a29a079e83486db13509336c
|
||||
|
||||
[origin]
|
||||
default = You can find it on your Transport Tycoon Deluxe CD-ROM.
|
||||
|
@@ -1,10 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
GSLog.Info("1.2 API compatability in effect.");
|
@@ -1,8 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
260
changelog.txt
260
changelog.txt
@@ -1,262 +1,6 @@
|
||||
1.3.0 (2013-04-01)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Station rebuilding could leave reserved tiles which caused crashes later on [FS#5510, FS#5516] (r25132)
|
||||
- Fix: When the count for a scrollbar was 0, the inter distance was subtracted too much causing a scrollbar with a negative size (r25123)
|
||||
|
||||
|
||||
1.3.0-RC3 (2013-03-18)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Limit aircraft property 0D to 19, since the conversion result to km-ish/h needs to fit into a byte [FS#5492] (r25099)
|
||||
- Fix: Clicking the statusbar crashed, when news were pending but no news were shown yet [FS#5486] (r25093)
|
||||
- Fix: Make editbox character filters also apply to pasted content from clipboard (r25090, r25089)
|
||||
- Fix: Catch exception anonymously, if the exception content is not of interest [FS#5500] (r25081)
|
||||
|
||||
|
||||
1.3.0-RC2 (2013-03-05)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: Make sizes of the station preview list and direction selection identical in the station build window [FS#5472] (r25064)
|
||||
- Fix: When allocation of the sprite cache fails, try to allocate less memory and display an error message later on (r25061)
|
||||
- Fix: Refactor Script Debug GUI to only set widget states in OnInvalidateData [FS#5490] (r25052)
|
||||
- Fix: Do not let gcc include files from the "standard C" include directories to avoid inclusion of header files at the top of the preprocessed nfo files, which cause NFOrenum/GRFcodec to make invalid assumptions about the NFO version (r25050)
|
||||
- Fix: Minimise gaps feature caused removal to only happen at the signal build interval instead of the implicit interval of 1 [FS#5479] (r25038)
|
||||
- Fix: Green path signals would be shown when building them 'under' a train, and they would keep showing green until they were passed again [FS#5480] (r25037)
|
||||
|
||||
|
||||
1.3.0-RC1 (2013-02-19)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: Searching of (missing) content via GrfCrawler (r25024, r25023)
|
||||
- Change: Cleanup goals and cargo monitors of companies when they go bankrupt or are taken over (r24986)
|
||||
- Change: Apply the same name sorting rules to content and NewGRF list as for the server list (r24983)
|
||||
- Fix: [SDL] Crash after bootstrap download of 32bits base set due to referencing a deleted mutex [FS#5466] (r25017)
|
||||
- Fix: [SDL] Improve 8bpp hardware palette support. Instead of always requesting SDL_HWPALETTE, it is now only done for 8bp blitters in fullscreen mode (r25003, r25002, r24993)
|
||||
- Fix: Set vehicle's service interval is percent flag appropriately on creation [FS#5137] (r24998)
|
||||
- Fix: When choosing a train in a depot to attach a newly purchased wagon to, do not consider trains currently moving in and out of the depot (r24987)
|
||||
- Fix: [Script] Crash when passing too many parameters [FS#5465] (r24982, r24981, r24980)
|
||||
|
||||
|
||||
1.3.0-beta2 (2013-02-07)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: [NewGRF] Station randomisation triggers (r24906, r24905)
|
||||
- Feature: Settings type filter included in the advanced settings GUI (r24862, r24863)
|
||||
- Change: Revert to opening the vehicle GUI again when cloning vehicles using the clone-button from the depot GUI [FS#4458] (r24955)
|
||||
- Fix: Additional zoom in levels could glitch by a few pixels due to incorrect rounding [FS#5463] (r24975)
|
||||
- Fix: Honour pause_on_newgame setting when running as a dedicated server [FS#5279] (r24974)
|
||||
- Fix: [NewGRF] Prevent access to tile-based variables when tile is invalid [FS#5462] (r24973)
|
||||
- Fix: Do not make overbuilding rivers with canals insanely expensive [FS#5258] (r24972)
|
||||
- Fix: Crash when an infinite loop occurred during loading of a script [FS#5346] (r24970)
|
||||
- Fix: company window was not updated when shares were enabled/disabled [FS#5379] (r24968)
|
||||
- Fix: Trams would get stuck on water [FS#5228] (r24966)
|
||||
- Fix: With YAPF the docking behaviour differed per direction; now favour docking in the direction you approached [FS#5416] (r24964)
|
||||
- Fix: Do not stop loading if there are reservations left [FS#5435] (r24963)
|
||||
- Fix: Reserve all capacity while unloading to avoid 'stealing' cargo, i.e. loading cargo onto a second vehicle when the first cannot be fully filled yet [FS#5438] (r24962)
|
||||
- Fix: If a platform is enlarged and there is a reservation, reserve the whole platform [FS#5362] (r24961)
|
||||
- Fix: Inconsistencies in the 'thanks to' lists [FS#5423] (r24960)
|
||||
- Fix: Set 'replace when old' flag when replacing an autoreplace (r24950)
|
||||
- Fix: Deleting implicit orders was not able to deal with the various side-effects of DeleteOrder [FS#5452] (r24944)
|
||||
- Fix: Redraw autoreplace window properly in network games (r24939)
|
||||
- Fix: Never put a space between cargo name and subtype [FS#5447] (r24938)
|
||||
- Fix: Do not allow order refit to be set for no-load orders [FS#5446] (r24936)
|
||||
- Fix: Make group names unique per company and vehicle type [FS#3473] (r24933)
|
||||
- Fix: Prevent more NewGRFs being selected than is possible to load [FS#5158] (r24932)
|
||||
- Fix: [GS] Do not try to pause or unpause crashed scripts [FS#5415] (r24929)
|
||||
- Fix: [Squirrel] Update line information before processing 'while' token of 'do'-'while' statement [FS#5408] (r24928)
|
||||
- Fix: Add a tooltip to the mapsize selection mentioning possible deviations [FS#5395] (r24925)
|
||||
- Fix: When an object built on a river is removed, restore the river [FS#5441] (r24923)
|
||||
- Fix: Upgrading bridges could steal road types [FS#5389] (r24912)
|
||||
- Fix: [GS] Allow GSs to pass negative integer string parameters (r24908)
|
||||
- Fix: 'Train loads/unloads cargo' station animation triggers on individual platform (r24904)
|
||||
- Fix: Cached station animation triggers were only set when removing parts of a station (r24903)
|
||||
- Fix: The station build window did not update when the station spread changed [FS#5434] (r24899)
|
||||
- Fix: Do not unpause the game when closing the highscore window if it was already paused before the highscore screen was shown (r24898)
|
||||
- Fix: Improvements and fixes for the base translation [FS#5411, FS#5420, FS#5421, FS#5422, FS#5427] (r24896, r24875, r24872, r24869)
|
||||
- Fix: Allow downgrade of road bridges in the scenario editor [FS#5436] (r24895)
|
||||
- Fix: Invalidate station selection window when station spread changes [FS#5434] (r24894)
|
||||
- Fix: Distribute GS compat_<version>.nut with OpenTTD (r24890)
|
||||
- Fix: Pass proper UTF-16 strings instead of UCS-2 to ICU in order to preserve characters outside the BMP (r24885)
|
||||
- Fix: A completely emptied vehicle could trigger an assert (r24883)
|
||||
- Fix: Desync when NewGRF changes the stats related to acceleration (power, weight, tractive effort, etc) during service or 32 day triggers (r24882)
|
||||
- Fix: Incorrect Romanian own name (r24874)
|
||||
- Fix: Make invalid sprite references to mapgen sprites behave the same as invalid references between recolour and real sprites [FS#5404] (r24858)
|
||||
- Fix: Do not let UFOs and coal mines clear water (r24857)
|
||||
- Fix: Do not let UFOs and coal mines destroy depots [FS#5406] (r24856)
|
||||
- Fix: Do not send aircraft to depots that are out of range of the next destination [FS#5405] (r24855)
|
||||
- Fix: Only consider vehicles available in the climate for purchase/depot cell size (r24854)
|
||||
- Fix: Extend widget data member to 32 bits so that sprite IDs >= 2^16 can be used (r24853)
|
||||
|
||||
|
||||
1.3.0-beta1 (2012-12-24)
|
||||
------------------------------------------------------------------------
|
||||
- Feature: Advanced settings to disable certain sound effects (r24846)
|
||||
- Feature: [NewGRF] Support oversized purchase list sprites [FS#5271] (r24839)
|
||||
- Feature: Improve pylon placement around station tiles that display neither pylons nor catenary (r24836)
|
||||
- Feature: When using a non-release version of OpenTTD and the basegraphics are missing some sprites, also suggest to use a non-release version of the basegraphics (r24821)
|
||||
- Feature: Consider engine preview windows always sticky, so non-shift mass-closure does not affect them [FS#2632] (r24809)
|
||||
- Feature: When share-cloning vehicles do not open the vehicle window of the new vehicle [FS#4458] (r24808)
|
||||
- Feature: Enable usage of 'companies' console command also in singleplayer [FS#2820] (r24807)
|
||||
- Feature: Ask for confirmation before creating giant screenshots [FS#3148] (r24806)
|
||||
- Feature: Separate subdirectory for screenshots (r24804)
|
||||
- Feature: Unify the difficulty settings window with the advanced settings window (r24791, r24792)
|
||||
- Feature: Various methods to open the OSK (r24785)
|
||||
- Feature: Add a string filter to the server list [FS#3852] (r24769)
|
||||
- Feature: Add industry type and cargo dropdown selection for easier navigating in the industry chain window (r24763)
|
||||
- Feature: Introduce GUI icons for deleting to the left/right (r24749)
|
||||
- Feature: Add clear button to all editboxes (r24748)
|
||||
- Feature: Reset the vehicle engine pool when starting a scenario (r24716)
|
||||
- Feature: Add basic/advanced/expert filters to the advanced settings GUI [FS#5355] (r24671)
|
||||
- Feature: Draw cargo labels in the station list black or white depending on the background colour [FS#5311] (r24668)
|
||||
- Feature: Do not display the preview window for disabled vehicle types (r24660)
|
||||
- Feature: Add new filter option to the advanced settings window to show only changed settings (r24647)
|
||||
- Feature: Add text filtering to advanced settings (r24632)
|
||||
- Feature: Add buttons to expand/collapse all to advanced settings GUI (r24631)
|
||||
- Feature: [GS] Allow GameScripts to construct and prospect industries without having a sponsor (r24623)
|
||||
- Feature: Pay interest also on a negative cash value (r24618)
|
||||
- Feature: Sort cargo filter by cargo name/label at the company stations window [FS#5311] (r24615)
|
||||
- Feature: More options for the auto-scroll setting (r24590)
|
||||
- Feature: Allow AI/GS script developers to break the execution of their scripts and pause the game using ScriptController::Break() (r24542, r24575)
|
||||
- Feature: Scripts can be suspended even if the game is still progressing, thus break-on-log now works also for Game Scripts (r24537)
|
||||
- Feature: Highlight industries on the smallmap when the mouse is over an entry in the legend (r24534)
|
||||
- Feature: [NewGRF] Allow resolving var 5F via vehicle var 61 (r24527)
|
||||
- Feature: [OSX] Additional high-resolution icons for the app bundle [FS#4539] (r24525)
|
||||
- Feature: Ctrl+Backspace/Delete to remove characters up to next word beginning in text edit boxes [FS#5203] (r24521)
|
||||
- Feature: Ctrl+Arrow keys to move entire words in text edit boxes [FS#5203] (r24520)
|
||||
- Feature: When using autorefit only load/refit vehicles if other wagons cannot already take all cargo without refitting [FS#5106] (r24497)
|
||||
- Feature: [GS] Useful behaviour for GSEngine::IsValidEngine and GSEngine::IsBuildable when outside GSCompanyMode scope (r24492)
|
||||
- Feature: Display GS dead state in AI debug window [FS#5230] (r24489)
|
||||
- Feature: Add buttons to view textfiles from the online content window [FS#5236] (r24488)
|
||||
- Feature: Make the pathfinder decide whether ships shall leave depots towards north or south [FS#5127] (r24481)
|
||||
- Feature: [GS] API compatibility scripts for Goal Scripts [FS#5219] (r24468)
|
||||
- Feature: Display in the advanced settings description a setting type which explains the scope of changes to a particular setting [FS#5244] (r24411)
|
||||
- Feature: [GS] Allow game scripts to monitor cargo pickups and deliveries done by companies (r24406)
|
||||
- Feature: [NewGRF] Allow vehicle variable 61 for callback 2D (recolour) and re-randomisation (r24371)
|
||||
- Feature: [NewGRF] Customisable signals for rail types (r24367)
|
||||
- Feature: Allow filtering for multiple words (separated by whitespace resp. quoted) in script breakpoints, the sign list, content and NewGRF-GUIs (r24337, r24342)
|
||||
- Feature: Add dropdowns to NewGRF configurations, if all values have labels (r24318)
|
||||
- Feature: Add dropdowns to AI configurations, if all values have labels (r24317)
|
||||
- Feature: Allow to select advanced settings with limited range with a dropdown list (r24316)
|
||||
- Feature: Display default values for advanced settings in the settings description (r24298)
|
||||
- Feature: News item for exclusive transport rights [FS#2688] (r24287)
|
||||
- Feature: [GS] Additional GSNews::NewsItem::NewsTypes (r24286)
|
||||
- Feature: [NewGRF] Variable with the current max speed for vehicles [FS#5052] (r24246)
|
||||
- Feature: Descriptions explaining the meaning of advanced settings (r24237)
|
||||
- Feature: Split the renew-months setting text in two string values (one before life time and one after) (r24210)
|
||||
- Feature: Show a hint in the supplies tab of station windows, if the station is affected by exclusive transport rights [FS#5178] (r24205)
|
||||
- Feature: [NewGRF] Callback to set industry production level on construction (r24186)
|
||||
- Feature: South Korean and South African currencies [FS#4907] (r24148)
|
||||
- Feature: Randomise count of passengers killed in a crash [FS#3576] (r24142)
|
||||
- Feature: Display rating in the town directory window (r24141)
|
||||
- Feature: Show group name in the replace vehicle window caption [FS#1117] (r24140)
|
||||
- Feature: Allow to create a new vehicle group by drag and drop (r24139)
|
||||
- Feature: Ctrl+Drag to add all vehicles with a shared order list to a group (r24138)
|
||||
- Feature: Draw indicator icon in the replace vehicle window for vehicles which have a replacement set (r24137)
|
||||
- Feature: Autoreplace vehicles only when they get old [FS#4465] (r24136)
|
||||
- Feature: Add configurable limits for tree planting, and remove tree drag size limit (r24134, r24135)
|
||||
- Feature: Lithuanian currency [FS#4984] (r24133)
|
||||
- Feature: Ctrl+Clicking to change colour of all colour schemes at once [FS#1952] (r24131)
|
||||
- Feature: Deselect 'remove' button when changing signal types in the GUI [FS#2314] (r24130)
|
||||
- Feature: Option to minimise signal distance when dragging over obstacles [FS#3660] (r24129)
|
||||
- Feature: Allow closing airports for incoming aircraft [FS#1497] (r24127)
|
||||
- Feature: Drag and drop support for the NewGRF list window [FS#3854] (r24126)
|
||||
- Feature: Drag destination highlighting to the group GUI [FS#3705] (r24125)
|
||||
- Feature: [NewGRF] Misc engine flag to disable breakdown smoke [FS#4658] (r24124)
|
||||
- Feature: Be more careful with the population of a small town while placing a statue (r24105)
|
||||
- Feature: Debug option for showing the redrawn dirty blocks/rectangles [FS#5101] (r24065)
|
||||
- Change: News display options are now shown in the advanced settings window (r24842, r24843, r24844, r24845)
|
||||
- Change: Drop 'signal density' from the advanced settings GUI. It is more suited to be only changed via the signal GUI (r24670)
|
||||
- Change: Check for bankruptcy on a monthly basis (r24619)
|
||||
- Change: Only bankrupt, if you have negative money considering you took max loan (r24617)
|
||||
- Change: When building long roads or tramways, only build the roadbits at the beginning and the end if they can connect to something [FS#5228] (r24503)
|
||||
- Change: Disallow original and better road layouts to build roads under bridges along the bridge direction [FS#5229] (r24391)
|
||||
- Change: Allow cloning of orders which are unreachable for the destination vehicle if they were already unreachable for the source vehicle [FS#5213] (r24390)
|
||||
- Change: Allow building/modifying/removing signals even if a train is on the belonging track (r24356)
|
||||
- Change: [NewGRF] Make bounding boxes of road vehicles change according to the vehicle length to make alignment easier [FS#5204] (r24331)
|
||||
- Fix: [NewGRF] Consider regearing-like cargos as no-cargo in cargo filters [FS#5386] (r24848)
|
||||
- Fix: [NewGRF] Draw NewGRF railtypes in NewGRF station previews (r24840)
|
||||
- Fix: Do not consider blocked rail station tiles that display wires as non-reachable for masking out unnecessary catenary wires (r24837)
|
||||
- Fix: The autorefit dropdown in the order GUI was not always updated when modifying vehicle consists [FS#5396] (r24834)
|
||||
- Fix: [NewGRF] Incorrect values are better than a crash when a NewGRF queries vehicle variable 4C before vehicle initialisation is completed [FS#5398] (r24831)
|
||||
- Fix: determineversion.vbs could hang in a git checkout (r24826)
|
||||
- Fix: Close pending preview windows when the engine is introduced to everyone (r24812)
|
||||
- Fix: Close engine preview window when another client accepts it (r24811)
|
||||
- Fix: Make engine preview offers more robust with regard to changes in the company ranking (r24810)
|
||||
- Fix: When displaying the previous news message, do not consider news which are turned off [FS#4224] (r24802)
|
||||
- Fix: Glitch in timetable GUI [FS#5327] (r24800)
|
||||
- Fix: Unify checks for editability of settings (r24787)
|
||||
- Fix: Invert the focus handling of the OSK. Keep the focus at the OSK and close it on losing focus (r24774)
|
||||
- Fix: Shift in the OSK behaved like capslock (r24773)
|
||||
- Fix: [Win32] Do not crash when switching to an unsupported fullscreen display mode (like 8bpp modes in Windows 8) [FS#5359] (r24762)
|
||||
- Fix: Crash on corrupted savegame [FS#5367] (r24754)
|
||||
- Fix: Some editboxes had a different colour than the rest of the window (r24747)
|
||||
- Fix: In various windows the OSK looked shiny but using it had no effect whatsoever (r24727)
|
||||
- Fix: AI debug GUI crashed when using disabled buttons via hotkeys (r24723)
|
||||
- Fix: When starting a scenario apply the local company settings to the new company [FS#5139] (r24717)
|
||||
- Fix: [NewGRF] Allow stations to draw snow/desert aware ground sprites with railtype overlays [FS#5335] (r24715)
|
||||
- Fix: [NewGRF] Draw default foundations if resolving of custom station foundation sprites fails [FS#5337] (r24714)
|
||||
- Fix: [NewGRF] Tolerate old NewGRFs returning invalid values via CB 11 [FS#5262] (r24713)
|
||||
- Fix: [NewGRF] Station variables 61 and 62 returned incorrect values, if no vehicle ever tried loading [FS#5303] (r24712)
|
||||
- Fix: Check whether to not display a ^ loading indicator at drop stations only worked if there was no other vehicle unloading for 255 ticks (r24711)
|
||||
- Fix: [NewGRF] Station var 48 should report acceptance, not supply (r24706)
|
||||
- Fix: Station rating might consider very old vehicles very young (r24705)
|
||||
- Fix: Disallow closing oilrig airports in the scenario editor (r24703)
|
||||
- Fix: Workaround for an overoptimisation done by GCC 4.5 [FS#5246] (r24701)
|
||||
- Fix: Get packing right on MinGW GCC 4.7 (r24573)
|
||||
- Fix: Make sure all template functions are instantiated by at least one compilation unit [FS#5276] (r24496)
|
||||
- Fix: Do not load order backups when loading a server-saved game in single player (r24445)
|
||||
- Fix: Allow overbuilding bridges with the same type when adding a roadtype [FS#5221] (r24413)
|
||||
- Fix: Cargo lists cannot have genders (mostly because it is very unclear what gender it would have) (r24374)
|
||||
- Fix: Off by one errors with regard to clicking on setting buttons (r24313)
|
||||
- Fix: STRING1 probably means STRING1 (r24295)
|
||||
- Fix: squirrel_export should match key words like 'virtual', 'static' and 'const' only as whole words (r24288)
|
||||
- Fix: Hide object specs/classes from the GUI, if they will never be available to the user [FS#4967, FS#5120] (r24171)
|
||||
- Fix: Unify the spacing in 'AI/Game Script' and never just say 'Game' when 'Game Script' is meant [FS#4898] (r24020)
|
||||
|
||||
|
||||
1.2.3 (2012-11-01)
|
||||
------------------------------------------------------------------------
|
||||
(None)
|
||||
|
||||
|
||||
1.2.3-RC1 (2012-10-17)
|
||||
------------------------------------------------------------------------
|
||||
- Change: [NewGRF] Set the reference brightness of 32bpp mask recolouring to 128 (r24610)
|
||||
- Fix: Configure script did not properly handle _BUILD flags during reconfigure (r24601)
|
||||
- Fix: Configure script failed to detect libfontconfig 2.10 as newer than 2.3 (r24598)
|
||||
- Fix: When fontconfig is not available, the bootstrap download crashed [FS#5336] (r24597)
|
||||
- Fix: Crash when a gamescript provided too many parameters to a GSText object [FS#5333] (r24593)
|
||||
- Fix: [Script] API documentation mistakes/omissions (r24584)
|
||||
- Fix: Do not add duplicates to the ban list [FS#5308] (r24580)
|
||||
- Fix: Draw the window resize sprite bottom-aligned [FS#5324] (r24577)
|
||||
- Fix: Vehicle list at buoys did no longer work [FS#5319] (r24576)
|
||||
- Fix: [Windows] Do not cast away const in OS specific code (r24572, r24571)
|
||||
- Fix: Naming of bundles was somewhat broken (r24569)
|
||||
- Fix: Non-train vehicle lists were not resorted when vehicles were renamed [FS#5261] (r24567)
|
||||
- Fix: Stop both price and payment inflation if either of them has reached MAX_INFLATION (r24565)
|
||||
- Fix: Limiting the inflation did not quite work [FS#5312] (r24564)
|
||||
- Fix: Do not show profit from refits as cost in the refit window [FS#5297] (r24544)
|
||||
- Fix: Do not limit to reading one UDP packet per game loop (r24532)
|
||||
- Fix: Max script chance was too big (r24531)
|
||||
- Fix: [NewGRF] RandomAction 84 should interpret register 100 as signed (r24528)
|
||||
- Fix: [OSX] Some compile problems in mac-only code [FS#5296] (r24524)
|
||||
- Fix: The gender of an industry name is defined by the industry-type part of the name, not by the town-name part, even if it comes first (r24523, r24522)
|
||||
- Fix: GStexts were compiled incompletely when containing certain string codes (r24516, r24515)
|
||||
- Fix: The mousewheel did not work in the build waypoint window [FS#5285] (r24507)
|
||||
- Fix: [NewGRF] Airport variables 60 to 65 and 69 used the wrong cargo translation table for translations (r24506)
|
||||
- Fix: Do not show the global goals as company goals for spectators (r24500)
|
||||
- Fix: Clarify description of command line option -n (r24485)
|
||||
- Fix: Do not call RebuildSubsidisedSourceAndDestinationCache() before subsidy savegame conversion is finished [FS#5232] (r24482)
|
||||
- Fix: Trains were unable to reverse in stations when using NPF (r24479)
|
||||
- Fix: The --xxx yyy format (instead of --xxx=yyy) for configure did not work (r24471)
|
||||
- Fix: --prefix was not accepted by configure (r24470)
|
||||
- Fix: Changing auto-refit for a 'goto station' order was inadvertently modifying the full load state [FS#5264] (r24457)
|
||||
|
||||
|
||||
1.2.2 (2012-08-16)
|
||||
------------------------------------------------------------------------
|
||||
(None)
|
||||
|
||||
|
||||
1.2.2-RC1 (2012-08-01)
|
||||
------------------------------------------------------------------------
|
||||
- Fix: In some cases ships could be covered with land [CVE-2012-3436] [FS#5254] (r24449, r24439)
|
||||
- Fix: In some cases ships could be covered with land [FS#5254] (r24449, r24439)
|
||||
- Fix: Copy constructor and assignment operator cannot be implicit template specialisations [FS#5255] (r24448)
|
||||
- Fix: Make (non-refittable) vehicles with invalid default cargo unavailable [FS#5256] (r24438)
|
||||
- Fix: CFLAGS/CXXFLAGS ignored for helper binaries (r24432, r24429, r24427, r24365)
|
||||
@@ -412,7 +156,7 @@
|
||||
- Fix: [SDL] Handle the SDL_VIDEOEXPOSE event to solve issues with SDL 1.3 (r23910)
|
||||
- Fix: [SDL] Fix keyboard-related segfault when compiling against SDL 1.3 (r23909)
|
||||
- Fix: [Makefile] Make sure bin/baseset/openttd.32.bmp is removed on make clean (r23908)
|
||||
- Fix: [Makefile] Let 'make clean --dry-run' not delete Makefiles (r23907)
|
||||
- Fix: [Makefile] Let "make clean --dry-run" not delete Makefiles (r23907)
|
||||
- Fix: [Windows installer] OpenMSX got downloaded to and extracted in the wrong (non-existent) folder [FS#5045] (r23905)
|
||||
- Fix: Memory leak everytime one clicked a savegame in the load GUI (r23901)
|
||||
- Fix: [NewGRF] It was not possible to import sounds from a NewGRF later in the load order (r23883)
|
||||
|
141
config.lib
141
config.lib
@@ -57,8 +57,8 @@ set_default() {
|
||||
enable_translator="0"
|
||||
enable_unicode="1"
|
||||
enable_console="1";
|
||||
enable_assert="0"
|
||||
enable_strip="1"
|
||||
enable_assert="1"
|
||||
enable_strip="0"
|
||||
enable_universal="0"
|
||||
enable_osx_g5="0"
|
||||
enable_cocoa_quartz="1"
|
||||
@@ -197,21 +197,21 @@ detect_params() {
|
||||
--cpu-type) prev_p="cpu_type";;
|
||||
--cpu-type=*) cpu_type="$optarg";;
|
||||
|
||||
--cc-build) prev_p="cc_build";;
|
||||
--cc-build) prevp_p="cc_build";;
|
||||
--cc-build=*) cc_build="$optarg";;
|
||||
--cc-host) prev_p="cc_host";;
|
||||
--cc-host) prevp_p="cc_host";;
|
||||
--cc-host=*) cc_host="$optarg";;
|
||||
--cxx-build) prev_p="cxx_build";;
|
||||
--cxx-build) prevp_p="cxx_build";;
|
||||
--cxx-build=*) cxx_build="$optarg";;
|
||||
--cxx-host) prev_p="cxx_host";;
|
||||
--cxx-host) prevp_p="cxx_host";;
|
||||
--cxx-host=*) cxx_host="$optarg";;
|
||||
--windres) prev_p="windres";;
|
||||
--windres) prevp_p="windres";;
|
||||
--windres=*) windres="$optarg";;
|
||||
--awk) prev_p="awk";;
|
||||
--awk) prevp_p="awk";;
|
||||
--awk=*) awk="$optarg";;
|
||||
--strip) prev_p="strip";;
|
||||
--strip) prevp_p="strip";;
|
||||
--strip=*) strip="$optarg";;
|
||||
--lipo) prev_p="lipo";;
|
||||
--lipo) prevp_p="lipo";;
|
||||
--lipo=*) lipo="$optarg";;
|
||||
|
||||
--endian) prev_p="endian";;
|
||||
@@ -219,53 +219,52 @@ detect_params() {
|
||||
|
||||
|
||||
|
||||
# Alias --prefix with --prefix-dir, for compatibility with GNU autotools
|
||||
--prefix-dir | --prefix) prev_p="prefix_dir";;
|
||||
--prefix-dir=* | --prefix=*) prefix_dir="$optarg";;
|
||||
--prefix-dir) prevp_p="prefix-dir";;
|
||||
--prefix-dir=*) prefix_dir="$optarg";;
|
||||
|
||||
--binary-dir) prev_p="binary_dir";;
|
||||
--binary-dir) prevp_p="binary-dir";;
|
||||
--binary-dir=*) binary_dir="$optarg";;
|
||||
|
||||
--data-dir) prev_p="data_dir";;
|
||||
--data-dir) prevp_p="data-dir";;
|
||||
--data-dir=*) data_dir="$optarg";;
|
||||
|
||||
--doc-dir) prev_p="doc_dir";;
|
||||
--doc-dir) prevp_p="doc-dir";;
|
||||
--doc-dir=*) doc_dir="$optarg";;
|
||||
|
||||
--icon-dir) prev_p="icon_dir";;
|
||||
--icon-dir) prevp_p="icon-dir";;
|
||||
--icon-dir=*) icon_dir="$optarg";;
|
||||
|
||||
--icon-theme-dir) prev_p="icon_theme_dir";;
|
||||
--icon-theme-dir) prevp_p="icon-theme-dir";;
|
||||
--icon-theme-dir=*) icon_theme_dir="$optarg";;
|
||||
--without-icon-theme) icon_theme_dir="";;
|
||||
|
||||
--menu-dir) prev_p="menu_dir";;
|
||||
--menu-dir) prevp_p="menu_dir";;
|
||||
--menu-dir=*) menu_dir="$optarg";;
|
||||
--without-menu-entry) menu_dir="";;
|
||||
|
||||
--menu-name) prev_p="menu_name";;
|
||||
--menu-name) prevp_p="menu_name";;
|
||||
--menu-name=*) menu_name="$optarg";;
|
||||
|
||||
--binary-name) prev_p="binary_name";;
|
||||
--binary-name) prevp_p="binary_name";;
|
||||
--binary-name=*) binary_name="$optarg";;
|
||||
|
||||
--man-dir) prev_p="man_dir";;
|
||||
--man-dir) prevp_p="man_dir";;
|
||||
--man-dir=*) man_dir="$optarg";;
|
||||
|
||||
--personal-dir) prev_p="personal_dir";;
|
||||
--personal-dir) prevp_p="personal-dir";;
|
||||
--personal-dir=*) personal_dir="$optarg";;
|
||||
--without-personal-dir) personal_dir="";;
|
||||
|
||||
--shared-dir) prev_p="shared_dir";;
|
||||
--shared-dir) prevp_p="shared-dir";;
|
||||
--shared-dir=*) shared_dir="$optarg";;
|
||||
--without-shared-dir) shared_dir="";;
|
||||
|
||||
--install-dir) prev_p="install_dir";;
|
||||
--install-dir) prevp_p="install-dir";;
|
||||
--install-dir=*) install_dir="$optarg";;
|
||||
|
||||
|
||||
|
||||
--menu-group) prev_p="menu_group";;
|
||||
--menu-group) prevp_p="menu_group";;
|
||||
--menu-group=*) menu_group="$optarg";;
|
||||
|
||||
|
||||
@@ -443,9 +442,9 @@ detect_params() {
|
||||
CFLAGS=* | --CFLAGS=*) CFLAGS="$optarg";;
|
||||
CXXFLAGS=* | --CXXFLAGS=*) CXXFLAGS="$optarg";;
|
||||
LDFLAGS=* | --LDFLAGS=*) LDFLAGS="$optarg";;
|
||||
CFLAGS_BUILD=* | --CFLAGS_BUILD=* | --CFLAGS-BUILD=*) CFLAGS_BUILD="$optarg";;
|
||||
CXXFLAGS_BUILD=* | --CXXFLAGS_BUILD=* | --CXXFLAGS-BUILD=*) CXXFLAGS_BUILD="$optarg";;
|
||||
LDFLAGS_BUILD=* | --LDFLAGS_BUILD=* | --LDFLAGS-BUILD=*) LDFLAGS_BUILD="$optarg";;
|
||||
CFLAGS_BUILD=* | --CFLAGS_BUILD=*) CFLAGS_BUILD="$optarg";;
|
||||
CXXFLAGS_BUILD=* | --CXXFLAGS_BUILD=*) CXXFLAGS_BUILD="$optarg";;
|
||||
LDFLAGS_BUILD=* | --LDFLAGS_BUILD=*) LDFLAGS_BUILD="$optarg";;
|
||||
|
||||
--ignore-extra-parameters) ignore_extra_parameters="1";;
|
||||
|
||||
@@ -1303,8 +1302,8 @@ make_compiler_cflags() {
|
||||
|
||||
flags="$flags -Wall -Wno-multichar -Wsign-compare -Wundef"
|
||||
flags="$flags -Wwrite-strings -Wpointer-arith"
|
||||
flags="$flags -W -Wno-unused-parameter -Wredundant-decls"
|
||||
flags="$flags -Wformat=2 -Wformat-security"
|
||||
flags="$flags -W -Wno-unused-parameter -Wformat=2"
|
||||
flags="$flags -Wredundant-decls"
|
||||
|
||||
if [ $enable_assert -eq 0 ]; then
|
||||
# Do not warn about unused variables when building without asserts
|
||||
@@ -1350,12 +1349,6 @@ make_compiler_cflags() {
|
||||
cxxflags="$cxxflags -std=gnu++0x"
|
||||
fi
|
||||
|
||||
if [ $cc_version -eq 45 ]; then
|
||||
# Prevent optimisation supposing enums are in a range specified by the standard
|
||||
# For details, see http://gcc.gnu.org/PR43680
|
||||
flags="$flags -fno-tree-vrp"
|
||||
fi
|
||||
|
||||
if [ $cc_version -ge 47 ]; then
|
||||
# Disable -Wnarrowing which gives many warnings, such as:
|
||||
# warning: narrowing conversion of '...' from 'unsigned int' to 'int' inside { } [-Wnarrowing]
|
||||
@@ -1434,6 +1427,12 @@ make_cflags_and_ldflags() {
|
||||
# Each debug level reduces the optimization by a bit
|
||||
if [ $enable_debug -ge 1 ]; then
|
||||
CFLAGS="$CFLAGS -g -D_DEBUG"
|
||||
if basename "$cc_host" | grep "gcc" &>/dev/null; then
|
||||
# Define only when compiling with GCC, some
|
||||
# GLIBC versions use GNU extensions in a way
|
||||
# that breaks build with at least ICC
|
||||
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
|
||||
fi
|
||||
if [ "$os" = "PSP" ]; then
|
||||
CFLAGS="$CFLAGS -G0"
|
||||
fi
|
||||
@@ -1448,18 +1447,6 @@ make_cflags_and_ldflags() {
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $enable_debug -le 2 ]; then
|
||||
if basename "$cc_host" | grep "gcc" &>/dev/null; then
|
||||
# Define only when compiling with GCC. Some GLIBC versions use GNU
|
||||
# extensions in a way that breaks build with at least ICC.
|
||||
# This requires -O1 or more, so debug level 3 (-O0) is excluded.
|
||||
CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
|
||||
|
||||
# Just add -O1 to the tools needed for building.
|
||||
CFLAGS_BUILD="$CFLAGS_BUILD -D_FORTIFY_SOURCE=2 -O1"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$os" = "OSX" ] && [ $cc_version -eq 40 ]; then
|
||||
# Apple's GCC 4.0 has a compiler bug for x86_64 with (higher) optimization,
|
||||
# wrongly optimizing ^= in loops. This disables the failing optimisation.
|
||||
@@ -1494,9 +1481,6 @@ make_cflags_and_ldflags() {
|
||||
if [ $cc_version -ge 44 ]; then
|
||||
LDFLAGS_BUILD="$LDFLAGS_BUILD -static-libgcc -static-libstdc++"
|
||||
fi
|
||||
if [ $cc_version -ge 47 ]; then
|
||||
CFLAGS="$CFLAGS -mno-ms-bitfields"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -2153,30 +2137,6 @@ check_makedepend() {
|
||||
log 1 "checking makedepend... $makedepend"
|
||||
}
|
||||
|
||||
check_version() {
|
||||
# $1 - requested version (major.minor)
|
||||
# $2 - version we got (major.minor)
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
req_major=`echo $1 | cut -d. -f1`
|
||||
got_major=`echo $2 | cut -d. -f1`
|
||||
if [ $got_major -lt $req_major ]; then
|
||||
return 0
|
||||
elif [ $got_major -gt $req_major ]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
req_minor=`echo $1 | cut -d. -f2`
|
||||
got_minor=`echo $2 | cut -d. -f2`
|
||||
if [ $got_minor -lt $req_minor ]; then
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
detect_awk() {
|
||||
# Not all awks allow gsub(), so we test for that here! It is in fact all we need...
|
||||
|
||||
@@ -2862,14 +2822,13 @@ detect_fontconfig() {
|
||||
|
||||
version=`$fontconfig_config --modversion 2>/dev/null`
|
||||
ret=$?
|
||||
check_version '2.3' "$version"
|
||||
version_ok=$?
|
||||
shortversion=`echo $version | cut -c 1,3`
|
||||
log 2 "executing $fontconfig_config --modversion"
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
|
||||
if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$shortversion" -le "22" ]; then
|
||||
if [ -n "$shortversion" ] && [ "$shortversion" -le "22" ]; then
|
||||
log 1 "checking libfontconfig... needs at least version 2.3.0, fontconfig NOT enabled"
|
||||
else
|
||||
log 1 "checking libfontconfig... not found"
|
||||
@@ -2912,14 +2871,13 @@ detect_icu() {
|
||||
|
||||
version=`$icu_config --version 2>/dev/null`
|
||||
ret=$?
|
||||
check_version '3.6' "$version"
|
||||
version_ok=$?
|
||||
shortversion=`echo $version | cut -d\. -f1,2 | sed "s/\.//g" | cut -c1-2`
|
||||
log 2 "executing $icu_config --version"
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version_ok" != "1" ]; then
|
||||
if [ -n "$version" ] && [ "$version_ok" != "1" ]; then
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$shortversion" -lt "36" ]; then
|
||||
if [ -n "$shortversion" ] && [ "$shortversion" -lt "36" ]; then
|
||||
log 1 "checking libicu... needs at least version 3.6.0, icu NOT enabled"
|
||||
else
|
||||
log 1 "checking libicu... not found"
|
||||
@@ -3169,9 +3127,9 @@ detect_grfcodec() {
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "949" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "949" ]; then
|
||||
log 1 "checking grfcodec... needs at least version 6.0.2 (r949), disabled"
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "913" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "913" ]; then
|
||||
log 1 "checking grfcodec... needs at least version 5.1.4 (r913), disabled"
|
||||
else
|
||||
log 1 "checking grfcodec... not found"
|
||||
fi
|
||||
@@ -3211,9 +3169,9 @@ detect_nforenum() {
|
||||
log 2 " returned $version"
|
||||
log 2 " exit code $ret"
|
||||
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "949" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "949" ]; then
|
||||
log 1 "checking nforenum... needs at least version 6.0.2 (r949), disabled"
|
||||
if [ -z "$version" ] || [ "$ret" != "0" ] || [ "$version" -lt "913" ]; then
|
||||
if [ -n "$version" ] && [ "$version" -lt "913" ]; then
|
||||
log 1 "checking nforenum... needs at least version 5.1.4 (r913), disabled"
|
||||
else
|
||||
log 1 "checking nforenum... not found"
|
||||
fi
|
||||
@@ -3648,9 +3606,6 @@ showhelp() {
|
||||
echo " LDFLAGS linker flags, e.g. -L<lib dir> if you"
|
||||
echo " have libraries in a nonstandard"
|
||||
echo " directory <lib dir>"
|
||||
echo " CFLAGS_BUILD C compiler flags for build time tool generation"
|
||||
echo " CXXFLAGS_BUILD C++ compiler flags for build time tool generation"
|
||||
echo " LDFLAGS_BUILD linker flags for build time tool generation"
|
||||
echo ""
|
||||
echo "Use these variables to override the choices made by 'configure' or to help"
|
||||
echo "it to find libraries and programs with nonstandard names/locations."
|
||||
|
@@ -1,13 +1,14 @@
|
||||
OpenTTD's known bugs
|
||||
Last updated: 2013-04-01
|
||||
Release version: 1.3.0
|
||||
Last updated: 2012-06-01
|
||||
Release version: 1.2.1
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Table of contents
|
||||
-----------------
|
||||
1.0) About
|
||||
2.0) Known bugs
|
||||
2.0) Known bugs in this release
|
||||
* 2.1) Known bugs that will not be solved
|
||||
|
||||
|
||||
1.0) About
|
||||
@@ -16,13 +17,36 @@ All bugs listed below are marked as known. Please do not submit any bugs
|
||||
that are the same as these. If you do, do not act surprised, because
|
||||
we WILL flame you!!
|
||||
|
||||
The current list of known bugs that we intend to fix can be found in our
|
||||
bug tracking system at: http://bugs.openttd.org
|
||||
Also check the closed bugs when searching for your bug in this system as
|
||||
we might have fixed the bug in the mean time.
|
||||
Of course if you have more knowledge about any of these bugs, have more
|
||||
specifics, we welcome you to report them. React to the given bug indicated
|
||||
by the number below on http://bugs.openttd.org.
|
||||
|
||||
|
||||
2.0) Known bugs
|
||||
2.0) Known bugs in this release
|
||||
---- --------------------------
|
||||
The following bugs are known to exist in this release and we intend to
|
||||
fix them. Some bugs are known but are not fixable or fixing them would
|
||||
cause further problems. Those bugs can be found in the "Known bugs that
|
||||
will not be solved" section.
|
||||
|
||||
The bugs in this section all refer to a ticket in our bug tracking system
|
||||
that you can find at: http://bugs.openttd.org
|
||||
If the bugs are closed but still listed here it means that the bug is fixed
|
||||
and that the nightlies and next major release will not have that bug.
|
||||
|
||||
Issues prefixed with [OSX] are required to be fixed before we consider
|
||||
officially supporting Mac OS X again. For now it remains unsupported and
|
||||
we only apply bug fixes provided by the community but we are unable to fix
|
||||
these bugs ourselves.
|
||||
|
||||
- 4857 [OSX] No support for detecting mono space font
|
||||
- 4847 [OSX] No support for bootstrap downloading of base graphics
|
||||
- 4744 [OSX] Crash when switching to full screen with OS X Lion
|
||||
- 4689 [OSX] Crash when hiding window after coming from full screen
|
||||
- 4420 [OSX] OS' mouse pointer still shows
|
||||
- 2484 [OSX] Cannot enter CJK characters
|
||||
|
||||
2.1) Known bugs that will not be solved
|
||||
---- ----------------------------------
|
||||
This section lists all known bugs that we do not intend to fix and the
|
||||
reasons why we think that fixing them is infeasible. We might make some
|
||||
|
@@ -7,7 +7,7 @@
|
||||
// See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
-1 * 0 0C "OpenTTD GUI graphics"
|
||||
-1 * 3 05 15 \b 168 // OPENTTD_SPRITE_COUNT
|
||||
-1 * 3 05 15 A2
|
||||
-1 sprites/openttdgui.png 8bpp 66 8 64 31 -31 7 normal
|
||||
-1 sprites/openttdgui.png 8bpp 146 8 64 31 -31 7 normal
|
||||
-1 sprites/openttdgui.png 8bpp 226 8 64 31 -31 7 normal
|
||||
@@ -170,9 +170,3 @@
|
||||
-1 sprites/openttdgui.png 8bpp 194 440 13 10 0 -2 normal
|
||||
-1 sprites/openttdgui.png 8bpp 215 440 9 10 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 232 440 8 10 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 248 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 264 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 280 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 296 440 8 8 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 312 440 14 10 0 0 normal
|
||||
-1 sprites/openttdgui.png 8bpp 328 440 14 10 0 0 normal
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 24 KiB |
@@ -1,308 +1,254 @@
|
||||
openttd (1.3.0-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 01 Apr 2013 00:00:00 +0200
|
||||
|
||||
openttd (1.3.0~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-RC3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 18 Mar 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Tue, 05 Mar 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Tue, 19 Feb 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~beta2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-beta2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 07 Feb 2013 00:00:00 +0100
|
||||
|
||||
openttd (1.3.0~beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.3.0-beta1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 24 Dec 2012 00:00:00 +0100
|
||||
|
||||
openttd (1.2.3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 01 Nov 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.3~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.3-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 17 Oct 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 16 Aug 2012 20:00:00 +0200
|
||||
|
||||
openttd (1.2.2~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.2-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 01 Aug 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Aug 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 01 Jun 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 01 Jun 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.1~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.1-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 16 Apr 2012 22:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 16 Apr 2012 22:00:00 +0200
|
||||
|
||||
openttd (1.2.0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 15 Apr 2012 14:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 15 Apr 2012 14:00:00 +0200
|
||||
|
||||
openttd (1.2.0~RC4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 01 Apr 2012 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 01 Apr 2012 00:00:00 +0200
|
||||
|
||||
openttd (1.2.0~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 18 Mar 2012 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 18 Mar 2012 18:00:00 +0100
|
||||
|
||||
openttd (1.2.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 04 Mar 2012 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 04 Mar 2012 18:00:00 +0100
|
||||
|
||||
openttd (1.2.0~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 19 Feb 2012 23:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 19 Feb 2012 23:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 04 Feb 2012 16:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 04 Feb 2012 16:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 21 Jan 2012 16:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 21 Jan 2012 16:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 07 Jan 2012 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 07 Jan 2012 00:00:00 +0100
|
||||
|
||||
openttd (1.2.0~beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.2.0-beta1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 24 Dec 2011 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 24 Dec 2011 00:00:00 +0100
|
||||
|
||||
openttd (1.1.4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 05 Dec 2011 00:00:00 +0400
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 05 Dec 2011 00:00:00 +0400
|
||||
|
||||
openttd (1.1.4-RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.4-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 20 Nov 2011 17:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 20 Nov 2011 17:00:00 +0100
|
||||
|
||||
openttd (1.1.3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Thu, 15 Sep 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 15 Sep 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.3-RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.3-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 04 Sep 2011 17:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 04 Sep 2011 17:00:00 +0200
|
||||
|
||||
openttd (1.1.2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 14 Aug 2011 17:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 14 Aug 2011 17:00:00 +0200
|
||||
|
||||
openttd (1.1.2~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.2-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 30 Jul 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 30 Jul 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.2~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.2-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 24 Jul 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 24 Jul 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 01 Jun 2011 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Jun 2011 00:00:00 +0200
|
||||
|
||||
openttd (1.1.1~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.1-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 15 May 2011 21:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 15 May 2011 21:00:00 +0200
|
||||
|
||||
openttd (1.1.0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 01 Apr 2011 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 01 Apr 2011 00:00:00 +0100
|
||||
|
||||
openttd (1.1.0~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-RC3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 18 Mar 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 18 Mar 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 04 Mar 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 04 Mar 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 18 Feb 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 18 Feb 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta5) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta5
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 04 Feb 2011 22:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 04 Feb 2011 22:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta4) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 21 Jan 2011 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 21 Jan 2011 00:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta3) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 09 Jan 2011 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 09 Jan 2011 18:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta2) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 31 Dec 2010 18:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 31 Dec 2010 18:00:00 +0100
|
||||
|
||||
openttd (1.1.0~beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.1.0-beta1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Fri, 24 Dec 2010 00:00:00 +0100
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Fri, 24 Dec 2010 00:00:00 +0100
|
||||
|
||||
openttd (1.0.5-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.5
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 20 Nov 2010 21:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 20 Nov 2010 21:00:00 +0000
|
||||
|
||||
openttd (1.0.5~rc2-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.5~rc2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 14 Nov 2010 15:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 14 Nov 2010 15:00:00 +0000
|
||||
|
||||
openttd (1.0.5~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.5-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 31 Oct 2010 15:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 31 Oct 2010 15:00:00 +0000
|
||||
|
||||
openttd (1.0.4-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.4
|
||||
|
||||
-- OpenTTD <info@openttd.org> Tue, 14 Sep 2010 20:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 14 Sep 2010 20:00:00 +0000
|
||||
|
||||
openttd (1.0.4~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.4-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Mon, 30 Aug 2010 20:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 30 Aug 2010 20:00:00 +0000
|
||||
|
||||
openttd (1.0.3-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.3
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sun, 01 Aug 2010 00:00:00 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 01 Aug 2010 00:00:00 +0000
|
||||
|
||||
openttd (1.0.3~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.3-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 05 Jul 2010 17:37:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 05 Jul 2010 17:37:21 +0000
|
||||
|
||||
openttd (1.0.2-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 19 Jun 2010 18:36:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 19 Jun 2010 18:36:21 +0000
|
||||
|
||||
openttd (1.0.2~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.2-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 05 Jun 2010 23:36:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 05 Jun 2010 23:36:21 +0000
|
||||
|
||||
openttd (1.0.1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 01 May 2010 00:00:00 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 01 May 2010 00:00:00 +0200
|
||||
|
||||
openttd (1.0.1~rc2-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.1-RC2
|
||||
|
||||
-- OpenTTD <info@openttd.org> Wed, 21 Apr 2010 21:36:21 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 21 Apr 2010 21:36:21 +0200
|
||||
|
||||
openttd (1.0.1~rc1-0) unstable; urgency=low
|
||||
|
||||
* New upstream release 1.0.1-RC1
|
||||
|
||||
-- OpenTTD <info@openttd.org> Sat, 17 Apr 2010 23:36:21 +0000
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 17 Apr 2010 23:36:21 +0000
|
||||
|
||||
openttd (1.0.0-1) unstable; urgency=low
|
||||
|
||||
|
Binary file not shown.
@@ -1,6 +1,6 @@
|
||||
@echo off
|
||||
|
||||
set OPENTTD_VERSION=1.3.0
|
||||
set OPENTTD_VERSION=1.2.2-RC1
|
||||
set OPENSFX_VERSION=0.8.0
|
||||
set NOSOUND_VERSION=0.8.0
|
||||
set OPENGFX_VERSION=1.2.0
|
||||
|
@@ -17,9 +17,9 @@
|
||||
#
|
||||
|
||||
Name: openttd
|
||||
Version: 1.3.beta2
|
||||
Version: 1.2.beta4
|
||||
Release: 0
|
||||
%define srcver 1.3.0-beta2
|
||||
%define srcver 1.2.0-beta4
|
||||
Summary: An open source reimplementation of Chris Sawyer's Transport Tycoon Deluxe
|
||||
License: GPL-2.0
|
||||
Group: Amusements/Games/Strategy/Other
|
||||
@@ -227,13 +227,11 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
|
||||
%dir %{_datadir}/%{name}/baseset
|
||||
%dir %{_datadir}/%{name}/scripts
|
||||
%dir %{_datadir}/%{name}/ai
|
||||
%dir %{_datadir}/%{name}/game
|
||||
%{_datadir}/doc/%{name}/*
|
||||
%{_datadir}/%{name}/lang/*
|
||||
%{_datadir}/%{name}/baseset/*
|
||||
%{_datadir}/%{name}/scripts/*
|
||||
%{_datadir}/%{name}/ai/*
|
||||
%{_datadir}/%{name}/game/*
|
||||
%doc %{_mandir}/man6/%{name}.6.*
|
||||
|
||||
%files gui
|
||||
|
@@ -1,9 +1,9 @@
|
||||
# Version numbers to update
|
||||
!define APPV_MAJOR 1
|
||||
!define APPV_MINOR 3
|
||||
!define APPV_MAINT 0
|
||||
!define APPV_BUILD 5
|
||||
!define APPV_EXTRA ""
|
||||
!define APPV_MINOR 2
|
||||
!define APPV_MAINT 2
|
||||
!define APPV_BUILD 0
|
||||
!define APPV_EXTRA "-RC1"
|
||||
|
||||
!define APPNAME "OpenTTD" ; Define application name
|
||||
!define APPVERSION "${APPV_MAJOR}.${APPV_MINOR}.${APPV_MAINT}${APPV_EXTRA}" ; Define application version
|
||||
@@ -124,10 +124,6 @@ Section "!OpenTTD" Section1
|
||||
SetOutPath "$INSTDIR\ai\"
|
||||
File ${PATH_ROOT}bin\ai\compat_*.nut
|
||||
|
||||
; Copy Game Script files
|
||||
SetOutPath "$INSTDIR\game\"
|
||||
File ${PATH_ROOT}bin\game\compat_*.nut
|
||||
|
||||
; Copy data files
|
||||
SetOutPath "$INSTDIR\baseset\"
|
||||
File ${PATH_ROOT}bin\baseset\*.grf
|
||||
@@ -402,9 +398,6 @@ Section "Uninstall"
|
||||
; AI files
|
||||
Delete "$INSTDIR\ai\compat_*.nut"
|
||||
|
||||
; Game Script files
|
||||
Delete "$INSTDIR\game\compat_*.nut"
|
||||
|
||||
; Baseset files
|
||||
Delete "$INSTDIR\baseset\opntitle.dat"
|
||||
Delete "$INSTDIR\baseset\openttd.grf"
|
||||
@@ -476,7 +469,6 @@ Section "Uninstall"
|
||||
RMDir "$SMPROGRAMS\$SHORTCUTS\Docs\"
|
||||
RMDir "$SMPROGRAMS\$SHORTCUTS"
|
||||
RMDir "$INSTDIR\ai"
|
||||
RMDir "$INSTDIR\game"
|
||||
RMDir "$INSTDIR\data"
|
||||
RMDir "$INSTDIR\baseset"
|
||||
RMDir "$INSTDIR\gm"
|
||||
|
@@ -177,9 +177,6 @@ Function DetermineSVNVersion()
|
||||
' Make sure index is in sync with disk
|
||||
Set oExec = WshShell.Exec("git update-index --refresh")
|
||||
If Err.Number = 0 Then
|
||||
' StdOut and StdErr share a 4kB buffer so prevent it from filling up as we don't care about the output
|
||||
oExec.StdOut.Close
|
||||
oExec.StdErr.Close
|
||||
' Wait till the application is finished ...
|
||||
Do While oExec.Status = 0
|
||||
WScript.Sleep 10
|
||||
|
@@ -59,12 +59,6 @@
|
||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\bin\lang\arabic_egypt.lng;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\basque.txt">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating basque language file</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"</Command>
|
||||
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\src\lang\english.txt;..\objs\strgen\strgen.exe;%(AdditionalInputs)</AdditionalInputs>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\bin\lang\basque.lng;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\belarusian.txt">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating belarusian language file</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "%(FullPath)"</Command>
|
||||
|
@@ -13,9 +13,6 @@
|
||||
<CustomBuild Include="..\src\lang\arabic_egypt.txt">
|
||||
<Filter>Translations</Filter>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\basque.txt">
|
||||
<Filter>Translations</Filter>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\src\lang\belarusian.txt">
|
||||
<Filter>Translations</Filter>
|
||||
</CustomBuild>
|
||||
|
@@ -93,21 +93,6 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\basque.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating basque language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
exit 0
"
|
||||
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
|
||||
Outputs="..\bin\lang\basque.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\belarusian.txt"
|
||||
>
|
||||
|
@@ -94,21 +94,6 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\basque.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating basque language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
exit 0
"
|
||||
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
|
||||
Outputs="..\bin\lang\basque.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\belarusian.txt"
|
||||
>
|
||||
|
@@ -102,7 +102,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@@ -204,7 +204,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@@ -296,7 +296,6 @@
|
||||
<ClCompile Include="..\src\articulated_vehicles.cpp" />
|
||||
<ClCompile Include="..\src\autoreplace.cpp" />
|
||||
<ClCompile Include="..\src\bmp.cpp" />
|
||||
<ClCompile Include="..\src\cargomonitor.cpp" />
|
||||
<ClCompile Include="..\src\cargopacket.cpp" />
|
||||
<ClCompile Include="..\src\cargotype.cpp" />
|
||||
<ClCompile Include="..\src\cheat.cpp" />
|
||||
@@ -317,7 +316,6 @@
|
||||
<ClCompile Include="..\src\fileio.cpp" />
|
||||
<ClCompile Include="..\src\fios.cpp" />
|
||||
<ClCompile Include="..\src\fontcache.cpp" />
|
||||
<ClCompile Include="..\src\base_consist.cpp" />
|
||||
<ClCompile Include="..\src\gamelog.cpp" />
|
||||
<ClCompile Include="..\src\genworld.cpp" />
|
||||
<ClCompile Include="..\src\gfx.cpp" />
|
||||
@@ -362,10 +360,8 @@
|
||||
<ClCompile Include="..\src\station.cpp" />
|
||||
<ClCompile Include="..\src\strgen\strgen_base.cpp" />
|
||||
<ClCompile Include="..\src\string.cpp" />
|
||||
<ClCompile Include="..\src\stringfilter.cpp" />
|
||||
<ClCompile Include="..\src\strings.cpp" />
|
||||
<ClCompile Include="..\src\subsidy.cpp" />
|
||||
<ClCompile Include="..\src\textbuf.cpp" />
|
||||
<ClCompile Include="..\src\texteff.cpp" />
|
||||
<ClCompile Include="..\src\tgp.cpp" />
|
||||
<ClCompile Include="..\src\tile_map.cpp" />
|
||||
@@ -392,7 +388,6 @@
|
||||
<ClInclude Include="..\src\bmp.h" />
|
||||
<ClInclude Include="..\src\bridge.h" />
|
||||
<ClInclude Include="..\src\cargo_type.h" />
|
||||
<ClInclude Include="..\src\cargomonitor.h" />
|
||||
<ClInclude Include="..\src\cargopacket.h" />
|
||||
<ClInclude Include="..\src\cargotype.h" />
|
||||
<ClInclude Include="..\src\cheat_func.h" />
|
||||
@@ -440,7 +435,6 @@
|
||||
<ClInclude Include="..\src\fileio_type.h" />
|
||||
<ClInclude Include="..\src\fios.h" />
|
||||
<ClInclude Include="..\src\fontcache.h" />
|
||||
<ClInclude Include="..\src\base_consist.h" />
|
||||
<ClInclude Include="..\src\gamelog.h" />
|
||||
<ClInclude Include="..\src\gamelog_internal.h" />
|
||||
<ClInclude Include="..\src\genworld.h" />
|
||||
@@ -545,7 +539,6 @@
|
||||
<ClInclude Include="..\src\sound\sdl_s.h" />
|
||||
<ClInclude Include="..\src\video\sdl_v.h" />
|
||||
<ClInclude Include="..\src\settings_func.h" />
|
||||
<ClInclude Include="..\src\settings_gui.h" />
|
||||
<ClInclude Include="..\src\settings_internal.h" />
|
||||
<ClInclude Include="..\src\settings_type.h" />
|
||||
<ClInclude Include="..\src\ship.h" />
|
||||
@@ -571,7 +564,6 @@
|
||||
<ClInclude Include="..\src\strgen\strgen.h" />
|
||||
<ClInclude Include="..\src\string_func.h" />
|
||||
<ClInclude Include="..\src\string_type.h" />
|
||||
<ClInclude Include="..\src\stringfilter_type.h" />
|
||||
<ClInclude Include="..\src\strings_func.h" />
|
||||
<ClInclude Include="..\src\strings_type.h" />
|
||||
<ClInclude Include="..\src\subsidy_base.h" />
|
||||
@@ -580,7 +572,6 @@
|
||||
<ClInclude Include="..\src\tar_type.h" />
|
||||
<ClInclude Include="..\src\terraform_gui.h" />
|
||||
<ClInclude Include="..\src\textbuf_gui.h" />
|
||||
<ClInclude Include="..\src\textbuf_type.h" />
|
||||
<ClInclude Include="..\src\texteff.hpp" />
|
||||
<ClInclude Include="..\src\textfile_gui.h" />
|
||||
<ClInclude Include="..\src\textfile_type.h" />
|
||||
@@ -792,7 +783,6 @@
|
||||
<ClCompile Include="..\src\saveload\airport_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\animated_tile_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\autoreplace_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\cargomonitor_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\cargopacket_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\cheat_sl.cpp" />
|
||||
<ClCompile Include="..\src\saveload\company_sl.cpp" />
|
||||
@@ -957,7 +947,6 @@
|
||||
<ClInclude Include="..\src\script\api\script_bridgelist.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_cargo.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_cargolist.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_cargomonitor.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_company.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_companymode.hpp" />
|
||||
<ClInclude Include="..\src\script\api\script_controller.hpp" />
|
||||
@@ -1019,7 +1008,6 @@
|
||||
<ClCompile Include="..\src\script\api\script_bridgelist.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_cargo.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_cargolist.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_cargomonitor.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_company.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_companymode.cpp" />
|
||||
<ClCompile Include="..\src\script\api\script_controller.cpp" />
|
||||
|
@@ -117,9 +117,6 @@
|
||||
<ClCompile Include="..\src\bmp.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\cargomonitor.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\cargopacket.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -180,9 +177,6 @@
|
||||
<ClCompile Include="..\src\fontcache.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\base_consist.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\gamelog.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -315,18 +309,12 @@
|
||||
<ClCompile Include="..\src\string.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\stringfilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\strings.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\subsidy.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\textbuf.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\texteff.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@@ -405,9 +393,6 @@
|
||||
<ClInclude Include="..\src\cargo_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\cargomonitor.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\cargopacket.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -549,9 +534,6 @@
|
||||
<ClInclude Include="..\src\fontcache.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\base_consist.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\gamelog.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -864,9 +846,6 @@
|
||||
<ClInclude Include="..\src\settings_func.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\settings_gui.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\settings_internal.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -942,9 +921,6 @@
|
||||
<ClInclude Include="..\src\string_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\stringfilter_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\strings_func.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -969,9 +945,6 @@
|
||||
<ClInclude Include="..\src\textbuf_gui.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\textbuf_type.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\texteff.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@@ -1605,9 +1578,6 @@
|
||||
<ClCompile Include="..\src\saveload\autoreplace_sl.cpp">
|
||||
<Filter>Save/Load handlers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\saveload\cargomonitor_sl.cpp">
|
||||
<Filter>Save/Load handlers</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\saveload\cargopacket_sl.cpp">
|
||||
<Filter>Save/Load handlers</Filter>
|
||||
</ClCompile>
|
||||
@@ -2100,9 +2070,6 @@
|
||||
<ClInclude Include="..\src\script\api\script_cargolist.hpp">
|
||||
<Filter>Script API</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\script\api\script_cargomonitor.hpp">
|
||||
<Filter>Script API</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\src\script\api\script_company.hpp">
|
||||
<Filter>Script API</Filter>
|
||||
</ClInclude>
|
||||
@@ -2286,9 +2253,6 @@
|
||||
<ClCompile Include="..\src\script\api\script_cargolist.cpp">
|
||||
<Filter>Script API Implementation</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\script\api\script_cargomonitor.cpp">
|
||||
<Filter>Script API Implementation</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\src\script\api\script_company.cpp">
|
||||
<Filter>Script API Implementation</Filter>
|
||||
</ClCompile>
|
||||
|
@@ -102,7 +102,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
@@ -204,7 +204,7 @@
|
||||
<FavorSizeOrSpeed>Size</FavorSizeOrSpeed>
|
||||
<OmitFramePointers>true</OmitFramePointers>
|
||||
<AdditionalIncludeDirectories>..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR="OpenTTD";_SQ64;WITH_ASSERT;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StringPooling>true</StringPooling>
|
||||
<ExceptionHandling>Sync</ExceptionHandling>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
|
@@ -52,7 +52,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -257,7 +257,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -454,10 +454,6 @@
|
||||
RelativePath=".\..\src\bmp.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.cpp"
|
||||
>
|
||||
@@ -538,10 +534,6 @@
|
||||
RelativePath=".\..\src\fontcache.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.cpp"
|
||||
>
|
||||
@@ -718,10 +710,6 @@
|
||||
RelativePath=".\..\src\string.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings.cpp"
|
||||
>
|
||||
@@ -730,10 +718,6 @@
|
||||
RelativePath=".\..\src\subsidy.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.cpp"
|
||||
>
|
||||
@@ -842,10 +826,6 @@
|
||||
RelativePath=".\..\src\cargo_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.h"
|
||||
>
|
||||
@@ -1034,10 +1014,6 @@
|
||||
RelativePath=".\..\src\fontcache.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.h"
|
||||
>
|
||||
@@ -1454,10 +1430,6 @@
|
||||
RelativePath=".\..\src\settings_func.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_internal.h"
|
||||
>
|
||||
@@ -1558,10 +1530,6 @@
|
||||
RelativePath=".\..\src\string_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings_func.h"
|
||||
>
|
||||
@@ -1594,10 +1562,6 @@
|
||||
RelativePath=".\..\src\textbuf_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.hpp"
|
||||
>
|
||||
@@ -2462,10 +2426,6 @@
|
||||
RelativePath=".\..\src\saveload\autoreplace_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargomonitor_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargopacket_sl.cpp"
|
||||
>
|
||||
@@ -3162,10 +3122,6 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.hpp"
|
||||
>
|
||||
@@ -3414,10 +3370,6 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.cpp"
|
||||
>
|
||||
|
@@ -52,7 +52,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -257,7 +257,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
|
@@ -53,7 +53,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -255,7 +255,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -451,10 +451,6 @@
|
||||
RelativePath=".\..\src\bmp.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.cpp"
|
||||
>
|
||||
@@ -535,10 +531,6 @@
|
||||
RelativePath=".\..\src\fontcache.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.cpp"
|
||||
>
|
||||
@@ -715,10 +707,6 @@
|
||||
RelativePath=".\..\src\string.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings.cpp"
|
||||
>
|
||||
@@ -727,10 +715,6 @@
|
||||
RelativePath=".\..\src\subsidy.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.cpp"
|
||||
>
|
||||
@@ -839,10 +823,6 @@
|
||||
RelativePath=".\..\src\cargo_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargomonitor.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\cargopacket.h"
|
||||
>
|
||||
@@ -1031,10 +1011,6 @@
|
||||
RelativePath=".\..\src\fontcache.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\base_consist.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\gamelog.h"
|
||||
>
|
||||
@@ -1451,10 +1427,6 @@
|
||||
RelativePath=".\..\src\settings_func.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\settings_internal.h"
|
||||
>
|
||||
@@ -1555,10 +1527,6 @@
|
||||
RelativePath=".\..\src\string_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\stringfilter_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\strings_func.h"
|
||||
>
|
||||
@@ -1591,10 +1559,6 @@
|
||||
RelativePath=".\..\src\textbuf_gui.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\textbuf_type.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\texteff.hpp"
|
||||
>
|
||||
@@ -2459,10 +2423,6 @@
|
||||
RelativePath=".\..\src\saveload\autoreplace_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargomonitor_sl.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\saveload\cargopacket_sl.cpp"
|
||||
>
|
||||
@@ -3159,10 +3119,6 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.hpp"
|
||||
>
|
||||
@@ -3411,10 +3367,6 @@
|
||||
RelativePath=".\..\src\script\api\script_cargolist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_cargomonitor.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\script\api\script_company.cpp"
|
||||
>
|
||||
|
@@ -53,7 +53,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -255,7 +255,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\objs\settings;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WITH_ZLIB;WITH_LZO;WITH_LZMA;LZMA_API_STATIC;WITH_PNG;WITH_FREETYPE;WITH_ICU;U_STATIC_IMPLEMENTATION;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
|
11
readme.txt
11
readme.txt
@@ -1,6 +1,6 @@
|
||||
OpenTTD readme
|
||||
Last updated: 2013-04-01
|
||||
Release version: 1.3.0
|
||||
Last updated: 2012-08-01
|
||||
Release version: 1.2.2-RC1
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -299,7 +299,7 @@ your operating system:
|
||||
Different types of data or extensions go into different subdirectories of the
|
||||
chosen main OpenTTD directory:
|
||||
Config File: (no subdirectory)
|
||||
Screenshots: screenshot
|
||||
Screenshots: (no subdirectory)
|
||||
Base Graphics: baseset (or a subdirectory thereof)
|
||||
Sound Sets: baseset (or a subdirectory thereof)
|
||||
NewGRFs: newgrf (or a subdirectory thereof)
|
||||
@@ -650,7 +650,6 @@ The OpenTTD team (in alphabetical order):
|
||||
Zdeněk Sojka (SmatZ) - Bug finder and fixer
|
||||
José Soler (Terkhen) - General coding
|
||||
Thijs Marinussen (Yexo) - AI Framework
|
||||
Leif Linse (Zuu) - AI/Game Script
|
||||
|
||||
Inactive Developers:
|
||||
Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles
|
||||
@@ -670,7 +669,7 @@ Retired Developers:
|
||||
|
||||
Thanks to:
|
||||
Josef Drexler - For his great work on TTDPatch.
|
||||
Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and track foundations
|
||||
Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and graphics (signals and track foundations)
|
||||
Petr Baudiš (pasky) - Many patches, newgrf support, etc.
|
||||
Simon Sasburg (HackyKid) - For the many bugfixes he has blessed us with
|
||||
Stefan Meißner (sign_de) - For his work on the console
|
||||
@@ -684,6 +683,8 @@ Thanks to:
|
||||
George - Canal graphics
|
||||
Andrew Parkhouse (andythenorth) - River graphics
|
||||
David Dallaston (Pikka) - Tram tracks
|
||||
Marcin Grzegorczyk - Foundations for tracks on slopes,
|
||||
Daniel Blödorn (Bluescreen) - Title game
|
||||
All Translators - For their support to make OpenTTD a truly international game
|
||||
Bug Reporters - Thanks for all bug reports
|
||||
Chris Sawyer - For an amazing game!
|
||||
|
12
source.list
12
source.list
@@ -4,7 +4,6 @@ animated_tile.cpp
|
||||
articulated_vehicles.cpp
|
||||
autoreplace.cpp
|
||||
bmp.cpp
|
||||
cargomonitor.cpp
|
||||
cargopacket.cpp
|
||||
cargotype.cpp
|
||||
cheat.cpp
|
||||
@@ -25,7 +24,6 @@ engine.cpp
|
||||
fileio.cpp
|
||||
fios.cpp
|
||||
fontcache.cpp
|
||||
base_consist.cpp
|
||||
gamelog.cpp
|
||||
genworld.cpp
|
||||
gfx.cpp
|
||||
@@ -72,10 +70,8 @@ spritecache.cpp
|
||||
station.cpp
|
||||
strgen/strgen_base.cpp
|
||||
string.cpp
|
||||
stringfilter.cpp
|
||||
strings.cpp
|
||||
subsidy.cpp
|
||||
textbuf.cpp
|
||||
texteff.cpp
|
||||
tgp.cpp
|
||||
tile_map.cpp
|
||||
@@ -125,7 +121,6 @@ base_station_base.h
|
||||
bmp.h
|
||||
bridge.h
|
||||
cargo_type.h
|
||||
cargomonitor.h
|
||||
cargopacket.h
|
||||
cargotype.h
|
||||
cheat_func.h
|
||||
@@ -173,7 +168,6 @@ fileio_func.h
|
||||
fileio_type.h
|
||||
fios.h
|
||||
fontcache.h
|
||||
base_consist.h
|
||||
gamelog.h
|
||||
gamelog_internal.h
|
||||
genworld.h
|
||||
@@ -278,7 +272,6 @@ sdl.h
|
||||
sound/sdl_s.h
|
||||
video/sdl_v.h
|
||||
settings_func.h
|
||||
settings_gui.h
|
||||
settings_internal.h
|
||||
settings_type.h
|
||||
ship.h
|
||||
@@ -304,7 +297,6 @@ stdafx.h
|
||||
strgen/strgen.h
|
||||
string_func.h
|
||||
string_type.h
|
||||
stringfilter_type.h
|
||||
strings_func.h
|
||||
strings_type.h
|
||||
subsidy_base.h
|
||||
@@ -313,7 +305,6 @@ subsidy_type.h
|
||||
tar_type.h
|
||||
terraform_gui.h
|
||||
textbuf_gui.h
|
||||
textbuf_type.h
|
||||
texteff.hpp
|
||||
textfile_gui.h
|
||||
textfile_type.h
|
||||
@@ -550,7 +541,6 @@ saveload/ai_sl.cpp
|
||||
saveload/airport_sl.cpp
|
||||
saveload/animated_tile_sl.cpp
|
||||
saveload/autoreplace_sl.cpp
|
||||
saveload/cargomonitor_sl.cpp
|
||||
saveload/cargopacket_sl.cpp
|
||||
saveload/cheat_sl.cpp
|
||||
saveload/company_sl.cpp
|
||||
@@ -735,7 +725,6 @@ script/api/script_bridge.hpp
|
||||
script/api/script_bridgelist.hpp
|
||||
script/api/script_cargo.hpp
|
||||
script/api/script_cargolist.hpp
|
||||
script/api/script_cargomonitor.hpp
|
||||
script/api/script_company.hpp
|
||||
script/api/script_companymode.hpp
|
||||
script/api/script_controller.hpp
|
||||
@@ -799,7 +788,6 @@ script/api/script_bridge.cpp
|
||||
script/api/script_bridgelist.cpp
|
||||
script/api/script_cargo.cpp
|
||||
script/api/script_cargolist.cpp
|
||||
script/api/script_cargomonitor.cpp
|
||||
script/api/script_company.cpp
|
||||
script/api/script_companymode.cpp
|
||||
script/api/script_controller.cpp
|
||||
|
@@ -917,7 +917,6 @@ public:
|
||||
_last_stacksize = _fs->GetStackSize();
|
||||
Statement();
|
||||
CleanStack(stacksize);
|
||||
_fs->AddLineInfos(_lex._currentline, _lineinfo, true);
|
||||
Expect(TK_WHILE);
|
||||
SQInteger continuetrg = _fs->GetCurrentPos();
|
||||
Expect(_SC('(')); CommaExpr(); Expect(_SC(')'));
|
||||
|
2
src/3rdparty/squirrel/squirrel/sqvm.cpp
vendored
2
src/3rdparty/squirrel/squirrel/sqvm.cpp
vendored
@@ -1190,7 +1190,7 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb
|
||||
throw;
|
||||
}
|
||||
|
||||
_callsstacksize = cstksize;
|
||||
assert(cstksize == _callsstacksize);
|
||||
|
||||
_nnativecalls--;
|
||||
suspend = false;
|
||||
|
@@ -14,7 +14,6 @@
|
||||
|
||||
#include "../script/api/script_event_types.hpp"
|
||||
#include "../core/string_compare_type.hpp"
|
||||
#include "ai_scanner.hpp"
|
||||
#include <map>
|
||||
|
||||
/** A list that maps AI names to their AIInfo object. */
|
||||
@@ -26,7 +25,7 @@ typedef std::map<const char *, class ScriptInfo *, StringCompare> ScriptInfoList
|
||||
class AI {
|
||||
public:
|
||||
/**
|
||||
* The default months AIs start after each other.
|
||||
* The default months AIs start after eachother.
|
||||
*/
|
||||
enum StartNext {
|
||||
START_NEXT_EASY = DAYS_IN_YEAR * 2,
|
||||
@@ -68,30 +67,13 @@ public:
|
||||
static void Stop(CompanyID company);
|
||||
|
||||
/**
|
||||
* Suspend the AI and then pause execution of the script. The script
|
||||
* will not be resumed from its suspended state until the script has
|
||||
* been unpaused.
|
||||
* @param company The company for which the AI should be paused.
|
||||
* Suspend an AI for the reminder of the current tick. If the AI is
|
||||
* in a state when it cannot be suspended, it will continue to run
|
||||
* until it can be suspended.
|
||||
* @param company The company for which the AI should be suspended.
|
||||
* @pre Company::IsValidAiID(company)
|
||||
*/
|
||||
static void Pause(CompanyID company);
|
||||
|
||||
/**
|
||||
* Resume execution of the AI. This function will not actually execute
|
||||
* the script, but set a flag so that the script is executed my the usual
|
||||
* mechanism that executes the script.
|
||||
* @param company The company for which the AI should be unpaused.
|
||||
* @pre Company::IsValidAiID(company)
|
||||
*/
|
||||
static void Unpause(CompanyID company);
|
||||
|
||||
/**
|
||||
* Checks if the AI is paused.
|
||||
* @param company The company for which to check if the AI is paused.
|
||||
* @pre Company::IsValidAiID(company)
|
||||
* @return true if the AI is paused, otherwise false.
|
||||
*/
|
||||
static bool IsPaused(CompanyID company);
|
||||
static void Suspend(CompanyID company);
|
||||
|
||||
/**
|
||||
* Kill any and all AIs we manage.
|
||||
@@ -158,12 +140,6 @@ public:
|
||||
* found it is removed from the config.
|
||||
*/
|
||||
static void Rescan();
|
||||
|
||||
/** Gets the ScriptScanner instance that is used to find AIs */
|
||||
static AIScannerInfo *GetScannerInfo();
|
||||
/** Gets the ScriptScanner instance that is used to find AI Libraries */
|
||||
static AIScannerLibrary *GetScannerLibrary();
|
||||
|
||||
#if defined(ENABLE_NETWORK)
|
||||
/** Wrapper function for AIScanner::HasAI */
|
||||
static bool HasAI(const struct ContentInfo *ci, bool md5sum);
|
||||
|
@@ -28,8 +28,7 @@ ScriptConfigItem _start_date_config = {
|
||||
AI::START_NEXT_DEVIATION,
|
||||
30,
|
||||
SCRIPTCONFIG_NONE,
|
||||
NULL,
|
||||
false
|
||||
NULL
|
||||
};
|
||||
|
||||
/* static */ AIConfig *AIConfig::GetConfig(CompanyID company, ScriptSettingSource source)
|
||||
@@ -80,13 +79,13 @@ int AIConfig::GetSetting(const char *name) const
|
||||
{
|
||||
if (this->info == NULL) {
|
||||
SettingValueList::const_iterator it = this->settings.find(name);
|
||||
if (it == this->settings.end()) {
|
||||
if (it == this->settings.end() || GetGameSettings().difficulty.diff_level != 3) {
|
||||
assert(strcmp("start_date", name) == 0);
|
||||
switch (GetGameSettings().script.settings_profile) {
|
||||
case SP_EASY: return AI::START_NEXT_EASY;
|
||||
case SP_MEDIUM: return AI::START_NEXT_MEDIUM;
|
||||
case SP_HARD: return AI::START_NEXT_HARD;
|
||||
case SP_CUSTOM: return AI::START_NEXT_MEDIUM;
|
||||
switch (GetGameSettings().difficulty.diff_level) {
|
||||
case 0: return AI::START_NEXT_EASY;
|
||||
case 1: return AI::START_NEXT_MEDIUM;
|
||||
case 2: return AI::START_NEXT_HARD;
|
||||
case 3: return AI::START_NEXT_MEDIUM;
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
@@ -112,37 +112,16 @@
|
||||
DeleteWindowById(WC_AI_SETTINGS, company);
|
||||
}
|
||||
|
||||
/* static */ void AI::Pause(CompanyID company)
|
||||
/* static */ void AI::Suspend(CompanyID company)
|
||||
{
|
||||
/* The reason why dedicated servers are forbidden to execute this
|
||||
* command is not because it is unsafe, but because there is no way
|
||||
* for the server owner to unpause the script again. */
|
||||
if (_network_dedicated) return;
|
||||
if (_networking && !_network_server) return;
|
||||
|
||||
Backup<CompanyByte> cur_company(_current_company, company, FILE_LINE);
|
||||
Company::Get(company)->ai_instance->Pause();
|
||||
Company::Get(company)->ai_instance->Suspend();
|
||||
|
||||
cur_company.Restore();
|
||||
}
|
||||
|
||||
/* static */ void AI::Unpause(CompanyID company)
|
||||
{
|
||||
Backup<CompanyByte> cur_company(_current_company, company, FILE_LINE);
|
||||
Company::Get(company)->ai_instance->Unpause();
|
||||
|
||||
cur_company.Restore();
|
||||
}
|
||||
|
||||
/* static */ bool AI::IsPaused(CompanyID company)
|
||||
{
|
||||
Backup<CompanyByte> cur_company(_current_company, company, FILE_LINE);
|
||||
bool paused = Company::Get(company)->ai_instance->IsPaused();
|
||||
|
||||
cur_company.Restore();
|
||||
|
||||
return paused;
|
||||
}
|
||||
|
||||
/* static */ void AI::KillAll()
|
||||
{
|
||||
/* It might happen there are no companies .. than we have nothing to loop */
|
||||
@@ -197,7 +176,7 @@
|
||||
|
||||
/* static */ void AI::ResetConfig()
|
||||
{
|
||||
/* Check for both newgame as current game if we can reload the AIInfo inside
|
||||
/* Check for both newgame as current game if we can reload the AIInfo insde
|
||||
* the AIConfig. If not, remove the AI from the list (which will assign
|
||||
* a random new AI on reload). */
|
||||
for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
|
||||
@@ -373,14 +352,3 @@
|
||||
}
|
||||
|
||||
#endif /* defined(ENABLE_NETWORK) */
|
||||
|
||||
/* static */ AIScannerInfo *AI::GetScannerInfo()
|
||||
{
|
||||
return AI::scanner_info;
|
||||
}
|
||||
|
||||
/* static */ AIScannerLibrary *AI::GetScannerLibrary()
|
||||
{
|
||||
return AI::scanner_library;
|
||||
}
|
||||
|
||||
|
@@ -12,9 +12,8 @@
|
||||
#include "../stdafx.h"
|
||||
#include "../table/sprites.h"
|
||||
#include "../error.h"
|
||||
#include "../settings_gui.h"
|
||||
#include "../gui.h"
|
||||
#include "../querystring_gui.h"
|
||||
#include "../stringfilter_type.h"
|
||||
#include "../company_base.h"
|
||||
#include "../company_gui.h"
|
||||
#include "../strings_func.h"
|
||||
@@ -25,9 +24,6 @@
|
||||
#include "../settings_func.h"
|
||||
#include "../network/network_content.h"
|
||||
#include "../textfile_gui.h"
|
||||
#include "../widgets/dropdown_type.h"
|
||||
#include "../widgets/dropdown_func.h"
|
||||
#include "../hotkeys.h"
|
||||
|
||||
#include "ai.hpp"
|
||||
#include "../script/api/script_log.hpp"
|
||||
@@ -260,7 +256,7 @@ static const NWidgetPart _nested_ai_list_widgets[] = {
|
||||
static const WindowDesc _ai_list_desc(
|
||||
WDP_CENTER, 200, 234,
|
||||
WC_AI_LIST, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_nested_ai_list_widgets, lengthof(_nested_ai_list_widgets)
|
||||
);
|
||||
|
||||
@@ -282,8 +278,6 @@ struct AISettingsWindow : public Window {
|
||||
ScriptConfig *ai_config; ///< The configuration we're modifying.
|
||||
int clicked_button; ///< The button we clicked.
|
||||
bool clicked_increase; ///< Whether we clicked the increase or decrease button.
|
||||
bool clicked_dropdown; ///< Whether the dropdown is open.
|
||||
bool closing_dropdown; ///< True, if the dropdown list is currently closing.
|
||||
int timeout; ///< Timeout for unclicking the button.
|
||||
int clicked_row; ///< The clicked row of settings.
|
||||
int line_height; ///< Height of a row in the matrix widget.
|
||||
@@ -299,8 +293,6 @@ struct AISettingsWindow : public Window {
|
||||
AISettingsWindow(const WindowDesc *desc, CompanyID slot) : Window(),
|
||||
slot(slot),
|
||||
clicked_button(-1),
|
||||
clicked_dropdown(false),
|
||||
closing_dropdown(false),
|
||||
timeout(0)
|
||||
{
|
||||
this->ai_config = GetConfig(slot);
|
||||
@@ -363,13 +355,12 @@ struct AISettingsWindow : public Window {
|
||||
for (; !this->vscroll->IsVisible(i); i++) it++;
|
||||
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
uint buttons_left = rtl ? r.right - SETTING_BUTTON_WIDTH - 3 : r.left + 4;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : SETTING_BUTTON_WIDTH + 8);
|
||||
uint text_right = r.right - (rtl ? SETTING_BUTTON_WIDTH + 8 : WD_FRAMERECT_RIGHT);
|
||||
uint buttons_left = rtl ? r.right - 23 : r.left + 4;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : 28);
|
||||
uint text_right = r.right - (rtl ? 28 : WD_FRAMERECT_RIGHT);
|
||||
|
||||
|
||||
int y = r.top;
|
||||
int button_y_offset = (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
|
||||
for (; this->vscroll->IsVisible(i) && it != visible_settings.end(); i++, it++) {
|
||||
const ScriptConfigItem &config_item = **it;
|
||||
int current_value = config->GetSetting((config_item).name);
|
||||
@@ -394,14 +385,10 @@ struct AISettingsWindow : public Window {
|
||||
}
|
||||
|
||||
if ((config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0) {
|
||||
DrawBoolButton(buttons_left, y + button_y_offset, current_value != 0, editable);
|
||||
DrawBoolButton(buttons_left, y + 2, current_value != 0, editable);
|
||||
SetDParam(idx++, current_value == 0 ? STR_CONFIG_SETTING_OFF : STR_CONFIG_SETTING_ON);
|
||||
} else {
|
||||
if (config_item.complete_labels) {
|
||||
DrawDropDownButton(buttons_left, y + button_y_offset, COLOUR_YELLOW, this->clicked_row == i && clicked_dropdown, editable);
|
||||
} else {
|
||||
DrawArrowButtons(buttons_left, y + button_y_offset, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value);
|
||||
}
|
||||
DrawArrowButtons(buttons_left, y + 2, COLOUR_YELLOW, (this->clicked_button == i) ? 1 + (this->clicked_increase != rtl) : 0, editable && current_value > config_item.min_value, editable && current_value < config_item.max_value);
|
||||
if (config_item.labels != NULL && config_item.labels->Contains(current_value)) {
|
||||
SetDParam(idx++, STR_JUST_RAW_STRING);
|
||||
SetDParamStr(idx++, config_item.labels->Find(current_value)->second);
|
||||
@@ -416,13 +403,19 @@ struct AISettingsWindow : public Window {
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnPaint()
|
||||
/**
|
||||
* Check whether we modified the difficulty level or not.
|
||||
*/
|
||||
void CheckDifficultyLevel()
|
||||
{
|
||||
if (this->closing_dropdown) {
|
||||
this->closing_dropdown = false;
|
||||
this->clicked_dropdown = false;
|
||||
if (_game_mode == GM_MENU) {
|
||||
if (_settings_newgame.difficulty.diff_level != 3) {
|
||||
_settings_newgame.difficulty.diff_level = 3;
|
||||
ShowErrorMessage(STR_WARNING_DIFFICULTY_TO_CUSTOM, INVALID_STRING_ID, WL_WARNING);
|
||||
}
|
||||
} else if (_settings_game.difficulty.diff_level != 3) {
|
||||
IConsoleSetSetting("difficulty.diff_level", 3);
|
||||
}
|
||||
this->DrawWidgets();
|
||||
}
|
||||
|
||||
virtual void OnClick(Point pt, int widget, int click_count)
|
||||
@@ -440,53 +433,22 @@ struct AISettingsWindow : public Window {
|
||||
|
||||
if (this->clicked_row != num) {
|
||||
DeleteChildWindows(WC_QUERY_STRING);
|
||||
HideDropDownMenu(this);
|
||||
this->clicked_row = num;
|
||||
this->clicked_dropdown = false;
|
||||
}
|
||||
|
||||
bool bool_item = (config_item.flags & SCRIPTCONFIG_BOOLEAN) != 0;
|
||||
|
||||
int x = pt.x - wid->pos_x;
|
||||
if (_current_text_dir == TD_RTL) x = wid->current_x - 1 - x;
|
||||
if (_current_text_dir == TD_RTL) x = wid->current_x - x;
|
||||
x -= 4;
|
||||
|
||||
/* One of the arrows is clicked (or green/red rect in case of bool value) */
|
||||
int old_val = this->ai_config->GetSetting(config_item.name);
|
||||
if (!bool_item && IsInsideMM(x, 0, SETTING_BUTTON_WIDTH) && config_item.complete_labels) {
|
||||
if (this->clicked_dropdown) {
|
||||
/* unclick the dropdown */
|
||||
HideDropDownMenu(this);
|
||||
this->clicked_dropdown = false;
|
||||
this->closing_dropdown = false;
|
||||
} else {
|
||||
const NWidgetBase *wid = this->GetWidget<NWidgetBase>(WID_AIS_BACKGROUND);
|
||||
int rel_y = (pt.y - (int)wid->pos_y) % this->line_height;
|
||||
|
||||
Rect wi_rect;
|
||||
wi_rect.left = pt.x - (_current_text_dir == TD_RTL ? SETTING_BUTTON_WIDTH - 1 - x : x);
|
||||
wi_rect.right = wi_rect.left + SETTING_BUTTON_WIDTH - 1;
|
||||
wi_rect.top = pt.y - rel_y + (this->line_height - SETTING_BUTTON_HEIGHT) / 2;
|
||||
wi_rect.bottom = wi_rect.top + SETTING_BUTTON_HEIGHT - 1;
|
||||
|
||||
/* For dropdowns we also have to check the y position thoroughly, the mouse may not above the just opening dropdown */
|
||||
if (pt.y >= wi_rect.top && pt.y <= wi_rect.bottom) {
|
||||
this->clicked_dropdown = true;
|
||||
this->closing_dropdown = false;
|
||||
|
||||
DropDownList *list = new DropDownList();
|
||||
for (int i = config_item.min_value; i <= config_item.max_value; i++) {
|
||||
list->push_back(new DropDownListCharStringItem(config_item.labels->Find(i)->second, i, false));
|
||||
}
|
||||
|
||||
ShowDropDownListAt(this, list, old_val, -1, wi_rect, COLOUR_ORANGE, true);
|
||||
}
|
||||
}
|
||||
} else if (IsInsideMM(x, 0, SETTING_BUTTON_WIDTH)) {
|
||||
if (IsInsideMM(x, 0, 21)) {
|
||||
int new_val = old_val;
|
||||
if (bool_item) {
|
||||
new_val = !new_val;
|
||||
} else if (x >= SETTING_BUTTON_WIDTH / 2) {
|
||||
} else if (x >= 10) {
|
||||
/* Increase button clicked */
|
||||
new_val += config_item.step_size;
|
||||
if (new_val > config_item.max_value) new_val = config_item.max_value;
|
||||
@@ -502,8 +464,10 @@ struct AISettingsWindow : public Window {
|
||||
this->ai_config->SetSetting(config_item.name, new_val);
|
||||
this->clicked_button = num;
|
||||
this->timeout = 5;
|
||||
|
||||
this->CheckDifficultyLevel();
|
||||
}
|
||||
} else if (!bool_item && !config_item.complete_labels) {
|
||||
} else if (!bool_item) {
|
||||
/* Display a query box so users can enter a custom value. */
|
||||
SetDParam(0, old_val);
|
||||
ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL, QSF_NONE);
|
||||
@@ -533,27 +497,7 @@ struct AISettingsWindow : public Window {
|
||||
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return;
|
||||
int32 value = atoi(str);
|
||||
this->ai_config->SetSetting((*it).name, value);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnDropdownSelect(int widget, int index)
|
||||
{
|
||||
assert(this->clicked_dropdown);
|
||||
ScriptConfigItemList::const_iterator it = this->ai_config->GetConfigList()->begin();
|
||||
for (int i = 0; i < this->clicked_row; i++) it++;
|
||||
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (it->flags & SCRIPTCONFIG_INGAME) == 0) return;
|
||||
this->ai_config->SetSetting((*it).name, index);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnDropdownClose(Point pt, int widget, int index, bool instant_close)
|
||||
{
|
||||
/* We cannot raise the dropdown button just yet. OnClick needs some hint, whether
|
||||
* the same dropdown button was clicked again, and then not open the dropdown again.
|
||||
* So, we only remember that it was closed, and process it on the next OnPaint, which is
|
||||
* after OnClick. */
|
||||
assert(this->clicked_dropdown);
|
||||
this->closing_dropdown = true;
|
||||
this->CheckDifficultyLevel();
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
@@ -606,7 +550,7 @@ static const NWidgetPart _nested_ai_settings_widgets[] = {
|
||||
static const WindowDesc _ai_settings_desc(
|
||||
WDP_CENTER, 500, 208,
|
||||
WC_AI_SETTINGS, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_nested_ai_settings_widgets, lengthof(_nested_ai_settings_widgets)
|
||||
);
|
||||
|
||||
@@ -628,6 +572,8 @@ struct ScriptTextfileWindow : public TextfileWindow {
|
||||
|
||||
ScriptTextfileWindow(TextfileType file_type, CompanyID slot) : TextfileWindow(file_type), slot(slot)
|
||||
{
|
||||
this->GetWidget<NWidgetCore>(WID_TF_CAPTION)->SetDataTip(STR_TEXTFILE_README_CAPTION + file_type, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS);
|
||||
|
||||
const char *textfile = GetConfig(slot)->GetTextfile(file_type, slot);
|
||||
this->LoadTextfile(textfile, (slot == OWNER_DEITY) ? GAME_DIR : AI_DIR);
|
||||
}
|
||||
@@ -700,7 +646,7 @@ static const NWidgetPart _nested_ai_config_widgets[] = {
|
||||
static const WindowDesc _ai_config_desc(
|
||||
WDP_CENTER, 0, 0,
|
||||
WC_GAME_OPTIONS, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_nested_ai_config_widgets, lengthof(_nested_ai_config_widgets)
|
||||
);
|
||||
|
||||
@@ -938,31 +884,10 @@ void ShowAIConfigWindow()
|
||||
new AIConfigWindow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the widget colour of a button based on the
|
||||
* state of the script. (dead or alive)
|
||||
* @param button the button to update.
|
||||
* @param dead true if the script is dead, otherwise false.
|
||||
* @param paused true if the script is paused, otherwise false.
|
||||
* @return true if the colour was changed and the window need to be marked as dirty.
|
||||
*/
|
||||
static bool SetScriptButtonColour(NWidgetCore &button, bool dead, bool paused)
|
||||
{
|
||||
/* Dead scripts are indicated with red background and
|
||||
* paused scripts are indicated with yellow background. */
|
||||
Colours colour = dead ? COLOUR_RED :
|
||||
(paused ? COLOUR_YELLOW : COLOUR_GREY);
|
||||
if (button.colour != colour) {
|
||||
button.colour = colour;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Window with everything an AI prints via ScriptLog.
|
||||
*/
|
||||
struct AIDebugWindow : public Window {
|
||||
struct AIDebugWindow : public QueryStringBaseWindow {
|
||||
static const int top_offset; ///< Offset of the text at the top of the WID_AID_LOG_PANEL.
|
||||
static const int bottom_offset; ///< Offset of the text at the bottom of the WID_AID_LOG_PANEL.
|
||||
|
||||
@@ -975,8 +900,6 @@ struct AIDebugWindow : public Window {
|
||||
bool show_break_box; ///< Whether the break/debug box is visible.
|
||||
static bool break_check_enabled; ///< Stop an AI when it prints a matching string
|
||||
static char break_string[MAX_BREAK_STR_STRING_LENGTH]; ///< The string to match to the AI output
|
||||
QueryString break_editbox; ///< Break editbox
|
||||
static StringFilter break_string_filter; ///< Log filter for break.
|
||||
static bool case_sensitive_break_check; ///< Is the matching done case-sensitive
|
||||
int highlight_row; ///< The output row that matches the given string, or -1
|
||||
Scrollbar *vscroll; ///< Cache of the vertical scrollbar.
|
||||
@@ -987,62 +910,12 @@ struct AIDebugWindow : public Window {
|
||||
return (ScriptLog::LogData *)Company::Get(ai_debug_company)->ai_instance->GetLogPointer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the currently selected AI/GS is dead.
|
||||
* @return true if dead.
|
||||
*/
|
||||
bool IsDead() const
|
||||
{
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
GameInstance *game = Game::GetInstance();
|
||||
return game == NULL || game->IsDead();
|
||||
}
|
||||
return !Company::IsValidAiID(ai_debug_company) || Company::Get(ai_debug_company)->ai_instance->IsDead();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a company is a valid AI company or GS.
|
||||
* @param company Company to check for validity.
|
||||
* @return true if company is valid for debugging.
|
||||
*/
|
||||
bool IsValidDebugCompany(CompanyID company) const
|
||||
{
|
||||
switch (company) {
|
||||
case INVALID_COMPANY: return false;
|
||||
case OWNER_DEITY: return Game::GetInstance() != NULL;
|
||||
default: return Company::IsValidAiID(company);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that \c ai_debug_company refers to a valid AI company or GS, or is set to #INVALID_COMPANY.
|
||||
* If no valid company is selected, it selects the first valid AI or GS if any.
|
||||
*/
|
||||
void SelectValidDebugCompany()
|
||||
{
|
||||
/* Check if the currently selected company is still active. */
|
||||
if (this->IsValidDebugCompany(ai_debug_company)) return;
|
||||
|
||||
ai_debug_company = INVALID_COMPANY;
|
||||
|
||||
const Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
if (c->is_ai) {
|
||||
ChangeToAI(c->index);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* If no AI is available, see if there is a game script. */
|
||||
if (Game::GetInstance() != NULL) ChangeToAI(OWNER_DEITY);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor for the window.
|
||||
* @param desc The description of the window.
|
||||
* @param number The window number (actually unused).
|
||||
*/
|
||||
AIDebugWindow(const WindowDesc *desc, WindowNumber number) : break_editbox(MAX_BREAK_STR_STRING_LENGTH)
|
||||
AIDebugWindow(const WindowDesc *desc, WindowNumber number) : QueryStringBaseWindow(MAX_BREAK_STR_STRING_LENGTH)
|
||||
{
|
||||
this->CreateNestedTree(desc);
|
||||
this->vscroll = this->GetScrollbar(WID_AID_SCROLLBAR);
|
||||
@@ -1051,18 +924,33 @@ struct AIDebugWindow : public Window {
|
||||
this->FinishInitNested(desc, number);
|
||||
|
||||
if (!this->show_break_box) break_check_enabled = false;
|
||||
/* Disable the companies who are not active or not an AI */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
this->SetWidgetDisabledState(i + WID_AID_COMPANY_BUTTON_START, !Company::IsValidAiID(i));
|
||||
}
|
||||
this->EnableWidget(WID_AID_SCRIPT_GAME);
|
||||
this->DisableWidget(WID_AID_RELOAD_TOGGLE);
|
||||
this->DisableWidget(WID_AID_SETTINGS);
|
||||
this->DisableWidget(WID_AID_CONTINUE_BTN);
|
||||
|
||||
this->last_vscroll_pos = 0;
|
||||
this->autoscroll = true;
|
||||
this->highlight_row = -1;
|
||||
|
||||
this->querystrings[WID_AID_BREAK_STR_EDIT_BOX] = &this->break_editbox;
|
||||
InitializeTextBuffer(&this->text, this->edit_str_buf, this->edit_str_size, MAX_BREAK_STR_STRING_LENGTH);
|
||||
|
||||
/* Restore the break string value from static variable */
|
||||
this->break_editbox.text.Assign(this->break_string);
|
||||
strecpy(this->edit_str_buf, this->break_string, this->edit_str_buf + MAX_BREAK_STR_STRING_LENGTH);
|
||||
UpdateTextBufferSize(&this->text);
|
||||
|
||||
/* Restore button state from static class variables */
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
} else if (ai_debug_company != INVALID_COMPANY) {
|
||||
this->LowerWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
}
|
||||
this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled);
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
|
||||
this->SelectValidDebugCompany();
|
||||
this->InvalidateData(-1);
|
||||
}
|
||||
|
||||
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
|
||||
@@ -1075,31 +963,62 @@ struct AIDebugWindow : public Window {
|
||||
|
||||
virtual void OnPaint()
|
||||
{
|
||||
this->SelectValidDebugCompany();
|
||||
/* Check if the currently selected company is still active. */
|
||||
if (ai_debug_company == INVALID_COMPANY || (ai_debug_company != OWNER_DEITY && !Company::IsValidAiID(ai_debug_company))) {
|
||||
if (ai_debug_company != INVALID_COMPANY) {
|
||||
/* Raise the widget for the previous selection. */
|
||||
this->RaiseWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
|
||||
ai_debug_company = INVALID_COMPANY;
|
||||
}
|
||||
|
||||
const Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
if (c->is_ai) {
|
||||
/* Lower the widget corresponding to this company. */
|
||||
this->LowerWidget(c->index + WID_AID_COMPANY_BUTTON_START);
|
||||
|
||||
ai_debug_company = c->index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Update "Reload AI" and "AI settings" buttons */
|
||||
this->SetWidgetDisabledState(WID_AID_SETTINGS, ai_debug_company == INVALID_COMPANY);
|
||||
this->SetWidgetDisabledState(WID_AID_RELOAD_TOGGLE, ai_debug_company == INVALID_COMPANY || ai_debug_company == OWNER_DEITY);
|
||||
this->SetWidgetDisabledState(WID_AID_SCRIPT_GAME, Game::GetGameInstance() == NULL);
|
||||
|
||||
/* Draw standard stuff */
|
||||
this->DrawWidgets();
|
||||
|
||||
if (this->IsShaded()) return; // Don't draw anything when the window is shaded.
|
||||
|
||||
bool dirty = false;
|
||||
if (this->show_break_box) this->DrawEditBox(WID_AID_BREAK_STR_EDIT_BOX);
|
||||
|
||||
/* Paint the company icons */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
NWidgetCore *button = this->GetWidget<NWidgetCore>(i + WID_AID_COMPANY_BUTTON_START);
|
||||
bool dirty = false;
|
||||
|
||||
bool valid = Company::IsValidAiID(i);
|
||||
bool disabled = !valid;
|
||||
if (button->IsDisabled() != disabled) {
|
||||
/* Invalid/non-AI companies have button disabled */
|
||||
button->SetDisabled(disabled);
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
/* Check whether the validity of the company changed */
|
||||
dirty |= (button->IsDisabled() == valid);
|
||||
|
||||
/* Mark dead/paused AIs by setting the background colour. */
|
||||
bool dead = valid && Company::Get(i)->ai_instance->IsDead();
|
||||
bool paused = valid && Company::Get(i)->ai_instance->IsPaused();
|
||||
/* Re-paint if the button was updated.
|
||||
* (note that it is intentional that SetScriptButtonColour is always called) */
|
||||
dirty |= SetScriptButtonColour(*button, dead, paused);
|
||||
Colours colour = dead ? COLOUR_RED : COLOUR_GREY;
|
||||
if (button->colour != colour) {
|
||||
/* Mark dead AIs by red background */
|
||||
button->colour = colour;
|
||||
dirty = true;
|
||||
}
|
||||
|
||||
/* Do we need a repaint? */
|
||||
if (dirty) this->SetDirty();
|
||||
/* Draw company icon only for valid AI companies */
|
||||
if (!valid) continue;
|
||||
|
||||
@@ -1107,17 +1026,6 @@ struct AIDebugWindow : public Window {
|
||||
DrawCompanyIcon(i, button->pos_x + button->current_x / 2 - 7 + offset, this->GetWidget<NWidgetBase>(WID_AID_COMPANY_BUTTON_START + i)->pos_y + 2 + offset);
|
||||
}
|
||||
|
||||
/* Set button colour for Game Script. */
|
||||
GameInstance *game = Game::GetInstance();
|
||||
bool valid = game != NULL;
|
||||
bool dead = valid && game->IsDead();
|
||||
bool paused = valid && game->IsPaused();
|
||||
|
||||
NWidgetCore *button = this->GetWidget<NWidgetCore>(WID_AID_SCRIPT_GAME);
|
||||
dirty |= (button->IsDisabled() == valid) || SetScriptButtonColour(*button, dead, paused);
|
||||
|
||||
if (dirty) this->InvalidateData(-1);
|
||||
|
||||
/* If there are no active companies, don't display anything else. */
|
||||
if (ai_debug_company == INVALID_COMPANY) return;
|
||||
|
||||
@@ -1218,29 +1126,37 @@ struct AIDebugWindow : public Window {
|
||||
*/
|
||||
void ChangeToAI(CompanyID show_ai)
|
||||
{
|
||||
if (!this->IsValidDebugCompany(show_ai)) return;
|
||||
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->RaiseWidget(WID_AID_SCRIPT_GAME);
|
||||
} else {
|
||||
this->RaiseWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
}
|
||||
ai_debug_company = show_ai;
|
||||
|
||||
this->highlight_row = -1; // The highlight of one AI make little sense for another AI.
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
this->vscroll->SetCount((log == NULL) ? 0 : log->used);
|
||||
|
||||
/* Close AI settings window to prevent confusion */
|
||||
DeleteWindowByClass(WC_AI_SETTINGS);
|
||||
|
||||
this->InvalidateData(-1);
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
this->LowerWidget(WID_AID_SCRIPT_GAME);
|
||||
} else {
|
||||
this->LowerWidget(ai_debug_company + WID_AID_COMPANY_BUTTON_START);
|
||||
}
|
||||
|
||||
this->autoscroll = true;
|
||||
this->last_vscroll_pos = this->vscroll->GetPosition();
|
||||
this->SetDirty();
|
||||
/* Close AI settings window to prevent confusion */
|
||||
DeleteWindowByClass(WC_AI_SETTINGS);
|
||||
}
|
||||
|
||||
virtual void OnClick(Point pt, int widget, int click_count)
|
||||
{
|
||||
/* Also called for hotkeys, so check for disabledness */
|
||||
if (this->IsWidgetDisabled(widget)) return;
|
||||
|
||||
/* Check which button is clicked */
|
||||
if (IsInsideMM(widget, WID_AID_COMPANY_BUTTON_START, WID_AID_COMPANY_BUTTON_END + 1)) {
|
||||
ChangeToAI((CompanyID)(widget - WID_AID_COMPANY_BUTTON_START));
|
||||
/* Is it no on disable? */
|
||||
if (!this->IsWidgetDisabled(widget)) {
|
||||
ChangeToAI((CompanyID)(widget - WID_AID_COMPANY_BUTTON_START));
|
||||
}
|
||||
}
|
||||
|
||||
switch (widget) {
|
||||
@@ -1261,143 +1177,96 @@ struct AIDebugWindow : public Window {
|
||||
|
||||
case WID_AID_BREAK_STR_ON_OFF_BTN:
|
||||
this->break_check_enabled = !this->break_check_enabled;
|
||||
this->InvalidateData(-1);
|
||||
this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled);
|
||||
this->SetWidgetDirty(WID_AID_BREAK_STR_ON_OFF_BTN);
|
||||
break;
|
||||
|
||||
case WID_AID_MATCH_CASE_BTN:
|
||||
this->case_sensitive_break_check = !this->case_sensitive_break_check;
|
||||
this->InvalidateData(-1);
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
break;
|
||||
|
||||
case WID_AID_CONTINUE_BTN:
|
||||
/* Unpause current AI / game script and mark the corresponding script button dirty. */
|
||||
if (!this->IsDead()) {
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Unpause();
|
||||
} else {
|
||||
AI::Unpause(ai_debug_company);
|
||||
}
|
||||
}
|
||||
|
||||
/* If the last AI/Game Script is unpaused, unpause the game too. */
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_PAUSED_NORMAL) {
|
||||
bool all_unpaused = !Game::IsPaused();
|
||||
if (all_unpaused) {
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
if (c->is_ai && AI::IsPaused(c->index)) {
|
||||
all_unpaused = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (all_unpaused) {
|
||||
/* All scripts have been unpaused => unpause the game. */
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this->highlight_row = -1;
|
||||
this->InvalidateData(-1);
|
||||
/* Unpause */
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 0, CMD_PAUSE);
|
||||
this->DisableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->RaiseWidget(WID_AID_CONTINUE_BTN); // Disabled widgets don't raise themself
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnTimeout()
|
||||
{
|
||||
this->RaiseWidget(WID_AID_RELOAD_TOGGLE);
|
||||
this->RaiseWidget(WID_AID_SETTINGS);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnMouseLoop()
|
||||
{
|
||||
this->HandleEditBox(WID_AID_BREAK_STR_EDIT_BOX);
|
||||
}
|
||||
|
||||
virtual EventState OnKeyPress(uint16 key, uint16 keycode)
|
||||
{
|
||||
EventState state = ES_NOT_HANDLED;
|
||||
int num = CheckHotkeyMatch(aidebug_hotkeys, keycode, this);
|
||||
if (num != -1) {
|
||||
if (this->show_break_box && num == WID_AID_BREAK_STR_EDIT_BOX) {
|
||||
this->SetFocusedWidget(WID_AID_BREAK_STR_EDIT_BOX);
|
||||
SetFocusedWindow(this);
|
||||
state = ES_HANDLED;
|
||||
} else if (this->show_break_box || num < WID_AID_BREAK_STRING_WIDGETS) {
|
||||
this->OnClick(Point(), num, 1);
|
||||
state = ES_HANDLED;
|
||||
}
|
||||
if (this->HandleEditBoxKey(WID_AID_BREAK_STR_EDIT_BOX, key, keycode, state) != HEBR_NOT_FOCUSED) {
|
||||
/* Save the current string to static member so it can be restored next time the window is opened */
|
||||
strecpy(this->break_string, this->edit_str_buf, lastof(this->break_string));
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
virtual void OnEditboxChanged(int wid)
|
||||
{
|
||||
if (wid == WID_AID_BREAK_STR_EDIT_BOX) {
|
||||
/* Save the current string to static member so it can be restored next time the window is opened. */
|
||||
strecpy(this->break_string, this->break_editbox.text.buf, lastof(this->break_string));
|
||||
break_string_filter.SetFilterTerm(this->break_string);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Some data on this window has become invalid.
|
||||
* @param data Information about the changed data.
|
||||
* This is the company ID of the AI/GS which wrote a new log message, or -1 in other cases.
|
||||
* @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
|
||||
*/
|
||||
virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
|
||||
{
|
||||
/* If the log message is related to the active company tab, check the break string.
|
||||
* This needs to be done in gameloop-scope, so the AI is suspended immediately. */
|
||||
if (!gui_scope && data == ai_debug_company && this->IsValidDebugCompany(ai_debug_company) && this->break_check_enabled && !this->break_string_filter.IsEmpty()) {
|
||||
/* Get the log instance of the active company */
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
if (data == -1 || ai_debug_company == data) this->SetDirty();
|
||||
|
||||
if (log != NULL) {
|
||||
this->break_string_filter.ResetState();
|
||||
this->break_string_filter.AddLine(log->lines[log->pos]);
|
||||
if (this->break_string_filter.GetState()) {
|
||||
/* Pause execution of script. */
|
||||
if (!this->IsDead()) {
|
||||
if (ai_debug_company == OWNER_DEITY) {
|
||||
Game::Pause();
|
||||
} else {
|
||||
AI::Pause(ai_debug_company);
|
||||
}
|
||||
}
|
||||
|
||||
/* Pause the game. */
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) {
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
|
||||
}
|
||||
|
||||
/* Highlight row that matched */
|
||||
this->highlight_row = log->pos;
|
||||
}
|
||||
if (gui_scope && data == -2) {
|
||||
/* The continue button should be disabled when the game is unpaused and
|
||||
* it was previously paused by the break string ( = a line in the log
|
||||
* was highlighted )*/
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED && this->highlight_row != -1) {
|
||||
this->DisableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_LOG_PANEL);
|
||||
this->highlight_row = -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gui_scope) return;
|
||||
/* If the log message is related to the active company tab, check the break string.
|
||||
* This needs to be done in gameloop-scope, so the AI is suspended immediately. */
|
||||
if (ai_debug_company != OWNER_DEITY && !gui_scope && data == ai_debug_company && this->break_check_enabled && !StrEmpty(this->edit_str_buf)) {
|
||||
/* Get the log instance of the active company */
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
|
||||
this->SelectValidDebugCompany();
|
||||
if (log != NULL && case_sensitive_break_check?
|
||||
strstr(log->lines[log->pos], this->edit_str_buf) != 0 :
|
||||
strcasestr(log->lines[log->pos], this->edit_str_buf) != 0) {
|
||||
|
||||
ScriptLog::LogData *log = ai_debug_company != INVALID_COMPANY ? this->GetLogPointer() : NULL;
|
||||
this->vscroll->SetCount((log == NULL) ? 0 : log->used);
|
||||
AI::Suspend(ai_debug_company);
|
||||
if ((_pause_mode & PM_PAUSED_NORMAL) == PM_UNPAUSED) {
|
||||
DoCommandP(0, PM_PAUSED_NORMAL, 1, CMD_PAUSE);
|
||||
}
|
||||
|
||||
/* Update company buttons */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
this->SetWidgetDisabledState(i + WID_AID_COMPANY_BUTTON_START, !Company::IsValidAiID(i));
|
||||
this->SetWidgetLoweredState(i + WID_AID_COMPANY_BUTTON_START, ai_debug_company == i);
|
||||
/* Make it possible to click on the continue button */
|
||||
this->EnableWidget(WID_AID_CONTINUE_BTN);
|
||||
this->SetWidgetDirty(WID_AID_CONTINUE_BTN);
|
||||
|
||||
/* Highlight row that matched */
|
||||
this->highlight_row = log->pos;
|
||||
}
|
||||
}
|
||||
|
||||
this->SetWidgetDisabledState(WID_AID_SCRIPT_GAME, Game::GetGameInstance() == NULL);
|
||||
this->SetWidgetLoweredState(WID_AID_SCRIPT_GAME, ai_debug_company == OWNER_DEITY);
|
||||
|
||||
this->SetWidgetLoweredState(WID_AID_BREAK_STR_ON_OFF_BTN, this->break_check_enabled);
|
||||
this->SetWidgetLoweredState(WID_AID_MATCH_CASE_BTN, this->case_sensitive_break_check);
|
||||
|
||||
this->SetWidgetDisabledState(WID_AID_SETTINGS, ai_debug_company == INVALID_COMPANY);
|
||||
this->SetWidgetDisabledState(WID_AID_RELOAD_TOGGLE, ai_debug_company == INVALID_COMPANY || ai_debug_company == OWNER_DEITY);
|
||||
this->SetWidgetDisabledState(WID_AID_CONTINUE_BTN, ai_debug_company == INVALID_COMPANY ||
|
||||
(ai_debug_company == OWNER_DEITY ? !Game::IsPaused() : !AI::IsPaused(ai_debug_company)));
|
||||
}
|
||||
|
||||
virtual void OnResize()
|
||||
{
|
||||
this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL);
|
||||
}
|
||||
|
||||
static Hotkey<AIDebugWindow> aidebug_hotkeys[];
|
||||
};
|
||||
|
||||
const int AIDebugWindow::top_offset = WD_FRAMERECT_TOP + 2;
|
||||
@@ -1406,7 +1275,6 @@ CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY;
|
||||
char AIDebugWindow::break_string[MAX_BREAK_STR_STRING_LENGTH] = "";
|
||||
bool AIDebugWindow::break_check_enabled = true;
|
||||
bool AIDebugWindow::case_sensitive_break_check = false;
|
||||
StringFilter AIDebugWindow::break_string_filter(&AIDebugWindow::case_sensitive_break_check);
|
||||
|
||||
/** Make a number of rows with buttons for each company for the AI debug window. */
|
||||
NWidgetBase *MakeCompanyButtonRowsAIDebug(int *biggest_index)
|
||||
@@ -1414,33 +1282,6 @@ NWidgetBase *MakeCompanyButtonRowsAIDebug(int *biggest_index)
|
||||
return MakeCompanyButtonRows(biggest_index, WID_AID_COMPANY_BUTTON_START, WID_AID_COMPANY_BUTTON_END, 8, STR_AI_DEBUG_SELECT_AI_TOOLTIP);
|
||||
}
|
||||
|
||||
Hotkey<AIDebugWindow> AIDebugWindow::aidebug_hotkeys[] = {
|
||||
Hotkey<AIDebugWindow>('1', "company_1", WID_AID_COMPANY_BUTTON_START),
|
||||
Hotkey<AIDebugWindow>('2', "company_2", WID_AID_COMPANY_BUTTON_START + 1),
|
||||
Hotkey<AIDebugWindow>('3', "company_3", WID_AID_COMPANY_BUTTON_START + 2),
|
||||
Hotkey<AIDebugWindow>('4', "company_4", WID_AID_COMPANY_BUTTON_START + 3),
|
||||
Hotkey<AIDebugWindow>('5', "company_5", WID_AID_COMPANY_BUTTON_START + 4),
|
||||
Hotkey<AIDebugWindow>('6', "company_6", WID_AID_COMPANY_BUTTON_START + 5),
|
||||
Hotkey<AIDebugWindow>('7', "company_7", WID_AID_COMPANY_BUTTON_START + 6),
|
||||
Hotkey<AIDebugWindow>('8', "company_8", WID_AID_COMPANY_BUTTON_START + 7),
|
||||
Hotkey<AIDebugWindow>('9', "company_9", WID_AID_COMPANY_BUTTON_START + 8),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_10", WID_AID_COMPANY_BUTTON_START + 9),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_11", WID_AID_COMPANY_BUTTON_START + 10),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_12", WID_AID_COMPANY_BUTTON_START + 11),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_13", WID_AID_COMPANY_BUTTON_START + 12),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_14", WID_AID_COMPANY_BUTTON_START + 13),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "company_15", WID_AID_COMPANY_BUTTON_START + 14),
|
||||
Hotkey<AIDebugWindow>('S', "settings", WID_AID_SETTINGS),
|
||||
Hotkey<AIDebugWindow>('0', "game_script", WID_AID_SCRIPT_GAME),
|
||||
Hotkey<AIDebugWindow>((uint16)0, "reload", WID_AID_RELOAD_TOGGLE),
|
||||
Hotkey<AIDebugWindow>('B', "break_toggle", WID_AID_BREAK_STR_ON_OFF_BTN),
|
||||
Hotkey<AIDebugWindow>('F', "break_string", WID_AID_BREAK_STR_EDIT_BOX),
|
||||
Hotkey<AIDebugWindow>('C', "match_case", WID_AID_MATCH_CASE_BTN),
|
||||
Hotkey<AIDebugWindow>(WKC_RETURN, "continue", WID_AID_CONTINUE_BTN),
|
||||
HOTKEY_LIST_END(AIDebugWindow)
|
||||
};
|
||||
Hotkey<AIDebugWindow> *_aidebug_hotkeys = AIDebugWindow::aidebug_hotkeys;
|
||||
|
||||
/** Widgets for the AI debug window. */
|
||||
static const NWidgetPart _nested_ai_debug_widgets[] = {
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
@@ -1453,7 +1294,7 @@ static const NWidgetPart _nested_ai_debug_widgets[] = {
|
||||
NWidgetFunction(MakeCompanyButtonRowsAIDebug), SetPadding(0, 2, 1, 2),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_SCRIPT_GAME), SetMinimalSize(100, 20), SetResize(1, 0), SetDataTip(STR_AI_GAME_SCRIPT, STR_AI_GAME_SCRIPT_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_SCRIPT_GAME), SetMinimalSize(100, 20), SetResize(1, 0), SetDataTip(STR_AI_GAME_SCRIPT, STR_AI_GAME_SCRIPT_TOOLTIP),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_NAME_TEXT), SetFill(1, 0), SetResize(1, 0), SetDataTip(STR_JUST_STRING, STR_AI_DEBUG_NAME_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_SETTINGS), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_SETTINGS, STR_AI_DEBUG_SETTINGS_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_RELOAD_TOGGLE), SetMinimalSize(100, 20), SetDataTip(STR_AI_DEBUG_RELOAD, STR_AI_DEBUG_RELOAD_TOOLTIP),
|
||||
@@ -1470,10 +1311,10 @@ static const NWidgetPart _nested_ai_debug_widgets[] = {
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_LABEL, COLOUR_GREY), SetPadding(2, 2, 2, 4), SetDataTip(STR_AI_DEBUG_BREAK_ON_LABEL, 0x0),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_AID_BREAK_STR_EDIT_BOX), SetFill(1, 1), SetResize(1, 0), SetPadding(2, 2, 2, 2), SetDataTip(STR_AI_DEBUG_BREAK_STR_OSKTITLE, STR_AI_DEBUG_BREAK_STR_TOOLTIP),
|
||||
NWidget(WWT_EDITBOX, COLOUR_WHITE, WID_AID_BREAK_STR_EDIT_BOX), SetFill(1, 1), SetResize(1, 0), SetPadding(2, 2, 2, 2), SetDataTip(STR_AI_DEBUG_BREAK_STR_OSKTITLE, STR_AI_DEBUG_BREAK_STR_TOOLTIP),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_AID_MATCH_CASE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_MATCH_CASE, STR_AI_DEBUG_MATCH_CASE_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_MATCH_CASE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_MATCH_CASE, STR_AI_DEBUG_MATCH_CASE_TOOLTIP),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_AID_CONTINUE_BTN), SetMinimalSize(100, 0), SetFill(0, 1), SetDataTip(STR_AI_DEBUG_CONTINUE, STR_AI_DEBUG_CONTINUE_TOOLTIP),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
@@ -1497,30 +1338,15 @@ static const WindowDesc _ai_debug_desc(
|
||||
* Open the AI debug window and select the given company.
|
||||
* @param show_company Display debug information about this AI company.
|
||||
*/
|
||||
Window *ShowAIDebugWindow(CompanyID show_company)
|
||||
void ShowAIDebugWindow(CompanyID show_company)
|
||||
{
|
||||
if (!_networking || _network_server) {
|
||||
AIDebugWindow *w = (AIDebugWindow *)BringWindowToFrontById(WC_AI_DEBUG, 0);
|
||||
if (w == NULL) w = new AIDebugWindow(&_ai_debug_desc, 0);
|
||||
if (show_company != INVALID_COMPANY) w->ChangeToAI(show_company);
|
||||
return w;
|
||||
} else {
|
||||
ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, WL_INFO);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for global AI debug window hotkeys.
|
||||
*/
|
||||
EventState AIDebugGlobalHotkeys(uint16 key, uint16 keycode)
|
||||
{
|
||||
int num = CheckHotkeyMatch<AIDebugWindow>(_aidebug_hotkeys, keycode, NULL, true);
|
||||
if (num == -1) return ES_NOT_HANDLED;
|
||||
Window *w = ShowAIDebugWindow(INVALID_COMPANY);
|
||||
if (w == NULL) return ES_NOT_HANDLED;
|
||||
return w->OnKeyPress(key, keycode);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -14,7 +14,7 @@
|
||||
|
||||
#include "../company_type.h"
|
||||
|
||||
Window* ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY);
|
||||
void ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY);
|
||||
void ShowAIConfigWindow();
|
||||
void ShowAIDebugWindowIfAIError();
|
||||
void InitializeAIGui();
|
||||
|
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
static bool CheckAPIVersion(const char *api_version)
|
||||
{
|
||||
return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 || strcmp(api_version, "1.2") == 0 || strcmp(api_version, "1.3") == 0;
|
||||
return strcmp(api_version, "0.7") == 0 || strcmp(api_version, "1.0") == 0 || strcmp(api_version, "1.1") == 0 || strcmp(api_version, "1.2") == 0;
|
||||
}
|
||||
|
||||
#if defined(WIN32)
|
||||
|
@@ -81,6 +81,7 @@
|
||||
|
||||
#include "../company_base.h"
|
||||
#include "../company_func.h"
|
||||
#include "../fileio_func.h"
|
||||
|
||||
AIInstance::AIInstance() :
|
||||
ScriptInstance("AI")
|
||||
@@ -127,16 +128,13 @@ void AIInstance::RegisterAPI()
|
||||
SQAIEventCompanyInTrouble_Register(this->engine);
|
||||
SQAIEventCompanyMerger_Register(this->engine);
|
||||
SQAIEventCompanyNew_Register(this->engine);
|
||||
SQAIEventCompanyTown_Register(this->engine);
|
||||
SQAIEventController_Register(this->engine);
|
||||
SQAIEventDisasterZeppelinerCleared_Register(this->engine);
|
||||
SQAIEventDisasterZeppelinerCrashed_Register(this->engine);
|
||||
SQAIEventEngineAvailable_Register(this->engine);
|
||||
SQAIEventEnginePreview_Register(this->engine);
|
||||
SQAIEventExclusiveTransportRights_Register(this->engine);
|
||||
SQAIEventIndustryClose_Register(this->engine);
|
||||
SQAIEventIndustryOpen_Register(this->engine);
|
||||
SQAIEventRoadReconstruction_Register(this->engine);
|
||||
SQAIEventStationFirstVehicle_Register(this->engine);
|
||||
SQAIEventSubsidyAwarded_Register(this->engine);
|
||||
SQAIEventSubsidyExpired_Register(this->engine);
|
||||
@@ -193,7 +191,29 @@ void AIInstance::RegisterAPI()
|
||||
SQAIWaypointList_Register(this->engine);
|
||||
SQAIWaypointList_Vehicle_Register(this->engine);
|
||||
|
||||
if (!this->LoadCompatibilityScripts(this->versionAPI, AI_DIR)) this->Died();
|
||||
if (!this->LoadCompatibilityScripts(this->versionAPI)) this->Died();
|
||||
}
|
||||
|
||||
bool AIInstance::LoadCompatibilityScripts(const char *api_version)
|
||||
{
|
||||
char script_name[32];
|
||||
seprintf(script_name, lastof(script_name), "compat_%s.nut", api_version);
|
||||
char buf[MAX_PATH];
|
||||
Searchpath sp;
|
||||
FOR_ALL_SEARCHPATHS(sp) {
|
||||
FioAppendDirectory(buf, MAX_PATH, sp, AI_DIR);
|
||||
ttd_strlcat(buf, script_name, MAX_PATH);
|
||||
if (!FileExists(buf)) continue;
|
||||
|
||||
if (this->engine->LoadScript(buf)) return true;
|
||||
|
||||
ScriptLog::Error("Failed to load API compatibility script");
|
||||
DEBUG(script, 0, "Error compiling / running API compatibility script: %s", buf);
|
||||
return false;
|
||||
}
|
||||
|
||||
ScriptLog::Warning("API compatibility script not found");
|
||||
return true;
|
||||
}
|
||||
|
||||
void AIInstance::Died()
|
||||
|
@@ -29,10 +29,17 @@ public:
|
||||
/* virtual */ ScriptInfo *FindLibrary(const char *library, int version);
|
||||
|
||||
private:
|
||||
const char *versionAPI; ///< Current API used by this script.
|
||||
|
||||
/* virtual */ void RegisterAPI();
|
||||
/* virtual */ void Died();
|
||||
/* virtual */ CommandCallback *GetDoCommandCallback();
|
||||
/* virtual */ void LoadDummyScript();
|
||||
|
||||
/**
|
||||
* Load squirrel scripts to emulate an older API.
|
||||
*/
|
||||
bool LoadCompatibilityScripts(const char *api_version);
|
||||
};
|
||||
|
||||
#endif /* AI_INSTANCE_HPP */
|
||||
|
@@ -30,7 +30,7 @@ public:
|
||||
/**
|
||||
* Check if we have an AI by name and version available in our list.
|
||||
* @param nameParam The name of the AI.
|
||||
* @param versionParam The version of the AI, or -1 if you want the latest.
|
||||
* @param versionParam The versionof the AI, or -1 if you want the latest.
|
||||
* @param force_exact_match Only match name+version, never latest.
|
||||
* @return NULL if no match found, otherwise the AI that matched.
|
||||
*/
|
||||
|
@@ -32,7 +32,7 @@ enum VehicleAirFlags {
|
||||
|
||||
|
||||
void HandleAircraftEnterHangar(Aircraft *v);
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type);
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, EngineImageType image_type);
|
||||
void UpdateAirplanesOnNewStation(const Station *st);
|
||||
void UpdateAircraftCache(Aircraft *v, bool update_range = false);
|
||||
|
||||
@@ -76,7 +76,6 @@ struct Aircraft FINAL : public SpecializedVehicle<Aircraft, VEH_AIRCRAFT> {
|
||||
int GetDisplaySpeed() const { return this->cur_speed; }
|
||||
int GetDisplayMaxSpeed() const { return this->vcache.cached_max_speed; }
|
||||
int GetSpeedOldUnits() const { return this->vcache.cached_max_speed * 10 / 128; }
|
||||
int GetCurrentMaxSpeed() const { return this->GetSpeedOldUnits(); }
|
||||
Money GetRunningCost() const;
|
||||
|
||||
bool IsInDepot() const
|
||||
|
@@ -136,11 +136,6 @@ static StationID FindNearestHangar(const Aircraft *v)
|
||||
|
||||
/* v->tile can't be used here, when aircraft is flying v->tile is set to 0 */
|
||||
uint distance = DistanceSquare(vtile, st->airport.tile);
|
||||
if (v->acache.cached_max_range_sqr != 0) {
|
||||
/* Check if our current destination can be reached from the depot airport. */
|
||||
const Station *cur_dest = GetTargetAirportIfValid(v);
|
||||
if (cur_dest != NULL && DistanceSquare(st->airport.tile, cur_dest->airport.tile) > v->acache.cached_max_range_sqr) continue;
|
||||
}
|
||||
if (distance < best || index == INVALID_STATION) {
|
||||
best = distance;
|
||||
index = st->index;
|
||||
@@ -207,22 +202,17 @@ void DrawAircraftEngine(int left, int right, int preferred_x, int y, EngineID en
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the size of the sprite of an aircraft sprite heading west (used for lists).
|
||||
* @param engine The engine to get the sprite from.
|
||||
* @param[out] width The width of the sprite.
|
||||
* @param[out] height The height of the sprite.
|
||||
* @param[out] xoffs Number of pixels to shift the sprite to the right.
|
||||
* @param[out] yoffs Number of pixels to shift the sprite downwards.
|
||||
* @param image_type Context the sprite is used in.
|
||||
* Get the size of the sprite of an aircraft sprite heading west (used for lists)
|
||||
* @param engine The engine to get the sprite from
|
||||
* @param width The width of the sprite
|
||||
* @param height The height of the sprite
|
||||
*/
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, int &xoffs, int &yoffs, EngineImageType image_type)
|
||||
void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height, EngineImageType image_type)
|
||||
{
|
||||
const Sprite *spr = GetSprite(GetAircraftIcon(engine, image_type), ST_NORMAL);
|
||||
|
||||
width = UnScaleByZoom(spr->width, ZOOM_LVL_GUI);
|
||||
height = UnScaleByZoom(spr->height, ZOOM_LVL_GUI);
|
||||
xoffs = UnScaleByZoom(spr->x_offs, ZOOM_LVL_GUI);
|
||||
yoffs = UnScaleByZoom(spr->y_offs, ZOOM_LVL_GUI);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -302,7 +292,7 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
|
||||
v->targetairport = GetStationIndex(tile);
|
||||
v->SetNext(u);
|
||||
|
||||
v->SetServiceInterval(Company::Get(_current_company)->settings.vehicle.servint_aircraft);
|
||||
v->service_interval = Company::Get(_current_company)->settings.vehicle.servint_aircraft;
|
||||
|
||||
v->date_of_last_service = _date;
|
||||
v->build_year = u->build_year = _cur_year;
|
||||
@@ -314,7 +304,6 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, const Engine *
|
||||
|
||||
v->vehicle_flags = 0;
|
||||
if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
|
||||
v->SetServiceIntervalIsPercent(Company::Get(_current_company)->settings.vehicle.servint_ispercent);
|
||||
|
||||
v->InvalidateNewGRFCacheOfChain();
|
||||
|
||||
@@ -636,7 +625,7 @@ static int UpdateAircraftSpeed(Aircraft *v, uint speed_limit = SPEED_LIMIT_NONE,
|
||||
/* Adjust distance moved by plane speed setting */
|
||||
if (_settings_game.vehicle.plane_speed > 1) spd /= _settings_game.vehicle.plane_speed;
|
||||
|
||||
/* Convert direction-independent speed into direction-dependent speed. (old movement method) */
|
||||
/* Convert direction-indepenent speed into direction-dependent speed. (old movement method) */
|
||||
spd = v->GetOldAdvanceSpeed(spd);
|
||||
|
||||
spd += v->progress;
|
||||
@@ -661,7 +650,7 @@ int GetAircraftFlyingAltitude(const Aircraft *v)
|
||||
int base_altitude = PLANE_HOLDING_ALTITUDE;
|
||||
|
||||
/* Make sure eastbound and westbound planes do not "crash" into each
|
||||
* other by providing them with vertical separation
|
||||
* other by providing them with vertical seperation
|
||||
*/
|
||||
switch (v->direction) {
|
||||
case DIR_N:
|
||||
@@ -1174,10 +1163,13 @@ static void CrashAirplane(Aircraft *v)
|
||||
AI::NewEvent(v->owner, new ScriptEventVehicleCrashed(v->index, v->tile, st == NULL ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
|
||||
Game::NewEvent(new ScriptEventVehicleCrashed(v->index, v->tile, st == NULL ? ScriptEventVehicleCrashed::CRASH_AIRCRAFT_NO_AIRPORT : ScriptEventVehicleCrashed::CRASH_PLANE_LANDING));
|
||||
|
||||
AddVehicleNewsItem(newsitem, NT_ACCIDENT, v->index, st != NULL ? st->index : INVALID_STATION);
|
||||
AddVehicleNewsItem(newsitem,
|
||||
NS_ACCIDENT,
|
||||
v->index,
|
||||
st != NULL ? st->index : INVALID_STATION);
|
||||
|
||||
ModifyStationRatingAround(v->tile, v->owner, -160, 30);
|
||||
if (_settings_client.sound.disaster) SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
SndPlayVehicleFx(SND_12_EXPLOSION, v);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1230,7 +1222,7 @@ static void AircraftEntersTerminal(Aircraft *v)
|
||||
/* show newsitem of celebrating citizens */
|
||||
AddVehicleNewsItem(
|
||||
STR_NEWS_FIRST_AIRCRAFT_ARRIVAL,
|
||||
(v->owner == _local_company) ? NT_ARRIVAL_COMPANY : NT_ARRIVAL_OTHER,
|
||||
(v->owner == _local_company) ? NS_ARRIVAL_COMPANY : NS_ARRIVAL_OTHER,
|
||||
v->index,
|
||||
st->index
|
||||
);
|
||||
@@ -1381,7 +1373,7 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *
|
||||
* and get serviced at the same time - setting */
|
||||
if (_settings_game.order.serviceathelipad) {
|
||||
if (v->subtype == AIR_HELICOPTER && apc->num_helipads > 0) {
|
||||
/* an excerpt of ServiceAircraft, without the invisibility stuff */
|
||||
/* an exerpt of ServiceAircraft, without the invisibility stuff */
|
||||
v->date_of_last_service = _date;
|
||||
v->breakdowns_since_last_service = 0;
|
||||
v->reliability = v->GetEngine()->reliability;
|
||||
@@ -1403,7 +1395,7 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *
|
||||
switch (v->current_order.GetType()) {
|
||||
case OT_GOTO_STATION: // ready to fly to another airport
|
||||
break;
|
||||
case OT_GOTO_DEPOT: // visit hangar for servicing, sale, etc.
|
||||
case OT_GOTO_DEPOT: // visit hangar for serivicing, sale, etc.
|
||||
go_to_hangar = v->current_order.GetDestination() == v->targetairport;
|
||||
break;
|
||||
case OT_CONDITIONAL:
|
||||
@@ -1469,8 +1461,8 @@ static void AircraftEventHandler_Flying(Aircraft *v, const AirportFTAClass *apc)
|
||||
{
|
||||
Station *st = Station::Get(v->targetairport);
|
||||
|
||||
/* Runway busy, not allowed to use this airstation or closed, circle. */
|
||||
if (CanVehicleUseStation(v, st) && (st->owner == OWNER_NONE || st->owner == v->owner) && !(st->airport.flags & AIRPORT_CLOSED_block)) {
|
||||
/* runway busy or not allowed to use this airstation, circle */
|
||||
if (CanVehicleUseStation(v, st) && (st->owner == OWNER_NONE || st->owner == v->owner)) {
|
||||
/* {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
|
||||
* if it is an airplane, look for LANDING, for helicopter HELILANDING
|
||||
* it is possible to choose from multiple landing runways, so loop until a free one is found */
|
||||
@@ -1870,7 +1862,7 @@ static void AircraftHandleDestTooFar(Aircraft *v, bool too_far)
|
||||
if (v->owner == _local_company) {
|
||||
/* Post a news message. */
|
||||
SetDParam(0, v->index);
|
||||
AddVehicleAdviceNewsItem(STR_NEWS_AIRCRAFT_DEST_TOO_FAR, v->index);
|
||||
AddVehicleNewsItem(STR_NEWS_AIRCRAFT_DEST_TOO_FAR, NS_ADVICE, v->index);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
@@ -22,7 +22,7 @@
|
||||
* @param terminals The terminals.
|
||||
* @param num_helipads Number of heli pads.
|
||||
* @param flags Information about the class of FTA.
|
||||
* @param delta_z Height of the airport above the land.
|
||||
* @param delta_z Height of the arport above the land.
|
||||
*/
|
||||
#define AIRPORT_GENERIC(name, terminals, num_helipads, flags, delta_z) \
|
||||
static AirportFTAClass _airportfta_ ## name(_airport_moving_data_ ## name, terminals, \
|
||||
@@ -41,7 +41,7 @@
|
||||
* Define a heliport.
|
||||
* @param name Suffix of the names of the helipad data.
|
||||
* @param num_helipads Number of heli pads.
|
||||
* @param delta_z Height of the airport above the land.
|
||||
* @param delta_z Height of the arport above the land.
|
||||
*/
|
||||
#define HELIPORT(name, num_helipads, delta_z) \
|
||||
AIRPORT_GENERIC(name, NULL, num_helipads, AirportFTAClass::HELICOPTERS, delta_z)
|
||||
|
@@ -122,8 +122,7 @@ static const uint64
|
||||
OUT_WAY_block2 = 1ULL << 31,
|
||||
/* end of new blocks */
|
||||
|
||||
NOTHING_block = 1ULL << 30,
|
||||
AIRPORT_CLOSED_block = 1ULL << 63; ///< Dummy block for indicating a closed airport.
|
||||
NOTHING_block = 1ULL << 30;
|
||||
|
||||
/** A single location on an airport where aircraft can move to. */
|
||||
struct AirportMovingData {
|
||||
|
@@ -43,7 +43,7 @@ void CcBuildAirport(const CommandCost &result, TileIndex tile, uint32 p1, uint32
|
||||
{
|
||||
if (result.Failed()) return;
|
||||
|
||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_1F_SPLAT, tile);
|
||||
SndPlayTileFx(SND_1F_SPLAT, tile);
|
||||
if (!_settings_client.gui.persistent_buildingtools) ResetObjectToPlace();
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ static void PlaceAirport(TileIndex tile)
|
||||
uint32 p2 = _ctrl_pressed;
|
||||
SB(p2, 16, 16, INVALID_STATION); // no station to join
|
||||
|
||||
uint32 p1 = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index)->GetIndex();
|
||||
uint32 p1 = AirportClass::Get(_selected_airport_class, _selected_airport_index)->GetIndex();
|
||||
p1 |= _selected_airport_layout << 8;
|
||||
CommandContainer cmdcont = { tile, p1, p2, CMD_BUILD_AIRPORT | CMD_MSG(STR_ERROR_CAN_T_BUILD_AIRPORT_HERE), CcBuildAirport, "" };
|
||||
ShowSelectStationIfNeeded(cmdcont, TileArea(tile, _thd.size.x / TILE_SIZE, _thd.size.y / TILE_SIZE));
|
||||
@@ -207,8 +207,8 @@ class BuildAirportWindow : public PickerWindowBase {
|
||||
{
|
||||
DropDownList *list = new DropDownList();
|
||||
|
||||
for (uint i = 0; i < AirportClass::GetClassCount(); i++) {
|
||||
list->push_back(new DropDownListStringItem(AirportClass::Get((AirportClassID)i)->name, i, false));
|
||||
for (uint i = 0; i < AirportClass::GetCount(); i++) {
|
||||
list->push_back(new DropDownListStringItem(AirportClass::GetName((AirportClassID)i), i, false));
|
||||
}
|
||||
|
||||
return list;
|
||||
@@ -229,7 +229,7 @@ public:
|
||||
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
|
||||
this->OnInvalidateData();
|
||||
|
||||
this->vscroll->SetCount(AirportClass::Get(_selected_airport_class)->GetSpecCount());
|
||||
this->vscroll->SetCount(AirportClass::GetCount(_selected_airport_class));
|
||||
this->SelectFirstAvailableAirport(true);
|
||||
}
|
||||
|
||||
@@ -242,13 +242,13 @@ public:
|
||||
{
|
||||
switch (widget) {
|
||||
case WID_AP_CLASS_DROPDOWN:
|
||||
SetDParam(0, AirportClass::Get(_selected_airport_class)->name);
|
||||
SetDParam(0, AirportClass::GetName(_selected_airport_class));
|
||||
break;
|
||||
|
||||
case WID_AP_LAYOUT_NUM:
|
||||
SetDParam(0, STR_EMPTY);
|
||||
if (_selected_airport_index != -1) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
StringID string = GetAirportTextCallback(as, _selected_airport_layout, CBID_AIRPORT_LAYOUT_NAME);
|
||||
if (string != STR_UNDEFINED) {
|
||||
SetDParam(0, string);
|
||||
@@ -268,8 +268,8 @@ public:
|
||||
switch (widget) {
|
||||
case WID_AP_CLASS_DROPDOWN: {
|
||||
Dimension d = {0, 0};
|
||||
for (uint i = 0; i < AirportClass::GetClassCount(); i++) {
|
||||
SetDParam(0, AirportClass::Get((AirportClassID)i)->name);
|
||||
for (uint i = 0; i < AirportClass::GetCount(); i++) {
|
||||
SetDParam(0, AirportClass::GetName((AirportClassID)i));
|
||||
d = maxdim(d, GetStringBoundingBox(STR_BLACK_STRING));
|
||||
}
|
||||
d.width += padding.width;
|
||||
@@ -332,9 +332,8 @@ public:
|
||||
switch (widget) {
|
||||
case WID_AP_AIRPORT_LIST: {
|
||||
int y = r.top;
|
||||
AirportClass *apclass = AirportClass::Get(_selected_airport_class);
|
||||
for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < apclass->GetSpecCount(); i++) {
|
||||
const AirportSpec *as = apclass->GetSpec(i);
|
||||
for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < AirportClass::GetCount(_selected_airport_class); i++) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, i);
|
||||
if (!as->IsAvailable()) {
|
||||
GfxFillRect(r.left + 1, y + 1, r.right - 1, y + this->line_height - 2, PC_BLACK, FILLRECT_CHECKER);
|
||||
}
|
||||
@@ -353,7 +352,7 @@ public:
|
||||
|
||||
case WID_AP_EXTRA_TEXT:
|
||||
if (_selected_airport_index != -1) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
StringID string = GetAirportTextCallback(as, _selected_airport_layout, CBID_AIRPORT_ADDITIONAL_TEXT);
|
||||
if (string != STR_UNDEFINED) {
|
||||
SetDParam(0, string);
|
||||
@@ -375,7 +374,7 @@ public:
|
||||
int bottom = panel_nwi->pos_y + panel_nwi->current_y;
|
||||
|
||||
if (_selected_airport_index != -1) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
int rad = _settings_game.station.modified_catchment ? as->catchment : (uint)CA_UNMODIFIED;
|
||||
|
||||
/* only show the station (airport) noise, if the noise option is activated */
|
||||
@@ -413,7 +412,7 @@ public:
|
||||
this->DisableWidget(WID_AP_LAYOUT_DECREASE);
|
||||
this->DisableWidget(WID_AP_LAYOUT_INCREASE);
|
||||
} else {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(_selected_airport_index);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
|
||||
int w = as->size_x;
|
||||
int h = as->size_y;
|
||||
Direction rotation = as->rotation[_selected_airport_layout];
|
||||
@@ -440,7 +439,7 @@ public:
|
||||
case WID_AP_AIRPORT_LIST: {
|
||||
int num_clicked = this->vscroll->GetPosition() + (pt.y - this->nested_array[widget]->pos_y) / this->line_height;
|
||||
if (num_clicked >= this->vscroll->GetCount()) break;
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class)->GetSpec(num_clicked);
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, num_clicked);
|
||||
if (as->IsAvailable()) this->SelectOtherAirport(num_clicked);
|
||||
break;
|
||||
}
|
||||
@@ -450,7 +449,7 @@ public:
|
||||
this->SetWidgetLoweredState(WID_AP_BTN_DONTHILIGHT, !_settings_client.gui.station_show_coverage);
|
||||
this->SetWidgetLoweredState(WID_AP_BTN_DOHILIGHT, _settings_client.gui.station_show_coverage);
|
||||
this->SetDirty();
|
||||
if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
|
||||
SndPlayFx(SND_15_BEEP);
|
||||
this->UpdateSelectSize();
|
||||
break;
|
||||
|
||||
@@ -476,9 +475,8 @@ public:
|
||||
void SelectFirstAvailableAirport(bool change_class)
|
||||
{
|
||||
/* First try to select an airport in the selected class. */
|
||||
AirportClass *sel_apclass = AirportClass::Get(_selected_airport_class);
|
||||
for (uint i = 0; i < sel_apclass->GetSpecCount(); i++) {
|
||||
const AirportSpec *as = sel_apclass->GetSpec(i);
|
||||
for (uint i = 0; i < AirportClass::GetCount(_selected_airport_class); i++) {
|
||||
const AirportSpec *as = AirportClass::Get(_selected_airport_class, i);
|
||||
if (as->IsAvailable()) {
|
||||
this->SelectOtherAirport(i);
|
||||
return;
|
||||
@@ -488,9 +486,8 @@ public:
|
||||
/* If that fails, select the first available airport
|
||||
* from a random class. */
|
||||
for (AirportClassID j = APC_BEGIN; j < APC_MAX; j++) {
|
||||
AirportClass *apclass = AirportClass::Get(j);
|
||||
for (uint i = 0; i < apclass->GetSpecCount(); i++) {
|
||||
const AirportSpec *as = apclass->GetSpec(i);
|
||||
for (uint i = 0; i < AirportClass::GetCount(j); i++) {
|
||||
const AirportSpec *as = AirportClass::Get(j, i);
|
||||
if (as->IsAvailable()) {
|
||||
_selected_airport_class = j;
|
||||
this->SelectOtherAirport(i);
|
||||
@@ -507,7 +504,7 @@ public:
|
||||
{
|
||||
assert(widget == WID_AP_CLASS_DROPDOWN);
|
||||
_selected_airport_class = (AirportClassID)index;
|
||||
this->vscroll->SetCount(AirportClass::Get(_selected_airport_class)->GetSpecCount());
|
||||
this->vscroll->SetCount(AirportClass::GetCount(_selected_airport_class));
|
||||
this->SelectFirstAvailableAirport(false);
|
||||
}
|
||||
|
||||
@@ -557,7 +554,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = {
|
||||
static const WindowDesc _build_airport_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_BUILD_STATION, WC_BUILD_TOOLBAR,
|
||||
WDF_CONSTRUCTION,
|
||||
WDF_CONSTRUCTION | WDF_UNCLICK_BUTTONS,
|
||||
_nested_build_airport_widgets, lengthof(_nested_build_airport_widgets)
|
||||
);
|
||||
|
||||
|
@@ -68,7 +68,7 @@ bool IsArticulatedEngine(EngineID engine_type)
|
||||
* Count the number of articulated parts of an engine.
|
||||
* @param engine_type The engine to get the number of parts of.
|
||||
* @param purchase_window Whether we are in the scope of the purchase window or not, i.e. whether we cannot allocate vehicles.
|
||||
* @return The number of parts.
|
||||
* @return The nmumber of parts.
|
||||
*/
|
||||
uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
|
||||
{
|
||||
@@ -98,7 +98,7 @@ uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
|
||||
|
||||
/**
|
||||
* Returns the default (non-refitted) capacity of a specific EngineID.
|
||||
* @param engine the EngineID of interest
|
||||
* @param engine the EngineID of iterest
|
||||
* @param cargo_type returns the default cargo type, if needed
|
||||
* @return capacity
|
||||
*/
|
||||
@@ -113,7 +113,7 @@ static inline uint16 GetVehicleDefaultCapacity(EngineID engine, CargoID *cargo_t
|
||||
|
||||
/**
|
||||
* Returns all cargoes a vehicle can carry.
|
||||
* @param engine the EngineID of interest
|
||||
* @param engine the EngineID of iterest
|
||||
* @param include_initial_cargo_type if true the default cargo type of the vehicle is included; if false only the refit_mask
|
||||
* @return bit set of CargoIDs
|
||||
*/
|
||||
|
@@ -57,18 +57,16 @@ void RemoveAllEngineReplacement(EngineRenewList *erl)
|
||||
* @param erl The renewlist to search in.
|
||||
* @param engine Engine type to be replaced.
|
||||
* @param group The group related to this replacement.
|
||||
* @param[out] replace_when_old Set to true if the replacement should be done when old.
|
||||
* @return The engine type to replace with, or INVALID_ENGINE if no
|
||||
* replacement is in the list.
|
||||
*/
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group, bool *replace_when_old)
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group)
|
||||
{
|
||||
const EngineRenew *er = GetEngineReplacement(erl, engine, group);
|
||||
if (er == NULL && (group == DEFAULT_GROUP || (Group::IsValidID(group) && !Group::Get(group)->replace_protection))) {
|
||||
/* We didn't find anything useful in the vehicle's own group so we will try ALL_GROUP */
|
||||
er = GetEngineReplacement(erl, engine, ALL_GROUP);
|
||||
}
|
||||
if (replace_when_old != NULL) *replace_when_old = er == NULL ? false : er->replace_when_old;
|
||||
return er == NULL ? INVALID_ENGINE : er->to;
|
||||
}
|
||||
|
||||
@@ -78,19 +76,15 @@ EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group,
|
||||
* @param old_engine The original engine type.
|
||||
* @param new_engine The replacement engine type.
|
||||
* @param group The group related to this replacement.
|
||||
* @param replace_when_old Replace when old or always?
|
||||
* @param flags The calling command flags.
|
||||
* @return 0 on success, CMD_ERROR on failure.
|
||||
*/
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, bool replace_when_old, DoCommandFlag flags)
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, DoCommandFlag flags)
|
||||
{
|
||||
/* Check if the old vehicle is already in the list */
|
||||
EngineRenew *er = GetEngineReplacement(*erl, old_engine, group);
|
||||
if (er != NULL) {
|
||||
if (flags & DC_EXEC) {
|
||||
er->to = new_engine;
|
||||
er->replace_when_old = replace_when_old;
|
||||
}
|
||||
if (flags & DC_EXEC) er->to = new_engine;
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
@@ -99,7 +93,6 @@ CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, Engi
|
||||
if (flags & DC_EXEC) {
|
||||
er = new EngineRenew(old_engine, new_engine);
|
||||
er->group_id = group;
|
||||
er->replace_when_old = replace_when_old;
|
||||
|
||||
/* Insert before the first element */
|
||||
er->next = (EngineRenew *)(*erl);
|
||||
|
@@ -37,7 +37,6 @@ struct EngineRenew : EngineRenewPool::PoolItem<&_enginerenew_pool> {
|
||||
EngineID to;
|
||||
EngineRenew *next;
|
||||
GroupID group_id;
|
||||
bool replace_when_old; ///< Do replacement only when vehicle is old.
|
||||
|
||||
EngineRenew(EngineID from = INVALID_ENGINE, EngineID to = INVALID_ENGINE) : from(from), to(to) {}
|
||||
~EngineRenew() {}
|
||||
|
@@ -66,18 +66,18 @@ bool CheckAutoreplaceValidity(EngineID from, EngineID to, CompanyID company)
|
||||
/* make sure the railtypes are compatible */
|
||||
if ((GetRailTypeInfo(e_from->u.rail.railtype)->compatible_railtypes & GetRailTypeInfo(e_to->u.rail.railtype)->compatible_railtypes) == 0) return false;
|
||||
|
||||
/* make sure we do not replace wagons with engines or vice versa */
|
||||
/* make sure we do not replace wagons with engines or vise versa */
|
||||
if ((e_from->u.rail.railveh_type == RAILVEH_WAGON) != (e_to->u.rail.railveh_type == RAILVEH_WAGON)) return false;
|
||||
break;
|
||||
}
|
||||
|
||||
case VEH_ROAD:
|
||||
/* make sure that we do not replace a tram with a normal road vehicles or vice versa */
|
||||
/* make sure that we do not replace a tram with a normal road vehicles or vise versa */
|
||||
if (HasBit(e_from->info.misc_flags, EF_ROAD_TRAM) != HasBit(e_to->info.misc_flags, EF_ROAD_TRAM)) return false;
|
||||
break;
|
||||
|
||||
case VEH_AIRCRAFT:
|
||||
/* make sure that we do not replace a plane with a helicopter or vice versa */
|
||||
/* make sure that we do not replace a plane with a helicopter or vise versa */
|
||||
if ((e_from->u.air.subtype & AIR_CTOL) != (e_to->u.air.subtype & AIR_CTOL)) return false;
|
||||
break;
|
||||
|
||||
@@ -225,11 +225,10 @@ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type, bool
|
||||
* Get the EngineID of the replacement for a vehicle
|
||||
* @param v The vehicle to find a replacement for
|
||||
* @param c The vehicle's owner (it's faster to forward the pointer than refinding it)
|
||||
* @param always_replace Always replace, even if not old.
|
||||
* @param [out] e the EngineID of the replacement. INVALID_ENGINE if no replacement is found
|
||||
* @return Error if the engine to build is not available
|
||||
*/
|
||||
static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, bool always_replace, EngineID &e)
|
||||
static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, EngineID &e)
|
||||
{
|
||||
assert(v->type != VEH_TRAIN || !v->IsArticulatedPart());
|
||||
|
||||
@@ -240,9 +239,7 @@ static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, bool alw
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
bool replace_when_old;
|
||||
e = EngineReplacementForCompany(c, v->engine_type, v->group_id, &replace_when_old);
|
||||
if (!always_replace && replace_when_old && !v->NeedsAutorenewing(c, false)) e = INVALID_ENGINE;
|
||||
e = EngineReplacementForCompany(c, v->engine_type, v->group_id);
|
||||
|
||||
/* Autoreplace, if engine is available */
|
||||
if (e != INVALID_ENGINE && IsEngineBuildable(e, v->type, _current_company)) {
|
||||
@@ -263,7 +260,7 @@ static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, bool alw
|
||||
* Builds and refits a replacement vehicle
|
||||
* Important: The old vehicle is still in the original vehicle chain (used for determining the cargo when the old vehicle did not carry anything, but the new one does)
|
||||
* @param old_veh A single (articulated/multiheaded) vehicle that shall be replaced.
|
||||
* @param new_vehicle Returns the newly build and refitted vehicle
|
||||
* @param new_vehicle Returns the newly build and refittet vehicle
|
||||
* @param part_of_chain The vehicle is part of a train
|
||||
* @return cost or error
|
||||
*/
|
||||
@@ -274,7 +271,7 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
|
||||
/* Shall the vehicle be replaced? */
|
||||
const Company *c = Company::Get(_current_company);
|
||||
EngineID e;
|
||||
CommandCost cost = GetNewEngineType(old_veh, c, true, e);
|
||||
CommandCost cost = GetNewEngineType(old_veh, c, e);
|
||||
if (cost.Failed()) return cost;
|
||||
if (e == INVALID_ENGINE) return CommandCost(); // neither autoreplace is set, nor autorenew is triggered
|
||||
|
||||
@@ -357,6 +354,11 @@ static CommandCost CopyHeadSpecificThings(Vehicle *old_head, Vehicle *new_head,
|
||||
|
||||
/* Last do those things which do never fail (resp. we do not care about), but which are not undo-able */
|
||||
if (cost.Succeeded() && old_head != new_head && (flags & DC_EXEC) != 0) {
|
||||
/* Copy vehicle name */
|
||||
if (old_head->name != NULL) {
|
||||
DoCommand(0, new_head->index, 0, DC_EXEC | DC_AUTOREPLACE, CMD_RENAME_VEHICLE, old_head->name);
|
||||
}
|
||||
|
||||
/* Copy other things which cannot be copied by a command and which shall not stay resetted from the build vehicle command */
|
||||
new_head->CopyVehicleConfigAndStatistics(old_head);
|
||||
|
||||
@@ -681,7 +683,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
bool any_replacements = false;
|
||||
while (w != NULL) {
|
||||
EngineID e;
|
||||
CommandCost cost = GetNewEngineType(w, c, false, e);
|
||||
CommandCost cost = GetNewEngineType(w, c, e);
|
||||
if (cost.Failed()) return cost;
|
||||
any_replacements |= (e != INVALID_ENGINE);
|
||||
w = (!free_wagon && w->type == VEH_TRAIN ? Train::From(w)->GetNextUnit() : NULL);
|
||||
@@ -734,7 +736,6 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
|
||||
* @param tile unused
|
||||
* @param flags operation to perform
|
||||
* @param p1 packed data
|
||||
* - bit 0 = replace when engine gets old?
|
||||
* - bits 16-31 = engine group
|
||||
* @param p2 packed data
|
||||
* - bits 0-15 = old engine type
|
||||
@@ -759,14 +760,14 @@ CommandCost CmdSetAutoReplace(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
|
||||
if (!Engine::IsValidID(new_engine_type)) return CMD_ERROR;
|
||||
if (!CheckAutoreplaceValidity(old_engine_type, new_engine_type, _current_company)) return CMD_ERROR;
|
||||
|
||||
cost = AddEngineReplacementForCompany(c, old_engine_type, new_engine_type, id_g, HasBit(p1, 0), flags);
|
||||
cost = AddEngineReplacementForCompany(c, old_engine_type, new_engine_type, id_g, flags);
|
||||
} else {
|
||||
cost = RemoveEngineReplacementForCompany(c, old_engine_type, id_g, flags);
|
||||
}
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
GroupStatistics::UpdateAutoreplace(_current_company);
|
||||
if (IsLocalCompany()) SetWindowDirty(WC_REPLACE_VEHICLE, Engine::Get(old_engine_type)->type);
|
||||
SetWindowClassesDirty(GetWindowClassForVehicleType(Engine::Get(old_engine_type)->type));
|
||||
}
|
||||
if ((flags & DC_EXEC) && IsLocalCompany()) InvalidateAutoreplaceWindow(old_engine_type, id_g);
|
||||
|
||||
|
@@ -16,8 +16,8 @@
|
||||
#include "company_base.h"
|
||||
|
||||
void RemoveAllEngineReplacement(EngineRenewList *erl);
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group, bool *replace_when_old = NULL);
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, bool replace_when_old, DoCommandFlag flags);
|
||||
EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group);
|
||||
CommandCost AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, DoCommandFlag flags);
|
||||
CommandCost RemoveEngineReplacement(EngineRenewList *erl, EngineID engine, GroupID group, DoCommandFlag flags);
|
||||
|
||||
/**
|
||||
@@ -34,13 +34,12 @@ static inline void RemoveAllEngineReplacementForCompany(Company *c)
|
||||
* @param c company.
|
||||
* @param engine Engine type.
|
||||
* @param group The group related to this replacement.
|
||||
* @param[out] replace_when_old Set to true if the replacement should be done when old.
|
||||
* @return The engine type to replace with, or INVALID_ENGINE if no
|
||||
* replacement is in the list.
|
||||
*/
|
||||
static inline EngineID EngineReplacementForCompany(const Company *c, EngineID engine, GroupID group, bool *replace_when_old = NULL)
|
||||
static inline EngineID EngineReplacementForCompany(const Company *c, EngineID engine, GroupID group)
|
||||
{
|
||||
return EngineReplacement(c->engine_renew_list, engine, group, replace_when_old);
|
||||
return EngineReplacement(c->engine_renew_list, engine, group);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -55,33 +54,18 @@ static inline bool EngineHasReplacementForCompany(const Company *c, EngineID eng
|
||||
return EngineReplacementForCompany(c, engine, group) != INVALID_ENGINE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a company has a replacement set up for the given engine when it gets old.
|
||||
* @param c Company.
|
||||
* @param engine Engine type to be replaced.
|
||||
* @param group The group related to this replacement.
|
||||
* @return True if a replacement when old was set up, false otherwise.
|
||||
*/
|
||||
static inline bool EngineHasReplacementWhenOldForCompany(const Company *c, EngineID engine, GroupID group)
|
||||
{
|
||||
bool replace_when_old;
|
||||
EngineReplacement(c->engine_renew_list, engine, group, &replace_when_old);
|
||||
return replace_when_old;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an engine replacement for the company.
|
||||
* @param c Company.
|
||||
* @param old_engine The original engine type.
|
||||
* @param new_engine The replacement engine type.
|
||||
* @param group The group related to this replacement.
|
||||
* @param replace_when_old Replace when old or always?
|
||||
* @param flags The calling command flags.
|
||||
* @return 0 on success, CMD_ERROR on failure.
|
||||
*/
|
||||
static inline CommandCost AddEngineReplacementForCompany(Company *c, EngineID old_engine, EngineID new_engine, GroupID group, bool replace_when_old, DoCommandFlag flags)
|
||||
static inline CommandCost AddEngineReplacementForCompany(Company *c, EngineID old_engine, EngineID new_engine, GroupID group, DoCommandFlag flags)
|
||||
{
|
||||
return AddEngineReplacement(&c->engine_renew_list, old_engine, new_engine, group, replace_when_old, flags);
|
||||
return AddEngineReplacement(&c->engine_renew_list, old_engine, new_engine, group, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -24,7 +24,6 @@
|
||||
#include "settings_func.h"
|
||||
#include "core/geometry_func.hpp"
|
||||
#include "rail_gui.h"
|
||||
#include "widgets/dropdown_func.h"
|
||||
|
||||
#include "widgets/autoreplace_widget.h"
|
||||
|
||||
@@ -45,7 +44,7 @@ static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
|
||||
* @param id_g The group the engine belongs to
|
||||
* Note: this function only works if it is called either
|
||||
* - when a new vehicle is build, but before it's counted in num_engines
|
||||
* - when a vehicle is deleted and after it's subtracted from num_engines
|
||||
* - when a vehicle is deleted and after it's substracted from num_engines
|
||||
* - when not changing the count (used when changing replace orders)
|
||||
*/
|
||||
void InvalidateAutoreplaceWindow(EngineID e, GroupID id_g)
|
||||
@@ -68,12 +67,6 @@ void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type)
|
||||
InvalidateWindowClassesData(WC_BUILD_VEHICLE); // The build windows needs updating as well
|
||||
}
|
||||
|
||||
static const StringID _start_replace_dropdown[] = {
|
||||
STR_REPLACE_VEHICLES_NOW,
|
||||
STR_REPLACE_VEHICLES_WHEN_OLD,
|
||||
INVALID_STRING_ID
|
||||
};
|
||||
|
||||
/**
|
||||
* Window for the autoreplacing of vehicles.
|
||||
*/
|
||||
@@ -177,17 +170,6 @@ class ReplaceVehicleWindow : public Window {
|
||||
this->reset_sel_engine = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle click on the start replace button.
|
||||
* @param replace_when_old Replace now or only when old?
|
||||
*/
|
||||
void ReplaceClick_StartReplace(bool replace_when_old)
|
||||
{
|
||||
EngineID veh_from = this->sel_engine[0];
|
||||
EngineID veh_to = this->sel_engine[1];
|
||||
DoCommandP(0, (replace_when_old ? 1 : 0) | (this->sel_group << 16), veh_from + (veh_to << 16), CMD_SET_AUTOREPLACE);
|
||||
}
|
||||
|
||||
public:
|
||||
ReplaceVehicleWindow(const WindowDesc *desc, VehicleType vehicletype, GroupID id_g) : Window()
|
||||
{
|
||||
@@ -288,17 +270,6 @@ public:
|
||||
*size = maxdim(*size, d);
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_START_REPLACE: {
|
||||
Dimension d = GetStringBoundingBox(STR_REPLACE_VEHICLES_START);
|
||||
for (int i = 0; _start_replace_dropdown[i] != INVALID_STRING_ID; i++) {
|
||||
d = maxdim(d, GetStringBoundingBox(_start_replace_dropdown[i]));
|
||||
}
|
||||
d.width += padding.width;
|
||||
d.height += padding.height;
|
||||
*size = maxdim(*size, d);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -307,20 +278,6 @@ public:
|
||||
switch (widget) {
|
||||
case WID_RV_CAPTION:
|
||||
SetDParam(0, STR_REPLACE_VEHICLE_TRAIN + this->window_number);
|
||||
switch (this->sel_group) {
|
||||
case ALL_GROUP:
|
||||
SetDParam(1, STR_GROUP_ALL_TRAINS + this->window_number);
|
||||
break;
|
||||
|
||||
case DEFAULT_GROUP:
|
||||
SetDParam(1, STR_GROUP_DEFAULT_TRAINS + this->window_number);
|
||||
break;
|
||||
|
||||
default:
|
||||
SetDParam(1, STR_GROUP_NAME);
|
||||
SetDParam(2, sel_group);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_RV_TRAIN_WAGONREMOVE_TOGGLE: {
|
||||
@@ -344,10 +301,8 @@ public:
|
||||
if (!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group)) {
|
||||
SetDParam(0, STR_REPLACE_NOT_REPLACING);
|
||||
} else {
|
||||
bool when_old = false;
|
||||
EngineID e = EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group, &when_old);
|
||||
SetDParam(0, when_old ? STR_REPLACE_REPLACING_WHEN_OLD : STR_ENGINE_NAME);
|
||||
SetDParam(1, e);
|
||||
SetDParam(0, STR_ENGINE_NAME);
|
||||
SetDParam(1, EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group));
|
||||
}
|
||||
} else {
|
||||
SetDParam(0, STR_REPLACE_NOT_REPLACING_VEHICLE_SELECTED);
|
||||
@@ -379,11 +334,13 @@ public:
|
||||
|
||||
/* Disable the "Start Replacing" button if:
|
||||
* Either engines list is empty
|
||||
* or The selected replacement engine has a replacement (to prevent loops). */
|
||||
* or The selected replacement engine has a replacement (to prevent loops)
|
||||
* or The right engines list (new replacement) has the existing replacement vehicle selected */
|
||||
this->SetWidgetDisabledState(WID_RV_START_REPLACE,
|
||||
this->sel_engine[0] == INVALID_ENGINE ||
|
||||
this->sel_engine[1] == INVALID_ENGINE ||
|
||||
EngineReplacementForCompany(c, this->sel_engine[1], this->sel_group) != INVALID_ENGINE);
|
||||
EngineReplacementForCompany(c, this->sel_engine[1], this->sel_group) != INVALID_ENGINE ||
|
||||
EngineReplacementForCompany(c, this->sel_engine[0], this->sel_group) == this->sel_engine[1]);
|
||||
|
||||
/* Disable the "Stop Replacing" button if:
|
||||
* The left engines list (existing vehicle) is empty
|
||||
@@ -392,6 +349,9 @@ public:
|
||||
this->sel_engine[0] == INVALID_ENGINE ||
|
||||
!EngineHasReplacementForCompany(c, this->sel_engine[0], this->sel_group));
|
||||
|
||||
/* now the actual drawing of the window itself takes place */
|
||||
SetDParam(0, STR_REPLACE_VEHICLE_TRAIN + this->window_number);
|
||||
|
||||
if (this->window_number == VEH_TRAIN) {
|
||||
/* sets the colour of that art thing */
|
||||
this->GetWidget<NWidgetCore>(WID_RV_TRAIN_FLUFF_LEFT)->colour = _company_colours[_local_company];
|
||||
@@ -441,19 +401,17 @@ public:
|
||||
break;
|
||||
|
||||
case WID_RV_START_REPLACE: { // Start replacing
|
||||
if (this->GetWidget<NWidgetLeaf>(widget)->ButtonHit(pt)) {
|
||||
this->HandleButtonClick(WID_RV_START_REPLACE);
|
||||
ReplaceClick_StartReplace(false);
|
||||
} else {
|
||||
bool replacment_when_old = EngineHasReplacementWhenOldForCompany(Company::Get(_local_company), this->sel_engine[0], this->sel_group);
|
||||
ShowDropDownMenu(this, _start_replace_dropdown, replacment_when_old ? 1 : 0, WID_RV_START_REPLACE, !this->replace_engines ? 1 << 1 : 0, 0);
|
||||
}
|
||||
EngineID veh_from = this->sel_engine[0];
|
||||
EngineID veh_to = this->sel_engine[1];
|
||||
DoCommandP(0, this->sel_group << 16, veh_from + (veh_to << 16), CMD_SET_AUTOREPLACE);
|
||||
this->SetDirty();
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_STOP_REPLACE: { // Stop replacing
|
||||
EngineID veh_from = this->sel_engine[0];
|
||||
DoCommandP(0, this->sel_group << 16, veh_from + (INVALID_ENGINE << 16), CMD_SET_AUTOREPLACE);
|
||||
this->SetDirty();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -483,26 +441,17 @@ public:
|
||||
|
||||
virtual void OnDropdownSelect(int widget, int index)
|
||||
{
|
||||
switch (widget) {
|
||||
case WID_RV_TRAIN_RAILTYPE_DROPDOWN: {
|
||||
RailType temp = (RailType)index;
|
||||
if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
|
||||
sel_railtype = temp;
|
||||
/* Reset scrollbar positions */
|
||||
this->vscroll[0]->SetPosition(0);
|
||||
this->vscroll[1]->SetPosition(0);
|
||||
/* Rebuild the lists */
|
||||
this->engines[0].ForceRebuild();
|
||||
this->engines[1].ForceRebuild();
|
||||
this->reset_sel_engine = true;
|
||||
this->SetDirty();
|
||||
break;
|
||||
}
|
||||
|
||||
case WID_RV_START_REPLACE:
|
||||
this->ReplaceClick_StartReplace(index != 0);
|
||||
break;
|
||||
}
|
||||
RailType temp = (RailType)index;
|
||||
if (temp == sel_railtype) return; // we didn't select a new one. No need to change anything
|
||||
sel_railtype = temp;
|
||||
/* Reset scrollbar positions */
|
||||
this->vscroll[0]->SetPosition(0);
|
||||
this->vscroll[1]->SetPosition(0);
|
||||
/* Rebuild the lists */
|
||||
this->engines[0].ForceRebuild();
|
||||
this->engines[1].ForceRebuild();
|
||||
this->reset_sel_engine = true;
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnResize()
|
||||
@@ -548,7 +497,7 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB), SetResize(1, 0),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(150, 12), SetDataTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON),
|
||||
@@ -566,7 +515,7 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
|
||||
static const WindowDesc _replace_rail_vehicle_desc(
|
||||
WDP_AUTO, 500, 140,
|
||||
WC_REPLACE_VEHICLE, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
_nested_replace_rail_vehicle_widgets, lengthof(_nested_replace_rail_vehicle_widgets)
|
||||
);
|
||||
|
||||
@@ -588,7 +537,7 @@ static const NWidgetPart _nested_replace_vehicle_widgets[] = {
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(228, 92), SetResize(1, 0), EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(NWID_PUSHBUTTON_DROPDOWN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_START_REPLACE), SetMinimalSize(139, 12), SetDataTip(STR_REPLACE_VEHICLES_START, STR_REPLACE_HELP_START_BUTTON),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_INFO_TAB), SetMinimalSize(167, 12), SetDataTip(0x0, STR_REPLACE_HELP_REPLACE_INFO_TAB), SetResize(1, 0), EndContainer(),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_RV_STOP_REPLACE), SetMinimalSize(138, 12), SetDataTip(STR_REPLACE_VEHICLES_STOP, STR_REPLACE_HELP_STOP_BUTTON),
|
||||
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
|
||||
@@ -598,7 +547,7 @@ static const NWidgetPart _nested_replace_vehicle_widgets[] = {
|
||||
static const WindowDesc _replace_vehicle_desc(
|
||||
WDP_AUTO, 456, 118,
|
||||
WC_REPLACE_VEHICLE, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
_nested_replace_vehicle_widgets, lengthof(_nested_replace_vehicle_widgets)
|
||||
);
|
||||
|
||||
|
@@ -1,44 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file base_consist.cpp Properties for front vehicles/consists. */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "base_consist.h"
|
||||
#include "vehicle_base.h"
|
||||
|
||||
BaseConsist::~BaseConsist()
|
||||
{
|
||||
free(this->name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy properties of other BaseConsist.
|
||||
* @param src Source for copying
|
||||
*/
|
||||
void BaseConsist::CopyConsistPropertiesFrom(const BaseConsist *src)
|
||||
{
|
||||
if (this == src) return;
|
||||
|
||||
free(this->name);
|
||||
this->name = src->name != NULL ? strdup(src->name) : NULL;
|
||||
|
||||
this->current_order_time = src->current_order_time;
|
||||
this->lateness_counter = src->lateness_counter;
|
||||
this->timetable_start = src->timetable_start;
|
||||
|
||||
this->service_interval = src->service_interval;
|
||||
|
||||
this->cur_real_order_index = src->cur_real_order_index;
|
||||
this->cur_implicit_order_index = src->cur_implicit_order_index;
|
||||
|
||||
if (HasBit(src->vehicle_flags, VF_TIMETABLE_STARTED)) SetBit(this->vehicle_flags, VF_TIMETABLE_STARTED);
|
||||
if (HasBit(src->vehicle_flags, VF_AUTOFILL_TIMETABLE)) SetBit(this->vehicle_flags, VF_AUTOFILL_TIMETABLE);
|
||||
if (HasBit(src->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME)) SetBit(this->vehicle_flags, VF_AUTOFILL_PRES_WAIT_TIME);
|
||||
}
|
@@ -1,40 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file base_consist.h Properties for front vehicles/consists. */
|
||||
|
||||
#ifndef BASE_CONSIST_H
|
||||
#define BASE_CONSIST_H
|
||||
|
||||
#include "order_type.h"
|
||||
#include "date_type.h"
|
||||
|
||||
/** Various front vehicle properties that are preserved when autoreplacing, using order-backup or switching front engines within a consist. */
|
||||
struct BaseConsist {
|
||||
char *name; ///< Name of vehicle
|
||||
|
||||
/* Used for timetabling. */
|
||||
uint32 current_order_time; ///< How many ticks have passed since this order started.
|
||||
int32 lateness_counter; ///< How many ticks late (or early if negative) this vehicle is.
|
||||
Date timetable_start; ///< When the vehicle is supposed to start the timetable.
|
||||
|
||||
uint16 service_interval; ///< The interval for (automatic) servicing; either in days or %.
|
||||
|
||||
VehicleOrderID cur_real_order_index;///< The index to the current real (non-implicit) order
|
||||
VehicleOrderID cur_implicit_order_index;///< The index to the current implicit order
|
||||
|
||||
uint16 vehicle_flags; ///< Used for gradual loading and other miscellaneous things (@see VehicleFlags enum)
|
||||
|
||||
BaseConsist() : name(NULL) {}
|
||||
virtual ~BaseConsist();
|
||||
|
||||
void CopyConsistPropertiesFrom(const BaseConsist *src);
|
||||
};
|
||||
|
||||
#endif /* BASE_CONSIST_H */
|
@@ -201,8 +201,6 @@ public:
|
||||
return num + fs.Scan(GetExtension(), BASESET_DIR, Tbase_set::SEARCH_IN_TARS);
|
||||
}
|
||||
|
||||
static Tbase_set *GetAvailableSets();
|
||||
|
||||
static bool SetSet(const char *name);
|
||||
static char *GetSetsList(char *p, const char *last);
|
||||
static int GetNumSets();
|
||||
@@ -219,15 +217,6 @@ public:
|
||||
static bool HasSet(const ContentInfo *ci, bool md5sum);
|
||||
};
|
||||
|
||||
/**
|
||||
* Check whether there's a base set matching some information.
|
||||
* @param ci The content info to compare it to.
|
||||
* @param md5sum Should the MD5 checksum be tested as well?
|
||||
* @param s The list with sets.
|
||||
* @return The filename of the first file of the base set, or \c NULL if there is no match.
|
||||
*/
|
||||
template <class Tbase_set>
|
||||
const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s);
|
||||
|
||||
/** Types of graphics in the base graphics set */
|
||||
enum GraphicsFileType {
|
||||
|
@@ -7,10 +7,7 @@
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file base_media_func.h Generic function implementations for base data (graphics, sounds).
|
||||
* @note You should _never_ include this file due to the SET_TYPE define.
|
||||
*/
|
||||
/** @file base_media_func.h Generic function implementations for base data (graphics, sounds). */
|
||||
|
||||
#include "base_media_base.h"
|
||||
#include "debug.h"
|
||||
@@ -137,16 +134,12 @@ bool BaseSet<T, Tnum_files, Tsearch_in_tars>::FillSetDetails(IniFile *ini, const
|
||||
switch (T::CheckMD5(file, BASESET_DIR)) {
|
||||
case MD5File::CR_MATCH:
|
||||
this->valid_files++;
|
||||
this->found_files++;
|
||||
break;
|
||||
|
||||
/* FALL THROUGH */
|
||||
case MD5File::CR_MISMATCH:
|
||||
DEBUG(grf, 1, "MD5 checksum mismatch for: %s (in %s)", filename, full_filename);
|
||||
this->found_files++;
|
||||
break;
|
||||
|
||||
case MD5File::CR_NO_FILE:
|
||||
DEBUG(grf, 1, "The file %s specified in %s is missing", filename, full_filename);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -184,8 +177,7 @@ bool BaseMedia<Tbase_set>::AddFile(const char *filename, size_t basepath_length,
|
||||
/* The more complete set takes precedence over the version number. */
|
||||
if ((duplicate->valid_files == set->valid_files && duplicate->version >= set->version) ||
|
||||
duplicate->valid_files > set->valid_files) {
|
||||
DEBUG(grf, 1, "Not adding %s (%i) as base " SET_TYPE " set (duplicate, %s)", set->name, set->version,
|
||||
duplicate->valid_files > set->valid_files ? "less valid files" : "lower version");
|
||||
DEBUG(grf, 1, "Not adding %s (%i) as base " SET_TYPE " set (duplicate)", set->name, set->version);
|
||||
set->next = BaseMedia<Tbase_set>::duplicate_sets;
|
||||
BaseMedia<Tbase_set>::duplicate_sets = set;
|
||||
} else {
|
||||
@@ -200,8 +192,7 @@ bool BaseMedia<Tbase_set>::AddFile(const char *filename, size_t basepath_length,
|
||||
* version number until a new game is started which isn't a big problem */
|
||||
if (BaseMedia<Tbase_set>::used_set == duplicate) BaseMedia<Tbase_set>::used_set = set;
|
||||
|
||||
DEBUG(grf, 1, "Removing %s (%i) as base " SET_TYPE " set (duplicate, %s)", duplicate->name, duplicate->version,
|
||||
duplicate->valid_files < set->valid_files ? "less valid files" : "lower version");
|
||||
DEBUG(grf, 1, "Removing %s (%i) as base " SET_TYPE " set (duplicate)", duplicate->name, duplicate->version);
|
||||
duplicate->next = BaseMedia<Tbase_set>::duplicate_sets;
|
||||
BaseMedia<Tbase_set>::duplicate_sets = duplicate;
|
||||
ret = true;
|
||||
@@ -269,7 +260,7 @@ template <class Tbase_set>
|
||||
if (missing == 0) {
|
||||
p += seprintf(p, last, " (%i corrupt file%s)\n", invalid, invalid == 1 ? "" : "s");
|
||||
} else {
|
||||
p += seprintf(p, last, " (unusable: %i missing file%s)\n", missing, missing == 1 ? "" : "s");
|
||||
p += seprintf(p, last, " (unuseable: %i missing file%s)\n", missing, missing == 1 ? "" : "s");
|
||||
}
|
||||
} else {
|
||||
p += seprintf(p, last, "\n");
|
||||
@@ -283,13 +274,19 @@ template <class Tbase_set>
|
||||
#if defined(ENABLE_NETWORK)
|
||||
#include "network/network_content.h"
|
||||
|
||||
template <class Tbase_set> const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||
/**
|
||||
* Check whether there's a base set matching some information.
|
||||
* @param ci The content info to compare it to.
|
||||
* @param md5sum Should the MD5 checksum be tested as well?
|
||||
* @param s The list with sets.
|
||||
*/
|
||||
template <class Tbase_set> bool HasBaseSet(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||
{
|
||||
for (; s != NULL; s = s->next) {
|
||||
if (s->GetNumMissing() != 0) continue;
|
||||
|
||||
if (s->shortname != ci->unique_id) continue;
|
||||
if (!md5sum) return s->files[0].filename;
|
||||
if (!md5sum) return true;
|
||||
|
||||
byte md5[16];
|
||||
memset(md5, 0, sizeof(md5));
|
||||
@@ -298,26 +295,21 @@ template <class Tbase_set> const char *TryGetBaseSetFile(const ContentInfo *ci,
|
||||
md5[j] ^= s->files[i].hash[j];
|
||||
}
|
||||
}
|
||||
if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return s->files[0].filename;
|
||||
if (memcmp(md5, ci->md5sum, sizeof(md5)) == 0) return true;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
template <class Tbase_set>
|
||||
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
||||
{
|
||||
return (TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::available_sets) != NULL) ||
|
||||
(TryGetBaseSetFile(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets) != NULL);
|
||||
return HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::available_sets) ||
|
||||
HasBaseSet(ci, md5sum, BaseMedia<Tbase_set>::duplicate_sets);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
template <class Tbase_set>
|
||||
const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const Tbase_set *s)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
template <class Tbase_set>
|
||||
/* static */ bool BaseMedia<Tbase_set>::HasSet(const ContentInfo *ci, bool md5sum)
|
||||
{
|
||||
@@ -382,16 +374,6 @@ template <class Tbase_set>
|
||||
return BaseMedia<Tbase_set>::used_set;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the available sets.
|
||||
* @return The available sets.
|
||||
*/
|
||||
template <class Tbase_set>
|
||||
/* static */ Tbase_set *BaseMedia<Tbase_set>::GetAvailableSets()
|
||||
{
|
||||
return BaseMedia<Tbase_set>::available_sets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Force instantiation of methods so we don't get linker errors.
|
||||
* @param repl_type the type of the BaseMedia to instantiate
|
||||
@@ -408,7 +390,5 @@ template <class Tbase_set>
|
||||
template int repl_type::GetIndexOfUsedSet(); \
|
||||
template const set_type *repl_type::GetSet(int index); \
|
||||
template const set_type *repl_type::GetUsedSet(); \
|
||||
template bool repl_type::DetermineBestSet(); \
|
||||
template set_type *repl_type::GetAvailableSets(); \
|
||||
template const char *TryGetBaseSetFile(const ContentInfo *ci, bool md5sum, const set_type *s);
|
||||
template bool repl_type::DetermineBestSet();
|
||||
|
||||
|
@@ -71,7 +71,6 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
|
||||
uint16 random_bits; ///< Random bits assigned to this station
|
||||
byte waiting_triggers; ///< Waiting triggers (NewGRF) for this station
|
||||
uint8 cached_anim_triggers; ///< NOSAVE: Combined animation trigger bitmask, used to determine if trigger processing should happen.
|
||||
uint32 cached_cargo_triggers; ///< NOSAVE: Combined cargo trigger bitmask
|
||||
|
||||
TileArea train_station; ///< Tile area the train 'station' part covers
|
||||
StationRect rect; ///< NOSAVE: Station spread out rectangle maintained by StationRect::xxx() functions
|
||||
|
@@ -31,13 +31,13 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||
src_n = (const uint16 *)((const byte *)src_n + *(const uint32 *)src_n);
|
||||
}
|
||||
|
||||
Colour *dst = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
uint32 *dst = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
uint16 *anim = this->anim_buf + ((uint32 *)bp->dst - (uint32 *)_screen.dst_ptr) + bp->top * this->anim_buf_width + bp->left;
|
||||
|
||||
const byte *remap = bp->remap; // store so we don't have to access it via bp everytime
|
||||
|
||||
for (int y = 0; y < bp->height; y++) {
|
||||
Colour *dst_ln = dst + bp->pitch;
|
||||
uint32 *dst_ln = dst + bp->pitch;
|
||||
uint16 *anim_ln = anim + this->anim_buf_width;
|
||||
|
||||
const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
|
||||
@@ -46,7 +46,7 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel
|
||||
const uint16 *src_n_ln = (const uint16 *)((const byte *)src_n + *(const uint32 *)src_n);
|
||||
src_n += 2;
|
||||
|
||||
Colour *dst_end = dst + bp->skip_left;
|
||||
uint32 *dst_end = dst + bp->skip_left;
|
||||
|
||||
uint n;
|
||||
|
||||
@@ -219,7 +219,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height,
|
||||
return;
|
||||
}
|
||||
|
||||
Colour *udst = (Colour *)dst;
|
||||
uint32 *udst = (uint32 *)dst;
|
||||
uint16 *anim;
|
||||
|
||||
anim = this->anim_buf + ((uint32 *)dst - (uint32 *)_screen.dst_ptr);
|
||||
@@ -256,7 +256,7 @@ void Blitter_32bppAnim::DrawColourMappingRect(void *dst, int width, int height,
|
||||
|
||||
void Blitter_32bppAnim::SetPixel(void *video, int x, int y, uint8 colour)
|
||||
{
|
||||
*((Colour *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
*((uint32 *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
|
||||
/* Set the colour in the anim-buffer too, if we are rendering to the screen */
|
||||
if (_screen_disable_anim) return;
|
||||
@@ -271,13 +271,13 @@ void Blitter_32bppAnim::DrawRect(void *video, int width, int height, uint8 colou
|
||||
return;
|
||||
}
|
||||
|
||||
Colour colour32 = LookupColourInPalette(colour);
|
||||
uint32 colour32 = LookupColourInPalette(colour);
|
||||
uint16 *anim_line;
|
||||
|
||||
anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
|
||||
|
||||
do {
|
||||
Colour *dst = (Colour *)video;
|
||||
uint32 *dst = (uint32 *)video;
|
||||
uint16 *anim = anim_line;
|
||||
|
||||
for (int i = width; i > 0; i--) {
|
||||
@@ -296,13 +296,13 @@ void Blitter_32bppAnim::CopyFromBuffer(void *video, const void *src, int width,
|
||||
{
|
||||
assert(!_screen_disable_anim);
|
||||
assert(video >= _screen.dst_ptr && video <= (uint32 *)_screen.dst_ptr + _screen.width + _screen.height * _screen.pitch);
|
||||
Colour *dst = (Colour *)video;
|
||||
uint32 *dst = (uint32 *)video;
|
||||
const uint32 *usrc = (const uint32 *)src;
|
||||
uint16 *anim_line = ((uint32 *)video - (uint32 *)_screen.dst_ptr) + this->anim_buf;
|
||||
|
||||
for (; height > 0; height--) {
|
||||
/* We need to keep those for palette animation. */
|
||||
Colour *dst_pal = dst;
|
||||
uint32 *dst_pal = dst;
|
||||
uint16 *anim_pal = anim_line;
|
||||
|
||||
memcpy(dst, usrc, width * sizeof(uint32));
|
||||
@@ -422,7 +422,7 @@ void Blitter_32bppAnim::PaletteAnimate(const Palette &palette)
|
||||
assert(this->palette.first_dirty == PALETTE_ANIM_START || this->palette.first_dirty == 0);
|
||||
|
||||
const uint16 *anim = this->anim_buf;
|
||||
Colour *dst = (Colour *)_screen.dst_ptr;
|
||||
uint32 *dst = (uint32 *)_screen.dst_ptr;
|
||||
|
||||
/* Let's walk the anim buffer and try to find the pixels */
|
||||
for (int y = this->anim_buf_height; y != 0 ; y--) {
|
||||
|
@@ -47,9 +47,9 @@ public:
|
||||
/**
|
||||
* Look up the colour in the current palette.
|
||||
*/
|
||||
inline Colour LookupColourInPalette(uint index)
|
||||
inline uint32 LookupColourInPalette(uint index)
|
||||
{
|
||||
return this->palette.palette[index];
|
||||
return this->palette.palette[index].data;
|
||||
}
|
||||
|
||||
template <BlitterMode mode> void Draw(const Blitter::BlitterParams *bp, ZoomLevel zoom);
|
||||
|
@@ -19,15 +19,15 @@ void *Blitter_32bppBase::MoveTo(void *video, int x, int y)
|
||||
|
||||
void Blitter_32bppBase::SetPixel(void *video, int x, int y, uint8 colour)
|
||||
{
|
||||
*((Colour *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
*((uint32 *)video + x + y * _screen.pitch) = LookupColourInPalette(colour);
|
||||
}
|
||||
|
||||
void Blitter_32bppBase::DrawRect(void *video, int width, int height, uint8 colour)
|
||||
{
|
||||
Colour colour32 = LookupColourInPalette(colour);
|
||||
uint32 colour32 = LookupColourInPalette(colour);
|
||||
|
||||
do {
|
||||
Colour *dst = (Colour *)video;
|
||||
uint32 *dst = (uint32 *)video;
|
||||
for (int i = width; i > 0; i--) {
|
||||
*dst = colour32;
|
||||
dst++;
|
||||
@@ -107,7 +107,7 @@ void Blitter_32bppBase::ScrollBuffer(void *video, int &left, int &top, int &widt
|
||||
dst = (uint32 *)video + left + top * _screen.pitch;
|
||||
src = dst - scroll_y * _screen.pitch;
|
||||
|
||||
/* Decrease height. (scroll_y is <=0). */
|
||||
/* Decrese height. (scroll_y is <=0). */
|
||||
height += scroll_y;
|
||||
assert(height > 0);
|
||||
|
||||
|
@@ -33,25 +33,33 @@ public:
|
||||
/* virtual */ Blitter::PaletteAnimation UsePaletteAnimation();
|
||||
/* virtual */ int GetBytesPerPixel() { return 4; }
|
||||
|
||||
/**
|
||||
* Compose a colour based on RGB values.
|
||||
*/
|
||||
static inline uint32 ComposeColour(uint a, uint r, uint g, uint b)
|
||||
{
|
||||
return (((a) << 24) & 0xFF000000) | (((r) << 16) & 0x00FF0000) | (((g) << 8) & 0x0000FF00) | ((b) & 0x000000FF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Look up the colour in the current palette.
|
||||
*/
|
||||
static inline Colour LookupColourInPalette(uint index)
|
||||
static inline uint32 LookupColourInPalette(uint index)
|
||||
{
|
||||
return _cur_palette.palette[index];
|
||||
return _cur_palette.palette[index].data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compose a colour based on RGBA values and the current pixel value.
|
||||
*/
|
||||
static inline Colour ComposeColourRGBANoCheck(uint r, uint g, uint b, uint a, Colour current)
|
||||
static inline uint32 ComposeColourRGBANoCheck(uint r, uint g, uint b, uint a, uint32 current)
|
||||
{
|
||||
uint cr = current.r;
|
||||
uint cg = current.g;
|
||||
uint cb = current.b;
|
||||
uint cr = GB(current, 16, 8);
|
||||
uint cg = GB(current, 8, 8);
|
||||
uint cb = GB(current, 0, 8);
|
||||
|
||||
/* The 256 is wrong, it should be 255, but 256 is much faster... */
|
||||
return Colour(
|
||||
return ComposeColour(0xFF,
|
||||
((int)(r - cr) * a) / 256 + cr,
|
||||
((int)(g - cg) * a) / 256 + cg,
|
||||
((int)(b - cb) * a) / 256 + cb);
|
||||
@@ -61,10 +69,10 @@ public:
|
||||
* Compose a colour based on RGBA values and the current pixel value.
|
||||
* Handles fully transparent and solid pixels in a special (faster) way.
|
||||
*/
|
||||
static inline Colour ComposeColourRGBA(uint r, uint g, uint b, uint a, Colour current)
|
||||
static inline uint32 ComposeColourRGBA(uint r, uint g, uint b, uint a, uint32 current)
|
||||
{
|
||||
if (a == 0) return current;
|
||||
if (a >= 255) return Colour(r, g, b);
|
||||
if (a >= 255) return ComposeColour(0xFF, r, g, b);
|
||||
|
||||
return ComposeColourRGBANoCheck(r, g, b, a, current);
|
||||
}
|
||||
@@ -72,11 +80,11 @@ public:
|
||||
/**
|
||||
* Compose a colour based on Pixel value, alpha value, and the current pixel value.
|
||||
*/
|
||||
static inline Colour ComposeColourPANoCheck(Colour colour, uint a, Colour current)
|
||||
static inline uint32 ComposeColourPANoCheck(uint32 colour, uint a, uint32 current)
|
||||
{
|
||||
uint r = colour.r;
|
||||
uint g = colour.g;
|
||||
uint b = colour.b;
|
||||
uint r = GB(colour, 16, 8);
|
||||
uint g = GB(colour, 8, 8);
|
||||
uint b = GB(colour, 0, 8);
|
||||
|
||||
return ComposeColourRGBANoCheck(r, g, b, a, current);
|
||||
}
|
||||
@@ -85,13 +93,10 @@ public:
|
||||
* Compose a colour based on Pixel value, alpha value, and the current pixel value.
|
||||
* Handles fully transparent and solid pixels in a special (faster) way.
|
||||
*/
|
||||
static inline Colour ComposeColourPA(Colour colour, uint a, Colour current)
|
||||
static inline uint32 ComposeColourPA(uint32 colour, uint a, uint32 current)
|
||||
{
|
||||
if (a == 0) return current;
|
||||
if (a >= 255) {
|
||||
colour.a = 255;
|
||||
return colour;
|
||||
}
|
||||
if (a >= 255) return (colour | 0xFF000000);
|
||||
|
||||
return ComposeColourPANoCheck(colour, a, current);
|
||||
}
|
||||
@@ -103,13 +108,13 @@ public:
|
||||
* @param denom denominator, makes colour darker.
|
||||
* @return the new colour for the screen.
|
||||
*/
|
||||
static inline Colour MakeTransparent(Colour colour, uint nom, uint denom = 256)
|
||||
static inline uint32 MakeTransparent(uint32 colour, uint nom, uint denom = 256)
|
||||
{
|
||||
uint r = colour.r;
|
||||
uint g = colour.g;
|
||||
uint b = colour.b;
|
||||
uint r = GB(colour, 16, 8);
|
||||
uint g = GB(colour, 8, 8);
|
||||
uint b = GB(colour, 0, 8);
|
||||
|
||||
return Colour(r * nom / denom, g * nom / denom, b * nom / denom);
|
||||
return ComposeColour(0xFF, r * nom / denom, g * nom / denom, b * nom / denom);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -117,46 +122,45 @@ public:
|
||||
* @param colour the colour to make grey.
|
||||
* @return the new colour, now grey.
|
||||
*/
|
||||
static inline Colour MakeGrey(Colour colour)
|
||||
static inline uint32 MakeGrey(uint32 colour)
|
||||
{
|
||||
uint r = colour.r;
|
||||
uint g = colour.g;
|
||||
uint b = colour.b;
|
||||
uint r = GB(colour, 16, 8);
|
||||
uint g = GB(colour, 8, 8);
|
||||
uint b = GB(colour, 0, 8);
|
||||
|
||||
/* To avoid doubles and stuff, multiple it with a total of 65536 (16bits), then
|
||||
* divide by it to normalize the value to a byte again. See heightmap.cpp for
|
||||
* information about the formula. */
|
||||
uint grey = ((r * 19595) + (g * 38470) + (b * 7471)) / 65536;
|
||||
colour = ((r * 19595) + (g * 38470) + (b * 7471)) / 65536;
|
||||
|
||||
return Colour(grey, grey, grey);
|
||||
return ComposeColour(0xFF, colour, colour, colour);
|
||||
}
|
||||
|
||||
static const int DEFAULT_BRIGHTNESS = 128;
|
||||
static const int DEFAULT_BRIGHTNESS = 64;
|
||||
|
||||
static inline Colour AdjustBrightness(Colour colour, uint8 brightness)
|
||||
static inline uint32 AdjustBrightness(uint32 colour, uint8 brightness)
|
||||
{
|
||||
/* Shortcut for normal brightness */
|
||||
if (brightness == DEFAULT_BRIGHTNESS) return colour;
|
||||
|
||||
uint16 ob = 0;
|
||||
uint16 r = colour.r * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 g = colour.g * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 b = colour.b * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 r = GB(colour, 16, 8) * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 g = GB(colour, 8, 8) * brightness / DEFAULT_BRIGHTNESS;
|
||||
uint16 b = GB(colour, 0, 8) * brightness / DEFAULT_BRIGHTNESS;
|
||||
|
||||
/* Sum overbright */
|
||||
if (r > 255) ob += r - 255;
|
||||
if (g > 255) ob += g - 255;
|
||||
if (b > 255) ob += b - 255;
|
||||
|
||||
if (ob == 0) return Colour(r, g, b, colour.a);
|
||||
if (ob == 0) return ComposeColour(GB(colour, 24, 8), r, g, b);
|
||||
|
||||
/* Reduce overbright strength */
|
||||
ob /= 2;
|
||||
return Colour(
|
||||
return ComposeColour(GB(colour, 24, 8),
|
||||
r >= 255 ? 255 : min(r + ob * (255 - r) / 256, 255),
|
||||
g >= 255 ? 255 : min(g + ob * (255 - g) / 256, 255),
|
||||
b >= 255 ? 255 : min(b + ob * (255 - b) / 256, 255),
|
||||
colour.a);
|
||||
b >= 255 ? 255 : min(b + ob * (255 - b) / 256, 255));
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -44,14 +44,14 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||
}
|
||||
|
||||
/* skip lines in dst */
|
||||
Colour *dst = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
uint32 *dst = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
|
||||
/* store so we don't have to access it via bp everytime (compiler assumes pointer aliasing) */
|
||||
const byte *remap = bp->remap;
|
||||
|
||||
for (int y = 0; y < bp->height; y++) {
|
||||
/* next dst line begins here */
|
||||
Colour *dst_ln = dst + bp->pitch;
|
||||
uint32 *dst_ln = dst + bp->pitch;
|
||||
|
||||
/* next src line begins here */
|
||||
const Colour *src_px_ln = (const Colour *)((const byte *)src_px + *(const uint32 *)src_px);
|
||||
@@ -62,7 +62,7 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL
|
||||
src_n += 2;
|
||||
|
||||
/* we will end this line when we reach this point */
|
||||
Colour *dst_end = dst + bp->skip_left;
|
||||
uint32 *dst_end = dst + bp->skip_left;
|
||||
|
||||
/* number of pixels with the same aplha channel class */
|
||||
uint n;
|
||||
@@ -215,7 +215,7 @@ Sprite *Blitter_32bppOptimized::Encode(SpriteLoader::Sprite *sprite, AllocatorPr
|
||||
Colour *dst_px_orig[ZOOM_LVL_COUNT];
|
||||
|
||||
/* interleaved stream of 'm' channel and 'n' channel
|
||||
* 'n' is number of following pixels with the same alpha channel class
|
||||
* 'n' is number if following pixels with the same alpha channel class
|
||||
* there are 3 classes: 0, 255, others
|
||||
*
|
||||
* it has to be stored in one stream so fewer registers are used -
|
||||
@@ -286,10 +286,10 @@ Sprite *Blitter_32bppOptimized::Encode(SpriteLoader::Sprite *sprite, AllocatorPr
|
||||
*dst_n |= rgb_max << 8;
|
||||
|
||||
/* Pre-convert the mapping channel to a RGB value */
|
||||
Colour colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), rgb_max);
|
||||
dst_px->r = colour.r;
|
||||
dst_px->g = colour.g;
|
||||
dst_px->b = colour.b;
|
||||
uint32 colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), rgb_max);
|
||||
dst_px->r = GB(colour, 16, 8);
|
||||
dst_px->g = GB(colour, 8, 8);
|
||||
dst_px->b = GB(colour, 0, 8);
|
||||
} else {
|
||||
dst_px->r = src->r;
|
||||
dst_px->g = src->g;
|
||||
|
@@ -21,11 +21,11 @@ static FBlitter_32bppSimple iFBlitter_32bppSimple;
|
||||
void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, ZoomLevel zoom)
|
||||
{
|
||||
const Blitter_32bppSimple::Pixel *src, *src_line;
|
||||
Colour *dst, *dst_line;
|
||||
uint32 *dst, *dst_line;
|
||||
|
||||
/* Find where to start reading in the source sprite */
|
||||
src_line = (const Blitter_32bppSimple::Pixel *)bp->sprite + (bp->skip_top * bp->sprite_width + bp->skip_left) * ScaleByZoom(1, zoom);
|
||||
dst_line = (Colour *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
dst_line = (uint32 *)bp->dst + bp->top * bp->pitch + bp->left;
|
||||
|
||||
for (int y = 0; y < bp->height; y++) {
|
||||
dst = dst_line;
|
||||
@@ -66,7 +66,7 @@ void Blitter_32bppSimple::Draw(Blitter::BlitterParams *bp, BlitterMode mode, Zoo
|
||||
|
||||
void Blitter_32bppSimple::DrawColourMappingRect(void *dst, int width, int height, PaletteID pal)
|
||||
{
|
||||
Colour *udst = (Colour *)dst;
|
||||
uint32 *udst = (uint32 *)dst;
|
||||
|
||||
if (pal == PALETTE_TO_TRANSPARENT) {
|
||||
do {
|
||||
@@ -122,10 +122,10 @@ Sprite *Blitter_32bppSimple::Encode(SpriteLoader::Sprite *sprite, AllocatorProc
|
||||
dst[i].v = rgb_max;
|
||||
|
||||
/* Pre-convert the mapping channel to a RGB value */
|
||||
Colour colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), dst[i].v);
|
||||
dst[i].r = colour.r;
|
||||
dst[i].g = colour.g;
|
||||
dst[i].b = colour.b;
|
||||
uint colour = this->AdjustBrightness(this->LookupColourInPalette(src->m), dst[i].v);
|
||||
dst[i].r = GB(colour, 16, 8);
|
||||
dst[i].g = GB(colour, 8, 8);
|
||||
dst[i].b = GB(colour, 0, 8);
|
||||
dst[i].a = src->a;
|
||||
dst[i].m = src->m;
|
||||
}
|
||||
|
@@ -112,7 +112,7 @@ void Blitter_8bppBase::ScrollBuffer(void *video, int &left, int &top, int &width
|
||||
dst = (uint8 *)video + left + top * _screen.pitch;
|
||||
src = dst - scroll_y * _screen.pitch;
|
||||
|
||||
/* Decrease height. (scroll_y is <=0). */
|
||||
/* Decrese height. (scroll_y is <=0). */
|
||||
height += scroll_y;
|
||||
assert(height > 0);
|
||||
|
||||
|
@@ -123,7 +123,7 @@ public:
|
||||
|
||||
/**
|
||||
* Copy from a buffer to the screen.
|
||||
* @param video The destination pointer (video-buffer).
|
||||
* @param video The destionation pointer (video-buffer).
|
||||
* @param src The buffer from which the data will be read.
|
||||
* @param width The width of the buffer.
|
||||
* @param height The height of the buffer.
|
||||
|
@@ -37,7 +37,7 @@ public:
|
||||
/* virtual */ int GetBytesPerPixel() { return 0; }
|
||||
};
|
||||
|
||||
/** Factory for the blitter that does nothing. */
|
||||
/** Factory for the blitter that doesn nothing. */
|
||||
class FBlitter_Null: public BlitterFactory<FBlitter_Null> {
|
||||
public:
|
||||
/* virtual */ const char *GetName() { return "null"; }
|
||||
|
@@ -118,7 +118,7 @@ static const NWidgetPart _bootstrap_query_widgets[] = {
|
||||
static const WindowDesc _bootstrap_query_desc(
|
||||
WDP_CENTER, 0, 0,
|
||||
WC_CONFIRM_POPUP_QUERY, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_bootstrap_query_widgets, lengthof(_bootstrap_query_widgets)
|
||||
);
|
||||
|
||||
@@ -205,7 +205,7 @@ public:
|
||||
#endif /* defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) */
|
||||
|
||||
/**
|
||||
* Handle all procedures for bootstrapping OpenTTD without a base graphics set.
|
||||
* Handle all procedures for bootstrapping OpenTTD without a base grapics set.
|
||||
* This requires all kinds of trickery that is needed to avoid the use of
|
||||
* sprites from the base graphics set which are pretty interwoven.
|
||||
* @return True if a base set exists, otherwise false.
|
||||
@@ -218,7 +218,7 @@ bool HandleBootstrap()
|
||||
if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 0) goto failure;
|
||||
|
||||
/* If there is no network or no freetype, then there is nothing we can do. Go straight to failure. */
|
||||
#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && !defined(__APPLE__) && (defined(WITH_FONTCONFIG) || defined(WIN32))
|
||||
#if defined(ENABLE_NETWORK) && defined(WITH_FREETYPE) && !defined(__APPLE__)
|
||||
if (!_network_available) goto failure;
|
||||
|
||||
/* First tell the game we're bootstrapping. */
|
||||
|
@@ -59,7 +59,7 @@ typedef GUIList<BuildBridgeData> GUIBridgeList; ///< List of bridges, used in #B
|
||||
void CcBuildBridge(const CommandCost &result, TileIndex end_tile, uint32 p1, uint32 p2)
|
||||
{
|
||||
if (result.Failed()) return;
|
||||
if (_settings_client.sound.confirm) SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, end_tile);
|
||||
SndPlayTileFx(SND_27_BLACKSMITH_ANVIL, end_tile);
|
||||
|
||||
TransportType transport_type = Extract<TransportType, 15, 2>(p2);
|
||||
|
||||
@@ -381,7 +381,7 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
|
||||
/* The bridge length without ramps. */
|
||||
const uint bridge_len = GetTunnelBridgeLength(start, end);
|
||||
|
||||
/* If Ctrl is being pressed, check whether the last bridge built is available
|
||||
/* If Ctrl is being pressed, check wether the last bridge built is available
|
||||
* If so, return this bridge type. Otherwise continue normally.
|
||||
* We store bridge types for each transport type, so we have to check for
|
||||
* the transport type beforehand.
|
||||
|
@@ -41,7 +41,7 @@ static inline bool IsBridgeTile(TileIndex t)
|
||||
* checks for the possibility that a bridge may be on this tile
|
||||
* These are in fact all the tile types on which a bridge can be found
|
||||
* @param t The tile to analyze
|
||||
* @return true if a bridge might be present
|
||||
* @return true if a bridge migh be present
|
||||
*/
|
||||
static inline bool MayHaveBridgeAbove(TileIndex t)
|
||||
{
|
||||
@@ -161,17 +161,15 @@ static inline void MakeBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, D
|
||||
* Make a bridge ramp for roads.
|
||||
* @param t the tile to make a bridge ramp
|
||||
* @param o the new owner of the bridge ramp
|
||||
* @param owner_road the new owner of the road on the bridge
|
||||
* @param owner_tram the new owner of the tram on the bridge
|
||||
* @param bridgetype the type of bridge this bridge ramp belongs to
|
||||
* @param d the direction this ramp must be facing
|
||||
* @param r the road type of the bridge
|
||||
*/
|
||||
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, Owner owner_road, Owner owner_tram, BridgeType bridgetype, DiagDirection d, RoadTypes r)
|
||||
static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, BridgeType bridgetype, DiagDirection d, RoadTypes r)
|
||||
{
|
||||
MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD, 0);
|
||||
SetRoadOwner(t, ROADTYPE_ROAD, owner_road);
|
||||
if (owner_tram != OWNER_TOWN) SetRoadOwner(t, ROADTYPE_TRAM, owner_tram);
|
||||
SetRoadOwner(t, ROADTYPE_ROAD, o);
|
||||
if (o != OWNER_TOWN) SetRoadOwner(t, ROADTYPE_TRAM, o);
|
||||
SetRoadTypes(t, r);
|
||||
}
|
||||
|
||||
|
@@ -30,7 +30,6 @@
|
||||
#include "engine_gui.h"
|
||||
#include "cargotype.h"
|
||||
#include "core/geometry_func.hpp"
|
||||
#include "autoreplace_func.h"
|
||||
|
||||
#include "widgets/build_vehicle_widget.h"
|
||||
|
||||
@@ -43,7 +42,7 @@
|
||||
*/
|
||||
uint GetEngineListHeight(VehicleType type)
|
||||
{
|
||||
return max<uint>(FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM, GetVehicleImageCellSize(type, EIT_PURCHASE).height);
|
||||
return max<uint>(FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM, GetVehicleHeight(type));
|
||||
}
|
||||
|
||||
static const NWidgetPart _nested_build_vehicle_widgets[] = {
|
||||
@@ -272,7 +271,7 @@ static int CDECL EnginePowerVsRunningCostSorter(const EngineID *a, const EngineI
|
||||
* we will actually calculate cunning cost/power (to make it more than 1).
|
||||
* Because of this, the return value have to be reversed as well and we return b - a instead of a - b.
|
||||
* Another thing is that both power and running costs should be doubled for multiheaded engines.
|
||||
* Since it would be multiplying with 2 in both numerator and denominator, it will even themselves out and we skip checking for multiheaded. */
|
||||
* Since it would be multipling with 2 in both numerator and denumerator, it will even themselves out and we skip checking for multiheaded. */
|
||||
Money va = (e_a->GetRunningCost()) / max(1U, (uint)e_a->GetPower());
|
||||
Money vb = (e_b->GetRunningCost()) / max(1U, (uint)e_b->GetPower());
|
||||
int r = ClampToI32(vb - va);
|
||||
@@ -516,7 +515,7 @@ static const StringID _sort_listing[][12] = {{
|
||||
static bool CDECL CargoFilter(const EngineID *eid, const CargoID cid)
|
||||
{
|
||||
if (cid == CF_ANY) return true;
|
||||
uint32 refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true) & _standard_cargo_mask;
|
||||
uint32 refit_mask = GetUnionOfArticulatedRefitMasks(*eid, true);
|
||||
return (cid == CF_NONE ? refit_mask == 0 : HasBit(refit_mask, cid));
|
||||
}
|
||||
|
||||
@@ -871,37 +870,34 @@ int DrawVehiclePurchaseInfo(int left, int right, int y, EngineID engine_number)
|
||||
*/
|
||||
void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList *eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group)
|
||||
{
|
||||
static const int sprite_widths[] = { 60, 60, 76, 67 };
|
||||
static const int sprite_y_offsets[] = { -1, -1, -2, -2 };
|
||||
|
||||
/* Obligatory sanity checks! */
|
||||
assert((uint)type < lengthof(sprite_widths));
|
||||
assert_compile(lengthof(sprite_y_offsets) == lengthof(sprite_widths));
|
||||
assert(max <= eng_list->Length());
|
||||
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
int step_size = GetEngineListHeight(type);
|
||||
int sprite_left = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_left;
|
||||
int sprite_right = GetVehicleImageCellSize(type, EIT_PURCHASE).extend_right;
|
||||
int sprite_width = sprite_left + sprite_right;
|
||||
int sprite_width = sprite_widths[type];
|
||||
|
||||
int sprite_x = rtl ? r - sprite_right - 1 : l + sprite_left + 1;
|
||||
int sprite_x = (rtl ? r - sprite_width / 2 : l + sprite_width / 2) - 1;
|
||||
int sprite_y_offset = sprite_y_offsets[type] + step_size / 2;
|
||||
|
||||
Dimension replace_icon = {0, 0};
|
||||
int count_width = 0;
|
||||
if (show_count) {
|
||||
replace_icon = GetSpriteSize(SPR_GROUP_REPLACE_ACTIVE);
|
||||
SetDParamMaxDigits(0, 3);
|
||||
SetDParam(0, 999);
|
||||
count_width = GetStringBoundingBox(STR_TINY_BLACK_COMA).width;
|
||||
}
|
||||
|
||||
int text_left = l + (rtl ? WD_FRAMERECT_LEFT + replace_icon.width + 8 + count_width : sprite_width + WD_FRAMETEXT_LEFT);
|
||||
int text_right = r - (rtl ? sprite_width + WD_FRAMETEXT_RIGHT : WD_FRAMERECT_RIGHT + replace_icon.width + 8 + count_width);
|
||||
int replace_icon_left = rtl ? l + WD_FRAMERECT_LEFT : r - WD_FRAMERECT_RIGHT - replace_icon.width;
|
||||
int text_left = l + (rtl ? WD_FRAMERECT_LEFT + count_width : sprite_width);
|
||||
int text_right = r - (rtl ? sprite_width : WD_FRAMERECT_RIGHT + count_width);
|
||||
int count_left = l;
|
||||
int count_right = rtl ? text_left : r - WD_FRAMERECT_RIGHT - replace_icon.width - 8;
|
||||
int count_right = rtl ? text_left : r - WD_FRAMERECT_RIGHT;
|
||||
|
||||
int normal_text_y_offset = (step_size - FONT_HEIGHT_NORMAL) / 2;
|
||||
int small_text_y_offset = step_size - FONT_HEIGHT_SMALL - WD_FRAMERECT_BOTTOM - 1;
|
||||
int replace_icon_y_offset = (step_size - replace_icon.height) / 2 - 1;
|
||||
|
||||
for (; min < max; min++, y += step_size) {
|
||||
const EngineID engine = (*eng_list)[min];
|
||||
@@ -909,12 +905,11 @@ void DrawEngineList(VehicleType type, int l, int r, int y, const GUIEngineList *
|
||||
const uint num_engines = GetGroupNumEngines(_local_company, selected_group, engine);
|
||||
|
||||
SetDParam(0, engine);
|
||||
DrawString(text_left, text_right, y + normal_text_y_offset, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK, SA_STRIP | (rtl ? SA_RIGHT : SA_LEFT));
|
||||
DrawString(text_left, text_right, y + normal_text_y_offset, STR_ENGINE_NAME, engine == selected_id ? TC_WHITE : TC_BLACK);
|
||||
DrawVehicleEngine(l, r, sprite_x, y + sprite_y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_company), EIT_PURCHASE);
|
||||
if (show_count) {
|
||||
SetDParam(0, num_engines);
|
||||
DrawString(count_left, count_right, y + small_text_y_offset, STR_TINY_BLACK_COMA, TC_FROMSTRING, SA_RIGHT | SA_FORCE);
|
||||
if (EngineHasReplacementForCompany(Company::Get(_local_company), engine, selected_group)) DrawSprite(SPR_GROUP_REPLACE_ACTIVE, num_engines == 0 ? PALETTE_CRASH : PAL_NONE, replace_icon_left, y + replace_icon_y_offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -967,7 +962,7 @@ struct BuildVehicleWindow : Window {
|
||||
this->vscroll = this->GetScrollbar(WID_BV_SCROLLBAR);
|
||||
|
||||
/* If we are just viewing the list of vehicles, we do not need the Build button.
|
||||
* So we just hide it, and enlarge the Rename button by the now vacant place. */
|
||||
* So we just hide it, and enlarge the Rename buton by the now vacant place. */
|
||||
if (this->listview_mode) this->GetWidget<NWidgetStacked>(WID_BV_BUILD_SEL)->SetDisplayedPlane(SZSP_NONE);
|
||||
|
||||
NWidgetCore *widget = this->GetWidget<NWidgetCore>(WID_BV_LIST);
|
||||
@@ -1407,7 +1402,7 @@ struct BuildVehicleWindow : Window {
|
||||
static const WindowDesc _build_vehicle_desc(
|
||||
WDP_AUTO, 240, 268,
|
||||
WC_BUILD_VEHICLE, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
_nested_build_vehicle_widgets, lengthof(_nested_build_vehicle_widgets)
|
||||
);
|
||||
|
||||
|
@@ -1,157 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file cargomonitor.cpp Implementation of the cargo transport monitoring. */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "cargomonitor.h"
|
||||
#include "station_base.h"
|
||||
|
||||
CargoMonitorMap _cargo_pickups; ///< Map of monitored pick-ups to the amount since last query/activation.
|
||||
CargoMonitorMap _cargo_deliveries; ///< Map of monitored deliveries to the amount since last query/activation.
|
||||
|
||||
/**
|
||||
* Helper method for ClearCargoPickupMonitoring and ClearCargoDeliveryMonitoring.
|
||||
* Clears all monitors that belong to the specified company or all if INVALID_OWNER
|
||||
* is specified as company.
|
||||
* @param cargo_monitor_map reference to the cargo monitor map to operate on.
|
||||
* @param company company to clear cargo monitors for or INVALID_OWNER if all cargo monitors should be cleared.
|
||||
*/
|
||||
static void ClearCargoMonitoring(CargoMonitorMap &cargo_monitor_map, CompanyID company = INVALID_OWNER)
|
||||
{
|
||||
if (company == INVALID_OWNER) {
|
||||
cargo_monitor_map.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
CargoMonitorMap::iterator next;
|
||||
for (CargoMonitorMap::iterator it = cargo_monitor_map.begin(); it != cargo_monitor_map.end(); it = next) {
|
||||
next = it;
|
||||
next++;
|
||||
if (DecodeMonitorCompany(it->first) == company) {
|
||||
cargo_monitor_map.erase(it);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all pick-up cargo monitors.
|
||||
* @param company clear all pick-up monitors for this company or if INVALID_OWNER
|
||||
* is passed, all pick-up monitors are cleared regardless of company.
|
||||
*/
|
||||
void ClearCargoPickupMonitoring(CompanyID company)
|
||||
{
|
||||
ClearCargoMonitoring(_cargo_pickups, company);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear all delivery cargo monitors.
|
||||
* @param company clear all delivery monitors for this company or if INVALID_OWNER
|
||||
* is passed, all delivery monitors are cleared regardless of company.
|
||||
*/
|
||||
void ClearCargoDeliveryMonitoring(CompanyID company)
|
||||
{
|
||||
ClearCargoMonitoring(_cargo_deliveries, company);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get and reset the amount associated with a cargo monitor.
|
||||
* @param[in,out] monitor_map Monitoring map to search (and reset for the queried entry).
|
||||
* @param monitor Cargo monitor to query/reset.
|
||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||
* @return Amount collected since last query/activation for the monitored combination.
|
||||
*/
|
||||
static uint32 GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
|
||||
{
|
||||
CargoMonitorMap::iterator iter = monitor_map.find(monitor);
|
||||
if (iter == monitor_map.end()) {
|
||||
if (keep_monitoring) {
|
||||
std::pair<CargoMonitorID, uint32> p(monitor, 0);
|
||||
monitor_map.insert(p);
|
||||
}
|
||||
return 0;
|
||||
} else {
|
||||
uint32 result = iter->second;
|
||||
iter->second = 0;
|
||||
if (!keep_monitoring) monitor_map.erase(iter);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of cargo delivered for the given cargo monitor since activation or last query.
|
||||
* @param monitor Cargo monitor to query.
|
||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||
* @return Amount of delivered cargo for the monitored combination.
|
||||
*/
|
||||
uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
|
||||
{
|
||||
return GetAmount(_cargo_deliveries, monitor, keep_monitoring);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of cargo picked up for the given cargo monitor since activation or last query.
|
||||
* @param monitor Monitoring number to query.
|
||||
* @param keep_monitoring After returning from this call, continue monitoring.
|
||||
* @return Amount of picked up cargo for the monitored combination.
|
||||
* @note Cargo pick up is counted on final delivery, to prevent users getting credit for picking up cargo without delivering it.
|
||||
*/
|
||||
uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
|
||||
{
|
||||
return GetAmount(_cargo_pickups, monitor, keep_monitoring);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cargo was delivered to its final destination, update the pickup and delivery maps.
|
||||
* @param cargo_type type of cargo.
|
||||
* @param company company delivering the cargo.
|
||||
* @param amount Amount of cargo delivered.
|
||||
* @param src_type type of \a src.
|
||||
* @param src index of source.
|
||||
* @param st station where the cargo is delivered to.
|
||||
*/
|
||||
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st)
|
||||
{
|
||||
if (amount == 0) return;
|
||||
|
||||
if (src != INVALID_SOURCE) {
|
||||
/* Handle pickup update. */
|
||||
switch (src_type) {
|
||||
case ST_INDUSTRY: {
|
||||
CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, src);
|
||||
CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
|
||||
if (iter != _cargo_pickups.end()) iter->second += amount;
|
||||
break;
|
||||
}
|
||||
case ST_TOWN: {
|
||||
CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, src);
|
||||
CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
|
||||
if (iter != _cargo_pickups.end()) iter->second += amount;
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle delivery.
|
||||
* Note that delivery in the right area is sufficient to prevent trouble with neighbouring industries or houses. */
|
||||
|
||||
/* Town delivery. */
|
||||
CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, st->town->index);
|
||||
CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
|
||||
if (iter != _cargo_deliveries.end()) iter->second += amount;
|
||||
|
||||
/* Industry delivery. */
|
||||
for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) {
|
||||
CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index);
|
||||
CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
|
||||
if (iter != _cargo_deliveries.end()) iter->second += amount;
|
||||
}
|
||||
}
|
||||
|
@@ -1,148 +0,0 @@
|
||||
/* $Id$ */
|
||||
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file cargomonitor.h Cargo transport monitoring declarations. */
|
||||
|
||||
#ifndef CARGOMONITOR_H
|
||||
#define CARGOMONITOR_H
|
||||
|
||||
#include "cargo_type.h"
|
||||
#include "company_func.h"
|
||||
#include "industry.h"
|
||||
#include "town.h"
|
||||
#include <map>
|
||||
|
||||
struct Station;
|
||||
|
||||
/**
|
||||
* Unique number for a company / cargo type / (town or industry).
|
||||
* Encoding is as follows:
|
||||
* - bits 0-15 town or industry number
|
||||
* - bit 16 is set if it is an industry number (else it is a town number).
|
||||
* - bits 19-23 Cargo type.
|
||||
* - bits 24-31 %Company number.
|
||||
*/
|
||||
typedef uint32 CargoMonitorID; ///< Type of the cargo monitor number.
|
||||
|
||||
/** Map type for storing and updating active cargo monitor numbers and their amounts. */
|
||||
typedef std::map<CargoMonitorID, uint32> CargoMonitorMap;
|
||||
|
||||
extern CargoMonitorMap _cargo_pickups;
|
||||
extern CargoMonitorMap _cargo_deliveries;
|
||||
|
||||
|
||||
/** Constants for encoding and extracting cargo monitors. */
|
||||
enum CargoCompanyBits {
|
||||
CCB_TOWN_IND_NUMBER_START = 0, ///< Start bit of the town or industry number.
|
||||
CCB_TOWN_IND_NUMBER_LENGTH = 16, ///< Number of bits of the town or industry number.
|
||||
CCB_IS_INDUSTRY_BIT = 16, ///< Bit indicating the town/industry number is an industry.
|
||||
CCB_IS_INDUSTRY_BIT_VALUE = 1ul << CCB_IS_INDUSTRY_BIT, ///< Value of the #CCB_IS_INDUSTRY_BIT bit.
|
||||
CCB_CARGO_TYPE_START = 19, ///< Start bit of the cargo type field.
|
||||
CCB_CARGO_TYPE_LENGTH = 5, ///< Number of bits of the cargo type field.
|
||||
CCB_COMPANY_START = 24, ///< Start bit of the company field.
|
||||
CCB_COMPANY_LENGTH = 8, ///< Number of bits of the company field.
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Encode a cargo monitor for pickup or delivery at an industry.
|
||||
* @param company Company performing the transport.
|
||||
* @param ctype Cargo type being transported.
|
||||
* @param ind %Industry providing or accepting the cargo.
|
||||
* @return The encoded cargo/company/industry number.
|
||||
*/
|
||||
static inline CargoMonitorID EncodeCargoIndustryMonitor(CompanyID company, CargoID ctype, IndustryID ind)
|
||||
{
|
||||
assert(ctype < (1 << CCB_CARGO_TYPE_LENGTH));
|
||||
|
||||
uint32 ret = 0;
|
||||
SB(ret, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH, ind);
|
||||
SetBit(ret, CCB_IS_INDUSTRY_BIT);
|
||||
SB(ret, CCB_CARGO_TYPE_START, CCB_CARGO_TYPE_LENGTH, ctype);
|
||||
SB(ret, CCB_COMPANY_START, CCB_COMPANY_LENGTH, company);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode a cargo monitoring number for pickup or delivery at a town.
|
||||
* @param company %Company performing the transport.
|
||||
* @param ctype Cargo type being transported.
|
||||
* @param town %Town providing or accepting the cargo.
|
||||
* @return The encoded cargo/company/town number.
|
||||
*/
|
||||
static inline CargoMonitorID EncodeCargoTownMonitor(CompanyID company, CargoID ctype, TownID town)
|
||||
{
|
||||
assert(ctype < (1 << CCB_CARGO_TYPE_LENGTH));
|
||||
|
||||
uint32 ret = 0;
|
||||
SB(ret, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH, town);
|
||||
SB(ret, CCB_CARGO_TYPE_START, CCB_CARGO_TYPE_LENGTH, ctype);
|
||||
SB(ret, CCB_COMPANY_START, CCB_COMPANY_LENGTH, company);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the company from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted company id.
|
||||
*/
|
||||
static inline CompanyID DecodeMonitorCompany(CargoMonitorID num)
|
||||
{
|
||||
return static_cast<CompanyID>(GB(num, CCB_COMPANY_START, CCB_COMPANY_LENGTH));
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the cargo type from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted cargo type.
|
||||
*/
|
||||
static inline CargoID DecodeMonitorCargoType(CargoMonitorID num)
|
||||
{
|
||||
return GB(num, CCB_CARGO_TYPE_START, CCB_CARGO_TYPE_LENGTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does the cargo number monitor an industry or a town?
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return true if monitoring an industry, false if monitoring a town.
|
||||
*/
|
||||
static inline bool MonitorMonitorsIndustry(CargoMonitorID num)
|
||||
{
|
||||
return HasBit(num, CCB_IS_INDUSTRY_BIT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the industry number from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted industry id, or #INVALID_INDUSTRY if the number does not monitor an industry.
|
||||
*/
|
||||
static inline IndustryID DecodeMonitorIndustry(CargoMonitorID num)
|
||||
{
|
||||
if (!MonitorMonitorsIndustry(num)) return INVALID_INDUSTRY;
|
||||
return GB(num, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the town number from the cargo monitor.
|
||||
* @param num Cargo monitoring number to decode.
|
||||
* @return The extracted town id, or #INVALID_TOWN if the number does not monitor a town.
|
||||
*/
|
||||
static inline TownID DecodeMonitorTown(CargoMonitorID num)
|
||||
{
|
||||
if (MonitorMonitorsIndustry(num)) return INVALID_TOWN;
|
||||
return GB(num, CCB_TOWN_IND_NUMBER_START, CCB_TOWN_IND_NUMBER_LENGTH);
|
||||
}
|
||||
|
||||
void ClearCargoPickupMonitoring(CompanyID company = INVALID_OWNER);
|
||||
void ClearCargoDeliveryMonitoring(CompanyID company = INVALID_OWNER);
|
||||
uint32 GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||
uint32 GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring);
|
||||
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st);
|
||||
|
||||
#endif /* CARGOMONITOR_H */
|
@@ -161,7 +161,7 @@ public:
|
||||
|
||||
/**
|
||||
* Simple collection class for a list of cargo packets.
|
||||
* @tparam Tinst Actual instantiation of this cargo list.
|
||||
* @tparam Tinst Actual instantation of this cargo list.
|
||||
*/
|
||||
template <class Tinst>
|
||||
class CargoList {
|
||||
|
@@ -23,16 +23,11 @@
|
||||
CargoSpec CargoSpec::array[NUM_CARGO];
|
||||
|
||||
/**
|
||||
* Bitmask of cargo types available. This includes phony cargoes like regearing cargoes.
|
||||
* Bitmask of cargo types available.
|
||||
* Initialized during a call to #SetupCargoForClimate.
|
||||
*/
|
||||
uint32 _cargo_mask;
|
||||
|
||||
/**
|
||||
* Bitmask of real cargo types available. Phony cargoes like regearing cargoes are excluded.
|
||||
*/
|
||||
uint32 _standard_cargo_mask;
|
||||
|
||||
/**
|
||||
* Set up the default cargo types for the given landscape type.
|
||||
* @param l Landscape
|
||||
@@ -181,13 +176,10 @@ void InitializeSortedCargoSpecs()
|
||||
/* Sort cargo specifications by cargo class and name. */
|
||||
QSortT(_sorted_cargo_specs, _sorted_cargo_specs_size, &CargoSpecClassSorter);
|
||||
|
||||
_standard_cargo_mask = 0;
|
||||
|
||||
_sorted_standard_cargo_specs_size = 0;
|
||||
FOR_ALL_SORTED_CARGOSPECS(cargo) {
|
||||
if (cargo->classes & CC_SPECIAL) break;
|
||||
_sorted_standard_cargo_specs_size++;
|
||||
SetBit(_standard_cargo_mask, cargo->Index());
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -46,7 +46,7 @@ enum CargoClass {
|
||||
CC_LIQUID = 1 << 6, ///< Liquids (Oil, Water, Rubber)
|
||||
CC_REFRIGERATED = 1 << 7, ///< Refrigerated cargo (Food, Fruit)
|
||||
CC_HAZARDOUS = 1 << 8, ///< Hazardous cargo (Nuclear Fuel, Explosives, etc.)
|
||||
CC_COVERED = 1 << 9, ///< Covered/Sheltered Freight (Transportation in Box Vans, Silo Wagons, etc.)
|
||||
CC_COVERED = 1 << 9, ///< Covered/Sheltered Freight (Transporation in Box Vans, Silo Wagons, etc.)
|
||||
CC_SPECIAL = 1 << 15, ///< Special bit used for livery refit tricks instead of normal cargoes.
|
||||
};
|
||||
|
||||
@@ -130,7 +130,6 @@ private:
|
||||
};
|
||||
|
||||
extern uint32 _cargo_mask;
|
||||
extern uint32 _standard_cargo_mask;
|
||||
|
||||
void SetupCargoForClimate(LandscapeID l);
|
||||
CargoID GetCargoIDByLabel(CargoLabel cl);
|
||||
@@ -158,18 +157,8 @@ static inline bool IsCargoInClass(CargoID c, CargoClass cc)
|
||||
|
||||
#define FOR_EACH_SET_CARGO_ID(var, cargo_bits) FOR_EACH_SET_BIT_EX(CargoID, var, uint, cargo_bits)
|
||||
|
||||
/**
|
||||
* Loop header for iterating over cargoes, sorted by name. This includes phony cargoes like regearing cargoes.
|
||||
* @param var Reference getting the cargospec.
|
||||
* @see CargoSpec
|
||||
*/
|
||||
#define FOR_ALL_SORTED_CARGOSPECS(var) for (uint8 index = 0; index < _sorted_cargo_specs_size && (var = _sorted_cargo_specs[index], true) ; index++)
|
||||
#define FOR_ALL_SORTED_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_cargo_specs_size; index++)
|
||||
|
||||
/**
|
||||
* Loop header for iterating over 'real' cargoes, sorted by name. Phony cargoes like regearing cargoes are skipped.
|
||||
* @param var Reference getting the cargospec.
|
||||
* @see CargoSpec
|
||||
*/
|
||||
#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var) for (uint8 index = 0; index < _sorted_standard_cargo_specs_size && (var = _sorted_cargo_specs[index], true); index++)
|
||||
#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var) for (uint8 index = 0; var = _sorted_cargo_specs[index], index < _sorted_standard_cargo_specs_size; index++)
|
||||
|
||||
#endif /* CARGOTYPE_H */
|
||||
|
@@ -22,7 +22,7 @@
|
||||
#include "strings_func.h"
|
||||
#include "window_func.h"
|
||||
#include "rail_gui.h"
|
||||
#include "settings_gui.h"
|
||||
#include "gui.h"
|
||||
#include "company_gui.h"
|
||||
|
||||
#include "widgets/cheat_widget.h"
|
||||
@@ -75,7 +75,7 @@ static int32 ClickChangeCompanyCheat(int32 p1, int32 p2)
|
||||
* Allow (or disallow) changing production of all industries.
|
||||
* @param p1 new value
|
||||
* @param p2 unused
|
||||
* @return New value allowing change of industry production.
|
||||
* @return New value allwing change of industry production.
|
||||
*/
|
||||
static int32 ClickSetProdCheat(int32 p1, int32 p2)
|
||||
{
|
||||
@@ -184,9 +184,9 @@ struct CheatWindow : Window {
|
||||
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
uint box_left = rtl ? r.right - 12 : r.left + 5;
|
||||
uint button_left = rtl ? r.right - 20 - SETTING_BUTTON_WIDTH : r.left + 20;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT : 30 + SETTING_BUTTON_WIDTH);
|
||||
uint text_right = r.right - (rtl ? 30 + SETTING_BUTTON_WIDTH : WD_FRAMERECT_RIGHT);
|
||||
uint button_left = rtl ? r.right - 40 : r.left + 20;
|
||||
uint text_left = r.left + (rtl ? WD_FRAMERECT_LEFT: 50);
|
||||
uint text_right = r.right - (rtl ? 50 : WD_FRAMERECT_RIGHT);
|
||||
|
||||
for (int i = 0; i != lengthof(_cheats_ui); i++) {
|
||||
const CheatEntry *ce = &_cheats_ui[i];
|
||||
@@ -259,7 +259,7 @@ struct CheatWindow : Window {
|
||||
|
||||
/* Draw coloured flag for change company cheat */
|
||||
case STR_CHEAT_CHANGE_COMPANY:
|
||||
SetDParamMaxValue(0, MAX_COMPANIES);
|
||||
SetDParam(0, 15);
|
||||
width = max(width, GetStringBoundingBox(ce->str).width + 10 + 10);
|
||||
break;
|
||||
|
||||
@@ -291,7 +291,7 @@ struct CheatWindow : Window {
|
||||
int value = (int32)ReadValue(ce->variable, ce->type);
|
||||
int oldvalue = value;
|
||||
|
||||
if (btn == CHT_CHANGE_DATE && x >= 20 + SETTING_BUTTON_WIDTH) {
|
||||
if (btn == CHT_CHANGE_DATE && x >= 40) {
|
||||
/* Click at the date text directly. */
|
||||
SetDParam(0, value);
|
||||
ShowQueryString(STR_JUST_INT, STR_CHEAT_CHANGE_DATE_QUERY_CAPT, 8, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED);
|
||||
@@ -299,7 +299,7 @@ struct CheatWindow : Window {
|
||||
}
|
||||
|
||||
/* Not clicking a button? */
|
||||
if (!IsInsideMM(x, 20, 20 + SETTING_BUTTON_WIDTH)) return;
|
||||
if (!IsInsideMM(x, 20, 40)) return;
|
||||
|
||||
*ce->been_used = true;
|
||||
|
||||
@@ -311,10 +311,10 @@ struct CheatWindow : Window {
|
||||
|
||||
default:
|
||||
/* Take whatever the function returns */
|
||||
value = ce->proc(value + ((x >= 20 + SETTING_BUTTON_WIDTH / 2) ? 1 : -1), (x >= 20 + SETTING_BUTTON_WIDTH / 2) ? 1 : -1);
|
||||
value = ce->proc(value + ((x >= 30) ? 1 : -1), (x >= 30) ? 1 : -1);
|
||||
|
||||
/* The first cheat (money), doesn't return a different value. */
|
||||
if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= 20 + SETTING_BUTTON_WIDTH / 2) != rtl ? 1 : 0);
|
||||
if (value != oldvalue || btn == CHT_MONEY) this->clicked = btn * 2 + 1 + ((x >= 30) != rtl ? 1 : 0);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -351,7 +351,7 @@ struct CheatWindow : Window {
|
||||
static const WindowDesc _cheats_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_CHEATS, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_nested_cheat_widgets, lengthof(_nested_cheat_widgets)
|
||||
);
|
||||
|
||||
|
@@ -190,12 +190,12 @@ static void TileLoopClearAlps(TileIndex tile)
|
||||
}
|
||||
}
|
||||
/* Update snow density. */
|
||||
uint current_density = GetClearDensity(tile);
|
||||
uint curent_density = GetClearDensity(tile);
|
||||
uint req_density = (k < 0) ? 0u : min((uint)k, 3);
|
||||
|
||||
if (current_density < req_density) {
|
||||
if (curent_density < req_density) {
|
||||
AddClearDensity(tile, 1);
|
||||
} else if (current_density > req_density) {
|
||||
} else if (curent_density > req_density) {
|
||||
AddClearDensity(tile, -1);
|
||||
} else {
|
||||
/* Density at the required level. */
|
||||
|
@@ -181,8 +181,6 @@ CommandProc CmdSetVehicleOnTime;
|
||||
CommandProc CmdAutofillTimetable;
|
||||
CommandProc CmdSetTimetableStart;
|
||||
|
||||
CommandProc CmdOpenCloseAirport;
|
||||
|
||||
#define DEF_CMD(proc, flags, type) {proc, #proc, (CommandFlags)flags, type}
|
||||
|
||||
/**
|
||||
@@ -242,7 +240,7 @@ static const Command _command_proc_table[] = {
|
||||
|
||||
DEF_CMD(CmdChangeServiceInt, 0, CMDT_VEHICLE_MANAGEMENT ), // CMD_CHANGE_SERVICE_INT
|
||||
|
||||
DEF_CMD(CmdBuildIndustry, CMD_DEITY, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_INDUSTRY
|
||||
DEF_CMD(CmdBuildIndustry, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_INDUSTRY
|
||||
DEF_CMD(CmdSetCompanyManagerFace, 0, CMDT_OTHER_MANAGEMENT ), // CMD_SET_COMPANY_MANAGER_FACE
|
||||
DEF_CMD(CmdSetCompanyColour, 0, CMDT_OTHER_MANAGEMENT ), // CMD_SET_COMPANY_COLOUR
|
||||
|
||||
@@ -324,14 +322,12 @@ static const Command _command_proc_table[] = {
|
||||
DEF_CMD(CmdSetVehicleOnTime, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SET_VEHICLE_ON_TIME
|
||||
DEF_CMD(CmdAutofillTimetable, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_AUTOFILL_TIMETABLE
|
||||
DEF_CMD(CmdSetTimetableStart, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_SET_TIMETABLE_START
|
||||
|
||||
DEF_CMD(CmdOpenCloseAirport, 0, CMDT_ROUTE_MANAGEMENT ), // CMD_OPEN_CLOSE_AIRPORT
|
||||
};
|
||||
|
||||
/*!
|
||||
* This function range-checks a cmd, and checks if the cmd is not NULL
|
||||
*
|
||||
* @param cmd The integer value of a command
|
||||
* @param cmd The integervalue of a command
|
||||
* @return true if the command is valid (and got a CommandProc function)
|
||||
*/
|
||||
bool IsValidCommand(uint32 cmd)
|
||||
|
@@ -91,7 +91,6 @@ CommandCallback CcGame;
|
||||
|
||||
/* group_gui.cpp */
|
||||
CommandCallback CcCreateGroup;
|
||||
CommandCallback CcAddVehicleNewGroup;
|
||||
|
||||
/* industry_gui.cpp */
|
||||
CommandCallback CcBuildIndustry;
|
||||
|
@@ -277,7 +277,7 @@ enum Commands {
|
||||
|
||||
CMD_GIVE_MONEY, ///< give money to another company
|
||||
CMD_CHANGE_SETTING, ///< change a setting
|
||||
CMD_CHANGE_COMPANY_SETTING, ///< change a company setting
|
||||
CMD_CHANGE_COMPANY_SETTING, ///< change a company etting
|
||||
|
||||
CMD_SET_AUTOREPLACE, ///< set an autoreplace entry
|
||||
|
||||
@@ -302,8 +302,6 @@ enum Commands {
|
||||
CMD_AUTOFILL_TIMETABLE, ///< autofill the timetable
|
||||
CMD_SET_TIMETABLE_START, ///< set the date that a timetable should start
|
||||
|
||||
CMD_OPEN_CLOSE_AIRPORT, ///< open/close an airport to incoming aircraft
|
||||
|
||||
CMD_END, ///< Must ALWAYS be on the end of this list!! (period)
|
||||
};
|
||||
|
||||
|
@@ -78,14 +78,13 @@ struct CompanyProperties {
|
||||
|
||||
Year inaugurated_year; ///< Year of starting the company.
|
||||
|
||||
byte months_of_bankruptcy; ///< Number of months that the company is unable to pay its debts
|
||||
byte quarters_of_bankruptcy; ///< Number of quarters (a quarter is 3 months) that the company has a negative balance.
|
||||
CompanyMask bankrupt_asked; ///< which companies were asked about buying it?
|
||||
int16 bankrupt_timeout; ///< If bigger than \c 0, amount of time to wait for an answer on an offer to buy this company.
|
||||
Money bankrupt_value;
|
||||
|
||||
uint32 terraform_limit; ///< Amount of tileheights we can (still) terraform (times 65536).
|
||||
uint32 clear_limit; ///< Amount of tiles we can (still) clear (times 65536).
|
||||
uint32 tree_limit; ///< Amount of trees we can (still) plant (times 65536).
|
||||
|
||||
/**
|
||||
* If \c true, the company is (also) controlled by the computer (a NoAI program).
|
||||
|
@@ -59,7 +59,6 @@ Company::Company(uint16 name_1, bool is_ai)
|
||||
this->is_ai = is_ai;
|
||||
this->terraform_limit = _settings_game.construction.terraform_frame_burst << 16;
|
||||
this->clear_limit = _settings_game.construction.clear_frame_burst << 16;
|
||||
this->tree_limit = _settings_game.construction.tree_frame_burst << 16;
|
||||
|
||||
for (uint j = 0; j < 4; j++) this->share_owners[j] = COMPANY_SPECTATOR;
|
||||
InvalidateWindowData(WC_PERFORMANCE_DETAIL, 0, INVALID_COMPANY);
|
||||
@@ -261,7 +260,6 @@ void UpdateLandscapingLimits()
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
c->terraform_limit = min(c->terraform_limit + _settings_game.construction.terraform_per_64k_frames, (uint32)_settings_game.construction.terraform_frame_burst << 16);
|
||||
c->clear_limit = min(c->clear_limit + _settings_game.construction.clear_per_64k_frames, (uint32)_settings_game.construction.clear_frame_burst << 16);
|
||||
c->tree_limit = min(c->tree_limit + _settings_game.construction.tree_per_64k_frames, (uint32)_settings_game.construction.tree_frame_burst << 16);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -375,7 +373,7 @@ set_name:;
|
||||
SetDParam(1, STR_NEWS_COMPANY_LAUNCH_DESCRIPTION);
|
||||
SetDParamStr(2, cni->company_name);
|
||||
SetDParam(3, t->index);
|
||||
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NT_COMPANY_INFO, NF_COMPANY, NR_TILE, c->last_build_coordinate, NR_NONE, UINT32_MAX, cni);
|
||||
AddNewsItem(STR_MESSAGE_NEWS_FORMAT, NS_COMPANY_NEW, NR_TILE, c->last_build_coordinate, NR_NONE, UINT32_MAX, cni);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -725,9 +723,9 @@ void CompaniesYearlyLoop()
|
||||
ShowCompanyFinances(_local_company);
|
||||
c = Company::Get(_local_company);
|
||||
if (c->num_valid_stat_ent > 5 && c->old_economy[0].performance_history < c->old_economy[4].performance_history) {
|
||||
if (_settings_client.sound.new_year) SndPlayFx(SND_01_BAD_YEAR);
|
||||
SndPlayFx(SND_01_BAD_YEAR);
|
||||
} else {
|
||||
if (_settings_client.sound.new_year) SndPlayFx(SND_00_GOOD_YEAR);
|
||||
SndPlayFx(SND_00_GOOD_YEAR);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -921,7 +919,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
SetDParam(0, STR_NEWS_COMPANY_BANKRUPT_TITLE);
|
||||
SetDParam(1, STR_NEWS_COMPANY_BANKRUPT_DESCRIPTION);
|
||||
SetDParamStr(2, cni->company_name);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, cni);
|
||||
AddCompanyNewsItem(STR_MESSAGE_NEWS_FORMAT, NS_COMPANY_BANKRUPT, cni);
|
||||
|
||||
/* Remove the company */
|
||||
ChangeOwnershipOfCompanyItems(c->index, INVALID_OWNER);
|
||||
@@ -1170,21 +1168,3 @@ CommandCost CmdRenamePresident(TileIndex tile, DoCommandFlag flags, uint32 p1, u
|
||||
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the service interval for the given company and vehicle type.
|
||||
* @param c The company, or NULL for client-default settings.
|
||||
* @param type The vehicle type to get the interval for.
|
||||
* @return The service interval.
|
||||
*/
|
||||
int CompanyServiceInterval(const Company *c, VehicleType type)
|
||||
{
|
||||
const VehicleDefaultSettings *vds = (c == NULL) ? &_settings_client.company.vehicle : &c->settings.vehicle;
|
||||
switch (type) {
|
||||
default: NOT_REACHED();
|
||||
case VEH_TRAIN: return vds->servint_trains;
|
||||
case VEH_ROAD: return vds->servint_roadveh;
|
||||
case VEH_AIRCRAFT: return vds->servint_aircraft;
|
||||
case VEH_SHIP: return vds->servint_ships;
|
||||
}
|
||||
}
|
||||
|
@@ -15,7 +15,6 @@
|
||||
#include "command_type.h"
|
||||
#include "company_type.h"
|
||||
#include "gfx_type.h"
|
||||
#include "vehicle_type.h"
|
||||
|
||||
bool MayCompanyTakeOver(CompanyID cbig, CompanyID small);
|
||||
void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner);
|
||||
@@ -57,6 +56,4 @@ static inline bool IsInteractiveCompany(CompanyID company)
|
||||
return company == _local_company;
|
||||
}
|
||||
|
||||
int CompanyServiceInterval(const Company *c, VehicleType type);
|
||||
|
||||
#endif /* COMPANY_FUNC_H */
|
||||
|
@@ -319,7 +319,7 @@ struct CompanyFinancesWindow : Window {
|
||||
case WID_CF_BALANCE_VALUE:
|
||||
case WID_CF_LOAN_VALUE:
|
||||
case WID_CF_TOTAL_VALUE:
|
||||
SetDParamMaxValue(0, CompanyFinancesWindow::max_money);
|
||||
SetDParam(0, CompanyFinancesWindow::max_money);
|
||||
size->width = max(GetStringBoundingBox(STR_FINANCES_NEGATIVE_INCOME).width, GetStringBoundingBox(STR_FINANCES_POSITIVE_INCOME).width) + padding.width;
|
||||
break;
|
||||
|
||||
@@ -466,7 +466,7 @@ Money CompanyFinancesWindow::max_money = INT32_MAX;
|
||||
static const WindowDesc _company_finances_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_FINANCES, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_nested_company_finances_widgets, lengthof(_nested_company_finances_widgets)
|
||||
);
|
||||
|
||||
@@ -781,8 +781,7 @@ public:
|
||||
virtual void OnDropdownSelect(int widget, int index)
|
||||
{
|
||||
for (LiveryScheme scheme = LS_DEFAULT; scheme < LS_END; scheme++) {
|
||||
/* Changed colour for the selected scheme, or all visible schemes if CTRL is pressed. */
|
||||
if (HasBit(this->sel, scheme) || (_ctrl_pressed && _livery_class[scheme] == this->livery_class && HasBit(_loaded_newgrf_features.used_liveries, scheme))) {
|
||||
if (HasBit(this->sel, scheme)) {
|
||||
DoCommandP(0, scheme | (widget == WID_SCL_PRI_COL_DROPDOWN ? 0 : 256), index, CMD_SET_COMPANY_COLOUR);
|
||||
}
|
||||
}
|
||||
@@ -1281,7 +1280,11 @@ public:
|
||||
break;
|
||||
|
||||
case WID_SCMF_TIE_EARRING:
|
||||
this->DrawFaceStringLabel(WID_SCMF_TIE_EARRING, GetCompanyManagerFaceBits(this->face, CMFV_TIE_EARRING, this->ge), false);
|
||||
if (this->is_female) { // Only for female faces
|
||||
this->DrawFaceStringLabel(WID_SCMF_TIE_EARRING, GetCompanyManagerFaceBits(this->face, CMFV_TIE_EARRING, this->ge), false);
|
||||
} else { // Only for male faces
|
||||
this->DrawFaceStringLabel(WID_SCMF_TIE_EARRING, GetCompanyManagerFaceBits(this->face, CMFV_TIE_EARRING, this->ge), false);
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_SCMF_LIPS_MOUSTACHE:
|
||||
@@ -1482,7 +1485,7 @@ const StringID SelectCompanyManagerFaceWindow::PART_TEXTS[] = {
|
||||
static const WindowDesc _select_company_manager_face_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_COMPANY_MANAGER_FACE, WC_NONE,
|
||||
WDF_CONSTRUCTION,
|
||||
WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
|
||||
_nested_select_company_manager_face_widgets, lengthof(_nested_select_company_manager_face_widgets)
|
||||
);
|
||||
|
||||
@@ -1691,12 +1694,12 @@ struct CompanyInfrastructureWindow : Window
|
||||
max_val = max(max_val, c->infrastructure.airport);
|
||||
max_cost = max(max_cost, AirportMaintenanceCost(c->index));
|
||||
|
||||
SetDParamMaxValue(0, max_val);
|
||||
SetDParamMaxValue(1, max_cost * 12); // Convert to per year
|
||||
SetDParam(0, max_val);
|
||||
SetDParam(1, max_cost * 12); // Convert to per year
|
||||
size->width = max(size->width, GetStringBoundingBox(_settings_game.economy.infrastructure_maintenance ? STR_COMPANY_INFRASTRUCTURE_VIEW_COST : STR_WHITE_COMMA).width + 20); // Reserve some wiggle room.
|
||||
|
||||
if (_settings_game.economy.infrastructure_maintenance) {
|
||||
SetDParamMaxValue(0, this->GetTotalMaintenanceCost() * 12); // Convert to per year
|
||||
SetDParam(0, this->GetTotalMaintenanceCost() * 12); // Convert to per year
|
||||
this->total_width = GetStringBoundingBox(STR_COMPANY_INFRASTRUCTURE_VIEW_TOTAL).width + 20;
|
||||
size->width = max(size->width, this->total_width);
|
||||
}
|
||||
@@ -1836,7 +1839,7 @@ struct CompanyInfrastructureWindow : Window
|
||||
static const WindowDesc _company_infrastructure_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_COMPANY_INFRASTRUCTURE, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_nested_company_infrastructure_widgets, lengthof(_nested_company_infrastructure_widgets)
|
||||
);
|
||||
|
||||
@@ -1987,7 +1990,6 @@ struct CompanyWindow : Window
|
||||
{
|
||||
this->InitNested(desc, window_number);
|
||||
this->owner = (Owner)this->window_number;
|
||||
this->OnInvalidateData();
|
||||
}
|
||||
|
||||
virtual void OnPaint()
|
||||
@@ -2056,6 +2058,25 @@ struct CompanyWindow : Window
|
||||
}
|
||||
}
|
||||
|
||||
if (!local) {
|
||||
if (_settings_game.economy.allow_shares) { // Shares are allowed
|
||||
/* If all shares are owned by someone (none by nobody), disable buy button */
|
||||
this->SetWidgetDisabledState(WID_C_BUY_SHARE, GetAmountOwnedBy(c, INVALID_OWNER) == 0 ||
|
||||
/* Only 25% left to buy. If the company is human, disable buying it up.. TODO issues! */
|
||||
(GetAmountOwnedBy(c, INVALID_OWNER) == 1 && !c->is_ai) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
|
||||
/* If the company doesn't own any shares, disable sell button */
|
||||
this->SetWidgetDisabledState(WID_C_SELL_SHARE, (GetAmountOwnedBy(c, _local_company) == 0) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
} else { // Shares are not allowed, disable buy/sell buttons
|
||||
this->DisableWidget(WID_C_BUY_SHARE);
|
||||
this->DisableWidget(WID_C_SELL_SHARE);
|
||||
}
|
||||
}
|
||||
|
||||
this->DrawWidgets();
|
||||
}
|
||||
|
||||
@@ -2077,14 +2098,14 @@ struct CompanyWindow : Window
|
||||
break;
|
||||
|
||||
case WID_C_DESC_VEHICLE_COUNTS:
|
||||
SetDParamMaxValue(0, 5000); // Maximum number of vehicles
|
||||
SetDParam(0, 5000); // Maximum number of vehicles
|
||||
for (uint i = 0; i < lengthof(_company_view_vehicle_count_strings); i++) {
|
||||
size->width = max(size->width, GetStringBoundingBox(_company_view_vehicle_count_strings[i]).width);
|
||||
}
|
||||
break;
|
||||
|
||||
case WID_C_DESC_INFRASTRUCTURE_COUNTS:
|
||||
SetDParamMaxValue(0, UINT_MAX);
|
||||
SetDParam(0, UINT_MAX);
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_RAIL).width);
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_ROAD).width);
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_INFRASTRUCTURE_WATER).width);
|
||||
@@ -2097,7 +2118,7 @@ struct CompanyWindow : Window
|
||||
const Company *c2;
|
||||
|
||||
FOR_ALL_COMPANIES(c2) {
|
||||
SetDParamMaxValue(0, 75);
|
||||
SetDParam(0, 25);
|
||||
SetDParam(1, c2->index);
|
||||
|
||||
size->width = max(size->width, GetStringBoundingBox(STR_COMPANY_VIEW_SHARES_OWNED_BY).width);
|
||||
@@ -2378,42 +2399,12 @@ struct CompanyWindow : Window
|
||||
#endif /* ENABLE_NETWORK */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Some data on this window has become invalid.
|
||||
* @param data Information about the changed data.
|
||||
* @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
|
||||
*/
|
||||
virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
|
||||
{
|
||||
if (this->window_number == _local_company) return;
|
||||
|
||||
if (_settings_game.economy.allow_shares) { // Shares are allowed
|
||||
const Company *c = Company::Get(this->window_number);
|
||||
|
||||
/* If all shares are owned by someone (none by nobody), disable buy button */
|
||||
this->SetWidgetDisabledState(WID_C_BUY_SHARE, GetAmountOwnedBy(c, INVALID_OWNER) == 0 ||
|
||||
/* Only 25% left to buy. If the company is human, disable buying it up.. TODO issues! */
|
||||
(GetAmountOwnedBy(c, INVALID_OWNER) == 1 && !c->is_ai) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
|
||||
/* If the company doesn't own any shares, disable sell button */
|
||||
this->SetWidgetDisabledState(WID_C_SELL_SHARE, (GetAmountOwnedBy(c, _local_company) == 0) ||
|
||||
/* Spectators cannot do anything of course */
|
||||
_local_company == COMPANY_SPECTATOR);
|
||||
} else { // Shares are not allowed, disable buy/sell buttons
|
||||
this->DisableWidget(WID_C_BUY_SHARE);
|
||||
this->DisableWidget(WID_C_SELL_SHARE);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static const WindowDesc _company_desc(
|
||||
WDP_AUTO, 0, 0,
|
||||
WC_COMPANY, WC_NONE,
|
||||
0,
|
||||
WDF_UNCLICK_BUTTONS,
|
||||
_nested_company_widgets, lengthof(_nested_company_widgets)
|
||||
);
|
||||
|
||||
|
@@ -120,7 +120,7 @@ static inline void SetCompanyManagerFaceBits(CompanyManagerFace &cmf, CompanyMan
|
||||
/**
|
||||
* Increase/Decrease the company manager's face variable by the given amount.
|
||||
* If the new value greater than the max value for this variable it will be set to 0.
|
||||
* Or is it negative (< 0) it will be set to max value.
|
||||
* Or is it negativ (< 0) it will be set to max value.
|
||||
*
|
||||
* @param cmf the company manager face to write the bits to
|
||||
* @param cmfv the company manager face variable to write the data of
|
||||
|
@@ -355,7 +355,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char
|
||||
aliasstream[astream_i++] = '"';
|
||||
break;
|
||||
|
||||
case ';': // Cmd separator, start new command
|
||||
case ';': // Cmd seperator, start new command
|
||||
aliasstream[astream_i] = '\0';
|
||||
aliases[++a_index] = &aliasstream[++astream_i];
|
||||
cmdptr++;
|
||||
@@ -364,7 +364,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char
|
||||
case '%': // Some or all parameters
|
||||
cmdptr++;
|
||||
switch (*cmdptr) {
|
||||
case '+': { // All parameters separated: "[param 1]" "[param 2]"
|
||||
case '+': { // All parameters seperated: "[param 1]" "[param 2]"
|
||||
for (i = 0; i != tokencount; i++) {
|
||||
aliasstream[astream_i++] = '"';
|
||||
astream_i += IConsoleCopyInParams(&aliasstream[astream_i], tokens[i], astream_i);
|
||||
@@ -412,7 +412,7 @@ static void IConsoleAliasExec(const IConsoleAlias *alias, byte tokencount, char
|
||||
|
||||
/**
|
||||
* Execute a given command passed to us. First chop it up into
|
||||
* individual tokens (separated by spaces), then execute it if possible
|
||||
* individual tokens (seperated by spaces), then execute it if possible
|
||||
* @param cmdstr string to be parsed and executed
|
||||
*/
|
||||
void IConsoleCmdExec(const char *cmdstr)
|
||||
@@ -439,14 +439,14 @@ void IConsoleCmdExec(const char *cmdstr)
|
||||
memset(&tokens, 0, sizeof(tokens));
|
||||
memset(&tokenstream, 0, sizeof(tokenstream));
|
||||
|
||||
/* 1. Split up commandline into tokens, separated by spaces, commands
|
||||
/* 1. Split up commandline into tokens, seperated by spaces, commands
|
||||
* enclosed in "" are taken as one token. We can only go as far as the amount
|
||||
* of characters in our stream or the max amount of tokens we can handle */
|
||||
for (cmdptr = cmdstr, t_index = 0, tstream_i = 0; *cmdptr != '\0'; cmdptr++) {
|
||||
if (t_index >= lengthof(tokens) || tstream_i >= lengthof(tokenstream)) break;
|
||||
|
||||
switch (*cmdptr) {
|
||||
case ' ': // Token separator
|
||||
case ' ': // Token seperator
|
||||
if (!foundtoken) break;
|
||||
|
||||
if (longtoken) {
|
||||
|
@@ -38,7 +38,10 @@
|
||||
#include "console_func.h"
|
||||
#include "engine_base.h"
|
||||
#include "game/game.hpp"
|
||||
#include "table/strings.h"
|
||||
|
||||
#ifdef ENABLE_NETWORK
|
||||
#include "table/strings.h"
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
||||
/* scriptfile handling */
|
||||
static bool _script_running; ///< Script is running (used to abort execution when #ConReturn is encountered).
|
||||
@@ -1066,7 +1069,7 @@ DEF_CONSOLE_CMD(ConRestart)
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a text buffer line by line to the console. Lines are separated by '\n'.
|
||||
* Print a text buffer line by line to the console. Lines are seperated by '\n'.
|
||||
* @param buf The buffer to print.
|
||||
* @note All newlines are replace by '\0' characters.
|
||||
*/
|
||||
@@ -1528,45 +1531,6 @@ DEF_CONSOLE_CMD(ConListAliases)
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConCompanies)
|
||||
{
|
||||
if (argc == 0) {
|
||||
IConsoleHelp("List the details of all companies in the game. Usage 'companies'");
|
||||
return true;
|
||||
}
|
||||
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
/* Grab the company name */
|
||||
char company_name[512];
|
||||
SetDParam(0, c->index);
|
||||
GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
|
||||
|
||||
const char *password_state = "";
|
||||
if (c->is_ai) {
|
||||
password_state = "AI";
|
||||
}
|
||||
#ifdef ENABLE_NETWORK
|
||||
else if (_network_server) {
|
||||
password_state = StrEmpty(_network_company_states[c->index].password) ? "unprotected" : "protected";
|
||||
}
|
||||
#endif
|
||||
|
||||
char colour[512];
|
||||
GetString(colour, STR_COLOUR_DARK_BLUE + _company_colours[c->index], lastof(colour));
|
||||
IConsolePrintF(CC_INFO, "#:%d(%s) Company Name: '%s' Year Founded: %d Money: " OTTD_PRINTF64 " Loan: " OTTD_PRINTF64 " Value: " OTTD_PRINTF64 " (T:%d, R:%d, P:%d, S:%d) %s",
|
||||
c->index + 1, colour, company_name,
|
||||
c->inaugurated_year, (int64)c->money, (int64)c->current_loan, (int64)CalculateCompanyValue(c),
|
||||
c->group_all[VEH_TRAIN].num_vehicle,
|
||||
c->group_all[VEH_ROAD].num_vehicle,
|
||||
c->group_all[VEH_AIRCRAFT].num_vehicle,
|
||||
c->group_all[VEH_SHIP].num_vehicle,
|
||||
password_state);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef ENABLE_NETWORK
|
||||
|
||||
DEF_CONSOLE_CMD(ConSay)
|
||||
@@ -1588,6 +1552,38 @@ DEF_CONSOLE_CMD(ConSay)
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConCompanies)
|
||||
{
|
||||
if (argc == 0) {
|
||||
IConsoleHelp("List the in-game details of all clients connected to the server. Usage 'companies'");
|
||||
return true;
|
||||
}
|
||||
NetworkCompanyStats company_stats[MAX_COMPANIES];
|
||||
NetworkPopulateCompanyStats(company_stats);
|
||||
|
||||
Company *c;
|
||||
FOR_ALL_COMPANIES(c) {
|
||||
/* Grab the company name */
|
||||
char company_name[NETWORK_COMPANY_NAME_LENGTH];
|
||||
SetDParam(0, c->index);
|
||||
GetString(company_name, STR_COMPANY_NAME, lastof(company_name));
|
||||
|
||||
char buffer[512];
|
||||
const NetworkCompanyStats *stats = &company_stats[c->index];
|
||||
|
||||
GetString(buffer, STR_COLOUR_DARK_BLUE + _company_colours[c->index], lastof(buffer));
|
||||
IConsolePrintF(CC_INFO, "#:%d(%s) Company Name: '%s' Year Founded: %d Money: " OTTD_PRINTF64 " Loan: " OTTD_PRINTF64 " Value: " OTTD_PRINTF64 " (T:%d, R:%d, P:%d, S:%d) %sprotected",
|
||||
c->index + 1, buffer, company_name, c->inaugurated_year, (int64)c->money, (int64)c->current_loan, (int64)CalculateCompanyValue(c),
|
||||
/* trains */ stats->num_vehicle[0],
|
||||
/* lorry + bus */ stats->num_vehicle[1] + stats->num_vehicle[2],
|
||||
/* planes */ stats->num_vehicle[3],
|
||||
/* ships */ stats->num_vehicle[4],
|
||||
/* protected */ StrEmpty(_network_company_states[c->index].password) ? "un" : "");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConSayCompany)
|
||||
{
|
||||
if (argc == 0) {
|
||||
@@ -1780,9 +1776,7 @@ DEF_CONSOLE_CMD(ConContent)
|
||||
static const TextColour state_to_colour[] = { CC_COMMAND, CC_INFO, CC_INFO, CC_WHITE, CC_ERROR };
|
||||
|
||||
const ContentInfo *ci = *iter;
|
||||
char buf[sizeof(ci->md5sum) * 2 + 1];
|
||||
md5sumToString(buf, lastof(buf), ci->md5sum);
|
||||
IConsolePrintF(state_to_colour[ci->state], "%d, %s, %s, %s, %08X, %s", ci->id, types[ci->type - 1], states[ci->state], ci->name, ci->unique_id, buf);
|
||||
IConsolePrintF(state_to_colour[ci->state], "%d, %s, %s, %s", ci->id, types[ci->type - 1], states[ci->state], ci->name);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -1943,9 +1937,6 @@ void IConsoleStdLibRegister()
|
||||
IConsoleCmdRegister("list_game_libs", ConListGameLibs);
|
||||
IConsoleCmdRegister("rescan_game", ConRescanGame);
|
||||
|
||||
IConsoleCmdRegister("companies", ConCompanies);
|
||||
IConsoleAliasRegister("players", "companies");
|
||||
|
||||
/* networking functions */
|
||||
#ifdef ENABLE_NETWORK
|
||||
/* Content downloading is only available with ZLIB */
|
||||
@@ -1955,6 +1946,8 @@ void IConsoleStdLibRegister()
|
||||
|
||||
/*** Networking commands ***/
|
||||
IConsoleCmdRegister("say", ConSay, ConHookNeedNetwork);
|
||||
IConsoleCmdRegister("companies", ConCompanies, ConHookServerOnly);
|
||||
IConsoleAliasRegister("players", "companies");
|
||||
IConsoleCmdRegister("say_company", ConSayCompany, ConHookNeedNetwork);
|
||||
IConsoleAliasRegister("say_player", "say_company %+");
|
||||
IConsoleCmdRegister("say_client", ConSayClient, ConHookNeedNetwork);
|
||||
|
@@ -10,7 +10,7 @@
|
||||
/** @file console_gui.cpp Handling the GUI of the in-game console. */
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "textbuf_type.h"
|
||||
#include "textbuf_gui.h"
|
||||
#include "window_gui.h"
|
||||
#include "console_gui.h"
|
||||
#include "console_internal.h"
|
||||
@@ -126,7 +126,7 @@ struct IConsoleLine {
|
||||
|
||||
|
||||
/* ** main console cmd buffer ** */
|
||||
static Textbuf _iconsole_cmdline(ICON_CMDLN_SIZE);
|
||||
static Textbuf _iconsole_cmdline;
|
||||
static char *_iconsole_history[ICON_HISTORY_SIZE];
|
||||
static int _iconsole_historypos;
|
||||
IConsoleModes _iconsole_mode;
|
||||
@@ -233,7 +233,7 @@ struct IConsoleWindow : Window
|
||||
|
||||
virtual void OnMouseLoop()
|
||||
{
|
||||
if (_iconsole_cmdline.HandleCaret()) this->SetDirty();
|
||||
if (HandleCaret(&_iconsole_cmdline)) this->SetDirty();
|
||||
}
|
||||
|
||||
virtual EventState OnKeyPress(uint16 key, uint16 keycode)
|
||||
@@ -294,7 +294,7 @@ struct IConsoleWindow : Window
|
||||
case (WKC_META | 'V'):
|
||||
#endif
|
||||
case (WKC_CTRL | 'V'):
|
||||
if (_iconsole_cmdline.InsertClipboard()) {
|
||||
if (InsertTextBufferClipboard(&_iconsole_cmdline)) {
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
}
|
||||
@@ -308,19 +308,19 @@ struct IConsoleWindow : Window
|
||||
case (WKC_META | 'U'):
|
||||
#endif
|
||||
case (WKC_CTRL | 'U'):
|
||||
_iconsole_cmdline.DeleteAll();
|
||||
DeleteTextBufferAll(&_iconsole_cmdline);
|
||||
this->SetDirty();
|
||||
break;
|
||||
|
||||
case WKC_BACKSPACE: case WKC_DELETE:
|
||||
if (_iconsole_cmdline.DeleteChar(keycode)) {
|
||||
if (DeleteTextBufferChar(&_iconsole_cmdline, keycode)) {
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
}
|
||||
break;
|
||||
|
||||
case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
|
||||
if (_iconsole_cmdline.MovePos(keycode)) {
|
||||
if (MoveTextBufferPos(&_iconsole_cmdline, keycode)) {
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
}
|
||||
@@ -329,7 +329,7 @@ struct IConsoleWindow : Window
|
||||
default:
|
||||
if (IsValidChar(key, CS_ALPHANUMERAL)) {
|
||||
IConsoleWindow::scroll = 0;
|
||||
_iconsole_cmdline.InsertChar(key);
|
||||
InsertTextBufferChar(&_iconsole_cmdline, key);
|
||||
IConsoleResetHistoryPos();
|
||||
this->SetDirty();
|
||||
} else {
|
||||
@@ -356,6 +356,10 @@ void IConsoleGUIInit()
|
||||
IConsoleLine::Reset();
|
||||
memset(_iconsole_history, 0, sizeof(_iconsole_history));
|
||||
|
||||
_iconsole_cmdline.buf = CallocT<char>(ICON_CMDLN_SIZE); // create buffer and zero it
|
||||
_iconsole_cmdline.max_bytes = ICON_CMDLN_SIZE;
|
||||
_iconsole_cmdline.max_chars = ICON_CMDLN_SIZE;
|
||||
|
||||
IConsolePrintF(CC_WARNING, "OpenTTD Game Console Revision 7 - %s", _openttd_revision);
|
||||
IConsolePrint(CC_WHITE, "------------------------------------");
|
||||
IConsolePrint(CC_WHITE, "use \"help\" for more information");
|
||||
@@ -370,6 +374,7 @@ void IConsoleClearBuffer()
|
||||
|
||||
void IConsoleGUIFree()
|
||||
{
|
||||
free(_iconsole_cmdline.buf);
|
||||
IConsoleClearBuffer();
|
||||
}
|
||||
|
||||
@@ -451,10 +456,11 @@ static void IConsoleHistoryNavigate(int direction)
|
||||
if (direction > 0 && _iconsole_history[_iconsole_historypos] == NULL) _iconsole_historypos--;
|
||||
|
||||
if (_iconsole_historypos == -1) {
|
||||
_iconsole_cmdline.DeleteAll();
|
||||
*_iconsole_cmdline.buf = '\0';
|
||||
} else {
|
||||
_iconsole_cmdline.Assign(_iconsole_history[_iconsole_historypos]);
|
||||
ttd_strlcpy(_iconsole_cmdline.buf, _iconsole_history[_iconsole_historypos], _iconsole_cmdline.max_bytes);
|
||||
}
|
||||
UpdateTextBufferSize(&_iconsole_cmdline);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -28,7 +28,7 @@ enum ConsoleHookResult {
|
||||
* --Commands--
|
||||
* Commands are commands, or functions. They get executed once and any
|
||||
* effect they produce are carried out. The arguments to the commands
|
||||
* are given to them, each input word separated by a double-quote (") is an argument
|
||||
* are given to them, each input word seperated by a double-quote (") is an argument
|
||||
* If you want to handle multiple words as one, enclose them in double-quotes
|
||||
* eg. 'say "hello sexy boy"'
|
||||
*/
|
||||
@@ -50,7 +50,7 @@ struct IConsoleCmd {
|
||||
* (eg. 'ng' for 'load %A; unpause; debug_level 5'). Aliases can parse the arguments
|
||||
* given to them in the command line.
|
||||
* - "%A - %Z" substitute arguments 1 t/m 26
|
||||
* - "%+" lists all parameters keeping them separated
|
||||
* - "%+" lists all parameters keeping them seperated
|
||||
* - "%!" also lists all parameters but presenting them to the aliased command as one argument
|
||||
* - ";" allows for combining commands (see example 'ng')
|
||||
*/
|
||||
|
@@ -27,7 +27,7 @@ const uint8 _ffb_64[64] = {
|
||||
* Search the first set bit in a 32 bit variable.
|
||||
*
|
||||
* This algorithm is a static implementation of a log
|
||||
* congruence search algorithm. It checks the first half
|
||||
* conguence search algorithm. It checks the first half
|
||||
* if there is a bit set search there further. And this
|
||||
* way further. If no bit is set return 0.
|
||||
*
|
||||
@@ -55,7 +55,7 @@ uint8 FindFirstBit(uint32 x)
|
||||
* Search the last set bit in a 64 bit variable.
|
||||
*
|
||||
* This algorithm is a static implementation of a log
|
||||
* congruence search algorithm. It checks the second half
|
||||
* conguence search algorithm. It checks the second half
|
||||
* if there is a bit set search there further. And this
|
||||
* way further. If no bit is set return 0.
|
||||
*
|
||||
|
@@ -13,21 +13,19 @@
|
||||
#define BITMATH_FUNC_HPP
|
||||
|
||||
/**
|
||||
* Fetch \a n bits from \a x, started at bit \a s.
|
||||
* Fetch n bits from x, started at bit s.
|
||||
*
|
||||
* This function can be used to fetch \a n bits from the value \a x. The
|
||||
* \a s value set the start position to read. The start position is
|
||||
* count from the LSB and starts at \c 0. The result starts at a
|
||||
* This function can be used to fetch n bits from the value x. The
|
||||
* s value set the startposition to read. The startposition is
|
||||
* count from the LSB and starts at 0. The result starts at a
|
||||
* LSB, as this isn't just an and-bitmask but also some
|
||||
* bit-shifting operations. GB(0xFF, 2, 1) will so
|
||||
* return 0x01 (0000 0001) instead of
|
||||
* 0x04 (0000 0100).
|
||||
*
|
||||
* @param x The value to read some bits.
|
||||
* @param s The start position to read some bits.
|
||||
* @param s The startposition to read some bits.
|
||||
* @param n The number of bits to read.
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @pre s + n <= sizeof(T) * 8
|
||||
* @return The selected bits, aligned to a LSB.
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -46,14 +44,12 @@ static inline uint GB(const T x, const uint8 s, const uint8 n)
|
||||
* This is not a bug, its a feature.
|
||||
*
|
||||
* @note Parameter \a x must be a variable as the result is saved there.
|
||||
* @note To avoid unexpected results the value of \a d should not use more
|
||||
* @note To avoid unexpecting results the value of \a d should not use more
|
||||
* space as the provided space of \a n bits (log2)
|
||||
* @param x The variable to change some bits
|
||||
* @param s The start position for the new bits
|
||||
* @param s The startposition for the new bits
|
||||
* @param n The size/window for the new bits
|
||||
* @param d The actually new bits to save in the defined position.
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @pre s + n <= sizeof(T) * 8
|
||||
* @return The new value of \a x
|
||||
*/
|
||||
template <typename T, typename U>
|
||||
@@ -65,21 +61,19 @@ static inline T SB(T &x, const uint8 s, const uint8 n, const U d)
|
||||
}
|
||||
|
||||
/**
|
||||
* Add \a i to \a n bits of \a x starting at bit \a s.
|
||||
* Add i to n bits of x starting at bit s.
|
||||
*
|
||||
* This adds the value of \a i on \a n bits of \a x starting at bit \a s. The parameters \a x,
|
||||
* \a s, \a i are similar to #GB. Besides, \ a x must be a variable as the result are
|
||||
* This add the value of i on n bits of x starting at bit s. The parameters x,
|
||||
* s, i are similar to #GB besides x must be a variable as the result are
|
||||
* saved there. An overflow does not affect the following bits of the given
|
||||
* bit window and is simply ignored.
|
||||
*
|
||||
* @note Parameter x must be a variable as the result is saved there.
|
||||
* @param x The variable to add some bits at some position
|
||||
* @param s The start position of the addition
|
||||
* @param s The startposition of the addition
|
||||
* @param n The size/window for the addition
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @pre s + n <= sizeof(T) * 8
|
||||
* @param i The value to add at the given start position in the given window.
|
||||
* @return The new value of \a x
|
||||
* @param i The value to add at the given startposition in the given window.
|
||||
* @return The new value of x
|
||||
*/
|
||||
template <typename T, typename U>
|
||||
static inline T AB(T &x, const uint8 s, const uint8 n, const U i)
|
||||
@@ -93,12 +87,11 @@ static inline T AB(T &x, const uint8 s, const uint8 n, const U i)
|
||||
* Checks if a bit in a value is set.
|
||||
*
|
||||
* This function checks if a bit inside a value is set or not.
|
||||
* The \a y value specific the position of the bit, started at the
|
||||
* LSB and count from \c 0.
|
||||
* The y value specific the position of the bit, started at the
|
||||
* LSB and count from 0.
|
||||
*
|
||||
* @param x The value to check
|
||||
* @param y The position of the bit to check, started from the LSB
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return True if the bit is set, false else.
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -116,7 +109,6 @@ static inline bool HasBit(const T x, const uint8 y)
|
||||
*
|
||||
* @param x The variable to set a bit
|
||||
* @param y The bit position to set
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return The new value of the old value with the bit set
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -146,7 +138,6 @@ static inline T SetBit(T &x, const uint8 y)
|
||||
*
|
||||
* @param x The variable to clear the bit
|
||||
* @param y The bit position to clear
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return The new value of the old value with the bit cleared
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -174,9 +165,8 @@ static inline T ClrBit(T &x, const uint8 y)
|
||||
* changed and the value is also returned. Parameter y defines the bit
|
||||
* to toggle and starts at the LSB with 0.
|
||||
*
|
||||
* @param x The variable to toggle the bit
|
||||
* @param x The varliable to toggle the bit
|
||||
* @param y The bit position to toggle
|
||||
* @pre y < sizeof(T) * 8
|
||||
* @return The new value of the old value with the bit toggled
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -291,12 +281,11 @@ static inline bool HasAtMostOneBit(T value)
|
||||
}
|
||||
|
||||
/**
|
||||
* ROtate \a x Left by \a n
|
||||
* ROtate x Left by n
|
||||
*
|
||||
* @note Assumes a byte has 8 bits
|
||||
* @param x The value which we want to rotate
|
||||
* @param n The number how many we want to rotate
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @param n The number how many we waht to rotate
|
||||
* @return A bit rotated number
|
||||
*/
|
||||
template <typename T>
|
||||
@@ -306,12 +295,11 @@ static inline T ROL(const T x, const uint8 n)
|
||||
}
|
||||
|
||||
/**
|
||||
* ROtate \a x Right by \a n
|
||||
* ROtate x Right by n
|
||||
*
|
||||
* @note Assumes a byte has 8 bits
|
||||
* @param x The value which we want to rotate
|
||||
* @param n The number how many we want to rotate
|
||||
* @pre n < sizeof(T) * 8
|
||||
* @param n The number how many we waht to rotate
|
||||
* @return A bit rotated number
|
||||
*/
|
||||
template <typename T>
|
||||
|
@@ -89,7 +89,7 @@ template <typename Tenum_t> struct TinyEnumT;
|
||||
template <typename Tenum_t>
|
||||
struct TinyEnumT {
|
||||
typedef Tenum_t enum_type; ///< expose our enumeration type (i.e. Trackdir) to outside
|
||||
typedef EnumPropsT<Tenum_t> Props; ///< make easier access to our enumeration properties
|
||||
typedef EnumPropsT<Tenum_t> Props; ///< make easier access to our enumeration propeties
|
||||
typedef typename Props::storage storage_type; ///< small storage type
|
||||
static const enum_type begin = Props::begin; ///< enum beginning (i.e. TRACKDIR_BEGIN)
|
||||
static const enum_type end = Props::end; ///< enum end (i.e. TRACKDIR_END)
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user