mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-08-14 10:09:11 +00:00
Compare commits
126 Commits
0.7.0-beta
...
0.7.2
Author | SHA1 | Date | |
---|---|---|---|
|
5a5c02f55d | ||
|
f39f14aceb | ||
|
a86469d6bc | ||
|
d567f99ecf | ||
|
969d538026 | ||
|
5cde77086d | ||
|
6d8d781d5c | ||
|
08dc96571a | ||
|
a123484ee0 | ||
|
3edbb1a543 | ||
|
893bccf4c8 | ||
|
a97240dede | ||
|
876d064c4d | ||
|
660fe672e8 | ||
|
b49c6e0cbd | ||
|
0ffca06944 | ||
|
024aa14f94 | ||
|
2d454f37f0 | ||
|
a00a4b5ad8 | ||
|
b1d2a8876b | ||
|
253702529d | ||
|
65c5e26913 | ||
|
9456d20800 | ||
|
7ccaa82206 | ||
|
02f3d2d8af | ||
|
7742f8c080 | ||
|
ba01583ce3 | ||
|
498e5989d1 | ||
|
ab7b117c50 | ||
|
085b498c28 | ||
|
30eff93341 | ||
|
139a213d4d | ||
|
06c45d6fe5 | ||
|
8446d6b8c2 | ||
|
9676072298 | ||
|
2db7e3a0a8 | ||
|
1e9fd18e6a | ||
|
909af50aaa | ||
|
07a16f9282 | ||
|
28e7981a5b | ||
|
f7cc97fe5c | ||
|
d9ed2d380f | ||
|
60901368cc | ||
|
9f5e690118 | ||
|
2fbd7ff6cc | ||
|
1595413545 | ||
|
76b2e1c5ab | ||
|
7e1385b6eb | ||
|
4ec28e1ba7 | ||
|
30afba1d10 | ||
|
61e97110c9 | ||
|
9e592b9986 | ||
|
de7a4a4006 | ||
|
53dc1a89da | ||
|
42e0a5d2ca | ||
|
deab21114e | ||
|
64dcd8acc5 | ||
|
95cff9979c | ||
|
5648ea3058 | ||
|
9dc98b4c27 | ||
|
36dfa1f21e | ||
|
8585aa71ed | ||
|
af293142fe | ||
|
4f8eeca437 | ||
|
f9def73be6 | ||
|
e9ae5ae307 | ||
|
8761a5a4c4 | ||
|
6e9dc85c76 | ||
|
e5204f96f9 | ||
|
b25a4f8231 | ||
|
d72273d1f3 | ||
|
86a9df82b7 | ||
|
bbb28d210a | ||
|
1f5ad840a4 | ||
|
e0dd907cab | ||
|
40ddc49764 | ||
|
9d018723b7 | ||
|
1692ce8312 | ||
|
aea8e7291e | ||
|
2e6e2457f1 | ||
|
0ca92a47a2 | ||
|
b1479bec02 | ||
|
fa35dc10e5 | ||
|
40745dc0d9 | ||
|
42d9816ce3 | ||
|
27bcfd115b | ||
|
4129b418cc | ||
|
e6353a1a22 | ||
|
070320f25b | ||
|
38d66e82e2 | ||
|
2adbf67968 | ||
|
eb0d43aadd | ||
|
f6e4bc765a | ||
|
af18469455 | ||
|
5c40b7235c | ||
|
afe547448e | ||
|
684d1c4d4c | ||
|
0f361aab6e | ||
|
d5a2dc1d0b | ||
|
9dbf8a163f | ||
|
8ed58f2b94 | ||
|
bd2e1ac903 | ||
|
3d780608a2 | ||
|
cef662825b | ||
|
9eef8f77e2 | ||
|
84e5e44ca9 | ||
|
55ce735c2c | ||
|
c2834412f7 | ||
|
7f650197d7 | ||
|
f67e2a41ce | ||
|
cf21547814 | ||
|
655b0ccc2e | ||
|
48c8cdfd84 | ||
|
a471321b1b | ||
|
308dbcf822 | ||
|
fb2ea6c9ed | ||
|
66e0fcdd01 | ||
|
bdab37b11a | ||
|
2b0b9a6367 | ||
|
13fb01d07d | ||
|
da0cbb2a2f | ||
|
fa78027ffd | ||
733c0c5c5b | |||
|
f45e3b3068 | ||
|
d6f2a65323 | ||
0564d52d99 |
2
Doxyfile
2
Doxyfile
@@ -1,7 +1,7 @@
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
PROJECT_NAME = openttd
|
||||
PROJECT_NAME = OpenTTD
|
||||
OUTPUT_DIRECTORY = docs/source/
|
||||
CREATE_SUBDIRS = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
|
@@ -93,7 +93,7 @@ ifeq ($(shell if test -f config.cache; then echo 1; fi), 1)
|
||||
@echo " Going to reconfigure with last known settings..."
|
||||
@echo "----------------"
|
||||
# Make sure we don't lock config.cache
|
||||
@$(shell cat config.cache | sed 's~\\ ~\\\\ ~g') || exit 1
|
||||
@$(shell cat config.cache | sed 's@\\ @\\\\ @g') || exit 1
|
||||
@echo "----------------"
|
||||
@echo "Reconfig done. Please re-execute make."
|
||||
@echo "----------------"
|
||||
|
@@ -19,8 +19,8 @@ BIN_DIR = "$(ROOT_DIR)/bin"
|
||||
SRC_DIR = "$(ROOT_DIR)/src"
|
||||
BUNDLE_DIR = "$(ROOT_DIR)/bundle"
|
||||
BUNDLES_DIR = "$(ROOT_DIR)/bundles"
|
||||
TTD = "openttd.exe"
|
||||
TARGET := $(shell echo $(PLATFORM) | sed "s~win64~x64~;s~win32~Win32~")
|
||||
TTD = openttd.exe
|
||||
TARGET := $(shell echo $(PLATFORM) | sed "s@win64@x64@;s@win32@Win32@")
|
||||
|
||||
all:
|
||||
$(Q)cp objs/$(TARGET)/Release/$(TTD) $(BIN_DIR)/$(TTD)
|
||||
|
@@ -4,7 +4,6 @@ CC_BUILD = !!CC_BUILD!!
|
||||
CXX_BUILD = !!CXX_BUILD!!
|
||||
WINDRES = !!WINDRES!!
|
||||
STRIP = !!STRIP!!
|
||||
CC_CFLAGS = !!CC_CFLAGS!!
|
||||
CFLAGS = !!CFLAGS!!
|
||||
CFLAGS_BUILD = !!CFLAGS_BUILD!!
|
||||
LIBS = !!LIBS!!
|
||||
@@ -28,7 +27,6 @@ CFLAGS_MAKEDEP= !!CFLAGS_MAKEDEP!!
|
||||
SORT = !!SORT!!
|
||||
REVISION = !!REVISION!!
|
||||
AWK = !!AWK!!
|
||||
GCC295 = !!GCC295!!
|
||||
CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!!
|
||||
CONFIG_CACHE_LINKER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!!
|
||||
CONFIG_CACHE_ENDIAN = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_ENDIAN!!
|
||||
@@ -53,20 +51,6 @@ CFLAGS_MAKEDEP += -I $(SRC_OBJS_DIR) -I $(LANG_OBJS_DIR) -I $(SCRIPT_SRC_DIR)
|
||||
|
||||
ENDIAN_TARGETS := endian_target.h $(ENDIAN_CHECK)
|
||||
|
||||
# This 'sed' basicly just removes 'const' from the line if it is a 2+D array
|
||||
# For more information, please check:
|
||||
# http://maillist.openttd.org/pipermail/devs/2007-April/000284.html
|
||||
# http://maillist.openttd.org/pipermail/devs/2007-February/000248.html
|
||||
GCC295_FIX=sed -r 's~^(\t*)(.*)( const )([A-Za-z0-9_ ]+(\[.*\]){2,})(( = \{)|(;))(.*)$$~\1\2 \4\6\8\9~g'
|
||||
# This 'sed' removes the 3rd '4' in the # lines of the -E output of
|
||||
# gcc 2.95.3 and lower, as it should indicate that it is a C-linkage, but the
|
||||
# compiler can't handle that information (just don't ask). So we remove it
|
||||
# and then it compiles happily and without bitching :)
|
||||
# Furthermore gcc 2.95 has some trouble with protected and private when
|
||||
# accessing the protected/private stuff of the enclosing class (or the
|
||||
# super class of the enclosing class).
|
||||
GCC295_FIX_2=sed -e 's~\(^\# [0-9][0-9]* "[^"]*"[ 0-9]*\) 4$$~\1~g;s~private:~public:~g;s~protected:~public:~g'
|
||||
|
||||
# Check if we want to show what we are doing
|
||||
ifdef VERBOSE
|
||||
Q =
|
||||
@@ -98,7 +82,7 @@ MODIFIED := $(shell echo "$(VERSIONS)" | cut -f 3 -d' ')
|
||||
ifdef REVISION
|
||||
# Use specified revision (which should be of the form "r000").
|
||||
REV := $(REVISION)
|
||||
REV_NR := $(shell echo $(REVISION) | sed "s~[^0-9]~~g")
|
||||
REV_NR := $(shell echo $(REVISION) | sed "s@[^0-9]@@g")
|
||||
else
|
||||
# Use autodetected revisions
|
||||
REV := $(shell echo "$(VERSIONS)" | cut -f 1 -d' ')
|
||||
@@ -114,7 +98,7 @@ REV_NR := 0
|
||||
endif
|
||||
|
||||
# This helps to recompile if flags change
|
||||
RES := $(shell if [ "`cat $(CONFIG_CACHE_COMPILER) 2>/dev/null`" != "$(CC_CFLAGS) $(CFLAGS)" ]; then echo "$(CC_CFLAGS) $(CFLAGS)" > $(CONFIG_CACHE_COMPILER); fi )
|
||||
RES := $(shell if [ "`cat $(CONFIG_CACHE_COMPILER) 2>/dev/null`" != "$(CFLAGS)" ]; then echo "$(CFLAGS)" > $(CONFIG_CACHE_COMPILER); fi )
|
||||
RES := $(shell if [ "`cat $(CONFIG_CACHE_LINKER) 2>/dev/null`" != "$(LDFLAGS) $(LIBS)" ]; then echo "$(LDFLAGS) $(LIBS)" > $(CONFIG_CACHE_LINKER); fi )
|
||||
RES := $(shell if [ "`cat $(CONFIG_CACHE_ENDIAN) 2>/dev/null`" != "$(ENDIAN_FORCE)" ]; then echo "$(ENDIAN_FORCE)" > $(CONFIG_CACHE_ENDIAN); fi )
|
||||
|
||||
@@ -143,15 +127,15 @@ endif
|
||||
|
||||
$(OBJS_C:%.o=%.d): %.d: $(SRC_DIR)/%.c $(FILE_DEP)
|
||||
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.c=%.c)'
|
||||
$(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -MM $< | sed 's~^$(@F:%.d=%.o):~$@ $(@:%.d=%.o):~' > $@
|
||||
$(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
|
||||
|
||||
$(OBJS_CPP:%.o=%.d): %.d: $(SRC_DIR)/%.cpp $(FILE_DEP)
|
||||
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
$(Q)$(CXX_HOST) $(CFLAGS) -MM $< | sed 's~^$(@F:%.d=%.o):~$@ $(@:%.d=%.o):~' > $@
|
||||
$(Q)$(CXX_HOST) $(CFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
|
||||
|
||||
$(OBJS_MM:%.o=%.d): %.d: $(SRC_DIR)/%.mm $(FILE_DEP)
|
||||
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)'
|
||||
$(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's~^$(@F:%.d=%.o):~$@ $(@:%.d=%.o):~' > $@
|
||||
$(Q)$(CC_HOST) $(CFLAGS) -MM $< | sed 's@^$(@F:%.d=%.o):@$@ $(@:%.d=%.o):@' > $@
|
||||
|
||||
$(OBJS_RC:%.o=%.d): %.d: $(SRC_DIR)/%.rc $(FILE_DEP)
|
||||
$(E) '$(STAGE) DEP $(<:$(SRC_DIR)/%.mm=%.mm)'
|
||||
@@ -182,7 +166,7 @@ endif
|
||||
|
||||
# Convert x:/... paths to /x/... for mingw
|
||||
ifeq ($(OS), MINGW)
|
||||
@cat Makefile.dep.tmp | sed 's~\([a-zA-Z]\):\/~\/\1\/~g' > Makefile.dep.tmp.mingw
|
||||
@cat Makefile.dep.tmp | sed 's@/\([a-zA-Z]\):\/@\/\1\/@g' > Makefile.dep.tmp.mingw
|
||||
@cp Makefile.dep.tmp.mingw Makefile.dep.tmp
|
||||
@rm -f Makefile.dep.tmp.mingw
|
||||
endif
|
||||
@@ -192,7 +176,7 @@ endif
|
||||
@$(AWK) ' \
|
||||
/^# DO NOT/ { print $$0 ; next} \
|
||||
/^#/ {next} \
|
||||
/:/ { \
|
||||
/: / { \
|
||||
left = NF - 1; \
|
||||
for (n = 2; n <= NF; n++) { \
|
||||
if (match($$n, "^$(ROOT_DIR)") == 0) { \
|
||||
@@ -211,7 +195,7 @@ endif
|
||||
{ \
|
||||
print $$0 \
|
||||
} \
|
||||
' < Makefile.dep.tmp | sed 's~ *~ ~g;s~ $$~~' | $(SORT) > Makefile.dep
|
||||
' < Makefile.dep.tmp | sed 's@ *@ @g;s@ $$@@' | $(SORT) > Makefile.dep
|
||||
|
||||
$(Q)rm -f Makefile.dep.tmp Makefile.dep.tmp.bak
|
||||
|
||||
@@ -226,17 +210,9 @@ endif
|
||||
|
||||
# Compile all the files according to the targets
|
||||
|
||||
$(OBJS_C): %.o: $(SRC_DIR)/%.c $(DEP_MASK) $(FILE_DEP)
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)'
|
||||
$(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
$(OBJS_CPP): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
|
||||
ifeq ($(GCC295), 1)
|
||||
$(Q)$(CXX_HOST) -E $(CFLAGS) $< | $(GCC295_FIX) | $(GCC295_FIX_2) | $(CXX_HOST) $(CFLAGS) -c -o $@ -x c++ -
|
||||
else
|
||||
$(Q)$(CXX_HOST) $(CFLAGS) -c -o $@ $<
|
||||
endif
|
||||
|
||||
$(OBJS_MM): %.o: $(SRC_DIR)/%.mm $(DEP_MASK) $(FILE_DEP)
|
||||
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.mm=%.mm)'
|
||||
@@ -280,10 +256,10 @@ $(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp
|
||||
# Revision files
|
||||
|
||||
$(SRC_DIR)/rev.cpp: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/rev.cpp.in
|
||||
$(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s~@@REVISION@@~$(REV_NR)~g;s~@@VERSION@@~$(REV)~g;s~@@MODIFIED@@~$(MODIFIED)~g;s~@@DATE@@~`date +%d.%m.%y`~g" > $(SRC_DIR)/rev.cpp
|
||||
$(Q)cat $(SRC_DIR)/rev.cpp.in | sed "s@\!\!REVISION\!\!@$(REV_NR)@g;s@!!VERSION!!@$(REV)@g;s@!!MODIFIED!!@$(MODIFIED)@g;s@!!DATE!!@`date +%d.%m.%y`@g" > $(SRC_DIR)/rev.cpp
|
||||
|
||||
$(SRC_DIR)/ottdres.rc: $(CONFIG_CACHE_VERSION) $(SRC_DIR)/ottdres.rc.in
|
||||
$(Q)cat $(SRC_DIR)/ottdres.rc.in | sed "s~@@REVISION@@~$(REV_NR)~g;s~@@VERSION@@~$(REV)~g;s~@@DATE@@~`date +%d.%m.%y`~g" > $(SRC_DIR)/ottdres.rc
|
||||
$(Q)cat $(SRC_DIR)/ottdres.rc.in | sed "s@\!\!REVISION\!\!@$(REV_NR)@g;s@!!VERSION!!@$(REV)@g;s@!!DATE!!@`date +%d.%m.%y`@g" > $(SRC_DIR)/ottdres.rc
|
||||
|
||||
FORCE:
|
||||
|
||||
|
@@ -220,6 +220,7 @@ function Regression::Airport()
|
||||
}
|
||||
|
||||
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
|
||||
print(" GetPrice(): " + AIAirport.GetPrice(0));
|
||||
print(" BuildAirport(): " + AIAirport.BuildAirport(32116, 0, AIStation.STATION_JOIN_ADJACENT));
|
||||
print(" IsHangarTile(): " + AIAirport.IsHangarTile(32116));
|
||||
print(" IsAirportTile(): " + AIAirport.IsAirportTile(32116));
|
||||
@@ -256,12 +257,15 @@ function Regression::Bridge()
|
||||
print(" Valid Bridges: " + j);
|
||||
|
||||
print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33160));
|
||||
print(" GetBridgeID(): " + AIBridge.GetBridgeID(33160));
|
||||
print(" RemoveBridge(): " + AIBridge.RemoveBridge(33155));
|
||||
print(" GetLastErrorString(): " + AIError.GetLastErrorString());
|
||||
print(" GetOtherBridgeEnd(): " + AIBridge.GetOtherBridgeEnd(33160));
|
||||
print(" BuildBridge(): " + AIBridge.BuildBridge(AIVehicle.VT_ROAD, 5, 33160, 33155));
|
||||
print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33160));
|
||||
print(" GetBridgeID(): " + AIBridge.GetBridgeID(33160));
|
||||
print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33155));
|
||||
print(" GetBridgeID(): " + AIBridge.GetBridgeID(33155));
|
||||
print(" GetOtherBridgeEnd(): " + AIBridge.GetOtherBridgeEnd(33160));
|
||||
print(" BuildBridge(): " + AIBridge.BuildBridge(AIVehicle.VT_ROAD, 5, 33160, 33155));
|
||||
print(" GetLastErrorString(): " + AIError.GetLastErrorString());
|
||||
@@ -329,6 +333,7 @@ function Regression::Cargo()
|
||||
print(" GetCargoIncome(10, 10): " + AICargo.GetCargoIncome(i, 10, 10));
|
||||
print(" GetCargoIncome(100, 10): " + AICargo.GetCargoIncome(i, 100, 10));
|
||||
print(" GetCargoIncome(10, 100): " + AICargo.GetCargoIncome(i, 10, 100));
|
||||
print(" GetRoadVehicleTypeForCargo(): " + AIRoad.GetRoadVehicleTypeForCargo(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -631,6 +636,9 @@ function Regression::IndustryTypeList()
|
||||
print(" GetName(): " + AIIndustryType.GetName(i));
|
||||
print(" CanBuildIndustry(): " + AIIndustryType.CanBuildIndustry(i));
|
||||
print(" CanProspectIndustry(): " + AIIndustryType.CanProspectIndustry(i));
|
||||
print(" IsBuiltOnWater(): " + AIIndustryType.IsBuiltOnWater(i));
|
||||
print(" HasHeliport(): " + AIIndustryType.HasHeliport(i));
|
||||
print(" HasDock(): " + AIIndustryType.HasDock(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1069,9 +1077,10 @@ function Regression::Sign()
|
||||
print(" BuildSign(33409, 'Some other Sign'): " + sign_id);
|
||||
print(" RemoveSign(" + sign_id + "): " + AISign.RemoveSign(sign_id));
|
||||
print("");
|
||||
print(" GetMaxSignID(): " + AISign.GetMaxSignID());
|
||||
for (local i = -1; i < AISign.GetMaxSignID() + 1; i++) {
|
||||
if (AISign.IsValidSign(i)) j++;
|
||||
local list = AISignList();
|
||||
list.Sort(AIAbstractList.SORT_BY_ITEM, true);
|
||||
for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
|
||||
j++;
|
||||
print(" Sign " + i);
|
||||
print(" IsValidSign(): " + AISign.IsValidSign(i));
|
||||
print(" GetName(): " + AISign.GetName(i));
|
||||
@@ -1182,7 +1191,7 @@ function Regression::TileList()
|
||||
print("");
|
||||
print("--TileList--");
|
||||
print(" Count(): " + list.Count());
|
||||
list.AddRectangle(41895 - 256 * 2, 256 * 2 + 41895 + 8);
|
||||
list.AddRectangle(34436, 256 * 2 + 34436 + 8);
|
||||
print(" Count(): " + list.Count());
|
||||
|
||||
list.Valuate(AITile.GetHeight);
|
||||
@@ -1193,6 +1202,30 @@ function Regression::TileList()
|
||||
print(" " + i + " => " + list.GetValue(i));
|
||||
}
|
||||
|
||||
list.Valuate(AITile.GetCornerHeight, AITile.CORNER_N);
|
||||
print(" CornerHeight(North): done");
|
||||
print(" Count(): " + list.Count());
|
||||
print(" ListDump:");
|
||||
for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
|
||||
print(" " + i + " => " + list.GetValue(i));
|
||||
}
|
||||
|
||||
list.Valuate(AITile.GetMinHeight);
|
||||
print(" MinHeight(): done");
|
||||
print(" Count(): " + list.Count());
|
||||
print(" ListDump:");
|
||||
for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
|
||||
print(" " + i + " => " + list.GetValue(i));
|
||||
}
|
||||
|
||||
list.Valuate(AITile.GetMaxHeight);
|
||||
print(" MaxHeight(): done");
|
||||
print(" Count(): " + list.Count());
|
||||
print(" ListDump:");
|
||||
for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
|
||||
print(" " + i + " => " + list.GetValue(i));
|
||||
}
|
||||
|
||||
list.Valuate(AITile.GetSlope);
|
||||
list.KeepValue(0);
|
||||
print(" Slope(): done");
|
||||
@@ -1203,6 +1236,8 @@ function Regression::TileList()
|
||||
print(" " + i + " => " + list.GetValue(i));
|
||||
}
|
||||
|
||||
list.Clear();
|
||||
list.AddRectangle(41895 - 256 * 2, 256 * 2 + 41895 + 8);
|
||||
list.Valuate(AITile.IsBuildable);
|
||||
list.KeepValue(1);
|
||||
print(" Buildable(): done");
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
2088
changelog.txt
2088
changelog.txt
File diff suppressed because it is too large
Load Diff
346
config.lib
346
config.lib
@@ -5,7 +5,7 @@ log() {
|
||||
}
|
||||
|
||||
set_default() {
|
||||
released_version=""
|
||||
released_version="0.7.2"
|
||||
|
||||
ignore_extra_parameters="0"
|
||||
# We set all kinds of defaults for params. Later on the user can override
|
||||
@@ -47,8 +47,8 @@ set_default() {
|
||||
enable_static="1"
|
||||
enable_translator="0"
|
||||
enable_unicode="1"
|
||||
enable_assert="1"
|
||||
enable_strip="0"
|
||||
enable_assert="0"
|
||||
enable_strip="1"
|
||||
enable_universal="1"
|
||||
enable_osx_g5="0"
|
||||
enable_cocoa_quartz="1"
|
||||
@@ -415,7 +415,7 @@ save_params() {
|
||||
configure="$CONFIGURE_EXECUTABLE --ignore-extra-parameters"
|
||||
for p in $save_params_array; do
|
||||
eval "v=\"\$$p\""
|
||||
p=`echo "$p" | sed 's~_~-~g;s~\n~~g;s~ ~\\ ~g'`
|
||||
p=`echo "$p" | sed 's@_@-@g;s@\n@@g;s@ @\\ @g'`
|
||||
# Only save those params that aren't empty
|
||||
configure="$configure --$p=\"$v\""
|
||||
done
|
||||
@@ -815,6 +815,7 @@ check_params() {
|
||||
fi
|
||||
|
||||
if [ "$os" = "OSX" ]; then
|
||||
check_osx_sdk
|
||||
# Test on G5
|
||||
|
||||
if [ "$enable_osx_g5" != "0" ]; then
|
||||
@@ -903,7 +904,7 @@ check_params() {
|
||||
doc_dir="$data_dir/docs"
|
||||
fi
|
||||
else
|
||||
doc_dir="`echo $doc_dir | sed 's~\([^\]\)\\\\ ~\1\\\\\\\\ ~g;s~\([^\]\) ~\1\\\\\\\\ ~g'`"
|
||||
doc_dir="`echo $doc_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
|
||||
fi
|
||||
|
||||
if [ "$icon_theme_dir" = "1" ]; then
|
||||
@@ -913,7 +914,7 @@ check_params() {
|
||||
icon_theme_dir=""
|
||||
fi
|
||||
else
|
||||
icon_theme_dir="`echo $icon_theme_dir | sed 's~\([^\]\)\\\\ ~\1\\\\\\\\ ~g;s~\([^\]\) ~\1\\\\\\\\ ~g'`"
|
||||
icon_theme_dir="`echo $icon_theme_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
|
||||
fi
|
||||
|
||||
if [ "$personal_dir" = "1" ]; then
|
||||
@@ -925,7 +926,7 @@ check_params() {
|
||||
personal_dir=".openttd"
|
||||
fi
|
||||
else
|
||||
personal_dir="`echo $personal_dir | sed 's~\([^\]\)\\\\ ~\1\\\\\\\\ ~g;s~\([^\]\) ~\1\\\\\\\\ ~g'`"
|
||||
personal_dir="`echo $personal_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
|
||||
fi
|
||||
|
||||
if [ "$shared_dir" = "1" ]; then
|
||||
@@ -936,7 +937,7 @@ check_params() {
|
||||
shared_dir=""
|
||||
fi
|
||||
else
|
||||
shared_dir="`echo $shared_dir | sed 's~\([^\]\)\\\\ ~\1\\\\\\\\ ~g;s~\([^\]\) ~\1\\\\\\\\ ~g'`"
|
||||
shared_dir="`echo $shared_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
|
||||
fi
|
||||
|
||||
if [ "$man_dir" = "1" ]; then
|
||||
@@ -947,7 +948,7 @@ check_params() {
|
||||
man_dir=""
|
||||
fi
|
||||
else
|
||||
man_dir="`echo $man_dir | sed 's~\([^\]\)\\\\ ~\1\\\\\\\\ ~g;s~\([^\]\) ~\1\\\\\\\\ ~g'`"
|
||||
man_dir="`echo $man_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
|
||||
fi
|
||||
|
||||
if [ "$menu_dir" = "1" ]; then
|
||||
@@ -958,7 +959,7 @@ check_params() {
|
||||
menu_dir=""
|
||||
fi
|
||||
else
|
||||
menu_dir="`echo $menu_dir | sed 's~\([^\]\)\\\\ ~\1\\\\\\\\ ~g;s~\([^\]\) ~\1\\\\\\\\ ~g'`"
|
||||
menu_dir="`echo $menu_dir | sed 's@\([^\]\)\\\\ @\1\\\\\\\\ @g;s@\([^\]\) @\1\\\\\\\\ @g'`"
|
||||
fi
|
||||
|
||||
# "set_universal_binary_flags" needs to be before "detect_iconv"
|
||||
@@ -1008,13 +1009,74 @@ check_params() {
|
||||
fi
|
||||
}
|
||||
|
||||
make_compiler_cflags() {
|
||||
# Params:
|
||||
# $1 - compiler
|
||||
# $2 - the current cflags
|
||||
# $3 - variable to finally write to
|
||||
|
||||
flags="$2"
|
||||
|
||||
if [ `echo $1 | cut -c 1-3` = "icc" ]; then
|
||||
# Enable some things only for certain ICC versions
|
||||
cc_version=`$1 -dumpversion | cut -c 1-4`
|
||||
|
||||
|
||||
if [ "$cc_version" = "10.1" ]; then
|
||||
flags="$flags -Wno-multichar"
|
||||
fi
|
||||
|
||||
if [ "$cc_version" = "11.0" ]; then
|
||||
# warning 1899: multicharacter character literal (potential portability problem) (e.g. 'FOOD')
|
||||
# vec report defaults to telling where it did loop vectorisation, which is not very important
|
||||
flags="$flags -vec-report=0 -wd1899"
|
||||
fi
|
||||
else
|
||||
# Enable some things only for certain GCC versions
|
||||
cc_version=`$1 -dumpversion | cut -c 1,3`
|
||||
|
||||
if [ $cc_version -lt 30 ]; then
|
||||
log 1 "configure: error: gcc older than 3.0 can't compile OpenTTD because of its poor template support"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
flags="$flags -Wall -Wno-multichar -Wsign-compare -Wundef"
|
||||
flags="$flags -Wwrite-strings -Wpointer-arith"
|
||||
flags="$flags -Wno-uninitialized"
|
||||
|
||||
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
|
||||
flags="$flags -Wno-unused-variable"
|
||||
fi
|
||||
|
||||
if [ $cc_version -ge 40 ]; then
|
||||
# GCC 4.0+ complains about that we break strict-aliasing.
|
||||
# On most places we don't see how to fix it, and it doesn't
|
||||
# break anything. So disable strict-aliasing to make the
|
||||
# compiler all happy.
|
||||
flags="$flags -fno-strict-aliasing"
|
||||
fi
|
||||
|
||||
if [ $cc_version -ge 42 ]; then
|
||||
# GCC 4.2+ automatically assumes that signed overflows do
|
||||
# not occur in signed arithmetics, whereas we are not
|
||||
# sure that they will not happen. It furthermore complains
|
||||
# about it's own optimized code in some places.
|
||||
flags="$flags -fno-strict-overflow"
|
||||
fi
|
||||
fi
|
||||
|
||||
eval "$3=\"$flags\""
|
||||
}
|
||||
|
||||
make_cflags_and_ldflags() {
|
||||
# General CFlags for BUILD
|
||||
CFLAGS_BUILD=""
|
||||
# General CFlags for HOST
|
||||
CFLAGS="$CFLAGS -D$os"
|
||||
# CFlags for HOST and C-Compiler
|
||||
CC_FLAGS=""
|
||||
# Libs to compile. In fact this is just LDFLAGS
|
||||
LIBS="-lstdc++"
|
||||
# LDFLAGS used for HOST
|
||||
@@ -1063,58 +1125,16 @@ make_cflags_and_ldflags() {
|
||||
CFLAGS="$CFLAGS -DNO_THREADS"
|
||||
fi
|
||||
|
||||
if [ `echo $cc_host | cut -c 1-3` = "icc" ]; then
|
||||
# Enable some things only for certain ICC versions
|
||||
cc_version=`$cc_host -dumpversion | cut -c 1-4`
|
||||
|
||||
|
||||
if [ "$cc_version" = "10.1" ]; then
|
||||
CFLAGS="$CFLAGS -Wno-multichar"
|
||||
fi
|
||||
else
|
||||
# Enable some things only for certain GCC versions
|
||||
cc_version=`$cc_host -dumpversion | cut -c 1,3`
|
||||
|
||||
if [ $cc_version -ge 29 ]; then
|
||||
CFLAGS="$CFLAGS -Wall -Wno-multichar -Wsign-compare -Wundef"
|
||||
CFLAGS="$CFLAGS -Wwrite-strings -Wpointer-arith"
|
||||
CFLAGS="$CFLAGS -Wno-uninitialized"
|
||||
|
||||
CC_CFLAGS="$CC_CFLAGS -Wstrict-prototypes"
|
||||
fi
|
||||
|
||||
gcc295=""
|
||||
if [ "$cc_version" = 29 ]; then
|
||||
# Make sure we mark GCC 2.95 flag for Makefile.src.in, as we
|
||||
# need a lovely hack there to make it compile correctly.
|
||||
gcc295="1"
|
||||
|
||||
# Disable warnings about unused variables when
|
||||
# compiling with asserts disabled
|
||||
if [ $enable_assert -eq 0 ]; then
|
||||
CFLAGS="$CFLAGS -Wno-unused"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $cc_version -ge 30 ]; then
|
||||
CFLAGS="$CFLAGS -W -Wno-unused-parameter -Wformat=2"
|
||||
CFLAGS="$CFLAGS -Wredundant-decls"
|
||||
# Do not warn about unused variables when building without asserts
|
||||
if [ $enable_assert -eq 0 ]; then
|
||||
CFLAGS="$CFLAGS -Wno-unused-variable"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ $cc_version -ge 34 ]; then
|
||||
CC_CFLAGS="$CC_CFLAGS -Wdeclaration-after-statement -Wold-style-definition"
|
||||
fi
|
||||
make_compiler_cflags "$cc_build" "$CFLAGS_BUILD" "CFLAGS_BUILD"
|
||||
make_compiler_cflags "$cc_host" "$CFLAGS" "CFLAGS"
|
||||
|
||||
if [ "`echo $1 | cut -c 1-3`" != "icc" ]; then
|
||||
if [ "$os" = "CYGWIN" ]; then
|
||||
CFLAGS="$CFLAGS -mwin32"
|
||||
flags="$flags -mwin32"
|
||||
LDFLAGS="$LDFLAGS -mwin32"
|
||||
fi
|
||||
if [ "$os" = "MINGW" ] || [ "$os" = "CYGWIN" ]; then
|
||||
CFLAGS="$CFLAGS -mno-cygwin"
|
||||
flags="$flags -mno-cygwin"
|
||||
LDFLAGS="$LDFLAGS -mno-cygwin"
|
||||
fi
|
||||
|
||||
@@ -1122,22 +1142,6 @@ make_cflags_and_ldflags() {
|
||||
LDFLAGS="$LDFLAGS -Wl,--subsystem,windows"
|
||||
LIBS="$LIBS -lws2_32 -lwinmm -lgdi32 -ldxguid -lole32"
|
||||
fi
|
||||
|
||||
# GCC 4.0+ complains about that we break strict-aliasing.
|
||||
# On most places we don't see how to fix it, and it doesn't
|
||||
# break anything. So disable strict-aliasing to make the
|
||||
# compiler all happy.
|
||||
if [ $cc_version -ge 40 ]; then
|
||||
CFLAGS="$CFLAGS -fno-strict-aliasing"
|
||||
fi
|
||||
|
||||
# GCC 4.2+ automatically assumes that signed overflows do
|
||||
# not occur in signed arithmetics, whereas we are not
|
||||
# sure that they will not happen. It furthermore complains
|
||||
# about it's own optimized code in some places.
|
||||
if [ $cc_version -ge 42 ]; then
|
||||
CFLAGS="$CFLAGS -fno-strict-overflow"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$os" != "CYGWIN" ] && [ "$os" != "FREEBSD" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "DOS" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ] && [ "$os" != "OS2" ]; then
|
||||
@@ -1206,7 +1210,7 @@ make_cflags_and_ldflags() {
|
||||
if [ -n "$sdl_config" ]; then
|
||||
CFLAGS="$CFLAGS -DWITH_SDL"
|
||||
# SDL must not add _GNU_SOURCE as it breaks many platforms
|
||||
CFLAGS="$CFLAGS `$sdl_config --cflags | sed 's~-D_GNU_SOURCE[^ ]*~~'`"
|
||||
CFLAGS="$CFLAGS `$sdl_config --cflags | sed 's@-D_GNU_SOURCE[^ ]*@@'`"
|
||||
if [ "$os" != "MINGW" ] && [ "$os" != "CYGWIN" ] && [ "$os" != "WINCE" ]; then
|
||||
if [ "$enable_static" != "0" ]; then
|
||||
LIBS="$LIBS `$sdl_config --static-libs`"
|
||||
@@ -1268,7 +1272,7 @@ make_cflags_and_ldflags() {
|
||||
if [ "$os" = "OSX" ]; then
|
||||
# fontconfig_config goes via pkg-config on all systems, which doesn't know --prefix
|
||||
# Also, despite the reason we link to the .a file ourself (because we can't use -static), we do need to ask pkg-config about possible other deps
|
||||
LIBS="$LIBS `$fontconfig_config --variable=prefix`/lib/libfontconfig.a `$fontconfig_config --libs --static | sed s~-lfontconfig~~`"
|
||||
LIBS="$LIBS `$fontconfig_config --variable=prefix`/lib/libfontconfig.a `$fontconfig_config --libs --static | sed s@-lfontconfig@@`"
|
||||
else
|
||||
LIBS="$LIBS `$fontconfig_config --libs --static | tr '\n\r' ' '`"
|
||||
fi
|
||||
@@ -1378,7 +1382,7 @@ make_cflags_and_ldflags() {
|
||||
fi
|
||||
|
||||
if [ "$enable_osx_g5" != "0" ]; then
|
||||
CFLAGS="$CFLAGS -mtune=970 -mcpu=970 -mpowerpc-gpopt"
|
||||
CFLAGS="$CFLAGS -mcpu=G5 -mpowerpc64 -mtune=970 -mcpu=970 -mpowerpc-gpopt"
|
||||
fi
|
||||
|
||||
if [ -n "$personal_dir" ]; then
|
||||
@@ -1391,7 +1395,7 @@ make_cflags_and_ldflags() {
|
||||
|
||||
CFLAGS="$CFLAGS -DGLOBAL_DATA_DIR=\\\\\"$prefix_dir/$data_dir\\\\\""
|
||||
|
||||
log 1 "using CFLAGS... $CFLAGS $CC_CFLAGS"
|
||||
log 1 "using CFLAGS... $CFLAGS"
|
||||
log 1 "using LDFLAGS... $LIBS $LDFLAGS"
|
||||
|
||||
# Makedepend doesn't like something like: -isysroot /OSX/blabla
|
||||
@@ -1400,8 +1404,10 @@ make_cflags_and_ldflags() {
|
||||
# Lovely hackish, not?
|
||||
# Btw, this almost always comes from outside the configure, so it is
|
||||
# not something we can control.
|
||||
# Also make makedepend aware of compiler's built-in defines.
|
||||
if [ "$with_makedepend" != "0" ]; then
|
||||
cflags_makedep="` echo "$CFLAGS" | sed 's~ /~ -~g;s~-I[ ]*[^ ]*~~g'`"
|
||||
cflags_makedep="`echo | $cxx_host -E -x c++ -dM - | sed 's@.define @-D@g;s@ .*@ @g;s@(.*)@@g' | tr -d '\r\n'`"
|
||||
cflags_makedep="$cflags_makedep `echo "$CFLAGS" | sed 's@ /@ -@g;s@-I[ ]*[^ ]*@@g'`"
|
||||
else
|
||||
makedepend=""
|
||||
fi
|
||||
@@ -1580,7 +1586,7 @@ check_strip() {
|
||||
elif [ "$os" = "OSX" ]; then
|
||||
# Most targets have -V in strip, to see if they exists... OSX doesn't.. so execute something
|
||||
echo "int main(int argc, char *argv[]) { }" > strip.test.c
|
||||
$cc_host strip.test.c -o strip.test
|
||||
$cxx_host strip.test.c -o strip.test
|
||||
check_compiler "host strip" "strip" "$host" "$strip" "$STRIP" "strip" "strip" "3" "strip.test"
|
||||
rm -f strip.test.c strip.test
|
||||
else
|
||||
@@ -1591,7 +1597,7 @@ check_strip() {
|
||||
check_lipo() {
|
||||
if [ "$os" = "OSX" ] && [ "$enable_universal" != "0" ]; then
|
||||
echo "int main(int argc, char *argv[]) { }" > lipo.test.c
|
||||
$cc_host lipo.test.c -o lipo.test
|
||||
$cxx_host lipo.test.c -o lipo.test
|
||||
check_compiler "host lipo" "lipo" "$host" "$lipo" "$LIPO" "lipo" "lipo" "4" "-info lipo.test"
|
||||
rm -f lipo.test.c lipo.test
|
||||
fi
|
||||
@@ -1617,6 +1623,28 @@ set_universal_binary_flags() {
|
||||
fi
|
||||
}
|
||||
|
||||
check_osx_sdk() {
|
||||
cat > tmp.osx.mm << EOF
|
||||
#include <Cocoa/Cocoa.h>
|
||||
int main() {
|
||||
kCGBitmapByteOrder32Host;
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
execute="$cxx_host $CFLAGS tmp.osx.mm -framework Cocoa -o tmp.osx 2>&1"
|
||||
eval $execute > /dev/null
|
||||
ret=$?
|
||||
log 2 "executing $execute"
|
||||
log 2 " exit code $ret"
|
||||
rm -f tmp.osx.mm tmp.osx
|
||||
if [ "$ret" != "0" ]; then
|
||||
log 1 "Your system SDK is probably too old"
|
||||
log 1 "Please install/upgrade your Xcode to >= 2.5"
|
||||
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
check_direct_music() {
|
||||
echo "
|
||||
#include <windows.h>
|
||||
@@ -2405,7 +2433,7 @@ int main() {
|
||||
}
|
||||
EOF
|
||||
execute="$cxx_host $CFLAGS -c tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
|
||||
eval $execute >&/dev/null
|
||||
eval $execute > /dev/null
|
||||
ret=$?
|
||||
log 2 "executing $execute"
|
||||
log 2 " exit code $ret"
|
||||
@@ -2426,7 +2454,7 @@ int main() {
|
||||
}
|
||||
EOF
|
||||
execute="$cxx_host $CFLAGS tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
|
||||
eval $execute >&/dev/null
|
||||
eval $execute > /dev/null
|
||||
ret=$?
|
||||
log 2 "executing $execute"
|
||||
log 2 " exit code $ret"
|
||||
@@ -2501,7 +2529,8 @@ detect_cputype() {
|
||||
log 1 "forcing cpu-type... $cpu_type bits"
|
||||
return;
|
||||
fi
|
||||
echo "#include \"src/stdafx.h\"" > tmp.64bit.cpp
|
||||
echo "#define _SQ64 1" > tmp.64bit.cpp
|
||||
echo "#include \"src/stdafx.h\"" >> tmp.64bit.cpp
|
||||
echo "assert_compile(sizeof(size_t) == 8);" >> tmp.64bit.cpp
|
||||
echo "int main() { return 0; }" >> tmp.64bit.cpp
|
||||
execute="$cxx_host $CFLAGS tmp.64bit.cpp -o tmp.64bit -DTESTING 2>&1"
|
||||
@@ -2519,17 +2548,6 @@ make_sed() {
|
||||
T_CFLAGS="$CFLAGS"
|
||||
T_LDFLAGS="$LDFLAGS"
|
||||
|
||||
# We check here if we are PPC, because then we need to enable FOUR_BYTE_BOOL
|
||||
# We do this here, and not sooner, so universal builds also have this
|
||||
# automatically correct
|
||||
# FOUR_BYTE_BOOL is needed, because C++ uses 4byte for a bool on PPC, where
|
||||
# we use 1 byte per bool normally in C part. So convert that last one to 4
|
||||
# bytes too, but only for PPC.
|
||||
ppc=`$cc_host -dumpmachine | egrep "powerpc|ppc"`
|
||||
if [ -n "$ppc" ]; then
|
||||
T_CFLAGS="$T_CFLAGS -DFOUR_BYTE_BOOL"
|
||||
fi
|
||||
|
||||
SRC_OBJS_DIR="$BASE_SRC_OBJS_DIR/$OBJS_SUBDIR"
|
||||
|
||||
# All the data needed to compile a single target
|
||||
@@ -2537,104 +2555,102 @@ make_sed() {
|
||||
# use multiple OBJS_DIR, because all in-between
|
||||
# binaries are stored in there, and nowhere else.
|
||||
SRC_REPLACE="
|
||||
s~!!CC_HOST!!~$cc_host~g;
|
||||
s~!!CXX_HOST!!~$cxx_host~g;
|
||||
s~!!CC_BUILD!!~$cc_build~g;
|
||||
s~!!CXX_BUILD!!~$cxx_build~g;
|
||||
s~!!WINDRES!!~$windres~g;
|
||||
s~!!STRIP!!~$strip $strip_arg~g;
|
||||
s~!!LIPO!!~$lipo~g;
|
||||
s~!!CC_CFLAGS!!~$CC_CFLAGS~g;
|
||||
s~!!CFLAGS!!~$T_CFLAGS~g;
|
||||
s~!!CFLAGS_BUILD!!~$CFLAGS_BUILD~g;
|
||||
s~!!STRGEN_FLAGS!!~$strgen_flags~g;
|
||||
s~!!LIBS!!~$LIBS~g;
|
||||
s~!!LDFLAGS!!~$T_LDFLAGS~g;
|
||||
s~!!BIN_DIR!!~$BIN_DIR~g;
|
||||
s~!!ROOT_DIR!!~$ROOT_DIR~g;
|
||||
s~!!MEDIA_DIR!!~$MEDIA_DIR~g;
|
||||
s~!!SOURCE_LIST!!~$SOURCE_LIST~g;
|
||||
s~!!SRC_OBJS_DIR!!~$SRC_OBJS_DIR~g;
|
||||
s~!!LANG_OBJS_DIR!!~$LANG_OBJS_DIR~g;
|
||||
s~!!SRC_DIR!!~$SRC_DIR~g;
|
||||
s~!!SCRIPT_SRC_DIR!!~$SCRIPT_SRC_DIR~g;
|
||||
s~!!OSXAPP!!~$OSXAPP~g;
|
||||
s~!!LANG_DIR!!~$LANG_DIR~g;
|
||||
s~!!TTD!!~$TTD~g;
|
||||
s~!!BINARY_DIR!!~$prefix_dir/$binary_dir~g;
|
||||
s~!!DATA_DIR!!~$prefix_dir/$data_dir~g;
|
||||
s~!!DOC_DIR!!~$prefix_dir/$doc_dir~g;
|
||||
s~!!MAN_DIR!!~$prefix_dir/$man_dir~g;
|
||||
s~!!ICON_DIR!!~$prefix_dir/$icon_dir~g;
|
||||
s~!!ICON_THEME_DIR!!~$prefix_dir/$icon_theme_dir~g;
|
||||
s~!!PERSONAL_DIR!!~$personal_dir~g;
|
||||
s~!!SHARED_DIR!!~$shared_dir~g;
|
||||
s~!!INSTALL_DIR!!~$install_dir~g;
|
||||
s~!!BINARY_NAME!!~$binary_name~g;
|
||||
s~!!STRGEN!!~$STRGEN~g;
|
||||
s~!!ENDIAN_CHECK!!~$ENDIAN_CHECK~g;
|
||||
s~!!ENDIAN_FORCE!!~$endian~g;
|
||||
s~!!STAGE!!~$STAGE~g;
|
||||
s~!!MAKEDEPEND!!~$makedepend~g;
|
||||
s~!!CFLAGS_MAKEDEP!!~$cflags_makedep~g;
|
||||
s~!!SORT!!~$sort~g;
|
||||
s~!!CONFIG_CACHE_COMPILER!!~config.cache.compiler~g;
|
||||
s~!!CONFIG_CACHE_LINKER!!~config.cache.linker~g;
|
||||
s~!!CONFIG_CACHE_ENDIAN!!~config.cache.endian~g;
|
||||
s~!!CONFIG_CACHE_SOURCE!!~config.cache.source~g;
|
||||
s~!!CONFIG_CACHE_VERSION!!~config.cache.version~g;
|
||||
s~!!CONFIG_CACHE_SOURCE_LIST!!~config.cache.source.list~g;
|
||||
s~!!CONFIG_CACHE_PWD!!~config.cache.pwd~g;
|
||||
s~!!LANG_SUPPRESS!!~$lang_suppress~g;
|
||||
s~!!OBJS_C!!~$OBJS_C~g;
|
||||
s~!!OBJS_CPP!!~$OBJS_CPP~g;
|
||||
s~!!OBJS_MM!!~$OBJS_MM~g;
|
||||
s~!!OBJS_RC!!~$OBJS_RC~g;
|
||||
s~!!SRCS!!~$SRCS~g;
|
||||
s~!!OS!!~$os~g;
|
||||
s~!!CONFIGURE_FILES!!~$CONFIGURE_FILES~g;
|
||||
s~!!REVISION!!~$revision~g;
|
||||
s~!!AWK!!~$awk~g;
|
||||
s~!!GCC295!!~$gcc295~g;
|
||||
s~!!DISTCC!!~$distcc~g;
|
||||
s@!!CC_HOST!!@$cc_host@g;
|
||||
s@!!CXX_HOST!!@$cxx_host@g;
|
||||
s@!!CC_BUILD!!@$cc_build@g;
|
||||
s@!!CXX_BUILD!!@$cxx_build@g;
|
||||
s@!!WINDRES!!@$windres@g;
|
||||
s@!!STRIP!!@$strip $strip_arg@g;
|
||||
s@!!LIPO!!@$lipo@g;
|
||||
s@!!CFLAGS!!@$T_CFLAGS@g;
|
||||
s@!!CFLAGS_BUILD!!@$CFLAGS_BUILD@g;
|
||||
s@!!STRGEN_FLAGS!!@$strgen_flags@g;
|
||||
s@!!LIBS!!@$LIBS@g;
|
||||
s@!!LDFLAGS!!@$T_LDFLAGS@g;
|
||||
s@!!BIN_DIR!!@$BIN_DIR@g;
|
||||
s@!!ROOT_DIR!!@$ROOT_DIR@g;
|
||||
s@!!MEDIA_DIR!!@$MEDIA_DIR@g;
|
||||
s@!!SOURCE_LIST!!@$SOURCE_LIST@g;
|
||||
s@!!SRC_OBJS_DIR!!@$SRC_OBJS_DIR@g;
|
||||
s@!!LANG_OBJS_DIR!!@$LANG_OBJS_DIR@g;
|
||||
s@!!SRC_DIR!!@$SRC_DIR@g;
|
||||
s@!!SCRIPT_SRC_DIR!!@$SCRIPT_SRC_DIR@g;
|
||||
s@!!OSXAPP!!@$OSXAPP@g;
|
||||
s@!!LANG_DIR!!@$LANG_DIR@g;
|
||||
s@!!TTD!!@$TTD@g;
|
||||
s@!!BINARY_DIR!!@$prefix_dir/$binary_dir@g;
|
||||
s@!!DATA_DIR!!@$prefix_dir/$data_dir@g;
|
||||
s@!!DOC_DIR!!@$prefix_dir/$doc_dir@g;
|
||||
s@!!MAN_DIR!!@$prefix_dir/$man_dir@g;
|
||||
s@!!ICON_DIR!!@$prefix_dir/$icon_dir@g;
|
||||
s@!!ICON_THEME_DIR!!@$prefix_dir/$icon_theme_dir@g;
|
||||
s@!!PERSONAL_DIR!!@$personal_dir@g;
|
||||
s@!!SHARED_DIR!!@$shared_dir@g;
|
||||
s@!!INSTALL_DIR!!@$install_dir@g;
|
||||
s@!!BINARY_NAME!!@$binary_name@g;
|
||||
s@!!STRGEN!!@$STRGEN@g;
|
||||
s@!!ENDIAN_CHECK!!@$ENDIAN_CHECK@g;
|
||||
s@!!ENDIAN_FORCE!!@$endian@g;
|
||||
s@!!STAGE!!@$STAGE@g;
|
||||
s@!!MAKEDEPEND!!@$makedepend@g;
|
||||
s@!!CFLAGS_MAKEDEP!!@$cflags_makedep@g;
|
||||
s@!!SORT!!@$sort@g;
|
||||
s@!!CONFIG_CACHE_COMPILER!!@config.cache.compiler@g;
|
||||
s@!!CONFIG_CACHE_LINKER!!@config.cache.linker@g;
|
||||
s@!!CONFIG_CACHE_ENDIAN!!@config.cache.endian@g;
|
||||
s@!!CONFIG_CACHE_SOURCE!!@config.cache.source@g;
|
||||
s@!!CONFIG_CACHE_VERSION!!@config.cache.version@g;
|
||||
s@!!CONFIG_CACHE_SOURCE_LIST!!@config.cache.source.list@g;
|
||||
s@!!CONFIG_CACHE_PWD!!@config.cache.pwd@g;
|
||||
s@!!LANG_SUPPRESS!!@$lang_suppress@g;
|
||||
s@!!OBJS_C!!@$OBJS_C@g;
|
||||
s@!!OBJS_CPP!!@$OBJS_CPP@g;
|
||||
s@!!OBJS_MM!!@$OBJS_MM@g;
|
||||
s@!!OBJS_RC!!@$OBJS_RC@g;
|
||||
s@!!SRCS!!@$SRCS@g;
|
||||
s@!!OS!!@$os@g;
|
||||
s@!!CONFIGURE_FILES!!@$CONFIGURE_FILES@g;
|
||||
s@!!REVISION!!@$revision@g;
|
||||
s@!!AWK!!@$awk@g;
|
||||
s@!!DISTCC!!@$distcc@g;
|
||||
"
|
||||
|
||||
if [ "$icon_theme_dir" != "" ]; then
|
||||
SRC_REPLACE="$SRC_REPLACE
|
||||
s#!!ICON_THEME_DIR!!#$prefix_dir/$icon_theme_dir#g;
|
||||
s@!!ICON_THEME_DIR!!@$prefix_dir/$icon_theme_dir@g;
|
||||
"
|
||||
else
|
||||
SRC_REPLACE="$SRC_REPLACE
|
||||
s#!!ICON_THEME_DIR!!##g;
|
||||
s@!!ICON_THEME_DIR!!@@g;
|
||||
"
|
||||
fi
|
||||
|
||||
if [ "$man_dir" != "" ]; then
|
||||
SRC_REPLACE="$SRC_REPLACE
|
||||
s#!!MAN_DIR!!#$prefix_dir/$man_dir#g;
|
||||
s@!!MAN_DIR!!@$prefix_dir/$man_dir@g;
|
||||
"
|
||||
else
|
||||
SRC_REPLACE="$SRC_REPLACE
|
||||
s#!!MAN_DIR!!##g;
|
||||
s@!!MAN_DIR!!@@g;
|
||||
"
|
||||
fi
|
||||
|
||||
if [ "$menu_dir" != "" ]; then
|
||||
SRC_REPLACE="$SRC_REPLACE
|
||||
s#!!MENU_DIR!!#$prefix_dir/$menu_dir#g;
|
||||
s@!!MENU_DIR!!@$prefix_dir/$menu_dir@g;
|
||||
"
|
||||
else
|
||||
SRC_REPLACE="$SRC_REPLACE
|
||||
s#!!MENU_DIR!!##g;
|
||||
s@!!MENU_DIR!!@@g;
|
||||
"
|
||||
fi
|
||||
}
|
||||
|
||||
generate_menu_item() {
|
||||
MENU_REPLACE="
|
||||
s~!!TTD!!~$TTD~g;
|
||||
s~!!MENU_GROUP!!~$menu_group~g;
|
||||
s~!!MENU_NAME!!~$menu_name~g
|
||||
s@!!TTD!!@$TTD@g;
|
||||
s@!!MENU_GROUP!!@$menu_group@g;
|
||||
s@!!MENU_NAME!!@$menu_name@g
|
||||
"
|
||||
log 1 "Generating menu item..."
|
||||
mkdir -p media
|
||||
|
27
configure
vendored
27
configure
vendored
@@ -1,5 +1,13 @@
|
||||
#!/bin/sh
|
||||
|
||||
check_path_characters() {
|
||||
if [ -n "`echo $ROOT_DIR | grep '[^-_A-Za-z0-9\/\\\.:]'`" ]; then
|
||||
echo "WARNING: The path contains a non-alphanumeric character that might cause"
|
||||
echo " failures in subsequent build stages. Any failures with the build"
|
||||
echo " will most likely be caused by this."
|
||||
fi
|
||||
}
|
||||
|
||||
CONFIGURE_EXECUTABLE="$_"
|
||||
# On *nix systems those two are equal when ./configure is done
|
||||
if [ "$0" != "$CONFIGURE_EXECUTABLE" ]; then
|
||||
@@ -14,9 +22,16 @@ if [ "$0" != "$CONFIGURE_EXECUTABLE" ]; then
|
||||
fi
|
||||
# Find out where configure is (in what dir)
|
||||
ROOT_DIR="`dirname $0`"
|
||||
ROOT_DIR="`cd $ROOT_DIR && pwd`"
|
||||
# For MSYS/MinGW we want to know the FULL path. This as that path is generated
|
||||
# once you call an outside binary. Having the same path for the rest is needed
|
||||
# for dependency checking.
|
||||
# pwd -W returns said FULL path, but doesn't exist on others so fall back.
|
||||
ROOT_DIR="`cd $ROOT_DIR && (pwd -W 2>/dev/null || pwd 2>/dev/null)`"
|
||||
|
||||
PWD="`pwd`"
|
||||
check_path_characters
|
||||
|
||||
# Same here as for the ROOT_DIR above
|
||||
PWD="`pwd -W 2>/dev/null || pwd 2>/dev/null`"
|
||||
PREFIX="$PWD/bin"
|
||||
|
||||
. $ROOT_DIR/config.lib
|
||||
@@ -37,7 +52,7 @@ if [ "$1" = "--reconfig" ] || [ "$1" = "--reconfigure" ]; then
|
||||
exit 1
|
||||
fi
|
||||
# Make sure we don't lock config.cache
|
||||
cat config.cache | sed 's~\\ ~\\\\ ~g' > cache.tmp
|
||||
cat config.cache | sed 's@\\ @\\\\ @g' > cache.tmp
|
||||
sh cache.tmp
|
||||
rm -f cache.tmp
|
||||
exit $?
|
||||
@@ -59,7 +74,7 @@ STRGEN="strgen$EXE"
|
||||
ENDIAN_CHECK="endian_check$EXE"
|
||||
|
||||
if [ -z "$sort" ]; then
|
||||
PIPE_SORT="sed s~a~a~"
|
||||
PIPE_SORT="sed s@a@a@"
|
||||
else
|
||||
PIPE_SORT="$sort"
|
||||
fi
|
||||
@@ -125,7 +140,7 @@ SRCS="` echo \"$SRCS\" | $awk ' { ORS = " " } { print $0; }'`"
|
||||
|
||||
# In makefiles, we always use -u for sort
|
||||
if [ -z "$sort" ]; then
|
||||
sort="sed s~a~a~"
|
||||
sort="sed s@a@a@"
|
||||
else
|
||||
sort="$sort -u"
|
||||
fi
|
||||
@@ -135,3 +150,5 @@ CONFIGURE_FILES="$ROOT_DIR/configure $ROOT_DIR/config.lib $ROOT_DIR/Makefile.in
|
||||
generate_main
|
||||
generate_lang
|
||||
generate_src
|
||||
|
||||
check_path_characters
|
||||
|
@@ -1,7 +1,7 @@
|
||||
STRGEN USAGE
|
||||
------------
|
||||
This guide is only interesting for people who want to alter something
|
||||
themselves without access to WT2 (translator2.openttd.org). Please note that
|
||||
themselves without access to translator.openttd.org. Please note that
|
||||
your compiled language file will only be compatible with the OpenTTD version
|
||||
you have downloaded english.txt, the master language file, for. While this is
|
||||
not always true, namely when changes in the code have not touched language
|
||||
|
@@ -86,17 +86,17 @@ elif [ -d "$ROOT_DIR/.git" ]; then
|
||||
fi
|
||||
HASH=`LC_ALL=C git rev-parse --verify HEAD 2>/dev/null`
|
||||
REV="g`echo $HASH | cut -c1-8`"
|
||||
BRANCH=`git branch|grep '[*]' | sed 's~\* ~~;s~^master$~~'`
|
||||
REV_NR=`LC_ALL=C git log --pretty=format:%s "$SRC_DIR" | grep "^(svn r[0-9]*)" | head -n 1 | sed "s~.*(svn r\([0-9]*\)).*~\1~"`
|
||||
BRANCH=`git branch|grep '[*]' | sed 's@\* @@;s@^master$@@'`
|
||||
REV_NR=`LC_ALL=C git log --pretty=format:%s "$SRC_DIR" | grep "^(svn r[0-9]*)" | head -n 1 | sed "s@.*(svn r\([0-9]*\)).*@\1@"`
|
||||
elif [ -d "$ROOT_DIR/.hg" ]; then
|
||||
# We are a hg checkout
|
||||
if [ -n "`hg status \"$SRC_DIR\" | grep -v '^?'`" ]; then
|
||||
MODIFIED="2"
|
||||
fi
|
||||
HASH=`LC_ALL=C hg parents 2>/dev/null | head -n 1 | cut -d: -f3`
|
||||
HASH=`LC_ALL=C hg parents --template="{node}"`
|
||||
REV="h`echo $HASH | cut -c1-8`"
|
||||
BRANCH=`hg branch | sed 's~^default$~~'`
|
||||
REV_NR=`LC_ALL=C hg log -r $HASH:0 -k "svn" -l 1 --template "{desc}\n" "$SRC_DIR" | grep "^(svn r[0-9]*)" | head -n 1 | sed "s~.*(svn r\([0-9]*\)).*~\1~"`
|
||||
BRANCH=`hg branch | sed 's@^default$@@'`
|
||||
REV_NR=`LC_ALL=C hg log -r $HASH:0 -k "svn" -l 1 --template "{desc}\n" "$SRC_DIR" | grep "^(svn r[0-9]*)" | head -n 1 | sed "s@.*(svn r\([0-9]*\)).*@\1@"`
|
||||
else
|
||||
# We don't know
|
||||
MODIFIED="1"
|
||||
|
@@ -11,13 +11,19 @@ by the number below on http://bugs.openttd.org.
|
||||
If the bug report is closed, it has been fixed, which then can be verified
|
||||
in the latest SVN version of /trunk.
|
||||
|
||||
Bugs for 0.7.0-beta2
|
||||
Bugs for 0.7.2
|
||||
------------------------------------------------------------------------
|
||||
URL: http://bugs.openttd.org
|
||||
|
||||
- 2689 Capacity ordering of articulated vehicle in build vehicle window is wrong
|
||||
- 3057 Road vehicle sometimes 'forget' the need for servicing
|
||||
- 3040 Not all alternatives are always shown in the "Join station" list
|
||||
- 2955 With path signals depots are less likely to be visited
|
||||
- 2891 Ignore signal does not keep the train running when in path signalled block till the next signal
|
||||
- 2769 No offer for buying bankrupt AIs
|
||||
- 2737 Self-crossing trains ignore "forbid 90 degree turn" setting
|
||||
- 2616 Cloning creates vehicles with invalid subcargos
|
||||
- 2585 [OSX] OS' mouse pointer showing
|
||||
- 2484 [OSX] Cannot enter CJK characters
|
||||
- 2427 Vehicle owner gets paid for whole cargo feeder share
|
||||
- 1944 Road vehicles not picking empty drivethrough platform
|
||||
- 1762 Strange Autoreplace behaviour
|
||||
|
@@ -1,17 +1,70 @@
|
||||
openttd (0.7~svn-1) UNRELEASED; urgency=low
|
||||
openttd (0.7.2) unstable; urgency=low
|
||||
|
||||
* Unreleased SVN version. Versioned to allow normal upgrades to released
|
||||
versions.
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 03 Sep 2008 18:56:04 +0200
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 01 Aug 2009 00:19:43 +0200
|
||||
|
||||
openttd (0.7.0-beta2) unstable; urgency=low
|
||||
openttd (0.7.2~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 21 Jul 2009 20:25:56 +0200
|
||||
|
||||
openttd (0.7.2~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 15 Jul 2009 22:25:56 +0200
|
||||
|
||||
openttd (0.7.1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 09 Jun 2009 01:34:56 +0200
|
||||
|
||||
openttd (0.7.1~RC3) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 03 Jun 2009 15:34:56 +0200
|
||||
|
||||
openttd (0.7.1~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 21 Mar 2009 14:34:56 +0200
|
||||
|
||||
openttd (0.7.1~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 11 Mar 2009 17:34:56 +0200
|
||||
|
||||
openttd (0.7.0) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Apr 2009 13:37:42 +0000
|
||||
|
||||
openttd (0.7.0~RC2) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 23 Mar 2009 00:42:00 +0200
|
||||
|
||||
openttd (0.7.0~RC1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 16 Mar 2009 00:07:00 +0200
|
||||
|
||||
openttd (0.7.0~beta2) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 10 Mar 2009 00:33:05 +0100
|
||||
|
||||
openttd (0.7.0-beta1) unstable; urgency=low
|
||||
openttd (0.7.0~beta1) unstable; urgency=low
|
||||
|
||||
* New upstream release.
|
||||
|
||||
|
@@ -10,7 +10,7 @@
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
Name: openttd
|
||||
Version: 0.7.0
|
||||
Version: 0.7.2
|
||||
Release: 1%{?dist}
|
||||
|
||||
Group: Amusements/Games
|
||||
|
@@ -1,11 +1,11 @@
|
||||
!define APPNAME "OpenTTD" ; Define application name
|
||||
!define APPVERSION "0.7.0" ; Define application version
|
||||
!define INSTALLERVERSION 55 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
|
||||
!define APPVERSION "0.7.2" ; Define application version
|
||||
!define APPVERSIONINTERNAL "0.7.2.0" ; Define application version in X.X.X.X
|
||||
!define INSTALLERVERSION 65 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
|
||||
!include ${VERSION_INCLUDE}
|
||||
|
||||
!define APPURLLINK "http://www.openttd.org"
|
||||
!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}"
|
||||
!define APPVERSIONINTERNAL "${APPVERSION}.0" ; Needs to be of the format X.X.X.X
|
||||
|
||||
!define MUI_ICON "..\..\..\media\openttd.ico"
|
||||
!define MUI_UNICON "..\..\..\media\openttd.ico"
|
||||
@@ -112,13 +112,6 @@ Section "!OpenTTD" Section1
|
||||
File ${PATH_ROOT}bin\data\*.grf
|
||||
File ${PATH_ROOT}bin\data\*.obg
|
||||
File ${PATH_ROOT}bin\data\opntitle.dat
|
||||
; Copy scenario files (don't choke if they don't exist)
|
||||
SetOutPath "$INSTDIR\scenario\"
|
||||
File /nonfatal ${PATH_ROOT}bin\scenario\*.scn
|
||||
|
||||
; Copy heightmap files (don't choke if they don't exist)
|
||||
SetOutPath "$INSTDIR\scenario\heightmap\"
|
||||
File /nonfatal ${PATH_ROOT}bin\scenario\heightmap\*.*
|
||||
|
||||
; Copy the scripts
|
||||
SetOutPath "$INSTDIR\scripts\"
|
||||
|
@@ -16,10 +16,10 @@ End Sub
|
||||
|
||||
Sub UpdateFile(modified, revision, version, cur_date, filename)
|
||||
FSO.CopyFile filename & ".in", filename
|
||||
FindReplaceInFile filename, "@@MODIFIED@@", modified
|
||||
FindReplaceInFile filename, "@@REVISION@@", revision
|
||||
FindReplaceInFile filename, "@@VERSION@@", version
|
||||
FindReplaceInFile filename, "@@DATE@@", cur_date
|
||||
FindReplaceInFile filename, "!!MODIFIED!!", modified
|
||||
FindReplaceInFile filename, "!!REVISION!!", revision
|
||||
FindReplaceInFile filename, "!!VERSION!!", version
|
||||
FindReplaceInFile filename, "!!DATE!!", cur_date
|
||||
End Sub
|
||||
|
||||
Sub UpdateFiles(version)
|
||||
@@ -32,6 +32,7 @@ Sub UpdateFiles(version)
|
||||
modified = Mid(version, InStrRev(version, Chr(9)) + 1)
|
||||
version = Mid(version, 1, InStr(version, Chr(9)) - 1)
|
||||
Else
|
||||
version = "0.7.2"
|
||||
revision = 0
|
||||
modified = 1
|
||||
End If
|
||||
|
@@ -436,6 +436,21 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\luxembourgish.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating luxembourgish language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
"
|
||||
AdditionalDependencies=""
|
||||
Outputs="..\bin\lang\luxembourgish.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\norwegian_bokmal.txt"
|
||||
>
|
||||
@@ -466,21 +481,6 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\origveh.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating origveh language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
"
|
||||
AdditionalDependencies=""
|
||||
Outputs="..\bin\lang\origveh.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\piglatin.txt"
|
||||
>
|
||||
@@ -556,6 +556,21 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\serbian.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating serbian language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
"
|
||||
AdditionalDependencies=""
|
||||
Outputs="..\bin\lang\serbian.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\simplified_chinese.txt"
|
||||
>
|
||||
|
@@ -437,6 +437,21 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\luxembourgish.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating luxembourgish language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
"
|
||||
AdditionalDependencies=""
|
||||
Outputs="..\bin\lang\luxembourgish.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\norwegian_bokmal.txt"
|
||||
>
|
||||
@@ -467,21 +482,6 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\origveh.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating origveh language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
"
|
||||
AdditionalDependencies=""
|
||||
Outputs="..\bin\lang\origveh.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\piglatin.txt"
|
||||
>
|
||||
@@ -557,6 +557,21 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\serbian.txt"
|
||||
>
|
||||
<FileConfiguration
|
||||
Name="Debug|Win32"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
Description="Generating serbian language file"
|
||||
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang "$(InputPath)"
"
|
||||
AdditionalDependencies=""
|
||||
Outputs="..\bin\lang\serbian.lng"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File
|
||||
RelativePath="..\src\lang\simplified_chinese.txt"
|
||||
>
|
||||
|
@@ -60,7 +60,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -103,6 +103,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
OptimizeForWindows98="1"
|
||||
TargetMachine="1"
|
||||
@@ -201,6 +203,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
@@ -269,7 +273,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -312,6 +316,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
OptimizeForWindows98="1"
|
||||
TargetMachine="17"
|
||||
@@ -413,6 +419,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
@@ -947,6 +955,10 @@
|
||||
RelativePath=".\..\src\driver.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\economy_base.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\economy_func.h"
|
||||
>
|
||||
@@ -1971,6 +1983,10 @@
|
||||
RelativePath=".\..\src\ship_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\signs_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\station_cmd.cpp"
|
||||
>
|
||||
@@ -2003,10 +2019,18 @@
|
||||
RelativePath=".\..\src\unmovable_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\vehicle_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\water_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\waypoint_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Save/Load handlers"
|
||||
@@ -2647,6 +2671,10 @@
|
||||
RelativePath=".\..\src\ai\api\ai_sign.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_signlist.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_station.hpp"
|
||||
>
|
||||
@@ -2851,6 +2879,10 @@
|
||||
RelativePath=".\..\src\ai\api\ai_sign.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_signlist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_station.cpp"
|
||||
>
|
||||
|
@@ -60,7 +60,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -103,6 +103,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
OptimizeForWindows98="1"
|
||||
TargetMachine="1"
|
||||
@@ -201,6 +203,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
<Tool
|
||||
@@ -269,7 +273,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -312,6 +316,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
OptimizeForWindows98="1"
|
||||
TargetMachine="17"
|
||||
@@ -413,6 +419,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
|
@@ -61,7 +61,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -104,6 +104,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
@@ -200,6 +202,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="1"
|
||||
@@ -267,7 +271,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -310,6 +314,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
@@ -410,6 +416,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
@@ -944,6 +952,10 @@
|
||||
RelativePath=".\..\src\driver.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\economy_base.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\economy_func.h"
|
||||
>
|
||||
@@ -1968,6 +1980,10 @@
|
||||
RelativePath=".\..\src\ship_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\signs_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\station_cmd.cpp"
|
||||
>
|
||||
@@ -2000,10 +2016,18 @@
|
||||
RelativePath=".\..\src\unmovable_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\vehicle_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\water_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\waypoint_cmd.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Save/Load handlers"
|
||||
@@ -2644,6 +2668,10 @@
|
||||
RelativePath=".\..\src\ai\api\ai_sign.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_signlist.hpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_station.hpp"
|
||||
>
|
||||
@@ -2848,6 +2876,10 @@
|
||||
RelativePath=".\..\src\ai\api\ai_sign.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_signlist.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\..\src\ai\api\ai_station.cpp"
|
||||
>
|
||||
|
@@ -61,7 +61,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\""
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -104,6 +104,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
@@ -200,6 +202,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="1"
|
||||
@@ -267,7 +271,7 @@
|
||||
FavorSizeOrSpeed="2"
|
||||
OmitFramePointers="true"
|
||||
AdditionalIncludeDirectories="..\objs\langs;..\src\3rdparty\squirrel\include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64;WITH_ASSERT"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_EXCEPTION_TRACKER;WIN32_ENABLE_DIRECTMUSIC_SUPPORT;WITH_ZLIB;WITH_PNG;WITH_FREETYPE;WITH_ICU;ENABLE_NETWORK;WITH_PERSONAL_DIR;PERSONAL_DIR=\"OpenTTD\";_SQ64"
|
||||
StringPooling="true"
|
||||
ExceptionHandling="1"
|
||||
RuntimeLibrary="0"
|
||||
@@ -310,6 +314,8 @@
|
||||
IgnoreDefaultLibraryNames=""
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
OptimizeReferences="2"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
@@ -410,6 +416,8 @@
|
||||
IgnoreDefaultLibraryNames="LIBCMT.lib"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
StackReserveSize="1048576"
|
||||
StackCommitSize="1048576"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
<Tool
|
||||
|
35
readme.txt
35
readme.txt
@@ -1,6 +1,6 @@
|
||||
OpenTTD README
|
||||
Last updated: 2009-03-10
|
||||
Release version: 0.7.0-beta2
|
||||
Last updated: 2009-08-01
|
||||
Release version: 0.7.2
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -65,6 +65,8 @@ Please include the following information in your bug report:
|
||||
version without the bug and the first version including
|
||||
the bug. That way we can fix it quicker by looking at the
|
||||
changes made.
|
||||
- Attach crash.dmp, crash.log and crash.sav from the data
|
||||
directory if they exist.
|
||||
|
||||
2.2) Reporting Desyncs:
|
||||
---- ------------------
|
||||
@@ -189,6 +191,9 @@ 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.
|
||||
|
||||
If you want AIs use the in-game content downloader to download some or download
|
||||
some from the internet and place them in the ai/ directory.
|
||||
|
||||
4.2) OpenTTD directories
|
||||
---- -------------------------------
|
||||
|
||||
@@ -251,9 +256,11 @@ features known from TTDPatch (http://www.ttdpatch.net/).
|
||||
|
||||
Several important non-standard controls:
|
||||
|
||||
* Use Ctrl to place semaphore signals
|
||||
* Ctrl makes many commands more powerful. For example Ctrl clicking on signals
|
||||
with the build signal tool changes their behaviour.
|
||||
* Ingame console. More information at
|
||||
http://wiki.openttd.org/index.php/Console
|
||||
* Right clicking shows tooltips
|
||||
|
||||
|
||||
5.1) Logging of potentially dangerous actions:
|
||||
@@ -291,6 +298,9 @@ OpenTTD in debug mode.
|
||||
The configuration file for OpenTTD (openttd.cfg) is in a simple Windows-like
|
||||
.INI format. It's mostly undocumented. Almost all settings can be changed
|
||||
ingame by using the 'Advanced Settings' window.
|
||||
When you can not 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
|
||||
create one after closing.
|
||||
|
||||
|
||||
7.0) Compiling:
|
||||
@@ -374,10 +384,8 @@ The following libraries are used by OpenTTD for:
|
||||
See http://www.openttd.org/development for up-to-date information.
|
||||
|
||||
The use of the online Translator service, located at
|
||||
http://translator2.openttd.org/, is highly encouraged. For a username/password
|
||||
combo you should contact the development team, either by mail, IRC or the
|
||||
forums. The system is straightforward to use, and if you have any problems,
|
||||
read the online help located there.
|
||||
http://translator.openttd.org/, is highly encouraged. For getting an account
|
||||
simply follow the guidelines in the FAQ of the translator website.
|
||||
|
||||
If for some reason the website is down for a longer period of time, the
|
||||
information below might be of help.
|
||||
@@ -467,26 +475,27 @@ The OpenTTD team (in alphabetical order):
|
||||
Matthijs Kooijman (blathijs) - Pathfinder-guru, pool rework
|
||||
Victor Fischer (Celestar) - Programming everywhere you need him to
|
||||
Christoph Elsenhans (frosch) - General coding
|
||||
Loïc Guilloux (glx) - General coding
|
||||
Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)
|
||||
Jonathan Coome (Maedhros) - High priest of the NewGRF Temple
|
||||
Loïc Guilloux (glx) - Windows Expert
|
||||
Michael Lutz (michi_cc) - Path based signals
|
||||
Attila Bán (MiHaMiX) - WebTranslator, Nightlies, Wiki and bugtracker host
|
||||
Owen Rudge (orudge) - Forum host, OS/2 port
|
||||
Peter Nelson (peter1138) - Spiritual descendant from newGRF gods
|
||||
Remko Bijker (Rubidium) - Lead coder and way more
|
||||
Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker
|
||||
Zdenek Sojka (SmatZ) - Bug finder and fixer
|
||||
Thijs Marinussen (Yexo) - AI Framework
|
||||
|
||||
Inactive Developers:
|
||||
Tamás Faragó (Darkvater) - Ex-Lead coder
|
||||
Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)
|
||||
Jonathan Coome (Maedhros) - High priest of the NewGRF Temple
|
||||
Attila Bán (MiHaMiX) - WebTranslator, Nightlies, Wiki and bugtracker host
|
||||
Christoph Mallon (Tron) - Programmer, code correctness police
|
||||
|
||||
Retired Developers:
|
||||
Ludvig Strigeus (ludde) - OpenTTD author, main coder (0.1 - 0.3.3)
|
||||
Serge Paquet (vurlix) - Assistant project manager, coder (0.1 - 0.3.3)
|
||||
Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3.0 - 0.3.6)
|
||||
Patric Stout (TrueLight) - Programmer, webhoster (0.3 - pre0.6)
|
||||
Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker
|
||||
Patric Stout (TrueLight) - Programmer, webhoster (0.3 - pre0.7)
|
||||
|
||||
Thanks to:
|
||||
Josef Drexler - For his great work on TTDPatch.
|
||||
|
@@ -167,6 +167,7 @@ direction_func.h
|
||||
direction_type.h
|
||||
music/dmusic.h
|
||||
driver.h
|
||||
economy_base.h
|
||||
economy_func.h
|
||||
economy_type.h
|
||||
effectvehicle_base.h
|
||||
@@ -441,6 +442,7 @@ rail_cmd.cpp
|
||||
road_cmd.cpp
|
||||
roadveh_cmd.cpp
|
||||
ship_cmd.cpp
|
||||
signs_cmd.cpp
|
||||
station_cmd.cpp
|
||||
terraform_cmd.cpp
|
||||
timetable_cmd.cpp
|
||||
@@ -449,7 +451,9 @@ train_cmd.cpp
|
||||
tree_cmd.cpp
|
||||
tunnelbridge_cmd.cpp
|
||||
unmovable_cmd.cpp
|
||||
vehicle_cmd.cpp
|
||||
water_cmd.cpp
|
||||
waypoint_cmd.cpp
|
||||
|
||||
# Save/Load handlers
|
||||
saveload/afterload.cpp
|
||||
@@ -617,6 +621,7 @@ ai/api/ai_rail.hpp
|
||||
ai/api/ai_railtypelist.hpp
|
||||
ai/api/ai_road.hpp
|
||||
ai/api/ai_sign.hpp
|
||||
ai/api/ai_signlist.hpp
|
||||
ai/api/ai_station.hpp
|
||||
ai/api/ai_stationlist.hpp
|
||||
ai/api/ai_subsidy.hpp
|
||||
@@ -669,6 +674,7 @@ ai/api/ai_rail.cpp
|
||||
ai/api/ai_railtypelist.cpp
|
||||
ai/api/ai_road.cpp
|
||||
ai/api/ai_sign.cpp
|
||||
ai/api/ai_signlist.cpp
|
||||
ai/api/ai_station.cpp
|
||||
ai/api/ai_stationlist.cpp
|
||||
ai/api/ai_subsidy.cpp
|
||||
|
1
src/3rdparty/squirrel/include/squirrel.h
vendored
1
src/3rdparty/squirrel/include/squirrel.h
vendored
@@ -275,6 +275,7 @@ typedef struct tagSQRegFunction{
|
||||
}SQRegFunction;
|
||||
|
||||
/*vm*/
|
||||
SQUIRREL_API bool sq_can_suspend(HSQUIRRELVM v);
|
||||
SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
|
||||
SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
|
||||
SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
|
||||
|
5
src/3rdparty/squirrel/squirrel/sqapi.cpp
vendored
5
src/3rdparty/squirrel/squirrel/sqapi.cpp
vendored
@@ -90,6 +90,11 @@ SQInteger sq_getvmstate(HSQUIRRELVM v)
|
||||
}
|
||||
}
|
||||
|
||||
bool sq_can_suspend(HSQUIRRELVM v)
|
||||
{
|
||||
return v->_nnativecalls <= 2;
|
||||
}
|
||||
|
||||
void sq_seterrorhandler(HSQUIRRELVM v)
|
||||
{
|
||||
SQObject o = stack_get(v, -1);
|
||||
|
6
src/3rdparty/squirrel/squirrel/sqstate.cpp
vendored
6
src/3rdparty/squirrel/squirrel/sqstate.cpp
vendored
@@ -189,8 +189,12 @@ SQSharedState::~SQSharedState()
|
||||
SQCollectable *t = _gc_chain;
|
||||
SQCollectable *nx = NULL;
|
||||
while(t) {
|
||||
t->UnMark();
|
||||
t->_uiRef++;
|
||||
t = t->_next;
|
||||
}
|
||||
t = _gc_chain;
|
||||
while(t) {
|
||||
t->UnMark();
|
||||
t->Finalize();
|
||||
nx = t->_next;
|
||||
if(--t->_uiRef == 0)
|
||||
|
18
src/3rdparty/squirrel/squirrel/sqvm.cpp
vendored
18
src/3rdparty/squirrel/squirrel/sqvm.cpp
vendored
@@ -83,7 +83,7 @@ SQVM::SQVM(SQSharedState *ss)
|
||||
_suspended = SQFalse;
|
||||
_suspended_target=-1;
|
||||
_suspended_root = SQFalse;
|
||||
_suspended_traps=-1;
|
||||
_suspended_traps=0;
|
||||
_foreignptr=NULL;
|
||||
_nnativecalls=0;
|
||||
_lasterror = _null_;
|
||||
@@ -688,6 +688,7 @@ bool SQVM::Execute(SQObjectPtr &closure, SQInteger target, SQInteger nargs, SQIn
|
||||
_suspended = SQFalse;
|
||||
break;
|
||||
case ET_RESUME_OPENTTD:
|
||||
traps = _suspended_traps;
|
||||
_suspended = SQFalse;
|
||||
break;
|
||||
}
|
||||
@@ -698,7 +699,7 @@ exception_restore:
|
||||
for(;;)
|
||||
{
|
||||
DecreaseOps(1);
|
||||
if (ShouldSuspend()) { _suspended = SQTrue; return true; }
|
||||
if (ShouldSuspend()) { _suspended = SQTrue; _suspended_traps = traps; return true; }
|
||||
|
||||
const SQInstruction &_i_ = *ci->_ip++;
|
||||
//dumpstack(_stackbase);
|
||||
@@ -748,7 +749,16 @@ common_call:
|
||||
case OT_NATIVECLOSURE: {
|
||||
bool suspend;
|
||||
_suspended_target = ct_target;
|
||||
_GUARD(CallNative(_nativeclosure(clo), arg3, ct_stackbase, clo,suspend));
|
||||
try {
|
||||
_GUARD(CallNative(_nativeclosure(clo), arg3, ct_stackbase, clo,suspend));
|
||||
} catch (...) {
|
||||
_suspended = SQTrue;
|
||||
_suspended_target = ct_target;
|
||||
_suspended_root = ci->_root;
|
||||
_suspended_traps = traps;
|
||||
_suspend_varargs = ci->_vargs;
|
||||
throw;
|
||||
}
|
||||
if(suspend){
|
||||
_suspended = SQTrue;
|
||||
_suspended_target = ct_target;
|
||||
@@ -928,7 +938,7 @@ common_call:
|
||||
traps -= ci->_etraps;
|
||||
if(sarg1 != MAX_FUNC_STACKSIZE) STK(arg1) = temp_reg;
|
||||
}
|
||||
else { Raise_Error(_SC("trying to yield a '%s',only genenerator can be yielded"), GetTypeName(ci->_generator)); SQ_THROW();}
|
||||
else { Raise_Error(_SC("trying to yield a '%s',only genenerator can be yielded"), GetTypeName(ci->_closure)); SQ_THROW();}
|
||||
if(Return(arg0, arg1, temp_reg)){
|
||||
assert(traps == 0);
|
||||
outres = temp_reg;
|
||||
|
@@ -103,6 +103,11 @@ struct AIListWindow : public Window {
|
||||
sprintf(buf, "%d", selected_info->GetVersion());
|
||||
DoDrawStringTruncated(buf, x + 5, y, TC_BLACK, this->width - x - 8);
|
||||
y += 13;
|
||||
if (selected_info->GetURL() != NULL) {
|
||||
SetDParamStr(0, selected_info->GetURL());
|
||||
DrawString(4, y, STR_AI_URL, TC_BLACK);
|
||||
y += 13;
|
||||
}
|
||||
SetDParamStr(0, selected_info->GetDescription());
|
||||
DrawStringMultiLine(4, y, STR_JUST_RAW_STRING, this->width - 8, this->widget[AIL_WIDGET_INFO_BG].bottom - y);
|
||||
}
|
||||
@@ -195,12 +200,12 @@ static const Widget _ai_list_widgets[] = {
|
||||
};
|
||||
|
||||
/* Window definition for the ai list window. */
|
||||
static const WindowDesc _ai_list_desc = {
|
||||
static const WindowDesc _ai_list_desc(
|
||||
WDP_CENTER, WDP_CENTER, 200, 234, 200, 234,
|
||||
WC_AI_LIST, WC_NONE,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
|
||||
_ai_list_widgets
|
||||
};
|
||||
);
|
||||
|
||||
void ShowAIListWindow(CompanyID slot)
|
||||
{
|
||||
@@ -377,12 +382,12 @@ static const Widget _ai_settings_widgets[] = {
|
||||
};
|
||||
|
||||
/* Window definition for the AI settings window. */
|
||||
static const WindowDesc _ai_settings_desc = {
|
||||
static const WindowDesc _ai_settings_desc(
|
||||
WDP_CENTER, WDP_CENTER, 200, 208, 500, 208,
|
||||
WC_AI_SETTINGS, WC_NONE,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
|
||||
_ai_settings_widgets
|
||||
};
|
||||
);
|
||||
|
||||
void ShowAISettingsWindow(CompanyID slot)
|
||||
{
|
||||
@@ -405,12 +410,12 @@ static const Widget _ai_config_widgets[] = {
|
||||
};
|
||||
|
||||
/* Window definition for the configure AI window. */
|
||||
static const WindowDesc _ai_config_desc = {
|
||||
static const WindowDesc _ai_config_desc(
|
||||
WDP_CENTER, WDP_CENTER, 300, 172, 300, 172,
|
||||
WC_GAME_OPTIONS, WC_NONE,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
|
||||
_ai_config_widgets
|
||||
};
|
||||
);
|
||||
|
||||
/**
|
||||
* Window to configure which AIs will start.
|
||||
@@ -556,6 +561,7 @@ struct AIDebugWindow : public Window {
|
||||
enum AIDebugWindowWidgets {
|
||||
AID_WIDGET_CLOSEBOX = 0,
|
||||
AID_WIDGET_CAPTION,
|
||||
AID_WIDGET_STICKY,
|
||||
AID_WIDGET_VIEW,
|
||||
AID_WIDGET_NAME_TEXT,
|
||||
AID_WIDGET_RELOAD_TOGGLE,
|
||||
@@ -575,6 +581,8 @@ struct AIDebugWindow : public Window {
|
||||
|
||||
static CompanyID ai_debug_company;
|
||||
int redraw_timer;
|
||||
int last_vscroll_pos;
|
||||
bool autoscroll;
|
||||
|
||||
AIDebugWindow(const WindowDesc *desc, WindowNumber number) : Window(desc, number)
|
||||
{
|
||||
@@ -587,6 +595,8 @@ struct AIDebugWindow : public Window {
|
||||
this->vscroll.cap = 14;
|
||||
this->vscroll.pos = 0;
|
||||
this->resize.step_height = 12;
|
||||
this->last_vscroll_pos = 0;
|
||||
this->autoscroll = true;
|
||||
|
||||
if (ai_debug_company != INVALID_COMPANY) this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
|
||||
|
||||
@@ -596,7 +606,7 @@ struct AIDebugWindow : public Window {
|
||||
virtual void OnPaint()
|
||||
{
|
||||
/* Check if the currently selected company is still active. */
|
||||
if (ai_debug_company == INVALID_COMPANY || !IsValidCompanyID(ai_debug_company)) {
|
||||
if (ai_debug_company == INVALID_COMPANY || !IsValidCompanyID(ai_debug_company) || !GetCompany(ai_debug_company)->is_ai) {
|
||||
if (ai_debug_company != INVALID_COMPANY) {
|
||||
/* Raise and disable the widget for the previous selection. */
|
||||
this->RaiseWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
|
||||
@@ -664,13 +674,35 @@ struct AIDebugWindow : public Window {
|
||||
AILog::LogData *log = (AILog::LogData *)AIObject::GetLogPointer();
|
||||
_current_company = old_company;
|
||||
|
||||
SetVScrollCount(this, (log == NULL) ? 0 : log->used);
|
||||
this->InvalidateWidget(AID_WIDGET_SCROLLBAR);
|
||||
int scroll_count = (log == NULL) ? 0 : log->used;
|
||||
if (this->vscroll.count != scroll_count) {
|
||||
SetVScrollCount(this, scroll_count);
|
||||
|
||||
/* We need a repaint */
|
||||
this->InvalidateWidget(AID_WIDGET_SCROLLBAR);
|
||||
}
|
||||
|
||||
if (log == NULL) return;
|
||||
|
||||
/* Detect when the user scrolls the window. Enable autoscroll when the
|
||||
* bottom-most line becomes visible. */
|
||||
if (this->last_vscroll_pos != this->vscroll.pos) {
|
||||
this->autoscroll = this->vscroll.pos >= log->used - this->vscroll.cap;
|
||||
}
|
||||
if (this->autoscroll) {
|
||||
int scroll_pos = max(0, log->used - this->vscroll.cap);
|
||||
if (scroll_pos != this->vscroll.pos) {
|
||||
this->vscroll.pos = scroll_pos;
|
||||
|
||||
/* We need a repaint */
|
||||
this->InvalidateWidget(AID_WIDGET_SCROLLBAR);
|
||||
}
|
||||
}
|
||||
last_vscroll_pos = this->vscroll.pos;
|
||||
|
||||
int y = 6;
|
||||
for (int i = this->vscroll.pos; i < (this->vscroll.cap + this->vscroll.pos); i++) {
|
||||
uint pos = (log->count + log->pos - i) % log->count;
|
||||
for (int i = this->vscroll.pos; i < (this->vscroll.cap + this->vscroll.pos) && i < log->used; i++) {
|
||||
uint pos = (i + log->pos + 1 - log->used + log->count) % log->count;
|
||||
if (log->lines[pos] == NULL) break;
|
||||
|
||||
TextColour colour;
|
||||
@@ -688,16 +720,23 @@ struct AIDebugWindow : public Window {
|
||||
}
|
||||
}
|
||||
|
||||
void ChangeToAI(CompanyID show_ai)
|
||||
{
|
||||
this->RaiseWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
|
||||
ai_debug_company = show_ai;
|
||||
this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
|
||||
this->autoscroll = true;
|
||||
this->last_vscroll_pos = this->vscroll.pos;
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
virtual void OnClick(Point pt, int widget)
|
||||
{
|
||||
/* Check which button is clicked */
|
||||
if (IsInsideMM(widget, AID_WIDGET_COMPANY_BUTTON_START, AID_WIDGET_COMPANY_BUTTON_END + 1)) {
|
||||
/* Is it no on disable? */
|
||||
if (!this->IsWidgetDisabled(widget)) {
|
||||
this->RaiseWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
|
||||
ai_debug_company = (CompanyID)(widget - AID_WIDGET_COMPANY_BUTTON_START);
|
||||
this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
|
||||
this->SetDirty();
|
||||
ChangeToAI((CompanyID)(widget - AID_WIDGET_COMPANY_BUTTON_START));
|
||||
}
|
||||
}
|
||||
if (widget == AID_WIDGET_RELOAD_TOGGLE && !this->IsWidgetDisabled(widget)) {
|
||||
@@ -721,6 +760,7 @@ struct AIDebugWindow : public Window {
|
||||
virtual void OnResize(Point new_size, Point delta)
|
||||
{
|
||||
this->vscroll.cap += delta.y / (int)this->resize.step_height;
|
||||
SetVScrollCount(this, this->vscroll.count); // vscroll.pos should be in a valid range
|
||||
}
|
||||
};
|
||||
|
||||
@@ -729,6 +769,7 @@ CompanyID AIDebugWindow::ai_debug_company = INVALID_COMPANY;
|
||||
static const Widget _ai_debug_widgets[] = {
|
||||
{ WWT_CLOSEBOX, RESIZE_NONE, COLOUR_GREY, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // AID_WIDGET_CLOSEBOX
|
||||
{ WWT_CAPTION, RESIZE_RIGHT, COLOUR_GREY, 11, 298, 0, 13, STR_AI_DEBUG, STR_018C_WINDOW_TITLE_DRAG_THIS}, // AID_WIDGET_CAPTION
|
||||
{ WWT_STICKYBOX, RESIZE_LR, COLOUR_GREY, 287, 298, 0, 13, 0x0, STR_STICKY_BUTTON }, // AID_WIDGET_STICKY
|
||||
{ WWT_PANEL, RESIZE_RIGHT, COLOUR_GREY, 0, 298, 14, 40, 0x0, STR_NULL}, // AID_WIDGET_VIEW
|
||||
|
||||
{ WWT_PANEL, RESIZE_RIGHT, COLOUR_GREY, 0, 149, 41, 60, 0x0, STR_AI_DEBUG_NAME_TIP}, // AID_WIDGET_NAME_TEXT
|
||||
@@ -763,17 +804,19 @@ static const Widget _ai_debug_widgets[] = {
|
||||
{ WIDGETS_END},
|
||||
};
|
||||
|
||||
static const WindowDesc _ai_debug_desc = {
|
||||
static const WindowDesc _ai_debug_desc(
|
||||
WDP_AUTO, WDP_AUTO, 299, 241, 299, 241,
|
||||
WC_AI_DEBUG, WC_NONE,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE,
|
||||
_ai_debug_widgets
|
||||
};
|
||||
);
|
||||
|
||||
void ShowAIDebugWindow()
|
||||
void ShowAIDebugWindow(CompanyID show_company)
|
||||
{
|
||||
if (!_networking || _network_server) {
|
||||
AllocateWindowDescFront<AIDebugWindow>(&_ai_debug_desc, 0);
|
||||
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);
|
||||
} else {
|
||||
ShowErrorMessage(INVALID_STRING_ID, STR_AI_DEBUG_SERVER_ONLY, 0, 0);
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@
|
||||
#ifndef AI_GUI_HPP
|
||||
#define AI_GUI_HPP
|
||||
|
||||
void ShowAIDebugWindow();
|
||||
void ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY);
|
||||
void ShowAIConfigWindow();
|
||||
|
||||
#endif /* AI_GUI_HPP */
|
||||
|
@@ -36,6 +36,7 @@ AIFileInfo::~AIFileInfo()
|
||||
free((void *)this->description);
|
||||
free((void *)this->date);
|
||||
free((void *)this->instance_name);
|
||||
free((void *)this->url);
|
||||
free(this->main_script);
|
||||
free(this->SQ_instance);
|
||||
}
|
||||
@@ -98,6 +99,11 @@ bool AIFileInfo::CheckMethod(const char *name) const
|
||||
if (!info->engine->CallIntegerMethod(*info->SQ_instance, "GetVersion", &info->version)) return SQ_ERROR;
|
||||
if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "CreateInstance", &info->instance_name)) return SQ_ERROR;
|
||||
|
||||
/* The GetURL function is optional. */
|
||||
if (info->engine->MethodExists(*info->SQ_instance, "GetURL")) {
|
||||
if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetURL", &info->url)) return SQ_ERROR;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -125,6 +131,12 @@ bool AIFileInfo::CheckMethod(const char *name) const
|
||||
} else {
|
||||
info->min_loadable_version = info->GetVersion();
|
||||
}
|
||||
/* When there is an UseAsRandomAI function, call it. */
|
||||
if (info->engine->MethodExists(*info->SQ_instance, "UseAsRandomAI")) {
|
||||
if (!info->engine->CallBoolMethod(*info->SQ_instance, "UseAsRandomAI", &info->use_as_random)) return SQ_ERROR;
|
||||
} else {
|
||||
info->use_as_random = true;
|
||||
}
|
||||
|
||||
/* Remove the link to the real instance, else it might get deleted by RegisterAI() */
|
||||
sq_setinstanceup(vm, 2, NULL);
|
||||
|
@@ -41,7 +41,7 @@ public:
|
||||
friend class AIInfo;
|
||||
friend class AILibrary;
|
||||
|
||||
AIFileInfo() : SQ_instance(NULL), main_script(NULL), author(NULL), name(NULL), short_name(NULL), description(NULL), date(NULL), instance_name(NULL) {};
|
||||
AIFileInfo() : SQ_instance(NULL), main_script(NULL), author(NULL), name(NULL), short_name(NULL), description(NULL), date(NULL), instance_name(NULL), url(NULL) {};
|
||||
~AIFileInfo();
|
||||
|
||||
/**
|
||||
@@ -84,6 +84,11 @@ public:
|
||||
*/
|
||||
const char *GetInstanceName() const { return this->instance_name; }
|
||||
|
||||
/**
|
||||
* Get the website for this script.
|
||||
*/
|
||||
const char *GetURL() const { return this->url; }
|
||||
|
||||
/**
|
||||
* Get the filename of the main.nut script.
|
||||
*/
|
||||
@@ -111,6 +116,7 @@ private:
|
||||
const char *date;
|
||||
const char *instance_name;
|
||||
int version;
|
||||
const char *url;
|
||||
};
|
||||
|
||||
class AIInfo : public AIFileInfo {
|
||||
@@ -155,9 +161,15 @@ public:
|
||||
*/
|
||||
int GetSettingDefaultValue(const char *name) const;
|
||||
|
||||
/**
|
||||
* Use this AI as a random AI.
|
||||
*/
|
||||
bool UseAsRandomAI() const { return this->use_as_random; }
|
||||
|
||||
private:
|
||||
AIConfigItemList config_list;
|
||||
int min_loadable_version;
|
||||
bool use_as_random;
|
||||
};
|
||||
|
||||
class AILibrary : public AIFileInfo {
|
||||
|
@@ -31,7 +31,7 @@ class DummyAI extends AIController {
|
||||
function Start() { \n\
|
||||
AILog.Error(\"No suitable AI found to load.\"); \n\
|
||||
AILog.Error(\"This AI is a dummy AI and won't do anything.\"); \n\
|
||||
AILog.Error(\"Please add one or several AIs in your ai/ directory.\"); \n\
|
||||
AILog.Error(\"You can download several AIs via the 'Online Content' system.\"); \n\
|
||||
} \n\
|
||||
} \n\
|
||||
");
|
||||
|
@@ -7,6 +7,7 @@
|
||||
#include "../settings_type.h"
|
||||
#include "../vehicle_base.h"
|
||||
#include "../saveload/saveload.h"
|
||||
#include "../gui.h"
|
||||
#include "table/strings.h"
|
||||
|
||||
#include <squirrel.h>
|
||||
@@ -18,8 +19,10 @@
|
||||
#define DEFINE_SCRIPT_FILES
|
||||
|
||||
#include "ai_info.hpp"
|
||||
#include "ai_config.hpp"
|
||||
#include "ai_storage.hpp"
|
||||
#include "ai_instance.hpp"
|
||||
#include "ai_gui.hpp"
|
||||
|
||||
/* Convert all AI related classes to Squirrel data.
|
||||
* Note: this line a marker in squirrel_export.sh. Do not change! */
|
||||
@@ -57,6 +60,7 @@
|
||||
#include "api/ai_railtypelist.hpp.sq"
|
||||
#include "api/ai_road.hpp.sq"
|
||||
#include "api/ai_sign.hpp.sq"
|
||||
#include "api/ai_signlist.hpp.sq"
|
||||
#include "api/ai_station.hpp.sq"
|
||||
#include "api/ai_stationlist.hpp.sq"
|
||||
#include "api/ai_subsidy.hpp.sq"
|
||||
@@ -96,6 +100,7 @@ AIInstance::AIInstance(AIInfo *info) :
|
||||
instance(NULL),
|
||||
is_started(false),
|
||||
is_dead(false),
|
||||
is_save_data_on_stack(false),
|
||||
suspend(0),
|
||||
callback(NULL)
|
||||
{
|
||||
@@ -133,10 +138,6 @@ AIInstance::AIInstance(AIInfo *info) :
|
||||
|
||||
/* Register the API functions and classes */
|
||||
this->RegisterAPI();
|
||||
|
||||
/* The topmost stack item is true if there is data from a savegame
|
||||
* and false otherwise. */
|
||||
sq_pushbool(this->engine->vm, false);
|
||||
}
|
||||
|
||||
AIInstance::~AIInstance()
|
||||
@@ -209,6 +210,7 @@ void AIInstance::RegisterAPI()
|
||||
SQAIRailTypeList_Register(this->engine);
|
||||
SQAIRoad_Register(this->engine);
|
||||
SQAISign_Register(this->engine);
|
||||
SQAISignList_Register(this->engine);
|
||||
SQAIStation_Register(this->engine);
|
||||
SQAIStationList_Register(this->engine);
|
||||
SQAIStationList_Vehicle_Register(this->engine);
|
||||
@@ -251,6 +253,18 @@ void AIInstance::Died()
|
||||
delete this->engine;
|
||||
this->instance = NULL;
|
||||
this->engine = NULL;
|
||||
|
||||
ShowAIDebugWindow(_current_company);
|
||||
|
||||
const AIInfo *info = AIConfig::GetConfig(_current_company)->GetInfo();
|
||||
if (info != NULL) {
|
||||
ShowErrorMessage(INVALID_STRING_ID, STR_AI_PLEASE_REPORT_CRASH, 0, 0);
|
||||
|
||||
if (info->GetURL() != NULL) {
|
||||
AILog::Info("Please report the error to the following URL:");
|
||||
AILog::Info(info->GetURL());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AIInstance::GameLoop()
|
||||
@@ -269,6 +283,10 @@ void AIInstance::GameLoop()
|
||||
|
||||
/* If there is a callback to call, call that first */
|
||||
if (this->callback != NULL) {
|
||||
if (this->is_save_data_on_stack) {
|
||||
sq_poptop(this->engine->GetVM());
|
||||
this->is_save_data_on_stack = false;
|
||||
}
|
||||
try {
|
||||
this->callback(this);
|
||||
} catch (AI_VMSuspend e) {
|
||||
@@ -287,9 +305,17 @@ void AIInstance::GameLoop()
|
||||
AIObject::SetAllowDoCommand(false);
|
||||
/* Run the constructor if it exists. Don't allow any DoCommands in it. */
|
||||
if (this->engine->MethodExists(*this->instance, "constructor")) {
|
||||
if (!this->engine->CallMethod(*this->instance, "constructor")) { this->Died(); return; }
|
||||
if (!this->engine->CallMethod(*this->instance, "constructor", 100000) || this->engine->IsSuspended()) {
|
||||
if (this->engine->IsSuspended()) AILog::Error("This AI took too long to initialize. AI is not started.");
|
||||
this->Died();
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!this->CallLoad() || this->engine->IsSuspended()) {
|
||||
if (this->engine->IsSuspended()) AILog::Error("This AI took too long in the Load function. AI is not started.");
|
||||
this->Died();
|
||||
return;
|
||||
}
|
||||
if (!this->CallLoad()) { this->Died(); return; }
|
||||
AIObject::SetAllowDoCommand(true);
|
||||
/* Start the AI by calling Start() */
|
||||
if (!this->engine->CallMethod(*this->instance, "Start", _settings_game.ai.ai_max_opcode_till_suspend) || !this->engine->IsSuspended()) this->Died();
|
||||
@@ -301,6 +327,10 @@ void AIInstance::GameLoop()
|
||||
this->is_started = true;
|
||||
return;
|
||||
}
|
||||
if (this->is_save_data_on_stack) {
|
||||
sq_poptop(this->engine->GetVM());
|
||||
this->is_save_data_on_stack = false;
|
||||
}
|
||||
|
||||
/* Continue the VM */
|
||||
try {
|
||||
@@ -388,7 +418,7 @@ enum {
|
||||
/* static */ bool AIInstance::SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test)
|
||||
{
|
||||
if (max_depth == 0) {
|
||||
AILog::Error("Savedata can only be nested to 5 deep. No data saved.");
|
||||
AILog::Error("Savedata can only be nested to 25 deep. No data saved.");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -499,7 +529,7 @@ enum {
|
||||
}
|
||||
|
||||
default:
|
||||
AILog::Error("You tried to save unsupported type. No data saved.");
|
||||
AILog::Error("You tried to save an unsupported type. No data saved.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -519,20 +549,14 @@ void AIInstance::Save()
|
||||
}
|
||||
|
||||
HSQUIRRELVM vm = this->engine->GetVM();
|
||||
if (!this->is_started) {
|
||||
SQBool res;
|
||||
sq_getbool(vm, -1, &res);
|
||||
if (!res) {
|
||||
SaveEmpty();
|
||||
return;
|
||||
}
|
||||
/* Push the loaded savegame data to the top of the stack. */
|
||||
sq_push(vm, -2);
|
||||
if (this->is_save_data_on_stack) {
|
||||
_ai_sl_byte = 1;
|
||||
SlObject(NULL, _ai_byte);
|
||||
/* Save the data that was just loaded. */
|
||||
SaveObject(vm, -1, AISAVE_MAX_DEPTH, false);
|
||||
sq_poptop(vm);
|
||||
} else if (!this->is_started) {
|
||||
SaveEmpty();
|
||||
return;
|
||||
} else if (this->engine->MethodExists(*this->instance, "Save")) {
|
||||
HSQOBJECT savedata;
|
||||
/* We don't want to be interrupted during the save function. */
|
||||
@@ -549,6 +573,7 @@ void AIInstance::Save()
|
||||
if (!sq_istable(savedata)) {
|
||||
AILog::Error("Save function should return a table.");
|
||||
SaveEmpty();
|
||||
this->engine->CrashOccurred();
|
||||
return;
|
||||
}
|
||||
sq_pushobject(vm, savedata);
|
||||
@@ -556,11 +581,11 @@ void AIInstance::Save()
|
||||
_ai_sl_byte = 1;
|
||||
SlObject(NULL, _ai_byte);
|
||||
SaveObject(vm, -1, AISAVE_MAX_DEPTH, false);
|
||||
this->is_save_data_on_stack = true;
|
||||
} else {
|
||||
_ai_sl_byte = 0;
|
||||
SlObject(NULL, _ai_byte);
|
||||
SaveEmpty();
|
||||
this->engine->CrashOccurred();
|
||||
}
|
||||
sq_pop(vm, 1);
|
||||
} else {
|
||||
AILog::Warning("Save function is not implemented");
|
||||
_ai_sl_byte = 0;
|
||||
@@ -647,21 +672,18 @@ void AIInstance::Load(int version)
|
||||
/* Check if there was anything saved at all. */
|
||||
if (_ai_sl_byte == 0) return;
|
||||
|
||||
/* First remove the value "false" since we have data to load. */
|
||||
sq_poptop(vm);
|
||||
sq_pushinteger(vm, version);
|
||||
LoadObjects(vm);
|
||||
sq_pushbool(vm, true);
|
||||
this->is_save_data_on_stack = true;
|
||||
}
|
||||
|
||||
bool AIInstance::CallLoad()
|
||||
{
|
||||
HSQUIRRELVM vm = this->engine->GetVM();
|
||||
/* Is there save data that we should load? */
|
||||
SQBool res;
|
||||
sq_getbool(vm, -1, &res);
|
||||
sq_poptop(vm);
|
||||
if (!res) return true;
|
||||
if (!this->is_save_data_on_stack) return true;
|
||||
/* Whatever happens, after CallLoad the savegame data is removed from the stack. */
|
||||
this->is_save_data_on_stack = false;
|
||||
|
||||
if (!this->engine->MethodExists(*this->instance, "Load")) {
|
||||
AILog::Warning("Loading failed: there was data for the AI to load, but the AI does not have a Load() function.");
|
||||
@@ -685,7 +707,7 @@ bool AIInstance::CallLoad()
|
||||
|
||||
/* Call the AI load function. sq_call removes the arguments (but not the
|
||||
* function pointer) from the stack. */
|
||||
if (SQ_FAILED(sq_call(vm, 3, SQFalse, SQFalse))) return false;
|
||||
if (SQ_FAILED(sq_call(vm, 3, SQFalse, SQFalse, 100000))) return false;
|
||||
|
||||
/* Pop 1) The version, 2) the savegame data, 3) the object instance, 4) the function pointer. */
|
||||
sq_pop(vm, 4);
|
||||
|
@@ -30,6 +30,7 @@ private:
|
||||
|
||||
class AIInstance {
|
||||
public:
|
||||
friend class AIObject;
|
||||
AIInstance(class AIInfo *info);
|
||||
~AIInstance();
|
||||
|
||||
@@ -117,6 +118,7 @@ private:
|
||||
|
||||
bool is_started;
|
||||
bool is_dead;
|
||||
bool is_save_data_on_stack;
|
||||
int suspend;
|
||||
AISuspendCallbackProc *callback;
|
||||
|
||||
|
@@ -20,7 +20,7 @@
|
||||
#include "ai_scanner.hpp"
|
||||
#include "api/ai_controller.hpp"
|
||||
|
||||
void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_recursive)
|
||||
void AIScanner::ScanDir(const char *dirname, bool library_scan)
|
||||
{
|
||||
extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
|
||||
extern bool FiosIsHiddenFile(const struct dirent *ent);
|
||||
@@ -48,19 +48,10 @@ void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_rec
|
||||
ttd_strlcpy(temp_script, dirname, sizeof(temp_script));
|
||||
ttd_strlcat(temp_script, d_name, sizeof(temp_script));
|
||||
|
||||
if (S_ISDIR(sb.st_mode)) {
|
||||
/* Libraries are always in a subdirectory of their category, so scan those */
|
||||
if (library_scan && !library_recursive) {
|
||||
ttd_strlcat(temp_script, PATHSEP, sizeof(temp_script));
|
||||
ScanDir(temp_script, library_scan, true);
|
||||
continue;
|
||||
}
|
||||
} else if (S_ISREG(sb.st_mode)) {
|
||||
if (S_ISREG(sb.st_mode)) {
|
||||
/* Only .tar files are allowed */
|
||||
char *ext = strrchr(d_name, '.');
|
||||
if (ext == NULL || strcasecmp(ext, ".tar") != 0) continue;
|
||||
/* .tar files are only allowed in the root of the library dir */
|
||||
if (library_recursive) continue;
|
||||
|
||||
/* We always expect a directory in the TAR */
|
||||
const char *first_dir = FioTarFirstDir(temp_script);
|
||||
@@ -69,7 +60,7 @@ void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_rec
|
||||
ttd_strlcat(temp_script, PATHSEP, sizeof(temp_script));
|
||||
ttd_strlcat(temp_script, first_dir, sizeof(temp_script));
|
||||
FioTarAddLink(temp_script, first_dir);
|
||||
} else {
|
||||
} else if (!S_ISDIR(sb.st_mode)) {
|
||||
/* Skip any other type of file */
|
||||
continue;
|
||||
}
|
||||
@@ -88,7 +79,7 @@ void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_rec
|
||||
if (!FioCheckFileExists(info_script, AI_DIR) || !FioCheckFileExists(main_script, AI_DIR)) continue;
|
||||
|
||||
DEBUG(ai, 6, "Loading AI at location '%s'", main_script);
|
||||
/* We don't care if one of the other scripst failed to load. */
|
||||
/* We don't care if one of the other scripts failed to load. */
|
||||
this->engine->ResetCrashed();
|
||||
this->engine->LoadScript(info_script);
|
||||
} else {
|
||||
@@ -162,7 +153,7 @@ AIScanner::AIScanner() :
|
||||
|
||||
/* Create the dummy AI */
|
||||
this->engine->ResetCrashed();
|
||||
strcpy(this->main_script, "%_dummy");
|
||||
strecpy(this->main_script, "%_dummy", lastof(this->main_script));
|
||||
extern void AI_CreateAIInfoDummy(HSQUIRRELVM vm);
|
||||
AI_CreateAIInfoDummy(this->engine->GetVM());
|
||||
}
|
||||
@@ -354,20 +345,31 @@ void AIScanner::RegisterAI(AIInfo *info)
|
||||
|
||||
AIInfo *AIScanner::SelectRandomAI()
|
||||
{
|
||||
if (this->info_single_list.size() == 0) {
|
||||
uint num_random_ais = 0;
|
||||
for (AIInfoList::iterator it = this->info_single_list.begin(); it != this->info_single_list.end(); it++) {
|
||||
if (it->second->UseAsRandomAI()) num_random_ais++;
|
||||
}
|
||||
|
||||
if (num_random_ais == 0) {
|
||||
DEBUG(ai, 0, "No suitable AI found, loading 'dummy' AI.");
|
||||
return this->info_dummy;
|
||||
}
|
||||
|
||||
/* Find a random AI */
|
||||
uint pos;
|
||||
if (_networking) pos = InteractiveRandomRange((uint16)this->info_single_list.size());
|
||||
else pos = RandomRange((uint16)this->info_single_list.size());
|
||||
if (_networking) {
|
||||
pos = InteractiveRandomRange(num_random_ais);
|
||||
} else {
|
||||
pos = RandomRange(num_random_ais);
|
||||
}
|
||||
|
||||
/* Find the Nth item from the array */
|
||||
AIInfoList::iterator it = this->info_single_list.begin();
|
||||
for (; pos > 0; pos--) it++;
|
||||
AIInfoList::iterator first_it = it;
|
||||
while (!it->second->UseAsRandomAI()) it++;
|
||||
for (; pos > 0; pos--) {
|
||||
it++;
|
||||
while (!it->second->UseAsRandomAI()) it++;
|
||||
}
|
||||
return (*it).second;
|
||||
}
|
||||
|
||||
@@ -410,7 +412,7 @@ AIInfo *AIScanner::FindInfo(const char *nameParam, int versionParam)
|
||||
snprintf(ai_name_compare, sizeof(ai_name_compare), "%s", (*it).second->GetName());
|
||||
strtolower(ai_name_compare);
|
||||
|
||||
if (strcasecmp(ai_name, ai_name_compare) == 0 && (*it).second->CanLoadFromVersion(versionParam)) {
|
||||
if (strcasecmp(ai_name, ai_name_compare) == 0 && (*it).second->CanLoadFromVersion(versionParam) && (version == -1 || (*it).second->GetVersion() > version)) {
|
||||
version = (*it).second->GetVersion();
|
||||
info = (*it).second;
|
||||
}
|
||||
@@ -563,7 +565,7 @@ bool AIScanner::HasAI(const ContentInfo *ci, bool md5sum)
|
||||
* @param md5sum whether to check the MD5 checksum
|
||||
* @return true iff we have an AI (library) matching.
|
||||
*/
|
||||
/*static */ bool AI::HasAI(const ContentInfo *ci, bool md5sum)
|
||||
/* static */ bool AI::HasAI(const ContentInfo *ci, bool md5sum)
|
||||
{
|
||||
return AI::ai_scanner->HasAI(ci, md5sum);
|
||||
}
|
||||
|
@@ -56,7 +56,7 @@ public:
|
||||
const AIInfoList *GetUniqueAIInfoList() { return &this->info_single_list; }
|
||||
|
||||
/**
|
||||
* Get the engine of the main squirrel handler (it indexes all avialable squirrels).
|
||||
* Get the engine of the main squirrel handler (it indexes all available scripts).
|
||||
*/
|
||||
class Squirrel *GetEngine() { return this->engine; }
|
||||
|
||||
@@ -88,7 +88,7 @@ private:
|
||||
* For library-scan, if a library is found, AILibrary is created, and the
|
||||
* library is registered to the central system.
|
||||
*/
|
||||
void ScanDir(const char *dirname, bool library_dir, bool library_recursive = false);
|
||||
void ScanDir(const char *dirname, bool library_dir);
|
||||
|
||||
AIInfo *info_dummy;
|
||||
AIInfoList info_list;
|
||||
|
@@ -31,7 +31,6 @@ SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = YES
|
||||
QT_AUTOBRIEF = NO
|
||||
MULTILINE_CPP_IS_BRIEF = NO
|
||||
DETAILS_AT_TOP = NO
|
||||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 2
|
||||
|
@@ -8,12 +8,21 @@
|
||||
#include "../../company_func.h"
|
||||
#include "../../command_type.h"
|
||||
#include "../../town.h"
|
||||
#include "../../economy_func.h"
|
||||
|
||||
/* static */ bool AIAirport::IsValidAirportType(AirportType type)
|
||||
{
|
||||
return type >= AT_SMALL && type <= AT_HELISTATION && HasBit(::GetValidAirports(), type);
|
||||
}
|
||||
|
||||
/* static */ Money AIAirport::GetPrice(AirportType type)
|
||||
{
|
||||
if (!IsValidAirportType(type)) return -1;
|
||||
|
||||
const AirportFTAClass *afc = ::GetAirport(type);
|
||||
return _price.build_airport * afc->size_x * afc->size_y;
|
||||
}
|
||||
|
||||
/* static */ bool AIAirport::IsHangarTile(TileIndex tile)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return false;
|
||||
|
@@ -53,6 +53,13 @@ public:
|
||||
*/
|
||||
static bool IsValidAirportType(AirportType type);
|
||||
|
||||
/**
|
||||
* Get the cost to build this AirportType.
|
||||
* @param type The AirportType to check.
|
||||
* @return The cost of building this AirportType.
|
||||
*/
|
||||
static Money GetPrice(AirportType type);
|
||||
|
||||
/**
|
||||
* Checks whether the given tile is actually a tile with a hangar.
|
||||
* @param tile The tile to check.
|
||||
@@ -122,7 +129,7 @@ public:
|
||||
* @exception AIError::ERR_FLAT_LAND_REQUIRED
|
||||
* @exception AIError::ERR_LOCAL_AUTHORITY_REFUSES
|
||||
* @exception AIStation::ERR_STATION_TOO_LARGE
|
||||
* @exception AIStation::ERR_STATION_TOO_CLOSE_TO_OTHER_STATION
|
||||
* @exception AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION
|
||||
* @return Whether the airport has been/can be build or not.
|
||||
*/
|
||||
static bool BuildAirport(TileIndex tile, AirportType type, StationID station_id);
|
||||
|
@@ -39,6 +39,7 @@ void SQAIAirport_Register(Squirrel *engine) {
|
||||
SQAIAirport.DefSQConst(engine, AIAirport::PT_INVALID, "PT_INVALID");
|
||||
|
||||
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::IsValidAirportType, "IsValidAirportType", 2, ".i");
|
||||
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::GetPrice, "GetPrice", 2, ".i");
|
||||
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::IsHangarTile, "IsHangarTile", 2, ".i");
|
||||
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::IsAirportTile, "IsAirportTile", 2, ".i");
|
||||
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::GetAirportWidth, "GetAirportWidth", 2, ".i");
|
||||
|
@@ -23,29 +23,33 @@
|
||||
return ::IsBridgeTile(tile);
|
||||
}
|
||||
|
||||
/* static */ BridgeID AIBridge::GetBridgeID(TileIndex tile)
|
||||
{
|
||||
if (!IsBridgeTile(tile)) return (BridgeID)-1;
|
||||
return (BridgeID)::GetBridgeType(tile);
|
||||
}
|
||||
|
||||
static void _DoCommandReturnBuildBridge2(class AIInstance *instance)
|
||||
{
|
||||
if (!AIBridge::_BuildBridgeRoad2()) {
|
||||
AIObject::SetLastCommandRes(false);
|
||||
AIInstance::DoCommandReturn(instance);
|
||||
return;
|
||||
}
|
||||
|
||||
/* This can never happen, as in test-mode this callback is never executed,
|
||||
* and in execute-mode, the other callback is called. */
|
||||
* and in execute-mode, the other callback is called. */
|
||||
NOT_REACHED();
|
||||
}
|
||||
|
||||
static void _DoCommandReturnBuildBridge1(class AIInstance *instance)
|
||||
{
|
||||
if (!AIBridge::_BuildBridgeRoad1()) {
|
||||
AIObject::SetLastCommandRes(false);
|
||||
AIInstance::DoCommandReturn(instance);
|
||||
return;
|
||||
}
|
||||
|
||||
/* This can never happen, as in test-mode this callback is never executed,
|
||||
* and in execute-mode, the other callback is called. */
|
||||
* and in execute-mode, the other callback is called. */
|
||||
NOT_REACHED();
|
||||
}
|
||||
|
||||
@@ -61,7 +65,7 @@ static void _DoCommandReturnBuildBridge1(class AIInstance *instance)
|
||||
switch (vehicle_type) {
|
||||
case AIVehicle::VT_ROAD:
|
||||
type |= (TRANSPORT_ROAD << 15);
|
||||
type |= (RoadTypeToRoadTypes((::RoadType)AIObject::GetRoadType()) << 8);
|
||||
type |= (::RoadTypeToRoadTypes((::RoadType)AIObject::GetRoadType()) << 8);
|
||||
break;
|
||||
case AIVehicle::VT_RAIL:
|
||||
type |= (TRANSPORT_RAIL << 15);
|
||||
@@ -80,10 +84,7 @@ static void _DoCommandReturnBuildBridge1(class AIInstance *instance)
|
||||
|
||||
AIObject::SetCallbackVariable(0, start);
|
||||
AIObject::SetCallbackVariable(1, end);
|
||||
if (!AIObject::DoCommand(end, start, type | bridge_id, CMD_BUILD_BRIDGE, NULL, &_DoCommandReturnBuildBridge1)) return false;
|
||||
|
||||
/* In case of test-mode, test if we can build both road pieces */
|
||||
return _BuildBridgeRoad1();
|
||||
return AIObject::DoCommand(end, start, type | bridge_id, CMD_BUILD_BRIDGE, NULL, &_DoCommandReturnBuildBridge1);
|
||||
}
|
||||
|
||||
/* static */ bool AIBridge::_BuildBridgeRoad1()
|
||||
@@ -95,10 +96,7 @@ static void _DoCommandReturnBuildBridge1(class AIInstance *instance)
|
||||
DiagDirection dir_1 = (DiagDirection)((::TileX(start) == ::TileX(end)) ? (::TileY(start) < ::TileY(end) ? DIAGDIR_NW : DIAGDIR_SE) : (::TileX(start) < ::TileX(end) ? DIAGDIR_NE : DIAGDIR_SW));
|
||||
DiagDirection dir_2 = ::ReverseDiagDir(dir_1);
|
||||
|
||||
if (!AIObject::DoCommand(start + ::TileOffsByDiagDir(dir_1), ::DiagDirToRoadBits(dir_2) | (AIObject::GetRoadType() << 4), 0, CMD_BUILD_ROAD, NULL, &_DoCommandReturnBuildBridge2)) return false;
|
||||
|
||||
/* In case of test-mode, test the other road piece too */
|
||||
return _BuildBridgeRoad2();
|
||||
return AIObject::DoCommand(start + ::TileOffsByDiagDir(dir_1), ::DiagDirToRoadBits(dir_2) | (AIObject::GetRoadType() << 4), 0, CMD_BUILD_ROAD, NULL, &_DoCommandReturnBuildBridge2);
|
||||
}
|
||||
|
||||
/* static */ bool AIBridge::_BuildBridgeRoad2()
|
||||
|
@@ -51,6 +51,14 @@ public:
|
||||
*/
|
||||
static bool IsBridgeTile(TileIndex tile);
|
||||
|
||||
/**
|
||||
* Get the BridgeID of a bridge at a given tile.
|
||||
* @param tile The tile to get the BridgeID from.
|
||||
* @pre IsBridgeTile(tile).
|
||||
* @return The BridgeID from the bridge at tile 'tile'.
|
||||
*/
|
||||
static BridgeID GetBridgeID(TileIndex tile);
|
||||
|
||||
/**
|
||||
* Get the name of a bridge.
|
||||
* @param bridge_id The bridge to get the name of.
|
||||
|
@@ -36,6 +36,7 @@ void SQAIBridge_Register(Squirrel *engine) {
|
||||
|
||||
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::IsValidBridge, "IsValidBridge", 2, ".i");
|
||||
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::IsBridgeTile, "IsBridgeTile", 2, ".i");
|
||||
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetBridgeID, "GetBridgeID", 2, ".i");
|
||||
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetName, "GetName", 2, ".i");
|
||||
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetMaxSpeed, "GetMaxSpeed", 2, ".i");
|
||||
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetPrice, "GetPrice", 3, ".ii");
|
||||
|
@@ -18,7 +18,7 @@ public:
|
||||
* The classes of cargo (from newgrf_cargo.h).
|
||||
*/
|
||||
enum CargoClass {
|
||||
CC_PASSENGERS = 1 << 0, //!< Passengers
|
||||
CC_PASSENGERS = 1 << 0, //!< Passengers. Cargos of this class appear at bus stops. Cargos not of this class appear at truck stops.
|
||||
CC_MAIL = 1 << 1, //!< Mail
|
||||
CC_EXPRESS = 1 << 2, //!< Express cargo (Goods, Food, Candy, but also possible for passengers)
|
||||
CC_ARMOURED = 1 << 3, //!< Armoured cargo (Valuables, Gold, Diamonds)
|
||||
@@ -52,6 +52,7 @@ public:
|
||||
/**
|
||||
* Gets the string representation of the cargo label.
|
||||
* @param cargo_type The cargo to get the string representation of.
|
||||
* @pre AICargo::IsValidCargo(cargo_type).
|
||||
* @return The cargo label.
|
||||
* @note Never use this to check if it is a certain cargo. NewGRF can
|
||||
* redefine all of the names.
|
||||
@@ -60,7 +61,10 @@ public:
|
||||
|
||||
/**
|
||||
* Checks whether the give cargo is a freight or not.
|
||||
* This defines whether the "freight train weight multiplier" will apply to
|
||||
* trains transporting this cargo.
|
||||
* @param cargo_type The cargo to check on.
|
||||
* @pre AICargo::IsValidCargo(cargo_type).
|
||||
* @return True if and only if the cargo is freight.
|
||||
*/
|
||||
static bool IsFreight(CargoID cargo_type);
|
||||
@@ -68,6 +72,7 @@ public:
|
||||
/**
|
||||
* Check if this cargo is in the requested cargo class.
|
||||
* @param cargo_type The cargo to check on.
|
||||
* @pre AICargo::IsValidCargo(cargo_type).
|
||||
* @param cargo_class The class to check for.
|
||||
* @return True if and only if the cargo is in the cargo class.
|
||||
*/
|
||||
@@ -76,6 +81,7 @@ public:
|
||||
/**
|
||||
* Get the effect this cargo has on a town.
|
||||
* @param cargo_type The cargo to check on.
|
||||
* @pre AICargo::IsValidCargo(cargo_type).
|
||||
* @return The effect this cargo has on a town, or TE_NONE if it has no effect.
|
||||
*/
|
||||
static TownEffect GetTownEffect(CargoID cargo_type);
|
||||
@@ -84,6 +90,7 @@ public:
|
||||
* Get the income for transporting a piece of cargo over the
|
||||
* given distance within the specified time.
|
||||
* @param cargo_type The cargo to transport.
|
||||
* @pre AICargo::IsValidCargo(cargo_type).
|
||||
* @param distance The distance the cargo travels from begin to end.
|
||||
* @param days_in_transit Amount of (game) days the cargo is in transit. The max value of this variable is 637. Any value higher returns the same as 637 would.
|
||||
* @return The amount of money that would be earned by this trip.
|
||||
|
@@ -153,7 +153,8 @@ public:
|
||||
* Return the location of a company's HQ.
|
||||
* @param company The company the get the HQ of.
|
||||
* @pre ResolveCompanyID(company) != COMPANY_INVALID.
|
||||
* @return The tile of the company's HQ, this tile is the most nothern tile of that HQ, or TILE_INVALID if there is no HQ yet.
|
||||
* @return The tile of the company's HQ, this tile is the most nothern tile
|
||||
* of that HQ, or AIMap::TILE_INVALID if there is no HQ yet.
|
||||
*/
|
||||
static TileIndex GetCompanyHQ(CompanyID company);
|
||||
|
||||
|
@@ -5,6 +5,7 @@
|
||||
#include "../../stdafx.h"
|
||||
#include "../../string_func.h"
|
||||
#include "../../company_base.h"
|
||||
#include "../../rev.h"
|
||||
#include "table/strings.h"
|
||||
|
||||
#include "../ai.hpp"
|
||||
@@ -66,6 +67,11 @@ AIController::~AIController()
|
||||
return AIConfig::GetConfig(_current_company)->GetSetting(name);
|
||||
}
|
||||
|
||||
/* static */ uint AIController::GetVersion()
|
||||
{
|
||||
return _openttd_newgrf_version;
|
||||
}
|
||||
|
||||
bool AIController::LoadedLibrary(const char *library_name, int *next_number, char *fake_class_name, int fake_class_name_len)
|
||||
{
|
||||
LoadedLibraryList::iterator iter = this->loaded_library.find(library_name);
|
||||
|
@@ -50,6 +50,18 @@ public:
|
||||
*/
|
||||
static int GetSetting(const char *name);
|
||||
|
||||
/**
|
||||
* Get the OpenTTD version of this executable. The version is formatted
|
||||
* with the bits having the following meaning:
|
||||
* 28-31 major version
|
||||
* 24-27 minor version
|
||||
* 20-23 build
|
||||
* 19 1 if it is a release, 0 if it is not.
|
||||
* 0-18 revision number; 0 when the revision is unknown.
|
||||
* @return The version in newgrf format.
|
||||
*/
|
||||
static uint GetVersion();
|
||||
|
||||
/**
|
||||
* Change the minimum amount of time the AI should be put in suspend mode
|
||||
* when you execute a command. Normally in SP this is 1, and in MP it is
|
||||
|
@@ -5,10 +5,11 @@
|
||||
void SQAIController_Register(Squirrel *engine) {
|
||||
DefSQClass <AIController> SQAIController("AIController");
|
||||
SQAIController.PreRegister(engine);
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::GetTick, "GetTick", 1, "?");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::SetCommandDelay, "SetCommandDelay", 2, "?i");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::Sleep, "Sleep", 2, "?i");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::GetSetting, "GetSetting", 2, "?s");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::Print, "Print", 3, "?bs");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::GetTick, "GetTick", 1, ".");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::SetCommandDelay, "SetCommandDelay", 2, ".i");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::Sleep, "Sleep", 2, ".i");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::GetSetting, "GetSetting", 2, ".s");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::GetVersion, "GetVersion", 1, ".");
|
||||
SQAIController.DefSQStaticMethod(engine, &AIController::Print, "Print", 3, ".bs");
|
||||
SQAIController.PostRegister(engine);
|
||||
}
|
||||
|
@@ -25,7 +25,7 @@ AIDepotList::AIDepotList(AITile::TransportType transport_type)
|
||||
if (st->owner == ::_current_company) {
|
||||
const AirportFTAClass *afc = st->Airport();
|
||||
for (uint i = 0; i < afc->nof_depots; i++) {
|
||||
this->AddItem(st->xy + ToTileIndexDiff(afc->airport_depots[i]));
|
||||
this->AddItem(st->airport_tile + ToTileIndexDiff(afc->airport_depots[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -6,9 +6,10 @@
|
||||
#include "ai_cargo.hpp"
|
||||
#include "../../company_func.h"
|
||||
#include "../../strings_func.h"
|
||||
#include "../../aircraft.h"
|
||||
#include "../../vehicle_func.h"
|
||||
#include "../../settings_type.h"
|
||||
#include "../../rail.h"
|
||||
#include "../../engine_base.h"
|
||||
#include "../../articulated_vehicles.h"
|
||||
#include "table/strings.h"
|
||||
|
||||
@@ -64,10 +65,11 @@
|
||||
{
|
||||
if (!IsValidEngine(engine_id)) return -1;
|
||||
|
||||
switch (::GetEngine(engine_id)->type) {
|
||||
const Engine *e = ::GetEngine(engine_id);
|
||||
switch (e->type) {
|
||||
case VEH_ROAD:
|
||||
case VEH_TRAIN: {
|
||||
uint16 *capacities = GetCapacityOfArticulatedParts(engine_id, ::GetEngine(engine_id)->type);
|
||||
uint16 *capacities = GetCapacityOfArticulatedParts(engine_id, e->type);
|
||||
for (CargoID c = 0; c < NUM_CARGO; c++) {
|
||||
if (capacities[c] == 0) continue;
|
||||
return capacities[c];
|
||||
@@ -75,15 +77,10 @@
|
||||
return -1;
|
||||
} break;
|
||||
|
||||
case VEH_SHIP: {
|
||||
const ShipVehicleInfo *vi = ::ShipVehInfo(engine_id);
|
||||
return vi->capacity;
|
||||
} break;
|
||||
|
||||
case VEH_AIRCRAFT: {
|
||||
const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine_id);
|
||||
return vi->passenger_capacity;
|
||||
} break;
|
||||
case VEH_SHIP:
|
||||
case VEH_AIRCRAFT:
|
||||
return e->GetDisplayDefaultCapacity();
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
|
@@ -91,6 +91,7 @@ public:
|
||||
/**
|
||||
* Insert an event to the queue for the company.
|
||||
* @param event The event to insert.
|
||||
* @note DO NOT CALL YOURSELF; leave it to the internal AI programming.
|
||||
*/
|
||||
static void InsertEvent(AIEvent *event);
|
||||
|
||||
|
@@ -3,9 +3,11 @@
|
||||
/** @file ai_event_types.cpp Implementation of all EventTypes. */
|
||||
|
||||
#include "ai_event_types.hpp"
|
||||
#include "../../command_type.h"
|
||||
#include "../../strings_func.h"
|
||||
#include "../../settings_type.h"
|
||||
#include "../../aircraft.h"
|
||||
#include "../../rail.h"
|
||||
#include "../../engine_base.h"
|
||||
#include "../../articulated_vehicles.h"
|
||||
#include "table/strings.h"
|
||||
|
||||
@@ -28,10 +30,11 @@ CargoID AIEventEnginePreview::GetCargoType()
|
||||
|
||||
int32 AIEventEnginePreview::GetCapacity()
|
||||
{
|
||||
switch (::GetEngine(engine)->type) {
|
||||
const Engine *e = ::GetEngine(engine);
|
||||
switch (e->type) {
|
||||
case VEH_ROAD:
|
||||
case VEH_TRAIN: {
|
||||
uint16 *capacities = GetCapacityOfArticulatedParts(engine, ::GetEngine(engine)->type);
|
||||
uint16 *capacities = GetCapacityOfArticulatedParts(engine, e->type);
|
||||
for (CargoID c = 0; c < NUM_CARGO; c++) {
|
||||
if (capacities[c] == 0) continue;
|
||||
return capacities[c];
|
||||
@@ -39,15 +42,10 @@ int32 AIEventEnginePreview::GetCapacity()
|
||||
return -1;
|
||||
} break;
|
||||
|
||||
case VEH_SHIP: {
|
||||
const ShipVehicleInfo *vi = ::ShipVehInfo(engine);
|
||||
return vi->capacity;
|
||||
} break;
|
||||
|
||||
case VEH_AIRCRAFT: {
|
||||
const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine);
|
||||
return vi->passenger_capacity;
|
||||
} break;
|
||||
case VEH_SHIP:
|
||||
case VEH_AIRCRAFT:
|
||||
return e->GetDisplayDefaultCapacity();
|
||||
break;
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
|
@@ -35,6 +35,7 @@ public:
|
||||
/**
|
||||
* @param vehicle The vehicle that crashed.
|
||||
* @param crash_site Where the vehicle crashed.
|
||||
* @param crash_reason The reason why the vehicle crashed.
|
||||
*/
|
||||
AIEventVehicleCrashed(VehicleID vehicle, TileIndex crash_site, CrashReason crash_reason) :
|
||||
AIEvent(AI_ET_VEHICLE_CRASHED),
|
||||
|
@@ -86,7 +86,9 @@ public:
|
||||
static TileIndex GetLocation(IndustryID industry_id);
|
||||
|
||||
/**
|
||||
* Get the number of stations around an industry.
|
||||
* Get the number of stations around an industry. All stations that can
|
||||
* service the industry are counted, your own stations but also your
|
||||
* opponents stations.
|
||||
* @param industry_id The index of the industry.
|
||||
* @pre IsValidIndustry(industry_id).
|
||||
* @return The number of stations around an industry.
|
||||
|
@@ -111,3 +111,24 @@
|
||||
uint32 seed = ::InteractiveRandom();
|
||||
return AIObject::DoCommand(0, industry_type, seed, CMD_BUILD_INDUSTRY);
|
||||
}
|
||||
|
||||
/* static */ bool AIIndustryType::IsBuiltOnWater(IndustryType industry_type)
|
||||
{
|
||||
if (!IsValidIndustryType(industry_type)) return false;
|
||||
|
||||
return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0;
|
||||
}
|
||||
|
||||
/* static */ bool AIIndustryType::HasHeliport(IndustryType industry_type)
|
||||
{
|
||||
if (!IsValidIndustryType(industry_type)) return false;
|
||||
|
||||
return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0;
|
||||
}
|
||||
|
||||
/* static */ bool AIIndustryType::HasDock(IndustryType industry_type)
|
||||
{
|
||||
if (!IsValidIndustryType(industry_type)) return false;
|
||||
|
||||
return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0;
|
||||
}
|
||||
|
@@ -113,6 +113,30 @@ public:
|
||||
* @note If true is returned the money is paid, whether a new industry was build or not.
|
||||
*/
|
||||
static bool ProspectIndustry(IndustryType industry_type);
|
||||
|
||||
/**
|
||||
* Is this type of industry built on water.
|
||||
* @param industry_type The type of the industry.
|
||||
* @pre IsValidIndustryType(industry_type).
|
||||
* @return True when this type is built on water.
|
||||
*/
|
||||
static bool IsBuiltOnWater(IndustryType industry_type);
|
||||
|
||||
/**
|
||||
* Does this type of industry have a heliport?
|
||||
* @param industry_type The type of the industry.
|
||||
* @pre IsValidIndustryType(industry_type).
|
||||
* @return True when this type has a heliport.
|
||||
*/
|
||||
static bool HasHeliport(IndustryType industry_type);
|
||||
|
||||
/**
|
||||
* Does this type of industry have a dock?
|
||||
* @param industry_type The type of the industry.
|
||||
* @pre IsValidIndustryType(industry_type).
|
||||
* @return True when this type has a dock.
|
||||
*/
|
||||
static bool HasDock(IndustryType industry_type);
|
||||
};
|
||||
|
||||
#endif /* AI_INDUSTRYTYPE_HPP */
|
||||
|
@@ -28,6 +28,9 @@ void SQAIIndustryType_Register(Squirrel *engine) {
|
||||
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::CanProspectIndustry, "CanProspectIndustry", 2, ".i");
|
||||
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::BuildIndustry, "BuildIndustry", 3, ".ii");
|
||||
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::ProspectIndustry, "ProspectIndustry", 2, ".i");
|
||||
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::IsBuiltOnWater, "IsBuiltOnWater", 2, ".i");
|
||||
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::HasHeliport, "HasHeliport", 2, ".i");
|
||||
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::HasDock, "HasDock", 2, ".i");
|
||||
|
||||
SQAIIndustryType.PostRegister(engine);
|
||||
}
|
||||
|
@@ -32,7 +32,7 @@
|
||||
log->lines = CallocT<char *>(80);
|
||||
log->type = CallocT<AILog::AILogType>(80);
|
||||
log->count = 80;
|
||||
log->pos = log->count;
|
||||
log->pos = log->count - 1;
|
||||
log->used = 0;
|
||||
}
|
||||
LogData *log = (LogData *)AIObject::GetLogPointer();
|
||||
|
@@ -17,6 +17,9 @@ public:
|
||||
TILE_INVALID = INVALID_TILE, //!< Invalid TileIndex.
|
||||
};
|
||||
#endif /* DEFINE_SCRIPT_FILES */
|
||||
#ifdef DOXYGEN_SKIP
|
||||
const static TileIndex TILE_INVALID; //!< Invalid TileIndex.
|
||||
#endif /* DOXYGEN_SKIP */
|
||||
|
||||
static const char *GetClassName() { return "AIMap"; }
|
||||
|
||||
|
@@ -55,13 +55,13 @@
|
||||
DiagDirection to_other_tile = (TileX(t1) == TileX(t2)) ? DIAGDIR_SE : DIAGDIR_SW;
|
||||
|
||||
/* Determine the reachable tracks from the shared edge */
|
||||
TrackBits gtts2 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t2, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
|
||||
if (gtts2 == TRACK_BIT_NONE) return false;
|
||||
TrackBits gtts1 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t1, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
|
||||
if (gtts1 == TRACK_BIT_NONE) return false;
|
||||
|
||||
to_other_tile = ReverseDiagDir(to_other_tile);
|
||||
TrackBits gtts1 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t1, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
|
||||
TrackBits gtts2 = ::TrackStatusToTrackBits(::GetTileTrackStatus(t2, TRANSPORT_WATER, 0, to_other_tile)) & ::DiagdirReachesTracks(to_other_tile);
|
||||
|
||||
return gtts1 != TRACK_BIT_NONE;
|
||||
return gtts2 != TRACK_BIT_NONE;
|
||||
}
|
||||
|
||||
/* static */ bool AIMarine::BuildWaterDepot(TileIndex tile, TileIndex front)
|
||||
|
@@ -2,6 +2,11 @@
|
||||
|
||||
/** @file ai_object.cpp Implementation of AIObject. */
|
||||
|
||||
#include "../../stdafx.h"
|
||||
#include <squirrel.h>
|
||||
#include "../../script/squirrel.hpp"
|
||||
#include "../../company_base.h"
|
||||
|
||||
#include "ai_log.hpp"
|
||||
#include "table/strings.h"
|
||||
#include "../ai.hpp"
|
||||
@@ -157,7 +162,8 @@ void AIObject::SetAllowDoCommand(bool allow)
|
||||
|
||||
bool AIObject::GetAllowDoCommand()
|
||||
{
|
||||
return GetStorage()->allow_do_command;
|
||||
Squirrel *squirrel = GetCompany(_current_company)->ai_instance->engine;
|
||||
return GetStorage()->allow_do_command && squirrel->CanSuspend();
|
||||
}
|
||||
|
||||
void *&AIObject::GetEventPointer()
|
||||
|
@@ -143,9 +143,24 @@ protected:
|
||||
*/
|
||||
static void *&GetEventPointer();
|
||||
|
||||
/**
|
||||
* Set the cost of the last command.
|
||||
*/
|
||||
static void SetLastCost(Money last_cost);
|
||||
|
||||
/**
|
||||
* Get the cost of the last command.
|
||||
*/
|
||||
static Money GetLastCost();
|
||||
|
||||
/**
|
||||
* Set a variable that can be used by callback functions to pass information.
|
||||
*/
|
||||
static void SetCallbackVariable(int index, int value);
|
||||
|
||||
/**
|
||||
* Get the variable that is used by callback functions to pass information.
|
||||
*/
|
||||
static int GetCallbackVariable(int index);
|
||||
|
||||
public:
|
||||
|
@@ -23,7 +23,10 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
|
||||
switch (::GetTileType(t)) {
|
||||
default: break;
|
||||
case MP_STATION: return OT_GOTO_STATION; break;
|
||||
case MP_STATION:
|
||||
if (IsHangar(t)) return OT_GOTO_DEPOT;
|
||||
return OT_GOTO_STATION;
|
||||
break;
|
||||
case MP_WATER: if (::IsShipDepot(t)) return OT_GOTO_DEPOT; break;
|
||||
case MP_ROAD: if (::GetRoadTileType(t) == ROAD_TILE_DEPOT) return OT_GOTO_DEPOT; break;
|
||||
case MP_RAILWAY:
|
||||
@@ -43,6 +46,47 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
return AIVehicle::IsValidVehicle(vehicle_id) && order_position >= 0 && (order_position < ::GetVehicle(vehicle_id)->GetNumOrders() || order_position == ORDER_CURRENT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current order the vehicle is executing. If the current order is in
|
||||
* the order list, return the order from the orderlist. If the current order
|
||||
* was a manual order, return the current order.
|
||||
*/
|
||||
static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition order_position)
|
||||
{
|
||||
const Vehicle *v = ::GetVehicle(vehicle_id);
|
||||
if (order_position == AIOrder::ORDER_CURRENT) {
|
||||
const Order *order = &v->current_order;
|
||||
if (order->GetType() == OT_GOTO_DEPOT && !(order->GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) return order;
|
||||
order_position = AIOrder::ResolveOrderPosition(vehicle_id, order_position);
|
||||
if (order_position == AIOrder::ORDER_INVALID) return NULL;
|
||||
}
|
||||
return ::GetVehicleOrder(v, order_position);
|
||||
}
|
||||
|
||||
/* static */ bool AIOrder::IsGotoStationOrder(VehicleID vehicle_id, OrderPosition order_position)
|
||||
{
|
||||
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
|
||||
|
||||
const Order *order = ::ResolveOrder(vehicle_id, order_position);
|
||||
return order != NULL && order->GetType() == OT_GOTO_STATION;
|
||||
}
|
||||
|
||||
/* static */ bool AIOrder::IsGotoDepotOrder(VehicleID vehicle_id, OrderPosition order_position)
|
||||
{
|
||||
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
|
||||
|
||||
const Order *order = ::ResolveOrder(vehicle_id, order_position);
|
||||
return order != NULL && order->GetType() == OT_GOTO_DEPOT;
|
||||
}
|
||||
|
||||
/* static */ bool AIOrder::IsGotoWaypointOrder(VehicleID vehicle_id, OrderPosition order_position)
|
||||
{
|
||||
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
|
||||
|
||||
const Order *order = ::ResolveOrder(vehicle_id, order_position);
|
||||
return order != NULL && order->GetType() == OT_GOTO_WAYPOINT;
|
||||
}
|
||||
|
||||
/* static */ bool AIOrder::IsConditionalOrder(VehicleID vehicle_id, OrderPosition order_position)
|
||||
{
|
||||
if (order_position == ORDER_CURRENT) return false;
|
||||
@@ -52,6 +96,16 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
return order->GetType() == OT_CONDITIONAL;
|
||||
}
|
||||
|
||||
/* static */ bool AIOrder::IsCurrentOrderPartOfOrderList(VehicleID vehicle_id)
|
||||
{
|
||||
if (AIVehicle::IsValidVehicle(vehicle_id)) return false;
|
||||
if (GetOrderCount(vehicle_id) == 0) return false;
|
||||
|
||||
const Order *order = &::GetVehicle(vehicle_id)->current_order;
|
||||
if (order->GetType() != OT_GOTO_DEPOT) return true;
|
||||
return (order->GetDepotOrderType() & ODTFB_PART_OF_ORDERS) != 0;
|
||||
}
|
||||
|
||||
/* static */ AIOrder::OrderPosition AIOrder::ResolveOrderPosition(VehicleID vehicle_id, OrderPosition order_position)
|
||||
{
|
||||
if (!AIVehicle::IsValidVehicle(vehicle_id)) return ORDER_INVALID;
|
||||
@@ -74,7 +128,10 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
(((order_flags & AIOF_NO_UNLOAD) == 0) || ((order_flags & AIOF_NO_LOAD) == 0)) &&
|
||||
(((order_flags & AIOF_FULL_LOAD_ANY) == 0) || ((order_flags & AIOF_NO_LOAD) == 0));
|
||||
|
||||
case OT_GOTO_DEPOT: return (order_flags & ~(AIOF_NON_STOP_FLAGS | AIOF_SERVICE_IF_NEEDED)) == 0;
|
||||
case OT_GOTO_DEPOT:
|
||||
return ((order_flags & ~(AIOF_NON_STOP_FLAGS | AIOF_DEPOT_FLAGS)) == 0) &&
|
||||
(((order_flags & AIOF_SERVICE_IF_NEEDED) == 0) || ((order_flags & AIOF_STOP_IN_DEPOT) == 0));
|
||||
|
||||
case OT_GOTO_WAYPOINT: return (order_flags & ~(AIOF_NON_STOP_FLAGS)) == 0;
|
||||
default: return false;
|
||||
}
|
||||
@@ -108,21 +165,41 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
{
|
||||
if (!IsValidVehicleOrder(vehicle_id, order_position)) return INVALID_TILE;
|
||||
|
||||
const Order *order;
|
||||
const Order *order = ::ResolveOrder(vehicle_id, order_position);
|
||||
if (order == NULL || order->GetType() == OT_CONDITIONAL) return INVALID_TILE;
|
||||
const Vehicle *v = ::GetVehicle(vehicle_id);
|
||||
if (order_position == ORDER_CURRENT) {
|
||||
order = &v->current_order;
|
||||
} else {
|
||||
order = ::GetVehicleOrder(GetVehicle(vehicle_id), order_position);
|
||||
if (order->GetType() == OT_CONDITIONAL) return INVALID_TILE;
|
||||
}
|
||||
|
||||
switch (order->GetType()) {
|
||||
case OT_GOTO_DEPOT:
|
||||
case OT_GOTO_DEPOT: {
|
||||
if (v->type != VEH_AIRCRAFT) return ::GetDepot(order->GetDestination())->xy;
|
||||
/* FALL THROUGH: aircraft's hangars are referenced by StationID, not DepotID */
|
||||
/* Aircraft's hangars are referenced by StationID, not DepotID */
|
||||
const Station *st = ::GetStation(order->GetDestination());
|
||||
const AirportFTAClass *airport = st->Airport();
|
||||
if (airport == NULL || airport->nof_depots == 0) return INVALID_TILE;
|
||||
return st->airport_tile + ::ToTileIndexDiff(st->Airport()->airport_depots[0]);
|
||||
}
|
||||
|
||||
case OT_GOTO_STATION: return ::GetStation(order->GetDestination())->xy;
|
||||
case OT_GOTO_STATION: {
|
||||
const Station *st = ::GetStation(order->GetDestination());
|
||||
if (st->train_tile != INVALID_TILE) {
|
||||
for (uint i = 0; i < st->trainst_w; i++) {
|
||||
TileIndex t = st->train_tile + TileDiffXY(i, 0);
|
||||
if (st->TileBelongsToRailStation(t)) return t;
|
||||
}
|
||||
} else if (st->dock_tile != INVALID_TILE) {
|
||||
return st->dock_tile;
|
||||
} else if (st->bus_stops != NULL) {
|
||||
return st->bus_stops->xy;
|
||||
} else if (st->truck_stops != NULL) {
|
||||
return st->truck_stops->xy;
|
||||
} else if (st->airport_tile != INVALID_TILE) {
|
||||
const AirportFTAClass *fta = st->Airport();
|
||||
BEGIN_TILE_LOOP(tile, fta->size_x, fta->size_y, st->airport_tile) {
|
||||
if (!::IsHangar(tile)) return tile;
|
||||
} END_TILE_LOOP(tile, fta->size_x, fta->size_y, st->airport_tile)
|
||||
}
|
||||
return INVALID_TILE;
|
||||
}
|
||||
case OT_GOTO_WAYPOINT: return ::GetWaypoint(order->GetDestination())->xy;
|
||||
default: return INVALID_TILE;
|
||||
}
|
||||
@@ -132,19 +209,15 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
{
|
||||
if (!IsValidVehicleOrder(vehicle_id, order_position)) return AIOF_INVALID;
|
||||
|
||||
const Order *order;
|
||||
if (order_position == ORDER_CURRENT) {
|
||||
order = &::GetVehicle(vehicle_id)->current_order;
|
||||
} else {
|
||||
order = ::GetVehicleOrder(GetVehicle(vehicle_id), order_position);
|
||||
if (order->GetType() == OT_CONDITIONAL) return AIOF_INVALID;
|
||||
}
|
||||
const Order *order = ::ResolveOrder(vehicle_id, order_position);
|
||||
if (order == NULL || order->GetType() == OT_CONDITIONAL) return AIOF_INVALID;
|
||||
|
||||
AIOrderFlags order_flags = AIOF_NONE;
|
||||
order_flags |= (AIOrderFlags)order->GetNonStopType();
|
||||
switch (order->GetType()) {
|
||||
case OT_GOTO_DEPOT:
|
||||
if (order->GetDepotOrderType() & ODTFB_SERVICE) order_flags |= AIOF_SERVICE_IF_NEEDED;
|
||||
if (order->GetDepotActionType() & ODATFB_HALT) order_flags |= AIOF_STOP_IN_DEPOT;
|
||||
break;
|
||||
|
||||
case OT_GOTO_STATION:
|
||||
@@ -260,9 +333,21 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
|
||||
Order order;
|
||||
switch (::GetOrderTypeByTile(destination)) {
|
||||
case OT_GOTO_DEPOT:
|
||||
order.MakeGoToDepot(::GetDepotByTile(destination)->index, (OrderDepotTypeFlags)(ODTFB_PART_OF_ORDERS | ((order_flags & AIOF_SERVICE_IF_NEEDED) ? ODTFB_SERVICE : 0)));
|
||||
case OT_GOTO_DEPOT: {
|
||||
OrderDepotTypeFlags odtf = (OrderDepotTypeFlags)(ODTFB_PART_OF_ORDERS | ((order_flags & AIOF_SERVICE_IF_NEEDED) ? ODTFB_SERVICE : 0));
|
||||
OrderDepotActionFlags odaf = (OrderDepotActionFlags)(ODATF_SERVICE_ONLY | ((order_flags & AIOF_STOP_IN_DEPOT) ? ODATFB_HALT : 0));
|
||||
OrderNonStopFlags onsf = (OrderNonStopFlags)((order_flags & AIOF_NON_STOP_INTERMEDIATE) ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE);
|
||||
/* Check explicitly if the order is to a station (for aircraft) or
|
||||
* to a depot (other vehicle types). */
|
||||
if (::GetVehicle(vehicle_id)->type == VEH_AIRCRAFT) {
|
||||
if (!::IsTileType(destination, MP_STATION)) return false;
|
||||
order.MakeGoToDepot(::GetStationIndex(destination), odtf, onsf, odaf);
|
||||
} else {
|
||||
if (::IsTileType(destination, MP_STATION)) return false;
|
||||
order.MakeGoToDepot(::GetDepotByTile(destination)->index, odtf, onsf, odaf);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case OT_GOTO_STATION:
|
||||
order.MakeGoToStation(::GetStationIndex(destination));
|
||||
@@ -306,6 +391,13 @@ static OrderType GetOrderTypeByTile(TileIndex t)
|
||||
return AIObject::DoCommand(0, vehicle_id, order_position, CMD_DELETE_ORDER);
|
||||
}
|
||||
|
||||
/* static */ bool AIOrder::SkipToOrder(VehicleID vehicle_id, OrderPosition next_order)
|
||||
{
|
||||
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, next_order));
|
||||
|
||||
return AIObject::DoCommand(0, vehicle_id, next_order, CMD_SKIP_TO_ORDER);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback handler as SetOrderFlags possibly needs multiple DoCommand calls
|
||||
* to be able to set all order flags correctly. As we need to wait till the
|
||||
@@ -349,8 +441,11 @@ static void _DoCommandReturnSetOrderFlags(class AIInstance *instance)
|
||||
|
||||
switch (order->GetType()) {
|
||||
case OT_GOTO_DEPOT:
|
||||
if ((current & AIOF_SERVICE_IF_NEEDED) != (order_flags & AIOF_SERVICE_IF_NEEDED)) {
|
||||
return AIObject::DoCommand(0, vehicle_id | (order_position << 16), MOF_DEPOT_ACTION, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags);
|
||||
if ((current & AIOF_DEPOT_FLAGS) != (order_flags & AIOF_DEPOT_FLAGS)) {
|
||||
uint data = DA_ALWAYS_GO;
|
||||
if (order_flags & AIOF_SERVICE_IF_NEEDED) data = DA_SERVICE;
|
||||
if (order_flags & AIOF_STOP_IN_DEPOT) data = DA_STOP;
|
||||
return AIObject::DoCommand(0, vehicle_id | (order_position << 16), (data << 4) | MOF_DEPOT_ACTION, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@@ -57,6 +57,8 @@ public:
|
||||
|
||||
/** Service the vehicle when needed, otherwise skip this order; only for depots. */
|
||||
AIOF_SERVICE_IF_NEEDED = 1 << 2,
|
||||
/** Stop in the depot instead of only go there for servicing; only for depots. */
|
||||
AIOF_STOP_IN_DEPOT = 1 << 3,
|
||||
|
||||
/** All flags related to non-stop settings. */
|
||||
AIOF_NON_STOP_FLAGS = AIOF_NON_STOP_INTERMEDIATE | AIOF_NON_STOP_DESTINATION,
|
||||
@@ -64,6 +66,8 @@ public:
|
||||
AIOF_UNLOAD_FLAGS = AIOF_TRANSFER | AIOF_UNLOAD | AIOF_NO_UNLOAD,
|
||||
/** All flags related to loading. */
|
||||
AIOF_LOAD_FLAGS = AIOF_FULL_LOAD | AIOF_FULL_LOAD_ANY | AIOF_NO_LOAD,
|
||||
/** All flags related to depots. */
|
||||
AIOF_DEPOT_FLAGS = AIOF_SERVICE_IF_NEEDED | AIOF_STOP_IN_DEPOT,
|
||||
|
||||
/** For marking invalid order flags */
|
||||
AIOF_INVALID = 0xFFFF,
|
||||
@@ -114,6 +118,33 @@ public:
|
||||
*/
|
||||
static bool IsValidVehicleOrder(VehicleID vehicle_id, OrderPosition order_position);
|
||||
|
||||
/**
|
||||
* Checks whether the given order is a goto-station order.
|
||||
* @param vehicle_id The vehicle to check.
|
||||
* @param order_position The order index to check.
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @return True if and only if the order is a goto-station order.
|
||||
*/
|
||||
static bool IsGotoStationOrder(VehicleID vehicle_id, OrderPosition order_position);
|
||||
|
||||
/**
|
||||
* Checks whether the given order is a goto-depot order.
|
||||
* @param vehicle_id The vehicle to check.
|
||||
* @param order_position The order index to check.
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @return True if and only if the order is a goto-depot order.
|
||||
*/
|
||||
static bool IsGotoDepotOrder(VehicleID vehicle_id, OrderPosition order_position);
|
||||
|
||||
/**
|
||||
* Checks whether the given order is a goto-waypoint order.
|
||||
* @param vehicle_id The vehicle to check.
|
||||
* @param order_position The order index to check.
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @return True if and only if the order is a goto-waypoint order.
|
||||
*/
|
||||
static bool IsGotoWaypointOrder(VehicleID vehicle_id, OrderPosition order_position);
|
||||
|
||||
/**
|
||||
* Checks whether the given order is a conditional order.
|
||||
* @param vehicle_id The vehicle to check.
|
||||
@@ -123,6 +154,17 @@ public:
|
||||
*/
|
||||
static bool IsConditionalOrder(VehicleID vehicle_id, OrderPosition order_position);
|
||||
|
||||
/**
|
||||
* Checks whether the current order is part of the orderlist.
|
||||
* @param vehicle_id The vehicle to check.
|
||||
* @pre AIVehicle::IsValidVehicle(vehicle_id).
|
||||
* @return True if and only if the current order is part of the order list.
|
||||
* @note If the order is a non-'non-stop' order, and the vehicle is currently
|
||||
* (un)loading at a station that is not the final destination, this function
|
||||
* will still return true.
|
||||
*/
|
||||
static bool IsCurrentOrderPartOfOrderList(VehicleID vehicle_id);
|
||||
|
||||
/**
|
||||
* Resolves the given order index to the correct index for the given vehicle.
|
||||
* If the order index was ORDER_CURRENT it will be resolved to the index of
|
||||
@@ -246,8 +288,10 @@ public:
|
||||
* Sets the OrderCondition of the given order for the given vehicle.
|
||||
* @param vehicle_id The vehicle to set the condition type for.
|
||||
* @param order_position The order to set the condition type for.
|
||||
* @param condition The condition to compare on.
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @pre order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position).
|
||||
* @pre condition >= OC_LOAD_PERCENTAGE && condition <= OC_UNCONDITIONALLY.
|
||||
* @return Whether the order has been/can be changed.
|
||||
*/
|
||||
static bool SetOrderCondition(VehicleID vehicle_id, OrderPosition order_position, OrderCondition condition);
|
||||
@@ -256,8 +300,10 @@ public:
|
||||
* Sets the CompareFunction of the given order for the given vehicle.
|
||||
* @param vehicle_id The vehicle to set the compare function for.
|
||||
* @param order_position The order to set the compare function for.
|
||||
* @param compare The new compare function of the order.
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @pre order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position).
|
||||
* @pre compare >= CF_EQUALS && compare <= CF_IS_FALSE.
|
||||
* @return Whether the order has been/can be changed.
|
||||
*/
|
||||
static bool SetOrderCompareFunction(VehicleID vehicle_id, OrderPosition order_position, CompareFunction compare);
|
||||
@@ -266,6 +312,7 @@ public:
|
||||
* Sets the value to compare against of the given order for the given vehicle.
|
||||
* @param vehicle_id The vehicle to set the value for.
|
||||
* @param order_position The order to set the value for.
|
||||
* @param value The value to compare against.
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @pre order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position).
|
||||
* @pre value >= 0 && value < 2048.
|
||||
@@ -281,7 +328,7 @@ public:
|
||||
* @pre AIVehicle::IsValidVehicle(vehicle_id).
|
||||
* @pre AreOrderFlagsValid(destination, order_flags).
|
||||
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
|
||||
* @exception AIOrder::ERR_ORDER_NO_MORE_SPACE
|
||||
* @exception AIOrder::ERR_ORDER_TOO_MANY
|
||||
* @exception AIOrder::ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION
|
||||
* @return True if and only if the order was appended.
|
||||
*/
|
||||
@@ -294,7 +341,7 @@ public:
|
||||
* @pre AIVehicle::IsValidVehicle(vehicle_id).
|
||||
* @pre IsValidVehicleOrder(vehicle_id, jump_to).
|
||||
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
|
||||
* @exception AIOrder::ERR_ORDER_NO_MORE_SPACE
|
||||
* @exception AIOrder::ERR_ORDER_TOO_MANY
|
||||
* @return True if and only if the order was appended.
|
||||
*/
|
||||
static bool AppendConditionalOrder(VehicleID vehicle_id, OrderPosition jump_to);
|
||||
@@ -308,7 +355,7 @@ public:
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @pre AreOrderFlagsValid(destination, order_flags).
|
||||
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
|
||||
* @exception AIOrder::ERR_ORDER_NO_MORE_SPACE
|
||||
* @exception AIOrder::ERR_ORDER_TOO_MANY
|
||||
* @exception AIOrder::ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION
|
||||
* @return True if and only if the order was inserted.
|
||||
*/
|
||||
@@ -322,7 +369,7 @@ public:
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @pre IsValidVehicleOrder(vehicle_id, jump_to).
|
||||
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
|
||||
* @exception AIOrder::ERR_ORDER_NO_MORE_SPACE
|
||||
* @exception AIOrder::ERR_ORDER_TOO_MANY
|
||||
* @return True if and only if the order was inserted.
|
||||
*/
|
||||
static bool InsertConditionalOrder(VehicleID vehicle_id, OrderPosition order_position, OrderPosition jump_to);
|
||||
@@ -331,7 +378,7 @@ public:
|
||||
* Removes an order from the vehicle's order list.
|
||||
* @param vehicle_id The vehicle to remove the order from.
|
||||
* @param order_position The order to remove from the order list.
|
||||
* @pre AIVehicle::IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @pre IsValidVehicleOrder(vehicle_id, order_position).
|
||||
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
|
||||
* @return True if and only if the order was removed.
|
||||
*/
|
||||
@@ -377,6 +424,16 @@ public:
|
||||
*/
|
||||
static bool MoveOrder(VehicleID vehicle_id, OrderPosition order_position_move, OrderPosition order_position_target);
|
||||
|
||||
/**
|
||||
* Make a vehicle execute next_order instead of its current order.
|
||||
* @param vehicle_id The vehicle that should skip some orders.
|
||||
* @param next_order The order the vehicle should skip to.
|
||||
* @pre IsValidVehicleOrder(vehicle_id, next_order).
|
||||
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
|
||||
* @return True if and only the current order was changed.
|
||||
*/
|
||||
static bool SkipToOrder(VehicleID vehicle_id, OrderPosition next_order);
|
||||
|
||||
/**
|
||||
* Copies the orders from another vehicle. The orders of the main vehicle
|
||||
* are going to be the orders of the changed vehicle.
|
||||
@@ -385,7 +442,7 @@ public:
|
||||
* @pre AIVehicle::IsValidVehicle(vehicle_id).
|
||||
* @pre AIVehicle::IsValidVehicle(main_vehicle_id).
|
||||
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
|
||||
* @exception AIOrder::ERR_ORDER_NO_MORE_SPACE
|
||||
* @exception AIOrder::ERR_ORDER_TOO_MANY
|
||||
* @return True if and only if the copying succeeded.
|
||||
*/
|
||||
static bool CopyOrders(VehicleID vehicle_id, VehicleID main_vehicle_id);
|
||||
|
@@ -42,9 +42,11 @@ void SQAIOrder_Register(Squirrel *engine) {
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_FULL_LOAD_ANY, "AIOF_FULL_LOAD_ANY");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_NO_LOAD, "AIOF_NO_LOAD");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_SERVICE_IF_NEEDED, "AIOF_SERVICE_IF_NEEDED");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_STOP_IN_DEPOT, "AIOF_STOP_IN_DEPOT");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_NON_STOP_FLAGS, "AIOF_NON_STOP_FLAGS");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_UNLOAD_FLAGS, "AIOF_UNLOAD_FLAGS");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_LOAD_FLAGS, "AIOF_LOAD_FLAGS");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_DEPOT_FLAGS, "AIOF_DEPOT_FLAGS");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_INVALID, "AIOF_INVALID");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::OC_LOAD_PERCENTAGE, "OC_LOAD_PERCENTAGE");
|
||||
SQAIOrder.DefSQConst(engine, AIOrder::OC_RELIABILITY, "OC_RELIABILITY");
|
||||
@@ -71,33 +73,38 @@ void SQAIOrder_Register(Squirrel *engine) {
|
||||
AIError::RegisterErrorMapString(AIOrder::ERR_ORDER_TOO_MANY, "ERR_ORDER_TOO_MANY");
|
||||
AIError::RegisterErrorMapString(AIOrder::ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION, "ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION");
|
||||
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidVehicleOrder, "IsValidVehicleOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsConditionalOrder, "IsConditionalOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ResolveOrderPosition, "ResolveOrderPosition", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AreOrderFlagsValid, "AreOrderFlagsValid", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidConditionalOrder, "IsValidConditionalOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCount, "GetOrderCount", 2, ".i");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderDestination, "GetOrderDestination", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderFlags, "GetOrderFlags", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderJumpTo, "GetOrderJumpTo", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCondition, "GetOrderCondition", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareFunction, "GetOrderCompareFunction", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareValue, "GetOrderCompareValue", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderJumpTo, "SetOrderJumpTo", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCondition, "SetOrderCondition", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareFunction, "SetOrderCompareFunction", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareValue, "SetOrderCompareValue", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendOrder, "AppendOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendConditionalOrder, "AppendConditionalOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertOrder, "InsertOrder", 5, ".iiii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertConditionalOrder, "InsertConditionalOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::RemoveOrder, "RemoveOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderFlags, "SetOrderFlags", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ChangeOrder, "ChangeOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::MoveOrder, "MoveOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::CopyOrders, "CopyOrders", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ShareOrders, "ShareOrders", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::UnshareOrders, "UnshareOrders", 2, ".i");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidVehicleOrder, "IsValidVehicleOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsGotoStationOrder, "IsGotoStationOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsGotoDepotOrder, "IsGotoDepotOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsGotoWaypointOrder, "IsGotoWaypointOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsConditionalOrder, "IsConditionalOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsCurrentOrderPartOfOrderList, "IsCurrentOrderPartOfOrderList", 2, ".i");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ResolveOrderPosition, "ResolveOrderPosition", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AreOrderFlagsValid, "AreOrderFlagsValid", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidConditionalOrder, "IsValidConditionalOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCount, "GetOrderCount", 2, ".i");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderDestination, "GetOrderDestination", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderFlags, "GetOrderFlags", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderJumpTo, "GetOrderJumpTo", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCondition, "GetOrderCondition", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareFunction, "GetOrderCompareFunction", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareValue, "GetOrderCompareValue", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderJumpTo, "SetOrderJumpTo", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCondition, "SetOrderCondition", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareFunction, "SetOrderCompareFunction", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareValue, "SetOrderCompareValue", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendOrder, "AppendOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendConditionalOrder, "AppendConditionalOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertOrder, "InsertOrder", 5, ".iiii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertConditionalOrder, "InsertConditionalOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::RemoveOrder, "RemoveOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderFlags, "SetOrderFlags", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ChangeOrder, "ChangeOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::MoveOrder, "MoveOrder", 4, ".iii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SkipToOrder, "SkipToOrder", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::CopyOrders, "CopyOrders", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ShareOrders, "ShareOrders", 3, ".ii");
|
||||
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::UnshareOrders, "UnshareOrders", 2, ".i");
|
||||
|
||||
SQAIOrder.PostRegister(engine);
|
||||
}
|
||||
|
@@ -110,7 +110,7 @@
|
||||
{
|
||||
if (!IsRailStationTile(tile)) return RAILTRACK_INVALID;
|
||||
|
||||
return (RailTrack)::GetRailStationTrack(tile);
|
||||
return (RailTrack)::GetRailStationTrackBits(tile);
|
||||
}
|
||||
|
||||
/* static */ bool AIRail::BuildRailDepot(TileIndex tile, TileIndex front)
|
||||
@@ -203,6 +203,7 @@
|
||||
if (IsRailWaypointTile(tile)) return ::GetRailWaypointBits(tile);
|
||||
if (IsRailStationTile(tile)) return ::TrackToTrackBits(::GetRailStationTrack(tile));
|
||||
if (IsLevelCrossingTile(tile)) return ::GetCrossingRailBits(tile);
|
||||
if (IsRailDepotTile(tile)) return ::TRACK_BIT_NONE;
|
||||
return ::GetTrackBits(tile);
|
||||
}
|
||||
|
||||
@@ -316,7 +317,7 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to)
|
||||
EnforcePrecondition(false, ::IsValidTile(tile));
|
||||
EnforcePrecondition(false, ::IsValidTile(to));
|
||||
EnforcePrecondition(false, ::DistanceManhattan(from, tile) == 1);
|
||||
EnforcePrecondition(false, ::DistanceManhattan(tile,to) >= 1);
|
||||
EnforcePrecondition(false, ::DistanceManhattan(tile, to) >= 1);
|
||||
EnforcePrecondition(false, IsRailTypeAvailable(GetCurrentRailType()));
|
||||
int diag_offset = abs(abs((int)::TileX(to) - (int)::TileX(tile)) - abs((int)::TileY(to) - (int)::TileY(tile)));
|
||||
EnforcePrecondition(false, diag_offset <= 1 ||
|
||||
@@ -333,7 +334,7 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to)
|
||||
EnforcePrecondition(false, ::IsValidTile(tile));
|
||||
EnforcePrecondition(false, ::IsValidTile(to));
|
||||
EnforcePrecondition(false, ::DistanceManhattan(from, tile) == 1);
|
||||
EnforcePrecondition(false, ::DistanceManhattan(tile,to) >= 1);
|
||||
EnforcePrecondition(false, ::DistanceManhattan(tile, to) >= 1);
|
||||
int diag_offset = abs(abs((int)::TileX(to) - (int)::TileX(tile)) - abs((int)::TileY(to) - (int)::TileY(tile)));
|
||||
EnforcePrecondition(false, diag_offset <= 1 ||
|
||||
(::TileX(from) == ::TileX(tile) && ::TileX(tile) == ::TileX(to)) ||
|
||||
|
@@ -293,6 +293,7 @@ public:
|
||||
|
||||
/**
|
||||
* Get all RailTracks on the given tile.
|
||||
* @note A depot has no railtracks.
|
||||
* @param tile The tile to check.
|
||||
* @pre IsRailTile(tile).
|
||||
* @return A bitmask of RailTrack with all RailTracks on the tile.
|
||||
|
@@ -5,12 +5,18 @@
|
||||
#include "ai_road.hpp"
|
||||
#include "ai_map.hpp"
|
||||
#include "ai_station.hpp"
|
||||
#include "ai_cargo.hpp"
|
||||
#include "../../station_map.h"
|
||||
#include "../../command_type.h"
|
||||
#include "../../settings_type.h"
|
||||
#include "../../company_func.h"
|
||||
#include "../../script/squirrel_helper_type.hpp"
|
||||
|
||||
/* static */ AIRoad::RoadVehicleType AIRoad::GetRoadVehicleTypeForCargo(CargoID cargo_type)
|
||||
{
|
||||
return AICargo::HasCargoClass(cargo_type, AICargo::CC_PASSENGERS) ? ROADVEHTYPE_BUS : ROADVEHTYPE_TRUCK;
|
||||
}
|
||||
|
||||
/* static */ bool AIRoad::IsRoadTile(TileIndex tile)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return false;
|
||||
@@ -395,7 +401,7 @@ static bool NormaliseTileOffset(int32 *tile)
|
||||
static bool NeighbourHasReachableRoad(::RoadTypes rts, TileIndex start_tile, DiagDirection neighbour)
|
||||
{
|
||||
TileIndex neighbour_tile = ::TileAddByDiagDir(start_tile, neighbour);
|
||||
if ((rts & ::GetRoadTypes(neighbour_tile)) == 0) return false;
|
||||
if ((rts & ::GetRoadTypes(neighbour_tile)) == 0) return false;
|
||||
|
||||
switch (::GetTileType(neighbour_tile)) {
|
||||
case MP_ROAD:
|
||||
|
@@ -56,6 +56,14 @@ public:
|
||||
ROADVEHTYPE_TRUCK, //!< Build objects useable for trucks and cargo trams
|
||||
};
|
||||
|
||||
/**
|
||||
* Determines whether a busstop or a truckstop is needed to transport a certain cargo.
|
||||
* @param cargo_type The cargo to test.
|
||||
* @pre AICargo::IsValidCargo(cargo_type).
|
||||
* @return The road vehicle type needed to transport the cargo.
|
||||
*/
|
||||
static RoadVehicleType GetRoadVehicleTypeForCargo(CargoID cargo_type);
|
||||
|
||||
/**
|
||||
* Checks whether the given tile is actually a tile with road that can be
|
||||
* used to traverse a tile. This excludes road depots and 'normal' road
|
||||
@@ -341,7 +349,7 @@ public:
|
||||
* @exception AIError::ERR_FLAT_LAND_REQUIRED
|
||||
* @exception AIRoad::ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION
|
||||
* @exception AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD
|
||||
* @exception AIError:ERR_VEHICLE_IN_THE_WAY
|
||||
* @exception AIError::ERR_VEHICLE_IN_THE_WAY
|
||||
* @exception AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION
|
||||
* @exception AIStation::ERR_STATION_TOO_MANY_STATIONS
|
||||
* @exception AIStation::ERR_STATION_TOO_MANY_STATIONS_IN_TOWN
|
||||
@@ -364,7 +372,7 @@ public:
|
||||
* @exception AIError::ERR_FLAT_LAND_REQUIRED
|
||||
* @exception AIRoad::ERR_ROAD_DRIVE_THROUGH_WRONG_DIRECTION
|
||||
* @exception AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD
|
||||
* @exception AIError:ERR_VEHICLE_IN_THE_WAY
|
||||
* @exception AIError::ERR_VEHICLE_IN_THE_WAY
|
||||
* @exception AIStation::ERR_STATION_TOO_CLOSE_TO_ANOTHER_STATION
|
||||
* @exception AIStation::ERR_STATION_TOO_MANY_STATIONS
|
||||
* @exception AIStation::ERR_STATION_TOO_MANY_STATIONS_IN_TOWN
|
||||
|
@@ -46,6 +46,7 @@ void SQAIRoad_Register(Squirrel *engine) {
|
||||
AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD, "ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD");
|
||||
AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS, "ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS");
|
||||
|
||||
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::GetRoadVehicleTypeForCargo, "GetRoadVehicleTypeForCargo", 2, ".i");
|
||||
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::IsRoadTile, "IsRoadTile", 2, ".i");
|
||||
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::IsRoadDepotTile, "IsRoadDepotTile", 2, ".i");
|
||||
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::IsRoadStationTile, "IsRoadStationTile", 2, ".i");
|
||||
|
@@ -30,6 +30,7 @@ public:
|
||||
|
||||
/**
|
||||
* Gets the maximum sign index; there are no valid signs with a higher index.
|
||||
* @deprecated This function is deprecated and might be removed in future versions of the API. Use AISignList() instead.
|
||||
* @return The maximum sign index.
|
||||
* @post Return value is always non-negative.
|
||||
*/
|
||||
|
15
src/ai/api/ai_signlist.cpp
Normal file
15
src/ai/api/ai_signlist.cpp
Normal file
@@ -0,0 +1,15 @@
|
||||
/* $Id$ */
|
||||
|
||||
/** @file ai_signlist.cpp Implementation of AISignList and friends. */
|
||||
|
||||
#include "ai_signlist.hpp"
|
||||
#include "ai_sign.hpp"
|
||||
#include "../../signs_base.h"
|
||||
|
||||
AISignList::AISignList()
|
||||
{
|
||||
Sign *s;
|
||||
FOR_ALL_SIGNS(s) {
|
||||
if (AISign::IsValidSign(s->index)) this->AddItem(s->index);
|
||||
}
|
||||
}
|
20
src/ai/api/ai_signlist.hpp
Normal file
20
src/ai/api/ai_signlist.hpp
Normal file
@@ -0,0 +1,20 @@
|
||||
/* $Id$ */
|
||||
|
||||
/** @file ai_signlist.hpp List all the signs of your company. */
|
||||
|
||||
#ifndef AI_SIGNLIST_HPP
|
||||
#define AI_SIGNLIST_HPP
|
||||
|
||||
#include "ai_abstractlist.hpp"
|
||||
|
||||
/**
|
||||
* Create a list of signs your company has created.
|
||||
* @ingroup AIList
|
||||
*/
|
||||
class AISignList : public AIAbstractList {
|
||||
public:
|
||||
static const char *GetClassName() { return "AISignList"; }
|
||||
AISignList();
|
||||
};
|
||||
|
||||
#endif /* AI_SIGNLIST_HPP */
|
21
src/ai/api/ai_signlist.hpp.sq
Normal file
21
src/ai/api/ai_signlist.hpp.sq
Normal file
@@ -0,0 +1,21 @@
|
||||
/* $Id$ */
|
||||
/* THIS FILE IS AUTO-GENERATED; PLEASE DO NOT ALTER MANUALLY */
|
||||
|
||||
#include "ai_signlist.hpp"
|
||||
|
||||
namespace SQConvert {
|
||||
/* Allow AISignList to be used as Squirrel parameter */
|
||||
template <> AISignList *GetParam(ForceType<AISignList *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AISignList *)instance; }
|
||||
template <> AISignList &GetParam(ForceType<AISignList &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AISignList *)instance; }
|
||||
template <> const AISignList *GetParam(ForceType<const AISignList *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AISignList *)instance; }
|
||||
template <> const AISignList &GetParam(ForceType<const AISignList &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AISignList *)instance; }
|
||||
template <> int Return<AISignList *>(HSQUIRRELVM vm, AISignList *res) { if (res == NULL) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, "AISignList", res, NULL, DefSQDestructorCallback<AISignList>); return 1; }
|
||||
}; // namespace SQConvert
|
||||
|
||||
void SQAISignList_Register(Squirrel *engine) {
|
||||
DefSQClass <AISignList> SQAISignList("AISignList");
|
||||
SQAISignList.PreRegister(engine, "AIAbstractList");
|
||||
SQAISignList.AddConstructor<void (AISignList::*)(), 1>(engine, "x");
|
||||
|
||||
SQAISignList.PostRegister(engine);
|
||||
}
|
@@ -17,7 +17,8 @@
|
||||
|
||||
/* static */ bool AIStation::IsValidStation(StationID station_id)
|
||||
{
|
||||
return ::IsValidStationID(station_id) && ::GetStation(station_id)->owner == _current_company;
|
||||
const Station *st = ::IsValidStationID(station_id) ? GetStation(station_id) : NULL;
|
||||
return st != NULL && (st->owner == _current_company || st->owner == OWNER_NONE);
|
||||
}
|
||||
|
||||
/* static */ StationID AIStation::GetStationID(TileIndex tile)
|
||||
|
@@ -49,6 +49,10 @@ public:
|
||||
STATION_ANY = 0x1F, //!< All station types
|
||||
};
|
||||
|
||||
/**
|
||||
* Special station IDs for building adjacent/new stations when
|
||||
* the adjacent/distant join features are enabled.
|
||||
*/
|
||||
enum SpecialStationIDs {
|
||||
STATION_NEW = 0xFFFD, //!< Build a new station
|
||||
STATION_JOIN_ADJACENT = 0xFFFE, //!< Join an neighbouring station if one exists
|
||||
|
@@ -8,7 +8,7 @@
|
||||
bool AITestMode::ModeProc(TileIndex tile, uint32 p1, uint32 p2, uint procc, CommandCost costs)
|
||||
{
|
||||
/* In test mode we only return 'false', telling the DoCommand it
|
||||
* should stop after testing the command and return with that result. */
|
||||
* should stop after testing the command and return with that result. */
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@@ -11,6 +11,7 @@
|
||||
#include "../../water_map.h"
|
||||
#include "../../clear_map.h"
|
||||
#include "../../town.h"
|
||||
#include "../../landscape.h"
|
||||
|
||||
/* static */ bool AITile::IsBuildable(TileIndex tile)
|
||||
{
|
||||
@@ -72,14 +73,14 @@
|
||||
|
||||
/* static */ bool AITile::IsSteepSlope(Slope slope)
|
||||
{
|
||||
if (slope == SLOPE_INVALID) return false;
|
||||
if ((slope & ~(SLOPE_ELEVATED | SLOPE_STEEP | SLOPE_HALFTILE_MASK)) != 0) return false;
|
||||
|
||||
return ::IsSteepSlope((::Slope)slope);
|
||||
}
|
||||
|
||||
/* static */ bool AITile::IsHalftileSlope(Slope slope)
|
||||
{
|
||||
if (slope == SLOPE_INVALID) return false;
|
||||
if ((slope & ~(SLOPE_ELEVATED | SLOPE_STEEP | SLOPE_HALFTILE_MASK)) != 0) return false;
|
||||
|
||||
return ::IsHalftileSlope((::Slope)slope);
|
||||
}
|
||||
@@ -123,20 +124,41 @@
|
||||
|
||||
/* static */ AITile::Slope AITile::GetComplementSlope(Slope slope)
|
||||
{
|
||||
if (slope == SLOPE_INVALID) return SLOPE_INVALID;
|
||||
if (IsSteepSlope(slope)) return SLOPE_INVALID;
|
||||
if (IsHalftileSlope(slope)) return SLOPE_INVALID;
|
||||
if ((slope & ~SLOPE_ELEVATED) != 0) return SLOPE_INVALID;
|
||||
|
||||
return (Slope)::ComplementSlope((::Slope)slope);
|
||||
}
|
||||
|
||||
/* static */ int32 AITile::GetHeight(TileIndex tile)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return false;
|
||||
if (!::IsValidTile(tile)) return -1;
|
||||
|
||||
return ::TileHeight(tile);
|
||||
}
|
||||
|
||||
/* static */ int32 AITile::GetMinHeight(TileIndex tile)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return -1;
|
||||
|
||||
return ::GetTileZ(tile) / ::TILE_HEIGHT;
|
||||
}
|
||||
|
||||
/* static */ int32 AITile::GetMaxHeight(TileIndex tile)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return -1;
|
||||
|
||||
return ::GetTileMaxZ(tile) / ::TILE_HEIGHT;
|
||||
}
|
||||
|
||||
/* static */ int32 AITile::GetCornerHeight(TileIndex tile, Corner corner)
|
||||
{
|
||||
if (!::IsValidTile(tile) || !::IsValidCorner((::Corner)corner)) return -1;
|
||||
|
||||
uint z;
|
||||
::Slope slope = ::GetTileSlope(tile, &z);
|
||||
return (z + ::GetSlopeZInCorner(slope, (::Corner)corner)) / ::TILE_HEIGHT;
|
||||
}
|
||||
|
||||
/* static */ AICompany::CompanyID AITile::GetOwner(TileIndex tile)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return AICompany::COMPANY_INVALID;
|
||||
@@ -153,21 +175,21 @@
|
||||
return ::TrackStatusToTrackdirBits(::GetTileTrackStatus(tile, (::TransportType)transport_type, UINT32_MAX)) != TRACKDIR_BIT_NONE;
|
||||
}
|
||||
|
||||
/* static */ int32 AITile::GetCargoAcceptance(TileIndex tile, CargoID cargo_type, uint width, uint height, uint radius)
|
||||
/* static */ int32 AITile::GetCargoAcceptance(TileIndex tile, CargoID cargo_type, int width, int height, int radius)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return false;
|
||||
if (!::IsValidTile(tile) || width <= 0 || height <= 0 || radius < 0) return -1;
|
||||
|
||||
AcceptedCargo accepts;
|
||||
::GetAcceptanceAroundTiles(accepts, tile, width, height, _settings_game.station.modified_catchment ? radius : (uint)CA_UNMODIFIED);
|
||||
::GetAcceptanceAroundTiles(accepts, tile, width, height, _settings_game.station.modified_catchment ? radius : (int)CA_UNMODIFIED);
|
||||
return accepts[cargo_type];
|
||||
}
|
||||
|
||||
/* static */ int32 AITile::GetCargoProduction(TileIndex tile, CargoID cargo_type, uint width, uint height, uint radius)
|
||||
/* static */ int32 AITile::GetCargoProduction(TileIndex tile, CargoID cargo_type, int width, int height, int radius)
|
||||
{
|
||||
if (!::IsValidTile(tile)) return false;
|
||||
if (!::IsValidTile(tile) || width <= 0 || height <= 0 || radius < 0) return -1;
|
||||
|
||||
AcceptedCargo produced;
|
||||
::GetProductionAroundTiles(produced, tile, width, height, _settings_game.station.modified_catchment ? radius : (uint)CA_UNMODIFIED);
|
||||
::GetProductionAroundTiles(produced, tile, width, height, _settings_game.station.modified_catchment ? radius : (int)CA_UNMODIFIED);
|
||||
return produced[cargo_type];
|
||||
}
|
||||
|
||||
|
@@ -29,10 +29,28 @@ public:
|
||||
|
||||
/** Tile can't be lowered any lower */
|
||||
ERR_TILE_TOO_LOW, // [STR_1003_ALREADY_AT_SEA_LEVEL]
|
||||
|
||||
/** The area was already flat */
|
||||
ERR_AREA_ALREADY_FLAT, // [STR_ALREADY_LEVELLED]
|
||||
|
||||
/** There is a tunnel underneed */
|
||||
ERR_EXCAVATION_WOULD_DAMAGE, // [STR_1002_EXCAVATION_WOULD_DAMAGE]
|
||||
};
|
||||
|
||||
/**
|
||||
* Enumeration for the slope-type (from slopes.h).
|
||||
* Enumeration for corners of tiles.
|
||||
*/
|
||||
enum Corner {
|
||||
CORNER_W = 0, //!< West corner
|
||||
CORNER_S = 1, //!< South corner
|
||||
CORNER_E = 2, //!< East corner
|
||||
CORNER_N = 3, //!< North corner
|
||||
|
||||
CORNER_INVALID = 0xFF,
|
||||
};
|
||||
|
||||
/**
|
||||
* Enumeration for the slope-type.
|
||||
*
|
||||
* This enumeration use the chars N, E, S, W corresponding the
|
||||
* direction North, East, South and West. The top corner of a tile
|
||||
@@ -41,18 +59,18 @@ public:
|
||||
enum Slope {
|
||||
/* Values are important, as they represent the internal state of the game. */
|
||||
SLOPE_FLAT = 0x00, //!< A flat tile
|
||||
SLOPE_W = 0x01, //!< The west corner of the tile is raised
|
||||
SLOPE_S = 0x02, //!< The south corner of the tile is raised
|
||||
SLOPE_E = 0x04, //!< The east corner of the tile is raised
|
||||
SLOPE_N = 0x08, //!< The north corner of the tile is raised
|
||||
SLOPE_STEEP = 0x10, //!< Indicates the slope is steep
|
||||
SLOPE_W = 1 << CORNER_W, //!< The west corner of the tile is raised
|
||||
SLOPE_S = 1 << CORNER_S, //!< The south corner of the tile is raised
|
||||
SLOPE_E = 1 << CORNER_E, //!< The east corner of the tile is raised
|
||||
SLOPE_N = 1 << CORNER_N, //!< The north corner of the tile is raised
|
||||
SLOPE_STEEP = 0x10, //!< Indicates the slope is steep (The corner opposite of the not-raised corner is raised two times)
|
||||
SLOPE_NW = SLOPE_N | SLOPE_W, //!< North and west corner are raised
|
||||
SLOPE_SW = SLOPE_S | SLOPE_W, //!< South and west corner are raised
|
||||
SLOPE_SE = SLOPE_S | SLOPE_E, //!< South and east corner are raised
|
||||
SLOPE_NE = SLOPE_N | SLOPE_E, //!< North and east corner are raised
|
||||
SLOPE_EW = SLOPE_E | SLOPE_W, //!< East and west corner are raised
|
||||
SLOPE_NS = SLOPE_N | SLOPE_S, //!< North and south corner are raised
|
||||
SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, //!< All corner are raised, similar to SLOPE_FLAT
|
||||
SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, //!< Bit mask containing all 'simple' slopes. Does not appear as a slope.
|
||||
SLOPE_NWS = SLOPE_N | SLOPE_W | SLOPE_S, //!< North, west and south corner are raised
|
||||
SLOPE_WSE = SLOPE_W | SLOPE_S | SLOPE_E, //!< West, south and east corner are raised
|
||||
SLOPE_SEN = SLOPE_S | SLOPE_E | SLOPE_N, //!< South, east and north corner are raised
|
||||
@@ -62,7 +80,7 @@ public:
|
||||
SLOPE_STEEP_E = SLOPE_STEEP | SLOPE_SEN, //!< A steep slope falling to west (from east)
|
||||
SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW, //!< A steep slope falling to south (from north)
|
||||
|
||||
SLOPE_INVALID = 0xFF, //!< An invalid slope
|
||||
SLOPE_INVALID = 0xFFFF, //!< An invalid slope
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -129,6 +147,7 @@ public:
|
||||
|
||||
/**
|
||||
* Check if a tile has a steep slope.
|
||||
* Steep slopes are slopes with a height difference of 2 across one diagonal of the tile.
|
||||
* @param slope The slope to check on.
|
||||
* @pre slope != SLOPE_INVALID.
|
||||
* @return True if the slope is a steep slope.
|
||||
@@ -137,9 +156,11 @@ public:
|
||||
|
||||
/**
|
||||
* Check if a tile has a halftile slope.
|
||||
* Halftile slopes appear on top of halftile foundations. E.g. the slope you get when building a horizontal railtrack on the top of a SLOPE_N or SLOPE_STEEP_N.
|
||||
* @param slope The slope to check on.
|
||||
* @pre slope != SLOPE_INVALID.
|
||||
* @return True if the slope is a halftile slope.
|
||||
* @note Currently there is no API function that would return or accept a halftile slope.
|
||||
*/
|
||||
static bool IsHalftileSlope(Slope slope);
|
||||
|
||||
@@ -193,9 +214,10 @@ public:
|
||||
|
||||
/**
|
||||
* Get the slope of a tile.
|
||||
* This is the slope of the bare tile. A possible foundation on the tile does not influence this slope.
|
||||
* @param tile The tile to check on.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @return 0 means flat, others indicate internal state of slope.
|
||||
* @return Bit mask encoding the slope. See #Slope for a description of the returned values.
|
||||
*/
|
||||
static Slope GetSlope(TileIndex tile);
|
||||
|
||||
@@ -211,13 +233,43 @@ public:
|
||||
static Slope GetComplementSlope(Slope slope);
|
||||
|
||||
/**
|
||||
* Get the height of the tile.
|
||||
* Get the height of the north corner of a tile.
|
||||
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
|
||||
* @deprecated This function is deprecated and might be removed in future versions of the API. Use GetMinHeight(), GetMaxHeight() or GetCornerHeight() instead.
|
||||
* @param tile The tile to check on.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @return The height of the tile, ranging from 0 to 15.
|
||||
* @return The height of the north corner of the tile, ranging from 0 to 15.
|
||||
*/
|
||||
static int32 GetHeight(TileIndex tile);
|
||||
|
||||
/**
|
||||
* Get the minimal height on a tile.
|
||||
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
|
||||
* @param tile The tile to check on.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @return The height of the lowest corner of the tile, ranging from 0 to 15.
|
||||
*/
|
||||
static int32 GetMinHeight(TileIndex tile);
|
||||
|
||||
/**
|
||||
* Get the maximal height on a tile.
|
||||
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
|
||||
* @param tile The tile to check on.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @return The height of the highest corner of the tile, ranging from 0 to 15.
|
||||
*/
|
||||
static int32 GetMaxHeight(TileIndex tile);
|
||||
|
||||
/**
|
||||
* Get the height of a certain corner of a tile.
|
||||
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
|
||||
* @param tile The tile to check on.
|
||||
* @param corner The corner to query.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @return The height of the lowest corner of the tile, ranging from 0 to 15.
|
||||
*/
|
||||
static int32 GetCornerHeight(TileIndex tile, Corner corner);
|
||||
|
||||
/**
|
||||
* Get the owner of the tile.
|
||||
* @param tile The tile to get the owner from.
|
||||
@@ -251,9 +303,12 @@ public:
|
||||
* @param height The height of the station.
|
||||
* @param radius The radius of the station.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @pre width > 0.
|
||||
* @pre height > 0.
|
||||
* @pre radius >= 0.
|
||||
* @return Value below 8 means no acceptance; the more the better.
|
||||
*/
|
||||
static int32 GetCargoAcceptance(TileIndex tile, CargoID cargo_type, uint width, uint height, uint radius);
|
||||
static int32 GetCargoAcceptance(TileIndex tile, CargoID cargo_type, int width, int height, int radius);
|
||||
|
||||
/**
|
||||
* Checks how many tiles in the radius produces this cargo.
|
||||
@@ -265,10 +320,13 @@ public:
|
||||
* @param height The height of the station.
|
||||
* @param radius The radius of the station.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @pre width > 0.
|
||||
* @pre height > 0.
|
||||
* @pre radius >= 0.
|
||||
* @return The tiles that produce this cargo within radius of the tile.
|
||||
* @note Town(houses) are not included in the value.
|
||||
*/
|
||||
static int32 GetCargoProduction(TileIndex tile, CargoID cargo_type, uint width, uint height, uint radius);
|
||||
static int32 GetCargoProduction(TileIndex tile, CargoID cargo_type, int width, int height, int radius);
|
||||
|
||||
/**
|
||||
* Get the manhattan distance from the tile to the tile.
|
||||
@@ -288,7 +346,10 @@ public:
|
||||
|
||||
/**
|
||||
* Raise the given corners of the tile. The corners can be combined,
|
||||
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW)
|
||||
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW) will raise the west and the north corner.
|
||||
* @note The corners will be modified in the order west (first), south, east, north (last).
|
||||
* Changing one corner might cause another corner to be changed too. So modifiing
|
||||
* multiple corners may result in changing some corners by multiple steps.
|
||||
* @param tile The tile to raise.
|
||||
* @param slope Corners to raise (SLOPE_xxx).
|
||||
* @pre tile < AIMap::GetMapSize().
|
||||
@@ -301,7 +362,10 @@ public:
|
||||
|
||||
/**
|
||||
* Lower the given corners of the tile. The corners can be combined,
|
||||
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW)
|
||||
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW) will lower the west and the north corner.
|
||||
* @note The corners will be modified in the order west (first), south, east, north (last).
|
||||
* Changing one corner might cause another corner to be changed too. So modifiing
|
||||
* multiple corners may result in changing some corners by multiple steps.
|
||||
* @param tile The tile to lower.
|
||||
* @param slope Corners to lower (SLOPE_xxx).
|
||||
* @pre tile < AIMap::GetMapSize().
|
||||
|
@@ -7,6 +7,8 @@ namespace SQConvert {
|
||||
/* Allow enums to be used as Squirrel parameters */
|
||||
template <> AITile::ErrorMessages GetParam(ForceType<AITile::ErrorMessages>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::ErrorMessages)tmp; }
|
||||
template <> int Return<AITile::ErrorMessages>(HSQUIRRELVM vm, AITile::ErrorMessages res) { sq_pushinteger(vm, (int32)res); return 1; }
|
||||
template <> AITile::Corner GetParam(ForceType<AITile::Corner>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::Corner)tmp; }
|
||||
template <> int Return<AITile::Corner>(HSQUIRRELVM vm, AITile::Corner res) { sq_pushinteger(vm, (int32)res); return 1; }
|
||||
template <> AITile::Slope GetParam(ForceType<AITile::Slope>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::Slope)tmp; }
|
||||
template <> int Return<AITile::Slope>(HSQUIRRELVM vm, AITile::Slope res) { sq_pushinteger(vm, (int32)res); return 1; }
|
||||
template <> AITile::TransportType GetParam(ForceType<AITile::TransportType>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::TransportType)tmp; }
|
||||
@@ -25,42 +27,53 @@ void SQAITile_Register(Squirrel *engine) {
|
||||
SQAITile.PreRegister(engine);
|
||||
SQAITile.AddConstructor<void (AITile::*)(), 1>(engine, "x");
|
||||
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_TILE_BASE, "ERR_TILE_BASE");
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_FLAT, "SLOPE_FLAT");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_W, "SLOPE_W");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_S, "SLOPE_S");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_E, "SLOPE_E");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_N, "SLOPE_N");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP, "SLOPE_STEEP");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NW, "SLOPE_NW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_SW, "SLOPE_SW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_SE, "SLOPE_SE");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NE, "SLOPE_NE");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_EW, "SLOPE_EW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NS, "SLOPE_NS");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_ELEVATED, "SLOPE_ELEVATED");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NWS, "SLOPE_NWS");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_WSE, "SLOPE_WSE");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_SEN, "SLOPE_SEN");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_ENW, "SLOPE_ENW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_W, "SLOPE_STEEP_W");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_S, "SLOPE_STEEP_S");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_E, "SLOPE_STEEP_E");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_N, "SLOPE_STEEP_N");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_INVALID, "SLOPE_INVALID");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_RAIL, "TRANSPORT_RAIL");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_ROAD, "TRANSPORT_ROAD");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_WATER, "TRANSPORT_WATER");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_AIR, "TRANSPORT_AIR");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_INVALID, "TRANSPORT_INVALID");
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_TILE_BASE, "ERR_TILE_BASE");
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_AREA_ALREADY_FLAT, "ERR_AREA_ALREADY_FLAT");
|
||||
SQAITile.DefSQConst(engine, AITile::ERR_EXCAVATION_WOULD_DAMAGE, "ERR_EXCAVATION_WOULD_DAMAGE");
|
||||
SQAITile.DefSQConst(engine, AITile::CORNER_W, "CORNER_W");
|
||||
SQAITile.DefSQConst(engine, AITile::CORNER_S, "CORNER_S");
|
||||
SQAITile.DefSQConst(engine, AITile::CORNER_E, "CORNER_E");
|
||||
SQAITile.DefSQConst(engine, AITile::CORNER_N, "CORNER_N");
|
||||
SQAITile.DefSQConst(engine, AITile::CORNER_INVALID, "CORNER_INVALID");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_FLAT, "SLOPE_FLAT");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_W, "SLOPE_W");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_S, "SLOPE_S");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_E, "SLOPE_E");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_N, "SLOPE_N");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP, "SLOPE_STEEP");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NW, "SLOPE_NW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_SW, "SLOPE_SW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_SE, "SLOPE_SE");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NE, "SLOPE_NE");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_EW, "SLOPE_EW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NS, "SLOPE_NS");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_ELEVATED, "SLOPE_ELEVATED");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_NWS, "SLOPE_NWS");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_WSE, "SLOPE_WSE");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_SEN, "SLOPE_SEN");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_ENW, "SLOPE_ENW");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_W, "SLOPE_STEEP_W");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_S, "SLOPE_STEEP_S");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_E, "SLOPE_STEEP_E");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_N, "SLOPE_STEEP_N");
|
||||
SQAITile.DefSQConst(engine, AITile::SLOPE_INVALID, "SLOPE_INVALID");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_RAIL, "TRANSPORT_RAIL");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_ROAD, "TRANSPORT_ROAD");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_WATER, "TRANSPORT_WATER");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_AIR, "TRANSPORT_AIR");
|
||||
SQAITile.DefSQConst(engine, AITile::TRANSPORT_INVALID, "TRANSPORT_INVALID");
|
||||
|
||||
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_HIGH);
|
||||
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_LOW);
|
||||
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_HIGH);
|
||||
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_LOW);
|
||||
AIError::RegisterErrorMap(STR_ALREADY_LEVELLED, AITile::ERR_AREA_ALREADY_FLAT);
|
||||
AIError::RegisterErrorMap(STR_1002_EXCAVATION_WOULD_DAMAGE, AITile::ERR_EXCAVATION_WOULD_DAMAGE);
|
||||
|
||||
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
|
||||
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
|
||||
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
|
||||
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
|
||||
AIError::RegisterErrorMapString(AITile::ERR_AREA_ALREADY_FLAT, "ERR_AREA_ALREADY_FLAT");
|
||||
AIError::RegisterErrorMapString(AITile::ERR_EXCAVATION_WOULD_DAMAGE, "ERR_EXCAVATION_WOULD_DAMAGE");
|
||||
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::IsBuildable, "IsBuildable", 2, ".i");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::IsBuildableRectangle, "IsBuildableRectangle", 4, ".iii");
|
||||
@@ -78,6 +91,9 @@ void SQAITile_Register(Squirrel *engine) {
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetSlope, "GetSlope", 2, ".i");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetComplementSlope, "GetComplementSlope", 2, ".i");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetHeight, "GetHeight", 2, ".i");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetMinHeight, "GetMinHeight", 2, ".i");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetMaxHeight, "GetMaxHeight", 2, ".i");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetCornerHeight, "GetCornerHeight", 3, ".ii");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetOwner, "GetOwner", 2, ".i");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::HasTransportType, "HasTransportType", 3, ".ii");
|
||||
SQAITile.DefSQStaticMethod(engine, &AITile::GetCargoAcceptance, "GetCargoAcceptance", 6, ".iiiii");
|
||||
|
@@ -68,9 +68,9 @@ void AITileList::RemoveTile(TileIndex tile)
|
||||
this->RemoveItem(tile);
|
||||
}
|
||||
|
||||
AITileList_IndustryAccepting::AITileList_IndustryAccepting(IndustryID industry_id, uint radius)
|
||||
AITileList_IndustryAccepting::AITileList_IndustryAccepting(IndustryID industry_id, int radius)
|
||||
{
|
||||
if (!AIIndustry::IsValidIndustry(industry_id)) return;
|
||||
if (!AIIndustry::IsValidIndustry(industry_id) || radius <= 0) return;
|
||||
|
||||
const Industry *i = ::GetIndustry(industry_id);
|
||||
|
||||
@@ -106,9 +106,9 @@ AITileList_IndustryAccepting::AITileList_IndustryAccepting(IndustryID industry_i
|
||||
} END_TILE_LOOP(cur_tile, i->width + radius * 2, i->height + radius * 2, i->xy - ::TileDiffXY(radius, radius))
|
||||
}
|
||||
|
||||
AITileList_IndustryProducing::AITileList_IndustryProducing(IndustryID industry_id, uint radius)
|
||||
AITileList_IndustryProducing::AITileList_IndustryProducing(IndustryID industry_id, int radius)
|
||||
{
|
||||
if (!AIIndustry::IsValidIndustry(industry_id)) return;
|
||||
if (!AIIndustry::IsValidIndustry(industry_id) || radius <= 0) return;
|
||||
|
||||
const Industry *i = ::GetIndustry(industry_id);
|
||||
|
||||
|
@@ -71,8 +71,10 @@ public:
|
||||
/**
|
||||
* @param industry_id The industry to create the AITileList around.
|
||||
* @param radius The radius of the station you will be using.
|
||||
* @pre AIIndustry::IsValidIndustry(industry_id).
|
||||
* @pre radius > 0.
|
||||
*/
|
||||
AITileList_IndustryAccepting(IndustryID industry_id, uint radius);
|
||||
AITileList_IndustryAccepting(IndustryID industry_id, int radius);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -87,8 +89,10 @@ public:
|
||||
/**
|
||||
* @param industry_id The industry to create the AITileList around.
|
||||
* @param radius The radius of the station you will be using.
|
||||
* @pre AIIndustry::IsValidIndustry(industry_id).
|
||||
* @pre radius > 0.
|
||||
*/
|
||||
AITileList_IndustryProducing(IndustryID industry_id, uint radius);
|
||||
AITileList_IndustryProducing(IndustryID industry_id, int radius);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -37,7 +37,7 @@ namespace SQConvert {
|
||||
void SQAITileList_IndustryAccepting_Register(Squirrel *engine) {
|
||||
DefSQClass <AITileList_IndustryAccepting> SQAITileList_IndustryAccepting("AITileList_IndustryAccepting");
|
||||
SQAITileList_IndustryAccepting.PreRegister(engine, "AITileList");
|
||||
SQAITileList_IndustryAccepting.AddConstructor<void (AITileList_IndustryAccepting::*)(IndustryID industry_id, uint radius), 3>(engine, "xii");
|
||||
SQAITileList_IndustryAccepting.AddConstructor<void (AITileList_IndustryAccepting::*)(IndustryID industry_id, int radius), 3>(engine, "xii");
|
||||
|
||||
SQAITileList_IndustryAccepting.PostRegister(engine);
|
||||
}
|
||||
@@ -54,7 +54,7 @@ namespace SQConvert {
|
||||
void SQAITileList_IndustryProducing_Register(Squirrel *engine) {
|
||||
DefSQClass <AITileList_IndustryProducing> SQAITileList_IndustryProducing("AITileList_IndustryProducing");
|
||||
SQAITileList_IndustryProducing.PreRegister(engine, "AITileList");
|
||||
SQAITileList_IndustryProducing.AddConstructor<void (AITileList_IndustryProducing::*)(IndustryID industry_id, uint radius), 3>(engine, "xii");
|
||||
SQAITileList_IndustryProducing.AddConstructor<void (AITileList_IndustryProducing::*)(IndustryID industry_id, int radius), 3>(engine, "xii");
|
||||
|
||||
SQAITileList_IndustryProducing.PostRegister(engine);
|
||||
}
|
||||
|
@@ -23,14 +23,26 @@
|
||||
/* If it's a tunnel alread, take the easy way out! */
|
||||
if (IsTunnelTile(tile)) return ::GetOtherTunnelEnd(tile);
|
||||
|
||||
::DoCommand(tile, 0, 0, DC_AUTO, CMD_BUILD_TUNNEL);
|
||||
return _build_tunnel_endtile == 0 ? INVALID_TILE : _build_tunnel_endtile;
|
||||
uint start_z;
|
||||
Slope start_tileh = ::GetTileSlope(tile, &start_z);
|
||||
DiagDirection direction = ::GetInclinedSlopeDirection(start_tileh);
|
||||
if (direction == INVALID_DIAGDIR) return INVALID_TILE;
|
||||
|
||||
TileIndexDiff delta = ::TileOffsByDiagDir(direction);
|
||||
uint end_z;
|
||||
do {
|
||||
tile += delta;
|
||||
if (!::IsValidTile(tile)) return INVALID_TILE;
|
||||
|
||||
::GetTileSlope(tile, &end_z);
|
||||
} while (start_z != end_z);
|
||||
|
||||
return tile;
|
||||
}
|
||||
|
||||
static void _DoCommandReturnBuildTunnel2(class AIInstance *instance)
|
||||
{
|
||||
if (!AITunnel::_BuildTunnelRoad2()) {
|
||||
AIObject::SetLastCommandRes(false);
|
||||
AIInstance::DoCommandReturn(instance);
|
||||
return;
|
||||
}
|
||||
@@ -43,7 +55,6 @@ static void _DoCommandReturnBuildTunnel2(class AIInstance *instance)
|
||||
static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
|
||||
{
|
||||
if (!AITunnel::_BuildTunnelRoad1()) {
|
||||
AIObject::SetLastCommandRes(false);
|
||||
AIInstance::DoCommandReturn(instance);
|
||||
return;
|
||||
}
|
||||
@@ -62,7 +73,7 @@ static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
|
||||
uint type = 0;
|
||||
if (vehicle_type == AIVehicle::VT_ROAD) {
|
||||
type |= (TRANSPORT_ROAD << 9);
|
||||
type |= RoadTypeToRoadTypes((::RoadType)AIObject::GetRoadType());
|
||||
type |= ::RoadTypeToRoadTypes((::RoadType)AIObject::GetRoadType());
|
||||
} else {
|
||||
type |= (TRANSPORT_RAIL << 9);
|
||||
type |= AIRail::GetCurrentRailType();
|
||||
@@ -74,10 +85,7 @@ static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
|
||||
}
|
||||
|
||||
AIObject::SetCallbackVariable(0, start);
|
||||
if (!AIObject::DoCommand(start, type, 0, CMD_BUILD_TUNNEL, NULL, &_DoCommandReturnBuildTunnel1)) return false;
|
||||
|
||||
/* In case of test-mode, test if we can build both road pieces */
|
||||
return _BuildTunnelRoad1();
|
||||
return AIObject::DoCommand(start, type, 0, CMD_BUILD_TUNNEL, NULL, &_DoCommandReturnBuildTunnel1);
|
||||
}
|
||||
|
||||
/* static */ bool AITunnel::_BuildTunnelRoad1()
|
||||
@@ -89,10 +97,7 @@ static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
|
||||
DiagDirection dir_1 = (DiagDirection)((::TileX(start) == ::TileX(end)) ? (::TileY(start) < ::TileY(end) ? DIAGDIR_NW : DIAGDIR_SE) : (::TileX(start) < ::TileX(end) ? DIAGDIR_NE : DIAGDIR_SW));
|
||||
DiagDirection dir_2 = ::ReverseDiagDir(dir_1);
|
||||
|
||||
if (!AIObject::DoCommand(start + ::TileOffsByDiagDir(dir_1), ::DiagDirToRoadBits(dir_2) | (AIObject::GetRoadType() << 4), 0, CMD_BUILD_ROAD, NULL, &_DoCommandReturnBuildTunnel2)) return false;
|
||||
|
||||
/* In case of test-mode, test the other road piece too */
|
||||
return _BuildTunnelRoad2();
|
||||
return AIObject::DoCommand(start + ::TileOffsByDiagDir(dir_1), ::DiagDirToRoadBits(dir_2) | (AIObject::GetRoadType() << 4), 0, CMD_BUILD_ROAD, NULL, &_DoCommandReturnBuildTunnel2);
|
||||
}
|
||||
|
||||
/* static */ bool AITunnel::_BuildTunnelRoad2()
|
||||
|
@@ -46,11 +46,15 @@ public:
|
||||
|
||||
/**
|
||||
* Get the tile that exits on the other end of a (would be) tunnel starting
|
||||
* at tile.
|
||||
* at tile. If there is no 'simple' inclined slope at the start tile,
|
||||
* this function will return AIMap::TILE_INVALID.
|
||||
* @param tile The tile that is an entrance to a tunnel or the tile where you may want to build a tunnel.
|
||||
* @pre AIMap::IsValidTile(tile).
|
||||
* @return The TileIndex that is the other end of the (would be) tunnel, or
|
||||
* TILE_INVALID if no other end was found (can't build tunnel).
|
||||
* AIMap::TILE_INVALID if no other end was found (can't build tunnel).
|
||||
* @note Even if this function returns a valid tile, that is no guarantee
|
||||
* that building a tunnel will succeed. Use BuildTunnel in AITestMode to
|
||||
* check whether a tunnel can actually be build.
|
||||
*/
|
||||
static TileIndex GetOtherTunnelEnd(TileIndex tile);
|
||||
|
||||
|
@@ -1,6 +1,75 @@
|
||||
/* $Id$ */
|
||||
|
||||
/** @file ai_types.hpp Defines all the types of the game, like VehicleID, .... */
|
||||
/** @file ai_types.hpp Defines all the types of the game, like IDs of various objects.
|
||||
*
|
||||
* IDs are used to identify certain objects. They are only unique within the object type, so for example a vehicle may have VehicleID 2009,
|
||||
* while a station has StationID 2009 at the same time. Also IDs are assigned arbitrary, you cannot assume them to be consecutive.
|
||||
* Also note, that some IDs are static and never change, while others are allocated dynamically and might be
|
||||
* reused for other objects once they are released. So be careful, which IDs you store for which purpose and whether they stay valid all the time.
|
||||
*
|
||||
* <table>
|
||||
* <tr><th>type </th><th> object </th>
|
||||
* <th> acquired </th>
|
||||
* <th> released </th>
|
||||
* <th> reused </th></tr>
|
||||
* <tr><td>#BridgeID </td><td> bridge type </td>
|
||||
* <td> introduction \ref newgrf_changes "(1)" </td>
|
||||
* <td> never \ref newgrf_changes "(1)" </td>
|
||||
* <td> no \ref newgrf_changes "(1)" </td></tr>
|
||||
* <tr><td>#CargoID </td><td> cargo type </td>
|
||||
* <td> game start \ref newgrf_changes "(1)" </td>
|
||||
* <td> never \ref newgrf_changes "(1)" </td>
|
||||
* <td> no \ref newgrf_changes "(1)" </td></tr>
|
||||
* <tr><td>#EngineID </td><td> engine type </td>
|
||||
* <td> introduction, preview \ref dynamic_engines "(2)" </td>
|
||||
* <td> engines retires \ref dynamic_engines "(2)" </td>
|
||||
* <td> no \ref dynamic_engines "(2)" </td></tr>
|
||||
* <tr><td>#GroupID </td><td> vehicle group </td>
|
||||
* <td> creation </td>
|
||||
* <td> deletion </td>
|
||||
* <td> yes </td></tr>
|
||||
* <tr><td>#IndustryID </td><td> industry </td>
|
||||
* <td> construction </td>
|
||||
* <td> closure </td>
|
||||
* <td> yes </td></tr>
|
||||
* <tr><td>#IndustryType</td><td> industry type </td>
|
||||
* <td> game start \ref newgrf_changes "(1)" </td>
|
||||
* <td> never \ref newgrf_changes "(1)" </td>
|
||||
* <td> no </td></tr>
|
||||
* <tr><td>#SignID </td><td> sign </td>
|
||||
* <td> construction </td>
|
||||
* <td> deletion </td>
|
||||
* <td> yes </td></tr>
|
||||
* <tr><td>#StationID </td><td> station </td>
|
||||
* <td> construction </td>
|
||||
* <td> expiration of 'grey' station sign after deletion </td>
|
||||
* <td> yes </td></tr>
|
||||
* <tr><td>#SubsidyID </td><td> subsidy </td>
|
||||
* <td> offer announcement </td>
|
||||
* <td> (offer) expiration </td>
|
||||
* <td> yes </td></tr>
|
||||
* <tr><td>#TileIndex </td><td> tile on map </td>
|
||||
* <td> game start </td>
|
||||
* <td> never </td>
|
||||
* <td> no </td></tr>
|
||||
* <tr><td>#TownID </td><td> town </td>
|
||||
* <td> game start </td>
|
||||
* <td> never </td>
|
||||
* <td> no </td></tr>
|
||||
* <tr><td>#VehicleID </td><td> vehicle </td>
|
||||
* <td> construction, autorenew, autoreplace </td>
|
||||
* <td> destruction, autorenew, autoreplace </td>
|
||||
* <td> yes </td></tr>
|
||||
* <tr><td>#WaypointID </td><td> waypoint </td>
|
||||
* <td> construction </td>
|
||||
* <td> destruction </td>
|
||||
* <td> yes </td></tr>
|
||||
* </table>
|
||||
*
|
||||
* @remarks
|
||||
* \li \anchor newgrf_changes (1) in-game changes of newgrfs may reassign/invalidate IDs (will also cause other trouble though).
|
||||
* \li \anchor dynamic_engines (2) engine IDs are reassigned/invalidated on changing 'allow multiple newgrf engine sets' (only allowed as long as no vehicles are built).
|
||||
*/
|
||||
|
||||
#ifndef AI_TYPES_HPP
|
||||
#define AI_TYPES_HPP
|
||||
|
@@ -160,6 +160,13 @@
|
||||
return AIObject::DoCommand(0, vehicle_id, 0, GetCmdSendToDepot(::GetVehicle(vehicle_id)));
|
||||
}
|
||||
|
||||
/* static */ bool AIVehicle::SendVehicleToDepotForServicing(VehicleID vehicle_id)
|
||||
{
|
||||
EnforcePrecondition(false, IsValidVehicle(vehicle_id));
|
||||
|
||||
return AIObject::DoCommand(0, vehicle_id, DEPOT_SERVICE, GetCmdSendToDepot(::GetVehicle(vehicle_id)));
|
||||
}
|
||||
|
||||
/* static */ bool AIVehicle::IsInDepot(VehicleID vehicle_id)
|
||||
{
|
||||
if (!IsValidVehicle(vehicle_id)) return false;
|
||||
@@ -418,3 +425,11 @@
|
||||
Vehicle *v = ::GetVehicle(vehicle_id);
|
||||
return v->orders.list != NULL && v->orders.list->GetNumVehicles() > 1;
|
||||
}
|
||||
|
||||
/* static */ int AIVehicle::GetReliability(VehicleID vehicle_id)
|
||||
{
|
||||
if (!IsValidVehicle(vehicle_id)) return -1;
|
||||
|
||||
const Vehicle *v = ::GetVehicle(vehicle_id);
|
||||
return v->reliability * 100 >> 16;
|
||||
}
|
||||
|
@@ -43,7 +43,7 @@ public:
|
||||
ERR_VEHICLE_CANNOT_START_STOP, // [STR_883B_CAN_T_STOP_START_TRAIN, STR_9015_CAN_T_STOP_START_ROAD_VEHICLE, STR_9818_CAN_T_STOP_START_SHIP, STR_A016_CAN_T_STOP_START_AIRCRAFT]
|
||||
|
||||
/** Vehicle can't turn */
|
||||
ERR_VEHICLE_CANNOT_TURN, // [STR_8869_CAN_T_REVERSE_DIRECTION, STR_9033_CAN_T_MAKE_VEHICLE_TURN]
|
||||
ERR_VEHICLE_CANNOT_TURN, // [STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN, STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN, STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE, STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS]
|
||||
|
||||
/** Vehicle can't be refit */
|
||||
ERR_VEHICLE_CANNOT_REFIT, // [STR_RAIL_CAN_T_REFIT_VEHICLE, STR_REFIT_ROAD_VEHICLE_CAN_T, STR_9841_CAN_T_REFIT_SHIP, STR_A042_CAN_T_REFIT_AIRCRAFT]
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
ERR_VEHICLE_IN_FLIGHT, // [STR_A017_AIRCRAFT_IS_IN_FLIGHT]
|
||||
|
||||
/** Vehicle is without power */
|
||||
ERR_VEHCILE_NO_POWER, // [STR_TRAIN_START_NO_CATENARY]
|
||||
ERR_VEHICLE_NO_POWER, // [STR_TRAIN_START_NO_CATENARY]
|
||||
|
||||
};
|
||||
|
||||
@@ -422,14 +422,25 @@ public:
|
||||
static bool SellWagonChain(VehicleID vehicle_id, int wagon);
|
||||
|
||||
/**
|
||||
* Sends the given vehicle to a depot.
|
||||
* Sends the given vehicle to a depot. If the vehicle has already been
|
||||
* sent to a depot it continues with its normal orders instead.
|
||||
* @param vehicle_id The vehicle to send to a depot.
|
||||
* @pre IsValidVehicle(vehicle_id).
|
||||
* @exception AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT
|
||||
* @return True if and only if the vehicle has been sent to a depot.
|
||||
* @return True if the current order was changed.
|
||||
*/
|
||||
static bool SendVehicleToDepot(VehicleID vehicle_id);
|
||||
|
||||
/**
|
||||
* Sends the given vehicle to a depot for servicing. If the vehicle has
|
||||
* already been sent to a depot it continues with its normal orders instead.
|
||||
* @param vehicle_id The vehicle to send to a depot for servicing.
|
||||
* @pre IsValidVehicle(vehicle_id).
|
||||
* @exception AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT
|
||||
* @return True if the current order was changed.
|
||||
*/
|
||||
static bool SendVehicleToDepotForServicing(VehicleID vehicle_id);
|
||||
|
||||
/**
|
||||
* Starts or stops the given vehicle depending on the current state.
|
||||
* @param vehicle_id The vehicle to start/stop.
|
||||
@@ -514,6 +525,14 @@ public:
|
||||
*/
|
||||
static bool HasSharedOrders(VehicleID vehicle_id);
|
||||
|
||||
/**
|
||||
* Get the current reliability of a vehicle.
|
||||
* @param vehicle_id The vehicle to check.
|
||||
* @pre IsValidVehicle(vehicle_id).
|
||||
* @return The current reliability (0-100%).
|
||||
*/
|
||||
static int GetReliability(VehicleID vehicle_id);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Internal function used by SellWagon(Chain).
|
||||
|
@@ -37,7 +37,7 @@ void SQAIVehicle_Register(Squirrel *engine) {
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_IS_DESTROYED, "ERR_VEHICLE_IS_DESTROYED");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT, "ERR_VEHICLE_NOT_IN_DEPOT");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_IN_FLIGHT, "ERR_VEHICLE_IN_FLIGHT");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHCILE_NO_POWER, "ERR_VEHCILE_NO_POWER");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_NO_POWER, "ERR_VEHICLE_NO_POWER");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::VT_RAIL, "VT_RAIL");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::VT_ROAD, "VT_ROAD");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::VT_WATER, "VT_WATER");
|
||||
@@ -52,38 +52,40 @@ void SQAIVehicle_Register(Squirrel *engine) {
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::VS_CRASHED, "VS_CRASHED");
|
||||
SQAIVehicle.DefSQConst(engine, AIVehicle::VS_INVALID, "VS_INVALID");
|
||||
|
||||
AIError::RegisterErrorMap(STR_00E1_TOO_MANY_VEHICLES_IN_GAME, AIVehicle::ERR_VEHICLE_TOO_MANY);
|
||||
AIError::RegisterErrorMap(STR_AIRCRAFT_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_ROAD_VEHICLE_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_SHIP_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_RAIL_VEHICLE_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_A008_CAN_T_BUILD_AIRCRAFT, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_980D_CAN_T_BUILD_SHIP, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_9009_CAN_T_BUILD_ROAD_VEHICLE, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_DEPOT_WRONG_DEPOT_TYPE, AIVehicle::ERR_VEHICLE_WRONG_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_9819_CAN_T_SEND_SHIP_TO_DEPOT, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_A012_CAN_T_SEND_AIRCRAFT_TO, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_883B_CAN_T_STOP_START_TRAIN, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_9015_CAN_T_STOP_START_ROAD_VEHICLE, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_9818_CAN_T_STOP_START_SHIP, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_A016_CAN_T_STOP_START_AIRCRAFT, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_8869_CAN_T_REVERSE_DIRECTION, AIVehicle::ERR_VEHICLE_CANNOT_TURN);
|
||||
AIError::RegisterErrorMap(STR_9033_CAN_T_MAKE_VEHICLE_TURN, AIVehicle::ERR_VEHICLE_CANNOT_TURN);
|
||||
AIError::RegisterErrorMap(STR_RAIL_CAN_T_REFIT_VEHICLE, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_REFIT_ROAD_VEHICLE_CAN_T, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_9841_CAN_T_REFIT_SHIP, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_A042_CAN_T_REFIT_AIRCRAFT, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_CAN_T_REFIT_DESTROYED_VEHICLE, AIVehicle::ERR_VEHICLE_IS_DESTROYED);
|
||||
AIError::RegisterErrorMap(STR_CAN_T_SELL_DESTROYED_VEHICLE, AIVehicle::ERR_VEHICLE_IS_DESTROYED);
|
||||
AIError::RegisterErrorMap(STR_A01B_AIRCRAFT_MUST_BE_STOPPED, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_9013_MUST_BE_STOPPED_INSIDE, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_TRAIN_MUST_BE_STOPPED, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_980B_SHIP_MUST_BE_STOPPED_IN, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_A017_AIRCRAFT_IS_IN_FLIGHT, AIVehicle::ERR_VEHICLE_IN_FLIGHT);
|
||||
AIError::RegisterErrorMap(STR_TRAIN_START_NO_CATENARY, AIVehicle::ERR_VEHCILE_NO_POWER);
|
||||
AIError::RegisterErrorMap(STR_00E1_TOO_MANY_VEHICLES_IN_GAME, AIVehicle::ERR_VEHICLE_TOO_MANY);
|
||||
AIError::RegisterErrorMap(STR_AIRCRAFT_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_ROAD_VEHICLE_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_SHIP_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_RAIL_VEHICLE_NOT_AVAILABLE, AIVehicle::ERR_VEHICLE_NOT_AVAILABLE);
|
||||
AIError::RegisterErrorMap(STR_A008_CAN_T_BUILD_AIRCRAFT, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_980D_CAN_T_BUILD_SHIP, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_9009_CAN_T_BUILD_ROAD_VEHICLE, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE, AIVehicle::ERR_VEHICLE_BUILD_DISABLED);
|
||||
AIError::RegisterErrorMap(STR_DEPOT_WRONG_DEPOT_TYPE, AIVehicle::ERR_VEHICLE_WRONG_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_9819_CAN_T_SEND_SHIP_TO_DEPOT, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_A012_CAN_T_SEND_AIRCRAFT_TO, AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_883B_CAN_T_STOP_START_TRAIN, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_9015_CAN_T_STOP_START_ROAD_VEHICLE, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_9818_CAN_T_STOP_START_SHIP, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_A016_CAN_T_STOP_START_AIRCRAFT, AIVehicle::ERR_VEHICLE_CANNOT_START_STOP);
|
||||
AIError::RegisterErrorMap(STR_ERROR_CAN_T_MAKE_ROAD_VEHICLE_TURN, AIVehicle::ERR_VEHICLE_CANNOT_TURN);
|
||||
AIError::RegisterErrorMap(STR_ERROR_CAN_T_REVERSE_DIRECTION_TRAIN, AIVehicle::ERR_VEHICLE_CANNOT_TURN);
|
||||
AIError::RegisterErrorMap(STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE, AIVehicle::ERR_VEHICLE_CANNOT_TURN);
|
||||
AIError::RegisterErrorMap(STR_ERROR_CAN_T_REVERSE_DIRECTION_RAIL_VEHICLE_MULTIPLE_UNITS, AIVehicle::ERR_VEHICLE_CANNOT_TURN);
|
||||
AIError::RegisterErrorMap(STR_RAIL_CAN_T_REFIT_VEHICLE, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_REFIT_ROAD_VEHICLE_CAN_T, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_9841_CAN_T_REFIT_SHIP, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_A042_CAN_T_REFIT_AIRCRAFT, AIVehicle::ERR_VEHICLE_CANNOT_REFIT);
|
||||
AIError::RegisterErrorMap(STR_CAN_T_REFIT_DESTROYED_VEHICLE, AIVehicle::ERR_VEHICLE_IS_DESTROYED);
|
||||
AIError::RegisterErrorMap(STR_CAN_T_SELL_DESTROYED_VEHICLE, AIVehicle::ERR_VEHICLE_IS_DESTROYED);
|
||||
AIError::RegisterErrorMap(STR_A01B_AIRCRAFT_MUST_BE_STOPPED, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_9013_MUST_BE_STOPPED_INSIDE, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_TRAIN_MUST_BE_STOPPED, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_980B_SHIP_MUST_BE_STOPPED_IN, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
|
||||
AIError::RegisterErrorMap(STR_A017_AIRCRAFT_IS_IN_FLIGHT, AIVehicle::ERR_VEHICLE_IN_FLIGHT);
|
||||
AIError::RegisterErrorMap(STR_TRAIN_START_NO_CATENARY, AIVehicle::ERR_VEHICLE_NO_POWER);
|
||||
|
||||
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_TOO_MANY, "ERR_VEHICLE_TOO_MANY");
|
||||
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NOT_AVAILABLE, "ERR_VEHICLE_NOT_AVAILABLE");
|
||||
@@ -96,49 +98,51 @@ void SQAIVehicle_Register(Squirrel *engine) {
|
||||
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_IS_DESTROYED, "ERR_VEHICLE_IS_DESTROYED");
|
||||
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT, "ERR_VEHICLE_NOT_IN_DEPOT");
|
||||
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_IN_FLIGHT, "ERR_VEHICLE_IN_FLIGHT");
|
||||
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHCILE_NO_POWER, "ERR_VEHCILE_NO_POWER");
|
||||
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NO_POWER, "ERR_VEHICLE_NO_POWER");
|
||||
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidVehicle, "IsValidVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetNumWagons, "GetNumWagons", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SetName, "SetName", 3, ".is");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetName, "GetName", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLocation, "GetLocation", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetEngineType, "GetEngineType", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonEngineType, "GetWagonEngineType", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetUnitNumber, "GetUnitNumber", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAge, "GetAge", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonAge, "GetWagonAge", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetMaxAge, "GetMaxAge", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAgeLeft, "GetAgeLeft", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentSpeed, "GetCurrentSpeed", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetState, "GetState", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRunningCost, "GetRunningCost", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitThisYear, "GetProfitThisYear", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitLastYear, "GetProfitLastYear", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentValue, "GetCurrentValue", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetVehicleType, "GetVehicleType", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRoadType, "GetRoadType", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsInDepot, "IsInDepot", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsStoppedInDepot, "IsStoppedInDepot", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::BuildVehicle, "BuildVehicle", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::CloneVehicle, "CloneVehicle", 4, ".iib");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagon, "MoveWagon", 5, ".iiii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagonChain, "MoveWagonChain", 5, ".iiii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRefitCapacity, "GetRefitCapacity", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::RefitVehicle, "RefitVehicle", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellVehicle, "SellVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagon, "SellWagon", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagonChain, "SellWagonChain", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SendVehicleToDepot, "SendVehicleToDepot", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::StartStopVehicle, "StartStopVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SkipToVehicleOrder, "SkipToVehicleOrder", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::ReverseVehicle, "ReverseVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCapacity, "GetCapacity", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLength, "GetLength", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCargoLoad, "GetCargoLoad", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetGroupID, "GetGroupID", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsArticulated, "IsArticulated", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::HasSharedOrders, "HasSharedOrders", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidVehicle, "IsValidVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetNumWagons, "GetNumWagons", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SetName, "SetName", 3, ".is");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetName, "GetName", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLocation, "GetLocation", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetEngineType, "GetEngineType", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonEngineType, "GetWagonEngineType", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetUnitNumber, "GetUnitNumber", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAge, "GetAge", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonAge, "GetWagonAge", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetMaxAge, "GetMaxAge", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAgeLeft, "GetAgeLeft", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentSpeed, "GetCurrentSpeed", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetState, "GetState", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRunningCost, "GetRunningCost", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitThisYear, "GetProfitThisYear", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitLastYear, "GetProfitLastYear", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentValue, "GetCurrentValue", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetVehicleType, "GetVehicleType", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRoadType, "GetRoadType", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsInDepot, "IsInDepot", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsStoppedInDepot, "IsStoppedInDepot", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::BuildVehicle, "BuildVehicle", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::CloneVehicle, "CloneVehicle", 4, ".iib");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagon, "MoveWagon", 5, ".iiii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagonChain, "MoveWagonChain", 5, ".iiii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRefitCapacity, "GetRefitCapacity", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::RefitVehicle, "RefitVehicle", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellVehicle, "SellVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagon, "SellWagon", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagonChain, "SellWagonChain", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SendVehicleToDepot, "SendVehicleToDepot", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SendVehicleToDepotForServicing, "SendVehicleToDepotForServicing", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::StartStopVehicle, "StartStopVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SkipToVehicleOrder, "SkipToVehicleOrder", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::ReverseVehicle, "ReverseVehicle", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCapacity, "GetCapacity", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLength, "GetLength", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCargoLoad, "GetCargoLoad", 3, ".ii");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetGroupID, "GetGroupID", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsArticulated, "IsArticulated", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::HasSharedOrders, "HasSharedOrders", 2, ".i");
|
||||
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetReliability, "GetReliability", 2, ".i");
|
||||
|
||||
SQAIVehicle.PostRegister(engine);
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ public:
|
||||
static const char *GetClassName() { return "AIVehicleList_SharedOrders"; }
|
||||
|
||||
/**
|
||||
* @param station_id The vehicle that the rest shared orders with.
|
||||
* @param vehicle_id The vehicle that the rest shared orders with.
|
||||
*/
|
||||
AIVehicleList_SharedOrders(VehicleID vehicle_id);
|
||||
};
|
||||
|
@@ -15,8 +15,11 @@ class AIWaypoint : public AIObject {
|
||||
public:
|
||||
static const char *GetClassName() { return "AIWaypoint"; }
|
||||
|
||||
/**
|
||||
* Special waypoint IDs signalling different kinds of waypoints.
|
||||
*/
|
||||
enum SpecialWaypointIDs {
|
||||
WAYPOINT_INVALID = -1, //!< An invalid WaypointID.
|
||||
WAYPOINT_INVALID = 0xFFFF, //!< An invalid WaypointID.
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -2,6 +2,15 @@
|
||||
|
||||
# $Id$
|
||||
|
||||
# We really need gawk for this!
|
||||
AWK=gawk
|
||||
|
||||
${AWK} --version > /dev/null 2> /dev/null
|
||||
if [ "$?" != "0" ]; then
|
||||
echo "This script needs gawk to run properly"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# This must be called from within the src/ai/api directory.
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
@@ -10,7 +19,7 @@ if [ -z "$1" ]; then
|
||||
# these files should not be changed by this script
|
||||
"ai_controller.hpp" | "ai_object.hpp" | "ai_types.hpp" ) continue;
|
||||
esac
|
||||
awk -f squirrel_export.awk ${f} > ${f}.tmp
|
||||
${AWK} -f squirrel_export.awk ${f} > ${f}.tmp
|
||||
if ! [ -f "${f}.sq" ] || [ -n "`diff -I '$Id' -b ${f}.tmp ${f}.sq 2> /dev/null || echo boo`" ]; then
|
||||
mv ${f}.tmp ${f}.sq
|
||||
echo "Updated: ${f}.sq"
|
||||
@@ -22,7 +31,7 @@ if [ -z "$1" ]; then
|
||||
fi
|
||||
done
|
||||
else
|
||||
awk -f squirrel_export.awk $1 > $1.tmp
|
||||
${AWK} -f squirrel_export.awk $1 > $1.tmp
|
||||
if ! [ -f "${f}.sq" ] || [ -n "`diff -I '$Id' -b $1.sq $1.tmp 2> /dev/null || echo boo`" ]; then
|
||||
mv $1.tmp $1.sq
|
||||
echo "Updated: $1.sq"
|
||||
@@ -84,7 +93,7 @@ echo "
|
||||
{ print \$0; }
|
||||
" > ${f}.awk
|
||||
|
||||
awk -f ${f}.awk ${f} > ${f}.tmp
|
||||
${AWK} -f ${f}.awk ${f} > ${f}.tmp
|
||||
|
||||
if ! [ -f "${f}" ] || [ -n "`diff -I '$Id' -b ${f} ${f}.tmp 2> /dev/null || echo boo`" ]; then
|
||||
mv ${f}.tmp ${f}
|
||||
|
@@ -337,24 +337,6 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
|
||||
u->subtype = AIR_SHADOW;
|
||||
u->UpdateDeltaXY(INVALID_DIR);
|
||||
|
||||
if (v->cargo_type != CT_PASSENGERS) {
|
||||
uint16 callback = CALLBACK_FAILED;
|
||||
|
||||
if (HasBit(EngInfo(p1)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
|
||||
callback = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, v->engine_type, v);
|
||||
}
|
||||
|
||||
if (callback == CALLBACK_FAILED) {
|
||||
/* Callback failed, or not executed; use the default cargo capacity */
|
||||
v->cargo_cap = AircraftDefaultCargoCapacity(v->cargo_type, avi);
|
||||
} else {
|
||||
v->cargo_cap = callback;
|
||||
}
|
||||
|
||||
/* Set the 'second compartent' capacity to none */
|
||||
u->cargo_cap = 0;
|
||||
}
|
||||
|
||||
v->reliability = e->reliability;
|
||||
v->reliability_spd_dec = e->reliability_spd_dec;
|
||||
v->max_age = e->lifelength * DAYS_IN_LEAP_YEAR;
|
||||
@@ -395,10 +377,32 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
|
||||
v->vehicle_flags = 0;
|
||||
if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SetBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
|
||||
|
||||
v->InvalidateNewGRFCacheOfChain();
|
||||
|
||||
if (v->cargo_type != CT_PASSENGERS) {
|
||||
uint16 callback = CALLBACK_FAILED;
|
||||
|
||||
if (HasBit(EngInfo(p1)->callbackmask, CBM_VEHICLE_REFIT_CAPACITY)) {
|
||||
callback = GetVehicleCallback(CBID_VEHICLE_REFIT_CAPACITY, 0, 0, v->engine_type, v);
|
||||
}
|
||||
|
||||
if (callback == CALLBACK_FAILED) {
|
||||
/* Callback failed, or not executed; use the default cargo capacity */
|
||||
v->cargo_cap = AircraftDefaultCargoCapacity(v->cargo_type, avi);
|
||||
} else {
|
||||
v->cargo_cap = callback;
|
||||
}
|
||||
|
||||
/* Set the 'second compartent' capacity to none */
|
||||
u->cargo_cap = 0;
|
||||
}
|
||||
|
||||
v->InvalidateNewGRFCacheOfChain();
|
||||
|
||||
UpdateAircraftCache(v);
|
||||
|
||||
VehiclePositionChanged(v);
|
||||
VehiclePositionChanged(u);
|
||||
VehicleMove(v, false);
|
||||
VehicleMove(u, false);
|
||||
|
||||
/* Aircraft with 3 vehicles (chopper)? */
|
||||
if (v->subtype == AIR_HELICOPTER) {
|
||||
@@ -421,14 +425,14 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
|
||||
w->UpdateDeltaXY(INVALID_DIR);
|
||||
|
||||
u->SetNext(w);
|
||||
VehiclePositionChanged(w);
|
||||
VehicleMove(w, false);
|
||||
}
|
||||
|
||||
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
|
||||
InvalidateWindowClassesData(WC_AIRCRAFT_LIST, 0);
|
||||
InvalidateWindow(WC_COMPANY, v->owner);
|
||||
if (IsLocalCompany())
|
||||
InvalidateAutoreplaceWindow(v->engine_type, v->group_id); //updates the replace Aircraft window
|
||||
InvalidateAutoreplaceWindow(v->engine_type, v->group_id); // updates the replace Aircraft window
|
||||
|
||||
GetCompany(_current_company)->num_engines[p1]++;
|
||||
}
|
||||
@@ -580,6 +584,7 @@ CommandCost CmdRefitAircraft(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
|
||||
v->cargo_type = new_cid;
|
||||
v->cargo_subtype = new_subtype;
|
||||
v->colourmap = PAL_NONE; // invalidate vehicle colour map
|
||||
v->InvalidateNewGRFCacheOfChain();
|
||||
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
|
||||
InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
|
||||
InvalidateWindowClassesData(WC_AIRCRAFT_LIST, 0);
|
||||
@@ -692,9 +697,7 @@ static void HelicopterTickHandler(Vehicle *v)
|
||||
|
||||
u->cur_image = img;
|
||||
|
||||
BeginVehicleMove(u);
|
||||
VehiclePositionChanged(u);
|
||||
EndVehicleMove(u);
|
||||
VehicleMove(u, true);
|
||||
}
|
||||
|
||||
void SetAircraftPosition(Vehicle *v, int x, int y, int z)
|
||||
@@ -706,9 +709,7 @@ void SetAircraftPosition(Vehicle *v, int x, int y, int z)
|
||||
v->cur_image = v->GetImage(v->direction);
|
||||
if (v->subtype == AIR_HELICOPTER) v->Next()->Next()->cur_image = GetRotorImage(v);
|
||||
|
||||
BeginVehicleMove(v);
|
||||
VehiclePositionChanged(v);
|
||||
EndVehicleMove(v);
|
||||
VehicleMove(v, true);
|
||||
|
||||
Vehicle *u = v->Next();
|
||||
|
||||
@@ -721,9 +722,7 @@ void SetAircraftPosition(Vehicle *v, int x, int y, int z)
|
||||
u->z_pos = GetSlopeZ(safe_x, safe_y);
|
||||
u->cur_image = v->cur_image;
|
||||
|
||||
BeginVehicleMove(u);
|
||||
VehiclePositionChanged(u);
|
||||
EndVehicleMove(u);
|
||||
VehicleMove(u, true);
|
||||
|
||||
u = u->Next();
|
||||
if (u != NULL) {
|
||||
@@ -731,9 +730,7 @@ void SetAircraftPosition(Vehicle *v, int x, int y, int z)
|
||||
u->y_pos = y;
|
||||
u->z_pos = z + 5;
|
||||
|
||||
BeginVehicleMove(u);
|
||||
VehiclePositionChanged(u);
|
||||
EndVehicleMove(u);
|
||||
VehicleMove(u, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1156,7 +1153,7 @@ static bool AircraftController(Vehicle *v)
|
||||
|
||||
static void HandleCrashedAircraft(Vehicle *v)
|
||||
{
|
||||
v->u.air.crashed_counter++;
|
||||
v->u.air.crashed_counter += 3;
|
||||
|
||||
Station *st = GetTargetAirportIfValid(v);
|
||||
|
||||
@@ -1630,9 +1627,9 @@ static void AircraftEventHandler_Flying(Vehicle *v, const AirportFTAClass *apc)
|
||||
if (apc->flags & (v->subtype == AIR_HELICOPTER ? AirportFTAClass::HELICOPTERS : AirportFTAClass::AIRPLANES) &&
|
||||
st->airport_tile != INVALID_TILE &&
|
||||
(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
|
||||
/* {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 */
|
||||
byte landingtype = (v->subtype == AIR_HELICOPTER) ? HELILANDING : LANDING;
|
||||
const AirportFTA *current = apc->layout[v->u.air.pos].next;
|
||||
while (current != NULL) {
|
||||
|
@@ -15,12 +15,12 @@
|
||||
#include "table/strings.h"
|
||||
|
||||
/**
|
||||
* Draw the details for the given vehicle at the position (x,y)
|
||||
*
|
||||
* @param v current vehicle
|
||||
* @param x The x coordinate
|
||||
* @param y The y coordinate
|
||||
*/
|
||||
* Draw the details for the given vehicle at the position (x, y)
|
||||
*
|
||||
* @param v current vehicle
|
||||
* @param x The x coordinate
|
||||
* @param y The y coordinate
|
||||
*/
|
||||
void DrawAircraftDetails(const Vehicle *v, int x, int y)
|
||||
{
|
||||
int y_offset = (v->Next()->cargo_cap != 0) ? -11 : 0;
|
||||
|
@@ -69,8 +69,8 @@ enum {
|
||||
HELIPAD4 = 22
|
||||
};
|
||||
|
||||
/* Movement Blocks on Airports */
|
||||
/* blocks (eg_airport_flags) */
|
||||
/* Movement Blocks on Airports
|
||||
* blocks (eg_airport_flags) */
|
||||
static const uint64
|
||||
TERM1_block = 1ULL << 0,
|
||||
TERM2_block = 1ULL << 1,
|
||||
|
@@ -138,12 +138,12 @@ static const Widget _air_toolbar_widgets[] = {
|
||||
};
|
||||
|
||||
|
||||
static const WindowDesc _air_toolbar_desc = {
|
||||
static const WindowDesc _air_toolbar_desc(
|
||||
WDP_ALIGN_TBR, 22, 64, 36, 64, 36,
|
||||
WC_BUILD_TOOLBAR, WC_NONE,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_CONSTRUCTION,
|
||||
_air_toolbar_widgets,
|
||||
};
|
||||
_air_toolbar_widgets
|
||||
);
|
||||
|
||||
void ShowBuildAirToolbar()
|
||||
{
|
||||
@@ -299,12 +299,12 @@ static const Widget _build_airport_picker_widgets[] = {
|
||||
{ WIDGETS_END},
|
||||
};
|
||||
|
||||
static const WindowDesc _build_airport_desc = {
|
||||
static const WindowDesc _build_airport_desc(
|
||||
WDP_AUTO, WDP_AUTO, 148, 240, 148, 240,
|
||||
WC_BUILD_STATION, WC_BUILD_TOOLBAR,
|
||||
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_CONSTRUCTION,
|
||||
_build_airport_picker_widgets,
|
||||
};
|
||||
_build_airport_picker_widgets
|
||||
);
|
||||
|
||||
static void ShowBuildAirportPicker(Window *parent)
|
||||
{
|
||||
|
@@ -6,8 +6,8 @@
|
||||
#define AIRPORT_MOVEMENT_H
|
||||
|
||||
|
||||
// state machine input struct (from external file, etc.)
|
||||
// Finite sTate mAchine --> FTA
|
||||
/* state machine input struct (from external file, etc.)
|
||||
* Finite sTate mAchine --> FTA */
|
||||
struct AirportFTAbuildup {
|
||||
byte position; // the position that an airplane is at
|
||||
byte heading; // the current orders (eg. TAKEOFF, HANGAR, ENDLANDING, etc.)
|
||||
@@ -25,7 +25,7 @@ static const AirportMovingData _airport_moving_data_dummy[] = {
|
||||
{ 96, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} },
|
||||
};
|
||||
|
||||
// Country Airfield (small) 4x3
|
||||
/* Country Airfield (small) 4x3 */
|
||||
static const AirportMovingData _airport_moving_data_country[22] = {
|
||||
{ 53, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
|
||||
{ 53, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
|
||||
@@ -51,7 +51,7 @@ static const AirportMovingData _airport_moving_data_country[22] = {
|
||||
{ 44, 40, AMED_HELI_LOWER, {DIR_N} }, // 21 Helicopter landing
|
||||
};
|
||||
|
||||
// Commuter Airfield (small) 5x4
|
||||
/* Commuter Airfield (small) 5x4 */
|
||||
static const AirportMovingData _airport_moving_data_commuter[37] = {
|
||||
{ 69, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
|
||||
{ 72, 22, 0, {DIR_N} }, // 01 Taxi to right outside depot
|
||||
@@ -78,7 +78,7 @@ static const AirportMovingData _airport_moving_data_commuter[37] = {
|
||||
{ 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 22 Fly around waiting for a landing spot (north-west)
|
||||
{ 193, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 23 Fly around waiting for a landing spot (south-west)
|
||||
{ 225, 81, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 24 Fly around waiting for a landing spot (south)
|
||||
// Helicopter
|
||||
/* Helicopter */
|
||||
{ 80, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 25 Bufferspace before helipad
|
||||
{ 80, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 26 Bufferspace before helipad
|
||||
{ 32, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 27 Get in position for Helipad1
|
||||
@@ -93,7 +93,7 @@ static const AirportMovingData _airport_moving_data_commuter[37] = {
|
||||
{ 56, 8, AMED_EXACTPOS, {DIR_N} }, // pre-helitakeoff helipad 2
|
||||
};
|
||||
|
||||
// City Airport (large) 6x6
|
||||
/* City Airport (large) 6x6 */
|
||||
static const AirportMovingData _airport_moving_data_town[] = {
|
||||
{ 85, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
|
||||
{ 85, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
|
||||
@@ -111,7 +111,7 @@ static const AirportMovingData _airport_moving_data_town[] = {
|
||||
{ 177, 87, AMED_HOLD | AMED_SLOWTURN, {DIR_N} }, // 13 Fly to landing position in air
|
||||
{ 89, 87, AMED_HOLD | AMED_LAND, {DIR_N} }, // 14 Going down for land
|
||||
{ 20, 87, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 15 Just landed, brake until end of runway
|
||||
{ 20, 87, 0, {DIR_N} }, // 16 Just landed, turn around and taxi 1 square /* NOT USED */
|
||||
{ 20, 87, 0, {DIR_N} }, // 16 Just landed, turn around and taxi 1 square // NOT USED
|
||||
{ 36, 71, 0, {DIR_N} }, // 17 Taxi from runway to crossing
|
||||
{ 160, 87, AMED_HOLD | AMED_SLOWTURN, {DIR_N} }, // 18 Fly around waiting for a landing spot (north-east)
|
||||
{ 140, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 19 Final approach fix
|
||||
@@ -127,7 +127,7 @@ static const AirportMovingData _airport_moving_data_town[] = {
|
||||
{ -32, 120, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 29 Initial approach fix (east)
|
||||
};
|
||||
|
||||
// Metropolitan Airport (metropolitan) - 2 runways
|
||||
/* Metropolitan Airport (metropolitan) - 2 runways */
|
||||
static const AirportMovingData _airport_moving_data_metropolitan[27] = {
|
||||
{ 85, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
|
||||
{ 85, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
|
||||
@@ -158,7 +158,7 @@ static const AirportMovingData _airport_moving_data_metropolitan[27] = {
|
||||
{ 15, 54, AMED_HELI_LOWER, {DIR_N} }, // 26 Helicopter landing
|
||||
};
|
||||
|
||||
// International Airport (international) - 2 runways, 6 terminals, dedicated helipod
|
||||
/* International Airport (international) - 2 runways, 6 terminals, dedicated helipod */
|
||||
static const AirportMovingData _airport_moving_data_international[51] = {
|
||||
{ 7, 55, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar 1
|
||||
{ 100, 21, AMED_EXACTPOS, {DIR_SE} }, // 01 In Hangar 2
|
||||
@@ -201,7 +201,7 @@ static const AirportMovingData _airport_moving_data_international[51] = {
|
||||
{ 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 38 Fly around waiting for a landing spot (north-west)
|
||||
{ 273, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 39 Fly around waiting for a landing spot (south-west)
|
||||
{ 305, 81, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 40 Fly around waiting for a landing spot (south)
|
||||
// Helicopter
|
||||
/* Helicopter */
|
||||
{ 128, 80, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 41 Bufferspace before helipad
|
||||
{ 128, 80, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 42 Bufferspace before helipad
|
||||
{ 96, 71, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 43 Get in position for Helipad1
|
||||
@@ -214,7 +214,7 @@ static const AirportMovingData _airport_moving_data_international[51] = {
|
||||
{ 104, 32, AMED_HELI_LOWER, {DIR_N} }, // 50 Land in HANGAR2_AREA to go to hangar
|
||||
};
|
||||
|
||||
// Intercontinental Airport - 4 runways, 8 terminals, 2 dedicated helipads
|
||||
/* Intercontinental Airport - 4 runways, 8 terminals, 2 dedicated helipads */
|
||||
static const AirportMovingData _airport_moving_data_intercontinental[77] = {
|
||||
{ 7, 87, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar 1
|
||||
{ 135, 72, AMED_EXACTPOS, {DIR_SE} }, // 01 In Hangar 2
|
||||
@@ -263,7 +263,7 @@ static const AirportMovingData _airport_moving_data_intercontinental[77] = {
|
||||
{ -200, 88, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 44 Fly around waiting for a landing spot (north-west)
|
||||
{ 56, -168, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 45 Fly around waiting for a landing spot (south-west)
|
||||
{ 312, 88, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 46 Fly around waiting for a landing spot (south)
|
||||
// Helicopter
|
||||
/* Helicopter */
|
||||
{ 96, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 47 Bufferspace before helipad
|
||||
{ 96, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 48 Bufferspace before helipad
|
||||
{ 82, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 49 Get in position for Helipad1
|
||||
@@ -297,7 +297,7 @@ static const AirportMovingData _airport_moving_data_intercontinental[77] = {
|
||||
};
|
||||
|
||||
|
||||
// Heliport (heliport)
|
||||
/* Heliport (heliport) */
|
||||
static const AirportMovingData _airport_moving_data_heliport[9] = {
|
||||
{ 5, 9, AMED_EXACTPOS, {DIR_NE} }, // 0 - At heliport terminal
|
||||
{ 2, 9, AMED_HELI_RAISE, {DIR_N} }, // 1 - Take off (play sound)
|
||||
@@ -310,7 +310,7 @@ static const AirportMovingData _airport_moving_data_heliport[9] = {
|
||||
{ 70, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 8 - Circle #4 (south)
|
||||
};
|
||||
|
||||
// HeliDepot 2x2 (heliport)
|
||||
/* HeliDepot 2x2 (heliport) */
|
||||
static const AirportMovingData _airport_moving_data_helidepot[18] = {
|
||||
{ 24, 4, AMED_EXACTPOS, {DIR_NE} }, // 0 - At depot
|
||||
{ 24, 28, 0, {DIR_N} }, // 1 Taxi to right outside depot
|
||||
@@ -332,7 +332,7 @@ static const AirportMovingData _airport_moving_data_helidepot[18] = {
|
||||
{ 8, 24, AMED_SLOWTURN | AMED_EXACTPOS, {DIR_E} }, // 17 - turn on helipad1 for takeoff
|
||||
};
|
||||
|
||||
// HeliDepot 2x2 (heliport)
|
||||
/* HeliDepot 2x2 (heliport) */
|
||||
static const AirportMovingData _airport_moving_data_helistation[33] = {
|
||||
{ 8, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar2
|
||||
{ 8, 22, 0, {DIR_N} }, // 01 outside hangar 2
|
||||
@@ -369,7 +369,7 @@ static const AirportMovingData _airport_moving_data_helistation[33] = {
|
||||
{ 132, -24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 32 Fly around waiting for a landing spot (north-east)
|
||||
};
|
||||
|
||||
// Oilrig
|
||||
/* Oilrig */
|
||||
static const AirportMovingData _airport_moving_data_oilrig[9] = {
|
||||
{ 31, 9, AMED_EXACTPOS, {DIR_NE} }, // 0 - At oilrig terminal
|
||||
{ 28, 9, AMED_HELI_RAISE, {DIR_N} }, // 1 - Take off (play sound)
|
||||
@@ -406,17 +406,17 @@ static const AirportFTAbuildup _airport_fta_country[] = {
|
||||
{ 4, 255, AIRPORT_BUSY_block, 0 }, { 4, TERM2, 0, 5 }, { 4, HANGAR, 0, 1 }, { 4, TAKEOFF, 0, 6 }, { 4, HELITAKEOFF, 0, 1 },
|
||||
{ 5, 255, AIRPORT_BUSY_block, 0 }, { 5, TERM2, TERM2_block, 3 }, { 5, 0, 0, 4 },
|
||||
{ 6, 0, AIRPORT_BUSY_block, 7 },
|
||||
// takeoff
|
||||
/* takeoff */
|
||||
{ 7, TAKEOFF, AIRPORT_BUSY_block, 8 },
|
||||
{ 8, STARTTAKEOFF, NOTHING_block, 9 },
|
||||
{ 9, ENDTAKEOFF, NOTHING_block, 0 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 10, FLYING, NOTHING_block, 15 }, { 10, LANDING, 0, 11 }, { 10, HELILANDING, 0, 20 },
|
||||
{ 11, LANDING, AIRPORT_BUSY_block, 12 },
|
||||
{ 12, 0, AIRPORT_BUSY_block, 13 },
|
||||
{ 13, ENDLANDING, AIRPORT_BUSY_block, 14 }, { 13, TERM2, 0, 5 }, { 13, 0, 0, 14 },
|
||||
{ 14, 0, AIRPORT_BUSY_block, 1 },
|
||||
// In air
|
||||
/* In air */
|
||||
{ 15, 0, NOTHING_block, 16 },
|
||||
{ 16, 0, NOTHING_block, 17 },
|
||||
{ 17, 0, NOTHING_block, 18 },
|
||||
@@ -444,31 +444,31 @@ static const AirportFTAbuildup _airport_fta_commuter[] = {
|
||||
{ 9, 255, TAXIWAY_BUSY_block, 9 }, { 9, TAKEOFF, TAXIWAY_BUSY_block, 10 }, { 9, HANGAR, TAXIWAY_BUSY_block, 10 }, { 9, TERM2, TERM2_block, 4 }, { 9, HELIPAD1, HELIPAD1_block, 6 }, { 9, HELITAKEOFF, HELIPAD1_block, 6 }, { 9, TERM1, TAXIWAY_BUSY_block, 8 }, { 9, 0, TAXIWAY_BUSY_block, 10 },
|
||||
{ 10, 255, TAXIWAY_BUSY_block, 10 }, { 10, TERM3, TERM3_block, 5 }, { 10, HELIPAD1, 0, 9 }, { 10, HELIPAD2, HELIPAD2_block, 7 }, { 10, HELITAKEOFF, HELIPAD2_block, 7 }, { 10, TAKEOFF, TAXIWAY_BUSY_block, 1 }, { 10, HANGAR, TAXIWAY_BUSY_block, 1 }, { 10, 0, TAXIWAY_BUSY_block, 9 },
|
||||
{ 11, 0, OUT_WAY_block, 12 },
|
||||
// takeoff
|
||||
/* takeoff */
|
||||
{ 12, TAKEOFF, RUNWAY_IN_OUT_block, 13 },
|
||||
{ 13, 0, RUNWAY_IN_OUT_block, 14 },
|
||||
{ 14, STARTTAKEOFF, RUNWAY_IN_OUT_block, 15 },
|
||||
{ 15, ENDTAKEOFF, NOTHING_block, 0 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 16, FLYING, NOTHING_block, 21 }, { 16, LANDING, IN_WAY_block, 17 }, { 16, HELILANDING, 0, 25 },
|
||||
{ 17, LANDING, RUNWAY_IN_OUT_block, 18 },
|
||||
{ 18, 0, RUNWAY_IN_OUT_block, 19 },
|
||||
{ 19, 0, RUNWAY_IN_OUT_block, 20 },
|
||||
{ 20, ENDLANDING, IN_WAY_block, 2 },
|
||||
// In Air
|
||||
/* In Air */
|
||||
{ 21, 0, NOTHING_block, 22 },
|
||||
{ 22, 0, NOTHING_block, 23 },
|
||||
{ 23, 0, NOTHING_block, 24 },
|
||||
{ 24, 0, NOTHING_block, 16 },
|
||||
// Helicopter -- stay in air in special place as a buffer to choose from helipads
|
||||
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
|
||||
{ 25, HELILANDING, PRE_HELIPAD_block, 26 },
|
||||
{ 26, HELIENDLANDING, PRE_HELIPAD_block, 26 }, { 26, HELIPAD1, 0, 27 }, { 26, HELIPAD2, 0, 28 }, { 26, HANGAR, 0, 33 },
|
||||
{ 27, 0, NOTHING_block, 29 }, //helipad1 approach
|
||||
{ 27, 0, NOTHING_block, 29 }, // helipad1 approach
|
||||
{ 28, 0, NOTHING_block, 30 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 29, 255, NOTHING_block, 0 }, { 29, HELIPAD1, HELIPAD1_block, 6 },
|
||||
{ 30, 255, NOTHING_block, 0 }, { 30, HELIPAD2, HELIPAD2_block, 7 },
|
||||
// Helicopter -- takeoff
|
||||
/* Helicopter -- takeoff */
|
||||
{ 31, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 32, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 33, 0, TAXIWAY_BUSY_block, 34 }, // need to go to hangar when waiting in air
|
||||
@@ -492,22 +492,22 @@ static const AirportFTAbuildup _airport_fta_city[] = {
|
||||
{ 7, 255, TAXIWAY_BUSY_block, 0 }, { 7, TERM1, TERM1_block, 2 }, { 7, TAKEOFF, OUT_WAY_block, 8 }, { 7, HELITAKEOFF, 0, 22 }, { 7, HANGAR, 0, 1 }, { 7, 0, 0, 6 },
|
||||
{ 8, 0, OUT_WAY_block, 9 },
|
||||
{ 9, 0, RUNWAY_IN_OUT_block, 10 },
|
||||
// takeoff
|
||||
/* takeoff */
|
||||
{ 10, TAKEOFF, RUNWAY_IN_OUT_block, 11 },
|
||||
{ 11, STARTTAKEOFF, NOTHING_block, 12 },
|
||||
{ 12, ENDTAKEOFF, NOTHING_block, 0 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 13, FLYING, NOTHING_block, 18 }, { 13, LANDING, 0, 14 }, { 13, HELILANDING, 0, 23 },
|
||||
{ 14, LANDING, RUNWAY_IN_OUT_block, 15 },
|
||||
{ 15, 0, RUNWAY_IN_OUT_block, 17 },
|
||||
{ 16, 0, RUNWAY_IN_OUT_block, 17 }, /* not used, left for compatibility */
|
||||
{ 16, 0, RUNWAY_IN_OUT_block, 17 }, // not used, left for compatibility
|
||||
{ 17, ENDLANDING, IN_WAY_block, 7 },
|
||||
// In Air
|
||||
/* In Air */
|
||||
{ 18, 0, NOTHING_block, 25 },
|
||||
{ 19, 0, NOTHING_block, 20 },
|
||||
{ 20, 0, NOTHING_block, 21 },
|
||||
{ 21, 0, NOTHING_block, 13 },
|
||||
// helicopter
|
||||
/* helicopter */
|
||||
{ 22, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 23, HELILANDING, IN_WAY_block, 24 },
|
||||
{ 24, HELIENDLANDING, IN_WAY_block, 17 },
|
||||
@@ -533,23 +533,23 @@ static const AirportFTAbuildup _airport_fta_metropolitan[] = {
|
||||
{ 7, 255, TAXIWAY_BUSY_block, 0 }, { 7, TERM1, TERM1_block, 2 }, { 7, TAKEOFF, 0, 8 }, { 7, HELITAKEOFF, 0, 23 }, { 7, HANGAR, 0, 1 }, { 7, 0, 0, 6 },
|
||||
{ 8, 0, OUT_WAY_block, 9 },
|
||||
{ 9, 0, RUNWAY_OUT_block, 10 },
|
||||
// takeoff
|
||||
/* takeoff */
|
||||
{ 10, TAKEOFF, RUNWAY_OUT_block, 11 },
|
||||
{ 11, STARTTAKEOFF, NOTHING_block, 12 },
|
||||
{ 12, ENDTAKEOFF, NOTHING_block, 0 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 13, FLYING, NOTHING_block, 19 }, { 13, LANDING, 0, 14 }, { 13, HELILANDING, 0, 25 },
|
||||
{ 14, LANDING, RUNWAY_IN_block, 15 },
|
||||
{ 15, 0, RUNWAY_IN_block, 16 },
|
||||
{ 16, 255, RUNWAY_IN_block, 0 }, { 16, ENDLANDING, IN_WAY_block, 17 },
|
||||
{ 17, 255, RUNWAY_OUT_block, 0 }, { 17, ENDLANDING, IN_WAY_block, 18 },
|
||||
{ 18, ENDLANDING, IN_WAY_block, 7 },
|
||||
// In Air
|
||||
/* In Air */
|
||||
{ 19, 0, NOTHING_block, 20 },
|
||||
{ 20, 0, NOTHING_block, 21 },
|
||||
{ 21, 0, NOTHING_block, 22 },
|
||||
{ 22, 0, NOTHING_block, 13 },
|
||||
// helicopter
|
||||
/* helicopter */
|
||||
{ 23, 0, NOTHING_block, 24 },
|
||||
{ 24, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 25, HELILANDING, IN_WAY_block, 26 },
|
||||
@@ -590,31 +590,31 @@ static const AirportFTAbuildup _airport_fta_international[] = {
|
||||
{ 25, 255, TERM_GROUP1_block, 0 }, { 25, TERM3, TERM3_block, 6 }, { 25, TAKEOFF, 0, 26 }, { 25, 0, 0, 24 },
|
||||
{ 26, 255, TAXIWAY_BUSY_block, 0 }, { 26, TAKEOFF, 0, 27 }, { 26, 0, 0, 25 },
|
||||
{ 27, 0, OUT_WAY_block, 28 },
|
||||
// takeoff
|
||||
/* takeoff */
|
||||
{ 28, TAKEOFF, OUT_WAY_block, 29 },
|
||||
{ 29, 0, RUNWAY_OUT_block, 30 },
|
||||
{ 30, STARTTAKEOFF, NOTHING_block, 31 },
|
||||
{ 31, ENDTAKEOFF, NOTHING_block, 0 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 32, FLYING, NOTHING_block, 37 }, { 32, LANDING, 0, 33 }, { 32, HELILANDING, 0, 41 },
|
||||
{ 33, LANDING, RUNWAY_IN_block, 34 },
|
||||
{ 34, 0, RUNWAY_IN_block, 35 },
|
||||
{ 35, 0, RUNWAY_IN_block, 36 },
|
||||
{ 36, ENDLANDING, IN_WAY_block, 36 }, { 36, 255, TERM_GROUP1_block, 0 }, { 36, 255, TERM_GROUP2_ENTER1_block, 1 }, { 36, TERM4, 0, 12 }, { 36, TERM5, 0, 12 }, { 36, TERM6, 0, 12 }, { 36, 0, 0, 2 },
|
||||
// In Air
|
||||
/* In Air */
|
||||
{ 37, 0, NOTHING_block, 38 },
|
||||
{ 38, 0, NOTHING_block, 39 },
|
||||
{ 39, 0, NOTHING_block, 40 },
|
||||
{ 40, 0, NOTHING_block, 32 },
|
||||
// Helicopter -- stay in air in special place as a buffer to choose from helipads
|
||||
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
|
||||
{ 41, HELILANDING, PRE_HELIPAD_block, 42 },
|
||||
{ 42, HELIENDLANDING, PRE_HELIPAD_block, 42 }, { 42, HELIPAD1, 0, 43 }, { 42, HELIPAD2, 0, 44 }, { 42, HANGAR, 0, 49 },
|
||||
{ 43, 0, NOTHING_block, 45 },
|
||||
{ 44, 0, NOTHING_block, 46 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 45, 255, NOTHING_block, 0 }, { 45, HELIPAD1, HELIPAD1_block, 10 },
|
||||
{ 46, 255, NOTHING_block, 0 }, { 46, HELIPAD2, HELIPAD2_block, 11 },
|
||||
// Helicopter -- takeoff
|
||||
/* Helicopter -- takeoff */
|
||||
{ 47, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 48, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 49, 0, HANGAR2_AREA_block, 50 }, // need to go to hangar when waiting in air
|
||||
@@ -622,7 +622,7 @@ static const AirportFTAbuildup _airport_fta_international[] = {
|
||||
{ MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE
|
||||
};
|
||||
|
||||
// intercontinental
|
||||
/* intercontinental */
|
||||
static const TileIndexDiffC _airport_depots_intercontinental[] = { { 0, 5 }, { 8, 4 } };
|
||||
static const byte _airport_terminal_intercontinental[] = { 2, 4, 4 };
|
||||
static const byte _airport_helipad_intercontinental[] = { 1, 2 };
|
||||
@@ -660,12 +660,12 @@ static const AirportFTAbuildup _airport_fta_intercontinental[] = {
|
||||
{ 29, 255, TERM_GROUP1_block, 0 }, { 29, TERM4, TERM4_block, 7 }, { 29, HANGAR, HANGAR1_AREA_block, 27 }, { 29, TAKEOFF, 0, 30 }, { 29, 0, 0, 28 },
|
||||
{ 30, 0, OUT_WAY_block2, 31 },
|
||||
{ 31, 0, OUT_WAY_block, 32 },
|
||||
// takeoff
|
||||
/* takeoff */
|
||||
{ 32, TAKEOFF, RUNWAY_OUT_block, 33 },
|
||||
{ 33, 0, RUNWAY_OUT_block, 34 },
|
||||
{ 34, STARTTAKEOFF, NOTHING_block, 35 },
|
||||
{ 35, ENDTAKEOFF, NOTHING_block, 0 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 36, 0, 0, 0 },
|
||||
{ 37, LANDING, RUNWAY_IN_block, 38 },
|
||||
{ 38, 0, RUNWAY_IN_block, 39 },
|
||||
@@ -673,32 +673,32 @@ static const AirportFTAbuildup _airport_fta_intercontinental[] = {
|
||||
{ 40, ENDLANDING, RUNWAY_IN_block, 41 },
|
||||
{ 41, 0, IN_WAY_block, 42 },
|
||||
{ 42, 255, IN_WAY_block, 0 }, { 42, 255, TERM_GROUP1_block, 0 }, { 42, 255, TERM_GROUP1_block, 1 }, { 42, HANGAR, 0, 2 }, { 42, 0, 0, 26 },
|
||||
// In Air
|
||||
/* In Air */
|
||||
{ 43, 0, 0, 44 },
|
||||
{ 44, FLYING, 0, 45 }, { 44, HELILANDING, 0, 47 }, { 44, LANDING, 0, 69 }, { 44, 0, 0, 45 },
|
||||
{ 45, 0, 0, 46 },
|
||||
{ 46, FLYING, 0, 43 }, { 46, LANDING, 0, 76 }, { 46, 0, 0, 43 },
|
||||
// Helicopter -- stay in air in special place as a buffer to choose from helipads
|
||||
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
|
||||
{ 47, HELILANDING, PRE_HELIPAD_block, 48 },
|
||||
{ 48, HELIENDLANDING, PRE_HELIPAD_block, 48 }, { 48, HELIPAD1, 0, 49 }, { 48, HELIPAD2, 0, 50 }, { 48, HANGAR, 0, 55 },
|
||||
{ 49, 0, NOTHING_block, 51 },
|
||||
{ 50, 0, NOTHING_block, 52 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 51, 255, NOTHING_block, 0 }, { 51, HELIPAD1, HELIPAD1_block, 12 }, { 51, HANGAR, 0, 55 }, { 51, 0, 0, 12 },
|
||||
{ 52, 255, NOTHING_block, 0 }, { 52, HELIPAD2, HELIPAD2_block, 13 }, { 52, HANGAR, 0, 55 }, { 52, 0, 0, 13 },
|
||||
// Helicopter -- takeoff
|
||||
/* Helicopter -- takeoff */
|
||||
{ 53, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 54, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 55, 0, HANGAR2_AREA_block, 56 }, // need to go to hangar when waiting in air
|
||||
{ 56, 0, HANGAR2_AREA_block, 3 },
|
||||
// runway 2 out support
|
||||
/* runway 2 out support */
|
||||
{ 57, 255, OUT_WAY2_block, 0 }, { 57, TAKEOFF, 0, 58 }, { 57, 0, 0, 58 },
|
||||
{ 58, 0, OUT_WAY2_block, 59 },
|
||||
{ 59, TAKEOFF, RUNWAY_OUT2_block, 60 }, // takeoff
|
||||
{ 60, 0, RUNWAY_OUT2_block, 61 },
|
||||
{ 61, STARTTAKEOFF, NOTHING_block, 62 },
|
||||
{ 62, ENDTAKEOFF, NOTHING_block, 0 },
|
||||
// runway 2 in support
|
||||
/* runway 2 in support */
|
||||
{ 63, LANDING, RUNWAY_IN2_block, 64 },
|
||||
{ 64, 0, RUNWAY_IN2_block, 65 },
|
||||
{ 65, 0, RUNWAY_IN2_block, 66 },
|
||||
@@ -717,7 +717,7 @@ static const AirportFTAbuildup _airport_fta_intercontinental[] = {
|
||||
};
|
||||
|
||||
|
||||
// heliports, oilrigs don't have depots
|
||||
/* heliports, oilrigs don't have depots */
|
||||
static const byte _airport_helipad_heliport_oilrig[] = { 1, 1 };
|
||||
static const byte _airport_entries_heliport_oilrig[] = { 7, 7, 7, 7 };
|
||||
static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
|
||||
@@ -726,7 +726,7 @@ static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
|
||||
{ 2, 255, AIRPORT_BUSY_block, 0 }, { 2, HELILANDING, 0, 3 }, { 2, HELITAKEOFF, 0, 1 },
|
||||
{ 3, HELILANDING, AIRPORT_BUSY_block, 4 },
|
||||
{ 4, HELIENDLANDING, AIRPORT_BUSY_block, 4 }, { 4, HELIPAD1, HELIPAD1_block, 0 }, { 4, HELITAKEOFF, 0, 2 },
|
||||
// In Air
|
||||
/* In Air */
|
||||
{ 5, 0, NOTHING_block, 6 },
|
||||
{ 6, 0, NOTHING_block, 7 },
|
||||
{ 7, 0, NOTHING_block, 8 },
|
||||
@@ -734,7 +734,7 @@ static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
|
||||
{ MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE
|
||||
};
|
||||
|
||||
// helidepots
|
||||
/* helidepots */
|
||||
static const TileIndexDiffC _airport_depots_helidepot[] = { { 1, 0 } };
|
||||
static const byte _airport_helipad_helidepot[] = { 1, 1 };
|
||||
static const byte _airport_entries_helidepot[] = { 4, 4, 4, 4 };
|
||||
@@ -742,18 +742,18 @@ static const AirportFTAbuildup _airport_fta_helidepot[] = {
|
||||
{ 0, HANGAR, NOTHING_block, 1 },
|
||||
{ 1, 255, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELIPAD1, HELIPAD1_block, 14 }, { 1, HELITAKEOFF, 0, 15 }, { 1, 0, 0, 0 },
|
||||
{ 2, FLYING, NOTHING_block, 3 }, { 2, HELILANDING, PRE_HELIPAD_block, 7 }, { 2, HANGAR, 0, 12 }, { 2, HELITAKEOFF, NOTHING_block, 16 },
|
||||
// In Air
|
||||
/* In Air */
|
||||
{ 3, 0, NOTHING_block, 4 },
|
||||
{ 4, 0, NOTHING_block, 5 },
|
||||
{ 5, 0, NOTHING_block, 6 },
|
||||
{ 6, 0, NOTHING_block, 2 },
|
||||
// Helicopter -- stay in air in special place as a buffer to choose from helipads
|
||||
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
|
||||
{ 7, HELILANDING, PRE_HELIPAD_block, 8 },
|
||||
{ 8, HELIENDLANDING, PRE_HELIPAD_block, 8 }, { 8, HELIPAD1, 0, 9 }, { 8, HANGAR, 0, 12 }, { 8, 0, 0, 2 },
|
||||
{ 9, 0, NOTHING_block, 10 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 10, 255, NOTHING_block, 10 }, { 10, HELIPAD1, HELIPAD1_block, 14 }, { 10, HANGAR, 0, 1 }, { 10, 0, 0, 14 },
|
||||
// Helicopter -- takeoff
|
||||
/* Helicopter -- takeoff */
|
||||
{ 11, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 12, 0, HANGAR2_AREA_block, 13 }, // need to go to hangar when waiting in air
|
||||
{ 13, 0, HANGAR2_AREA_block, 1 },
|
||||
@@ -764,16 +764,16 @@ static const AirportFTAbuildup _airport_fta_helidepot[] = {
|
||||
{ MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE
|
||||
};
|
||||
|
||||
// helistation
|
||||
/* helistation */
|
||||
static const TileIndexDiffC _airport_depots_helistation[] = { { 0, 0 } };
|
||||
static const byte _airport_helipad_helistation[] = { 1, 3 };
|
||||
static const byte _airport_entries_helistation[] = { 25, 25, 25, 25 };
|
||||
static const AirportFTAbuildup _airport_fta_helistation[] = {
|
||||
{ 0, HANGAR, NOTHING_block, 8 }, { 0, HELIPAD1, 0, 1 }, { 0, HELIPAD2, 0, 1 }, { 0, HELIPAD3, 0, 1 }, { 0, HELITAKEOFF, 0, 1 }, { 0, 0, 0, 0 },
|
||||
{ 1, 255, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELITAKEOFF, 0, 3 }, { 1, 0, 0, 4 },
|
||||
// landing
|
||||
/* landing */
|
||||
{ 2, FLYING, NOTHING_block, 28 }, { 2, HELILANDING, 0, 15 }, { 2, 0, 0, 28 },
|
||||
// helicopter side
|
||||
/* helicopter side */
|
||||
{ 3, HELITAKEOFF, NOTHING_block, 0 }, // helitakeoff outside hangar2
|
||||
{ 4, 255, TAXIWAY_BUSY_block, 0 }, { 4, HANGAR, HANGAR2_AREA_block, 1 }, { 4, HELITAKEOFF, 0, 1 }, { 4, 0, 0, 5 },
|
||||
{ 5, 255, TAXIWAY_BUSY_block, 0 }, { 5, HELIPAD1, HELIPAD1_block, 6 }, { 5, HELIPAD2, HELIPAD2_block, 7 }, { 5, HELIPAD3, HELIPAD3_block, 8 }, { 5, 0, 0, 4 },
|
||||
@@ -786,13 +786,13 @@ static const AirportFTAbuildup _airport_fta_helistation[] = {
|
||||
{ 12, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 13, HELITAKEOFF, NOTHING_block, 0 },
|
||||
{ 14, HELITAKEOFF, NOTHING_block, 0 },
|
||||
// heli - in flight moves
|
||||
/* heli - in flight moves */
|
||||
{ 15, HELILANDING, PRE_HELIPAD_block, 16 },
|
||||
{ 16, HELIENDLANDING, PRE_HELIPAD_block, 16 }, { 16, HELIPAD1, 0, 17 }, { 16, HELIPAD2, 0, 18 }, { 16, HELIPAD3, 0, 19 }, { 16, HANGAR, 0, 23 },
|
||||
{ 17, 0, NOTHING_block, 20 },
|
||||
{ 18, 0, NOTHING_block, 21 },
|
||||
{ 19, 0, NOTHING_block, 22 },
|
||||
// heli landing
|
||||
/* heli landing */
|
||||
{ 20, 255, NOTHING_block, 0 }, { 20, HELIPAD1, HELIPAD1_block, 6 }, { 20, HANGAR, 0, 23 }, { 20, 0, 0, 6 },
|
||||
{ 21, 255, NOTHING_block, 0 }, { 21, HELIPAD2, HELIPAD2_block, 7 }, { 21, HANGAR, 0, 23 }, { 21, 0, 0, 7 },
|
||||
{ 22, 255, NOTHING_block, 0 }, { 22, HELIPAD3, HELIPAD3_block, 8 }, { 22, HANGAR, 0, 23 }, { 22, 0, 0, 8 },
|
||||
|
@@ -5,10 +5,11 @@
|
||||
#include "stdafx.h"
|
||||
#include "train.h"
|
||||
#include "roadveh.h"
|
||||
#include "aircraft.h"
|
||||
#include "newgrf_engine.h"
|
||||
#include "vehicle_func.h"
|
||||
|
||||
#include "table/strings.h"
|
||||
|
||||
static const uint MAX_ARTICULATED_PARTS = 100; ///< Maximum of articulated parts per vehicle, i.e. when to abort calling the articulated vehicle callback.
|
||||
|
||||
uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
|
||||
@@ -50,22 +51,7 @@ static inline uint16 GetVehicleDefaultCapacity(EngineID engine, VehicleType type
|
||||
CargoID cargo = (e->CanCarryCargo() ? e->GetDefaultCargoType() : (CargoID)CT_INVALID);
|
||||
if (cargo_type != NULL) *cargo_type = cargo;
|
||||
if (cargo == CT_INVALID) return 0;
|
||||
switch (type) {
|
||||
case VEH_TRAIN:
|
||||
return GetEngineProperty(engine, 0x14, e->u.rail.capacity) + (e->u.rail.railveh_type == RAILVEH_MULTIHEAD ? e->u.rail.capacity : 0);
|
||||
|
||||
case VEH_ROAD:
|
||||
return GetEngineProperty(engine, 0x0F, e->u.road.capacity);
|
||||
|
||||
case VEH_SHIP:
|
||||
return GetEngineProperty(engine, 0x0D, e->u.ship.capacity);
|
||||
|
||||
case VEH_AIRCRAFT:
|
||||
return AircraftDefaultCargoCapacity(cargo, &e->u.air);
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
|
||||
return e->GetDisplayDefaultCapacity();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -238,6 +224,64 @@ bool IsArticulatedVehicleCarryingDifferentCargos(const Vehicle *v, CargoID *carg
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the specs of freshly build articulated vehicles are consistent with the information specified in the purchase list.
|
||||
* Only essential information is checked to leave room for magic tricks/workarounds to grfcoders.
|
||||
* It checks:
|
||||
* For autoreplace/-renew:
|
||||
* - Default cargo type (without capacity)
|
||||
* - intersection and union of refit masks.
|
||||
*/
|
||||
void CheckConsistencyOfArticulatedVehicle(const Vehicle *v)
|
||||
{
|
||||
const Engine *engine = GetEngine(v->engine_type);
|
||||
|
||||
uint32 purchase_refit_union = GetUnionOfArticulatedRefitMasks(v->engine_type, v->type, true);
|
||||
uint32 purchase_refit_intersection = GetIntersectionOfArticulatedRefitMasks(v->engine_type, v->type, true);
|
||||
uint16 *purchase_default_capacity = GetCapacityOfArticulatedParts(v->engine_type, v->type);
|
||||
|
||||
uint32 real_refit_union = 0;
|
||||
uint32 real_refit_intersection = UINT_MAX;
|
||||
uint16 real_default_capacity[NUM_CARGO];
|
||||
memset(real_default_capacity, 0, sizeof(real_default_capacity));
|
||||
|
||||
do {
|
||||
uint32 refit_mask = GetAvailableVehicleCargoTypes(v->engine_type, v->type, true);
|
||||
real_refit_union |= refit_mask;
|
||||
if (refit_mask != 0) real_refit_intersection &= refit_mask;
|
||||
|
||||
assert(v->cargo_type < NUM_CARGO);
|
||||
real_default_capacity[v->cargo_type] += v->cargo_cap;
|
||||
|
||||
switch (v->type) {
|
||||
case VEH_TRAIN:
|
||||
v = (EngineHasArticPart(v) ? GetNextArticPart(v) : NULL);
|
||||
break;
|
||||
|
||||
case VEH_ROAD:
|
||||
v = (RoadVehHasArticPart(v) ? v->Next() : NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
v = NULL;
|
||||
break;
|
||||
}
|
||||
} while (v != NULL);
|
||||
|
||||
/* Check whether the vehicle carries more cargos than expected */
|
||||
bool carries_more = false;
|
||||
for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
|
||||
if (real_default_capacity[cid] != 0 && purchase_default_capacity[cid] == 0) {
|
||||
carries_more = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* show a warning once for each GRF after each game load */
|
||||
if (real_refit_union != purchase_refit_union || real_refit_intersection != purchase_refit_intersection || carries_more) {
|
||||
ShowNewGrfVehicleError(engine->index, STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_ARTICULATED_CARGO, GBUG_VEH_REFIT, false);
|
||||
}
|
||||
}
|
||||
|
||||
void AddArticulatedParts(Vehicle **vl, VehicleType type)
|
||||
{
|
||||
@@ -329,6 +373,6 @@ void AddArticulatedParts(Vehicle **vl, VehicleType type)
|
||||
|
||||
if (flip_image) u->spritenum++;
|
||||
|
||||
VehiclePositionChanged(u);
|
||||
VehicleMove(u, false);
|
||||
}
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user