1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-13 01:29:10 +00:00

Compare commits

..

11 Commits

Author SHA1 Message Date
rubidium
17da07e83b (svn r24015) -Release: 1.2.0-RC2 2012-03-04 17:22:17 +00:00
rubidium
b6d5e4d60c (svn r24014) [1.2] -Prepare for 1.2.0-RC2 2012-03-04 17:16:37 +00:00
rubidium
d793f89ec3 (svn r24013) [1.2] -Backport language updates from trunk 2012-03-04 17:12:36 +00:00
rubidium
32aee004c6 (svn r24010) [1.2] -Fix: forgot to backport r23992 2012-03-04 17:01:23 +00:00
rubidium
5814764af9 (svn r24009) [1.2] -Backport from trunk:
- Fix: [Script] AI used in names in API for GSOrder [FS#5088] (r24006)
2012-03-04 16:56:41 +00:00
rubidium
e19915d824 (svn r24007) [1.2] -Backport from trunk:
- Fix: Improve rounding when converting display speeds to internal speeds [FS#5079] (r23995)
- Fix: Also reset the font glyph cache when switching blitters (r23992, r23987)
- Fix: [NewGRF] Also display the cargo subtype for vehicles which have no capacity, but a subtype [FS#5076] (r23991)
2012-03-04 16:43:35 +00:00
rubidium
9bcd02e389 (svn r24005) [1.2] -Backport from trunk:
- Fix: Fix the order of lights on the helipad [FS#5082] (r23984)
2012-03-04 16:39:12 +00:00
rubidium
2ab087f31f (svn r24004) [1.2] -Backport from trunk:
- Fix: Zero the offsets of disabled zoomlevels, so they do not influence offset calculations (r23989)
- Fix: Invalid reads when scaling an odd-sized sprite smaller (r23986)
- Fix: Inconsistent quit/abandon/exit game/scenario/editor strings [FS#5074] (r23985)
- Fix: Tarred heightmaps would not be found [FS#5083] (r23983)
2012-03-04 16:38:05 +00:00
rubidium
9d168228e7 (svn r24003) [1.2] -Backport from trunk:
- Fix: Do not load a game during UpdateWindows as that might trigger changing the blitter which triggers re-entrant locking (r23980, r23977)
- Fix: [SDL] Palette update was done too late making switching from 8bpp -> 32bpp look ugly (r23978)
- Fix: Sprites of different zoom levels were not always padded correctly to a common size (r23976)
- Fix: Also save the maximum travel speed for the current vehicle order (r23973)
2012-03-04 16:33:13 +00:00
rubidium
8f8be22bc9 (svn r23970) [1.2] -Prepare: 1.2.0-RC1 2012-02-19 19:53:20 +00:00
rubidium
ebb7d2084b (svn r23968) [1.2] -Branch: there we go... 2012-02-19 19:07:09 +00:00
598 changed files with 35391 additions and 57963 deletions

View File

@@ -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)/"
@@ -73,6 +73,7 @@ endif
$(Q)cp "$(ROOT_DIR)/COPYING" "$(BUNDLE_DIR)/"
$(Q)cp "$(ROOT_DIR)/known-bugs.txt" "$(BUNDLE_DIR)/"
$(Q)cp "$(ROOT_DIR)/docs/multiplayer.txt" "$(BUNDLE_DIR)/docs/"
$(Q)cp "$(ROOT_DIR)/docs/32bpp.txt" "$(BUNDLE_DIR)/docs/"
$(Q)cp "$(ROOT_DIR)/changelog.txt" "$(BUNDLE_DIR)/"
ifdef MAN_DIR
$(Q)mkdir -p "$(BUNDLE_DIR)/man/"
@@ -84,7 +85,7 @@ endif
$(Q)cp "$(BIN_DIR)/scripts/"* "$(BUNDLE_DIR)/scripts/"
ifdef MENU_DIR
$(Q)cp "$(ROOT_DIR)/media/openttd.desktop" "$(BUNDLE_DIR)/media/"
$(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | $(SORT) | $(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.filter.awk" >> "$(BUNDLE_DIR)/media/openttd.desktop"
$(Q)$(AWK) -f "$(ROOT_DIR)/media/openttd.desktop.translation.awk" "$(SRC_DIR)/lang/"*.txt | $(SORT) >> "$(BUNDLE_DIR)/media/openttd.desktop"
$(Q)sed s/=openttd/=$(BINARY_NAME)/g "$(BUNDLE_DIR)/media/openttd.desktop" > "$(ROOT_DIR)/media/openttd.desktop.install"
endif
ifeq ($(TTD), openttd.exe)

View File

@@ -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

View File

@@ -41,6 +41,7 @@ TTDS = $(SRC_DIRS:%=%/$(TTD))
OS = !!OS!!
OSXAPP = !!OSXAPP!!
LIPO = !!LIPO!!
REVISION = !!REVISION!!
AWK = !!AWK!!
SORT = !!SORT!!
DISTCC = !!DISTCC!!

View File

@@ -14,7 +14,6 @@ LANGS_SRC = $(shell ls $(LANG_DIR)/*.txt)
LANGS = $(LANGS_SRC:$(LANG_DIR)/%.txt=%.lng)
CXX_BUILD = !!CXX_BUILD!!
CFLAGS_BUILD = !!CFLAGS_BUILD!!
CXXFLAGS_BUILD= !!CXXFLAGS_BUILD!!
LDFLAGS_BUILD = !!LDFLAGS_BUILD!!
STRGEN_FLAGS = !!STRGEN_FLAGS!!
STAGE = !!STAGE!!
@@ -45,23 +44,23 @@ all: table/strings.h $(LANGS)
strgen_base.o: $(SRC_DIR)/strgen/strgen_base.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
strgen.o: $(SRC_DIR)/strgen/strgen.cpp $(SRC_DIR)/strgen/strgen.h endian_host.h $(SRC_DIR)/table/control_codes.h $(SRC_DIR)/table/strgen_tables.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
string.o: $(SRC_DIR)/string.cpp endian_host.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSTRGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
lang/english.txt: $(LANG_DIR)/english.txt
$(Q)mkdir -p lang
@@ -69,7 +68,7 @@ lang/english.txt: $(LANG_DIR)/english.txt
$(STRGEN): alloc_func.o string.o strgen_base.o strgen.o getoptdata.o
$(E) '$(STAGE) Compiling and Linking $@'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $^ -o $@
$(Q)$(CXX_BUILD) $(LDFLAGS_BUILD) $^ -o $@
table/strings.h: lang/english.txt $(STRGEN)
$(E) '$(STAGE) Generating $@'
@@ -88,7 +87,7 @@ endian_host.h: $(ENDIAN_CHECK)
$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp
$(E) '$(STAGE) Compiling and Linking $@'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $< -o $@
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $< -o $@
depend:

View File

@@ -10,7 +10,6 @@ ENDIAN_CHECK = !!ENDIAN_CHECK!!
SRC_DIR = !!SRC_DIR!!
CXX_BUILD = !!CXX_BUILD!!
CFLAGS_BUILD = !!CFLAGS_BUILD!!
CXXFLAGS_BUILD = !!CXXFLAGS_BUILD!!
LDFLAGS_BUILD = !!LDFLAGS_BUILD!!
STAGE = !!STAGE!!
SETTING_OBJS_DIR = !!SETTING_OBJS_DIR!!
@@ -30,27 +29,27 @@ all: table/settings.h
settingsgen.o: $(SRC_DIR)/settingsgen/settingsgen.cpp $(SRC_DIR)/string_func.h $(SRC_DIR)/strings_type.h $(SRC_DIR)/misc/getoptdata.h $(SRC_DIR)/ini_type.h $(SRC_DIR)/core/smallvec_type.hpp
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
alloc_func.o: $(SRC_DIR)/core/alloc_func.cpp endian_host.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
getoptdata.o: $(SRC_DIR)/misc/getoptdata.cpp $(SRC_DIR)/misc/getoptdata.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/misc/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
string.o: $(SRC_DIR)/string.cpp endian_host.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
ini_load.o: $(SRC_DIR)/ini_load.cpp $(SRC_DIR)/core/alloc_func.hpp $(SRC_DIR)/core/mem_func.hpp $(SRC_DIR)/ini_type.h $(SRC_DIR)/string_func.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSETTINGSGEN -c -o $@ $<
$(SETTINGSGEN): alloc_func.o string.o ini_load.o settingsgen.o getoptdata.o
$(E) '$(STAGE) Compiling and Linking $@'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $^ -o $@
$(Q)$(CXX_BUILD) $(LDFLAGS_BUILD) $^ -o $@
table/settings.h: $(SETTINGSGEN) $(SRC_DIR)/table/settings.h.preamble $(SRC_DIR)/table/settings.h.postamble $(SRC_DIR)/table/*.ini
$(E) '$(STAGE) Generating $@'
@@ -65,7 +64,7 @@ endian_host.h: $(ENDIAN_CHECK)
$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp
$(E) '$(STAGE) Compiling and Linking $@'
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $(CXXFLAGS_BUILD) $(LDFLAGS_BUILD) $< -o $@
$(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $< -o $@
depend:

View File

@@ -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.");

View File

@@ -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/>.
*/

View File

@@ -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--

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.");

View File

@@ -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/>.
*/

View File

@@ -1,355 +1,3 @@
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: 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)
- Fix: [Windows] Unbreak NewGRF MD5 sum calculation. Macros and side effects do not mix, especially if there is some obscure '#define min' in a windows header that nobody thinks of [FS#5231] (r24416)
- Fix: Disallow removing roadtypes from bridges when not dragging in bridge direction [FS#5221] (r24414)
- Fix: Draw wires under low bridges if the bridge is transparent, not if the wire is transparent (r24403)
- Fix: Station properties 11 and 14 were combined incorrectly [FS#5243] (r24402)
- Fix: [Windows] Changing resolution did not resize the window (r24394)
- Fix: Use the 'all vehicles' group for the autoreplace window from the vehicle list [FS#5239] (r24392)
- Fix: Do not consider not finding a particular base set critical; just load a different one and display an in-game error later on [FS#5233] (r24388)
- Fix: Make IsInDepot() functions behave consistent across vehicle types and add IsChainInDepot instead, if that is what shall be checked [FS#5188] (r24384)
- Fix: Call Vehicle::IsStoppedInDepot only for the first vehicle in a chain (i.e. primary vehicle or free wagon) (r24382)
- Fix: Do not resize the object GUI when selecting objects. Rather clip the object name (r24379)
- Fix: ReInit could crash for windows with NWidgetMatrix widgets [FS#5218] (r24378)
- Fix: [NewGRF] Extended action A1 did not work correctly [FS#5227] (r24369, r24361)
- Fix: [NewGRF] Ship-specific 80+x variables were missing for unknown reason [FS#5224] (r24360)
- Fix: When airport construction was denied due to noise, the error message named the wrong town (r24354)
- Fix: [NoAI] A TileIndex is not a station id, so do not use it as one [FS#5215] (r24353)
- Fix: When highlighting the drop position for vehicles in depots, make space for all articulated parts (r24352)
- Fix: Short vehicles were not properly positioned at the cursor when dragging for RTL languages (r24351)
- Fix: EQUALSIZE widget containers within EQUALSIZE containers were initialised with wrong sizes (r24346)
- Fix: The cursor in the company password window was not blinking due to wrong magic constants (r24335)
- Fix: [NewGRF] Change the length of 8/8 roadvehicles in vehicle lists to 32 pixels; this is in fact the correct length as can be seen in corners for short articulated parts following each other [FS#2553] (r24332)
- Fix: [NewGRF] Group vehicles in the purchase list properly by source GRF, but also consider engine GRFID overrides [FS#4254] (r24330, r24321)
- Fix: Make the AI settings window behave more like the other settings window by closing the query window whenever selecting a different row (r24315)
- Fix: Editing NewGRF parameters using the query window showed wrong values, if there was no direct relation between parameter index and parameter register (r24314)
- Fix: Center object previews in 1- and 2-view selectors based on the 4-view selector layout [FS#5057] (r24299)
- Fix: Increase the left and right margins of the text in the yes/no query window (r24293)
- Fix: [NewGRF] GetReverseCargoTranslation() was unnecessary complicated and also returned the wrong thing for cargos not present in the translation table (r24273)
- Fix: [NewGRF] Load cargo- and railtype-translation during both reservation and activation stage. That way they can be selected using Action7 depending on present cargo- or railtypes (r24272)
- Fix: Use the same colour scheme for the script selection window as in other comparable windows (r24268)
- Fix: Make the oilrig-vehicle list accessible to spectators and colour its caption neutrally grey [FS#5126] (r24260)
1.2.1 (2012-06-01)
------------------------------------------------------------------------
- Fix: [Script] ScriptTown::GetGrowthRate() returned wrong values after usage of SetGrowthRate() (r24302)
1.2.1-RC1 (2012-05-16)
------------------------------------------------------------------------
- Fix: Change the unit of the sprite-cache size setting from megabytes to megapixels, so it depends on the blitter being used. Also increase it from 64 to 128, and change the name in the cfg file, so everyone gets the new default [FS#5162] (r24252)
- Fix: Do not immediately display error messages from parsing the cfg file, but schedule them for displaying after the GUI is prepared for it [FS#5154] (r24250, r24249, r24248, r24247)
- Fix: Dereferencing uninitialised pointer causing a crash [FS#5159] (r24224)
- Fix: Lag counters were not properly reset when switching states making it possible to get disconnected for lagging when you were not lagging [FS#5166] (r24221)
- Fix: Adopt ICU version detection to also deal with the new versioning scheme since ICU 49 [FS#5182] (r24220)
- Fix: Immediately do the cargo payment on vehicle crashes instead of when they are cleared [FS#5152] (r24219)
- Fix: The confirmation window to abort world generation was hidden during world generation, so actually you could not abort it [FS#5159] (r24214)
- Fix: If a company is taken over or bankrupts, transfer exclusive transport rights to the new owner respectively cancel them (r24204)
- Fix: Make the engine name not overdraw the engine count in the autoreplace GUI (r24203)
- Fix: Make the size of the details in the autoreplace GUI match more the size of the details in the purchase list (r24202)
- Fix: Mark group list dirty when setting/clearing autoreplace for an engine type [FS#5170] (r24201)
- Fix: Invalidate build vehicle windows every month, in case they need resorting due to changed reliabilities [FS#5149] (r24200)
- Fix: If you consider a settings to potentially cause desyncs via NewGRFs and thus disallow changing it in network games, you should probably also sync it to clients (r24193, r24191)
- Fix: Use default value when reading an invalid setting value [FS#5153] (r24192, r24146)
- Fix: [Windows] When going to fullscreen and back, restore to the resolution you were, not to the fullscreen resolution (r24189)
- Fix: [Windows] When changing the basics of a window (fullscreen, 8bpp/32bpp), and a window already exists, it was forced out of maximize mode, and its resolution/position was reset, often causing unwanted side-effects [FS#5151] (r24188)
- Fix: Town radii were not updated immediatelly after construction/destruction of houses, resulting in desyncs [FS#5169] (r24183)
- Fix: The population of a town was computed incorrectly for overridden houses when loading a game (r24182, r24181, r24179)
- Fix: The object name from property A was not displayed in the object GUI [FS#5110] (r24178)
- Fix: The arctic 'shops and offices' used the 'church' sprite in one of its four views [FS#5148] (r24177)
- Fix: The object GUI did not draw objects when all objects of a class are disabled (r24176)
- Fix: If you spent hard work on finding an available object ID, you should probably also use it instead of always 0 (r24159)
- Fix: Town producing no cargo at all could spawn passenger subsidies (r24158)
- Fix: The music volume was set too early during startup causing it to be not set correctly (r24155)
- Fix: [Squirrel] Crash when trying to create an array with negative size [FS#5160] (r24153)
- Fix: [NoAI] Do not return the last 'cached' speed of vehicles when they are stopped/crashed [FS#5157] (r24152)
- Fix: [Script] Typo in script documentation (r24151)
- Fix: Glass-sprite of bubble-generator was not drawn anymore for completely constructed tiles [FS#5143] (r24107)
- Fix: Conflicting strategies for resizing the main toolbar and statusbar after resizing the main window [FS#5136] (r24089)
- Fix: Significantly reduce the area that is redrawn for text effects [FS#5103] (r24068)
- Fix: Do not redraw up to 25% of the map when making a new vehicle visible for the first time (r24067)
- Fix: Do not redraw the text effect when nothing changed (r24066)
1.2.0 (2012-04-15)
------------------------------------------------------------------------
- Fix: When starting GS or AI, always use the settings of the game, not the new-game settings [FS#5142] (r24108)
- Fix: Provide translated comments in the desktop file without language name postfix (r24100)
- Fix: Cloning orders of aircraft with limited range failed [FS#5131] (r24086)
1.2.0-RC4 (2012-04-01)
------------------------------------------------------------------------
- Fix: Reversing trains while they were entering or leaving a depot could lead to stuck trains [FS#5093] (r24078, r24071)
- Fix: The 'last joined' server was not properly selected anymore [FS#5098] (r24070)
- Fix: Immediately start querying the last joined server instead of waiting for the requery loop [FS#5097] (r24069, r24062)
- Fix: Make the full snowedness level of houses the same as roads and rails [FS#5121] (r24064)
- Fix: With certain versions of GCC and compiler flags the compiler could reorder some code badly causing the 32bpp depot flag not working [FS#5125] (r24063)
- Fix: Do not freeze aircraft mid-flight when skipping to an out-of-range destination [FS#5123] (r24060)
- Fix: Wrong numbering of string parameters causing wrong capacities to be shown [FS#5124] (r24058)
- Fix: Crash when timetabling a maximum travel speed of 0 [FS#5111] (r24053)
- Fix: [NewGRF] Imported GRF sounds were inserted into the wrong slots [FS#5107] (r24052)
- Fix: [NewGRF] Realsprites inside the action 11 block were not skipped correctly (r24050)
- Fix: Improve error messages for the placement restrictions of banks, water towers and toy shops [FS#5095] (r24040)
1.2.0-RC3 (2012-03-18)
------------------------------------------------------------------------
- Feature: Allow display of baseset textfiles (r24037)
- Feature: Increase the station class limit from 32 to 256 (r24031)
- Fix: After opening a text window with the monospaced font, all other text started glitching (r24038)
- Fix: [NoAI] Reset 'is random' status of temporary variable during saveload as it is not always written to when loading an AI which means it wouldd be taking the 'is random' setting of another AI (r24033)
- Fix: [NoAI] Make AIEngine::IsArticulated return true if the articulated callback flag is set, do not try to run the callback (r24029)
- Fix: Pass cases down into the list of cargos [FS#5090] (r24024, r24023, r24022)
1.2.0-RC2 (2012-03-04)
------------------------------------------------------------------------
- Fix: [Script] AI used in names in API for GSOrder [FS#5088] (r24006)
@@ -398,7 +46,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)

View File

@@ -164,7 +164,7 @@ set_default() {
with_ccache
with_grfcodec
with_nforenum
CC CXX CFLAGS CXXFLAGS LDFLAGS CFLAGS_BUILD CXXFLAGS_BUILD LDFLAGS_BUILD"
CC CXX CFLAGS CXXFLAGS LDFLAGS"
}
detect_params() {
@@ -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,6 @@ 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";;
--ignore-extra-parameters) ignore_extra_parameters="1";;
@@ -1303,8 +1299,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 +1346,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]
@@ -1396,11 +1386,11 @@ make_compiler_cflags() {
make_cflags_and_ldflags() {
# General CFlags for BUILD
CFLAGS_BUILD="$CFLAGS_BUILD"
CFLAGS_BUILD=""
# Special CXXFlags for BUILD
CXXFLAGS_BUILD="$CXXFLAGS_BUILD"
CXXFLAGS_BUILD=""
# LDFLAGS for BUILD
LDFLAGS_BUILD="$LDFLAGS_BUILD"
LDFLAGS_BUILD=""
# FEATURES for BUILD (lto)
FEATURES_BUILD=""
# General CFlags for HOST
@@ -1434,6 +1424,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 +1444,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 +1478,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
@@ -1790,7 +1771,6 @@ make_cflags_and_ldflags() {
if [ "$enable_assert" = "0" ]; then
CFLAGS="$CFLAGS -DNDEBUG"
CFLAGS_BUILD="$CFLAGS_BUILD -DNDEBUG"
fi
if [ "$enable_desync_debug" != "0" ]; then
@@ -1826,9 +1806,6 @@ make_cflags_and_ldflags() {
fi
fi
log 1 "using CFLAGS_BUILD... $CFLAGS_BUILD"
log 1 "using CXXFLAGS_BUILD... $CXXFLAGS_BUILD"
log 1 "using LDFLAGS_BUILD... $LDFLAGS_BUILD"
log 1 "using CFLAGS... $CFLAGS"
log 1 "using CXXFLAGS... $CXXFLAGS"
log 1 "using LDFLAGS... $LIBS $LDFLAGS"
@@ -2153,30 +2130,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 +2815,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 +2864,13 @@ detect_icu() {
version=`$icu_config --version 2>/dev/null`
ret=$?
check_version '3.6' "$version"
version_ok=$?
shortversion=`echo $version | cut -c 1,3`
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 +3120,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 +3162,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 +3599,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."

44
docs/32bpp.txt Normal file
View File

@@ -0,0 +1,44 @@
32bpp and OpenTTD
Last updated: 2007-06-13
------------------------------------------------------------------------
Table of contents
-----------------
1.0) About
2.0) The format
1.0) About
---- -----
OpenTTD has 32bpp support. This means: OpenTTD still is 8bpp, but it has the
posibility to override the graphics with 32bpp. This means that it isn't a
replacement of grf or newgrf, but simply an addition. If you want to use 32bpp
graphics of a newgrf, you do need the newgrf itself too (with 8bpp graphics).
2.0) The format
---- ----------
32bpp images are stored in PNG. They should go in:
data/sprites/<grfname>/<SpriteID>.png
For example, a grfname would be 'openttd' (without .grf, lowercase), and the
SpriteID 3, to override the 3rd sprite in openttd.grf with a 32bpp version.
The format of this PNG can be almost anything, but we advise to use RGBA
format. Alpha-channel is fully supported.
As the core of OpenTTD is 8bpp, and because you of course want company colours
in your images, you will need to add a mask for every sprite that needs colour
remapping. The name is simular as above, only you have to put a 'm' behind the
SpriteID. This image should be a 8bpp palette image, where the palette is the
OpenTTD palette. Upon load of the PNG, the mask is loaded too, and overrides
the RGB (not the Alpha) of the original PNG image, and replacing it with a
8bpp color remapped and converted to 32bpp.
Another thing that OpenTTD needs in your png, is 2 tEXt chunks: x_offs and
y_offs. This to define the x- and y-offset, of course. Use the tool we supply
to add this information. Sadly enough most graphical editors trashes those
chunks upon save, so you have to readd it every time you save your image.
Your images should be the same as the grf, in size.

View File

@@ -1,6 +1,6 @@
OpenTTD's known bugs
Last updated: 2012-06-01
Release version: 1.2.1
Last updated: 2012-03-04
Release version: 1.2.0-RC2
------------------------------------------------------------------------

View File

@@ -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

View File

@@ -1,13 +0,0 @@
# $Id: openttd.desktop.translation.awk 19884 2010-05-22 19:59:37Z rubidium $
# 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/>.
#
# Awk script to automatically remove duplicate Comment[i]= lines
#
BEGIN { FS = "="; last = "" }
{ if (last != $1) { print $0 }; last = $1 }

View File

@@ -6,10 +6,10 @@
# 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/>.
#
# Awk script to automatically generate a comment lines for
# a translated desktop shortcut. If it does not exist there
# Awk script to automatically generate a single comment line
# for a translated desktop shortcut. If it does not exist there
# is no output.
#
/##isocode/ { lang = $2; next }
/STR_DESKTOP_SHORTCUT_COMMENT/ { sub("^[^:]*:", "", $0); print "Comment[" lang "]=" $0; sub("_.*", "", lang); print "Comment[" lang "]=" $0; next}
/STR_DESKTOP_SHORTCUT_COMMENT/ { sub("^[^:]*:", "", $0); print "Comment[" lang "]=" $0; next}

View File

@@ -1,81 +1,3 @@
openttd (1.3.0~RC2) unstable; urgency=low
* New upstream release 1.3.0-RC2
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 05 Mar 2013 00:00:00 +0100
openttd (1.3.0~RC1) unstable; urgency=low
* New upstream release 1.3.0-RC1
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 19 Feb 2013 00:00:00 +0100
openttd (1.3.0~beta2) unstable; urgency=low
* New upstream release 1.3.0-beta2
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 07 Feb 2013 00:00:00 +0100
openttd (1.3.0~beta1) unstable; urgency=low
* New upstream release 1.3.0-beta1
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 24 Dec 2012 00:00:00 +0100
openttd (1.2.3) unstable; urgency=low
* New upstream release 1.2.3
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 01 Nov 2012 00:00:00 +0200
openttd (1.2.3~RC1) unstable; urgency=low
* New upstream release 1.2.3-RC1
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 17 Oct 2012 00:00:00 +0200
openttd (1.2.2) unstable; urgency=low
* New upstream release 1.2.2
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 16 Aug 2012 20:00:00 +0200
openttd (1.2.2~RC1) unstable; urgency=low
* New upstream release 1.2.2-RC1
-- 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
-- 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
-- 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
-- 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
-- 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
-- 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

Binary file not shown.

View File

@@ -1,6 +1,6 @@
@echo off
set OPENTTD_VERSION=1.3.0-RC2
set OPENTTD_VERSION=1.2.0-RC2
set OPENSFX_VERSION=0.8.0
set NOSOUND_VERSION=0.8.0
set OPENGFX_VERSION=1.2.0

View File

@@ -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

View File

@@ -1,8 +1,8 @@
# Version numbers to update
!define APPV_MAJOR 1
!define APPV_MINOR 3
!define APPV_MINOR 2
!define APPV_MAINT 0
!define APPV_BUILD 3
!define APPV_BUILD 5
!define APPV_EXTRA "-RC2"
!define APPNAME "OpenTTD" ; Define application name
@@ -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
@@ -147,6 +143,9 @@ Section "!OpenTTD" Section1
File ${PATH_ROOT}docs\multiplayer.txt
Push "$INSTDIR\docs\multiplayer.txt"
Call unix2dos
File ${PATH_ROOT}docs\32bpp.txt
Push "$INSTDIR\docs\32bpp.txt"
Call unix2dos
; Copy the rest of the stuff
SetOutPath "$INSTDIR\"
@@ -218,6 +217,7 @@ Section "!OpenTTD" Section1
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Known-bugs.lnk" "$INSTDIR\known-bugs.txt"
CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Docs"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Docs\Multiplayer.lnk" "$INSTDIR\docs\multiplayer.txt"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Docs\32bpp.lnk" "$INSTDIR\docs\32bpp.txt"
CreateDirectory "$SMPROGRAMS\$SHORTCUTS\Scripts"
CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Scripts\Readme.lnk" "$INSTDIR\scripts\readme.txt"
!insertmacro MUI_STARTMENU_WRITE_END
@@ -402,9 +402,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 +473,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"

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 &quot;$(InputPath)&quot;&#x0D;&#x0A;exit 0&#x0D;&#x0A;"
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
Outputs="..\bin\lang\basque.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\belarusian.txt"
>

View File

@@ -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 &quot;$(InputPath)&quot;&#x0D;&#x0A;exit 0&#x0D;&#x0A;"
AdditionalDependencies="..\src\lang\english.txt;..\objs\strgen\strgen.exe"
Outputs="..\bin\lang\basque.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\belarusian.txt"
>

View File

@@ -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" />

View File

@@ -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>

View File

@@ -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"
>

View File

@@ -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"
>

View File

@@ -1,6 +1,6 @@
OpenTTD readme
Last updated: 2013-03-05
Release version: 1.3.0-RC2
Last updated: 2012-03-04
Release version: 1.2.0-RC2
------------------------------------------------------------------------
@@ -80,10 +80,8 @@ After you have done all that you can report the bug. Please include the
following information in your bug report:
* OpenTTD version (PLEASE test the latest SVN/nightly build)
* Bug details, including instructions how to reproduce it
* Platform (Windows, Linux, FreeBSD, ...) and compiler (including version) if
* Platform (Win32, Linux, FreeBSD, ...) and compiler (including version) if
you compiled OpenTTD yourself.
* The processor architecture of your OS (32 bits Windows, 64 bits Windows,
Linux on an ARM, Mac OS X on a PowerPC, ...)
* Attach a saved game *and* a screenshot if possible
* If this bug only occurred recently please note the last version without
the bug and the first version including the bug. That way we can fix it
@@ -147,9 +145,9 @@ will not be able to reproduce the desync and thus will be unable to fix it.
3.0) Supported platforms
---- -------------------
OpenTTD has been ported to several platforms and operating systems. It should
not be very difficult to port it to a new platform. The currently working
platforms are:
OpenTTD has been ported to several platforms and operating systems. It shouldn't
be very difficult to port it to a new platform. The currently working platforms
are:
BeOS - SDL or Allegro
DOS - Allegro
@@ -170,7 +168,7 @@ be installed, or you have downloaded an installer, which will automatically
extract OpenTTD in the given directory.
OpenTTD looks in multiple locations to find the required data files (described
in section 4.2). Installing any 3rd party files into a 'shared' location has
in section 4.2). Installing any 3rd party files into a "shared" location has
the advantage that you only need to do this step once, rather than copying the
data files into all OpenTTD versions you have.
Savegames, screenshots, etc are saved relative to the config file (openttd.cfg)
@@ -179,16 +177,15 @@ shared directories, savegames will reside in the save/ directory next to the
openttd.cfg file there.
If you want savegames and screenshots in the directory where the OpenTTD binary
resides, simply have your config file in that location. But if you remove this
config file, savegames will still be in this directory (see notes in
section 4.2 'OpenTTD directories')
config file, savegames will still be in this directory (see notes in section 4.2)
OpenTTD comes without AIs, so if you want to play with AIs you have to download
them. The easiest way is via the 'Check Online Content' button in the main menu.
them. The easiest way is via the "Check Online Content" button in the main menu.
You can select some AIs that you think are compatible with your playing style.
Another way is manually downloading the AIs from the forum although then you
need to make sure that you install all the required AI libraries too; they get
automatically selected (and downloaded) if you get the AIs via the 'Check
Online Content'. If you do not have an AI but have configured OpenTTD to start
automatically selected (and downloaded) if you get the AIs via the "Check
Online Content". If you do not have an AI but have configured OpenTTD to start
an AI a message will be shown that the 'dummy' AI has been started.
4.1) (Required) 3rd party files
@@ -201,7 +198,7 @@ For OpenTTD you need to acquire some third party data files. For this you have
the choice of using the original Transport Tycoon Deluxe data files or a set
of free data files.
Do NOT copy files included with OpenTTD into 'shared' directories (explained in
Do NOT copy files included with OpenTTD into "shared" directories (explained in
the following sections) as sooner or later you will run into graphical glitches
when using other versions of the game.
@@ -242,7 +239,7 @@ not work.
If you want AIs use the in-game content downloader. If for some reason that is
not possible or you want to use an AI that has not been uploaded to the content
download system download the tar file and place it in the ai/ directory. If the
AI needs libraries you will have to download those too and put them in the
AI needs libraries you'll have to download those too and put them in the
ai/library/ directory. All AIs and AI Libraries that have been uploaded to
the content download system can be found at http://noai.openttd.org/downloads/
The AIs and libraries can be found their in the form of .tar.gz packages.
@@ -250,32 +247,20 @@ OpenTTD can read inside tar files but it does not extract .tar.gz files by
itself.
To figure out which libraries you need for an AI you have to start the AI and
wait for an error message to pop up. The error message will tell you
'could not find library "lib-name"'. Download that library and try again.
4.1.5) Game scripts
------ ------------
If you want an extra challenge in OpenTTD you can download so-called game
scripts via the in-game content downloader. These game scripts have varying
functionality, though they can generally influence town growth, subsidies, add
goals to reach or provide a different ranking system.
If you download a game script manually you have to follow the same rules as for
AIs, except that game scripts are placed in the game/ directory instead of the
ai/ directory.
"couldn't find library 'lib-name'". Download that library and try again.
4.2) OpenTTD directories
---- -------------------
OpenTTD uses its own directory to store its required 3rd party base set files
(see section 4.1 'Required 3rd party files') and non-compulsory extension and
configuration files. See below for their proper place within this OpenTTD main
data directory.
OpenTTD uses its own directory to store its required 3rd party base set files (see section
4.1 "Required 3rd party files") and non-compulsory extension and configuration files. See
below for their proper place within this OpenTTD main data directory.
The main OpenTTD directories can be found in various locations, depending on
your operating system:
The main OpenTTD directories can be found in various locations, depending on your operating
system:
1. The current working directory (from where you started OpenTTD)
For non-Windows operating systems OpenTTD will not scan for files in this
directory if it is your personal directory, i.e. '~/', or when it is the
root directory, i.e. '/'.
directory if it is your personal directory, i.e. "~/", or when it is the
root directory, i.e. "/".
2. Your personal directory
Windows: C:\My Documents\OpenTTD (95, 98, ME)
C:\Documents and Settings\<username>\My Documents\OpenTTD (2000, XP)
@@ -293,13 +278,13 @@ your operating system:
5. The installation directory (Linux only)
Linux: /usr/share/games/openttd
6. The application bundle (Mac OSX only)
It includes the OpenTTD files (grf+lng) and it will work as long as they
are not touched
It includes the OpenTTD files (grf+lng) and it will work as long as they aren't
touched
Different types of data or extensions go into different subdirectories of the
chosen main OpenTTD directory:
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)
@@ -313,24 +298,21 @@ chosen main OpenTTD directory:
Automatic Savegames: save/autosave
Scenarios: scenario
The (automatically created) directory content_download is for OpenTTD's internal
use and no files should be added to it or its subdirectories manually.
The (automatically created) directory content_download is for OpenTTD's internal use and
no files should be added to it or its subdirectories manually.
Notes:
- Linux in the previous list means .deb, but most paths should be similar for
others.
- Linux in the previous list means .deb, but most paths should be similar for others.
- The previous search order is also used for NewGRFs and openttd.cfg.
- If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3,
5 order.
- If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3, 5 order.
- Savegames will be relative to the config file only if there is no save/
directory in paths with higher priority than the config file path, but
autosaves and screenshots will always be relative to the config file.
The preferred setup:
Place 3rd party files in shared directory (or in personal directory if you do
not have write access on shared directory) and have your openttd.cfg config
file in personal directory (where the game will then also place savegames and
screenshots).
Place 3rd party files in shared directory (or in personal directory if you don't
have write access on shared directory) and have your openttd.cfg config file in
personal directory (where the game will then also place savegames and screenshots).
4.3) Portable installations (portable media)
---- ---------------------------------------
@@ -352,10 +334,12 @@ makes it easy to bundle files belonging to the same script, NewGRF or base
set. Music sets are the only exception as they cannot be stored in a tar
file due to being played by external applications.
OpenTTD sees each tar archive as the 'root' of its search path. This means that
having a file with the same path in two different tar files means that one
cannot be opened, after all only one file will be found first. As such it is
advisable to put an uniquely named folder in the root of the tar and put all the
OpenTTD sees each tar archive as the 'root' of its search path. This means
that having a file with the same path in two different tar files means that
one cannot be opened, after all only one file will be found first. This is
done to make it possible to have the large 32bpp zoomed graphics in a separate
file to the (relatively small) unzoomed 8bpp NewGRF. As such it is advisable
to put an uniquely named folder in the root of the tar and put all the
content in that folder. For example, all downloaded content has a path that
concatenates the name of the content and the version, which makes the path
unique. For custom tar files it is advised to do this as well.
@@ -421,7 +405,7 @@ OpenTTD in debug mode.
6.0) Configuration file
---- ------------------
The configuration file for OpenTTD (openttd.cfg) is in a simple Windows-like
.INI format. It is mostly undocumented. Almost all settings can be changed
.INI format. It's mostly undocumented. Almost all settings can be changed
ingame by using the 'Advanced Settings' window.
When you cannot find openttd.cfg you should look in the directories as
described in section 4.2. If you do not have an openttd.cfg OpenTTD will
@@ -445,24 +429,24 @@ Windows:
Please read the Makefile for more information.
Solaris, FreeBSD, OpenBSD:
Use 'gmake', but do a './configure' before the first build.
Use "gmake", but do a "./configure" before the first build.
Linux/Unix:
OpenTTD can be built with GNU 'make'. On non-GNU systems it is called 'gmake'.
However, for the first build one has to do a './configure' first.
OpenTTD can be built with GNU "make". On non-GNU systems it's called "gmake".
However, for the first build one has to do a "./configure" first.
MacOS X:
Use 'make' or Xcode (which will then call make for you)
Use "make" or Xcode (which will then call make for you)
This will give you a binary for your CPU type (PPC/Intel)
However, for the first build one has to do a './configure' first.
To make a universal binary type './configure --enabled-universal'
instead of './configure'.
However, for the first build one has to do a "./configure" first.
To make a universal binary type "./configure --enabled-universal"
instead of "./configure".
BeOS:
Use 'make', but do a './configure' before the first build.
Use "make", but do a "./configure" before the first build.
MorphOS:
Use 'make'. However, for the first build one has to do a './configure' first.
Use "make". However, for the first build one has to do a "./configure" first.
Note that you need the MorphOS SDK, latest libnix updates (else C++ parts of
OpenTTD will not build) and the powersdl.library SDK. Optionally libz,
libpng and freetype2 developer files.
@@ -474,7 +458,7 @@ OS/2:
DOS:
A build environment with DJGPP is needed as well as libraries such as
Allegro, zlib and libpng, which all can be downloaded from the DJGPP
website. Compilation is straight forward: use make, but do a './configure'
website. Compilation is straight forward: use make, but do a "./configure"
before the first build. The build binary will need cwsdpmi.exe to be in
the same directory as the openttd executable. cwsdpmi.exe can be found in
the os/dos subdirectory. If you compile with stripping turned on a binary
@@ -505,7 +489,7 @@ To recompile the extra graphics needed to play with the original Transport
Tycoon Deluxe graphics you need GRFCodec (which includes NFORenum) as well.
GRFCodec can be found at: http://www.openttd.org/download-grfcodec
The compilation of these extra graphics does generally not happen, unless
you remove the graphics file using 'make maintainer-clean'.
you remove the graphics file using "make maintainer-clean".
7.2) Supported compilers
---- -------------------
@@ -553,7 +537,7 @@ someone else may have already started translating to the same language.
8.1) Translation
---- -----------
So, now that you have notified the development team about your intention to
So, now that you've notified the development team about your intention to
translate (You did, right? Of course you did.) you can pick up english.txt
(found in the SVN repository under /src/lang) and translate.
@@ -587,17 +571,17 @@ Any missing strings are replaced with the English strings. Note that it looks
for english.txt in the lang subdirectory, which is where your language file
should also be.
That is all! You should now be able to select the language in the game options.
That's all! You should now be able to select the language in the game options.
9.0) Troubleshooting
---- ---------------
To see all startup options available to you, start OpenTTD with the
'./openttd -h' option. This might help you tweak some of the settings.
"./openttd -h" option. This might help you tweak some of the settings.
If the game is acting strange and you feel adventurous you can try the
'-d [[<name>=]<level>]' flag, where the higher levels will give you more
debugging output. The 'name' variable can help you to display only some type of
"-d [[<name>]=[<level>]" flag, where the higher levels will give you more
debugging output. The "name" variable can help you to display only some type of
debugging messages. This is mostly undocumented so best is to look in the
source code file debug.c for the various debugging types. For more information
look at http://wiki.openttd.org/index.php/Command_line.
@@ -620,17 +604,17 @@ and add a suitable font for the small, medium and / or large font, e.g.:
small_font = "Tahoma"
medium_font = "Tahoma"
large_font = "Tahoma"
You should use a font name like 'Tahoma' or a path to the desired font.
You should use a font name like "Tahoma" or a path to the desired font.
Any NewGRF file used in a game is stored inside the savegame and will refuse
to load if you do not have that NewGRF file available. A list of missing files
to load if you don't have that NewGRF file available. A list of missing files
can be viewed in the NewGRF window accessible from the file load dialogue window.
You can try to obtain the missing files from that NewGRF dialogue or - if they
are not available online - you can search manually through our forum's graphics
development section (http://www.tt-forums.net/viewforum.php?f=66) or GrfCrawler
(http://grfcrawler.tt-forums.net/). Put the NewGRF files in OpenTTD's newgrf folder
(see section 4.2 'OpenTTD directories') and rescan the list of available NewGRFs.
(see section 4.2 "OpenTTD directories") and rescan the list of available NewGRFs.
Once you have all missing files, you are set to go.
@@ -650,7 +634,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 +653,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

View File

@@ -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

View File

@@ -210,22 +210,16 @@ static SQInteger base_suspend(HSQUIRRELVM v)
static SQInteger base_array(HSQUIRRELVM v)
{
SQArray *a;
SQInteger nInitialSize = tointeger(stack_get(v,2));
SQInteger ret = 1;
if (nInitialSize < 0) {
v->Raise_Error(_SC("can't create/resize array with/to size %d"), nInitialSize);
nInitialSize = 0;
ret = -1;
}
SQObject &size = stack_get(v,2);
if(sq_gettop(v) > 2) {
a = SQArray::Create(_ss(v),0);
a->Resize(nInitialSize,stack_get(v,3));
a->Resize(tointeger(size),stack_get(v,3));
}
else {
a = SQArray::Create(_ss(v),nInitialSize);
a = SQArray::Create(_ss(v),tointeger(size));
}
v->Push(a);
return ret;
return 1;
}
static SQInteger base_type(HSQUIRRELVM v)

View File

@@ -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(')'));

View File

@@ -1190,7 +1190,7 @@ bool SQVM::CallNative(SQNativeClosure *nclosure,SQInteger nargs,SQInteger stackb
throw;
}
_callsstacksize = cstksize;
assert(cstksize == _callsstacksize);
_nnativecalls--;
suspend = false;

View File

@@ -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);

View File

@@ -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();
}
}

View File

@@ -39,7 +39,7 @@
/* Clients shouldn't start AIs */
if (_networking && !_network_server) return;
AIConfig *config = AIConfig::GetConfig(company, AIConfig::SSS_FORCE_GAME);
AIConfig *config = AIConfig::GetConfig(company);
AIInfo *info = config->GetInfo();
if (info == NULL || (rerandomise_ai && config->IsRandom())) {
info = AI::scanner_info->SelectRandomAI();
@@ -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++) {
@@ -304,7 +283,7 @@
{
/* Find the first company which doesn't exist yet */
for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
if (!Company::IsValidID(c)) return AIConfig::GetConfig(c, AIConfig::SSS_FORCE_GAME)->GetSetting("start_date");
if (!Company::IsValidID(c)) return AIConfig::GetConfig(c)->GetSetting("start_date");
}
/* Currently no AI can be started, check again in a year. */
@@ -373,14 +352,3 @@
}
#endif /* defined(ENABLE_NETWORK) */
/* static */ AIScannerInfo *AI::GetScannerInfo()
{
return AI::scanner_info;
}
/* static */ AIScannerLibrary *AI::GetScannerLibrary()
{
return AI::scanner_library;
}

View File

@@ -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"
@@ -122,13 +118,13 @@ struct AIListWindow : public Window {
int y = this->GetWidget<NWidgetBase>(WID_AIL_LIST)->pos_y;
/* First AI in the list is hardcoded to random */
if (this->vscroll->IsVisible(0)) {
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y + WD_MATRIX_TOP, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_ORANGE);
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_LEFT, y + WD_MATRIX_TOP, this->slot == OWNER_DEITY ? STR_AI_CONFIG_NONE : STR_AI_CONFIG_RANDOM_AI, this->selected == -1 ? TC_WHITE : TC_BLACK);
y += this->line_height;
}
ScriptInfoList::const_iterator it = this->info_list->begin();
for (int i = 1; it != this->info_list->end(); i++, it++) {
if (this->vscroll->IsVisible(i)) {
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, (*it).second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_ORANGE);
DrawString(r.left + WD_MATRIX_LEFT, r.right - WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, (*it).second->GetName(), (this->selected == i - 1) ? TC_WHITE : TC_BLACK);
y += this->line_height;
}
}
@@ -155,7 +151,7 @@ struct AIListWindow : public Window {
y += FONT_HEIGHT_NORMAL + WD_PAR_VSEP_NORMAL;
}
SetDParamStr(0, selected_info->GetDescription());
DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, r.bottom - WD_FRAMERECT_BOTTOM, STR_JUST_RAW_STRING, TC_WHITE);
DrawStringMultiLine(r.left + WD_FRAMETEXT_LEFT, r.right - WD_FRAMETEXT_RIGHT, y, r.bottom - WD_FRAMERECT_BOTTOM, STR_JUST_RAW_STRING, TC_BLACK);
}
break;
}
@@ -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)
@@ -438,55 +431,18 @@ struct AISettingsWindow : public Window {
const ScriptConfigItem config_item = **it;
if (_game_mode == GM_NORMAL && ((this->slot == OWNER_DEITY) || Company::IsValidID(this->slot)) && (config_item.flags & SCRIPTCONFIG_INGAME) == 0) return;
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)) {
int new_val = old_val;
if (IsInsideMM(x, 0, 21)) {
int new_val = this->ai_config->GetSetting(config_item.name);
int old_val = new_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,10 +458,13 @@ 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);
this->clicked_row = num;
SetDParam(0, this->ai_config->GetSetting(config_item.name));
ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, this, CS_NUMERAL, QSF_NONE);
}
this->SetDirty();
@@ -533,27 +492,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 +545,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 +567,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 +641,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 +879,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 +895,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 +905,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 +919,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 +958,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 +1021,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 +1121,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 +1172,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 +1270,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 +1277,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 +1289,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 +1306,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 +1333,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);
}
/**

View File

@@ -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();

View File

@@ -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)

View File

@@ -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()
@@ -202,7 +222,7 @@ void AIInstance::Died()
ShowAIDebugWindow(_current_company);
const AIInfo *info = AIConfig::GetConfig(_current_company, AIConfig::SSS_FORCE_GAME)->GetInfo();
const AIInfo *info = AIConfig::GetConfig(_current_company)->GetInfo();
if (info != NULL) {
ShowErrorMessage(STR_ERROR_AI_PLEASE_REPORT_CRASH, INVALID_STRING_ID, WL_WARNING);

View File

@@ -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 */

View File

@@ -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.
*/

View File

@@ -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,15 +76,8 @@ 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
{
assert(this->IsPrimaryVehicle());
return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile);
}
bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); }
bool Tick();
void OnNewDay();
uint Crash(bool flooded = false);

View File

@@ -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();
@@ -376,7 +365,7 @@ bool Aircraft::FindClosestDepot(TileIndex *location, DestinationID *destination,
static void CheckIfAircraftNeedsService(Aircraft *v)
{
if (Company::Get(v->owner)->settings.vehicle.servint_aircraft == 0 || !v->NeedsAutomaticServicing()) return;
if (v->IsChainInDepot()) {
if (v->IsInDepot()) {
VehicleServiceInDepot(v);
return;
}
@@ -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;
@@ -1902,7 +1894,7 @@ static bool AircraftEventHandler(Aircraft *v, int loop)
if (v->current_order.IsType(OT_LOADING) || v->current_order.IsType(OT_LEAVESTATION)) return true;
if (v->state >= ENDTAKEOFF && v->state <= HELIENDLANDING) {
if (v->state == FLYING) {
/* If we are flying, unconditionally clear the 'dest too far' state. */
AircraftHandleDestTooFar(v, false);
} else if (v->acache.cached_max_range_sqr != 0) {

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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)
);

View File

@@ -54,21 +54,11 @@ static EngineID GetNextArticulatedPart(uint index, EngineID front_type, Vehicle
return GetNewEngineID(front_engine->GetGRF(), front_engine->type, callback);
}
/**
* Does a NewGRF report that this should be an articulated vehicle?
* @param engine_type The engine to check.
* @return True iff the articulated engine callback flag is set.
*/
bool IsArticulatedEngine(EngineID engine_type)
{
return HasBit(EngInfo(engine_type)->callback_mask, CBM_VEHICLE_ARTIC_ENGINE);
}
/**
* 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 +88,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 +103,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
*/

View File

@@ -23,7 +23,6 @@ uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, bool include_initial_car
uint32 GetIntersectionOfArticulatedRefitMasks(EngineID engine, bool include_initial_cargo_type);
bool IsArticulatedVehicleCarryingDifferentCargoes(const Vehicle *v, CargoID *cargo_type);
bool IsArticulatedVehicleRefittable(EngineID engine);
bool IsArticulatedEngine(EngineID engine_type);
void CheckConsistencyOfArticulatedVehicle(const Vehicle *v);

View File

@@ -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);

View File

@@ -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() {}

View File

@@ -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);
@@ -660,7 +662,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
CommandCost ret = CheckOwnership(v->owner);
if (ret.Failed()) return ret;
if (!v->IsChainInDepot()) return CMD_ERROR;
if (!v->IsInDepot()) return CMD_ERROR;
if (v->vehstatus & VS_CRASHED) return CMD_ERROR;
bool free_wagon = false;
@@ -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);
@@ -697,7 +699,7 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
if (!was_stopped) cost.AddCost(CmdStartStopVehicle(v, true));
if (cost.Failed()) return cost;
assert(free_wagon || v->IsStoppedInDepot());
assert(v->IsStoppedInDepot());
/* We have to construct the new vehicle chain to test whether it is valid.
* Vehicle construction needs random bits, so we have to save the random seeds
@@ -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,15 +760,12 @@ 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);
}
if (flags & DC_EXEC) GroupStatistics::UpdateAutoreplace(_current_company);
if ((flags & DC_EXEC) && IsLocalCompany()) InvalidateAutoreplaceWindow(old_engine_type, id_g);
return cost;

View File

@@ -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);
}
/**

View File

@@ -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"
@@ -34,7 +33,7 @@ void DrawEngineList(VehicleType type, int x, int r, int y, const GUIEngineList *
static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
{
int r = Engine::Get(*a)->list_position - Engine::Get(*b)->list_position;
int r = ListPositionOfEngine(*a) - ListPositionOfEngine(*b);
return r;
}
@@ -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()
@@ -544,11 +493,11 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_RV_RIGHT_SCROLLBAR),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(240, 122), SetResize(1, 0), EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_LEFT_DETAILS), SetMinimalSize(228, 102), SetResize(1, 0), EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY, WID_RV_RIGHT_DETAILS), SetMinimalSize(228, 102), 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),
@@ -564,9 +513,9 @@ static const NWidgetPart _nested_replace_rail_vehicle_widgets[] = {
};
static const WindowDesc _replace_rail_vehicle_desc(
WDP_AUTO, 500, 140,
WDP_AUTO, 456, 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)
);

View File

@@ -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);
}

View File

@@ -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 */

View File

@@ -15,8 +15,6 @@
#include "fileio_func.h"
#include "core/smallmap_type.hpp"
#include "gfx_type.h"
#include "textfile_type.h"
#include "textfile_gui.h"
/* Forward declare these; can't do 'struct X' in functions as older GCCs barf on that */
struct IniFile;
@@ -145,22 +143,6 @@ struct BaseSet {
{
return file->CheckMD5(subdir, SIZE_MAX);
}
/**
* Search a textfile file next to this base media.
* @param type The type of the textfile to search for.
* @return The filename for the textfile, \c NULL otherwise.
*/
const char *GetTextfile(TextfileType type) const
{
for (uint i = 0; i < NUM_FILES; i++) {
const char *textfile = ::GetTextfile(type, BASESET_DIR, this->files[i].filename);
if (textfile != NULL) {
return textfile;
}
}
return NULL;
}
};
/**
@@ -201,8 +183,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 +199,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 {

View File

@@ -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();

View File

@@ -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

View File

@@ -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--) {

View File

@@ -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);

View File

@@ -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);

View File

@@ -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));
}
};

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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.

View File

@@ -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"; }

View File

@@ -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. */

View File

@@ -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.

View File

@@ -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);
}

View File

@@ -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[] = {
@@ -99,7 +98,7 @@ static CargoID _last_filter_criteria[] = {CF_ANY, CF_ANY, CF_ANY, CF_ANY};
*/
static int CDECL EngineNumberSorter(const EngineID *a, const EngineID *b)
{
int r = Engine::Get(*a)->list_position - Engine::Get(*b)->list_position;
int r = ListPositionOfEngine(*a) - ListPositionOfEngine(*b);
return _internal_sort_order ? -r : r;
}
@@ -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,26 @@ 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);
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 count_left = l;
int count_right = rtl ? text_left : r - WD_FRAMERECT_RIGHT - replace_icon.width - 8;
int text_left = l + (rtl ? WD_FRAMERECT_LEFT : sprite_width);
int text_right = r - (rtl ? sprite_width : 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 +897,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);
DrawString(text_left, text_right, y + small_text_y_offset, STR_TINY_BLACK_COMA, TC_FROMSTRING, SA_RIGHT);
}
}
}
@@ -967,7 +954,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);
@@ -1099,7 +1086,7 @@ struct BuildVehicleWindow : Window {
this->sel_engine = sel_id;
/* make engines first, and then wagons, sorted by selected sort_criteria */
/* make engines first, and then wagons, sorted by ListPositionOfEngine() */
_internal_sort_order = false;
EngList_Sort(&this->eng_list, TrainEnginesThenWagonsSorter);
@@ -1407,7 +1394,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)
);

View File

@@ -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;
}
}

View File

@@ -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 */

View File

@@ -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 {

View File

@@ -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());
}
}

View File

@@ -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 */

View File

@@ -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)
);

View File

@@ -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. */

View File

@@ -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)

View File

@@ -91,7 +91,6 @@ CommandCallback CcGame;
/* group_gui.cpp */
CommandCallback CcCreateGroup;
CommandCallback CcAddVehicleNewGroup;
/* industry_gui.cpp */
CommandCallback CcBuildIndustry;

View File

@@ -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)
};

View File

@@ -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).

View File

@@ -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;
}
}

View File

@@ -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 */

View File

@@ -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)
);

View File

@@ -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

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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);
}
/**

View File

@@ -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')
*/

Some files were not shown because too many files have changed in this diff Show More