(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.

This commit is contained in:
rubidium 2007-01-10 18:56:51 +00:00
parent a332d10fd9
commit f35ed4bbc2
190 changed files with 2825 additions and 2208 deletions

View File

@ -7,7 +7,7 @@ LANG_DIR = !!LANG_DIR!!
BIN_DIR = !!BIN_DIR!! BIN_DIR = !!BIN_DIR!!
LANGS_SRC = $(shell ls $(LANG_DIR)/*.txt) LANGS_SRC = $(shell ls $(LANG_DIR)/*.txt)
LANGS = $(LANGS_SRC:$(LANG_DIR)/%.txt=%.lng) LANGS = $(LANGS_SRC:$(LANG_DIR)/%.txt=%.lng)
CC_BUILD = !!CC_BUILD!! CXX_BUILD = !!CXX_BUILD!!
CFLAGS_BUILD = !!CFLAGS_BUILD!! CFLAGS_BUILD = !!CFLAGS_BUILD!!
STRGEN_FLAGS = !!STRGEN_FLAGS!! STRGEN_FLAGS = !!STRGEN_FLAGS!!
STAGE = !!STAGE!! STAGE = !!STAGE!!
@ -36,13 +36,13 @@ RES := $(shell mkdir -p $(BIN_DIR)/lang )
all: table/strings.h $(LANGS) all: table/strings.h $(LANGS)
strgen.o: $(SRC_DIR)/strgen/strgen.c endian_host.h strgen.o: $(SRC_DIR)/strgen/strgen.cpp endian_host.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)' $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CC_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $< $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
string.o: $(SRC_DIR)/string.c endian_host.h string.o: $(SRC_DIR)/string.cpp endian_host.h
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)' $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CC_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $< $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) -DSTRGEN -c -o $@ $<
lang/english.txt: $(LANG_DIR)/english.txt lang/english.txt: $(LANG_DIR)/english.txt
$(Q)mkdir -p lang $(Q)mkdir -p lang
@ -50,7 +50,7 @@ lang/english.txt: $(LANG_DIR)/english.txt
$(STRGEN): string.o strgen.o $(STRGEN): string.o strgen.o
$(E) '$(STAGE) Compiling and Linking $@' $(E) '$(STAGE) Compiling and Linking $@'
$(Q)$(CC_BUILD) string.o strgen.o -o $@ $(Q)$(CXX_BUILD) string.o strgen.o -o $@
table/strings.h: lang/english.txt $(STRGEN) table/strings.h: lang/english.txt $(STRGEN)
$(E) '$(STAGE) Generating $@' $(E) '$(STAGE) Generating $@'
@ -67,9 +67,9 @@ endian_host.h: $(ENDIAN_CHECK)
$(E) '$(STAGE) Testing endianness for host' $(E) '$(STAGE) Testing endianness for host'
$(Q)./$(ENDIAN_CHECK) > $@ $(Q)./$(ENDIAN_CHECK) > $@
$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.c $(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp
$(E) '$(STAGE) Compiling and Linking $@' $(E) '$(STAGE) Compiling and Linking $@'
$(Q)$(CC_BUILD) $(CFLAGS_BUILD) $< -o $@ $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $< -o $@
depend: depend:

View File

@ -3,6 +3,7 @@
CC_HOST = !!CC_HOST!! CC_HOST = !!CC_HOST!!
CXX_HOST = !!CXX_HOST!! CXX_HOST = !!CXX_HOST!!
CC_BUILD = !!CC_BUILD!! CC_BUILD = !!CC_BUILD!!
CXX_BUILD = !!CXX_BUILD!!
WINDRES = !!WINDRES!! WINDRES = !!WINDRES!!
STRIP = !!STRIP!! STRIP = !!STRIP!!
CC_CFLAGS = !!CC_CFLAGS!! CC_CFLAGS = !!CC_CFLAGS!!
@ -96,7 +97,7 @@ RES := $(shell if [ "`cat $(CONFIG_CACHE_ENDIAN) 2>/dev/null`" != "$(ENDIAN_FORC
# If there is a change in the source-file-list, make sure we recheck the deps # If there is a change in the source-file-list, make sure we recheck the deps
RES := $(shell if [ "`cat $(CONFIG_CACHE_SOURCE) 2>/dev/null`" != "$(SRCS)" ]; then echo "$(SRCS)" > $(CONFIG_CACHE_SOURCE); fi ) RES := $(shell if [ "`cat $(CONFIG_CACHE_SOURCE) 2>/dev/null`" != "$(SRCS)" ]; then echo "$(SRCS)" > $(CONFIG_CACHE_SOURCE); fi )
# If there is a change in the revision, make sure we recompile rev.c # If there is a change in the revision, make sure we recompile rev.cpp
RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(REV)" ]; then echo "$(REV)" > $(CONFIG_CACHE_VERSION); fi ) RES := $(shell if [ "`cat $(CONFIG_CACHE_VERSION) 2>/dev/null`" != "$(REV)" ]; then echo "$(REV)" > $(CONFIG_CACHE_VERSION); fi )
ifndef MAKEDEPEND ifndef MAKEDEPEND
@ -232,25 +233,25 @@ endian_target.h: $(ENDIAN_CHECK) $(CONFIG_CACHE_ENDIAN)
$(E) '$(STAGE) Testing endianness for target' $(E) '$(STAGE) Testing endianness for target'
$(Q)./$(ENDIAN_CHECK) $(ENDIAN_FORCE) > $@ $(Q)./$(ENDIAN_CHECK) $(ENDIAN_FORCE) > $@
$(ENDIAN_CHECK): $(SRC_DIR)/endian_check.c $(ENDIAN_CHECK): $(SRC_DIR)/endian_check.cpp
$(E) '$(STAGE) Compiling and Linking $@' $(E) '$(STAGE) Compiling and Linking $@'
$(Q)$(CC_BUILD) $(CFLAGS_BUILD) $< -o $@ $(Q)$(CXX_BUILD) $(CFLAGS_BUILD) $< -o $@
# Revision files # Revision files
rev.c: $(CONFIG_CACHE_VERSION) rev.cpp: $(CONFIG_CACHE_VERSION)
# setting the revision number in a place, there the binary can read it # setting the revision number in a place, there the binary can read it
@echo 'const char _openttd_revision[] = "$(REV)";' > rev.c @echo 'extern const char _openttd_revision[] = "$(REV)";' > rev.cpp
# Some additions for MorphOS versions tag # Some additions for MorphOS versions tag
ifeq ($(OS),MORPHOS) ifeq ($(OS),MORPHOS)
@echo '#ifdef __MORPHOS__' >> rev.c @echo '#ifdef __MORPHOS__' >> rev.cpp
@echo 'const char morphos_versions_tag[] = "\\0$$VER: OpenTTD $(REV) ('`date +%d.%m.%y`') (C) OpenTTD Team [MorphOS, PowerPC]";' >> rev.c @echo 'extern const char morphos_versions_tag[] = "\\0$$VER: OpenTTD $(REV) ('`date +%d.%m.%y`') (C) OpenTTD Team [MorphOS, PowerPC]";' >> rev.cpp
@echo '#endif' >> rev.c @echo '#endif' >> rev.cpp
endif endif
rev.o: rev.c $(FILE_DEP) rev.o: rev.cpp $(FILE_DEP)
$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.c=%.c)' $(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
$(Q)$(CC_HOST) $(CC_CFLAGS) $(CFLAGS) -c -o $@ $< $(Q)$(CXX_HOST) $(CFLAGS) -c -o $@ $<
FORCE: FORCE:
@ -261,7 +262,7 @@ clean:
$(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(TTD:%=$(BIN_DIR)/%) $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS) rev.o $(Q)rm -f $(DEPS) $(OBJS) $(TTD) $(TTD:%=$(BIN_DIR)/%) $(CONFIG_CACHE_COMPILER) $(CONFIG_CACHE_LINKER) $(CONFIG_CACHE_ENDIAN) $(CONFIG_CACHE_SOURCE) $(ENDIAN_TARGETS) rev.o
mrproper: clean mrproper: clean
$(Q)rm -f rev.c $(Q)rm -f rev.cpp
%.o: %.o:
@echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|m|rc]' @echo '$(STAGE) No such source-file: $(@:%.o=%).[c|cpp|m|rc]'

View File

@ -12,6 +12,7 @@ set_default() {
host="" host=""
cc_build="" cc_build=""
cc_host="" cc_host=""
cxx_build=""
cxx_host="" cxx_host=""
windres="" windres=""
strip="" strip=""
@ -54,7 +55,7 @@ set_default() {
with_freetype="1" with_freetype="1"
with_fontconfig="1" with_fontconfig="1"
save_params_array="build host cc_build cc_host cxx_host windres strip lipo os revision endian config_log prefix_dir binary_dir data_dir icon_dir personal_dir install_dir custom_lang_dir second_data_dir enable_install enable_debug enable_profiling enable_dedicated enable_network enable_static enable_translator enable_assert enable_strip with_osx_sysroot enable_universal enable_osx_g5 with_application_bundle with_sdl with_cocoa with_zlib with_png with_makedepend with_direct_music with_sort with_iconv with_midi with_midi_arg with_freetype with_fontconfig CC CXX CFLAGS LDFLAGS" save_params_array="build host cc_build cc_host cxx_build cxx_host windres strip lipo os revision endian config_log prefix_dir binary_dir data_dir icon_dir personal_dir install_dir custom_lang_dir second_data_dir enable_install enable_debug enable_profiling enable_dedicated enable_network enable_static enable_translator enable_assert enable_strip with_osx_sysroot enable_universal enable_osx_g5 with_application_bundle with_sdl with_cocoa with_zlib with_png with_makedepend with_direct_music with_sort with_iconv with_midi with_midi_arg with_freetype with_fontconfig CC CXX CFLAGS LDFLAGS"
} }
detect_params() { detect_params() {
@ -90,6 +91,8 @@ detect_params() {
--cc-build=*) cc_build="$optarg";; --cc-build=*) cc_build="$optarg";;
--cc-host) prevp_p="cc_host";; --cc-host) prevp_p="cc_host";;
--cc-host=*) cc_host="$optarg";; --cc-host=*) cc_host="$optarg";;
--cxx-build) prevp_p="cxx_build";;
--cxx-build=*) cxx_build="$optarg";;
--cxx-host) prevp_p="cxx_host";; --cxx-host) prevp_p="cxx_host";;
--cxx-host=*) cxx_host="$optarg";; --cxx-host=*) cxx_host="$optarg";;
--windres) prevp_p="windres";; --windres) prevp_p="windres";;
@ -320,7 +323,8 @@ check_params() {
log 1 "checking for build gcc... $cc_build" log 1 "checking for build gcc... $cc_build"
log 1 "checking for host gcc... $cc_host" log 1 "checking for host gcc... $cc_host"
check_cxx check_cxx_build
check_cxx_host
check_windres check_windres
check_strip check_strip
check_lipo check_lipo
@ -535,7 +539,7 @@ check_params() {
native=`LC_ALL=C uname | tr [:upper:] [:lower:] | grep darwin` native=`LC_ALL=C uname | tr [:upper:] [:lower:] | grep darwin`
# If $host doesn't match $build , we are cross-compiling # If $host doesn't match $build , we are cross-compiling
if [ -n "$native" ] && [ "$build" != "$host" ]; then if [ -n "$native" ] && [ "$build" != "$host" ]; then
$cc_build $SRC_DIR/os/macosx/G5_detector.c -o G5_detector $cc_build $SRC_DIR/os/macosx/G5_detector.cpp -o G5_detector
res=`./G5_detector` res=`./G5_detector`
rm -f G5_detector rm -f G5_detector
if [ -n "$res" ]; then if [ -n "$res" ]; then
@ -981,7 +985,13 @@ check_host() {
check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CC" "gcc" "cc" "0" "-dumpmachine" check_compiler "host system type" "cc_host" "$host" "$cc_host" "$CC" "gcc" "cc" "0" "-dumpmachine"
} }
check_cxx() { check_cxx_build() {
check_compiler "build g++" "cxx_build" "$build" "$cxx_build" "$CXX" "g++" "c++" 1 "-dumpmachine"
}
check_cxx_host() {
# By default the host is the build
if [ -z "$host" ]; then host="$build"; fi
check_compiler "host g++" "cxx_host" "$host" "$cxx_host" "$CXX" "g++" "c++" 1 "-dumpmachine" check_compiler "host g++" "cxx_host" "$host" "$cxx_host" "$CXX" "g++" "c++" 1 "-dumpmachine"
} }
@ -1584,6 +1594,7 @@ make_sed() {
s#!!CC_HOST!!#$cc_host#g; s#!!CC_HOST!!#$cc_host#g;
s#!!CXX_HOST!!#$cxx_host#g; s#!!CXX_HOST!!#$cxx_host#g;
s#!!CC_BUILD!!#$cc_build#g; s#!!CC_BUILD!!#$cc_build#g;
s#!!CXX_BUILD!!#$cxx_build#g;
s#!!WINDRES!!#$windres#g; s#!!WINDRES!!#$windres#g;
s#!!STRIP!!#$strip $strip_arg#g; s#!!STRIP!!#$strip $strip_arg#g;
s#!!LIPO!!#$lipo#g; s#!!LIPO!!#$lipo#g;

View File

@ -161,220 +161,220 @@
Name="Source Files" Name="Source Files"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\airport.c"> RelativePath=".\..\src\airport.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\aystar.c"> RelativePath=".\..\src\aystar.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\bmp.c"> RelativePath=".\..\src\bmp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\callback_table.c"> RelativePath=".\..\src\callback_table.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\command.c"> RelativePath=".\..\src\command.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\console.c"> RelativePath=".\..\src\console.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\console_cmds.c"> RelativePath=".\..\src\console_cmds.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\currency.c"> RelativePath=".\..\src\currency.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\date.c"> RelativePath=".\..\src\date.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\debug.c"> RelativePath=".\..\src\debug.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\dedicated.c"> RelativePath=".\..\src\dedicated.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\depot.c"> RelativePath=".\..\src\depot.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\driver.c"> RelativePath=".\..\src\driver.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\economy.c"> RelativePath=".\..\src\economy.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\elrail.c"> RelativePath=".\..\src\elrail.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\engine.c"> RelativePath=".\..\src\engine.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\fileio.c"> RelativePath=".\..\src\fileio.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\fios.c"> RelativePath=".\..\src\fios.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\fontcache.c"> RelativePath=".\..\src\fontcache.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\genworld.c"> RelativePath=".\..\src\genworld.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\gfx.c"> RelativePath=".\..\src\gfx.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\gfxinit.c"> RelativePath=".\..\src\gfxinit.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\heightmap.c"> RelativePath=".\..\src\heightmap.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\helpers.cpp"> RelativePath=".\..\src\helpers.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\landscape.c"> RelativePath=".\..\src\landscape.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\map.c"> RelativePath=".\..\src\map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\md5.c"> RelativePath=".\..\src\md5.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\mersenne.c"> RelativePath=".\..\src\mersenne.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\minilzo.c"> RelativePath=".\..\src\minilzo.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\misc.c"> RelativePath=".\..\src\misc.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\mixer.c"> RelativePath=".\..\src\mixer.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music.c"> RelativePath=".\..\src\music.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\namegen.c"> RelativePath=".\..\src\namegen.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\core.c"> RelativePath=".\..\src\network\core\core.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\packet.c"> RelativePath=".\..\src\network\core\packet.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\tcp.c"> RelativePath=".\..\src\network\core\tcp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\udp.c"> RelativePath=".\..\src\network\core\udp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network.c"> RelativePath=".\..\src\network\network.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_client.c"> RelativePath=".\..\src\network\network_client.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_data.c"> RelativePath=".\..\src\network\network_data.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_gamelist.c"> RelativePath=".\..\src\network\network_gamelist.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_server.c"> RelativePath=".\..\src\network\network_server.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_udp.c"> RelativePath=".\..\src\network\network_udp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\npf.c"> RelativePath=".\..\src\npf.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\oldloader.c"> RelativePath=".\..\src\oldloader.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\oldpool.c"> RelativePath=".\..\src\oldpool.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\openttd.c"> RelativePath=".\..\src\openttd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\os_timer.c"> RelativePath=".\..\src\os_timer.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ottdres.rc"> RelativePath=".\..\src\ottdres.rc">
</File> </File>
<File <File
RelativePath=".\..\src\pathfind.c"> RelativePath=".\..\src\pathfind.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\players.c"> RelativePath=".\..\src\players.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\queue.c"> RelativePath=".\..\src\queue.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\rail.c"> RelativePath=".\..\src\rail.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\saveload.c"> RelativePath=".\..\src\saveload.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\screenshot.c"> RelativePath=".\..\src\screenshot.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sdl.c"> RelativePath=".\..\src\sdl.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\settings.c"> RelativePath=".\..\src\settings.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\signs.c"> RelativePath=".\..\src\signs.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sound.c"> RelativePath=".\..\src\sound.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\spritecache.c"> RelativePath=".\..\src\spritecache.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\string.c"> RelativePath=".\..\src\string.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\strings.c"> RelativePath=".\..\src\strings.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\texteff.c"> RelativePath=".\..\src\texteff.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tgp.c"> RelativePath=".\..\src\tgp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\thread.c"> RelativePath=".\..\src\thread.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tile.c"> RelativePath=".\..\src\tile.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\vehicle.c"> RelativePath=".\..\src\vehicle.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\viewport.c"> RelativePath=".\..\src\viewport.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\waypoint.c"> RelativePath=".\..\src\waypoint.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\widget.c"> RelativePath=".\..\src\widget.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\win32.c"> RelativePath=".\..\src\win32.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\window.c"> RelativePath=".\..\src\window.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
@ -664,155 +664,155 @@
Name="GUI Source Code" Name="GUI Source Code"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\aircraft_gui.c"> RelativePath=".\..\src\aircraft_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\airport_gui.c"> RelativePath=".\..\src\airport_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\bridge_gui.c"> RelativePath=".\..\src\bridge_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\build_vehicle_gui.c"> RelativePath=".\..\src\build_vehicle_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\depot_gui.c"> RelativePath=".\..\src\depot_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\dock_gui.c"> RelativePath=".\..\src\dock_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\engine_gui.c"> RelativePath=".\..\src\engine_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\genworld_gui.c"> RelativePath=".\..\src\genworld_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\graph_gui.c"> RelativePath=".\..\src\graph_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\industry_gui.c"> RelativePath=".\..\src\industry_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\intro_gui.c"> RelativePath=".\..\src\intro_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\main_gui.c"> RelativePath=".\..\src\main_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\misc_gui.c"> RelativePath=".\..\src\misc_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music_gui.c"> RelativePath=".\..\src\music_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_gui.c"> RelativePath=".\..\src\network\network_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_gui.c"> RelativePath=".\..\src\newgrf_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\news_gui.c"> RelativePath=".\..\src\news_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\order_gui.c"> RelativePath=".\..\src\order_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\player_gui.c"> RelativePath=".\..\src\player_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\rail_gui.c"> RelativePath=".\..\src\rail_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\road_gui.c"> RelativePath=".\..\src\road_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\roadveh_gui.c"> RelativePath=".\..\src\roadveh_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\settings_gui.c"> RelativePath=".\..\src\settings_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ship_gui.c"> RelativePath=".\..\src\ship_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\smallmap_gui.c"> RelativePath=".\..\src\smallmap_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\station_gui.c"> RelativePath=".\..\src\station_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\subsidy_gui.c"> RelativePath=".\..\src\subsidy_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\terraform_gui.c"> RelativePath=".\..\src\terraform_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\town_gui.c"> RelativePath=".\..\src\town_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\train_gui.c"> RelativePath=".\..\src\train_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\vehicle_gui.c"> RelativePath=".\..\src\vehicle_gui.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Landscape" Name="Landscape"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\aircraft_cmd.c"> RelativePath=".\..\src\aircraft_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\clear_cmd.c"> RelativePath=".\..\src\clear_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\disaster_cmd.c"> RelativePath=".\..\src\disaster_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\dummy_land.c"> RelativePath=".\..\src\dummy_land.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\industry_cmd.c"> RelativePath=".\..\src\industry_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\misc_cmd.c"> RelativePath=".\..\src\misc_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\order_cmd.c"> RelativePath=".\..\src\order_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\rail_cmd.c"> RelativePath=".\..\src\rail_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\road_cmd.c"> RelativePath=".\..\src\road_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\roadveh_cmd.c"> RelativePath=".\..\src\roadveh_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ship_cmd.c"> RelativePath=".\..\src\ship_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\station_cmd.c"> RelativePath=".\..\src\station_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\town_cmd.c"> RelativePath=".\..\src\town_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\train_cmd.c"> RelativePath=".\..\src\train_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tree_cmd.c"> RelativePath=".\..\src\tree_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tunnelbridge_cmd.c"> RelativePath=".\..\src\tunnelbridge_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\unmovable_cmd.c"> RelativePath=".\..\src\unmovable_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\water_cmd.c"> RelativePath=".\..\src\water_cmd.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
@ -901,57 +901,57 @@
Name="AI Files" Name="AI Files"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\ai\ai.c"> RelativePath=".\..\src\ai\ai.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\default\default.c"> RelativePath=".\..\src\ai\default\default.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\build.c"> RelativePath=".\..\src\ai\trolly\build.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\pathfinder.c"> RelativePath=".\..\src\ai\trolly\pathfinder.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\shared.c"> RelativePath=".\..\src\ai\trolly\shared.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\trolly.c"> RelativePath=".\..\src\ai\trolly\trolly.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="NewGRF" Name="NewGRF"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\newgrf.c"> RelativePath=".\..\src\newgrf.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_cargo.c"> RelativePath=".\..\src\newgrf_cargo.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_config.c"> RelativePath=".\..\src\newgrf_config.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_engine.c"> RelativePath=".\..\src\newgrf_engine.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_sound.c"> RelativePath=".\..\src\newgrf_sound.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_spritegroup.c"> RelativePath=".\..\src\newgrf_spritegroup.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_station.c"> RelativePath=".\..\src\newgrf_station.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_text.c"> RelativePath=".\..\src\newgrf_text.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Map Accessors" Name="Map Accessors"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\bridge_map.c"> RelativePath=".\..\src\bridge_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\bridge_map.h"> RelativePath=".\..\src\bridge_map.h">
@ -966,13 +966,13 @@
RelativePath=".\..\src\rail_map.h"> RelativePath=".\..\src\rail_map.h">
</File> </File>
<File <File
RelativePath=".\..\src\road_map.c"> RelativePath=".\..\src\road_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\road_map.h"> RelativePath=".\..\src\road_map.h">
</File> </File>
<File <File
RelativePath=".\..\src\station_map.c"> RelativePath=".\..\src\station_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\station_map.h"> RelativePath=".\..\src\station_map.h">
@ -984,7 +984,7 @@
RelativePath=".\..\src\tree_map.h"> RelativePath=".\..\src\tree_map.h">
</File> </File>
<File <File
RelativePath=".\..\src\tunnel_map.c"> RelativePath=".\..\src\tunnel_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tunnel_map.h"> RelativePath=".\..\src\tunnel_map.h">
@ -1091,16 +1091,16 @@
Name="Video" Name="Video"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\video\dedicated_v.c"> RelativePath=".\..\src\video\dedicated_v.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\video\null_v.c"> RelativePath=".\..\src\video\null_v.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\video\sdl_v.c"> RelativePath=".\..\src\video\sdl_v.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\video\win32_v.c"> RelativePath=".\..\src\video\win32_v.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
@ -1110,23 +1110,23 @@
RelativePath=".\..\src\music\dmusic.cpp"> RelativePath=".\..\src\music\dmusic.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music\null_m.c"> RelativePath=".\..\src\music\null_m.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music\win32_m.c"> RelativePath=".\..\src\music\win32_m.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Sound" Name="Sound"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\sound\null_s.c"> RelativePath=".\..\src\sound\null_s.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sound\sdl_s.c"> RelativePath=".\..\src\sound\sdl_s.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sound\win32_s.c"> RelativePath=".\..\src\sound\win32_s.cpp">
</File> </File>
</Filter> </Filter>
<File <File

View File

@ -444,220 +444,220 @@
Name="Source Files" Name="Source Files"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\airport.c"> RelativePath=".\..\src\airport.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\aystar.c"> RelativePath=".\..\src\aystar.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\bmp.c"> RelativePath=".\..\src\bmp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\callback_table.c"> RelativePath=".\..\src\callback_table.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\command.c"> RelativePath=".\..\src\command.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\console.c"> RelativePath=".\..\src\console.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\console_cmds.c"> RelativePath=".\..\src\console_cmds.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\currency.c"> RelativePath=".\..\src\currency.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\date.c"> RelativePath=".\..\src\date.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\debug.c"> RelativePath=".\..\src\debug.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\dedicated.c"> RelativePath=".\..\src\dedicated.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\depot.c"> RelativePath=".\..\src\depot.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\driver.c"> RelativePath=".\..\src\driver.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\economy.c"> RelativePath=".\..\src\economy.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\elrail.c"> RelativePath=".\..\src\elrail.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\engine.c"> RelativePath=".\..\src\engine.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\fileio.c"> RelativePath=".\..\src\fileio.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\fios.c"> RelativePath=".\..\src\fios.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\fontcache.c"> RelativePath=".\..\src\fontcache.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\genworld.c"> RelativePath=".\..\src\genworld.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\gfx.c"> RelativePath=".\..\src\gfx.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\gfxinit.c"> RelativePath=".\..\src\gfxinit.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\heightmap.c"> RelativePath=".\..\src\heightmap.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\helpers.cpp"> RelativePath=".\..\src\helpers.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\landscape.c"> RelativePath=".\..\src\landscape.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\map.c"> RelativePath=".\..\src\map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\md5.c"> RelativePath=".\..\src\md5.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\mersenne.c"> RelativePath=".\..\src\mersenne.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\minilzo.c"> RelativePath=".\..\src\minilzo.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\misc.c"> RelativePath=".\..\src\misc.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\mixer.c"> RelativePath=".\..\src\mixer.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music.c"> RelativePath=".\..\src\music.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\namegen.c"> RelativePath=".\..\src\namegen.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\core.c"> RelativePath=".\..\src\network\core\core.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\packet.c"> RelativePath=".\..\src\network\core\packet.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\tcp.c"> RelativePath=".\..\src\network\core\tcp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\core\udp.c"> RelativePath=".\..\src\network\core\udp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network.c"> RelativePath=".\..\src\network\network.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_client.c"> RelativePath=".\..\src\network\network_client.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_data.c"> RelativePath=".\..\src\network\network_data.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_gamelist.c"> RelativePath=".\..\src\network\network_gamelist.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_server.c"> RelativePath=".\..\src\network\network_server.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_udp.c"> RelativePath=".\..\src\network\network_udp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\npf.c"> RelativePath=".\..\src\npf.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\oldloader.c"> RelativePath=".\..\src\oldloader.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\oldpool.c"> RelativePath=".\..\src\oldpool.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\openttd.c"> RelativePath=".\..\src\openttd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\os_timer.c"> RelativePath=".\..\src\os_timer.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ottdres.rc"> RelativePath=".\..\src\ottdres.rc">
</File> </File>
<File <File
RelativePath=".\..\src\pathfind.c"> RelativePath=".\..\src\pathfind.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\players.c"> RelativePath=".\..\src\players.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\queue.c"> RelativePath=".\..\src\queue.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\rail.c"> RelativePath=".\..\src\rail.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\saveload.c"> RelativePath=".\..\src\saveload.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\screenshot.c"> RelativePath=".\..\src\screenshot.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sdl.c"> RelativePath=".\..\src\sdl.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\settings.c"> RelativePath=".\..\src\settings.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\signs.c"> RelativePath=".\..\src\signs.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sound.c"> RelativePath=".\..\src\sound.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\spritecache.c"> RelativePath=".\..\src\spritecache.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\string.c"> RelativePath=".\..\src\string.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\strings.c"> RelativePath=".\..\src\strings.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\texteff.c"> RelativePath=".\..\src\texteff.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tgp.c"> RelativePath=".\..\src\tgp.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\thread.c"> RelativePath=".\..\src\thread.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tile.c"> RelativePath=".\..\src\tile.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\vehicle.c"> RelativePath=".\..\src\vehicle.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\viewport.c"> RelativePath=".\..\src\viewport.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\waypoint.c"> RelativePath=".\..\src\waypoint.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\widget.c"> RelativePath=".\..\src\widget.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\win32.c"> RelativePath=".\..\src\win32.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\window.c"> RelativePath=".\..\src\window.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
@ -947,155 +947,155 @@
Name="GUI Source Code" Name="GUI Source Code"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\aircraft_gui.c"> RelativePath=".\..\src\aircraft_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\airport_gui.c"> RelativePath=".\..\src\airport_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\bridge_gui.c"> RelativePath=".\..\src\bridge_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\build_vehicle_gui.c"> RelativePath=".\..\src\build_vehicle_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\depot_gui.c"> RelativePath=".\..\src\depot_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\dock_gui.c"> RelativePath=".\..\src\dock_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\engine_gui.c"> RelativePath=".\..\src\engine_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\genworld_gui.c"> RelativePath=".\..\src\genworld_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\graph_gui.c"> RelativePath=".\..\src\graph_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\industry_gui.c"> RelativePath=".\..\src\industry_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\intro_gui.c"> RelativePath=".\..\src\intro_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\main_gui.c"> RelativePath=".\..\src\main_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\misc_gui.c"> RelativePath=".\..\src\misc_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music_gui.c"> RelativePath=".\..\src\music_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\network\network_gui.c"> RelativePath=".\..\src\network\network_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_gui.c"> RelativePath=".\..\src\newgrf_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\news_gui.c"> RelativePath=".\..\src\news_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\order_gui.c"> RelativePath=".\..\src\order_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\player_gui.c"> RelativePath=".\..\src\player_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\rail_gui.c"> RelativePath=".\..\src\rail_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\road_gui.c"> RelativePath=".\..\src\road_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\roadveh_gui.c"> RelativePath=".\..\src\roadveh_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\settings_gui.c"> RelativePath=".\..\src\settings_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ship_gui.c"> RelativePath=".\..\src\ship_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\smallmap_gui.c"> RelativePath=".\..\src\smallmap_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\station_gui.c"> RelativePath=".\..\src\station_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\subsidy_gui.c"> RelativePath=".\..\src\subsidy_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\terraform_gui.c"> RelativePath=".\..\src\terraform_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\town_gui.c"> RelativePath=".\..\src\town_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\train_gui.c"> RelativePath=".\..\src\train_gui.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\vehicle_gui.c"> RelativePath=".\..\src\vehicle_gui.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Landscape" Name="Landscape"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\aircraft_cmd.c"> RelativePath=".\..\src\aircraft_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\clear_cmd.c"> RelativePath=".\..\src\clear_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\disaster_cmd.c"> RelativePath=".\..\src\disaster_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\dummy_land.c"> RelativePath=".\..\src\dummy_land.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\industry_cmd.c"> RelativePath=".\..\src\industry_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\misc_cmd.c"> RelativePath=".\..\src\misc_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\order_cmd.c"> RelativePath=".\..\src\order_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\rail_cmd.c"> RelativePath=".\..\src\rail_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\road_cmd.c"> RelativePath=".\..\src\road_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\roadveh_cmd.c"> RelativePath=".\..\src\roadveh_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ship_cmd.c"> RelativePath=".\..\src\ship_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\station_cmd.c"> RelativePath=".\..\src\station_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\town_cmd.c"> RelativePath=".\..\src\town_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\train_cmd.c"> RelativePath=".\..\src\train_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tree_cmd.c"> RelativePath=".\..\src\tree_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tunnelbridge_cmd.c"> RelativePath=".\..\src\tunnelbridge_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\unmovable_cmd.c"> RelativePath=".\..\src\unmovable_cmd.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\water_cmd.c"> RelativePath=".\..\src\water_cmd.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
@ -1184,57 +1184,57 @@
Name="AI Files" Name="AI Files"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\ai\ai.c"> RelativePath=".\..\src\ai\ai.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\default\default.c"> RelativePath=".\..\src\ai\default\default.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\build.c"> RelativePath=".\..\src\ai\trolly\build.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\pathfinder.c"> RelativePath=".\..\src\ai\trolly\pathfinder.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\shared.c"> RelativePath=".\..\src\ai\trolly\shared.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\ai\trolly\trolly.c"> RelativePath=".\..\src\ai\trolly\trolly.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="NewGRF" Name="NewGRF"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\newgrf.c"> RelativePath=".\..\src\newgrf.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_cargo.c"> RelativePath=".\..\src\newgrf_cargo.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_config.c"> RelativePath=".\..\src\newgrf_config.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_engine.c"> RelativePath=".\..\src\newgrf_engine.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_sound.c"> RelativePath=".\..\src\newgrf_sound.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_spritegroup.c"> RelativePath=".\..\src\newgrf_spritegroup.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_station.c"> RelativePath=".\..\src\newgrf_station.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\newgrf_text.c"> RelativePath=".\..\src\newgrf_text.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Map Accessors" Name="Map Accessors"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\bridge_map.c"> RelativePath=".\..\src\bridge_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\bridge_map.h"> RelativePath=".\..\src\bridge_map.h">
@ -1249,13 +1249,13 @@
RelativePath=".\..\src\rail_map.h"> RelativePath=".\..\src\rail_map.h">
</File> </File>
<File <File
RelativePath=".\..\src\road_map.c"> RelativePath=".\..\src\road_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\road_map.h"> RelativePath=".\..\src\road_map.h">
</File> </File>
<File <File
RelativePath=".\..\src\station_map.c"> RelativePath=".\..\src\station_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\station_map.h"> RelativePath=".\..\src\station_map.h">
@ -1267,7 +1267,7 @@
RelativePath=".\..\src\tree_map.h"> RelativePath=".\..\src\tree_map.h">
</File> </File>
<File <File
RelativePath=".\..\src\tunnel_map.c"> RelativePath=".\..\src\tunnel_map.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\tunnel_map.h"> RelativePath=".\..\src\tunnel_map.h">
@ -1374,16 +1374,16 @@
Name="Video" Name="Video"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\video\dedicated_v.c"> RelativePath=".\..\src\video\dedicated_v.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\video\null_v.c"> RelativePath=".\..\src\video\null_v.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\video\sdl_v.c"> RelativePath=".\..\src\video\sdl_v.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\video\win32_v.c"> RelativePath=".\..\src\video\win32_v.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
@ -1393,23 +1393,23 @@
RelativePath=".\..\src\music\dmusic.cpp"> RelativePath=".\..\src\music\dmusic.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music\null_m.c"> RelativePath=".\..\src\music\null_m.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\music\win32_m.c"> RelativePath=".\..\src\music\win32_m.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Sound" Name="Sound"
Filter=""> Filter="">
<File <File
RelativePath=".\..\src\sound\null_s.c"> RelativePath=".\..\src\sound\null_s.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sound\sdl_s.c"> RelativePath=".\..\src\sound\sdl_s.cpp">
</File> </File>
<File <File
RelativePath=".\..\src\sound\win32_s.c"> RelativePath=".\..\src\sound\win32_s.cpp">
</File> </File>
</Filter> </Filter>
<Filter <Filter

View File

@ -80,10 +80,10 @@
Name="Source Files" Name="Source Files"
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"> Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
<File <File
RelativePath="..\src\strgen\strgen.c"> RelativePath="..\src\strgen\strgen.cpp">
</File> </File>
<File <File
RelativePath="..\src\string.c"> RelativePath="..\src\string.cpp">
<FileConfiguration <FileConfiguration
Name="Release|Win32"> Name="Release|Win32">
<Tool <Tool

View File

@ -114,11 +114,11 @@
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
> >
<File <File
RelativePath="..\src\strgen\strgen.c" RelativePath="..\src\strgen\strgen.cpp"
> >
</File> </File>
<File <File
RelativePath="..\src\string.c" RelativePath="..\src\string.cpp"
> >
<FileConfiguration <FileConfiguration
Name="Release|Win32"> Name="Release|Win32">

View File

@ -1,86 +1,86 @@
# Source Files # Source Files
airport.c airport.cpp
aystar.c aystar.cpp
bmp.c bmp.cpp
callback_table.c callback_table.cpp
command.c command.cpp
console.c console.cpp
console_cmds.c console_cmds.cpp
currency.c currency.cpp
date.c date.cpp
debug.c debug.cpp
dedicated.c dedicated.cpp
depot.c depot.cpp
driver.c driver.cpp
economy.c economy.cpp
elrail.c elrail.cpp
engine.c engine.cpp
fileio.c fileio.cpp
fios.c fios.cpp
fontcache.c fontcache.cpp
genworld.c genworld.cpp
gfx.c gfx.cpp
gfxinit.c gfxinit.cpp
heightmap.c heightmap.cpp
helpers.cpp helpers.cpp
landscape.c landscape.cpp
map.c map.cpp
md5.c md5.cpp
mersenne.c mersenne.cpp
minilzo.c minilzo.cpp
misc.c misc.cpp
mixer.c mixer.cpp
music.c music.cpp
namegen.c namegen.cpp
network/core/core.c network/core/core.cpp
network/core/packet.c network/core/packet.cpp
network/core/tcp.c network/core/tcp.cpp
network/core/udp.c network/core/udp.cpp
network/network.c network/network.cpp
network/network_client.c network/network_client.cpp
network/network_data.c network/network_data.cpp
network/network_gamelist.c network/network_gamelist.cpp
network/network_server.c network/network_server.cpp
network/network_udp.c network/network_udp.cpp
npf.c npf.cpp
oldloader.c oldloader.cpp
oldpool.c oldpool.cpp
openttd.c openttd.cpp
os_timer.c os_timer.cpp
#if WIN32 #if WIN32
ottdres.rc ottdres.rc
#end #end
pathfind.c pathfind.cpp
players.c players.cpp
queue.c queue.cpp
rail.c rail.cpp
saveload.c saveload.cpp
screenshot.c screenshot.cpp
#if SDL #if SDL
sdl.c sdl.cpp
#end #end
settings.c settings.cpp
signs.c signs.cpp
sound.c sound.cpp
spritecache.c spritecache.cpp
string.c string.cpp
strings.c strings.cpp
texteff.c texteff.cpp
tgp.c tgp.cpp
thread.c thread.cpp
tile.c tile.cpp
#if WIN32 #if WIN32
#else #else
unix.c unix.cpp
#end #end
vehicle.c vehicle.cpp
viewport.c viewport.cpp
waypoint.c waypoint.cpp
widget.c widget.cpp
#if WIN32 #if WIN32
win32.c win32.cpp
#end #end
window.c window.cpp
# Header Files # Header Files
airport.h airport.h
@ -178,57 +178,57 @@ video/win32_v.h
window.h window.h
# GUI Source Code # GUI Source Code
aircraft_gui.c aircraft_gui.cpp
airport_gui.c airport_gui.cpp
bridge_gui.c bridge_gui.cpp
build_vehicle_gui.c build_vehicle_gui.cpp
depot_gui.c depot_gui.cpp
dock_gui.c dock_gui.cpp
engine_gui.c engine_gui.cpp
genworld_gui.c genworld_gui.cpp
graph_gui.c graph_gui.cpp
industry_gui.c industry_gui.cpp
intro_gui.c intro_gui.cpp
main_gui.c main_gui.cpp
misc_gui.c misc_gui.cpp
music_gui.c music_gui.cpp
network/network_gui.c network/network_gui.cpp
newgrf_gui.c newgrf_gui.cpp
news_gui.c news_gui.cpp
order_gui.c order_gui.cpp
player_gui.c player_gui.cpp
rail_gui.c rail_gui.cpp
road_gui.c road_gui.cpp
roadveh_gui.c roadveh_gui.cpp
settings_gui.c settings_gui.cpp
ship_gui.c ship_gui.cpp
smallmap_gui.c smallmap_gui.cpp
station_gui.c station_gui.cpp
subsidy_gui.c subsidy_gui.cpp
terraform_gui.c terraform_gui.cpp
town_gui.c town_gui.cpp
train_gui.c train_gui.cpp
vehicle_gui.c vehicle_gui.cpp
# Landscape # Landscape
aircraft_cmd.c aircraft_cmd.cpp
clear_cmd.c clear_cmd.cpp
disaster_cmd.c disaster_cmd.cpp
dummy_land.c dummy_land.cpp
industry_cmd.c industry_cmd.cpp
misc_cmd.c misc_cmd.cpp
order_cmd.c order_cmd.cpp
rail_cmd.c rail_cmd.cpp
road_cmd.c road_cmd.cpp
roadveh_cmd.c roadveh_cmd.cpp
ship_cmd.c ship_cmd.cpp
station_cmd.c station_cmd.cpp
town_cmd.c town_cmd.cpp
train_cmd.c train_cmd.cpp
tree_cmd.c tree_cmd.cpp
tunnelbridge_cmd.c tunnelbridge_cmd.cpp
unmovable_cmd.c unmovable_cmd.cpp
water_cmd.c water_cmd.cpp
# Tables # Tables
table/ai_rail.h table/ai_rail.h
@ -259,36 +259,36 @@ table/unmovable_land.h
table/water_land.h table/water_land.h
# AI Files # AI Files
ai/ai.c ai/ai.cpp
ai/default/default.c ai/default/default.cpp
ai/trolly/build.c ai/trolly/build.cpp
ai/trolly/pathfinder.c ai/trolly/pathfinder.cpp
ai/trolly/shared.c ai/trolly/shared.cpp
ai/trolly/trolly.c ai/trolly/trolly.cpp
# NewGRF # NewGRF
newgrf.c newgrf.cpp
newgrf_cargo.c newgrf_cargo.cpp
newgrf_config.c newgrf_config.cpp
newgrf_engine.c newgrf_engine.cpp
newgrf_sound.c newgrf_sound.cpp
newgrf_spritegroup.c newgrf_spritegroup.cpp
newgrf_station.c newgrf_station.cpp
newgrf_text.c newgrf_text.cpp
# Map Accessors # Map Accessors
bridge_map.c bridge_map.cpp
bridge_map.h bridge_map.h
clear_map.h clear_map.h
industry_map.h industry_map.h
rail_map.h rail_map.h
road_map.c road_map.cpp
road_map.h road_map.h
station_map.c station_map.cpp
station_map.h station_map.h
town_map.h town_map.h
tree_map.h tree_map.h
tunnel_map.c tunnel_map.cpp
tunnel_map.h tunnel_map.h
unmovable_map.h unmovable_map.h
void_map.h void_map.h
@ -325,36 +325,36 @@ yapf/yapf_settings.h
yapf/yapf_ship.cpp yapf/yapf_ship.cpp
# Video # Video
video/dedicated_v.c video/dedicated_v.cpp
video/null_v.c video/null_v.cpp
#if SDL #if SDL
video/sdl_v.c video/sdl_v.cpp
#end #end
#if WIN32 #if WIN32
video/win32_v.c video/win32_v.cpp
#end #end
# Music # Music
#if DIRECTMUSIC #if DIRECTMUSIC
music/dmusic.cpp music/dmusic.cpp
#end #end
music/null_m.c music/null_m.cpp
#if WIN32 #if WIN32
music/win32_m.c music/win32_m.cpp
#else #else
music/extmidi.c music/extmidi.cpp
#end #end
#if BEOS #if BEOS
music/bemidi.cpp music/bemidi.cpp
#end #end
# Sound # Sound
sound/null_s.c sound/null_s.cpp
#if SDL #if SDL
sound/sdl_s.c sound/sdl_s.cpp
#end #end
#if WIN32 #if WIN32
sound/win32_s.c sound/win32_s.cpp
#end #end
#if OSX #if OSX
@ -363,12 +363,12 @@ sound/null_s.c
#if DEDICATED #if DEDICATED
#else #else
music/qtmidi.c music/qtmidi.cpp
#end #end
#if COCOA #if COCOA
video/cocoa_v.m video/cocoa_v.m
sound/cocoa_s.c sound/cocoa_s.cpp
os/macosx/splash.c os/macosx/splash.cpp
#end #end
#end #end

View File

@ -5,6 +5,7 @@
#include "../variables.h" #include "../variables.h"
#include "../command.h" #include "../command.h"
#include "../network/network.h" #include "../network/network.h"
#include "../helpers.hpp"
#include "ai.h" #include "ai.h"
#include "default/default.h" #include "default/default.h"
@ -50,11 +51,11 @@ static void AI_PutCommandInQueue(PlayerID player, TileIndex tile, uint32 p1, uin
if (_ai_player[player].queue_tail == NULL) { if (_ai_player[player].queue_tail == NULL) {
/* There is no item in the queue yet, create the queue */ /* There is no item in the queue yet, create the queue */
_ai_player[player].queue = malloc(sizeof(AICommand)); MallocT(&_ai_player[player].queue, 1);
_ai_player[player].queue_tail = _ai_player[player].queue; _ai_player[player].queue_tail = _ai_player[player].queue;
} else { } else {
/* Add an item at the end */ /* Add an item at the end */
_ai_player[player].queue_tail->next = malloc(sizeof(AICommand)); MallocT(&_ai_player[player].queue_tail->next, 1);
_ai_player[player].queue_tail = _ai_player[player].queue_tail->next; _ai_player[player].queue_tail = _ai_player[player].queue_tail->next;
} }

View File

@ -26,6 +26,7 @@
#include "../../variables.h" #include "../../variables.h"
#include "../../bridge.h" #include "../../bridge.h"
#include "../../date.h" #include "../../date.h"
#include "../../helpers.hpp"
#include "default.h" #include "default.h"
// remove some day perhaps? // remove some day perhaps?
@ -63,10 +64,10 @@ enum {
#include "../../table/ai_rail.h" #include "../../table/ai_rail.h"
static byte GetRailTrackStatus(TileIndex tile) static TrackBits GetRailTrackStatus(TileIndex tile)
{ {
uint32 r = GetTileTrackStatus(tile, TRANSPORT_RAIL); uint32 r = GetTileTrackStatus(tile, TRANSPORT_RAIL);
return (byte) (r | r >> 8); return (TrackBits)(byte) (r | r >> 8);
} }
@ -644,8 +645,8 @@ static bool AiCheckIfRouteIsGood(Player *p, FoundRoute *fr, byte bitmask)
} }
if (fr->cargo == CT_PASSENGERS || fr->cargo == CT_MAIL) { if (fr->cargo == CT_PASSENGERS || fr->cargo == CT_MAIL) {
const Town* from = fr->from; const Town* from = (const Town*)fr->from;
const Town* to = fr->to; const Town* to = (const Town*)fr->to;
if (from->pct_pass_transported > 0x99 || if (from->pct_pass_transported > 0x99 ||
to->pct_pass_transported > 0x99) { to->pct_pass_transported > 0x99) {
@ -783,7 +784,7 @@ static void AiWantLongIndustryRoute(Player *p)
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -851,7 +852,7 @@ static void AiWantMediumIndustryRoute(Player *p)
p->ai.order_list_blocks[1] = 1; p->ai.order_list_blocks[1] = 1;
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -919,7 +920,7 @@ static void AiWantShortIndustryRoute(Player *p)
p->ai.order_list_blocks[1] = 1; p->ai.order_list_blocks[1] = 1;
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1020,7 +1021,7 @@ static void AiWantMailRoute(Player *p)
p->ai.order_list_blocks[1] = 1; p->ai.order_list_blocks[1] = 1;
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1089,7 +1090,7 @@ static void AiWantPassengerRoute(Player *p)
p->ai.order_list_blocks[1] = 1; p->ai.order_list_blocks[1] = 1;
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_RAIL_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1164,7 +1165,7 @@ static void AiWantLongRoadIndustryRoute(Player *p)
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1220,7 +1221,7 @@ static void AiWantMediumRoadIndustryRoute(Player *p)
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1278,7 +1279,7 @@ static void AiWantLongRoadPassengerRoute(Player *p)
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1334,7 +1335,7 @@ static void AiWantPassengerRouteInsideTown(Player *p)
p->ai.order_list_blocks[2] = 255; p->ai.order_list_blocks[2] = 255;
p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS; p->ai.state = AIS_BUILD_DEFAULT_ROAD_BLOCKS;
p->ai.state_mode = -1; p->ai.state_mode = UCHAR_MAX;
p->ai.state_counter = 0; p->ai.state_counter = 0;
p->ai.timeout_counter = 0; p->ai.timeout_counter = 0;
} }
@ -1852,7 +1853,7 @@ static bool AiDoFollowTrack(const Player* p)
arpfd.tile2 = p->ai.cur_tile_a; arpfd.tile2 = p->ai.cur_tile_a;
arpfd.flag = false; arpfd.flag = false;
arpfd.count = 0; arpfd.count = 0;
FollowTrack(p->ai.cur_tile_a + TileOffsByDiagDir(p->ai.cur_dir_a), 0x2000 | TRANSPORT_RAIL, p->ai.cur_dir_a^2, FollowTrack(p->ai.cur_tile_a + TileOffsByDiagDir(p->ai.cur_dir_a), 0x2000 | TRANSPORT_RAIL, (DiagDirection)(p->ai.cur_dir_a^2),
(TPFEnumProc*)AiEnumFollowTrack, NULL, &arpfd); (TPFEnumProc*)AiEnumFollowTrack, NULL, &arpfd);
return arpfd.count > 8; return arpfd.count > 8;
} }
@ -1941,7 +1942,7 @@ static bool AiCheckRailPathBetter(AiRailFinder *arf, const byte *p)
} }
} }
arf->recursive_mode = 0; arf->recursive_mode = 0;
arf->cur_best_dist = (uint)-1; arf->cur_best_dist = UINT_MAX;
arf->cur_best_depth = 0xff; arf->cur_best_depth = 0xff;
return better; return better;
@ -2185,7 +2186,7 @@ static bool AiRemoveTileAndGoForward(Player *p)
} else { } else {
// Check if the bridge points in the right direction. // Check if the bridge points in the right direction.
// This is not really needed the first place AiRemoveTileAndGoForward is called. // This is not really needed the first place AiRemoveTileAndGoForward is called.
if (DiagDirToAxis(GetBridgeRampDirection(tile)) != (p->ai.cur_dir_a & 1U)) return false; if (DiagDirToAxis(GetBridgeRampDirection(tile)) != (p->ai.cur_dir_a & 1)) return false;
tile = GetOtherBridgeEnd(tile); tile = GetOtherBridgeEnd(tile);
@ -2820,7 +2821,7 @@ static bool AiCheckRoadFinished(Player *p)
are.best_dist = (uint)-1; are.best_dist = (uint)-1;
for_each_bit(i, bits) { for_each_bit(i, bits) {
FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, _dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are); FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
} }
if (DistanceManhattan(tile, are.dest) <= are.best_dist) return false; if (DistanceManhattan(tile, are.dest) <= are.best_dist) return false;
@ -3583,7 +3584,7 @@ static void AiStateRemoveStation(Player *p)
p->ai.state = AIS_1; p->ai.state = AIS_1;
// Get a list of all stations that are in use by a vehicle // Get a list of all stations that are in use by a vehicle
in_use = malloc(GetMaxStationIndex() + 1); MallocT(&in_use, GetMaxStationIndex() + 1);
memset(in_use, 0, GetMaxStationIndex() + 1); memset(in_use, 0, GetMaxStationIndex() + 1);
FOR_ALL_ORDERS(ord) { FOR_ALL_ORDERS(ord) {
if (ord->type == OT_GOTO_STATION) in_use[ord->dest] = 1; if (ord->type == OT_GOTO_STATION) in_use[ord->dest] = 1;
@ -3705,7 +3706,7 @@ pos_3:
return; return;
} }
rails = 0; rails = TRACK_BIT_NONE;
switch (GetBridgeRampDirection(tile)) { switch (GetBridgeRampDirection(tile)) {
default: default:
@ -3798,7 +3799,6 @@ static void AiHandleTakeover(Player *p)
uint asked = p->bankrupt_asked; uint asked = p->bankrupt_asked;
Player *pp, *best_pl = NULL; Player *pp, *best_pl = NULL;
int32 best_val = -1; int32 best_val = -1;
uint old_p;
// Ask the guy with the highest performance hist. // Ask the guy with the highest performance hist.
FOR_ALL_PLAYERS(pp) { FOR_ALL_PLAYERS(pp) {
@ -3830,7 +3830,7 @@ static void AiHandleTakeover(Player *p)
// Too little money for computer to buy it? // Too little money for computer to buy it?
if (best_pl->player_money >> 1 >= p->bankrupt_value) { if (best_pl->player_money >> 1 >= p->bankrupt_value) {
// Computer wants to buy it. // Computer wants to buy it.
old_p = _current_player; PlayerID old_p = _current_player;
_current_player = p->index; _current_player = p->index;
DoCommand(0, old_p, 0, DC_EXEC, CMD_BUY_COMPANY); DoCommand(0, old_p, 0, DC_EXEC, CMD_BUY_COMPANY);
_current_player = old_p; _current_player = old_p;

View File

@ -57,7 +57,7 @@ static bool IsRoad(TileIndex tile)
// Check if the current tile is in our end-area // Check if the current tile is in our end-area
static int32 AyStar_AiPathFinder_EndNodeCheck(AyStar *aystar, OpenListNode *current) static int32 AyStar_AiPathFinder_EndNodeCheck(AyStar *aystar, OpenListNode *current)
{ {
const Ai_PathFinderInfo* PathFinderInfo = aystar->user_target; const Ai_PathFinderInfo* PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
// It is not allowed to have a station on the end of a bridge or tunnel ;) // It is not allowed to have a station on the end of a bridge or tunnel ;)
if (current->path.node.user_data[0] != 0) return AYSTAR_DONE; if (current->path.node.user_data[0] != 0) return AYSTAR_DONE;
@ -82,7 +82,7 @@ static uint AiPathFinder_Hash(uint key1, uint key2)
static void AyStar_AiPathFinder_Free(AyStar *aystar) static void AyStar_AiPathFinder_Free(AyStar *aystar)
{ {
AyStarMain_Free(aystar); AyStarMain_Free(aystar);
free(aystar); delete aystar;
} }
@ -99,7 +99,7 @@ AyStar *new_AyStar_AiPathFinder(int max_tiles_around, Ai_PathFinderInfo *PathFin
uint x; uint x;
uint y; uint y;
// Create AyStar // Create AyStar
AyStar *result = malloc(sizeof(AyStar)); AyStar *result = new AyStar();
init_AyStar(result, AiPathFinder_Hash, 1 << 10); init_AyStar(result, AiPathFinder_Hash, 1 << 10);
// Set the function pointers // Set the function pointers
result->CalculateG = AyStar_AiPathFinder_CalculateG; result->CalculateG = AyStar_AiPathFinder_CalculateG;
@ -170,7 +170,7 @@ void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo
// The h-value, simple calculation // The h-value, simple calculation
static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current, OpenListNode *parent) static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current, OpenListNode *parent)
{ {
const Ai_PathFinderInfo* PathFinderInfo = aystar->user_target; const Ai_PathFinderInfo* PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
int r, r2; int r, r2;
if (PathFinderInfo->end_direction != AI_PATHFINDER_NO_DIRECTION) { if (PathFinderInfo->end_direction != AI_PATHFINDER_NO_DIRECTION) {
@ -214,7 +214,6 @@ static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *curre
// What tiles are around us. // What tiles are around us.
static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current) static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current)
{ {
uint i;
int ret; int ret;
int dir; int dir;
@ -223,7 +222,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
aystar->num_neighbours = 0; aystar->num_neighbours = 0;
// Go through all surrounding tiles and check if they are within the limits // Go through all surrounding tiles and check if they are within the limits
for (i = 0; i < 4; i++) { for (DiagDirection i = DIAGDIR_BEGIN; i < DIAGDIR_END; i++) {
TileIndex ctile = current->path.node.tile; // Current tile TileIndex ctile = current->path.node.tile; // Current tile
TileIndex atile = ctile + TileOffsByDiagDir(i); // Adjacent tile TileIndex atile = ctile + TileOffsByDiagDir(i); // Adjacent tile
@ -238,7 +237,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
if (IsTunnel(atile)) { if (IsTunnel(atile)) {
if (GetTunnelDirection(atile) != i) continue; if (GetTunnelDirection(atile) != i) continue;
} else { } else {
if ((_m[atile].m5 & 1U) != DiagDirToAxis(i)) continue; if ((_m[atile].m5 & 1) != DiagDirToAxis(i)) continue;
} }
} }
} }
@ -246,7 +245,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
if (!PathFinderInfo->rail_or_road && IsRoad(ctile)) { if (!PathFinderInfo->rail_or_road && IsRoad(ctile)) {
if (IsTileType(ctile, MP_TUNNELBRIDGE)) { if (IsTileType(ctile, MP_TUNNELBRIDGE)) {
// An existing bridge/tunnel... let's test the direction ;) // An existing bridge/tunnel... let's test the direction ;)
if ((_m[ctile].m5 & 1U) != (i & 1)) continue; if ((_m[ctile].m5 & 1) != (i & 1)) continue;
} }
} }
@ -254,7 +253,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
(AI_PATHFINDER_FLAG_TUNNEL & current->path.node.user_data[0]) != 0) { (AI_PATHFINDER_FLAG_TUNNEL & current->path.node.user_data[0]) != 0) {
// We are a bridge/tunnel, how cool!! // We are a bridge/tunnel, how cool!!
// This means we can only point forward.. get the direction from the user_data // This means we can only point forward.. get the direction from the user_data
if (i != (current->path.node.user_data[0] >> 8)) continue; if ((uint)i != (current->path.node.user_data[0] >> 8)) continue;
} }
dir = 0; dir = 0;
@ -371,7 +370,7 @@ static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *curr
extern uint GetRailFoundation(Slope tileh, TrackBits bits); // XXX function declaration in .c extern uint GetRailFoundation(Slope tileh, TrackBits bits); // XXX function declaration in .c
extern uint GetRoadFoundation(Slope tileh, uint bits); // XXX function declaration in .c extern uint GetRoadFoundation(Slope tileh, RoadBits bits); // XXX function declaration in .c
extern uint GetBridgeFoundation(Slope tileh, Axis); // XXX function declaration in .c extern uint GetBridgeFoundation(Slope tileh, Axis); // XXX function declaration in .c
enum { enum {
BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12, BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12,
@ -417,7 +416,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
// Skip if the tile was from a bridge or tunnel // Skip if the tile was from a bridge or tunnel
if (parent->path.node.user_data[0] == 0 && current->user_data[0] == 0) { if (parent->path.node.user_data[0] == 0 && current->user_data[0] == 0) {
if (PathFinderInfo->rail_or_road) { if (PathFinderInfo->rail_or_road) {
r = GetRailFoundation(parent_tileh, 1 << AiNew_GetRailDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile)); r = GetRailFoundation(parent_tileh, (TrackBits)(1 << AiNew_GetRailDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile)));
// Maybe is BRIDGE_NO_FOUNDATION a bit strange here, but it contains just the right information.. // Maybe is BRIDGE_NO_FOUNDATION a bit strange here, but it contains just the right information..
if (r >= 15 || (r == 0 && HASBIT(BRIDGE_NO_FOUNDATION, tileh))) { if (r >= 15 || (r == 0 && HASBIT(BRIDGE_NO_FOUNDATION, tileh))) {
res += AI_PATHFINDER_TILE_GOES_UP_PENALTY; res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
@ -426,7 +425,7 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
} }
} else { } else {
if (!IsRoad(parent->path.node.tile) || !IsTileType(parent->path.node.tile, MP_TUNNELBRIDGE)) { if (!IsRoad(parent->path.node.tile) || !IsTileType(parent->path.node.tile, MP_TUNNELBRIDGE)) {
r = GetRoadFoundation(parent_tileh, AiNew_GetRoadDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile)); r = GetRoadFoundation(parent_tileh, (RoadBits)AiNew_GetRoadDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile));
if (r >= 15 || r == 0) { if (r >= 15 || r == 0) {
res += AI_PATHFINDER_TILE_GOES_UP_PENALTY; res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
} else { } else {
@ -452,13 +451,13 @@ static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current,
// Check if we are going up or down, first for the starting point // Check if we are going up or down, first for the starting point
// In user_data[0] is at the 8th bit the direction // In user_data[0] is at the 8th bit the direction
if (!HASBIT(BRIDGE_NO_FOUNDATION, parent_tileh)) { if (!HASBIT(BRIDGE_NO_FOUNDATION, parent_tileh)) {
if (GetBridgeFoundation(parent_tileh, (current->user_data[0] >> 8) & 1) < 15) { if (GetBridgeFoundation(parent_tileh, (Axis)((current->user_data[0] >> 8) & 1)) < 15) {
res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY; res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
} }
} }
// Second for the end point // Second for the end point
if (!HASBIT(BRIDGE_NO_FOUNDATION, tileh)) { if (!HASBIT(BRIDGE_NO_FOUNDATION, tileh)) {
if (GetBridgeFoundation(tileh, (current->user_data[0] >> 8) & 1) < 15) { if (GetBridgeFoundation(tileh, (Axis)((current->user_data[0] >> 8) & 1)) < 15) {
res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY; res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
} }
} }

View File

@ -794,7 +794,7 @@ static void AiNew_State_FindDepot(Player *p)
for (i=2;i<p->ainew.path_info.route_length-2;i++) { for (i=2;i<p->ainew.path_info.route_length-2;i++) {
tile = p->ainew.path_info.route[i]; tile = p->ainew.path_info.route[i];
for (j = 0; j < 4; j++) { for (j = DIAGDIR_BEGIN; j < DIAGDIR_END; j++) {
TileIndex t = tile + TileOffsByDiagDir(j); TileIndex t = tile + TileOffsByDiagDir(j);
if (IsTileType(t, MP_STREET) && if (IsTileType(t, MP_STREET) &&
@ -825,7 +825,7 @@ static void AiNew_State_FindDepot(Player *p)
tile = p->ainew.path_info.route[i]; tile = p->ainew.path_info.route[i];
for (j = 0; j < 4; j++) { for (j = DIAGDIR_BEGIN; j < DIAGDIR_END; j++) {
TileIndex t = tile + TileOffsByDiagDir(j); TileIndex t = tile + TileOffsByDiagDir(j);
// It may not be placed on the road/rail itself // It may not be placed on the road/rail itself
@ -901,7 +901,8 @@ static int AiNew_HowManyVehicles(Player *p)
} }
// This is because moving 60% is more than we can dream of! // This is because moving 60% is more than we can dream of!
max_cargo *= 0.6; max_cargo *= 6;
max_cargo /= 10;
// We want all the cargo to be gone in a month.. so, we know the cargo it delivers // We want all the cargo to be gone in a month.. so, we know the cargo it delivers
// we know what the vehicle takes with him, and we know the time it takes him // we know what the vehicle takes with him, and we know the time it takes him
// to get back here.. now let's do some math! // to get back here.. now let's do some math!
@ -1051,7 +1052,7 @@ static void AiNew_State_BuildPath(Player *p)
dir3 = p->ainew.to_direction; dir3 = p->ainew.to_direction;
} }
ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir(dir1)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir((DiagDirection)dir1)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
if (!CmdFailed(ret)) { if (!CmdFailed(ret)) {
dir1 = TileOffsByDiagDir(dir1); dir1 = TileOffsByDiagDir(dir1);
if (IsTileType(tile + dir1, MP_CLEAR) || IsTileType(tile + dir1, MP_TREES)) { if (IsTileType(tile + dir1, MP_CLEAR) || IsTileType(tile + dir1, MP_TREES)) {
@ -1063,7 +1064,7 @@ static void AiNew_State_BuildPath(Player *p)
} }
} }
ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir(dir2)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir((DiagDirection)dir2)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
if (!CmdFailed(ret)) { if (!CmdFailed(ret)) {
dir2 = TileOffsByDiagDir(dir2); dir2 = TileOffsByDiagDir(dir2);
if (IsTileType(tile + dir2, MP_CLEAR) || IsTileType(tile + dir2, MP_TREES)) { if (IsTileType(tile + dir2, MP_CLEAR) || IsTileType(tile + dir2, MP_TREES)) {
@ -1075,7 +1076,7 @@ static void AiNew_State_BuildPath(Player *p)
} }
} }
ret = AI_DoCommand(tile, DiagDirToRoadBits(dir3), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD); ret = AI_DoCommand(tile, DiagDirToRoadBits((DiagDirection)dir3), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
if (!CmdFailed(ret)) { if (!CmdFailed(ret)) {
dir3 = TileOffsByDiagDir(dir3); dir3 = TileOffsByDiagDir(dir3);
if (IsTileType(tile + dir3, MP_CLEAR) || IsTileType(tile + dir3, MP_TREES)) { if (IsTileType(tile + dir3, MP_CLEAR) || IsTileType(tile + dir3, MP_TREES)) {

View File

@ -246,7 +246,7 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
v->unitnumber = unit_num; v->unitnumber = unit_num;
v->type = u->type = VEH_Aircraft; v->type = u->type = VEH_Aircraft;
v->direction = 3; v->direction = DIR_SE;
v->owner = u->owner = _current_player; v->owner = u->owner = _current_player;
@ -382,7 +382,7 @@ int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
u->next = w; u->next = w;
w->type = VEH_Aircraft; w->type = VEH_Aircraft;
w->direction = 0; w->direction = DIR_N;
w->owner = _current_player; w->owner = _current_player;
w->x_pos = v->x_pos; w->x_pos = v->x_pos;
w->y_pos = v->y_pos; w->y_pos = v->y_pos;
@ -907,7 +907,8 @@ static bool AircraftController(Vehicle *v)
Station *st; Station *st;
const AirportMovingData *amd; const AirportMovingData *amd;
Vehicle *u; Vehicle *u;
byte z,newdir,maxz,curz; byte z, maxz, curz;
Direction newdir;
GetNewVehiclePosResult gp; GetNewVehiclePosResult gp;
uint dist; uint dist;
int x,y; int x,y;
@ -1419,7 +1420,7 @@ static void AircraftLeaveHangar(Vehicle *v)
v->cur_speed = 0; v->cur_speed = 0;
v->subspeed = 0; v->subspeed = 0;
v->progress = 0; v->progress = 0;
v->direction = 3; v->direction = DIR_SE;
v->vehstatus &= ~VS_HIDDEN; v->vehstatus &= ~VS_HIDDEN;
{ {
Vehicle *u = v->next; Vehicle *u = v->next;

View File

@ -9,6 +9,7 @@
#include "variables.h" #include "variables.h"
#include "airport_movement.h" #include "airport_movement.h"
#include "date.h" #include "date.h"
#include "helpers.hpp"
/* Uncomment this to print out a full report of the airport-structure /* Uncomment this to print out a full report of the airport-structure
* You should either use * You should either use
@ -30,7 +31,7 @@ static AirportFTAClass *HeliStation;
static void AirportFTAClass_Constructor(AirportFTAClass *apc, static void AirportFTAClass_Constructor(AirportFTAClass *apc,
const byte *terminals, const byte *helipads, const byte *terminals, const byte *helipads,
const byte entry_point, const byte acc_planes, const byte entry_point, const AcceptPlanes acc_planes,
const AirportFTAbuildup *apFA, const AirportFTAbuildup *apFA,
const TileIndexDiffC *depots, const byte nof_depots, const TileIndexDiffC *depots, const byte nof_depots,
uint size_x, uint size_y uint size_x, uint size_y
@ -49,7 +50,7 @@ static void AirportPrintOut(const AirportFTAClass *apc, bool full_report);
void InitializeAirports(void) void InitializeAirports(void)
{ {
// country airport // country airport
CountryAirport = malloc(sizeof(AirportFTAClass)); MallocT(&CountryAirport, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
CountryAirport, CountryAirport,
@ -64,7 +65,7 @@ void InitializeAirports(void)
); );
// city airport // city airport
CityAirport = malloc(sizeof(AirportFTAClass)); MallocT(&CityAirport, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
CityAirport, CityAirport,
@ -79,7 +80,7 @@ void InitializeAirports(void)
); );
// metropolitan airport // metropolitan airport
MetropolitanAirport = malloc(sizeof(AirportFTAClass)); MallocT(&MetropolitanAirport, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
MetropolitanAirport, MetropolitanAirport,
@ -94,7 +95,7 @@ void InitializeAirports(void)
); );
// international airport // international airport
InternationalAirport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass)); MallocT(&InternationalAirport, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
InternationalAirport, InternationalAirport,
@ -109,7 +110,7 @@ void InitializeAirports(void)
); );
// intercontintental airport // intercontintental airport
IntercontinentalAirport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass)); MallocT(&IntercontinentalAirport, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
IntercontinentalAirport, IntercontinentalAirport,
@ -124,7 +125,7 @@ void InitializeAirports(void)
); );
// heliport, oilrig // heliport, oilrig
Heliport = (AirportFTAClass *)malloc(sizeof(AirportFTAClass)); MallocT(&Heliport, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
Heliport, Heliport,
@ -141,7 +142,7 @@ void InitializeAirports(void)
Oilrig = Heliport; // exactly the same structure for heliport/oilrig, so share state machine Oilrig = Heliport; // exactly the same structure for heliport/oilrig, so share state machine
// commuter airport // commuter airport
CommuterAirport = malloc(sizeof(AirportFTAClass)); MallocT(&CommuterAirport, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
CommuterAirport, CommuterAirport,
@ -156,7 +157,7 @@ void InitializeAirports(void)
); );
// helidepot airport // helidepot airport
HeliDepot = malloc(sizeof(AirportFTAClass)); MallocT(&HeliDepot, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
HeliDepot, HeliDepot,
@ -171,7 +172,7 @@ void InitializeAirports(void)
); );
// helistation airport // helistation airport
HeliStation = malloc(sizeof(AirportFTAClass)); MallocT(&HeliStation, 1);
AirportFTAClass_Constructor( AirportFTAClass_Constructor(
HeliStation, HeliStation,
@ -202,7 +203,7 @@ void UnInitializeAirports(void)
static void AirportFTAClass_Constructor(AirportFTAClass *apc, static void AirportFTAClass_Constructor(AirportFTAClass *apc,
const byte *terminals, const byte *helipads, const byte *terminals, const byte *helipads,
const byte entry_point, const byte acc_planes, const byte entry_point, const AcceptPlanes acc_planes,
const AirportFTAbuildup *apFA, const AirportFTAbuildup *apFA,
const TileIndexDiffC *depots, const byte nof_depots, const TileIndexDiffC *depots, const byte nof_depots,
uint size_x, uint size_y uint size_x, uint size_y
@ -323,7 +324,8 @@ static byte AirportGetTerminalCount(const byte *terminals, byte *groups)
static void AirportBuildAutomata(AirportFTAClass *apc, const AirportFTAbuildup *apFA) static void AirportBuildAutomata(AirportFTAClass *apc, const AirportFTAbuildup *apFA)
{ {
AirportFTA *current; AirportFTA *current;
AirportFTA *FAutomata = malloc(sizeof(AirportFTA) * apc->nofelements); AirportFTA *FAutomata;
MallocT(&FAutomata, apc->nofelements);
uint16 internalcounter = 0; uint16 internalcounter = 0;
uint16 i; uint16 i;
@ -337,7 +339,8 @@ static void AirportBuildAutomata(AirportFTAClass *apc, const AirportFTAbuildup *
// outgoing nodes from the same position, create linked list // outgoing nodes from the same position, create linked list
while (current->position == apFA[internalcounter + 1].position) { while (current->position == apFA[internalcounter + 1].position) {
AirportFTA *newNode = malloc(sizeof(AirportFTA)); AirportFTA *newNode;
MallocT(&newNode, 1);
newNode->position = apFA[internalcounter + 1].position; newNode->position = apFA[internalcounter + 1].position;
newNode->heading = apFA[internalcounter + 1].heading; newNode->heading = apFA[internalcounter + 1].heading;

View File

@ -3,6 +3,8 @@
#ifndef AIRPORT_H #ifndef AIRPORT_H
#define AIRPORT_H #define AIRPORT_H
#include "direction.h"
enum {MAX_TERMINALS = 10}; enum {MAX_TERMINALS = 10};
enum {MAX_HELIPADS = 4}; enum {MAX_HELIPADS = 4};
enum {MAX_ELEMENTS = 255}; enum {MAX_ELEMENTS = 255};
@ -23,12 +25,18 @@ enum {
}; };
// do not change unless you change v->subtype too. This aligns perfectly with its current setting // do not change unless you change v->subtype too. This aligns perfectly with its current setting
enum { enum AcceptPlanes {
ACC_BEGIN = 0,
AIRCRAFT_ONLY = 0, AIRCRAFT_ONLY = 0,
ALL = 1, ALL = 1,
HELICOPTERS_ONLY = 2, HELICOPTERS_ONLY = 2,
ACC_END
}; };
/** Define basic enum properties */
template <> struct EnumPropsT<AcceptPlanes> : MakeEnumPropsT<AcceptPlanes, byte, ACC_BEGIN, ACC_END, ACC_END> {};
typedef TinyEnumT<AcceptPlanes> AcceptPlanesByte;
enum { enum {
AMED_NOSPDCLAMP = 1 << 0, AMED_NOSPDCLAMP = 1 << 0,
AMED_TAKEOFF = 1 << 1, AMED_TAKEOFF = 1 << 1,
@ -122,7 +130,7 @@ enum {
typedef struct AirportMovingData { typedef struct AirportMovingData {
int x,y; int x,y;
byte flag; byte flag;
byte direction; DirectionByte direction;
} AirportMovingData; } AirportMovingData;
// Finite sTate mAchine --> FTA // Finite sTate mAchine --> FTA
@ -131,7 +139,7 @@ typedef struct AirportFTAClass {
const byte *terminals; const byte *terminals;
const byte *helipads; const byte *helipads;
byte entry_point; // when an airplane arrives at this airport, enter it at position entry_point byte entry_point; // when an airplane arrives at this airport, enter it at position entry_point
byte acc_planes; // accept airplanes or helicopters or both AcceptPlanesByte acc_planes; // accept airplanes or helicopters or both
const TileIndexDiffC *airport_depots; // gives the position of the depots on the airports const TileIndexDiffC *airport_depots; // gives the position of the depots on the airports
byte nof_depots; // number of depots this airport has byte nof_depots; // number of depots this airport has
struct AirportFTA *layout; // state machine for airport struct AirportFTA *layout; // state machine for airport

View File

@ -216,7 +216,7 @@ static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
SetWindowDirty(w); SetWindowDirty(w);
break; break;
case 16: case 17: case 16: case 17:
_station_show_coverage = e->we.click.widget - 16; _station_show_coverage = (e->we.click.widget != 16);
SetWindowWidgetLoweredState(w, 16, !_station_show_coverage); SetWindowWidgetLoweredState(w, 16, !_station_show_coverage);
SetWindowWidgetLoweredState(w, 17, _station_show_coverage); SetWindowWidgetLoweredState(w, 17, _station_show_coverage);
SndPlayFx(SND_15_BEEP); SndPlayFx(SND_15_BEEP);

View File

@ -17,354 +17,354 @@ typedef struct AirportFTAbuildup {
/////*********Movement Positions on Airports********************/////// /////*********Movement Positions on Airports********************///////
// Country Airfield (small) 4x3 // Country Airfield (small) 4x3
static const AirportMovingData _airport_moving_data_country[22] = { static const AirportMovingData _airport_moving_data_country[22] = {
{ 53, 3, AMED_EXACTPOS, 3 }, // 00 In Hangar { 53, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 53, 27, 0, 0 }, // 01 Taxi to right outside depot { 53, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
{ 32, 23, AMED_EXACTPOS, 7 }, // 02 Terminal 1 { 32, 23, AMED_EXACTPOS, {DIR_NW} }, // 02 Terminal 1
{ 10, 23, AMED_EXACTPOS, 7 }, // 03 Terminal 2 { 10, 23, AMED_EXACTPOS, {DIR_NW} }, // 03 Terminal 2
{ 43, 37, 0, 0 }, // 04 Going towards terminal 2 { 43, 37, 0, {DIR_N} }, // 04 Going towards terminal 2
{ 24, 37, 0, 0 }, // 05 Going towards terminal 2 { 24, 37, 0, {DIR_N} }, // 05 Going towards terminal 2
{ 53, 37, 0, 0 }, // 06 Going for takeoff { 53, 37, 0, {DIR_N} }, // 06 Going for takeoff
{ 61, 40, AMED_EXACTPOS, 1 }, // 07 Taxi to start of runway (takeoff) { 61, 40, AMED_EXACTPOS, {DIR_NE} }, // 07 Taxi to start of runway (takeoff)
{ 3, 40, AMED_NOSPDCLAMP, 0 }, // 08 Accelerate to end of runway { 3, 40, AMED_NOSPDCLAMP, {DIR_N} }, // 08 Accelerate to end of runway
{ -79, 40, AMED_NOSPDCLAMP | AMED_TAKEOFF, 0 }, // 09 Take off { -79, 40, AMED_NOSPDCLAMP | AMED_TAKEOFF, {DIR_N} }, // 09 Take off
{ 177, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 10 Fly to landing position in air { 177, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 10 Fly to landing position in air
{ 56, 40, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 11 Going down for land { 56, 40, AMED_NOSPDCLAMP | AMED_LAND, {DIR_N} }, // 11 Going down for land
{ 3, 40, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 12 Just landed, brake until end of runway { 3, 40, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 12 Just landed, brake until end of runway
{ 7, 40, 0, 0 }, // 13 Just landed, turn around and taxi 1 square { 7, 40, 0, {DIR_N} }, // 13 Just landed, turn around and taxi 1 square
{ 53, 40, 0, 0 }, // 14 Taxi from runway to crossing { 53, 40, 0, {DIR_N} }, // 14 Taxi from runway to crossing
{ -31, 193, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 15 Fly around waiting for a landing spot (north-east) { -31, 193, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 15 Fly around waiting for a landing spot (north-east)
{ 1, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 16 Fly around waiting for a landing spot (north-west) { 1, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 16 Fly around waiting for a landing spot (north-west)
{ 257, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 17 Fly around waiting for a landing spot (south-west) { 257, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 17 Fly around waiting for a landing spot (south-west)
{ 273, 49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 18 Fly around waiting for a landing spot (south) { 273, 49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 18 Fly around waiting for a landing spot (south)
{ 44, 37, AMED_HELI_RAISE, 0 }, // 19 Helicopter takeoff { 44, 37, AMED_HELI_RAISE, {DIR_N} }, // 19 Helicopter takeoff
{ 44, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 20 In position above landing spot helicopter { 44, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 20 In position above landing spot helicopter
{ 44, 40, AMED_HELI_LOWER, 0 }, // 21 Helicopter landing { 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] = { static const AirportMovingData _airport_moving_data_commuter[37] = {
{ 69, 3, AMED_EXACTPOS, 3 }, // 00 In Hangar { 69, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 72, 22, 0, 0 }, // 01 Taxi to right outside depot { 72, 22, 0, {DIR_N} }, // 01 Taxi to right outside depot
{ 8, 22, AMED_EXACTPOS, 5 }, // 01 Taxi to right outside depot { 8, 22, AMED_EXACTPOS, {DIR_SW} }, // 01 Taxi to right outside depot
{ 24, 36, AMED_EXACTPOS, 3 }, // 03 Terminal 1 { 24, 36, AMED_EXACTPOS, {DIR_SE} }, // 03 Terminal 1
{ 40, 36, AMED_EXACTPOS, 3 }, // 04 Terminal 2 { 40, 36, AMED_EXACTPOS, {DIR_SE} }, // 04 Terminal 2
{ 56, 36, AMED_EXACTPOS, 3 }, // 05 Terminal 3 { 56, 36, AMED_EXACTPOS, {DIR_SE} }, // 05 Terminal 3
{ 40, 8, AMED_EXACTPOS, 1 }, // 06 Helipad 1 { 40, 8, AMED_EXACTPOS, {DIR_NE} }, // 06 Helipad 1
{ 56, 8, AMED_EXACTPOS, 1 }, // 07 Helipad 2 { 56, 8, AMED_EXACTPOS, {DIR_NE} }, // 07 Helipad 2
{ 24, 22, 0, 5 }, // 08 Taxiing { 24, 22, 0, {DIR_SW} }, // 08 Taxiing
{ 40, 22, 0, 5 }, // 09 Taxiing { 40, 22, 0, {DIR_SW} }, // 09 Taxiing
{ 56, 22, 0, 5 }, // 10 Taxiing { 56, 22, 0, {DIR_SW} }, // 10 Taxiing
{ 72, 40, 0, 3 }, // 11 Airport OUTWAY { 72, 40, 0, {DIR_SE} }, // 11 Airport OUTWAY
{ 72, 54, AMED_EXACTPOS, 1 }, // 12 Accelerate to end of runway { 72, 54, AMED_EXACTPOS, {DIR_NE} }, // 12 Accelerate to end of runway
{ 7, 54, AMED_NOSPDCLAMP, 0 }, // 13 Release control of runway, for smoother movement { 7, 54, AMED_NOSPDCLAMP, {DIR_N} }, // 13 Release control of runway, for smoother movement
{ 5, 54, AMED_NOSPDCLAMP, 0 }, // 14 End of runway { 5, 54, AMED_NOSPDCLAMP, {DIR_N} }, // 14 End of runway
{ -79, 54, AMED_NOSPDCLAMP | AMED_TAKEOFF, 0 }, // 15 Take off { -79, 54, AMED_NOSPDCLAMP | AMED_TAKEOFF, {DIR_N} }, // 15 Take off
{ 145, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 16 Fly to landing position in air { 145, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 16 Fly to landing position in air
{ 73, 54, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 17 Going down for land { 73, 54, AMED_NOSPDCLAMP | AMED_LAND, {DIR_N} }, // 17 Going down for land
{ 3, 54, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 18 Just landed, brake until end of runway { 3, 54, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 18 Just landed, brake until end of runway
{ 12, 54, 0, 7 }, // 19 Just landed, turn around and taxi { 12, 54, 0, {DIR_NW} }, // 19 Just landed, turn around and taxi
{ 8, 32, 0, 7 }, // 20 Taxi from runway to crossing { 8, 32, 0, {DIR_NW} }, // 20 Taxi from runway to crossing
{ -31, 149, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 21 Fly around waiting for a landing spot (north-east) { -31, 149, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 21 Fly around waiting for a landing spot (north-east)
{ 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 22 Fly around waiting for a landing spot (north-west) { 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 22 Fly around waiting for a landing spot (north-west)
{ 193, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 23 Fly around waiting for a landing spot (south-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, 0 }, // 24 Fly around waiting for a landing spot (south) { 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, 0 }, // 25 Bufferspace before helipad { 80, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 25 Bufferspace before helipad
{ 80, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 26 Bufferspace before helipad { 80, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 26 Bufferspace before helipad
{ 32, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 27 Get in position for Helipad1 { 32, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 27 Get in position for Helipad1
{ 48, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 28 Get in position for Helipad2 { 48, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 28 Get in position for Helipad2
{ 32, 8, AMED_HELI_LOWER, 0 }, // 29 Land at Helipad1 { 32, 8, AMED_HELI_LOWER, {DIR_N} }, // 29 Land at Helipad1
{ 48, 8, AMED_HELI_LOWER, 0 }, // 30 Land at Helipad2 { 48, 8, AMED_HELI_LOWER, {DIR_N} }, // 30 Land at Helipad2
{ 32, 8, AMED_HELI_RAISE, 0 }, // 31 Takeoff Helipad1 { 32, 8, AMED_HELI_RAISE, {DIR_N} }, // 31 Takeoff Helipad1
{ 48, 8, AMED_HELI_RAISE, 0 }, // 32 Takeoff Helipad2 { 48, 8, AMED_HELI_RAISE, {DIR_N} }, // 32 Takeoff Helipad2
{ 64, 22, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 33 Go to position for Hangarentrance in air { 64, 22, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 33 Go to position for Hangarentrance in air
{ 64, 22, AMED_HELI_LOWER, 0 }, // 34 Land in front of hangar { 64, 22, AMED_HELI_LOWER, {DIR_N} }, // 34 Land in front of hangar
{ 40, 8, AMED_EXACTPOS, 0 }, // pre-helitakeoff helipad 1 { 40, 8, AMED_EXACTPOS, {DIR_N} }, // pre-helitakeoff helipad 1
{ 56, 8, AMED_EXACTPOS, 0 }, // pre-helitakeoff helipad 2 { 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[25] = { static const AirportMovingData _airport_moving_data_town[25] = {
{ 85, 3, AMED_EXACTPOS, 3 }, // 00 In Hangar { 85, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 85, 27, 0, 0 }, // 01 Taxi to right outside depot { 85, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
{ 26, 41, AMED_EXACTPOS, 5 }, // 02 Terminal 1 { 26, 41, AMED_EXACTPOS, {DIR_SW} }, // 02 Terminal 1
{ 56, 20, AMED_EXACTPOS, 3 }, // 03 Terminal 2 { 56, 20, AMED_EXACTPOS, {DIR_SE} }, // 03 Terminal 2
{ 38, 8, AMED_EXACTPOS, 5 }, // 04 Terminal 3 { 38, 8, AMED_EXACTPOS, {DIR_SW} }, // 04 Terminal 3
{ 65, 6, 0, 0 }, // 05 Taxi to right in infront of terminal 2/3 { 65, 6, 0, {DIR_N} }, // 05 Taxi to right in infront of terminal 2/3
{ 80, 27, 0, 0 }, // 06 Taxiway terminals 2-3 { 80, 27, 0, {DIR_N} }, // 06 Taxiway terminals 2-3
{ 44, 63, 0, 0 }, // 07 Taxi to Airport center { 44, 63, 0, {DIR_N} }, // 07 Taxi to Airport center
{ 58, 71, 0, 0 }, // 08 Towards takeoff { 58, 71, 0, {DIR_N} }, // 08 Towards takeoff
{ 72, 85, 0, 0 }, // 09 Taxi to runway (takeoff) { 72, 85, 0, {DIR_N} }, // 09 Taxi to runway (takeoff)
{ 89, 85, AMED_EXACTPOS, 1 }, // 10 Taxi to start of runway (takeoff) { 89, 85, AMED_EXACTPOS, {DIR_NE} }, // 10 Taxi to start of runway (takeoff)
{ 3, 85, AMED_NOSPDCLAMP, 0 }, // 11 Accelerate to end of runway { 3, 85, AMED_NOSPDCLAMP, {DIR_N} }, // 11 Accelerate to end of runway
{ -79, 85, AMED_NOSPDCLAMP | AMED_TAKEOFF, 0 }, // 12 Take off { -79, 85, AMED_NOSPDCLAMP | AMED_TAKEOFF, {DIR_N} }, // 12 Take off
{ 177, 85, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 13 Fly to landing position in air { 177, 85, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 13 Fly to landing position in air
{ 89, 85, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 14 Going down for land { 89, 85, AMED_NOSPDCLAMP | AMED_LAND, {DIR_N} }, // 14 Going down for land
{ 3, 85, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 15 Just landed, brake until end of runway { 3, 85, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 15 Just landed, brake until end of runway
{ 20, 87, 0, 0 }, // 16 Just landed, turn around and taxi 1 square { 20, 87, 0, {DIR_N} }, // 16 Just landed, turn around and taxi 1 square
{ 36, 71, 0, 0 }, // 17 Taxi from runway to crossing { 36, 71, 0, {DIR_N} }, // 17 Taxi from runway to crossing
{ -31, 193, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 18 Fly around waiting for a landing spot (north-east) { -31, 193, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 18 Fly around waiting for a landing spot (north-east)
{ 1, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 19 Fly around waiting for a landing spot (north-west) { 1, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 19 Fly around waiting for a landing spot (north-west)
{ 257, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 20 Fly around waiting for a landing spot (south-west) { 257, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 20 Fly around waiting for a landing spot (south-west)
{ 273, 49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 21 Fly around waiting for a landing spot (south) { 273, 49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 21 Fly around waiting for a landing spot (south)
{ 44, 63, AMED_HELI_RAISE, 0 }, // 22 Helicopter takeoff { 44, 63, AMED_HELI_RAISE, {DIR_N} }, // 22 Helicopter takeoff
{ 28, 74, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 23 In position above landing spot helicopter { 28, 74, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 23 In position above landing spot helicopter
{ 28, 74, AMED_HELI_LOWER, 0 }, // 24 Helicopter landing { 28, 74, AMED_HELI_LOWER, {DIR_N} }, // 24 Helicopter landing
}; };
// Metropolitan Airport (metropolitan) - 2 runways // Metropolitan Airport (metropolitan) - 2 runways
static const AirportMovingData _airport_moving_data_metropolitan[27] = { static const AirportMovingData _airport_moving_data_metropolitan[27] = {
{ 85, 3, AMED_EXACTPOS, 3 }, // 00 In Hangar { 85, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 85, 27, 0, 0 }, // 01 Taxi to right outside depot { 85, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
{ 26, 41, AMED_EXACTPOS, 5 }, // 02 Terminal 1 { 26, 41, AMED_EXACTPOS, {DIR_SW} }, // 02 Terminal 1
{ 56, 20, AMED_EXACTPOS, 3 }, // 03 Terminal 2 { 56, 20, AMED_EXACTPOS, {DIR_SE} }, // 03 Terminal 2
{ 38, 8, AMED_EXACTPOS, 5 }, // 04 Terminal 3 { 38, 8, AMED_EXACTPOS, {DIR_SW} }, // 04 Terminal 3
{ 65, 6, 0, 0 }, // 05 Taxi to right in infront of terminal 2/3 { 65, 6, 0, {DIR_N} }, // 05 Taxi to right in infront of terminal 2/3
{ 70, 33, 0, 0 }, // 06 Taxiway terminals 2-3 { 70, 33, 0, {DIR_N} }, // 06 Taxiway terminals 2-3
{ 44, 58, 0, 0 }, // 07 Taxi to Airport center { 44, 58, 0, {DIR_N} }, // 07 Taxi to Airport center
{ 72, 58, 0, 0 }, // 08 Towards takeoff { 72, 58, 0, {DIR_N} }, // 08 Towards takeoff
{ 72, 69, 0, 0 }, // 09 Taxi to runway (takeoff) { 72, 69, 0, {DIR_N} }, // 09 Taxi to runway (takeoff)
{ 89, 69, AMED_EXACTPOS, 1 }, // 10 Taxi to start of runway (takeoff) { 89, 69, AMED_EXACTPOS, {DIR_NE} }, // 10 Taxi to start of runway (takeoff)
{ 3, 69, AMED_NOSPDCLAMP, 0 }, // 11 Accelerate to end of runway { 3, 69, AMED_NOSPDCLAMP, {DIR_N} }, // 11 Accelerate to end of runway
{ -79, 69, AMED_NOSPDCLAMP | AMED_TAKEOFF, 0 }, // 12 Take off { -79, 69, AMED_NOSPDCLAMP | AMED_TAKEOFF, {DIR_N} }, // 12 Take off
{ 177, 85, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 13 Fly to landing position in air { 177, 85, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 13 Fly to landing position in air
{ 89, 85, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 14 Going down for land { 89, 85, AMED_NOSPDCLAMP | AMED_LAND, {DIR_N} }, // 14 Going down for land
{ 3, 85, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 15 Just landed, brake until end of runway { 3, 85, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 15 Just landed, brake until end of runway
{ 21, 85, 0, 0 }, // 16 Just landed, turn around and taxi 1 square { 21, 85, 0, {DIR_N} }, // 16 Just landed, turn around and taxi 1 square
{ 21, 69, 0, 0 }, // 17 On Runway-out taxiing to In-Way { 21, 69, 0, {DIR_N} }, // 17 On Runway-out taxiing to In-Way
{ 21, 54, AMED_EXACTPOS, 5 }, // 18 Taxi from runway to crossing { 21, 54, AMED_EXACTPOS, {DIR_SW} }, // 18 Taxi from runway to crossing
{ -31, 193, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 19 Fly around waiting for a landing spot (north-east) { -31, 193, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 19 Fly around waiting for a landing spot (north-east)
{ 1, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 20 Fly around waiting for a landing spot (north-west) { 1, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 20 Fly around waiting for a landing spot (north-west)
{ 257, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 21 Fly around waiting for a landing spot (south-west) { 257, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 21 Fly around waiting for a landing spot (south-west)
{ 273, 49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 22 Fly around waiting for a landing spot (south) { 273, 49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 22 Fly around waiting for a landing spot (south)
{ 44, 58, 0, 0 }, // 23 Helicopter takeoff spot on ground (to clear airport sooner) { 44, 58, 0, {DIR_N} }, // 23 Helicopter takeoff spot on ground (to clear airport sooner)
{ 44, 63, AMED_HELI_RAISE, 0 }, // 24 Helicopter takeoff { 44, 63, AMED_HELI_RAISE, {DIR_N} }, // 24 Helicopter takeoff
{ 15, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 25 Get in position above landing spot helicopter { 15, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 25 Get in position above landing spot helicopter
{ 15, 54, AMED_HELI_LOWER, 0 }, // 26 Helicopter landing { 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] = { static const AirportMovingData _airport_moving_data_international[51] = {
{ 7, 55, AMED_EXACTPOS, 3 }, // 00 In Hangar 1 { 7, 55, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar 1
{ 100, 21, AMED_EXACTPOS, 3 }, // 01 In Hangar 2 { 100, 21, AMED_EXACTPOS, {DIR_SE} }, // 01 In Hangar 2
{ 7, 70, 0, 0 }, // 02 Taxi to right outside depot { 7, 70, 0, {DIR_N} }, // 02 Taxi to right outside depot
{ 100, 36, 0, 0 }, // 03 Taxi to right outside depot { 100, 36, 0, {DIR_N} }, // 03 Taxi to right outside depot
{ 38, 70, AMED_EXACTPOS, 5 }, // 04 Terminal 1 { 38, 70, AMED_EXACTPOS, {DIR_SW} }, // 04 Terminal 1
{ 38, 54, AMED_EXACTPOS, 5 }, // 05 Terminal 2 { 38, 54, AMED_EXACTPOS, {DIR_SW} }, // 05 Terminal 2
{ 38, 38, AMED_EXACTPOS, 5 }, // 06 Terminal 3 { 38, 38, AMED_EXACTPOS, {DIR_SW} }, // 06 Terminal 3
{ 70, 70, AMED_EXACTPOS, 1 }, // 07 Terminal 4 { 70, 70, AMED_EXACTPOS, {DIR_NE} }, // 07 Terminal 4
{ 70, 54, AMED_EXACTPOS, 1 }, // 08 Terminal 5 { 70, 54, AMED_EXACTPOS, {DIR_NE} }, // 08 Terminal 5
{ 70, 38, AMED_EXACTPOS, 1 }, // 09 Terminal 6 { 70, 38, AMED_EXACTPOS, {DIR_NE} }, // 09 Terminal 6
{ 104, 71, AMED_EXACTPOS, 1 }, // 10 Helipad 1 { 104, 71, AMED_EXACTPOS, {DIR_NE} }, // 10 Helipad 1
{ 104, 55, AMED_EXACTPOS, 1 }, // 11 Helipad 2 { 104, 55, AMED_EXACTPOS, {DIR_NE} }, // 11 Helipad 2
{ 22, 87, 0, 0 }, // 12 Towards Terminals 4/5/6, Helipad 1/2 { 22, 87, 0, {DIR_N} }, // 12 Towards Terminals 4/5/6, Helipad 1/2
{ 60, 87, 0, 0 }, // 13 Towards Terminals 4/5/6, Helipad 1/2 { 60, 87, 0, {DIR_N} }, // 13 Towards Terminals 4/5/6, Helipad 1/2
{ 66, 87, 0, 0 }, // 14 Towards Terminals 4/5/6, Helipad 1/2 { 66, 87, 0, {DIR_N} }, // 14 Towards Terminals 4/5/6, Helipad 1/2
{ 86, 87, AMED_EXACTPOS, 7 }, // 15 Towards Terminals 4/5/6, Helipad 1/2 { 86, 87, AMED_EXACTPOS, {DIR_NW} }, // 15 Towards Terminals 4/5/6, Helipad 1/2
{ 86, 70, 0, 0 }, // 16 In Front of Terminal 4 / Helipad 1 { 86, 70, 0, {DIR_N} }, // 16 In Front of Terminal 4 / Helipad 1
{ 86, 54, 0, 0 }, // 17 In Front of Terminal 5 / Helipad 2 { 86, 54, 0, {DIR_N} }, // 17 In Front of Terminal 5 / Helipad 2
{ 86, 38, 0, 0 }, // 18 In Front of Terminal 6 { 86, 38, 0, {DIR_N} }, // 18 In Front of Terminal 6
{ 86, 22, 0, 0 }, // 19 Towards Terminals Takeoff (Taxiway) { 86, 22, 0, {DIR_N} }, // 19 Towards Terminals Takeoff (Taxiway)
{ 66, 22, 0, 0 }, // 20 Towards Terminals Takeoff (Taxiway) { 66, 22, 0, {DIR_N} }, // 20 Towards Terminals Takeoff (Taxiway)
{ 60, 22, 0, 0 }, // 21 Towards Terminals Takeoff (Taxiway) { 60, 22, 0, {DIR_N} }, // 21 Towards Terminals Takeoff (Taxiway)
{ 38, 22, 0, 0 }, // 22 Towards Terminals Takeoff (Taxiway) { 38, 22, 0, {DIR_N} }, // 22 Towards Terminals Takeoff (Taxiway)
{ 22, 70, 0, 0 }, // 23 In Front of Terminal 1 { 22, 70, 0, {DIR_N} }, // 23 In Front of Terminal 1
{ 22, 58, 0, 0 }, // 24 In Front of Terminal 2 { 22, 58, 0, {DIR_N} }, // 24 In Front of Terminal 2
{ 22, 38, 0, 0 }, // 25 In Front of Terminal 3 { 22, 38, 0, {DIR_N} }, // 25 In Front of Terminal 3
{ 22, 22, AMED_EXACTPOS, 7 }, // 26 Going for Takeoff { 22, 22, AMED_EXACTPOS, {DIR_NW} }, // 26 Going for Takeoff
{ 22, 6, 0, 0 }, // 27 On Runway-out, prepare for takeoff { 22, 6, 0, {DIR_N} }, // 27 On Runway-out, prepare for takeoff
{ 3, 6, AMED_EXACTPOS, 5 }, // 28 Accelerate to end of runway { 3, 6, AMED_EXACTPOS, {DIR_SW} }, // 28 Accelerate to end of runway
{ 60, 6, AMED_NOSPDCLAMP, 0 }, // 29 Release control of runway, for smoother movement { 60, 6, AMED_NOSPDCLAMP, {DIR_N} }, // 29 Release control of runway, for smoother movement
{ 105, 6, AMED_NOSPDCLAMP, 0 }, // 30 End of runway { 105, 6, AMED_NOSPDCLAMP, {DIR_N} }, // 30 End of runway
{ 190, 6, AMED_NOSPDCLAMP | AMED_TAKEOFF, 0 }, // 31 Take off { 190, 6, AMED_NOSPDCLAMP | AMED_TAKEOFF, {DIR_N} }, // 31 Take off
{ 193, 104, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 32 Fly to landing position in air { 193, 104, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 32 Fly to landing position in air
{ 105, 104, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 33 Going down for land { 105, 104, AMED_NOSPDCLAMP | AMED_LAND, {DIR_N} }, // 33 Going down for land
{ 3, 104, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 34 Just landed, brake until end of runway { 3, 104, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 34 Just landed, brake until end of runway
{ 12, 104, 0, 0 }, // 35 Just landed, turn around and taxi 1 square { 12, 104, 0, {DIR_N} }, // 35 Just landed, turn around and taxi 1 square
{ 7, 84, 0, 0 }, // 36 Taxi from runway to crossing { 7, 84, 0, {DIR_N} }, // 36 Taxi from runway to crossing
{ -31, 209, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 37 Fly around waiting for a landing spot (north-east) { -31, 209, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 37 Fly around waiting for a landing spot (north-east)
{ 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 38 Fly around waiting for a landing spot (north-west) { 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 38 Fly around waiting for a landing spot (north-west)
{ 273, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 39 Fly around waiting for a landing spot (south-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, 0 }, // 40 Fly around waiting for a landing spot (south) { 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, 0 }, // 41 Bufferspace before helipad { 128, 80, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 41 Bufferspace before helipad
{ 128, 80, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 42 Bufferspace before helipad { 128, 80, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 42 Bufferspace before helipad
{ 96, 71, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 43 Get in position for Helipad1 { 96, 71, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 43 Get in position for Helipad1
{ 96, 55, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 44 Get in position for Helipad2 { 96, 55, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 44 Get in position for Helipad2
{ 96, 71, AMED_HELI_LOWER, 0 }, // 45 Land at Helipad1 { 96, 71, AMED_HELI_LOWER, {DIR_N} }, // 45 Land at Helipad1
{ 96, 55, AMED_HELI_LOWER, 0 }, // 46 Land at Helipad2 { 96, 55, AMED_HELI_LOWER, {DIR_N} }, // 46 Land at Helipad2
{ 104, 71, AMED_HELI_RAISE, 0 }, // 47 Takeoff Helipad1 { 104, 71, AMED_HELI_RAISE, {DIR_N} }, // 47 Takeoff Helipad1
{ 104, 55, AMED_HELI_RAISE, 0 }, // 48 Takeoff Helipad2 { 104, 55, AMED_HELI_RAISE, {DIR_N} }, // 48 Takeoff Helipad2
{ 104, 32, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 49 Go to position for Hangarentrance in air { 104, 32, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 49 Go to position for Hangarentrance in air
{ 104, 32, AMED_HELI_LOWER, 0} // 50 Land in HANGAR2_AREA to go to hangar { 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] = { static const AirportMovingData _airport_moving_data_intercontinental[77] = {
{ 7, 87, AMED_EXACTPOS, 3 }, // 00 In Hangar 1 { 7, 87, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar 1
{ 135, 72, AMED_EXACTPOS, 3 }, // 01 In Hangar 2 { 135, 72, AMED_EXACTPOS, {DIR_SE} }, // 01 In Hangar 2
{ 7, 104, 0, 0 }, // 02 Taxi to right outside depot 1 { 7, 104, 0, {DIR_N} }, // 02 Taxi to right outside depot 1
{ 135, 88, 0, 0 }, // 03 Taxi to right outside depot 2 { 135, 88, 0, {DIR_N} }, // 03 Taxi to right outside depot 2
{ 56, 120, AMED_EXACTPOS, 6 }, // 04 Terminal 1 { 56, 120, AMED_EXACTPOS, {DIR_W} }, // 04 Terminal 1
{ 56, 104, AMED_EXACTPOS, 5 }, // 05 Terminal 2 { 56, 104, AMED_EXACTPOS, {DIR_SW} }, // 05 Terminal 2
{ 56, 88, AMED_EXACTPOS, 5 }, // 06 Terminal 3 { 56, 88, AMED_EXACTPOS, {DIR_SW} }, // 06 Terminal 3
{ 56, 72, AMED_EXACTPOS, 5 }, // 07 Terminal 4 { 56, 72, AMED_EXACTPOS, {DIR_SW} }, // 07 Terminal 4
{ 88, 120, AMED_EXACTPOS, 0 }, // 08 Terminal 5 { 88, 120, AMED_EXACTPOS, {DIR_N} }, // 08 Terminal 5
{ 88, 104, AMED_EXACTPOS, 1 }, // 09 Terminal 6 { 88, 104, AMED_EXACTPOS, {DIR_NE} }, // 09 Terminal 6
{ 88, 88, AMED_EXACTPOS, 1 }, // 10 Terminal 7 { 88, 88, AMED_EXACTPOS, {DIR_NE} }, // 10 Terminal 7
{ 88, 72, AMED_EXACTPOS, 1 }, // 11 Terminal 8 { 88, 72, AMED_EXACTPOS, {DIR_NE} }, // 11 Terminal 8
{ 88, 56, AMED_EXACTPOS, 3 }, // 12 Helipad 1 { 88, 56, AMED_EXACTPOS, {DIR_SE} }, // 12 Helipad 1
{ 72, 56, AMED_EXACTPOS, 1 }, // 13 Helipad 2 { 72, 56, AMED_EXACTPOS, {DIR_NE} }, // 13 Helipad 2
{ 40, 136, 0, 0 }, // 14 Term group 2 enter 1 a { 40, 136, 0, {DIR_N} }, // 14 Term group 2 enter 1 a
{ 56, 136, 0, 0 }, // 15 Term group 2 enter 1 b { 56, 136, 0, {DIR_N} }, // 15 Term group 2 enter 1 b
{ 88, 136, 0, 0 }, // 16 Term group 2 enter 2 a { 88, 136, 0, {DIR_N} }, // 16 Term group 2 enter 2 a
{ 104, 136, 0, 0 }, // 17 Term group 2 enter 2 b { 104, 136, 0, {DIR_N} }, // 17 Term group 2 enter 2 b
{ 104, 120, 0, 0 }, // 18 Term group 2 - opp term 5 { 104, 120, 0, {DIR_N} }, // 18 Term group 2 - opp term 5
{ 104, 104, 0, 0 }, // 19 Term group 2 - opp term 6 & exit2 { 104, 104, 0, {DIR_N} }, // 19 Term group 2 - opp term 6 & exit2
{ 104, 88, 0, 0 }, // 20 Term group 2 - opp term 7 & hangar area 2 { 104, 88, 0, {DIR_N} }, // 20 Term group 2 - opp term 7 & hangar area 2
{ 104, 72, 0, 0 }, // 21 Term group 2 - opp term 8 { 104, 72, 0, {DIR_N} }, // 21 Term group 2 - opp term 8
{ 104, 56, 0, 0 }, // 22 Taxi Term group 2 exit a { 104, 56, 0, {DIR_N} }, // 22 Taxi Term group 2 exit a
{ 104, 40, 0, 0 }, // 23 Taxi Term group 2 exit b { 104, 40, 0, {DIR_N} }, // 23 Taxi Term group 2 exit b
{ 56, 40, 0, 0 }, // 24 Term group 2 exit 2a { 56, 40, 0, {DIR_N} }, // 24 Term group 2 exit 2a
{ 40, 40, 0, 0 }, // 25 Term group 2 exit 2b { 40, 40, 0, {DIR_N} }, // 25 Term group 2 exit 2b
{ 40, 120, 0, 0 }, // 26 Term group 1 - opp term 1 { 40, 120, 0, {DIR_N} }, // 26 Term group 1 - opp term 1
{ 40, 104, 0, 0 }, // 27 Term group 1 - opp term 2 & hangar area 1 { 40, 104, 0, {DIR_N} }, // 27 Term group 1 - opp term 2 & hangar area 1
{ 40, 88, 0, 0 }, // 28 Term group 1 - opp term 3 { 40, 88, 0, {DIR_N} }, // 28 Term group 1 - opp term 3
{ 40, 72, 0, 0 }, // 29 Term group 1 - opp term 4 { 40, 72, 0, {DIR_N} }, // 29 Term group 1 - opp term 4
{ 18, 72, 0, 7 }, // 30 Outway 1 { 18, 72, 0, {DIR_NW} }, // 30 Outway 1
{ 8, 40, 0, 7 }, // 31 Airport OUTWAY { 8, 40, 0, {DIR_NW} }, // 31 Airport OUTWAY
{ 8, 24, AMED_EXACTPOS, 5 }, // 32 Accelerate to end of runway { 8, 24, AMED_EXACTPOS, {DIR_SW} }, // 32 Accelerate to end of runway
{ 119, 24, AMED_NOSPDCLAMP, 0 }, // 33 Release control of runway, for smoother movement { 119, 24, AMED_NOSPDCLAMP, {DIR_N} }, // 33 Release control of runway, for smoother movement
{ 117, 24, AMED_NOSPDCLAMP, 0 }, // 34 End of runway { 117, 24, AMED_NOSPDCLAMP, {DIR_N} }, // 34 End of runway
{ 197, 24, AMED_NOSPDCLAMP | AMED_TAKEOFF, 0 }, // 35 Take off { 197, 24, AMED_NOSPDCLAMP | AMED_TAKEOFF, {DIR_N} }, // 35 Take off
{ 254, 84, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 36 Flying to landing position in air { 254, 84, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 36 Flying to landing position in air
{ 117, 168, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 37 Going down for land { 117, 168, AMED_NOSPDCLAMP | AMED_LAND, {DIR_N} }, // 37 Going down for land
{ 3, 168, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 38 Just landed, brake until end of runway { 3, 168, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 38 Just landed, brake until end of runway
{ 8, 168, 0, 0 }, // 39 Just landed, turn around and taxi { 8, 168, 0, {DIR_N} }, // 39 Just landed, turn around and taxi
{ 8, 144, 0, 7 }, // 40 Taxi from runway { 8, 144, 0, {DIR_NW} }, // 40 Taxi from runway
{ 8, 128, 0, 7 }, // 41 Taxi from runway { 8, 128, 0, {DIR_NW} }, // 41 Taxi from runway
{ 8, 120, AMED_EXACTPOS, 5 }, // 42 Airport entrance { 8, 120, AMED_EXACTPOS, {DIR_SW} }, // 42 Airport entrance
{ 56, 344, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 43 Fly around waiting for a landing spot (north-east) { 56, 344, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 43 Fly around waiting for a landing spot (north-east)
{ -200, 88, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 44 Fly around waiting for a landing spot (north-west) { -200, 88, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 44 Fly around waiting for a landing spot (north-west)
{ 56, -168, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 45 Fly around waiting for a landing spot (south-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, 0 }, // 46 Fly around waiting for a landing spot (south) { 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, 0 }, // 47 Bufferspace before helipad { 96, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 47 Bufferspace before helipad
{ 96, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 48 Bufferspace before helipad { 96, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 48 Bufferspace before helipad
{ 82, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 49 Get in position for Helipad1 { 82, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 49 Get in position for Helipad1
{ 64, 56, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 50 Get in position for Helipad2 { 64, 56, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 50 Get in position for Helipad2
{ 81, 55, AMED_HELI_LOWER, 0 }, // 51 Land at Helipad1 { 81, 55, AMED_HELI_LOWER, {DIR_N} }, // 51 Land at Helipad1
{ 64, 56, AMED_HELI_LOWER, 0 }, // 52 Land at Helipad2 { 64, 56, AMED_HELI_LOWER, {DIR_N} }, // 52 Land at Helipad2
{ 80, 56, AMED_HELI_RAISE, 0 }, // 53 Takeoff Helipad1 { 80, 56, AMED_HELI_RAISE, {DIR_N} }, // 53 Takeoff Helipad1
{ 64, 56, AMED_HELI_RAISE, 0 }, // 54 Takeoff Helipad2 { 64, 56, AMED_HELI_RAISE, {DIR_N} }, // 54 Takeoff Helipad2
{ 136, 96, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 55 Go to position for Hangarentrance in air { 136, 96, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 55 Go to position for Hangarentrance in air
{ 136, 96, AMED_HELI_LOWER, 0 }, // 56 Land in front of hangar2 { 136, 96, AMED_HELI_LOWER, {DIR_N} }, // 56 Land in front of hangar2
{ 126, 104, 0, 3 }, // 57 Outway 2 { 126, 104, 0, {DIR_SE} }, // 57 Outway 2
{ 136, 136, 0, 1 }, // 58 Airport OUTWAY 2 { 136, 136, 0, {DIR_NE} }, // 58 Airport OUTWAY 2
{ 136, 152, AMED_EXACTPOS, 5 }, // 59 Accelerate to end of runway2 { 136, 152, AMED_EXACTPOS, {DIR_SW} }, // 59 Accelerate to end of runway2
{ 16, 152, AMED_NOSPDCLAMP, 0 }, // 60 Release control of runway2, for smoother movement { 16, 152, AMED_NOSPDCLAMP, {DIR_N} }, // 60 Release control of runway2, for smoother movement
{ 20, 152, AMED_NOSPDCLAMP, 0 }, // 61 End of runway2 { 20, 152, AMED_NOSPDCLAMP, {DIR_N} }, // 61 End of runway2
{ -56, 152, AMED_NOSPDCLAMP | AMED_TAKEOFF, 0 }, // 62 Take off2 { -56, 152, AMED_NOSPDCLAMP | AMED_TAKEOFF, {DIR_N} }, // 62 Take off2
{ 24, 8, AMED_NOSPDCLAMP | AMED_LAND, 0 }, // 63 Going down for land2 { 24, 8, AMED_NOSPDCLAMP | AMED_LAND, {DIR_N} }, // 63 Going down for land2
{ 136, 8, AMED_NOSPDCLAMP | AMED_BRAKE, 0 }, // 64 Just landed, brake until end of runway2in { 136, 8, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 64 Just landed, brake until end of runway2in
{ 136, 8, 0, 0 }, // 65 Just landed, turn around and taxi { 136, 8, 0, {DIR_N} }, // 65 Just landed, turn around and taxi
{ 136, 24, 0, 3 }, // 66 Taxi from runway 2in { 136, 24, 0, {DIR_SE} }, // 66 Taxi from runway 2in
{ 136, 40, 0, 3 }, // 67 Taxi from runway 2in { 136, 40, 0, {DIR_SE} }, // 67 Taxi from runway 2in
{ 136, 56, AMED_EXACTPOS, 1 }, // 68 Airport entrance2 { 136, 56, AMED_EXACTPOS, {DIR_NE} }, // 68 Airport entrance2
{ -56, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 69 Fly to landing position in air2 { -56, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 69 Fly to landing position in air2
{ 88, 40, 0, 0 }, // 70 Taxi Term group 2 exit - opp heli1 { 88, 40, 0, {DIR_N} }, // 70 Taxi Term group 2 exit - opp heli1
{ 72, 40, 0, 0 }, // 71 Taxi Term group 2 exit - opp heli2 { 72, 40, 0, {DIR_N} }, // 71 Taxi Term group 2 exit - opp heli2
{ 88, 57, AMED_EXACTPOS, 3 }, // 72 pre-helitakeoff helipad 1 { 88, 57, AMED_EXACTPOS, {DIR_SE} }, // 72 pre-helitakeoff helipad 1
{ 71, 56, AMED_EXACTPOS, 1 }, // 73 pre-helitakeoff helipad 2 { 71, 56, AMED_EXACTPOS, {DIR_NE} }, // 73 pre-helitakeoff helipad 2
{ 8, 120, AMED_HELI_RAISE, 0 }, // 74 Helitakeoff outside depot 1 { 8, 120, AMED_HELI_RAISE, {DIR_N} }, // 74 Helitakeoff outside depot 1
{ 136, 104, AMED_HELI_RAISE, 0 }, // 75 Helitakeoff outside depot 2 { 136, 104, AMED_HELI_RAISE, {DIR_N} }, // 75 Helitakeoff outside depot 2
{ 197, 168, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0} // 76 Fly to landing position in air1 { 197, 168, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 76 Fly to landing position in air1
}; };
// Heliport (heliport) // Heliport (heliport)
static const AirportMovingData _airport_moving_data_heliport[9] = { static const AirportMovingData _airport_moving_data_heliport[9] = {
{ 5, 9, AMED_EXACTPOS, 1 }, // 0 - At heliport terminal { 5, 9, AMED_EXACTPOS, {DIR_NE} }, // 0 - At heliport terminal
{ 2, 9, AMED_HELI_RAISE, 0 }, // 1 - Take off (play sound) { 2, 9, AMED_HELI_RAISE, {DIR_N} }, // 1 - Take off (play sound)
{ -3, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 2 - In position above landing spot helicopter { -3, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 2 - In position above landing spot helicopter
{ -3, 9, AMED_HELI_LOWER, 0 }, // 3 - Land { -3, 9, AMED_HELI_LOWER, {DIR_N} }, // 3 - Land
{ 2, 9, 0, 0 }, // 4 - Goto terminal on ground { 2, 9, 0, {DIR_N} }, // 4 - Goto terminal on ground
{ -31, 59, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 5 - Circle #1 (north-east) { -31, 59, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 5 - Circle #1 (north-east)
{ -31, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 6 - Circle #2 (north-west) { -31, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 6 - Circle #2 (north-west)
{ 49, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 7 - Circle #3 (south-west) { 49, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 7 - Circle #3 (south-west)
{ 70, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 8 - Circle #4 (south) { 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] = { static const AirportMovingData _airport_moving_data_helidepot[18] = {
{ 24, 4, AMED_EXACTPOS, 1 }, // 0 - At depot { 24, 4, AMED_EXACTPOS, {DIR_NE} }, // 0 - At depot
{ 24, 28, 0, 0 }, // 1 Taxi to right outside depot { 24, 28, 0, {DIR_N} }, // 1 Taxi to right outside depot
{ 5, 38, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 2 Flying { 5, 38, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 2 Flying
{ -15, -15, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 3 - Circle #1 (north-east) { -15, -15, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 3 - Circle #1 (north-east)
{ -15, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 4 - Circle #2 (north-west) { -15, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 4 - Circle #2 (north-west)
{ 49, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 5 - Circle #3 (south-west) { 49, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 5 - Circle #3 (south-west)
{ 49, -15, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 6 - Circle #4 (south-east) { 49, -15, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 6 - Circle #4 (south-east)
{ 8, 32, AMED_NOSPDCLAMP | AMED_SLOWTURN, 7 }, // 7 - PreHelipad { 8, 32, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_NW} }, // 7 - PreHelipad
{ 8, 32, AMED_NOSPDCLAMP | AMED_SLOWTURN, 7 }, // 8 - Helipad { 8, 32, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_NW} }, // 8 - Helipad
{ 8, 16, AMED_NOSPDCLAMP | AMED_SLOWTURN, 7 }, // 9 - Land { 8, 16, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_NW} }, // 9 - Land
{ 8, 16, AMED_HELI_LOWER, 7 }, // 10 - Land { 8, 16, AMED_HELI_LOWER, {DIR_NW} }, // 10 - Land
{ 8, 24, AMED_HELI_RAISE, 0 }, // 11 - Take off (play sound) { 8, 24, AMED_HELI_RAISE, {DIR_N} }, // 11 - Take off (play sound)
{ 32, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 7 }, // 12 Air to above hangar area { 32, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_NW} }, // 12 Air to above hangar area
{ 32, 24, AMED_HELI_LOWER, 7 }, // 13 Taxi to right outside depot { 32, 24, AMED_HELI_LOWER, {DIR_NW} }, // 13 Taxi to right outside depot
{ 8, 24, AMED_EXACTPOS, 7 }, // 14 - on helipad1 { 8, 24, AMED_EXACTPOS, {DIR_NW} }, // 14 - on helipad1
{ 24, 28, AMED_HELI_RAISE, 0 }, // 15 Takeoff right outside depot { 24, 28, AMED_HELI_RAISE, {DIR_N} }, // 15 Takeoff right outside depot
{ 8, 24, AMED_HELI_RAISE, 5 }, // 16 - Take off (play sound) { 8, 24, AMED_HELI_RAISE, {DIR_SW} }, // 16 - Take off (play sound)
{ 8, 24, AMED_SLOWTURN | AMED_EXACTPOS, 2 }, // 17 - turn on helipad1 for takeoff { 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] = { static const AirportMovingData _airport_moving_data_helistation[33] = {
{ 8, 3, AMED_EXACTPOS, 3 }, // 00 In Hangar2 { 8, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar2
{ 8, 22, 0, 0 }, // 01 outside hangar 2 { 8, 22, 0, {DIR_N} }, // 01 outside hangar 2
{ 116, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 02 Fly to landing position in air { 116, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 02 Fly to landing position in air
{ 14, 22, AMED_HELI_RAISE, 0 }, // 03 Helitakeoff outside hangar1(play sound) { 14, 22, AMED_HELI_RAISE, {DIR_N} }, // 03 Helitakeoff outside hangar1(play sound)
{ 24, 22, 0, 0 }, // 04 taxiing { 24, 22, 0, {DIR_N} }, // 04 taxiing
{ 40, 22, 0, 0 }, // 05 taxiing { 40, 22, 0, {DIR_N} }, // 05 taxiing
{ 40, 8, AMED_EXACTPOS, 1 }, // 06 Helipad 1 { 40, 8, AMED_EXACTPOS, {DIR_NE} }, // 06 Helipad 1
{ 56, 8, AMED_EXACTPOS, 1 }, // 07 Helipad 2 { 56, 8, AMED_EXACTPOS, {DIR_NE} }, // 07 Helipad 2
{ 56, 24, AMED_EXACTPOS, 1 }, // 08 Helipad 3 { 56, 24, AMED_EXACTPOS, {DIR_NE} }, // 08 Helipad 3
{ 40, 8, AMED_EXACTPOS, 0 }, // 09 pre-helitakeoff helipad 1 { 40, 8, AMED_EXACTPOS, {DIR_N} }, // 09 pre-helitakeoff helipad 1
{ 56, 8, AMED_EXACTPOS, 0 }, // 10 pre-helitakeoff helipad 2 { 56, 8, AMED_EXACTPOS, {DIR_N} }, // 10 pre-helitakeoff helipad 2
{ 56, 24, AMED_EXACTPOS, 0 }, // 11 pre-helitakeoff helipad 3 { 56, 24, AMED_EXACTPOS, {DIR_N} }, // 11 pre-helitakeoff helipad 3
{ 32, 8, AMED_HELI_RAISE, 0 }, // 12 Takeoff Helipad1 { 32, 8, AMED_HELI_RAISE, {DIR_N} }, // 12 Takeoff Helipad1
{ 48, 8, AMED_HELI_RAISE, 0 }, // 13 Takeoff Helipad2 { 48, 8, AMED_HELI_RAISE, {DIR_N} }, // 13 Takeoff Helipad2
{ 48, 24, AMED_HELI_RAISE, 0 }, // 14 Takeoff Helipad3 { 48, 24, AMED_HELI_RAISE, {DIR_N} }, // 14 Takeoff Helipad3
{ 84, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 15 Bufferspace before helipad { 84, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 15 Bufferspace before helipad
{ 68, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 16 Bufferspace before helipad { 68, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 16 Bufferspace before helipad
{ 32, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 17 Get in position for Helipad1 { 32, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 17 Get in position for Helipad1
{ 48, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 18 Get in position for Helipad2 { 48, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 18 Get in position for Helipad2
{ 48, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 1 }, // 19 Get in position for Helipad3 { 48, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_NE} }, // 19 Get in position for Helipad3
{ 40, 8, AMED_HELI_LOWER, 0 }, // 20 Land at Helipad1 { 40, 8, AMED_HELI_LOWER, {DIR_N} }, // 20 Land at Helipad1
{ 48, 8, AMED_HELI_LOWER, 0 }, // 21 Land at Helipad2 { 48, 8, AMED_HELI_LOWER, {DIR_N} }, // 21 Land at Helipad2
{ 48, 24, AMED_HELI_LOWER, 0 }, // 22 Land at Helipad3 { 48, 24, AMED_HELI_LOWER, {DIR_N} }, // 22 Land at Helipad3
{ 0, 22, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 23 Go to position for Hangarentrance in air { 0, 22, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 23 Go to position for Hangarentrance in air
{ 0, 22, AMED_HELI_LOWER, 0 }, // 24 Land in front of hangar { 0, 22, AMED_HELI_LOWER, {DIR_N} }, // 24 Land in front of hangar
{ 148, -8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 25 Fly around waiting for a landing spot (south-east) { 148, -8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 25 Fly around waiting for a landing spot (south-east)
{ 148, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 26 Fly around waiting for a landing spot (south-west) { 148, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 26 Fly around waiting for a landing spot (south-west)
{ 132, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 27 Fly around waiting for a landing spot (south-west) { 132, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 27 Fly around waiting for a landing spot (south-west)
{ 100, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 28 Fly around waiting for a landing spot (north-east) { 100, 24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 28 Fly around waiting for a landing spot (north-east)
{ 84, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 29 Fly around waiting for a landing spot (south-east) { 84, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 29 Fly around waiting for a landing spot (south-east)
{ 84, -8, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 30 Fly around waiting for a landing spot (south-west) { 84, -8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 30 Fly around waiting for a landing spot (south-west)
{ 100, -24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 31 Fly around waiting for a landing spot (north-west) { 100, -24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 31 Fly around waiting for a landing spot (north-west)
{ 132, -24, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 32 Fly around waiting for a landing spot (north-east) { 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] = { static const AirportMovingData _airport_moving_data_oilrig[9] = {
{ 31, 9, AMED_EXACTPOS, 1 }, // 0 - At oilrig terminal { 31, 9, AMED_EXACTPOS, {DIR_NE} }, // 0 - At oilrig terminal
{ 28, 9, AMED_HELI_RAISE, 0 }, // 1 - Take off (play sound) { 28, 9, AMED_HELI_RAISE, {DIR_N} }, // 1 - Take off (play sound)
{ 23, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 2 - In position above landing spot helicopter { 23, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 2 - In position above landing spot helicopter
{ 23, 9, AMED_HELI_LOWER, 0 }, // 3 - Land { 23, 9, AMED_HELI_LOWER, {DIR_N} }, // 3 - Land
{ 28, 9, 0, 0 }, // 4 - Goto terminal on ground { 28, 9, 0, {DIR_N} }, // 4 - Goto terminal on ground
{ -31, 69, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 5 - circle #1 (north-east) { -31, 69, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 5 - circle #1 (north-east)
{ -31, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 6 - circle #2 (north-west) { -31, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 6 - circle #2 (north-west)
{ 69, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 7 - circle #3 (south-west) { 69, -49, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 7 - circle #3 (south-west)
{ 70, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, 0 }, // 8 - circle #4 (south) { 70, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 8 - circle #4 (south)
}; };
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////

View File

@ -19,6 +19,7 @@
#include "stdafx.h" #include "stdafx.h"
#include "openttd.h" #include "openttd.h"
#include "aystar.h" #include "aystar.h"
#include "helpers.hpp"
int _aystar_stats_open_size; int _aystar_stats_open_size;
int _aystar_stats_closed_size; int _aystar_stats_closed_size;
@ -35,7 +36,8 @@ static PathNode* AyStarMain_ClosedList_IsInList(AyStar *aystar, const AyStarNode
static void AyStarMain_ClosedList_Add(AyStar *aystar, const PathNode *node) static void AyStarMain_ClosedList_Add(AyStar *aystar, const PathNode *node)
{ {
// Add a node to the ClosedList // Add a node to the ClosedList
PathNode *new_node = malloc(sizeof(*new_node)); PathNode *new_node;
MallocT(&new_node, 1);
*new_node = *node; *new_node = *node;
Hash_Set(&aystar->ClosedListHash, node->node.tile, node->node.direction, new_node); Hash_Set(&aystar->ClosedListHash, node->node.tile, node->node.direction, new_node);
} }
@ -66,7 +68,8 @@ static OpenListNode *AyStarMain_OpenList_Pop(AyStar *aystar)
static void AyStarMain_OpenList_Add(AyStar *aystar, PathNode *parent, const AyStarNode *node, int f, int g) static void AyStarMain_OpenList_Add(AyStar *aystar, PathNode *parent, const AyStarNode *node, int f, int g)
{ {
// Add a new Node to the OpenList // Add a new Node to the OpenList
OpenListNode *new_node = malloc(sizeof(*new_node)); OpenListNode *new_node;
MallocT(&new_node, 1);
new_node->g = g; new_node->g = g;
new_node->path.parent = parent; new_node->path.parent = parent;
new_node->path.node = *node; new_node->path.node = *node;

View File

@ -30,7 +30,7 @@ enum{
typedef struct AyStarNode AyStarNode; typedef struct AyStarNode AyStarNode;
struct AyStarNode { struct AyStarNode {
TileIndex tile; TileIndex tile;
uint direction; int direction;
uint user_data[2]; uint user_data[2];
}; };

View File

@ -5,6 +5,7 @@
#include "gfx.h" #include "gfx.h"
#include "bmp.h" #include "bmp.h"
#include "macros.h" #include "macros.h"
#include "helpers.hpp"
void BmpInitializeBuffer(BmpBuffer *buffer, FILE *file) { void BmpInitializeBuffer(BmpBuffer *buffer, FILE *file) {
buffer->pos = -1; buffer->pos = -1;
@ -328,7 +329,7 @@ bool BmpReadHeader(BmpBuffer *buffer, BmpInfo *info, BmpData *data)
} }
if (info->palette_size == 0) info->palette_size = 1 << info->bpp; if (info->palette_size == 0) info->palette_size = 1 << info->bpp;
data->palette = calloc(info->palette_size, sizeof(*(data->palette))); CallocT(&data->palette, info->palette_size);
if (data->palette == NULL) return false; if (data->palette == NULL) return false;
for (i = 0; i < info->palette_size; i++) { for (i = 0; i < info->palette_size; i++) {
@ -350,7 +351,7 @@ bool BmpReadBitmap(BmpBuffer *buffer, BmpInfo *info, BmpData *data)
{ {
assert(info != NULL && data != NULL); assert(info != NULL && data != NULL);
data->bitmap = calloc(info->width * info->height, ((info->bpp == 24) ? 3 : 1) * sizeof(byte)); data->bitmap = (byte*)calloc(info->width * info->height, ((info->bpp == 24) ? 3 : 1) * sizeof(byte));
if (data->bitmap == NULL) return false; if (data->bitmap == NULL) return false;
/* Load image */ /* Load image */

View File

@ -40,7 +40,7 @@ TileIndex GetOtherBridgeEnd(TileIndex tile)
uint GetBridgeHeight(TileIndex t) uint GetBridgeHeight(TileIndex t)
{ {
uint h; uint h;
uint tileh = GetTileSlope(t, &h); Slope tileh = GetTileSlope(t, &h);
uint f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(t))); uint f = GetBridgeFoundation(tileh, DiagDirToAxis(GetBridgeRampDirection(t)));
// one height level extra if the ramp is on a flat foundation // one height level extra if the ramp is on a flat foundation

View File

@ -302,6 +302,8 @@ static void GenerateBuildAircraftList(Window *w)
break; break;
case ALL: break; case ALL: break;
default:
NOT_REACHED();
} }
EngList_Add(&bv->eng_list, eid); EngList_Add(&bv->eng_list, eid);
@ -479,7 +481,7 @@ void ShowBuildVehicleWindow(TileIndex tile, byte type)
switch (type) { switch (type) {
case VEH_Aircraft: { case VEH_Aircraft: {
byte acc_planes = (tile == 0) ? ALL : GetAirport(GetStationByTile(tile)->airport_type)->acc_planes; AcceptPlanes acc_planes = (tile == 0) ? ALL : GetAirport(GetStationByTile(tile)->airport_type)->acc_planes;
bv->filter.acc_planes = acc_planes; bv->filter.acc_planes = acc_planes;
break; break;
} }

View File

@ -548,7 +548,7 @@ static void DrawTile_Clear(TileInfo *ti)
static uint GetSlopeZ_Clear(TileIndex tile, uint x, uint y) static uint GetSlopeZ_Clear(TileIndex tile, uint x, uint y)
{ {
uint z; uint z;
uint tileh = GetTileSlope(tile, &z); Slope tileh = GetTileSlope(tile, &z);
return z + GetPartialZ(x & 0xF, y & 0xF, tileh); return z + GetPartialZ(x & 0xF, y & 0xF, tileh);
} }
@ -786,7 +786,7 @@ void InitializeClearLand(void)
_opt.snow_line = _patches.snow_line_height * TILE_HEIGHT; _opt.snow_line = _patches.snow_line_height * TILE_HEIGHT;
} }
const TileTypeProcs _tile_type_clear_procs = { extern const TileTypeProcs _tile_type_clear_procs = {
DrawTile_Clear, /* draw_tile_proc */ DrawTile_Clear, /* draw_tile_proc */
GetSlopeZ_Clear, /* get_slope_z_proc */ GetSlopeZ_Clear, /* get_slope_z_proc */
ClearTile_Clear, /* clear_tile_proc */ ClearTile_Clear, /* clear_tile_proc */

View File

@ -23,7 +23,7 @@ typedef enum ClearGround {
static inline ClearGround GetClearGround(TileIndex t) static inline ClearGround GetClearGround(TileIndex t)
{ {
assert(IsTileType(t, MP_CLEAR)); assert(IsTileType(t, MP_CLEAR));
return GB(_m[t].m5, 2, 3); return (ClearGround)GB(_m[t].m5, 2, 3);
} }
static inline bool IsClearGround(TileIndex t, ClearGround ct) static inline bool IsClearGround(TileIndex t, ClearGround ct)

View File

@ -504,7 +504,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback,
*/ */
if (_networking && !(cmd & CMD_NETWORK_COMMAND)) { if (_networking && !(cmd & CMD_NETWORK_COMMAND)) {
PlayerID pbck = _local_player; PlayerID pbck = _local_player;
if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = 0; if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = PLAYER_FIRST;
NetworkSend_Command(tile, p1, p2, cmd, callback); NetworkSend_Command(tile, p1, p2, cmd, callback);
if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = pbck; if (_network_dedicated || (_network_server && pbck == PLAYER_SPECTATOR)) _local_player = pbck;
_docommand_recursive = 0; _docommand_recursive = 0;

View File

@ -13,6 +13,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include "console.h" #include "console.h"
#include "helpers.hpp"
#include "network/network.h" #include "network/network.h"
#include "network/network_data.h" #include "network/network_data.h"
#include "network/network_server.h" #include "network/network_server.h"
@ -223,7 +224,7 @@ void IConsoleInit(void)
memset(_iconsole_history, 0, sizeof(_iconsole_history)); memset(_iconsole_history, 0, sizeof(_iconsole_history));
memset(_iconsole_buffer, 0, sizeof(_iconsole_buffer)); memset(_iconsole_buffer, 0, sizeof(_iconsole_buffer));
memset(_iconsole_cbuffer, 0, sizeof(_iconsole_cbuffer)); memset(_iconsole_cbuffer, 0, sizeof(_iconsole_cbuffer));
_iconsole_cmdline.buf = calloc(ICON_CMDLN_SIZE, sizeof(*_iconsole_cmdline.buf)); // create buffer and zero it CallocT(&_iconsole_cmdline.buf, ICON_CMDLN_SIZE); // create buffer and zero it
_iconsole_cmdline.maxlength = ICON_CMDLN_SIZE; _iconsole_cmdline.maxlength = ICON_CMDLN_SIZE;
IConsolePrintF(13, "OpenTTD Game Console Revision 7 - %s", _openttd_revision); IConsolePrintF(13, "OpenTTD Game Console Revision 7 - %s", _openttd_revision);
@ -612,7 +613,8 @@ void IConsoleVarHookAdd(const char *name, IConsoleHookTypes type, IConsoleHook *
void IConsoleCmdRegister(const char *name, IConsoleCmdProc *proc) void IConsoleCmdRegister(const char *name, IConsoleCmdProc *proc)
{ {
char *new_cmd = strdup(name); char *new_cmd = strdup(name);
IConsoleCmd *item_new = malloc(sizeof(IConsoleCmd)); IConsoleCmd *item_new;
MallocT(&item_new, 1);
item_new->next = NULL; item_new->next = NULL;
item_new->proc = proc; item_new->proc = proc;
@ -649,7 +651,8 @@ void IConsoleAliasRegister(const char *name, const char *cmd)
{ {
char *new_alias = strdup(name); char *new_alias = strdup(name);
char *cmd_aliased = strdup(cmd); char *cmd_aliased = strdup(cmd);
IConsoleAlias *item_new = malloc(sizeof(IConsoleAlias)); IConsoleAlias *item_new;
MallocT(&item_new, 1);
item_new->next = NULL; item_new->next = NULL;
item_new->cmdline = cmd_aliased; item_new->cmdline = cmd_aliased;
@ -784,7 +787,8 @@ void IConsoleVarStringRegister(const char *name, void *addr, uint32 size, const
void IConsoleVarRegister(const char *name, void *addr, IConsoleVarTypes type, const char *help) void IConsoleVarRegister(const char *name, void *addr, IConsoleVarTypes type, const char *help)
{ {
char *new_cmd = strdup(name); char *new_cmd = strdup(name);
IConsoleVar *item_new = malloc(sizeof(IConsoleVar)); IConsoleVar *item_new;
MallocT(&item_new, 1);
item_new->help = (help != NULL) ? strdup(help) : NULL; item_new->help = (help != NULL) ? strdup(help) : NULL;
@ -861,7 +865,7 @@ static void IConsoleVarSetStringvalue(const IConsoleVar *var, const char *value)
if (var->type != ICONSOLE_VAR_STRING || var->addr == NULL) return; if (var->type != ICONSOLE_VAR_STRING || var->addr == NULL) return;
IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION); IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_PRE_ACTION);
ttd_strlcpy(var->addr, value, var->size); ttd_strlcpy((char*)var->addr, value, var->size);
IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION); IConsoleHookHandle(&var->hook, ICONSOLE_HOOK_POST_ACTION);
IConsoleVarPrintSetValue(var); // print out the new value, giving feedback IConsoleVarPrintSetValue(var); // print out the new value, giving feedback
return; return;

View File

@ -562,7 +562,7 @@ DEF_CONSOLE_CMD(ConStatus)
const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs); const NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
const char* status; const char* status;
status = (cs->status < lengthof(stat_str) ? stat_str[cs->status] : "unknown"); status = (cs->status < (ptrdiff_t)lengthof(stat_str) ? stat_str[cs->status] : "unknown");
IConsolePrintF(8, "Client #%1d name: '%s' status: '%s' frame-lag: %3d company: %1d IP: %s unique-id: '%s'", IConsolePrintF(8, "Client #%1d name: '%s' status: '%s' frame-lag: %3d company: %1d IP: %s unique-id: '%s'",
cs->index, ci->client_name, status, lag, cs->index, ci->client_name, status, lag,
ci->client_playas + (IsValidPlayer(ci->client_playas) ? 1 : 0), ci->client_playas + (IsValidPlayer(ci->client_playas) ? 1 : 0),
@ -684,7 +684,7 @@ DEF_CONSOLE_CMD(ConResetCompany)
if (argc != 2) return false; if (argc != 2) return false;
index = atoi(argv[1]) - 1; index = (PlayerID)(atoi(argv[1]) - 1);
/* Check valid range */ /* Check valid range */
if (!IsValidPlayer(index)) { if (!IsValidPlayer(index)) {
@ -770,7 +770,7 @@ DEF_CONSOLE_CMD(ConNetworkConnect)
IConsolePrintF(_icolour_def, "Connecting to %s...", ip); IConsolePrintF(_icolour_def, "Connecting to %s...", ip);
if (player != NULL) { if (player != NULL) {
_network_playas = atoi(player); _network_playas = (PlayerID)atoi(player);
IConsolePrintF(_icolour_def, " player-no: %d", _network_playas); IConsolePrintF(_icolour_def, " player-no: %d", _network_playas);
/* From a user pov 0 is a new player, internally it's different and all /* From a user pov 0 is a new player, internally it's different and all

View File

@ -3,6 +3,10 @@
#ifndef DEBUG_H #ifndef DEBUG_H
#define DEBUG_H #define DEBUG_H
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
/* Debugging messages policy: /* Debugging messages policy:
* These should be the severities used for direct DEBUG() calls * These should be the severities used for direct DEBUG() calls
* maximum debugging level should be 10 if really deep, deep * maximum debugging level should be 10 if really deep, deep
@ -105,4 +109,8 @@ const char *GetDebugString(void);
}\ }\
} }
#ifdef __cplusplus
}
#endif //__cplusplus
#endif /* DEBUG_H */ #endif /* DEBUG_H */

View File

@ -122,6 +122,6 @@ static void Load_DEPT(void)
} }
} }
const ChunkHandler _depot_chunk_handlers[] = { extern const ChunkHandler _depot_chunk_handlers[] = {
{ 'DEPT', Save_DEPT, Load_DEPT, CH_ARRAY | CH_LAST}, { 'DEPT', Save_DEPT, Load_DEPT, CH_ARRAY | CH_LAST},
}; };

View File

@ -3,8 +3,11 @@
#ifndef DIRECTION_H #ifndef DIRECTION_H
#define DIRECTION_H #define DIRECTION_H
#include "helpers.hpp"
/* Direction as commonly used in v->direction, 8 way. */ /* Direction as commonly used in v->direction, 8 way. */
typedef enum Direction { typedef enum Direction {
DIR_BEGIN = 0,
DIR_N = 0, DIR_N = 0,
DIR_NE = 1, /* Northeast, upper right on your monitor */ DIR_NE = 1, /* Northeast, upper right on your monitor */
DIR_E = 2, DIR_E = 2,
@ -17,6 +20,10 @@ typedef enum Direction {
INVALID_DIR = 0xFF, INVALID_DIR = 0xFF,
} Direction; } Direction;
/** Define basic enum properties */
template <> struct EnumPropsT<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {};
typedef TinyEnumT<Direction> DirectionByte;
static inline Direction ReverseDir(Direction d) static inline Direction ReverseDir(Direction d)
{ {
return (Direction)(4 ^ d); return (Direction)(4 ^ d);
@ -51,6 +58,7 @@ static inline Direction ChangeDir(Direction d, DirDiff delta)
/* Direction commonly used as the direction of entering and leaving tiles, 4-way */ /* Direction commonly used as the direction of entering and leaving tiles, 4-way */
typedef enum DiagDirection { typedef enum DiagDirection {
DIAGDIR_BEGIN = 0,
DIAGDIR_NE = 0, /* Northeast, upper right on your monitor */ DIAGDIR_NE = 0, /* Northeast, upper right on your monitor */
DIAGDIR_SE = 1, DIAGDIR_SE = 1,
DIAGDIR_SW = 2, DIAGDIR_SW = 2,
@ -59,6 +67,12 @@ typedef enum DiagDirection {
INVALID_DIAGDIR = 0xFF, INVALID_DIAGDIR = 0xFF,
} DiagDirection; } DiagDirection;
DECLARE_POSTFIX_INCREMENT(DiagDirection);
/** Define basic enum properties */
template <> struct EnumPropsT<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {};
typedef TinyEnumT<DiagDirection> DiagDirectionByte;
static inline DiagDirection ReverseDiagDir(DiagDirection d) static inline DiagDirection ReverseDiagDir(DiagDirection d)
{ {
return (DiagDirection)(2 ^ d); return (DiagDirection)(2 ^ d);

View File

@ -276,7 +276,7 @@ static void DisasterTick_UFO(Vehicle *v)
// fly around randomly // fly around randomly
int x = TileX(v->dest_tile) * TILE_SIZE; int x = TileX(v->dest_tile) * TILE_SIZE;
int y = TileY(v->dest_tile) * TILE_SIZE; int y = TileY(v->dest_tile) * TILE_SIZE;
if (abs(x - v->x_pos) + abs(y - v->y_pos) >= TILE_SIZE) { if (delta(x, v->x_pos) + delta(y, v->y_pos) >= TILE_SIZE) {
v->direction = GetDirectionTowards(v, x, y); v->direction = GetDirectionTowards(v, x, y);
GetNewVehiclePos(v, &gp); GetNewVehiclePos(v, &gp);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos); SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@ -305,7 +305,7 @@ static void DisasterTick_UFO(Vehicle *v)
return; return;
} }
dist = abs(v->x_pos - u->x_pos) + abs(v->y_pos - u->y_pos); dist = delta(v->x_pos, u->x_pos) + delta(v->y_pos, u->y_pos);
if (dist < TILE_SIZE && !(u->vehstatus&VS_HIDDEN) && u->breakdown_ctr==0) { if (dist < TILE_SIZE && !(u->vehstatus&VS_HIDDEN) && u->breakdown_ctr==0) {
u->breakdown_ctr = 3; u->breakdown_ctr = 3;
@ -526,7 +526,7 @@ static void DisasterTick_4(Vehicle *v)
if (v->current_order.dest == 1) { if (v->current_order.dest == 1) {
int x = TileX(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2; int x = TileX(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2;
int y = TileY(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2; int y = TileY(v->dest_tile) * TILE_SIZE + TILE_SIZE / 2;
if (abs(v->x_pos - x) + abs(v->y_pos - y) >= 8) { if (delta(v->x_pos, x) + delta(v->y_pos, y) >= 8) {
v->direction = GetDirectionTowards(v, x, y); v->direction = GetDirectionTowards(v, x, y);
GetNewVehiclePos(v, &gp); GetNewVehiclePos(v, &gp);
@ -544,7 +544,7 @@ static void DisasterTick_4(Vehicle *v)
FOR_ALL_VEHICLES(u) { FOR_ALL_VEHICLES(u) {
if (u->type == VEH_Train || u->type == VEH_Road) { if (u->type == VEH_Train || u->type == VEH_Road) {
if (abs(u->x_pos - v->x_pos) + abs(u->y_pos - v->y_pos) <= 12 * TILE_SIZE) { if (delta(u->x_pos, v->x_pos) + delta(u->y_pos, v->y_pos) <= 12 * TILE_SIZE) {
u->breakdown_ctr = 5; u->breakdown_ctr = 5;
u->breakdown_delay = 0xF0; u->breakdown_delay = 0xF0;
} }
@ -578,7 +578,7 @@ static void DisasterTick_4(Vehicle *v)
int x = TileX(v->dest_tile) * TILE_SIZE; int x = TileX(v->dest_tile) * TILE_SIZE;
int y = TileY(v->dest_tile) * TILE_SIZE; int y = TileY(v->dest_tile) * TILE_SIZE;
if (abs(x - v->x_pos) + abs(y - v->y_pos) >= TILE_SIZE) { if (delta(x, v->x_pos) + delta(y, v->y_pos) >= TILE_SIZE) {
v->direction = GetDirectionTowards(v, x, y); v->direction = GetDirectionTowards(v, x, y);
GetNewVehiclePos(v, &gp); GetNewVehiclePos(v, &gp);
SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos); SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
@ -626,7 +626,7 @@ static void DisasterTick_4b(Vehicle *v)
if (v->current_order.dest == 0) { if (v->current_order.dest == 0) {
u = GetVehicle(v->u.disaster.unk2); u = GetVehicle(v->u.disaster.unk2);
if (abs(v->x_pos - u->x_pos) > TILE_SIZE) if (delta(v->x_pos, u->x_pos) > TILE_SIZE)
return; return;
v->current_order.dest = 1; v->current_order.dest = 1;

View File

@ -254,7 +254,7 @@ static void BuildDockStationWndProc(Window *w, WindowEvent *e)
case 3: case 3:
case 4: case 4:
RaiseWindowWidget(w, _station_show_coverage + 3); RaiseWindowWidget(w, _station_show_coverage + 3);
_station_show_coverage = e->we.click.widget - 3; _station_show_coverage = (e->we.click.widget != 3);
LowerWindowWidget(w, _station_show_coverage + 3); LowerWindowWidget(w, _station_show_coverage + 3);
SndPlayFx(SND_15_BEEP); SndPlayFx(SND_15_BEEP);
SetWindowDirty(w); SetWindowDirty(w);
@ -328,7 +328,7 @@ static void BuildDocksDepotWndProc(Window *w, WindowEvent *e)
case 3: case 3:
case 4: case 4:
RaiseWindowWidget(w, _ship_depot_direction + 3); RaiseWindowWidget(w, _ship_depot_direction + 3);
_ship_depot_direction = e->we.click.widget - 3; _ship_depot_direction = (e->we.click.widget == 3 ? AXIS_X : AXIS_Y);
LowerWindowWidget(w, _ship_depot_direction + 3); LowerWindowWidget(w, _ship_depot_direction + 3);
SndPlayFx(SND_15_BEEP); SndPlayFx(SND_15_BEEP);
UpdateDocksDirection(); UpdateDocksDirection();

View File

@ -66,7 +66,7 @@ static uint32 GetTileTrackStatus_Dummy(TileIndex tile, TransportType mode)
return 0; return 0;
} }
const TileTypeProcs _tile_type_dummy_procs = { extern const TileTypeProcs _tile_type_dummy_procs = {
DrawTile_Dummy, /* draw_tile_proc */ DrawTile_Dummy, /* draw_tile_proc */
GetSlopeZ_Dummy, /* get_slope_z_proc */ GetSlopeZ_Dummy, /* get_slope_z_proc */
ClearTile_Dummy, /* clear_tile_proc */ ClearTile_Dummy, /* clear_tile_proc */

View File

@ -47,7 +47,7 @@ const ScoreInfo _score_info[] = {
{ SCORE_TOTAL, 0, 0 } { SCORE_TOTAL, 0, 0 }
}; };
int _score_part[MAX_PLAYERS][NUM_SCORE]; int _score_part[MAX_PLAYERS][SCORE_END];
int64 CalculateCompanyValue(const Player* p) int64 CalculateCompanyValue(const Player* p)
{ {
@ -209,11 +209,10 @@ int UpdateCompanyRatingAndValue(Player *p, bool update)
// Now we calculate the score for each item.. // Now we calculate the score for each item..
{ {
int i;
int total_score = 0; int total_score = 0;
int s; int s;
score = 0; score = 0;
for (i = 0; i < NUM_SCORE; i++) { for (ScoreID i = SCORE_BEGIN; i < SCORE_END; i++) {
// Skip the total // Skip the total
if (i == SCORE_TOTAL) continue; if (i == SCORE_TOTAL) continue;
// Check the score // Check the score
@ -467,7 +466,7 @@ void DrawNewsBankrupcy(Window *w)
DrawNewsBorder(w); DrawNewsBorder(w);
p = GetPlayer(GB(WP(w,news_d).ni->string_id, 0, 4)); p = GetPlayer((PlayerID)GB(WP(w,news_d).ni->string_id, 0, 4));
DrawPlayerFace(p->face, p->player_color, 2, 23); DrawPlayerFace(p->face, p->player_color, 2, 23);
GfxFillRect(3, 23, 3+91, 23+118, 0x323 | USE_COLORTABLE); GfxFillRect(3, 23, 3+91, 23+118, 0x323 | USE_COLORTABLE);
@ -536,7 +535,7 @@ void DrawNewsBankrupcy(Window *w)
StringID GetNewsStringBankrupcy(const NewsItem *ni) StringID GetNewsStringBankrupcy(const NewsItem *ni)
{ {
const Player *p = GetPlayer(GB(ni->string_id, 0, 4)); const Player *p = GetPlayer((PlayerID)GB(ni->string_id, 0, 4));
switch (ni->string_id & 0xF0) { switch (ni->string_id & 0xF0) {
case NB_BTROUBLE: case NB_BTROUBLE:
@ -1562,7 +1561,7 @@ void PlayersMonthlyLoop(void)
static void DoAcquireCompany(Player *p) static void DoAcquireCompany(Player *p)
{ {
Player *owner; Player *owner;
int i,pi; int i;
int64 value; int64 value;
SetDParam(0, p->name_1); SetDParam(0, p->name_1);
@ -1571,7 +1570,7 @@ static void DoAcquireCompany(Player *p)
AddNewsItem( (StringID)(_current_player | NB_BMERGER), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0); AddNewsItem( (StringID)(_current_player | NB_BMERGER), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
// original code does this a little bit differently // original code does this a little bit differently
pi = p->index; PlayerID pi = p->index;
ChangeOwnershipOfPlayerItems(pi, _current_player); ChangeOwnershipOfPlayerItems(pi, _current_player);
if (p->bankrupt_value == 0) { if (p->bankrupt_value == 0) {
@ -1595,7 +1594,7 @@ static void DoAcquireCompany(Player *p)
RebuildVehicleLists(); //Updates the open windows to add the newly acquired vehicles to the lists RebuildVehicleLists(); //Updates the open windows to add the newly acquired vehicles to the lists
} }
extern int GetAmountOwnedBy(Player *p, byte owner); extern int GetAmountOwnedBy(const Player *p, PlayerID owner);
/** Acquire shares in an opposing company. /** Acquire shares in an opposing company.
* @param tile unused * @param tile unused
@ -1611,7 +1610,7 @@ int32 CmdBuyShareInCompany(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsValidPlayer((PlayerID)p1) || !_patches.allow_shares) return CMD_ERROR; if (!IsValidPlayer((PlayerID)p1) || !_patches.allow_shares) return CMD_ERROR;
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
p = GetPlayer(p1); p = GetPlayer((PlayerID)p1);
/* Protect new companies from hostile takeovers */ /* Protect new companies from hostile takeovers */
if (_cur_year - p->inaugurated_year < 6) return_cmd_error(STR_7080_PROTECTED); if (_cur_year - p->inaugurated_year < 6) return_cmd_error(STR_7080_PROTECTED);
@ -1624,7 +1623,7 @@ int32 CmdBuyShareInCompany(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
cost = CalculateCompanyValue(p) >> 2; cost = CalculateCompanyValue(p) >> 2;
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
PlayerID* b = p->share_owners; PlayerByte* b = p->share_owners;
int i; int i;
while (*b != PLAYER_SPECTATOR) b++; /* share owners is guaranteed to contain at least one PLAYER_SPECTATOR */ while (*b != PLAYER_SPECTATOR) b++; /* share owners is guaranteed to contain at least one PLAYER_SPECTATOR */
@ -1656,7 +1655,7 @@ int32 CmdSellShareInCompany(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsValidPlayer((PlayerID)p1) || !_patches.allow_shares) return CMD_ERROR; if (!IsValidPlayer((PlayerID)p1) || !_patches.allow_shares) return CMD_ERROR;
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
p = GetPlayer(p1); p = GetPlayer((PlayerID)p1);
/* Those lines are here for network-protection (clients can be slow) */ /* Those lines are here for network-protection (clients can be slow) */
if (GetAmountOwnedBy(p, _current_player) == 0) return 0; if (GetAmountOwnedBy(p, _current_player) == 0) return 0;
@ -1666,7 +1665,7 @@ int32 CmdSellShareInCompany(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
cost = -(cost - (cost >> 7)); cost = -(cost - (cost >> 7));
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
PlayerID* b = p->share_owners; PlayerByte* b = p->share_owners;
while (*b != _current_player) b++; /* share owners is guaranteed to contain player */ while (*b != _current_player) b++; /* share owners is guaranteed to contain player */
*b = PLAYER_SPECTATOR; *b = PLAYER_SPECTATOR;
InvalidateWindow(WC_COMPANY, p1); InvalidateWindow(WC_COMPANY, p1);
@ -1690,7 +1689,7 @@ int32 CmdBuyCompany(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (!IsValidPlayer((PlayerID)p1) || _networking) return CMD_ERROR; if (!IsValidPlayer((PlayerID)p1) || _networking) return CMD_ERROR;
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
p = GetPlayer(p1); p = GetPlayer((PlayerID)p1);
if (!p->is_ai) return CMD_ERROR; if (!p->is_ai) return CMD_ERROR;
@ -1730,7 +1729,7 @@ static void SaveLoad_ECMY(void)
SlObject(&_economy, _economy_desc); SlObject(&_economy, _economy_desc);
} }
const ChunkHandler _economy_chunk_handlers[] = { extern const ChunkHandler _economy_chunk_handlers[] = {
{ 'PRIC', SaveLoad_PRIC, SaveLoad_PRIC, CH_RIFF | CH_AUTO_LENGTH}, { 'PRIC', SaveLoad_PRIC, SaveLoad_PRIC, CH_RIFF | CH_AUTO_LENGTH},
{ 'CAPR', SaveLoad_CAPR, SaveLoad_CAPR, CH_RIFF | CH_AUTO_LENGTH}, { 'CAPR', SaveLoad_CAPR, SaveLoad_CAPR, CH_RIFF | CH_AUTO_LENGTH},
{ 'SUBS', Save_SUBS, Load_SUBS, CH_ARRAY}, { 'SUBS', Save_SUBS, Load_SUBS, CH_ARRAY},

View File

@ -29,7 +29,8 @@ typedef struct Subsidy {
} Subsidy; } Subsidy;
enum { enum ScoreID {
SCORE_BEGIN = 0,
SCORE_VEHICLES = 0, SCORE_VEHICLES = 0,
SCORE_STATIONS = 1, SCORE_STATIONS = 1,
SCORE_MIN_PROFIT = 2, SCORE_MIN_PROFIT = 2,
@ -40,13 +41,14 @@ enum {
SCORE_MONEY = 7, SCORE_MONEY = 7,
SCORE_LOAN = 8, SCORE_LOAN = 8,
SCORE_TOTAL = 9, // This must always be the last entry SCORE_TOTAL = 9, // This must always be the last entry
SCORE_END = 10, // How many scores are there..
NUM_SCORE = 10, // How many scores are there..
SCORE_MAX = 1000 // The max score that can be in the performance history SCORE_MAX = 1000 // The max score that can be in the performance history
// the scores together of score_info is allowed to be more! // the scores together of score_info is allowed to be more!
}; };
DECLARE_POSTFIX_INCREMENT(ScoreID);
typedef struct ScoreInfo { typedef struct ScoreInfo {
byte id; // Unique ID of the score byte id; // Unique ID of the score
int needed; // How much you need to get the perfect score int needed; // How much you need to get the perfect score
@ -54,7 +56,7 @@ typedef struct ScoreInfo {
} ScoreInfo; } ScoreInfo;
extern const ScoreInfo _score_info[]; extern const ScoreInfo _score_info[];
extern int _score_part[MAX_PLAYERS][NUM_SCORE]; extern int _score_part[MAX_PLAYERS][SCORE_END];
int UpdateCompanyRatingAndValue(Player *p, bool update); int UpdateCompanyRatingAndValue(Player *p, bool update);

View File

@ -67,7 +67,7 @@
static inline TLG GetTLG(TileIndex t) static inline TLG GetTLG(TileIndex t)
{ {
return (HASBIT(TileX(t), 0) << 1) + HASBIT(TileY(t), 0); return (TLG)((HASBIT(TileX(t), 0) << 1) + HASBIT(TileY(t), 0));
} }
/** Finds which Rail Bits are present on a given tile. For bridge tiles, /** Finds which Rail Bits are present on a given tile. For bridge tiles,
@ -77,24 +77,24 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
{ {
switch (GetTileType(t)) { switch (GetTileType(t)) {
case MP_RAILWAY: case MP_RAILWAY:
if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0; if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
switch (GetRailTileType(t)) { switch (GetRailTileType(t)) {
case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS: case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS:
return GetTrackBits(t); return GetTrackBits(t);
case RAIL_TILE_DEPOT_WAYPOINT: case RAIL_TILE_DEPOT_WAYPOINT:
if (GetRailTileSubtype(t) == RAIL_SUBTYPE_WAYPOINT) return GetRailWaypointBits(t); if (GetRailTileSubtype(t) == RAIL_SUBTYPE_WAYPOINT) return GetRailWaypointBits(t);
default: default:
return 0; return TRACK_BIT_NONE;
} }
break; break;
case MP_TUNNELBRIDGE: case MP_TUNNELBRIDGE:
if (IsTunnel(t)) { if (IsTunnel(t)) {
if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0; if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
if (override != NULL) *override = 1 << GetTunnelDirection(t); if (override != NULL) *override = 1 << GetTunnelDirection(t);
return AxisToTrackBits(DiagDirToAxis(GetTunnelDirection(t))); return AxisToTrackBits(DiagDirToAxis(GetTunnelDirection(t)));
} else { } else {
if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0; if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
if (override != NULL && DistanceMax(t, GetOtherBridgeEnd(t)) > 1) { if (override != NULL && DistanceMax(t, GetOtherBridgeEnd(t)) > 1) {
*override = 1 << GetBridgeRampDirection(t); *override = 1 << GetBridgeRampDirection(t);
} }
@ -102,18 +102,18 @@ static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
} }
case MP_STREET: case MP_STREET:
if (GetRoadTileType(t) != ROAD_TILE_CROSSING) return 0; if (GetRoadTileType(t) != ROAD_TILE_CROSSING) return TRACK_BIT_NONE;
if (GetRailTypeCrossing(t) != RAILTYPE_ELECTRIC) return 0; if (GetRailTypeCrossing(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
return GetCrossingRailBits(t); return GetCrossingRailBits(t);
case MP_STATION: case MP_STATION:
if (!IsRailwayStation(t)) return 0; if (!IsRailwayStation(t)) return TRACK_BIT_NONE;
if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0; if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
if (!IsStationTileElectrifiable(t)) return 0; if (!IsStationTileElectrifiable(t)) return TRACK_BIT_NONE;
return TrackToTrackBits(GetRailStationTrack(t)); return TrackToTrackBits(GetRailStationTrack(t));
default: default:
return 0; return TRACK_BIT_NONE;
} }
} }
@ -171,7 +171,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
* which have no middle tiles */ * which have no middle tiles */
trackconfig[TS_HOME] = GetRailTrackBitsUniversal(ti->tile, &OverridePCP); trackconfig[TS_HOME] = GetRailTrackBitsUniversal(ti->tile, &OverridePCP);
/* If a track bit is present that is not in the main direction, the track is level */ /* If a track bit is present that is not in the main direction, the track is level */
isflat[TS_HOME] = trackconfig[TS_HOME] & (TRACK_BIT_HORZ | TRACK_BIT_VERT); isflat[TS_HOME] = ((trackconfig[TS_HOME] & (TRACK_BIT_HORZ | TRACK_BIT_VERT)) != 0);
AdjustTileh(ti->tile, &tileh[TS_HOME]); AdjustTileh(ti->tile, &tileh[TS_HOME]);
@ -184,8 +184,8 @@ static void DrawCatenaryRailway(const TileInfo *ti)
* existing foundataions, so we do have to do that manually later on.*/ * existing foundataions, so we do have to do that manually later on.*/
tileh[TS_NEIGHBOUR] = GetTileSlope(neighbour, NULL); tileh[TS_NEIGHBOUR] = GetTileSlope(neighbour, NULL);
trackconfig[TS_NEIGHBOUR] = GetRailTrackBitsUniversal(neighbour, NULL); trackconfig[TS_NEIGHBOUR] = GetRailTrackBitsUniversal(neighbour, NULL);
if (IsTunnelTile(neighbour) && i != GetTunnelDirection(neighbour)) trackconfig[TS_NEIGHBOUR] = 0; if (IsTunnelTile(neighbour) && i != GetTunnelDirection(neighbour)) trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
isflat[TS_NEIGHBOUR] = trackconfig[TS_NEIGHBOUR] & (TRACK_BIT_HORZ | TRACK_BIT_VERT); isflat[TS_NEIGHBOUR] = ((trackconfig[TS_NEIGHBOUR] & (TRACK_BIT_HORZ | TRACK_BIT_VERT)) != 0);
PPPpreferred[i] = 0xFF; /* We start with preferring everything (end-of-line in any direction) */ PPPpreferred[i] = 0xFF; /* We start with preferring everything (end-of-line in any direction) */
PPPallowed[i] = AllowedPPPonPCP[i]; PPPallowed[i] = AllowedPPPonPCP[i];
@ -289,7 +289,7 @@ static void DrawCatenaryRailway(const TileInfo *ti)
} }
/* Drawing of pylons is finished, now draw the wires */ /* Drawing of pylons is finished, now draw the wires */
for (t = 0; t < TRACK_END; t++) { for (t = TRACK_BEGIN; t < TRACK_END; t++) {
if (HASBIT(trackconfig[TS_HOME], t)) { if (HASBIT(trackconfig[TS_HOME], t)) {
byte PCPconfig = HASBIT(PCPstatus, PCPpositions[t][0]) + byte PCPconfig = HASBIT(PCPstatus, PCPpositions[t][0]) +
@ -321,7 +321,7 @@ static void DrawCatenaryOnBridge(const TileInfo *ti)
Axis axis = GetBridgeAxis(ti->tile); Axis axis = GetBridgeAxis(ti->tile);
TLG tlg = GetTLG(ti->tile); TLG tlg = GetTLG(ti->tile);
CatenarySprite offset = axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH; CatenarySprite offset = (CatenarySprite)(axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH);
if ((length % 2) && num == length) { if ((length % 2) && num == length) {
/* Draw the "short" wire on the southern end of the bridge /* Draw the "short" wire on the southern end of the bridge

View File

@ -1,6 +1,7 @@
/* $Id$ */ /* $Id$ */
#include <stdio.h> #include <stdio.h>
#include <string.h>
// This pretty simple file checks if the system is LITTLE_ENDIAN or BIG_ENDIAN // This pretty simple file checks if the system is LITTLE_ENDIAN or BIG_ENDIAN
// it does that by putting a 1 and a 0 in an array, and read it out as one // it does that by putting a 1 and a 0 in an array, and read it out as one

View File

@ -129,7 +129,7 @@ void StartupEngines(void)
uint32 r; uint32 r;
e->age = 0; e->age = 0;
e->railtype = ei->railtype; e->railtype = (RailType)ei->railtype;
e->flags = 0; e->flags = 0;
e->player_avail = 0; e->player_avail = 0;
@ -189,7 +189,7 @@ static void AcceptEnginePreview(Engine *e, PlayerID player)
SETBIT(e->player_avail, player); SETBIT(e->player_avail, player);
SETBIT(p->avail_railtypes, e->railtype); SETBIT(p->avail_railtypes, e->railtype);
e->preview_player = 0xFF; e->preview_player = INVALID_PLAYER;
if (player == _local_player) { if (player == _local_player) {
InvalidateWindowClassesData(WC_BUILD_VEHICLE); InvalidateWindowClassesData(WC_BUILD_VEHICLE);
InvalidateWindowClasses(WC_REPLACE_VEHICLE); InvalidateWindowClasses(WC_REPLACE_VEHICLE);
@ -217,7 +217,7 @@ static PlayerID GetBestPlayer(PlayerID pp)
if (best_player == PLAYER_SPECTATOR) return PLAYER_SPECTATOR; if (best_player == PLAYER_SPECTATOR) return PLAYER_SPECTATOR;
SETBIT(mask, best_player); SETBIT(mask, best_player);
} while (--pp != 0); } while (pp--, pp != 0);
return best_player; return best_player;
} }
@ -242,7 +242,7 @@ void EnginesDailyLoop(void)
PlayerID best_player = GetBestPlayer(e->preview_player); PlayerID best_player = GetBestPlayer(e->preview_player);
if (best_player == PLAYER_SPECTATOR) { if (best_player == PLAYER_SPECTATOR) {
e->preview_player = 0xFF; e->preview_player = INVALID_PLAYER;
continue; continue;
} }
@ -364,7 +364,7 @@ void EnginesMonthlyLoop(void)
// Do not introduce new rail wagons // Do not introduce new rail wagons
if (!IsWagon(e - _engines)) if (!IsWagon(e - _engines))
e->preview_player = 1; // Give to the player with the highest rating. e->preview_player = (PlayerID)1; // Give to the player with the highest rating.
} }
} }
} }
@ -636,7 +636,7 @@ static void LoadSave_ENGS(void)
SlArray(_engine_name_strings, lengthof(_engine_name_strings), SLE_STRINGID); SlArray(_engine_name_strings, lengthof(_engine_name_strings), SLE_STRINGID);
} }
const ChunkHandler _engine_chunk_handlers[] = { extern const ChunkHandler _engine_chunk_handlers[] = {
{ 'ENGN', Save_ENGN, Load_ENGN, CH_ARRAY }, { 'ENGN', Save_ENGN, Load_ENGN, CH_ARRAY },
{ 'ENGS', LoadSave_ENGS, LoadSave_ENGS, CH_RIFF }, { 'ENGS', LoadSave_ENGS, LoadSave_ENGS, CH_RIFF },
{ 'ERNW', Save_ERNW, Load_ERNW, CH_ARRAY | CH_LAST}, { 'ERNW', Save_ERNW, Load_ERNW, CH_ARRAY | CH_LAST},

View File

@ -6,6 +6,8 @@
/** @file engine.h */ /** @file engine.h */
#include "oldpool.h" #include "oldpool.h"
#include "rail.h"
#include "sound.h"
typedef struct RailVehicleInfo { typedef struct RailVehicleInfo {
byte image_index; byte image_index;
@ -38,8 +40,8 @@ typedef struct ShipVehicleInfo {
CargoID cargo_type; CargoID cargo_type;
uint16 capacity; uint16 capacity;
byte running_cost; byte running_cost;
byte sfx; SoundFxByte sfx;
byte refittable; bool refittable;
} ShipVehicleInfo; } ShipVehicleInfo;
// Aircraft subtypes // Aircraft subtypes
@ -53,7 +55,7 @@ typedef struct AircraftVehicleInfo {
byte base_cost; byte base_cost;
byte running_cost; byte running_cost;
byte subtype; byte subtype;
byte sfx; SoundFxByte sfx;
byte acceleration; byte acceleration;
byte max_speed; byte max_speed;
byte mail_capacity; byte mail_capacity;
@ -64,7 +66,7 @@ typedef struct RoadVehicleInfo {
byte image_index; byte image_index;
byte base_cost; byte base_cost;
byte running_cost; byte running_cost;
byte sfx; SoundFxByte sfx;
byte max_speed; byte max_speed;
byte capacity; byte capacity;
CargoID cargo_type; CargoID cargo_type;
@ -96,9 +98,9 @@ typedef struct Engine {
uint16 duration_phase_1, duration_phase_2, duration_phase_3; uint16 duration_phase_1, duration_phase_2, duration_phase_3;
byte lifelength; byte lifelength;
byte flags; byte flags;
byte preview_player; PlayerByte preview_player;
byte preview_wait; byte preview_wait;
byte railtype; RailTypeByte railtype;
byte player_avail; byte player_avail;
byte type; // type, ie VEH_Road, VEH_Train, etc. Same as in vehicle.h byte type; // type, ie VEH_Road, VEH_Train, etc. Same as in vehicle.h
} Engine; } Engine;
@ -122,9 +124,8 @@ enum {
NUM_VEHICLE_TYPES = 6 NUM_VEHICLE_TYPES = 6
}; };
enum { static const EngineID INVALID_ENGINE = 0xFFFF;
INVALID_ENGINE = 0xFFFF,
};
void AddTypeToEngines(void); void AddTypeToEngines(void);
void StartupEngines(void); void StartupEngines(void);

View File

@ -24,6 +24,7 @@ static StringID GetEngineCategoryName(EngineID engine)
case RAILTYPE_ELECTRIC: return STR_8102_RAILROAD_LOCOMOTIVE; case RAILTYPE_ELECTRIC: return STR_8102_RAILROAD_LOCOMOTIVE;
case RAILTYPE_MONO: return STR_8106_MONORAIL_LOCOMOTIVE; case RAILTYPE_MONO: return STR_8106_MONORAIL_LOCOMOTIVE;
case RAILTYPE_MAGLEV: return STR_8107_MAGLEV_LOCOMOTIVE; case RAILTYPE_MAGLEV: return STR_8107_MAGLEV_LOCOMOTIVE;
default: NOT_REACHED();
} }
} }

View File

@ -11,6 +11,7 @@
#include "variables.h" #include "variables.h"
#include "functions.h" #include "functions.h"
#include "heightmap.h" #include "heightmap.h"
#include "helpers.hpp"
#include "table/strings.h" #include "table/strings.h"
#include "fios.h" #include "fios.h"
#include <sys/types.h> #include <sys/types.h>
@ -47,7 +48,7 @@ FiosItem *FiosAlloc(void)
{ {
if (_fios_count == _fios_alloc) { if (_fios_count == _fios_alloc) {
_fios_alloc += 256; _fios_alloc += 256;
_fios_items = realloc(_fios_items, _fios_alloc * sizeof(FiosItem)); ReallocT(&_fios_items, _fios_alloc);
} }
return &_fios_items[_fios_count++]; return &_fios_items[_fios_count++];
} }
@ -323,7 +324,7 @@ FiosItem *FiosGetSavegameList(int mode)
static char *_fios_save_path = NULL; static char *_fios_save_path = NULL;
if (_fios_save_path == NULL) { if (_fios_save_path == NULL) {
_fios_save_path = malloc(MAX_PATH); MallocT(&_fios_save_path, MAX_PATH);
ttd_strlcpy(_fios_save_path, _paths.save_dir, MAX_PATH); ttd_strlcpy(_fios_save_path, _paths.save_dir, MAX_PATH);
} }
@ -371,7 +372,7 @@ FiosItem *FiosGetScenarioList(int mode)
static char *_fios_scn_path = NULL; static char *_fios_scn_path = NULL;
if (_fios_scn_path == NULL) { if (_fios_scn_path == NULL) {
_fios_scn_path = malloc(MAX_PATH); MallocT(&_fios_scn_path, MAX_PATH);
ttd_strlcpy(_fios_scn_path, _paths.scenario_dir, MAX_PATH); ttd_strlcpy(_fios_scn_path, _paths.scenario_dir, MAX_PATH);
} }
@ -402,7 +403,7 @@ FiosItem *FiosGetHeightmapList(int mode)
static char *_fios_hmap_path = NULL; static char *_fios_hmap_path = NULL;
if (_fios_hmap_path == NULL) { if (_fios_hmap_path == NULL) {
_fios_hmap_path = malloc(MAX_PATH); MallocT(&_fios_hmap_path, MAX_PATH);
strcpy(_fios_hmap_path, _paths.heightmap_dir); strcpy(_fios_hmap_path, _paths.heightmap_dir);
} }

View File

@ -11,6 +11,7 @@
#include "gfx.h" #include "gfx.h"
#include "string.h" #include "string.h"
#include "fontcache.h" #include "fontcache.h"
#include "helpers.hpp"
#ifdef WITH_FREETYPE #ifdef WITH_FREETYPE
@ -77,7 +78,7 @@ static FT_Error GetFontByFaceName(const char *font_name, FT_Face *face)
* normal char to match the data returned by RegEnumValue, * normal char to match the data returned by RegEnumValue,
* otherwise just use parameter */ * otherwise just use parameter */
#if defined(UNICODE) #if defined(UNICODE)
font_namep = malloc(MAX_PATH * sizeof(TCHAR)); MallocT(&font_namep, MAX_PATH);
MB_TO_WIDE_BUFFER(font_name, font_namep, MAX_PATH * sizeof(TCHAR)); MB_TO_WIDE_BUFFER(font_name, font_namep, MAX_PATH * sizeof(TCHAR));
#else #else
font_namep = (char*)font_name; // only cast because in unicode pointer is not const font_namep = (char*)font_name; // only cast because in unicode pointer is not const
@ -345,12 +346,12 @@ static void SetGlyphPtr(FontSize size, WChar key, const GlyphEntry *glyph)
{ {
if (_glyph_ptr[size] == NULL) { if (_glyph_ptr[size] == NULL) {
DEBUG(freetype, 3, "Allocating root glyph cache for size %u", size); DEBUG(freetype, 3, "Allocating root glyph cache for size %u", size);
_glyph_ptr[size] = calloc(256, sizeof(**_glyph_ptr)); CallocT(&_glyph_ptr[size], 256);
} }
if (_glyph_ptr[size][GB(key, 8, 8)] == NULL) { if (_glyph_ptr[size][GB(key, 8, 8)] == NULL) {
DEBUG(freetype, 3, "Allocating glyph cache for range 0x%02X00, size %u", GB(key, 8, 8), size); DEBUG(freetype, 3, "Allocating glyph cache for range 0x%02X00, size %u", GB(key, 8, 8), size);
_glyph_ptr[size][GB(key, 8, 8)] = calloc(256, sizeof(***_glyph_ptr)); CallocT(&_glyph_ptr[size][GB(key, 8, 8)], 256);
} }
DEBUG(freetype, 4, "Set glyph for unicode character 0x%04X, size %u", key, size); DEBUG(freetype, 4, "Set glyph for unicode character 0x%04X, size %u", key, size);
@ -395,7 +396,7 @@ const Sprite *GetGlyph(FontSize size, WChar key)
height = max(1, slot->bitmap.rows + (size == FS_NORMAL)); height = max(1, slot->bitmap.rows + (size == FS_NORMAL));
/* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */ /* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */
sprite = calloc(width * height + 8, 1); sprite = (Sprite*)calloc(width * height + 8, 1);
sprite->info = 1; sprite->info = 1;
sprite->width = width; sprite->width = width;
sprite->height = height; sprite->height = height;
@ -483,8 +484,8 @@ SpriteID GetUnicodeGlyph(FontSize size, uint32 key)
void SetUnicodeGlyph(FontSize size, uint32 key, SpriteID sprite) void SetUnicodeGlyph(FontSize size, uint32 key, SpriteID sprite)
{ {
if (_unicode_glyph_map[size] == NULL) _unicode_glyph_map[size] = calloc(256, sizeof(*_unicode_glyph_map[size])); if (_unicode_glyph_map[size] == NULL) CallocT(&_unicode_glyph_map[size], 256);
if (_unicode_glyph_map[size][GB(key, 8, 8)] == NULL) _unicode_glyph_map[size][GB(key, 8, 8)] = calloc(256, sizeof(**_unicode_glyph_map[size])); if (_unicode_glyph_map[size][GB(key, 8, 8)] == NULL) CallocT(&_unicode_glyph_map[size][GB(key, 8, 8)], 256);
_unicode_glyph_map[size][GB(key, 8, 8)][GB(key, 0, 8)] = sprite; _unicode_glyph_map[size][GB(key, 8, 8)][GB(key, 0, 8)] = sprite;
} }

View File

@ -10,7 +10,7 @@ uint GetPartialZ(int x, int y, Slope corners);
uint GetSlopeZ(int x, int y); uint GetSlopeZ(int x, int y);
uint32 GetTileTrackStatus(TileIndex tile, TransportType mode); uint32 GetTileTrackStatus(TileIndex tile, TransportType mode);
void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac); void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac);
void ChangeTileOwner(TileIndex tile, byte old_player, byte new_player); void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player);
void AnimateTile(TileIndex tile); void AnimateTile(TileIndex tile);
void ClickTile(TileIndex tile); void ClickTile(TileIndex tile);
void GetTileDesc(TileIndex tile, TileDesc *td); void GetTileDesc(TileIndex tile, TileDesc *td);
@ -217,5 +217,4 @@ void HandleExitGameRequest(void);
void DeterminePaths(void); void DeterminePaths(void);
void CSleep(int milliseconds);
#endif /* FUNCTIONS_H */ #endif /* FUNCTIONS_H */

View File

@ -182,7 +182,7 @@ void WaitTillGeneratedWorld(void)
{ {
if (_gw.thread == NULL) return; if (_gw.thread == NULL) return;
_gw.quit_thread = true; _gw.quit_thread = true;
OTTDJoinThread(_gw.thread); OTTDJoinThread((OTTDThread*)_gw.thread);
_gw.thread = NULL; _gw.thread = NULL;
_gw.threaded = false; _gw.threaded = false;
} }

View File

@ -34,7 +34,7 @@ typedef struct gw_info {
bool quit_thread; //! Do we want to quit the active thread bool quit_thread; //! Do we want to quit the active thread
bool threaded; //! Whether we run _GenerateWorld threaded bool threaded; //! Whether we run _GenerateWorld threaded
int mode; //! What mode are we making a world in int mode; //! What mode are we making a world in
byte lp; //! The local_player before generating PlayerID lp; //! The local_player before generating
uint size_x; //! X-size of the map uint size_x; //! X-size of the map
uint size_y; //! Y-size of the map uint size_y; //! Y-size of the map
gw_done_proc *proc; //! Proc that is called when done (can be NULL) gw_done_proc *proc; //! Proc that is called when done (can be NULL)
@ -84,8 +84,8 @@ bool IsGeneratingWorldAborted(void);
void HandleGeneratingWorldAbortion(void); void HandleGeneratingWorldAbortion(void);
/* genworld_gui.c */ /* genworld_gui.c */
void SetGeneratingWorldProgress(gwp_class class, uint total); void SetGeneratingWorldProgress(gwp_class cls, uint total);
void IncreaseGeneratingWorldProgress(gwp_class class); void IncreaseGeneratingWorldProgress(gwp_class cls);
void PrepareGenerateWorldProgress(void); void PrepareGenerateWorldProgress(void);
void ShowGenerateWorldProgress(void); void ShowGenerateWorldProgress(void);
void StartNewGameWithoutGUI(uint seed); void StartNewGameWithoutGUI(uint seed);

View File

@ -196,7 +196,7 @@ void GenerateLandscapeWndProc(Window *w, WindowEvent *e)
static querystr_d _genseed_query; static querystr_d _genseed_query;
static char _genseed_buffer[LEN_RND_SEED]; static char _genseed_buffer[LEN_RND_SEED];
uint mode = w->window_number; glwp_modes mode = (glwp_modes)w->window_number;
uint y; uint y;
switch (e->event) { switch (e->event) {
@ -714,7 +714,7 @@ static const Widget _show_terrain_progress_widgets[] = {
typedef struct tp_info { typedef struct tp_info {
uint percent; uint percent;
StringID class; StringID cls;
uint current; uint current;
uint total; uint total;
int timer; int timer;
@ -753,12 +753,12 @@ static void ShowTerrainProgressProc(Window* w, WindowEvent* e)
/* Draw the % complete with a bar and a text */ /* Draw the % complete with a bar and a text */
DrawFrameRect(19, 20, (w->width - 18), 37, 14, FR_BORDERONLY); DrawFrameRect(19, 20, (w->width - 18), 37, 14, FR_BORDERONLY);
DrawFrameRect(20, 21, (int)((w->width - 40) * _tp.percent / 100) + 20, 36, 10, 0); DrawFrameRect(20, 21, (int)((w->width - 40) * _tp.percent / 100) + 20, 36, 10, FR_NONE);
SetDParam(0, _tp.percent); SetDParam(0, _tp.percent);
DrawStringCentered(90, 25, STR_PROGRESS, 0); DrawStringCentered(90, 25, STR_PROGRESS, 0);
/* Tell which class we are generating */ /* Tell which class we are generating */
DrawStringCentered(90, 46, _tp.class, 0); DrawStringCentered(90, 46, _tp.cls, 0);
/* And say where we are in that class */ /* And say where we are in that class */
SetDParam(0, _tp.current); SetDParam(0, _tp.current);
@ -783,7 +783,7 @@ static const WindowDesc _show_terrain_progress_desc = {
*/ */
void PrepareGenerateWorldProgress(void) void PrepareGenerateWorldProgress(void)
{ {
_tp.class = STR_WORLD_GENERATION; _tp.cls = STR_WORLD_GENERATION;
_tp.current = 0; _tp.current = 0;
_tp.total = 0; _tp.total = 0;
_tp.percent = 0; _tp.percent = 0;
@ -798,7 +798,7 @@ void ShowGenerateWorldProgress(void)
AllocateWindowDescFront(&_show_terrain_progress_desc, 0); AllocateWindowDescFront(&_show_terrain_progress_desc, 0);
} }
static void _SetGeneratingWorldProgress(gwp_class class, uint progress, uint total) static void _SetGeneratingWorldProgress(gwp_class cls, uint progress, uint total)
{ {
static const int percent_table[GWP_CLASS_COUNT + 1] = {0, 5, 15, 20, 40, 60, 65, 80, 85, 99, 100 }; static const int percent_table[GWP_CLASS_COUNT + 1] = {0, 5, 15, 20, 40, 60, 65, 80, 85, 99, 100 };
static const StringID class_table[GWP_CLASS_COUNT] = { static const StringID class_table[GWP_CLASS_COUNT] = {
@ -814,7 +814,7 @@ static void _SetGeneratingWorldProgress(gwp_class class, uint progress, uint tot
STR_PREPARING_GAME STR_PREPARING_GAME
}; };
assert(class < GWP_CLASS_COUNT); assert(cls < GWP_CLASS_COUNT);
/* Do not run this function if we aren't in a thread */ /* Do not run this function if we aren't in a thread */
if (!IsGenerateWorldThreaded() && !_network_dedicated) return; if (!IsGenerateWorldThreaded() && !_network_dedicated) return;
@ -822,13 +822,13 @@ static void _SetGeneratingWorldProgress(gwp_class class, uint progress, uint tot
if (IsGeneratingWorldAborted()) HandleGeneratingWorldAbortion(); if (IsGeneratingWorldAborted()) HandleGeneratingWorldAbortion();
if (total == 0) { if (total == 0) {
assert(_tp.class == class_table[class]); assert(_tp.cls == class_table[cls]);
_tp.current += progress; _tp.current += progress;
} else { } else {
_tp.class = class_table[class]; _tp.cls = class_table[cls];
_tp.current = progress; _tp.current = progress;
_tp.total = total; _tp.total = total;
_tp.percent = percent_table[class]; _tp.percent = percent_table[cls];
} }
/* Don't update the screen too often. So update it once in every 200ms. /* Don't update the screen too often. So update it once in every 200ms.
@ -837,7 +837,7 @@ static void _SetGeneratingWorldProgress(gwp_class class, uint progress, uint tot
if (!_network_dedicated && _tp.timer != 0 && _timer_counter - _tp.timer < (200 * 8 / 30)) return; if (!_network_dedicated && _tp.timer != 0 && _timer_counter - _tp.timer < (200 * 8 / 30)) return;
/* Percentage is about the number of completed tasks, so 'current - 1' */ /* Percentage is about the number of completed tasks, so 'current - 1' */
_tp.percent = percent_table[class] + (percent_table[class + 1] - percent_table[class]) * (_tp.current == 0 ? 0 : _tp.current - 1) / _tp.total; _tp.percent = percent_table[cls] + (percent_table[cls + 1] - percent_table[cls]) * (_tp.current == 0 ? 0 : _tp.current - 1) / _tp.total;
_tp.timer = _timer_counter; _tp.timer = _timer_counter;
if (_network_dedicated) { if (_network_dedicated) {
@ -877,11 +877,11 @@ static void _SetGeneratingWorldProgress(gwp_class class, uint progress, uint tot
* Warning: this function isn't clever. Don't go from class 4 to 3. Go upwards, always. * Warning: this function isn't clever. Don't go from class 4 to 3. Go upwards, always.
* Also, progress works if total is zero, total works if progress is zero. * Also, progress works if total is zero, total works if progress is zero.
*/ */
void SetGeneratingWorldProgress(gwp_class class, uint total) void SetGeneratingWorldProgress(gwp_class cls, uint total)
{ {
if (total == 0) return; if (total == 0) return;
_SetGeneratingWorldProgress(class, 0, total); _SetGeneratingWorldProgress(cls, 0, total);
} }
/** /**
@ -891,8 +891,8 @@ void SetGeneratingWorldProgress(gwp_class class, uint total)
* Warning: this function isn't clever. Don't go from class 4 to 3. Go upwards, always. * Warning: this function isn't clever. Don't go from class 4 to 3. Go upwards, always.
* Also, progress works if total is zero, total works if progress is zero. * Also, progress works if total is zero, total works if progress is zero.
*/ */
void IncreaseGeneratingWorldProgress(gwp_class class) void IncreaseGeneratingWorldProgress(gwp_class cls)
{ {
/* In fact the param 'class' isn't needed.. but for some security reasons, we want it around */ /* In fact the param 'class' isn't needed.. but for some security reasons, we want it around */
_SetGeneratingWorldProgress(class, 1, 0); _SetGeneratingWorldProgress(cls, 1, 0);
} }

View File

@ -473,7 +473,7 @@ void DrawStringMultiCenter(int x, int y, StringID str, int maxw)
tmp = FormatStringLinebreaks(buffer, maxw); tmp = FormatStringLinebreaks(buffer, maxw);
num = GB(tmp, 0, 16); num = GB(tmp, 0, 16);
mt = GetCharacterHeight(GB(tmp, 16, 16)); mt = GetCharacterHeight((FontSize)GB(tmp, 16, 16));
y -= (mt >> 1) * num; y -= (mt >> 1) * num;
@ -517,7 +517,7 @@ uint DrawStringMultiLine(int x, int y, StringID str, int maxw)
tmp = FormatStringLinebreaks(buffer, maxw); tmp = FormatStringLinebreaks(buffer, maxw);
num = GB(tmp, 0, 16); num = GB(tmp, 0, 16);
mt = GetCharacterHeight(GB(tmp, 16, 16)); mt = GetCharacterHeight((FontSize)GB(tmp, 16, 16));
total_height = (num + 1) * mt; total_height = (num + 1) * mt;
src = buffer; src = buffer;

View File

@ -3,31 +3,7 @@
#ifndef GFX_H #ifndef GFX_H
#define GFX_H #define GFX_H
typedef byte Pixel; #include "helpers.hpp"
struct DrawPixelInfo {
Pixel *dst_ptr;
int left, top, width, height;
int pitch;
uint16 zoom;
};
typedef struct CursorVars {
Point pos, size, offs, delta; ///< position, size, offset from top-left, and movement
Point draw_pos, draw_size; ///< position and size bounding-box for drawing
CursorID sprite; ///< current image of cursor
int wheel; ///< mouse wheel movement
const CursorID *animate_list, *animate_cur; ///< in case of animated cursor, list of frames
uint animate_timeout; ///< current frame in list of animated cursor
bool visible; ///< cursor is visible
bool dirty; ///< the rect occupied by the mouse is dirty (redraw)
bool fix_at; ///< mouse is moving, but cursor is not (used for scrolling)
bool in_window; ///< mouse inside this window, determines drawing logic
} CursorVars;
typedef enum FontSizes { typedef enum FontSizes {
FS_NORMAL, FS_NORMAL,
@ -36,6 +12,7 @@ typedef enum FontSizes {
FS_END, FS_END,
} FontSize; } FontSize;
DECLARE_POSTFIX_INCREMENT(FontSize);
void RedrawScreenRect(int left, int top, int right, int bottom); void RedrawScreenRect(int left, int top, int right, int bottom);
void GfxScroll(int left, int top, int width, int height, int xo, int yo); void GfxScroll(int left, int top, int width, int height, int xo, int yo);
@ -83,7 +60,7 @@ bool FillDrawPixelInfo(DrawPixelInfo* n, int left, int top, int width, int heigh
/* window.c */ /* window.c */
void DrawOverlappedWindowForAll(int left, int top, int right, int bottom); void DrawOverlappedWindowForAll(int left, int top, int right, int bottom);
void SetMouseCursor(uint cursor); void SetMouseCursor(CursorID cursor);
void SetAnimatedMouseCursor(const CursorID *table); void SetAnimatedMouseCursor(const CursorID *table);
void CursorTick(void); void CursorTick(void);
void DrawMouseCursor(void); void DrawMouseCursor(void);
@ -91,7 +68,7 @@ void ScreenSizeChanged(void);
void UndrawMouseCursor(void); void UndrawMouseCursor(void);
bool ChangeResInGame(int w, int h); bool ChangeResInGame(int w, int h);
void SortResolutions(int count); void SortResolutions(int count);
void ToggleFullScreen(bool fs); extern "C" void ToggleFullScreen(bool fs);
/* gfx.c */ /* gfx.c */
#define ASCII_LETTERSTART 32 #define ASCII_LETTERSTART 32
@ -109,9 +86,7 @@ static inline byte GetCharacterHeight(FontSize size)
} }
} }
VARDEF DrawPixelInfo _screen;
VARDEF DrawPixelInfo *_cur_dpi; VARDEF DrawPixelInfo *_cur_dpi;
VARDEF CursorVars _cursor;
enum { enum {
COLOUR_DARK_BLUE, COLOUR_DARK_BLUE,
@ -138,20 +113,8 @@ enum {
*/ */
VARDEF byte _colour_gradient[16][8]; VARDEF byte _colour_gradient[16][8];
VARDEF int _pal_first_dirty;
VARDEF int _pal_last_dirty;
VARDEF bool _use_dos_palette; VARDEF bool _use_dos_palette;
typedef struct Colour {
byte r;
byte g;
byte b;
} Colour;
extern Colour _cur_palette[256];
typedef enum StringColorFlags { typedef enum StringColorFlags {
IS_PALETTE_COLOR = 0x100, // color value is already a real palette color index, not an index of a StringColor IS_PALETTE_COLOR = 0x100, // color value is already a real palette color index, not an index of a StringColor
} StringColorFlags; } StringColorFlags;

View File

@ -17,13 +17,13 @@
#include <string.h> #include <string.h>
typedef struct MD5File { typedef struct MD5File {
const char * const filename; // filename const char * filename; // filename
const md5_byte_t hash[16]; // md5 sum of the file md5_byte_t hash[16]; // md5 sum of the file
} MD5File; } MD5File;
typedef struct FileList { typedef struct FileList {
const MD5File basic[4]; // grf files that always have to be loaded MD5File basic[4]; // grf files that always have to be loaded
const MD5File landscape[3]; // landscape specific grf files MD5File landscape[3]; // landscape specific grf files
} FileList; } FileList;
enum { enum {

View File

@ -15,6 +15,7 @@
#include "debug.h" #include "debug.h"
#include "variables.h" #include "variables.h"
#include "date.h" #include "date.h"
#include "helpers.hpp"
const byte _cargo_colours[NUM_CARGO] = {152, 32, 15, 174, 208, 194, 191, 84, 184, 10, 202, 48}; const byte _cargo_colours[NUM_CARGO] = {152, 32, 15, 174, 208, 194, 191, 84, 184, 10, 202, 48};
@ -65,7 +66,7 @@ static void DrawGraph(const GraphDrawer *gw)
/* the colors and cost array of GraphDrawer must accomodate /* the colors and cost array of GraphDrawer must accomodate
* both values for cargo and players. So if any are higher, quit */ * both values for cargo and players. So if any are higher, quit */
assert(GRAPH_NUM >= NUM_CARGO && GRAPH_NUM >= MAX_PLAYERS); assert(GRAPH_NUM >= (int)NUM_CARGO && GRAPH_NUM >= (int)MAX_PLAYERS);
color = _colour_gradient[gw->bg_line_color][4]; color = _colour_gradient[gw->bg_line_color][4];
@ -118,7 +119,7 @@ static void DrawGraph(const GraphDrawer *gw)
col_ptr = row_ptr; col_ptr = row_ptr;
do { do {
if (*col_ptr != INVALID_VALUE) { if (*col_ptr != INVALID_VALUE) {
mx = max64(mx, myabs64(*col_ptr)); mx = max64(mx, *col_ptr);
} }
} while (col_ptr++, --num_x); } while (col_ptr++, --num_x);
} }
@ -906,11 +907,10 @@ void ShowCompanyLeagueTable(void)
static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e) static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
{ {
static PlayerID _performance_rating_detail_player = 0; static PlayerID _performance_rating_detail_player = PLAYER_FIRST;
switch (e->event) { switch (e->event) {
case WE_PAINT: { case WE_PAINT: {
int i;
byte x; byte x;
uint16 y = 14; uint16 y = 14;
int total_score = 0; int total_score = 0;
@ -920,7 +920,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
DrawWindowWidgets(w); DrawWindowWidgets(w);
// Paint the player icons // Paint the player icons
for (i = 0; i < MAX_PLAYERS; i++) { for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
if (!GetPlayer(i)->is_active) { if (!GetPlayer(i)->is_active) {
// Check if we have the player as an active player // Check if we have the player as an active player
if (!IsWindowWidgetDisabled(w, i + 13)) { if (!IsWindowWidgetDisabled(w, i + 13)) {
@ -930,7 +930,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
if (IsWindowWidgetLowered(w, i + 13)) { if (IsWindowWidgetLowered(w, i + 13)) {
RaiseWindowWidget(w, i + 13); RaiseWindowWidget(w, i + 13);
LowerWindowWidget(w, 13); LowerWindowWidget(w, 13);
_performance_rating_detail_player = 0; _performance_rating_detail_player = PLAYER_FIRST;
} }
// We need a repaint // We need a repaint
SetWindowDirty(w); SetWindowDirty(w);
@ -955,7 +955,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
color_notdone = _colour_gradient[COLOUR_RED][4]; color_notdone = _colour_gradient[COLOUR_RED][4];
// Draw all the score parts // Draw all the score parts
for (i = 0; i < NUM_SCORE; i++) { for (ScoreID i = SCORE_BEGIN; i < SCORE_END; i++) {
int val = _score_part[_performance_rating_detail_player][i]; int val = _score_part[_performance_rating_detail_player][i];
int needed = _score_info[i].needed; int needed = _score_info[i].needed;
int score = _score_info[i].score; int score = _score_info[i].score;
@ -1030,7 +1030,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
// Is it no on disable? // Is it no on disable?
if (!IsWindowWidgetDisabled(w, e->we.click.widget)) { if (!IsWindowWidgetDisabled(w, e->we.click.widget)) {
RaiseWindowWidget(w, _performance_rating_detail_player + 13); RaiseWindowWidget(w, _performance_rating_detail_player + 13);
_performance_rating_detail_player = e->we.click.widget - 13; _performance_rating_detail_player = (PlayerID)(e->we.click.widget - 13);
LowerWindowWidget(w, _performance_rating_detail_player + 13); LowerWindowWidget(w, _performance_rating_detail_player + 13);
SetWindowDirty(w); SetWindowDirty(w);
} }
@ -1038,11 +1038,11 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
break; break;
case WE_CREATE: { case WE_CREATE: {
int i; PlayerID i;
Player *p2; Player *p2;
/* Disable the players who are not active */ /* Disable the players who are not active */
for (i = 0; i < MAX_PLAYERS; i++) { for (i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
SetWindowWidgetDisabledState(w, i + 13, !GetPlayer(i)->is_active); SetWindowWidgetDisabledState(w, i + 13, !GetPlayer(i)->is_active);
} }
/* Update all player stats with the current data /* Update all player stats with the current data
@ -1054,7 +1054,7 @@ static void PerformanceRatingDetailWndProc(Window *w, WindowEvent *e)
w->custom[0] = DAY_TICKS; w->custom[0] = DAY_TICKS;
w->custom[1] = 5; w->custom[1] = 5;
_performance_rating_detail_player = 0; _performance_rating_detail_player = PLAYER_FIRST;
LowerWindowWidget(w, _performance_rating_detail_player + 13); LowerWindowWidget(w, _performance_rating_detail_player + 13);
SetWindowDirty(w); SetWindowDirty(w);
@ -1151,7 +1151,7 @@ static void GlobalSortSignList(void)
uint n = 0; uint n = 0;
/* Create array for sorting */ /* Create array for sorting */
_sign_sort = realloc((void *)_sign_sort, (GetMaxSignIndex() + 1)* sizeof(_sign_sort[0])); ReallocT(&_sign_sort, GetMaxSignIndex() + 1);
if (_sign_sort == NULL) error("Could not allocate memory for the sign-sorting-list"); if (_sign_sort == NULL) error("Could not allocate memory for the sign-sorting-list");
FOR_ALL_SIGNS(si) _sign_sort[n++] = si; FOR_ALL_SIGNS(si) _sign_sort[n++] = si;

View File

@ -132,7 +132,7 @@ void ShowMusicWindow(void);
/* main_gui.c */ /* main_gui.c */
void HandleOnEditText(const char *str); void HandleOnEditText(const char *str);
VARDEF byte _station_show_coverage; VARDEF bool _station_show_coverage;
VARDEF PlaceProc *_place_proc; VARDEF PlaceProc *_place_proc;
/* vehicle_gui.c */ /* vehicle_gui.c */

176
src/hal.h
View File

@ -3,6 +3,85 @@
#ifndef HAL_H #ifndef HAL_H
#define HAL_H #define HAL_H
#ifdef __cplusplus
extern "C" {
#endif //__cplusplus
enum WindowKeyCodes {
WKC_SHIFT = 0x8000,
WKC_CTRL = 0x4000,
WKC_ALT = 0x2000,
WKC_META = 0x1000,
// Special ones
WKC_NONE = 0,
WKC_ESC = 1,
WKC_BACKSPACE = 2,
WKC_INSERT = 3,
WKC_DELETE = 4,
WKC_PAGEUP = 5,
WKC_PAGEDOWN = 6,
WKC_END = 7,
WKC_HOME = 8,
// Arrow keys
WKC_LEFT = 9,
WKC_UP = 10,
WKC_RIGHT = 11,
WKC_DOWN = 12,
// Return & tab
WKC_RETURN = 13,
WKC_TAB = 14,
// Numerical keyboard
WKC_NUM_0 = 16,
WKC_NUM_1 = 17,
WKC_NUM_2 = 18,
WKC_NUM_3 = 19,
WKC_NUM_4 = 20,
WKC_NUM_5 = 21,
WKC_NUM_6 = 22,
WKC_NUM_7 = 23,
WKC_NUM_8 = 24,
WKC_NUM_9 = 25,
WKC_NUM_DIV = 26,
WKC_NUM_MUL = 27,
WKC_NUM_MINUS = 28,
WKC_NUM_PLUS = 29,
WKC_NUM_ENTER = 30,
WKC_NUM_DECIMAL = 31,
// Space
WKC_SPACE = 32,
// Function keys
WKC_F1 = 33,
WKC_F2 = 34,
WKC_F3 = 35,
WKC_F4 = 36,
WKC_F5 = 37,
WKC_F6 = 38,
WKC_F7 = 39,
WKC_F8 = 40,
WKC_F9 = 41,
WKC_F10 = 42,
WKC_F11 = 43,
WKC_F12 = 44,
// backquote is the key left of "1"
// we only store this key here, no matter what character is really mapped to it
// on a particular keyboard. (US keyboard: ` and ~ ; German keyboard: ^ and °)
WKC_BACKQUOTE = 45,
WKC_PAUSE = 46,
// 0-9 are mapped to 48-57
// A-Z are mapped to 65-90
// a-z are mapped to 97-122
};
typedef struct { typedef struct {
const char *(*start)(const char * const *parm); const char *(*start)(const char * const *parm);
void (*stop)(void); void (*stop)(void);
@ -32,9 +111,9 @@ typedef struct {
void (*set_volume)(byte vol); void (*set_volume)(byte vol);
} HalMusicDriver; } HalMusicDriver;
VARDEF HalMusicDriver *_music_driver; extern HalMusicDriver *_music_driver;
VARDEF HalSoundDriver *_sound_driver; extern HalSoundDriver *_sound_driver;
VARDEF HalVideoDriver *_video_driver; extern HalVideoDriver *_video_driver;
enum DriverType { enum DriverType {
VIDEO_DRIVER = 0, VIDEO_DRIVER = 0,
@ -42,8 +121,99 @@ enum DriverType {
MUSIC_DRIVER = 2, MUSIC_DRIVER = 2,
}; };
enum GameModes {
GM_MENU,
GM_NORMAL,
GM_EDITOR
};
void GameLoop(void); void GameLoop(void);
void CreateConsole(void); void CreateConsole(void);
typedef int32 CursorID;
typedef byte Pixel;
typedef struct Point {
int x,y;
} Point;
typedef struct Rect {
int left,top,right,bottom;
} Rect;
typedef struct CursorVars {
Point pos, size, offs, delta; ///< position, size, offset from top-left, and movement
Point draw_pos, draw_size; ///< position and size bounding-box for drawing
CursorID sprite; ///< current image of cursor
int wheel; ///< mouse wheel movement
const CursorID *animate_list, *animate_cur; ///< in case of animated cursor, list of frames
uint animate_timeout; ///< current frame in list of animated cursor
bool visible; ///< cursor is visible
bool dirty; ///< the rect occupied by the mouse is dirty (redraw)
bool fix_at; ///< mouse is moving, but cursor is not (used for scrolling)
bool in_window; ///< mouse inside this window, determines drawing logic
} CursorVars;
typedef struct DrawPixelInfo {
Pixel *dst_ptr;
int left, top, width, height;
int pitch;
uint16 zoom;
} DrawPixelInfo;
extern byte _dirkeys; // 1 = left, 2 = up, 4 = right, 8 = down
extern bool _fullscreen;
extern CursorVars _cursor;
extern bool _ctrl_pressed; // Is Ctrl pressed?
extern bool _shift_pressed; // Is Shift pressed?
extern byte _fast_forward;
extern bool _left_button_down;
extern bool _left_button_clicked;
extern bool _right_button_down;
extern bool _right_button_clicked;
extern DrawPixelInfo _screen;
extern bool _exit_game;
extern bool _networking; ///< are we in networking mode?
extern byte _game_mode;
extern byte _pause;
void HandleKeypress(uint32 key);
void HandleMouseEvents(void);
void CSleep(int milliseconds);
void UpdateWindows(void);
uint32 InteractiveRandom(void); /* Used for random sequences that are not the same on the other end of the multiplayer link */
uint InteractiveRandomRange(uint max);
void DrawTextMessage(void);
void DrawMouseCursor(void);
void ScreenSizeChanged(void);
void HandleExitGameRequest(void);
void GameSizeChanged(void);
void UndrawMouseCursor(void);
extern int _pal_first_dirty;
extern int _pal_last_dirty;
extern int _num_resolutions;
extern uint16 _resolutions[32][2];
extern uint16 _cur_resolution[2];
typedef struct Colour {
byte r;
byte g;
byte b;
} Colour;
extern Colour _cur_palette[256];
#ifdef __cplusplus
} // extern "C"
#endif //__cplusplus
#endif /* HAL_H */ #endif /* HAL_H */

View File

@ -13,6 +13,7 @@
#include "gui.h" #include "gui.h"
#include "saveload.h" #include "saveload.h"
#include "bmp.h" #include "bmp.h"
#include "helpers.hpp"
/** /**
* Convert RGB colors to Grayscale using 29.9% Red, 58.7% Green, 11.4% Blue * Convert RGB colors to Grayscale using 29.9% Red, 58.7% Green, 11.4% Blue
@ -135,7 +136,7 @@ static bool ReadHeightmapPNG(char *filename, uint *x, uint *y, byte **map)
} }
if (map != NULL) { if (map != NULL) {
*map = malloc(info_ptr->width * info_ptr->height * sizeof(byte)); MallocT(/* NO & */map, info_ptr->width * info_ptr->height);
if (*map == NULL) { if (*map == NULL) {
ShowErrorMessage(STR_PNGMAP_ERR_MISC, STR_PNGMAP_ERROR, 0, 0); ShowErrorMessage(STR_PNGMAP_ERR_MISC, STR_PNGMAP_ERROR, 0, 0);
@ -248,7 +249,7 @@ static bool ReadHeightmapBMP(char *filename, uint *x, uint *y, byte **map)
return false; return false;
} }
*map = malloc(info.width * info.height * sizeof(byte)); MallocT(map, info.width * info.height);
if (*map == NULL) { if (*map == NULL) {
ShowErrorMessage(STR_PNGMAP_ERR_MISC, STR_BMPMAP_ERROR, 0, 0); ShowErrorMessage(STR_PNGMAP_ERR_MISC, STR_BMPMAP_ERROR, 0, 0);
fclose(f); fclose(f);

View File

@ -1,10 +1,8 @@
/* $Id$ */ /* $Id$ */
#include "stdafx.h" #include "stdafx.h"
EXTERN_C_BEGIN
#include "openttd.h" #include "openttd.h"
#include "engine.h" #include "engine.h"
EXTERN_C_END
#include <new> #include <new>
#include "yapf/blob.hpp" #include "yapf/blob.hpp"

178
src/helpers.hpp Normal file
View File

@ -0,0 +1,178 @@
/* $Id$ */
#ifndef HELPERS_HPP
#define HELPERS_HPP
/** @file helpers.hpp */
#include "macros.h"
#ifdef __cplusplus
/** When allocating using malloc/calloc in C++ it is usually needed to cast the return value
* from void* to the proper pointer type. Another alternative would be MallocT<> as follows */
template <typename T> FORCEINLINE bool MallocT(T** t_ptr, size_t num_elements)
{
*t_ptr = (T*)malloc(num_elements * sizeof(T));
return (*t_ptr != NULL);
}
/** When allocating using malloc/calloc in C++ it is usually needed to cast the return value
* from void* to the proper pointer type. Another alternative would be MallocT<> as follows */
template <typename T> FORCEINLINE bool CallocT(T** t_ptr, size_t num_elements)
{
*t_ptr = (T*)calloc(num_elements, sizeof(T));
return (*t_ptr != NULL);
}
/** When allocating using malloc/calloc in C++ it is usually needed to cast the return value
* from void* to the proper pointer type. Another alternative would be MallocT<> as follows */
template <typename T> FORCEINLINE bool ReallocT(T** t_ptr, size_t num_elements)
{
*t_ptr = (T*)realloc(*t_ptr, num_elements * sizeof(T));
return (*t_ptr != NULL);
}
/** type safe swap operation */
template <typename T> void SwapT(T *a, T *b);
template <typename T> FORCEINLINE void SwapT(T *a, T *b)
{
T t = *a;
*a = *b;
*b = t;
}
/** returns the absolute value of (scalar) variable. @note assumes variable to be signed */
template <typename T> static inline T myabs(T a) { return a < (T)0 ? -a : a; }
/** returns the (absolute) difference between two (scalar) variables */
template <typename T> static inline T delta(T a, T b) { return a < b ? b - a : a - b; }
/** Some enums need to have allowed incrementing (i.e. StationClassID) */
#define DECLARE_POSTFIX_INCREMENT(type) \
FORCEINLINE type operator ++(type& e, int) \
{ \
type e_org = e; \
e = (type)((int)e + 1); \
return e_org; \
} \
FORCEINLINE type operator --(type& e, int) \
{ \
type e_org = e; \
e = (type)((int)e - 1); \
return e_org; \
}
/** Operators to allow to work with enum as with type safe bit set in C++ */
# define DECLARE_ENUM_AS_BIT_SET(mask_t) \
FORCEINLINE mask_t operator | (mask_t m1, mask_t m2) {return (mask_t)((int)m1 | m2);} \
FORCEINLINE mask_t operator & (mask_t m1, mask_t m2) {return (mask_t)((int)m1 & m2);} \
FORCEINLINE mask_t operator ^ (mask_t m1, mask_t m2) {return (mask_t)((int)m1 ^ m2);} \
FORCEINLINE mask_t& operator |= (mask_t& m1, mask_t m2) {m1 = m1 | m2; return m1;} \
FORCEINLINE mask_t& operator &= (mask_t& m1, mask_t m2) {m1 = m1 & m2; return m1;} \
FORCEINLINE mask_t& operator ^= (mask_t& m1, mask_t m2) {m1 = m1 ^ m2; return m1;} \
FORCEINLINE mask_t operator ~(mask_t m) {return (mask_t)(~(int)m);}
/** probably redundant enum combining operators (as we have conversion functions)
* but the old code is full of such arithmetics */
# define DECLARE_ENUM_AS_BIT_INDEX(idx_t, mask_t) \
FORCEINLINE mask_t operator << (int m, idx_t i) {return (mask_t)(m << (int)i);} \
FORCEINLINE mask_t operator << (mask_t m, int i) {return (mask_t)(((int)m) << i);} \
FORCEINLINE mask_t operator >> (mask_t m, int i) {return (mask_t)(((int)m) >> i);}
/** Informative template class exposing basic enumeration properties used by several
* other templates below. Here we have only forward declaration. For each enum type
* we will create specialization derived from MakeEnumPropsT<>. */
template <typename Tenum_t> struct EnumPropsT;
/** Helper template class that makes basic properties of given enumeration type visible
* from outsize. It is used as base class of several EnumPropsT specializations each
* dedicated to one of commonly used enumeration types. */
template <typename Tenum_t, typename Tstorage_t, Tenum_t Tbegin, Tenum_t Tend, Tenum_t Tinvalid>
struct MakeEnumPropsT {
typedef Tenum_t type; ///< enum type (i.e. Trackdir)
typedef Tstorage_t storage; ///< storage type (i.e. byte)
static const Tenum_t begin = Tbegin; ///< lowest valid value (i.e. TRACKDIR_BEGIN)
static const Tenum_t end = Tend; ///< one after the last valid value (i.e. TRACKDIR_END)
static const Tenum_t invalid = Tinvalid; ///< what value is used as invalid value (i.e. INVALID_TRACKDIR)
};
/** In some cases we use byte or uint16 to store values that are defined as enum. It is
* necessary in order to control the sizeof() such values. Some compilers make enum
* the same size as int (4 or 8 bytes instead of 1 or 2). As a consequence the strict
* compiler type-checking causes errors like:
* 'HasPowerOnRail' : cannot convert parameter 1 from 'byte' to 'RailType' when
* u->u.rail.railtype is passed as argument or type RailType. In such cases it is better
* to teach the compiler that u->u.rail.railtype is to be treated as RailType. */
template <typename Tenum_t> struct TinyEnumT;
/** The general declaration of TinyEnumT<> (above) */
template <typename Tenum_t> struct TinyEnumT
{
typedef Tenum_t enum_type; ///< expose our enumeration type (i.e. Trackdir) to outside
typedef EnumPropsT<Tenum_t> Props; ///< make easier access to our enumeration propeties
typedef typename Props::storage storage_type; ///< small storage type
static const enum_type begin = Props::begin; ///< enum beginning (i.e. TRACKDIR_BEGIN)
static const enum_type end = Props::end; ///< enum end (i.e. TRACKDIR_END)
static const enum_type invalid = Props::invalid;///< invalid value (i.e. INVALID_TRACKDIR)
storage_type m_val; ///< here we hold the actual value in small (i.e. byte) form
/** Cast operator - invoked then the value is assigned to the Tenum_t type */
FORCEINLINE operator enum_type () const
{
return (enum_type)m_val;
}
/** Assignment operator (from Tenum_t type) */
FORCEINLINE TinyEnumT& operator = (enum_type e)
{
m_val = (storage_type)e; return *this;
}
/** postfix ++ operator on tiny type */
FORCEINLINE TinyEnumT& operator ++ (int)
{
if (++m_val >= end) m_val -= (storage_type)(end - begin);
return *this;
}
};
template <typename Tenum_t> FORCEINLINE void SwapT(TinyEnumT<Tenum_t> *a, TinyEnumT<Tenum_t> *b)
{
SwapT(&a->m_val, &b->m_val);
}
template <typename T> FORCEINLINE T ClrBitT(T t, int bit_index)
{
int val = t;
CLRBIT(val, bit_index);
return (T)val;
}
template <typename T> FORCEINLINE T SetBitT(T t, int bit_index)
{
int val = t;
SETBIT(val, bit_index);
return (T)val;
}
template <typename T> FORCEINLINE T ToggleBitT(T t, int bit_index)
{
int val = t;
TOGGLEBIT(val, bit_index);
return (T)val;
}
#else // __cplusplus
#define DECLARE_POSTFIX_INCREMENT(E)
#define DECLARE_ENUM_AS_BIT_SET(E)
#define DECLARE_ENUM_AS_BIT_INDEX(E1,E2)
#endif // __cplusplus
#endif /* HELPERS_HPP */

View File

@ -36,7 +36,7 @@ struct Industry {
uint16 counter; uint16 counter;
byte type; byte type;
byte owner; OwnerByte owner;
byte random_color; byte random_color;
Year last_prod_year; Year last_prod_year;
byte was_cargo_delivered; byte was_cargo_delivered;

View File

@ -765,14 +765,14 @@ static void SetupFarmFieldFence(TileIndex tile, int size, byte type, Axis direct
tile = TILE_MASK(tile); tile = TILE_MASK(tile);
if (IsTileType(tile, MP_CLEAR) || IsTileType(tile, MP_TREES)) { if (IsTileType(tile, MP_CLEAR) || IsTileType(tile, MP_TREES)) {
byte or = type; byte or_ = type;
if (or == 1 && CHANCE16(1, 7)) or = 2; if (or_ == 1 && CHANCE16(1, 7)) or_ = 2;
if (direction == AXIS_X) { if (direction == AXIS_X) {
SetFenceSE(tile, or); SetFenceSE(tile, or_);
} else { } else {
SetFenceSW(tile, or); SetFenceSW(tile, or_);
} }
} }
@ -942,7 +942,7 @@ static void ProduceIndustryGoods(Industry *i)
if ((i->counter & 0x3F) == 0) { if ((i->counter & 0x3F) == 0) {
if (CHANCE16R(1,14,r) && (num=_industry_sounds[i->type][0]) != 0) { if (CHANCE16R(1,14,r) && (num=_industry_sounds[i->type][0]) != 0) {
SndPlayTileFx( SndPlayTileFx(
_industry_sounds[i->type][1] + (((r >> 16) * num) >> 16), (SoundFx)(_industry_sounds[i->type][1] + (((r >> 16) * num) >> 16)),
i->xy); i->xy);
} }
} }
@ -1225,7 +1225,7 @@ static bool CheckCanTerraformSurroundingTiles(TileIndex tile, uint height, int i
return false; return false;
/* Don't allow too big of a change if this is the sub-tile check */ /* Don't allow too big of a change if this is the sub-tile check */
if (internal != 0 && myabs(curh - height) > 1) return false; if (internal != 0 && delta(curh, height) > 1) return false;
/* Different height, so the surrounding tiles of this tile /* Different height, so the surrounding tiles of this tile
* has to be correct too (in level, or almost in level) * has to be correct too (in level, or almost in level)
@ -1353,7 +1353,7 @@ static Industry *AllocateIndustry(void)
return AddBlockToPool(&_Industry_pool) ? AllocateIndustry() : NULL; return AddBlockToPool(&_Industry_pool) ? AllocateIndustry() : NULL;
} }
static void DoCreateNewIndustry(Industry *i, TileIndex tile, int type, const IndustryTileTable *it, const Town *t, byte owner) static void DoCreateNewIndustry(Industry *i, TileIndex tile, int type, const IndustryTileTable *it, const Town *t, Owner owner)
{ {
const IndustrySpec *indspec = GetIndustrySpec(type); const IndustrySpec *indspec = GetIndustrySpec(type);
uint32 r; uint32 r;
@ -1595,25 +1595,25 @@ static void ExtChangeIndustryProduction(Industry *i)
default: /* INDUSTRY_PRODUCTION */ default: /* INDUSTRY_PRODUCTION */
for (j = 0; j < 2 && i->produced_cargo[j] != CT_INVALID; j++){ for (j = 0; j < 2 && i->produced_cargo[j] != CT_INVALID; j++){
uint32 r = Random(); uint32 r = Random();
int old, new, percent; int old_prod, new_prod, percent;
int mag; int mag;
new = old = i->production_rate[j]; new_prod = old_prod = i->production_rate[j];
if (CHANCE16I(20, 1024, r)) if (CHANCE16I(20, 1024, r))
new -= ((RandomRange(50) + 10) * old) >> 8; new_prod -= ((RandomRange(50) + 10) * old_prod) >> 8;
if (CHANCE16I(20 + (i->pct_transported[j] * 20 >> 8), 1024, r >> 16)) if (CHANCE16I(20 + (i->pct_transported[j] * 20 >> 8), 1024, r >> 16))
new += ((RandomRange(50) + 10) * old) >> 8; new_prod += ((RandomRange(50) + 10) * old_prod) >> 8;
new = clamp(new, 0, 255); new_prod = clamp(new_prod, 0, 255);
if (new == old) { if (new_prod == old_prod) {
closeit = false; closeit = false;
continue; continue;
} }
percent = new * 100 / old - 100; percent = new_prod * 100 / old_prod - 100;
i->production_rate[j] = new; i->production_rate[j] = new_prod;
if (new >= indspec->production_rate[j] / 4) if (new_prod >= indspec->production_rate[j] / 4)
closeit = false; closeit = false;
mag = abs(percent); mag = abs(percent);
@ -1827,7 +1827,7 @@ void InitializeIndustries(void)
_industry_sound_tile = 0; _industry_sound_tile = 0;
} }
const TileTypeProcs _tile_type_industry_procs = { extern const TileTypeProcs _tile_type_industry_procs = {
DrawTile_Industry, /* draw_tile_proc */ DrawTile_Industry, /* draw_tile_proc */
GetSlopeZ_Industry, /* get_slope_z_proc */ GetSlopeZ_Industry, /* get_slope_z_proc */
ClearTile_Industry, /* clear_tile_proc */ ClearTile_Industry, /* clear_tile_proc */
@ -1905,6 +1905,6 @@ static void Load_INDY(void)
} }
} }
const ChunkHandler _industry_chunk_handlers[] = { extern const ChunkHandler _industry_chunk_handlers[] = {
{ 'INDY', Save_INDY, Load_INDY, CH_ARRAY | CH_LAST}, { 'INDY', Save_INDY, Load_INDY, CH_ARRAY | CH_LAST},
}; };

View File

@ -16,6 +16,7 @@
#include "industry.h" #include "industry.h"
#include "town.h" #include "town.h"
#include "variables.h" #include "variables.h"
#include "helpers.hpp"
const byte _build_industry_types[4][12] = { const byte _build_industry_types[4][12] = {
{ 1, 2, 4, 6, 8, 0, 3, 5, 9, 11, 18 }, { 1, 2, 4, 6, 8, 0, 3, 5, 9, 11, 18 },
@ -559,7 +560,7 @@ static void MakeSortedIndustryList(void)
if (GetNumIndustries() == 0) return; if (GetNumIndustries() == 0) return;
/* Create array for sorting */ /* Create array for sorting */
_industry_sort = realloc((void *)_industry_sort, (GetMaxIndustryIndex() + 1) * sizeof(_industry_sort[0])); ReallocT(&_industry_sort, GetMaxIndustryIndex() + 1);
if (_industry_sort == NULL) error("Could not allocate memory for the industry-sorting-list"); if (_industry_sort == NULL) error("Could not allocate memory for the industry-sorting-list");
FOR_ALL_INDUSTRIES(i) _industry_sort[n++] = i; FOR_ALL_INDUSTRIES(i) _industry_sort[n++] = i;

View File

@ -55,7 +55,7 @@ const byte _tileh_to_sprite[32] = {
0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 15, 18, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 15, 18, 0,
}; };
const byte _inclined_tileh[] = { const Slope _inclined_tileh[] = {
SLOPE_SW, SLOPE_NW, SLOPE_SW, SLOPE_SE, SLOPE_NE, SLOPE_SE, SLOPE_NE, SLOPE_NW, SLOPE_SW, SLOPE_NW, SLOPE_SW, SLOPE_SE, SLOPE_NE, SLOPE_SE, SLOPE_NE, SLOPE_NW,
SLOPE_E, SLOPE_N, SLOPE_W, SLOPE_S, SLOPE_E, SLOPE_N, SLOPE_W, SLOPE_S,
SLOPE_NWS, SLOPE_WSE, SLOPE_SEN, SLOPE_ENW SLOPE_NWS, SLOPE_WSE, SLOPE_SEN, SLOPE_ENW
@ -276,7 +276,7 @@ uint32 GetTileTrackStatus(TileIndex tile, TransportType mode)
return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode); return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode);
} }
void ChangeTileOwner(TileIndex tile, byte old_player, byte new_player) void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player)
{ {
_tile_type_procs[GetTileType(tile)]->change_tile_owner_proc(tile, old_player, new_player); _tile_type_procs[GetTileType(tile)]->change_tile_owner_proc(tile, old_player, new_player);
} }
@ -468,13 +468,13 @@ static void GenerateTerrain(int type, int flag)
uint y; uint y;
uint w; uint w;
uint h; uint h;
const Sprite* template; const Sprite* templ;
const byte *p; const byte *p;
Tile* tile; Tile* tile;
byte direction; byte direction;
r = Random(); r = Random();
template = GetSprite((((r >> 24) * _genterrain_tbl_1[type]) >> 8) + _genterrain_tbl_2[type] + 4845); templ = GetSprite((((r >> 24) * _genterrain_tbl_1[type]) >> 8) + _genterrain_tbl_2[type] + 4845);
x = r & MapMaxX(); x = r & MapMaxX();
y = (r >> MapLogX()) & MapMaxY(); y = (r >> MapLogX()) & MapMaxY();
@ -484,13 +484,13 @@ static void GenerateTerrain(int type, int flag)
direction = GB(r, 22, 2); direction = GB(r, 22, 2);
if (direction & 1) { if (direction & 1) {
w = template->height; w = templ->height;
h = template->width; h = templ->width;
} else { } else {
w = template->width; w = templ->width;
h = template->height; h = templ->height;
} }
p = template->data; p = templ->data;
if (flag & 4) { if (flag & 4) {
uint xw = x * MapSizeY(); uint xw = x * MapSizeY();

View File

@ -3,10 +3,12 @@
#ifndef LIVERY_H #ifndef LIVERY_H
#define LIVERY_H #define LIVERY_H
#include "helpers.hpp"
/* List of different livery schemes. */ /* List of different livery schemes. */
typedef enum LiverySchemes { typedef enum LiverySchemes {
LS_DEFAULT, LS_BEGIN = 0,
LS_DEFAULT = 0,
/* Rail vehicles */ /* Rail vehicles */
LS_STEAM, LS_STEAM,
@ -37,6 +39,7 @@ typedef enum LiverySchemes {
LS_END LS_END
} LiveryScheme; } LiveryScheme;
DECLARE_POSTFIX_INCREMENT(LiveryScheme);
/* List of different livery classes, used only by the livery GUI. */ /* List of different livery classes, used only by the livery GUI. */
typedef enum LiveryClasses { typedef enum LiveryClasses {

View File

@ -20,9 +20,10 @@
#undef max #undef max
#endif #endif
static inline int min(int a, int b) { if (a <= b) return a; return b; }
static inline int max(int a, int b) { if (a >= b) return a; return b; } static inline int max(int a, int b) { if (a >= b) return a; return b; }
static inline int64 max64(int64 a, int64 b) { if (a >= b) return a; return b; } static inline double dmax(double a, double b) { if (a >= b) return a; return b; }
static inline uint64 max64(uint64 a, uint64 b) { if (a >= b) return a; return b; }
static inline int min(int a, int b) { if (a <= b) return a; return b; }
static inline uint minu(uint a, uint b) { if (a <= b) return a; return b; } static inline uint minu(uint a, uint b) { if (a <= b) return a; return b; }
static inline uint maxu(uint a, uint b) { if (a >= b) return a; return b; } static inline uint maxu(uint a, uint b) { if (a >= b) return a; return b; }
@ -136,15 +137,11 @@ static inline int KillFirstBit2x64(int value)
#define abs myabs #define abs myabs
static inline int intxchg_(int *a, int b) { int t = *a; *a = b; return t; } static inline int intxchg_(int *a, int b) { int t = *a; *a = b; return t; }
#define intswap(a,b) ((b) = intxchg_(&(a), (b))) #define intswap(a,b) ((b) = intxchg_(&(a), (b)))
static inline int uintxchg_(uint *a, uint b) { uint t = *a; *a = b; return t; } static inline int uintxchg_(uint *a, uint b) { uint t = *a; *a = b; return t; }
#define uintswap(a,b) ((b) = uintxchg_(&(a), (b))) #define uintswap(a,b) ((b) = uintxchg_(&(a), (b)))
static inline int myabs(int a) { if (a<0) a = -a; return a; }
static inline int64 myabs64(int64 a) { if (a<0) a = -a; return a; }
static inline void swap_byte(byte *a, byte *b) { byte t = *a; *a = *b; *b = t; } static inline void swap_byte(byte *a, byte *b) { byte t = *a; *a = *b; *b = t; }
static inline void swap_uint16(uint16 *a, uint16 *b) { uint16 t = *a; *a = *b; *b = t; } static inline void swap_uint16(uint16 *a, uint16 *b) { uint16 t = *a; *a = *b; *b = t; }
static inline void swap_int16(int16 *a, int16 *b) { int16 t = *a; *a = *b; *b = t; } static inline void swap_int16(int16 *a, int16 *b) { int16 t = *a; *a = *b; *b = t; }

View File

@ -215,12 +215,12 @@ static void MenuClickSubsidies(int index)
static void MenuClickStations(int index) static void MenuClickStations(int index)
{ {
ShowPlayerStations(index); ShowPlayerStations((PlayerID)index);
} }
static void MenuClickFinances(int index) static void MenuClickFinances(int index)
{ {
ShowPlayerFinances(index); ShowPlayerFinances((PlayerID)index);
} }
static void MenuClickCompany(int index) static void MenuClickCompany(int index)
@ -229,7 +229,7 @@ static void MenuClickCompany(int index)
ShowClientList(); ShowClientList();
} else { } else {
if (_networking) index--; if (_networking) index--;
ShowPlayerCompany(index); ShowPlayerCompany((PlayerID)index);
} }
} }
@ -263,27 +263,27 @@ static void MenuClickIndustry(int index)
static void MenuClickShowTrains(int index) static void MenuClickShowTrains(int index)
{ {
ShowVehicleListWindow(index, INVALID_STATION, VEH_Train); ShowVehicleListWindow((PlayerID)index, INVALID_STATION, VEH_Train);
} }
static void MenuClickShowRoad(int index) static void MenuClickShowRoad(int index)
{ {
ShowVehicleListWindow(index, INVALID_STATION, VEH_Road); ShowVehicleListWindow((PlayerID)index, INVALID_STATION, VEH_Road);
} }
static void MenuClickShowShips(int index) static void MenuClickShowShips(int index)
{ {
ShowVehicleListWindow(index, INVALID_STATION, VEH_Ship); ShowVehicleListWindow((PlayerID)index, INVALID_STATION, VEH_Ship);
} }
static void MenuClickShowAir(int index) static void MenuClickShowAir(int index)
{ {
ShowVehicleListWindow(index, INVALID_STATION, VEH_Aircraft); ShowVehicleListWindow((PlayerID)index, INVALID_STATION, VEH_Aircraft);
} }
static void MenuClickBuildRail(int index) static void MenuClickBuildRail(int index)
{ {
_last_built_railtype = index; _last_built_railtype = (RailType)index;
ShowBuildRailToolbar(_last_built_railtype, -1); ShowBuildRailToolbar(_last_built_railtype, -1);
} }
@ -1564,7 +1564,7 @@ static bool AnyTownExists(void)
return false; return false;
} }
extern Industry *CreateNewIndustry(TileIndex tile, int type); extern Industry *CreateNewIndustry(TileIndex tile, IndustryType type);
/** /**
* Search callback function for TryBuildIndustry * Search callback function for TryBuildIndustry
@ -2283,7 +2283,7 @@ static void MainWindowWndProc(Window *w, WindowEvent *e)
case '1' | WKC_ALT: /* Gimme money */ case '1' | WKC_ALT: /* Gimme money */
/* Server can not cheat in advertise mode either! */ /* Server can not cheat in advertise mode either! */
if (!_networking || !_network_server || !_network_advertise) if (!_networking || !_network_server || !_network_advertise)
DoCommandP(0, -10000000, 0, NULL, CMD_MONEY_CHEAT); DoCommandP(0, 10000000, 0, NULL, CMD_MONEY_CHEAT);
break; break;
case '2' | WKC_ALT: /* Update the coordinates of all station signs */ case '2' | WKC_ALT: /* Update the coordinates of all station signs */
@ -2430,7 +2430,7 @@ void GameSizeChanged(void)
void InitializeMainGui(void) void InitializeMainGui(void)
{ {
/* Clean old GUI values */ /* Clean old GUI values */
_last_built_railtype = 0; _last_built_railtype = RAILTYPE_RAIL;
} }

View File

@ -7,10 +7,11 @@
#include "macros.h" #include "macros.h"
#include "map.h" #include "map.h"
#include "direction.h" #include "direction.h"
#include "helpers.hpp"
#if defined(_MSC_VER) && _MSC_VER >= 1400 /* VStudio 2005 is stupid! */ #if defined(_MSC_VER) && _MSC_VER >= 1400 /* VStudio 2005 is stupid! */
/* Why the hell is that not in all MSVC headers?? */ /* Why the hell is that not in all MSVC headers?? */
_CRTIMP void __cdecl _assert(void *, void *, unsigned); extern "C" _CRTIMP void __cdecl _assert(void *, void *, unsigned);
#endif #endif
uint _map_log_x; uint _map_log_x;
@ -41,7 +42,7 @@ void AllocateMap(uint size_x, uint size_y)
_map_tile_mask = _map_size - 1; _map_tile_mask = _map_size - 1;
free(_m); free(_m);
_m = calloc(_map_size, sizeof(*_m)); CallocT(&_m, _map_size);
// XXX TODO handle memory shortage more gracefully // XXX TODO handle memory shortage more gracefully
if (_m == NULL) error("Failed to allocate memory for the map"); if (_m == NULL) error("Failed to allocate memory for the map");
@ -121,14 +122,14 @@ uint TileAddWrap(TileIndex tile, int addx, int addy)
return INVALID_TILE; return INVALID_TILE;
} }
const TileIndexDiffC _tileoffs_by_diagdir[] = { extern const TileIndexDiffC _tileoffs_by_diagdir[] = {
{-1, 0}, // DIAGDIR_NE {-1, 0}, // DIAGDIR_NE
{ 0, 1}, // DIAGDIR_SE { 0, 1}, // DIAGDIR_SE
{ 1, 0}, // DIAGDIR_SW { 1, 0}, // DIAGDIR_SW
{ 0, -1} // DIAGDIR_NW { 0, -1} // DIAGDIR_NW
}; };
const TileIndexDiffC _tileoffs_by_dir[] = { extern const TileIndexDiffC _tileoffs_by_dir[] = {
{-1, -1}, // DIR_N {-1, -1}, // DIR_N
{-1, 0}, // DIR_NE {-1, 0}, // DIR_NE
{-1, 1}, // DIR_E {-1, 1}, // DIR_E
@ -141,8 +142,8 @@ const TileIndexDiffC _tileoffs_by_dir[] = {
uint DistanceManhattan(TileIndex t0, TileIndex t1) uint DistanceManhattan(TileIndex t0, TileIndex t1)
{ {
const uint dx = abs(TileX(t0) - TileX(t1)); const uint dx = delta(TileX(t0), TileX(t1));
const uint dy = abs(TileY(t0) - TileY(t1)); const uint dy = delta(TileY(t0), TileY(t1));
return dx + dy; return dx + dy;
} }
@ -157,16 +158,16 @@ uint DistanceSquare(TileIndex t0, TileIndex t1)
uint DistanceMax(TileIndex t0, TileIndex t1) uint DistanceMax(TileIndex t0, TileIndex t1)
{ {
const uint dx = abs(TileX(t0) - TileX(t1)); const uint dx = delta(TileX(t0), TileX(t1));
const uint dy = abs(TileY(t0) - TileY(t1)); const uint dy = delta(TileY(t0), TileY(t1));
return dx > dy ? dx : dy; return dx > dy ? dx : dy;
} }
uint DistanceMaxPlusManhattan(TileIndex t0, TileIndex t1) uint DistanceMaxPlusManhattan(TileIndex t0, TileIndex t1)
{ {
const uint dx = abs(TileX(t0) - TileX(t1)); const uint dx = delta(TileX(t0), TileX(t1));
const uint dy = abs(TileY(t0) - TileY(t1)); const uint dy = delta(TileY(t0), TileY(t1));
return dx > dy ? 2 * dx + dy : 2 * dy + dx; return dx > dy ? 2 * dx + dy : 2 * dy + dx;
} }

View File

@ -67,13 +67,6 @@ static inline TileIndex TileVirtXY(uint x, uint y)
return (y >> 4 << MapLogX()) + (x >> 4); return (y >> 4 << MapLogX()) + (x >> 4);
} }
typedef byte Owner;
enum Owners {
OWNER_TOWN = 0x0F, // a town owns the tile
OWNER_NONE = 0x10, // nobody owns the tile
OWNER_WATER = 0x11, // "water" owns the tile
OWNER_END = 0x12,
};
enum { enum {
INVALID_TILE = (TileIndex)-1 INVALID_TILE = (TileIndex)-1

View File

@ -611,13 +611,13 @@ static void Load_CHTS(void)
uint i; uint i;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
cht[i].been_used = SlReadByte(); cht[i].been_used = (SlReadByte() != 0);
cht[i].value = SlReadByte(); cht[i].value = (SlReadByte() != 0);
} }
} }
const ChunkHandler _misc_chunk_handlers[] = { extern const ChunkHandler _misc_chunk_handlers[] = {
{ 'MAPS', Save_MAPS, Load_MAPS, CH_RIFF }, { 'MAPS', Save_MAPS, Load_MAPS, CH_RIFF },
{ 'MAPT', Save_MAPT, Load_MAPT, CH_RIFF }, { 'MAPT', Save_MAPT, Load_MAPT, CH_RIFF },
{ 'MAPO', Save_MAP1, Load_MAP1, CH_RIFF }, { 'MAPO', Save_MAP1, Load_MAP1, CH_RIFF },

View File

@ -40,7 +40,7 @@ int32 CmdSetPlayerColor(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{ {
Player *p, *pp; Player *p, *pp;
byte colour; byte colour;
LiveryScheme scheme = GB(p1, 0, 8); LiveryScheme scheme = (LiveryScheme)GB(p1, 0, 8);
byte state = GB(p1, 8, 2); byte state = GB(p1, 8, 2);
if (p2 >= 16) return CMD_ERROR; // max 16 colours if (p2 >= 16) return CMD_ERROR; // max 16 colours
@ -271,7 +271,7 @@ int32 CmdMoneyCheat(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (_networking) return CMD_ERROR; if (_networking) return CMD_ERROR;
#endif #endif
SET_EXPENSES_TYPE(EXPENSES_OTHER); SET_EXPENSES_TYPE(EXPENSES_OTHER);
return (int32)p1; return -(int32)p1;
} }
/** Transfer funds (money) from one player to another. /** Transfer funds (money) from one player to another.
@ -296,7 +296,7 @@ int32 CmdGiveMoney(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) { if (flags & DC_EXEC) {
/* Add money to player */ /* Add money to player */
PlayerID old_cp = _current_player; PlayerID old_cp = _current_player;
_current_player = p2; _current_player = (PlayerID)p2;
SubtractMoneyFromPlayer(-amount); SubtractMoneyFromPlayer(-amount);
_current_player = old_cp; _current_player = old_cp;
} }

View File

@ -95,7 +95,7 @@ static void Place_LandInfo(TileIndex tile)
w = AllocateWindowDesc(&_land_info_desc); w = AllocateWindowDesc(&_land_info_desc);
WP(w, void_d).data = &_landinfo_data; WP(w, void_d).data = &_landinfo_data;
p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : 0); p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
t = ClosestTownFromTile(tile, _patches.dist_local_authority); t = ClosestTownFromTile(tile, _patches.dist_local_authority);
old_money = p->money64; old_money = p->money64;
@ -166,7 +166,7 @@ static void Place_LandInfo(TileIndex tile)
if (td.build_date != 0) { if (td.build_date != 0) {
SetDParam(0, td.build_date); SetDParam(0, td.build_date);
GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6])); GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6]));
} else { } else {
_landinfo_data[6][0] = '\0'; _landinfo_data[6][0] = '\0';
} }
@ -505,7 +505,7 @@ static void ErrmsgWndProc(Window *w, WindowEvent *e)
_errmsg_message_1, _errmsg_message_1,
238); 238);
} else { } else {
const Player *p = GetPlayer(GetDParamX(_errmsg_decode_params,2)); const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2));
DrawPlayerFace(p->face, p->player_color, 2, 16); DrawPlayerFace(p->face, p->player_color, 2, 16);
DrawStringMultiCenter( DrawStringMultiCenter(
@ -1383,7 +1383,7 @@ static void GenerateFileName(void)
{ {
/* Check if we are not a specatator who wants to generate a name.. /* Check if we are not a specatator who wants to generate a name..
Let's use the name of player #0 for now. */ Let's use the name of player #0 for now. */
const Player *p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : 0); const Player *p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
SetDParam(0, p->name_1); SetDParam(0, p->name_1);
SetDParam(1, p->name_2); SetDParam(1, p->name_2);
@ -1691,7 +1691,7 @@ void SetFiosType(const byte fiostype)
static int32 ClickMoneyCheat(int32 p1, int32 p2) static int32 ClickMoneyCheat(int32 p1, int32 p2)
{ {
DoCommandP(0, -10000000, 0, NULL, CMD_MONEY_CHEAT); DoCommandP(0, 10000000, 0, NULL, CMD_MONEY_CHEAT);
return true; return true;
} }
@ -1739,9 +1739,17 @@ static int32 ClickChangeDateCheat(int32 p1, int32 p2)
typedef int32 CheckButtonClick(int32, int32); typedef int32 CheckButtonClick(int32, int32);
enum ce_flags {CE_CLICK = 1 << 0}; enum ce_flags_long
{
CE_NONE = 0,
CE_CLICK = 1 << 0,
CE_END = 1 << 1,
};
/** Define basic enum properties */
template <> struct EnumPropsT<ce_flags_long> : MakeEnumPropsT<ce_flags_long, byte, CE_NONE, CE_END, CE_END> {};
typedef TinyEnumT<ce_flags_long> ce_flags;
typedef byte ce_flags;
typedef struct CheatEntry { typedef struct CheatEntry {
VarType type; // type of selector VarType type; // type of selector
@ -1754,15 +1762,15 @@ typedef struct CheatEntry {
} CheatEntry; } CheatEntry;
static const CheatEntry _cheats_ui[] = { static const CheatEntry _cheats_ui[] = {
{SLE_BOOL,CE_CLICK, STR_CHEAT_MONEY, &_cheats.money.value, &_cheats.money.been_used, &ClickMoneyCheat, 0, 0}, {SLE_BOOL, {CE_CLICK}, STR_CHEAT_MONEY, &_cheats.money.value, &_cheats.money.been_used, &ClickMoneyCheat, 0, 0},
{SLE_UINT8, 0, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat, 0, 11}, {SLE_UINT8, {CE_NONE}, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat, 0, 11},
{SLE_BOOL, 0, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL, 0, 0}, {SLE_BOOL, {CE_NONE}, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL, 0, 0},
{SLE_BOOL, 0, STR_CHEAT_CROSSINGTUNNELS,&_cheats.crossing_tunnels.value,&_cheats.crossing_tunnels.been_used,NULL, 0, 0}, {SLE_BOOL, {CE_NONE}, STR_CHEAT_CROSSINGTUNNELS,&_cheats.crossing_tunnels.value,&_cheats.crossing_tunnels.been_used,NULL, 0, 0},
{SLE_BOOL, 0, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL, 0, 0}, {SLE_BOOL, {CE_NONE}, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL, 0, 0},
{SLE_BOOL, 0, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL, 0, 0}, {SLE_BOOL, {CE_NONE}, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL, 0, 0},
{SLE_BOOL, 0, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL, 0, 0}, {SLE_BOOL, {CE_NONE}, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL, 0, 0},
{SLE_UINT8, 0, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat,-1, 4}, {SLE_UINT8, {CE_NONE}, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat,-1, 4},
{SLE_INT32, 0, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat, -1, 1}, {SLE_INT32, {CE_NONE}, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat, -1, 1},
}; };
@ -1801,14 +1809,14 @@ static void CheatsWndProc(Window *w, WindowEvent *e)
bool on = (*(bool*)ce->variable); bool on = (*(bool*)ce->variable);
if (ce->flags & CE_CLICK) { if (ce->flags & CE_CLICK) {
DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, 0, (clk - (i * 2) == 1) ? FR_LOWERED : 0); DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, 0, (clk - (i * 2) == 1) ? FR_LOWERED : FR_NONE);
if (i == 0) { // XXX - hack/hack for first element which is increase money. Told ya it's a mess if (i == 0) { // XXX - hack/hack for first element which is increase money. Told ya it's a mess
SetDParam64(0, 10000000); SetDParam64(0, 10000000);
} else { } else {
SetDParam(0, false); SetDParam(0, false);
} }
} else { } else {
DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : 0); DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : FR_NONE);
SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF); SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
} }
} break; } break;

View File

@ -85,7 +85,7 @@ void MxMixSamples(void *buffer, uint samples)
// Mix each channel // Mix each channel
for (mc = _channels; mc != endof(_channels); mc++) { for (mc = _channels; mc != endof(_channels); mc++) {
if (mc->active) { if (mc->active) {
mix_int8_to_int16(mc, buffer, samples); mix_int8_to_int16(mc, (int16*)buffer, samples);
if (mc->samples_left == 0) MxCloseChannel(mc); if (mc->samples_left == 0) MxCloseChannel(mc);
} }
} }

View File

@ -4,12 +4,10 @@
#ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT #ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT
extern "C" { #include "../openttd.h"
#include "../openttd.h" #include "../debug.h"
#include "../debug.h" #include "../win32.h"
#include "../win32.h" #include "dmusic.h"
#include "dmusic.h"
}
#include <windows.h> #include <windows.h>
#include <dmksctrl.h> #include <dmksctrl.h>

View File

@ -396,11 +396,11 @@ static void MusicWindowWndProc(Window *w, WindowEvent *e)
DrawFrameRect(214, 23, 280, 26, 14, FR_LOWERED); DrawFrameRect(214, 23, 280, 26, 14, FR_LOWERED);
DrawFrameRect( DrawFrameRect(
108 + msf.music_vol / 2, 22, 111 + msf.music_vol / 2, 28, 14, 0 108 + msf.music_vol / 2, 22, 111 + msf.music_vol / 2, 28, 14, FR_NONE
); );
DrawFrameRect( DrawFrameRect(
214 + msf.effect_vol / 2, 22, 217 + msf.effect_vol / 2, 28, 14, 0 214 + msf.effect_vol / 2, 22, 217 + msf.effect_vol / 2, 28, 14, FR_NONE
); );
} break; } break;

View File

@ -5,6 +5,8 @@
#include "../../stdafx.h" #include "../../stdafx.h"
#include "../../macros.h" #include "../../macros.h"
#include "../../string.h" #include "../../string.h"
#include "../../helpers.hpp"
#include "../network_data.h"
#include "packet.h" #include "packet.h"
@ -24,7 +26,8 @@ extern void NORETURN CDECL error(const char *str, ...);
*/ */
Packet *NetworkSend_Init(const PacketType type) Packet *NetworkSend_Init(const PacketType type)
{ {
Packet *packet = malloc(sizeof(Packet)); Packet *packet;
MallocT(&packet, 1);
/* An error is inplace here, because it simply means we ran out of memory. */ /* An error is inplace here, because it simply means we ran out of memory. */
if (packet == NULL) error("Failed to allocate Packet"); if (packet == NULL) error("Failed to allocate Packet");
@ -109,7 +112,7 @@ void NetworkSend_string(Packet *packet, const char* data)
*/ */
extern uint CloseConnection(NetworkClientState *cs); extern NetworkRecvStatus CloseConnection(NetworkClientState *cs);
/** Is it safe to read from the packet, i.e. didn't we run over the buffer ? */ /** Is it safe to read from the packet, i.e. didn't we run over the buffer ? */
static inline bool CanReadFromPacket(NetworkClientState *cs, const Packet *packet, const uint bytes_to_read) static inline bool CanReadFromPacket(NetworkClientState *cs, const Packet *packet, const uint bytes_to_read)

View File

@ -12,6 +12,7 @@
#include "../network_data.h" #include "../network_data.h"
#include "packet.h" #include "packet.h"
#include "tcp.h" #include "tcp.h"
#include "../../helpers.hpp"
/** /**
* @file tcp.c Basic functions to receive and send TCP packets. * @file tcp.c Basic functions to receive and send TCP packets.
@ -99,7 +100,7 @@ bool NetworkSend_Packets(NetworkClientState *cs)
p = cs->packet_queue; p = cs->packet_queue;
while (p != NULL) { while (p != NULL) {
res = send(cs->socket, p->buffer + p->pos, p->size - p->pos, 0); res = send(cs->socket, (const char*)p->buffer + p->pos, p->size - p->pos, 0);
if (res == -1) { if (res == -1) {
int err = GET_LAST_ERROR(); int err = GET_LAST_ERROR();
if (err != EWOULDBLOCK) { if (err != EWOULDBLOCK) {
@ -148,7 +149,7 @@ Packet *NetworkRecv_Packet(NetworkClientState *cs, NetworkRecvStatus *status)
if (cs->socket == INVALID_SOCKET) return NULL; if (cs->socket == INVALID_SOCKET) return NULL;
if (cs->packet_recv == NULL) { if (cs->packet_recv == NULL) {
cs->packet_recv = malloc(sizeof(Packet)); MallocT(&cs->packet_recv, 1);
if (cs->packet_recv == NULL) error("Failed to allocate packet"); if (cs->packet_recv == NULL) error("Failed to allocate packet");
/* Set pos to zero! */ /* Set pos to zero! */
cs->packet_recv->pos = 0; cs->packet_recv->pos = 0;
@ -161,7 +162,7 @@ Packet *NetworkRecv_Packet(NetworkClientState *cs, NetworkRecvStatus *status)
if (p->pos < sizeof(PacketSize)) { if (p->pos < sizeof(PacketSize)) {
while (p->pos < sizeof(PacketSize)) { while (p->pos < sizeof(PacketSize)) {
/* Read the size of the packet */ /* Read the size of the packet */
res = recv(cs->socket, p->buffer + p->pos, sizeof(PacketSize) - p->pos, 0); res = recv(cs->socket, (char*)p->buffer + p->pos, sizeof(PacketSize) - p->pos, 0);
if (res == -1) { if (res == -1) {
int err = GET_LAST_ERROR(); int err = GET_LAST_ERROR();
if (err != EWOULDBLOCK) { if (err != EWOULDBLOCK) {
@ -191,7 +192,7 @@ Packet *NetworkRecv_Packet(NetworkClientState *cs, NetworkRecvStatus *status)
/* Read rest of packet */ /* Read rest of packet */
while (p->pos < p->size) { while (p->pos < p->size) {
res = recv(cs->socket, p->buffer + p->pos, p->size - p->pos, 0); res = recv(cs->socket, (char*)p->buffer + p->pos, p->size - p->pos, 0);
if (res == -1) { if (res == -1) {
int err = GET_LAST_ERROR(); int err = GET_LAST_ERROR();
if (err != EWOULDBLOCK) { if (err != EWOULDBLOCK) {

View File

@ -5,6 +5,7 @@
#include "../../stdafx.h" #include "../../stdafx.h"
#include "../../debug.h" #include "../../debug.h"
#include "../../macros.h" #include "../../macros.h"
#include "../../helpers.hpp"
#include "packet.h" #include "packet.h"
#include "udp.h" #include "udp.h"
@ -92,7 +93,7 @@ void NetworkSendUDP_Packet(const SOCKET udp, Packet *p, const struct sockaddr_in
NetworkSend_FillPacketSize(p); NetworkSend_FillPacketSize(p);
/* Send the buffer */ /* Send the buffer */
res = sendto(udp, p->buffer, p->size, 0, (struct sockaddr *)recv, sizeof(*recv)); res = sendto(udp, (const char*)p->buffer, p->size, 0, (struct sockaddr *)recv, sizeof(*recv));
/* Check for any errors, but ignore it otherwise */ /* Check for any errors, but ignore it otherwise */
if (res == -1) DEBUG(net, 1, "[udp] sendto failed with: %i", GET_LAST_ERROR()); if (res == -1) DEBUG(net, 1, "[udp] sendto failed with: %i", GET_LAST_ERROR());
@ -114,7 +115,7 @@ void NetworkUDPReceive(const SOCKET udp)
client_len = sizeof(client_addr); client_len = sizeof(client_addr);
/* Try to receive anything */ /* Try to receive anything */
nbytes = recvfrom(udp, p.buffer, packet_len, 0, (struct sockaddr *)&client_addr, &client_len); nbytes = recvfrom(udp, (char*)p.buffer, packet_len, 0, (struct sockaddr *)&client_addr, &client_len);
/* We got some bytes for the base header of the packet. */ /* We got some bytes for the base header of the packet. */
if (nbytes > 2) { if (nbytes > 2) {
@ -256,7 +257,7 @@ void NetworkRecv_NetworkGameInfo(NetworkClientState *cs, Packet *p, NetworkGameI
uint num_grfs = NetworkRecv_uint8(cs, p); uint num_grfs = NetworkRecv_uint8(cs, p);
for (i = 0; i < num_grfs; i++) { for (i = 0; i < num_grfs; i++) {
c = calloc(1, sizeof(*c)); CallocT(&c, 1);
NetworkRecv_GRFIdentifier(cs, p, c); NetworkRecv_GRFIdentifier(cs, p, c);
HandleIncomingNetworkGameInfoGRFConfig(c); HandleIncomingNetworkGameInfoGRFConfig(c);
@ -290,7 +291,7 @@ void NetworkRecv_NetworkGameInfo(NetworkClientState *cs, Packet *p, NetworkGameI
info->map_width = NetworkRecv_uint16(cs, p); info->map_width = NetworkRecv_uint16(cs, p);
info->map_height = NetworkRecv_uint16(cs, p); info->map_height = NetworkRecv_uint16(cs, p);
info->map_set = NetworkRecv_uint8 (cs, p); info->map_set = NetworkRecv_uint8 (cs, p);
info->dedicated = NetworkRecv_uint8 (cs, p); info->dedicated = (NetworkRecv_uint8 (cs, p) != 0);
} }
} }

View File

@ -7,9 +7,9 @@
extern const char _openttd_revision[]; extern const char _openttd_revision[];
#elif defined(WITH_REV_HACK) #elif defined(WITH_REV_HACK)
#define WITH_REV #define WITH_REV
const char _openttd_revision[] = WITH_REV_HACK; extern const char _openttd_revision[] = WITH_REV_HACK;
#else #else
const char _openttd_revision[] = NOREV_STRING; extern const char _openttd_revision[] = NOREV_STRING;
#endif #endif
@ -38,6 +38,19 @@
#include <stdarg.h> /* va_list */ #include <stdarg.h> /* va_list */
#include "../md5.h" #include "../md5.h"
// global variables (declared in network_data.h)
CommandPacket *_local_command_queue;
SOCKET _udp_client_socket; // udp client socket
SOCKET _udp_server_socket; // udp server socket
SOCKET _udp_master_socket; // udp master socket
// Here we keep track of the clients
// (and the client uses [0] for his own communication)
NetworkClientState _clients[MAX_CLIENTS];
// The listen socket for the server // The listen socket for the server
static SOCKET _listensocket; static SOCKET _listensocket;
@ -277,7 +290,7 @@ char* GetNetworkErrorMsg(char* buf, NetworkErrorCode err, const char* last)
STR_NETWORK_ERR_CLIENT_SERVER_FULL STR_NETWORK_ERR_CLIENT_SERVER_FULL
}; };
if (err >= lengthof(network_error_strings)) err = 0; if (err >= (ptrdiff_t)lengthof(network_error_strings)) err = NETWORK_ERROR_GENERAL;
return GetString(buf, network_error_strings[err], last); return GetString(buf, network_error_strings[err], last);
} }
@ -729,7 +742,7 @@ static void NetworkAcceptClients(void)
p->buffer[0] = p->size & 0xFF; p->buffer[0] = p->size & 0xFF;
p->buffer[1] = p->size >> 8; p->buffer[1] = p->size >> 8;
send(s, p->buffer, p->size, 0); send(s, (const char*)p->buffer, p->size, 0);
closesocket(s); closesocket(s);
free(p); free(p);
@ -750,7 +763,7 @@ static void NetworkAcceptClients(void)
p->buffer[0] = p->size & 0xFF; p->buffer[0] = p->size & 0xFF;
p->buffer[1] = p->size >> 8; p->buffer[1] = p->size >> 8;
send(s, p->buffer, p->size, 0); send(s, (const char*)p->buffer, p->size, 0);
closesocket(s); closesocket(s);
free(p); free(p);
@ -1032,7 +1045,7 @@ bool NetworkServerStart(void)
_network_own_client_index = NETWORK_SERVER_INDEX; _network_own_client_index = NETWORK_SERVER_INDEX;
/* Non-dedicated server will always be player #1 */ /* Non-dedicated server will always be player #1 */
if (!_network_dedicated) _network_playas = 0; if (!_network_dedicated) _network_playas = PLAYER_FIRST;
_network_clients_connected = 0; _network_clients_connected = 0;

View File

@ -59,7 +59,7 @@ typedef struct NetworkClientInfo {
uint16 client_index; // Index of the client (same as ClientState->index) uint16 client_index; // Index of the client (same as ClientState->index)
char client_name[NETWORK_CLIENT_NAME_LENGTH]; // Name of the client char client_name[NETWORK_CLIENT_NAME_LENGTH]; // Name of the client
byte client_lang; // The language of the client byte client_lang; // The language of the client
byte client_playas; // As which player is this client playing (PlayerID) PlayerID client_playas; // As which player is this client playing (PlayerID)
uint32 client_ip; // IP-address of the client (so he can be banned) uint32 client_ip; // IP-address of the client (so he can be banned)
Date join_date; // Gamedate the player has joined Date join_date; // Gamedate the player has joined
char unique_id[NETWORK_NAME_LENGTH]; // Every play sends an unique id so we can indentify him char unique_id[NETWORK_NAME_LENGTH]; // Every play sends an unique id so we can indentify him
@ -188,7 +188,6 @@ bool NetworkClientConnectGame(const char *host, uint16 port);
void NetworkReboot(void); void NetworkReboot(void);
void NetworkDisconnect(void); void NetworkDisconnect(void);
VARDEF bool _networking; ///< are we in networking mode?
VARDEF bool _network_server; ///< network-server is active VARDEF bool _network_server; ///< network-server is active
VARDEF bool _network_available; ///< is network mode available? VARDEF bool _network_available; ///< is network mode available?

View File

@ -20,7 +20,7 @@
#include "../console.h" #include "../console.h"
#include "../variables.h" #include "../variables.h"
#include "../ai/ai.h" #include "../ai/ai.h"
#include "../helpers.hpp"
// This file handles all the client-commands // This file handles all the client-commands
@ -286,14 +286,14 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMPANY_INFO)
if (!MY_CLIENT->has_quit && company_info_version == NETWORK_COMPANY_INFO_VERSION) { if (!MY_CLIENT->has_quit && company_info_version == NETWORK_COMPANY_INFO_VERSION) {
byte total; byte total;
byte current; PlayerID current;
total = NetworkRecv_uint8(MY_CLIENT, p); total = NetworkRecv_uint8(MY_CLIENT, p);
// There is no data at all.. // There is no data at all..
if (total == 0) return NETWORK_RECV_STATUS_CLOSE_QUERY; if (total == 0) return NETWORK_RECV_STATUS_CLOSE_QUERY;
current = NetworkRecv_uint8(MY_CLIENT, p); current = (Owner)NetworkRecv_uint8(MY_CLIENT, p);
if (!IsValidPlayer(current)) return NETWORK_RECV_STATUS_CLOSE_QUERY; if (!IsValidPlayer(current)) return NETWORK_RECV_STATUS_CLOSE_QUERY;
NetworkRecv_string(MY_CLIENT, p, _network_player_info[current].company_name, sizeof(_network_player_info[current].company_name)); NetworkRecv_string(MY_CLIENT, p, _network_player_info[current].company_name, sizeof(_network_player_info[current].company_name));
@ -325,7 +325,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO)
{ {
NetworkClientInfo *ci; NetworkClientInfo *ci;
uint16 index = NetworkRecv_uint16(MY_CLIENT, p); uint16 index = NetworkRecv_uint16(MY_CLIENT, p);
PlayerID playas = NetworkRecv_uint8(MY_CLIENT, p); PlayerID playas = (Owner)NetworkRecv_uint8(MY_CLIENT, p);
char name[NETWORK_NAME_LENGTH]; char name[NETWORK_NAME_LENGTH];
char unique_id[NETWORK_NAME_LENGTH]; char unique_id[NETWORK_NAME_LENGTH];
@ -375,7 +375,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO)
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR) DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR)
{ {
NetworkErrorCode error = NetworkRecv_uint8(MY_CLIENT, p); NetworkErrorCode error = (NetworkErrorCode)NetworkRecv_uint8(MY_CLIENT, p);
switch (error) { switch (error) {
/* We made an error in the protocol, and our connection is closed.... */ /* We made an error in the protocol, and our connection is closed.... */
@ -410,7 +410,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR)
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEED_PASSWORD) DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEED_PASSWORD)
{ {
NetworkPasswordType type = NetworkRecv_uint8(MY_CLIENT, p); NetworkPasswordType type = (NetworkPasswordType)NetworkRecv_uint8(MY_CLIENT, p);
switch (type) { switch (type) {
case NETWORK_GAME_PASSWORD: case NETWORK_GAME_PASSWORD:
@ -570,8 +570,9 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_SYNC)
DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND) DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND)
{ {
CommandPacket *cp = malloc(sizeof(CommandPacket)); CommandPacket *cp;
cp->player = NetworkRecv_uint8(MY_CLIENT, p); MallocT(&cp, 1);
cp->player = (PlayerID)NetworkRecv_uint8(MY_CLIENT, p);
cp->cmd = NetworkRecv_uint32(MY_CLIENT, p); cp->cmd = NetworkRecv_uint32(MY_CLIENT, p);
cp->p1 = NetworkRecv_uint32(MY_CLIENT, p); cp->p1 = NetworkRecv_uint32(MY_CLIENT, p);
cp->p2 = NetworkRecv_uint32(MY_CLIENT, p); cp->p2 = NetworkRecv_uint32(MY_CLIENT, p);
@ -601,9 +602,9 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT)
char name[NETWORK_NAME_LENGTH], msg[MAX_TEXT_MSG_LEN]; char name[NETWORK_NAME_LENGTH], msg[MAX_TEXT_MSG_LEN];
const NetworkClientInfo *ci = NULL, *ci_to; const NetworkClientInfo *ci = NULL, *ci_to;
NetworkAction action = NetworkRecv_uint8(MY_CLIENT, p); NetworkAction action = (NetworkAction)NetworkRecv_uint8(MY_CLIENT, p);
uint16 index = NetworkRecv_uint16(MY_CLIENT, p); uint16 index = NetworkRecv_uint16(MY_CLIENT, p);
bool self_send = NetworkRecv_uint8(MY_CLIENT, p); bool self_send = (NetworkRecv_uint8(MY_CLIENT, p) != 0);
NetworkRecv_string(MY_CLIENT, p, msg, MAX_TEXT_MSG_LEN); NetworkRecv_string(MY_CLIENT, p, msg, MAX_TEXT_MSG_LEN);
ci_to = NetworkFindClientInfoFromIndex(index); ci_to = NetworkFindClientInfoFromIndex(index);
@ -623,7 +624,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT)
if (!IsValidPlayer(ci_to->client_playas)) return NETWORK_RECV_STATUS_OKAY; if (!IsValidPlayer(ci_to->client_playas)) return NETWORK_RECV_STATUS_OKAY;
/* fallthrough */ /* fallthrough */
case NETWORK_ACTION_CHAT_COMPANY: { case NETWORK_ACTION_CHAT_COMPANY: {
StringID str = IsValidPlayer(ci_to->client_playas) ? GetPlayer(ci_to->client_playas)->name_1 : STR_NETWORK_SPECTATORS; StringID str = IsValidPlayer(ci_to->client_playas) ? GetPlayer(ci_to->client_playas)->name_1 : (uint16)STR_NETWORK_SPECTATORS;
GetString(name, str, lastof(name)); GetString(name, str, lastof(name));
ci = NetworkFindClientInfoFromIndex(_network_own_client_index); ci = NetworkFindClientInfoFromIndex(_network_own_client_index);
@ -649,7 +650,7 @@ DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR_QUIT)
NetworkClientInfo *ci; NetworkClientInfo *ci;
index = NetworkRecv_uint16(MY_CLIENT, p); index = NetworkRecv_uint16(MY_CLIENT, p);
GetNetworkErrorMsg(str, NetworkRecv_uint8(MY_CLIENT, p), lastof(str)); GetNetworkErrorMsg(str, (NetworkErrorCode)NetworkRecv_uint8(MY_CLIENT, p), lastof(str));
ci = NetworkFindClientInfoFromIndex(index); ci = NetworkFindClientInfoFromIndex(index);
if (ci != NULL) { if (ci != NULL) {

View File

@ -9,11 +9,13 @@
#include "network_client.h" #include "network_client.h"
#include "../command.h" #include "../command.h"
#include "../callback_table.h" #include "../callback_table.h"
#include "../helpers.hpp"
// Add a command to the local command queue // Add a command to the local command queue
void NetworkAddCommandQueue(NetworkClientState *cs, CommandPacket *cp) void NetworkAddCommandQueue(NetworkClientState *cs, CommandPacket *cp)
{ {
CommandPacket* new_cp = malloc(sizeof(*new_cp)); CommandPacket* new_cp;
MallocT(&new_cp, 1);
*new_cp = *cp; *new_cp = *cp;
@ -29,7 +31,8 @@ void NetworkAddCommandQueue(NetworkClientState *cs, CommandPacket *cp)
// Prepare a DoCommand to be send over the network // Prepare a DoCommand to be send over the network
void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback) void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback)
{ {
CommandPacket *c = malloc(sizeof(CommandPacket)); CommandPacket *c;
MallocT(&c, 1);
byte temp_callback; byte temp_callback;
c->player = _local_player; c->player = _local_player;

View File

@ -20,7 +20,7 @@
typedef struct CommandPacket { typedef struct CommandPacket {
struct CommandPacket *next; struct CommandPacket *next;
PlayerID player; /// player that is executing the command PlayerByte player; /// player that is executing the command
uint32 cmd; /// command being executed uint32 cmd; /// command being executed
uint32 p1; /// parameter p1 uint32 p1; /// parameter p1
uint32 p2; /// parameter p2 uint32 p2; /// parameter p2
@ -120,15 +120,17 @@ typedef enum {
DESTTYPE_CLIENT, ///< Send message/notice to only a certain player (Private) DESTTYPE_CLIENT, ///< Send message/notice to only a certain player (Private)
} DestType; } DestType;
CommandPacket *_local_command_queue; // following externs are instantiated at network.cpp
extern CommandPacket *_local_command_queue;
SOCKET _udp_client_socket; // udp client socket extern SOCKET _udp_client_socket; // udp client socket
SOCKET _udp_server_socket; // udp server socket extern SOCKET _udp_server_socket; // udp server socket
SOCKET _udp_master_socket; // udp master socket extern SOCKET _udp_master_socket; // udp master socket
// Here we keep track of the clients // Here we keep track of the clients
// (and the client uses [0] for his own communication) // (and the client uses [0] for his own communication)
NetworkClientState _clients[MAX_CLIENTS]; extern NetworkClientState _clients[MAX_CLIENTS];
#define DEREF_CLIENT(i) (&_clients[i]) #define DEREF_CLIENT(i) (&_clients[i])
// This returns the NetworkClientInfo from a NetworkClientState // This returns the NetworkClientInfo from a NetworkClientState
#define DEREF_CLIENT_INFO(cs) (&_network_client_info[cs - _clients]) #define DEREF_CLIENT_INFO(cs) (&_network_client_info[cs - _clients])

View File

@ -6,6 +6,7 @@
#include "../debug.h" #include "../debug.h"
#include "network_data.h" #include "network_data.h"
#include "../newgrf_config.h" #include "../newgrf_config.h"
#include "../helpers.hpp"
// This file handles the GameList // This file handles the GameList
// Also, it handles the request to a server for data about the server // Also, it handles the request to a server for data about the server
@ -25,7 +26,7 @@ NetworkGameList *NetworkGameListAddItem(uint32 ip, uint16 port)
prev_item = item; prev_item = item;
} }
item = malloc(sizeof(*item)); MallocT(&item, 1);
memset(item, 0, sizeof(*item)); memset(item, 0, sizeof(*item));
item->next = NULL; item->next = NULL;
item->ip = ip; item->ip = ip;

View File

@ -27,6 +27,7 @@
#include "../string.h" #include "../string.h"
#include "../town.h" #include "../town.h"
#include "../newgrf.h" #include "../newgrf.h"
#include "../helpers.hpp"
#define BGC 5 #define BGC 5
#define BTC 15 #define BTC 15
@ -166,7 +167,7 @@ static void BuildNetworkGameList(network_ql_d *nqld)
/* Create temporary array of games to use for listing */ /* Create temporary array of games to use for listing */
free(nqld->sort_list); free(nqld->sort_list);
nqld->sort_list = malloc(n * sizeof(nqld->sort_list[0])); MallocT(&nqld->sort_list, n);
if (nqld->sort_list == NULL) error("Could not allocate memory for the network-game-sorting-list"); if (nqld->sort_list == NULL) error("Could not allocate memory for the network-game-sorting-list");
nqld->l.list_length = n; nqld->l.list_length = n;
@ -221,7 +222,7 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
nd->server = NULL; nd->server = NULL;
WP(w, network_ql_d).sort_list = NULL; WP(w, network_ql_d).sort_list = NULL;
ld->flags = VL_REBUILD | (_ng_sorting.order << (VL_DESC - 1)); ld->flags = VL_REBUILD | (_ng_sorting.order ? VL_DESC : VL_NONE);
ld->sort_type = _ng_sorting.criteria; ld->sort_type = _ng_sorting.criteria;
break; break;
@ -787,19 +788,19 @@ static void ShowNetworkStartServerWindow(void)
InitializeTextBuffer(&WP(w, network_ql_d).q.text, _edit_str_buf, lengthof(_edit_str_buf), 160); InitializeTextBuffer(&WP(w, network_ql_d).q.text, _edit_str_buf, lengthof(_edit_str_buf), 160);
} }
static byte NetworkLobbyFindCompanyIndex(byte pos) static PlayerID NetworkLobbyFindCompanyIndex(byte pos)
{ {
byte i; PlayerID i;
/* Scroll through all _network_player_info and get the 'pos' item /* Scroll through all _network_player_info and get the 'pos' item
that is not empty */ that is not empty */
for (i = 0; i < MAX_PLAYERS; i++) { for (i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
if (_network_player_info[i].company_name[0] != '\0') { if (_network_player_info[i].company_name[0] != '\0') {
if (pos-- == 0) return i; if (pos-- == 0) return i;
} }
} }
return 0; return PLAYER_FIRST;
} }
/* uses network_d WP macro */ /* uses network_d WP macro */
@ -809,7 +810,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
switch (e->event) { switch (e->event) {
case WE_CREATE: case WE_CREATE:
nd->company = (byte)-1; nd->company = INVALID_PLAYER;
break; break;
case WE_PAINT: { case WE_PAINT: {
@ -919,7 +920,7 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e)
if (id_v >= w->vscroll.cap) return; if (id_v >= w->vscroll.cap) return;
id_v += w->vscroll.pos; id_v += w->vscroll.pos;
nd->company = (id_v >= nd->server->info.companies_on) ? (byte)-1 : NetworkLobbyFindCompanyIndex(id_v); nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
SetWindowDirty(w); SetWindowDirty(w);
} break; } break;
case 7: /* Join company */ case 7: /* Join company */
@ -1411,7 +1412,7 @@ static void NetworkJoinStatusWindowWndProc(Window *w, WindowEvent *e)
} }
/* Draw nice progress bar :) */ /* Draw nice progress bar :) */
DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, 0); DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE);
} break; } break;
case WE_CLICK: case WE_CLICK:
@ -1465,9 +1466,9 @@ static void SendChat(const char *buf, DestType type, byte dest)
{ {
if (buf[0] == '\0') return; if (buf[0] == '\0') return;
if (!_network_server) { if (!_network_server) {
SEND_COMMAND(PACKET_CLIENT_CHAT)(NETWORK_ACTION_CHAT + type, type, dest, buf); SEND_COMMAND(PACKET_CLIENT_CHAT)((NetworkAction)(NETWORK_ACTION_CHAT + type), type, dest, buf);
} else { } else {
NetworkServer_HandleChat(NETWORK_ACTION_CHAT + type, type, dest, buf, NETWORK_SERVER_INDEX); NetworkServer_HandleChat((NetworkAction)(NETWORK_ACTION_CHAT + type), type, dest, buf, NETWORK_SERVER_INDEX);
} }
} }
@ -1635,7 +1636,7 @@ static void ChatWindowWndProc(Window *w, WindowEvent *e)
case WE_CLICK: case WE_CLICK:
switch (e->we.click.widget) { switch (e->we.click.widget) {
case 3: { /* Send */ case 3: { /* Send */
DestType type = GB(WP(w, querystr_d).caption, 0, 8); DestType type = (DestType)GB(WP(w, querystr_d).caption, 0, 8);
byte dest = GB(WP(w, querystr_d).caption, 8, 8); byte dest = GB(WP(w, querystr_d).caption, 8, 8);
SendChat(WP(w, querystr_d).text.buf, type, dest); SendChat(WP(w, querystr_d).text.buf, type, dest);
} /* FALLTHROUGH */ } /* FALLTHROUGH */
@ -1654,7 +1655,7 @@ static void ChatWindowWndProc(Window *w, WindowEvent *e)
_chat_tab_completion_active = false; _chat_tab_completion_active = false;
switch (HandleEditBoxKey(w, &WP(w, querystr_d), 2, e)) { switch (HandleEditBoxKey(w, &WP(w, querystr_d), 2, e)) {
case 1: { /* Return */ case 1: { /* Return */
DestType type = GB(WP(w, querystr_d).caption, 0, 8); DestType type = (DestType)GB(WP(w, querystr_d).caption, 0, 8);
byte dest = GB(WP(w, querystr_d).caption, 8, 8); byte dest = GB(WP(w, querystr_d).caption, 8, 8);
SendChat(WP(w, querystr_d).text.buf, type, dest); SendChat(WP(w, querystr_d).text.buf, type, dest);
} /* FALLTHROUGH */ } /* FALLTHROUGH */

View File

@ -8,7 +8,7 @@
#include "network_data.h" #include "network_data.h"
void ShowNetworkNeedPassword(NetworkPasswordType npt); void ShowNetworkNeedPassword(NetworkPasswordType npt);
void ShowNetworkGiveMoneyWindow(byte player); // PlayerID void ShowNetworkGiveMoneyWindow(PlayerID player); // PlayerID
void ShowNetworkChatQueryWindow(DestType type, byte dest); void ShowNetworkChatQueryWindow(DestType type, byte dest);
void ShowJoinStatusWindow(void); void ShowJoinStatusWindow(void);
void ShowNetworkGameWindow(void); void ShowNetworkGameWindow(void);

View File

@ -22,6 +22,7 @@
#include "../station.h" #include "../station.h"
#include "../variables.h" #include "../variables.h"
#include "../genworld.h" #include "../genworld.h"
#include "../helpers.hpp"
// This file handles all the server-commands // This file handles all the server-commands
@ -571,7 +572,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
char name[NETWORK_CLIENT_NAME_LENGTH]; char name[NETWORK_CLIENT_NAME_LENGTH];
char unique_id[NETWORK_NAME_LENGTH]; char unique_id[NETWORK_NAME_LENGTH];
NetworkClientInfo *ci; NetworkClientInfo *ci;
byte playas; PlayerID playas;
NetworkLanguage client_lang; NetworkLanguage client_lang;
char client_revision[NETWORK_REVISION_LENGTH]; char client_revision[NETWORK_REVISION_LENGTH];
@ -588,8 +589,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN)
#endif #endif
NetworkRecv_string(cs, p, name, sizeof(name)); NetworkRecv_string(cs, p, name, sizeof(name));
playas = NetworkRecv_uint8(cs, p); playas = (Owner)NetworkRecv_uint8(cs, p);
client_lang = NetworkRecv_uint8(cs, p); client_lang = (NetworkLanguage)NetworkRecv_uint8(cs, p);
NetworkRecv_string(cs, p, unique_id, sizeof(unique_id)); NetworkRecv_string(cs, p, unique_id, sizeof(unique_id));
if (cs->has_quit) return; if (cs->has_quit) return;
@ -654,7 +655,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD)
char password[NETWORK_PASSWORD_LENGTH]; char password[NETWORK_PASSWORD_LENGTH];
const NetworkClientInfo *ci; const NetworkClientInfo *ci;
type = NetworkRecv_uint8(cs, p); type = (NetworkPasswordType)NetworkRecv_uint8(cs, p);
NetworkRecv_string(cs, p, password, sizeof(password)); NetworkRecv_string(cs, p, password, sizeof(password));
if (cs->status == STATUS_INACTIVE && type == NETWORK_GAME_PASSWORD) { if (cs->status == STATUS_INACTIVE && type == NETWORK_GAME_PASSWORD) {
@ -792,7 +793,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
const NetworkClientInfo *ci; const NetworkClientInfo *ci;
byte callback; byte callback;
CommandPacket *cp = malloc(sizeof(CommandPacket)); CommandPacket *cp;
MallocT(&cp, 1);
// The client was never joined.. so this is impossible, right? // The client was never joined.. so this is impossible, right?
// Ignore the packet, give the client a warning, and close his connection // Ignore the packet, give the client a warning, and close his connection
@ -801,7 +803,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
return; return;
} }
cp->player = NetworkRecv_uint8(cs, p); cp->player = (Owner)NetworkRecv_uint8(cs, p);
cp->cmd = NetworkRecv_uint32(cs, p); cp->cmd = NetworkRecv_uint32(cs, p);
cp->p1 = NetworkRecv_uint32(cs, p); cp->p1 = NetworkRecv_uint32(cs, p);
cp->p2 = NetworkRecv_uint32(cs, p); cp->p2 = NetworkRecv_uint32(cs, p);
@ -851,7 +853,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND)
/* XXX - Execute the command as a valid player. Normally this would be done by a /* XXX - Execute the command as a valid player. Normally this would be done by a
* spectator, but that is not allowed any commands. So do an impersonation. The drawback * spectator, but that is not allowed any commands. So do an impersonation. The drawback
* of this is that the first company's last_built_tile is also updated... */ * of this is that the first company's last_built_tile is also updated... */
cp->player = 0; cp->player = OWNER_BEGIN;
cp->p2 = cs - _clients; // XXX - UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl cp->p2 = cs - _clients; // XXX - UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl
} }
@ -890,7 +892,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR)
NetworkClientState *new_cs; NetworkClientState *new_cs;
char str[100]; char str[100];
char client_name[NETWORK_CLIENT_NAME_LENGTH]; char client_name[NETWORK_CLIENT_NAME_LENGTH];
NetworkErrorCode errorno = NetworkRecv_uint8(cs, p); NetworkErrorCode errorno = (NetworkErrorCode)NetworkRecv_uint8(cs, p);
// The client was never joined.. thank the client for the packet, but ignore it // The client was never joined.. thank the client for the packet, but ignore it
if (cs->status < STATUS_DONE_MAP || cs->has_quit) { if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
@ -1044,7 +1046,7 @@ void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest,
if (ci != NULL && show_local) { if (ci != NULL && show_local) {
if (from_index == NETWORK_SERVER_INDEX) { if (from_index == NETWORK_SERVER_INDEX) {
char name[NETWORK_NAME_LENGTH]; char name[NETWORK_NAME_LENGTH];
StringID str = IsValidPlayer(ci_to->client_playas) ? GetPlayer(ci_to->client_playas)->name_1 : STR_NETWORK_SPECTATORS; StringID str = IsValidPlayer(ci_to->client_playas) ? GetPlayer(ci_to->client_playas)->name_1 : (uint16)STR_NETWORK_SPECTATORS;
GetString(name, str, lastof(name)); GetString(name, str, lastof(name));
NetworkTextMessage(action, GetDrawStringPlayerColor(ci_own->client_playas), true, name, "%s", msg); NetworkTextMessage(action, GetDrawStringPlayerColor(ci_own->client_playas), true, name, "%s", msg);
} else { } else {
@ -1073,8 +1075,8 @@ void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest,
DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT) DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
{ {
NetworkAction action = NetworkRecv_uint8(cs, p); NetworkAction action = (NetworkAction)NetworkRecv_uint8(cs, p);
DestType desttype = NetworkRecv_uint8(cs, p); DestType desttype = (DestType)NetworkRecv_uint8(cs, p);
int dest = NetworkRecv_uint8(cs, p); int dest = NetworkRecv_uint8(cs, p);
char msg[MAX_TEXT_MSG_LEN]; char msg[MAX_TEXT_MSG_LEN];

View File

@ -335,7 +335,7 @@ DEF_UDP_RECEIVE_COMMAND(PACKET_UDP_CLIENT_GET_NEWGRFS)
* the current list and do not send the other data. * the current list and do not send the other data.
* The name could be an empty string, if so take the filename. */ * The name could be an empty string, if so take the filename. */
packet_len += sizeof(c.grfid) + sizeof(c.md5sum) + packet_len += sizeof(c.grfid) + sizeof(c.md5sum) +
min(strlen((f->name != NULL && strlen(f->name) > 0) ? f->name : f->filename) + 1, NETWORK_GRF_NAME_LENGTH); min(strlen((f->name != NULL && strlen(f->name) > 0) ? f->name : f->filename) + 1, (size_t)NETWORK_GRF_NAME_LENGTH);
if (packet_len > SEND_MTU - 4) { // 4 is 3 byte header + grf count in reply if (packet_len > SEND_MTU - 4) { // 4 is 3 byte header + grf count in reply
break; break;
} }

View File

@ -30,6 +30,7 @@
#include "newgrf_config.h" #include "newgrf_config.h"
#include "newgrf_sound.h" #include "newgrf_sound.h"
#include "newgrf_spritegroup.h" #include "newgrf_spritegroup.h"
#include "helpers.hpp"
/* TTDPatch extended GRF format codec /* TTDPatch extended GRF format codec
* (c) Petr Baudis 2004 (GPL'd) * (c) Petr Baudis 2004 (GPL'd)
@ -542,7 +543,7 @@ static bool RoadVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
break; break;
case 0x12: /* SFX */ case 0x12: /* SFX */
FOR_EACH_OBJECT rvi[i].sfx = grf_load_byte(&buf); FOR_EACH_OBJECT rvi[i].sfx = (SoundFx)grf_load_byte(&buf);
break; break;
case 0x13: /* Power in 10hp */ case 0x13: /* Power in 10hp */
@ -627,7 +628,7 @@ static bool ShipVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
break; break;
case 0x09: /* Refittable */ case 0x09: /* Refittable */
FOR_EACH_OBJECT svi[i].refittable = grf_load_byte(&buf); FOR_EACH_OBJECT svi[i].refittable = (grf_load_byte(&buf) != 0);
break; break;
case 0x0A: /* Cost factor */ case 0x0A: /* Cost factor */
@ -666,7 +667,7 @@ static bool ShipVehicleChangeInfo(uint engine, int numinfo, int prop, byte **buf
break; break;
case 0x10: /* SFX */ case 0x10: /* SFX */
FOR_EACH_OBJECT svi[i].sfx = grf_load_byte(&buf); FOR_EACH_OBJECT svi[i].sfx = (SoundFx)grf_load_byte(&buf);
break; break;
case 0x11: /* Cargos available for refitting */ case 0x11: /* Cargos available for refitting */
@ -779,7 +780,7 @@ static bool AircraftVehicleChangeInfo(uint engine, int numinfo, int prop, byte *
break; break;
case 0x12: /* SFX */ case 0x12: /* SFX */
FOR_EACH_OBJECT avi[i].sfx = grf_load_byte(&buf); FOR_EACH_OBJECT avi[i].sfx = (SoundFx)grf_load_byte(&buf);
break; break;
case 0x13: /* Cargos available for refitting */ case 0x13: /* Cargos available for refitting */
@ -841,7 +842,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
} }
/* Allocate station specs if necessary */ /* Allocate station specs if necessary */
if (_cur_grffile->stations == NULL) _cur_grffile->stations = calloc(MAX_STATIONS, sizeof(*_cur_grffile->stations)); if (_cur_grffile->stations == NULL) CallocT(&_cur_grffile->stations, MAX_STATIONS);
statspec = &_cur_grffile->stations[stid]; statspec = &_cur_grffile->stations[stid];
@ -861,7 +862,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
uint32 classid; uint32 classid;
/* Property 0x08 is special; it is where the station is allocated */ /* Property 0x08 is special; it is where the station is allocated */
if (statspec[i] == NULL) statspec[i] = calloc(1, sizeof(*statspec[i])); if (statspec[i] == NULL) CallocT(&statspec[i], 1);
/* Swap classid because we read it in BE meaning WAYP or DFLT */ /* Swap classid because we read it in BE meaning WAYP or DFLT */
classid = grf_load_dword(&buf); classid = grf_load_dword(&buf);
@ -875,7 +876,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
uint t; uint t;
statspec->tiles = grf_load_extended(&buf); statspec->tiles = grf_load_extended(&buf);
statspec->renderdata = calloc(statspec->tiles, sizeof(*statspec->renderdata)); CallocT(&statspec->renderdata, statspec->tiles);
statspec->copied_renderdata = false; statspec->copied_renderdata = false;
for (t = 0; t < statspec->tiles; t++) { for (t = 0; t < statspec->tiles; t++) {
@ -890,7 +891,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
DrawTileSeqStruct *dtss; DrawTileSeqStruct *dtss;
// no relative bounding box support // no relative bounding box support
dts->seq = realloc((void*)dts->seq, ++seq_count * sizeof(DrawTileSeqStruct)); ReallocT((DrawTileSeqStruct**)&dts->seq, ++seq_count);
dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1]; dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1];
dtss->delta_x = grf_load_byte(&buf); dtss->delta_x = grf_load_byte(&buf);
@ -956,10 +957,10 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
//debug("l %d > %d ?", length, stat->lengths); //debug("l %d > %d ?", length, stat->lengths);
if (length > statspec->lengths) { if (length > statspec->lengths) {
statspec->platforms = realloc(statspec->platforms, length); ReallocT(&statspec->platforms, length);
memset(statspec->platforms + statspec->lengths, 0, length - statspec->lengths); memset(statspec->platforms + statspec->lengths, 0, length - statspec->lengths);
statspec->layouts = realloc(statspec->layouts, length * sizeof(*statspec->layouts)); ReallocT(&statspec->layouts, length);
memset(statspec->layouts + statspec->lengths, 0, memset(statspec->layouts + statspec->lengths, 0,
(length - statspec->lengths) * sizeof(*statspec->layouts)); (length - statspec->lengths) * sizeof(*statspec->layouts));
@ -969,8 +970,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
//debug("p %d > %d ?", number, stat->platforms[l]); //debug("p %d > %d ?", number, stat->platforms[l]);
if (number > statspec->platforms[l]) { if (number > statspec->platforms[l]) {
statspec->layouts[l] = realloc(statspec->layouts[l], ReallocT(&statspec->layouts[l], number);
number * sizeof(**statspec->layouts));
// We expect NULL being 0 here, but C99 guarantees that. // We expect NULL being 0 here, but C99 guarantees that.
memset(statspec->layouts[l] + statspec->platforms[l], 0, memset(statspec->layouts[l] + statspec->platforms[l], 0,
(number - statspec->platforms[l]) * sizeof(**statspec->layouts)); (number - statspec->platforms[l]) * sizeof(**statspec->layouts));
@ -979,7 +979,7 @@ static bool StationChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int
} }
p = 0; p = 0;
layout = malloc(length * number); MallocT(&layout, length * number);
for (l = 0; l < length; l++) { for (l = 0; l < length; l++) {
for (p = 0; p < number; p++) { for (p = 0; p < number; p++) {
layout[l * number + p] = grf_load_byte(&buf); layout[l * number + p] = grf_load_byte(&buf);
@ -1075,7 +1075,7 @@ static bool BridgeChangeInfo(uint brid, int numinfo, int prop, byte **bufp, int
if (bridge->sprite_table == NULL) { if (bridge->sprite_table == NULL) {
/* Allocate memory for sprite table pointers and zero out */ /* Allocate memory for sprite table pointers and zero out */
bridge->sprite_table = calloc(7, sizeof(*bridge->sprite_table)); CallocT(bridge->sprite_table, 7);
} }
for (; numtables-- != 0; tableid++) { for (; numtables-- != 0; tableid++) {
@ -1088,7 +1088,7 @@ static bool BridgeChangeInfo(uint brid, int numinfo, int prop, byte **bufp, int
} }
if (bridge->sprite_table[tableid] == NULL) { if (bridge->sprite_table[tableid] == NULL) {
bridge->sprite_table[tableid] = malloc(32 * sizeof(**bridge->sprite_table)); MallocT(&bridge->sprite_table[tableid], 32);
} }
for (sprite = 0; sprite < 32; sprite++) for (sprite = 0; sprite < 32; sprite++)
@ -1595,7 +1595,7 @@ static void NewSpriteGroup(byte *buf, int len)
if (setid >= _cur_grffile->spritegroups_count) { if (setid >= _cur_grffile->spritegroups_count) {
// Allocate memory for new sprite group references. // Allocate memory for new sprite group references.
_cur_grffile->spritegroups = realloc(_cur_grffile->spritegroups, (setid + 1) * sizeof(*_cur_grffile->spritegroups)); ReallocT(&_cur_grffile->spritegroups, setid + 1);
// Initialise new space to NULL // Initialise new space to NULL
for (; _cur_grffile->spritegroups_count < (setid + 1); _cur_grffile->spritegroups_count++) for (; _cur_grffile->spritegroups_count < (setid + 1); _cur_grffile->spritegroups_count++)
_cur_grffile->spritegroups[_cur_grffile->spritegroups_count] = NULL; _cur_grffile->spritegroups[_cur_grffile->spritegroups_count] = NULL;
@ -1640,18 +1640,18 @@ static void NewSpriteGroup(byte *buf, int len)
} }
group->g.determ.num_adjusts++; group->g.determ.num_adjusts++;
group->g.determ.adjusts = realloc(group->g.determ.adjusts, group->g.determ.num_adjusts * sizeof(*group->g.determ.adjusts)); ReallocT(&group->g.determ.adjusts, group->g.determ.num_adjusts);
adjust = &group->g.determ.adjusts[group->g.determ.num_adjusts - 1]; adjust = &group->g.determ.adjusts[group->g.determ.num_adjusts - 1];
/* The first var adjust doesn't have an operation specified, so we set it to add. */ /* The first var adjust doesn't have an operation specified, so we set it to add. */
adjust->operation = group->g.determ.num_adjusts == 1 ? DSGA_OP_ADD : grf_load_byte(&buf); adjust->operation = group->g.determ.num_adjusts == 1 ? DSGA_OP_ADD : (DeterministicSpriteGroupAdjustOperation)grf_load_byte(&buf);
adjust->variable = grf_load_byte(&buf); adjust->variable = grf_load_byte(&buf);
adjust->parameter = IS_BYTE_INSIDE(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0; adjust->parameter = IS_BYTE_INSIDE(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
varadjust = grf_load_byte(&buf); varadjust = grf_load_byte(&buf);
adjust->shift_num = GB(varadjust, 0, 5); adjust->shift_num = GB(varadjust, 0, 5);
adjust->type = GB(varadjust, 6, 2); adjust->type = (DeterministicSpriteGroupAdjustType)GB(varadjust, 6, 2);
adjust->and_mask = grf_load_var(varsize, &buf); adjust->and_mask = grf_load_var(varsize, &buf);
if (adjust->type != DSGA_TYPE_NONE) { if (adjust->type != DSGA_TYPE_NONE) {
@ -1666,7 +1666,7 @@ static void NewSpriteGroup(byte *buf, int len)
} while (HASBIT(varadjust, 5)); } while (HASBIT(varadjust, 5));
group->g.determ.num_ranges = grf_load_byte(&buf); group->g.determ.num_ranges = grf_load_byte(&buf);
group->g.determ.ranges = calloc(group->g.determ.num_ranges, sizeof(*group->g.determ.ranges)); CallocT(&group->g.determ.ranges, group->g.determ.num_ranges);
check_length(bufend - buf, 2 + (2 + 2 * varsize) * group->g.determ.num_ranges, "NewSpriteGroup (Deterministic)"); check_length(bufend - buf, 2 + (2 + 2 * varsize) * group->g.determ.num_ranges, "NewSpriteGroup (Deterministic)");
@ -1698,7 +1698,7 @@ static void NewSpriteGroup(byte *buf, int len)
group->g.random.cmp_mode = HASBIT(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY; group->g.random.cmp_mode = HASBIT(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
group->g.random.lowest_randbit = grf_load_byte(&buf); group->g.random.lowest_randbit = grf_load_byte(&buf);
group->g.random.num_groups = grf_load_byte(&buf); group->g.random.num_groups = grf_load_byte(&buf);
group->g.random.groups = calloc(group->g.random.num_groups, sizeof(*group->g.random.groups)); CallocT(&group->g.random.groups, group->g.random.num_groups);
check_length(bufend - buf, 2 * group->g.random.num_groups, "NewSpriteGroup (Randomized) (2)"); check_length(bufend - buf, 2 * group->g.random.num_groups, "NewSpriteGroup (Randomized) (2)");
@ -1738,8 +1738,8 @@ static void NewSpriteGroup(byte *buf, int len)
group->g.real.num_loaded = num_loaded; group->g.real.num_loaded = num_loaded;
group->g.real.num_loading = num_loading; group->g.real.num_loading = num_loading;
if (num_loaded > 0) group->g.real.loaded = calloc(num_loaded, sizeof(*group->g.real.loaded)); if (num_loaded > 0) CallocT(&group->g.real.loaded, num_loaded);
if (num_loading > 0) group->g.real.loading = calloc(num_loading, sizeof(*group->g.real.loading)); if (num_loading > 0) CallocT(&group->g.real.loading, num_loading);
grfmsg(6, "NewSpriteGroup: New SpriteGroup 0x%02X, %u views, %u loaded, %u loading", grfmsg(6, "NewSpriteGroup: New SpriteGroup 0x%02X, %u views, %u loaded, %u loading",
setid, sprites, num_loaded, num_loading); setid, sprites, num_loaded, num_loading);
@ -1884,7 +1884,7 @@ static void FeatureMapSpriteGroup(byte *buf, int len)
} }
if (!wagover && last_engines_count != idcount) { if (!wagover && last_engines_count != idcount) {
last_engines = realloc(last_engines, idcount); ReallocT(&last_engines, idcount);
last_engines_count = idcount; last_engines_count = idcount;
} }
@ -2235,7 +2235,7 @@ static uint32 GetParamVal(byte param, uint32 *cond_val)
return _game_mode; return _game_mode;
case 0x9A: /* Always -1 */ case 0x9A: /* Always -1 */
return -1; return UINT_MAX;
case 0x9D: /* TTD Platform, 00=TTDPatch, 01=OpenTTD */ case 0x9D: /* TTD Platform, 00=TTDPatch, 01=OpenTTD */
return 1; return 1;
@ -2249,7 +2249,7 @@ static uint32 GetParamVal(byte param, uint32 *cond_val)
/* In-game variable. */ /* In-game variable. */
grfmsg(1, "Unsupported in-game variable 0x%02X", param); grfmsg(1, "Unsupported in-game variable 0x%02X", param);
return -1; return UINT_MAX;
} }
} }
@ -2274,7 +2274,7 @@ static void CfgApply(byte *buf, int len)
/* Check if the sprite is a pseudo sprite. We can't operate on real sprites. */ /* Check if the sprite is a pseudo sprite. We can't operate on real sprites. */
if (type == 0xFF) { if (type == 0xFF) {
_preload_sprite = malloc(num); MallocT(&_preload_sprite, num);
FioReadBlock(_preload_sprite, num); FioReadBlock(_preload_sprite, num);
} }
@ -2788,7 +2788,7 @@ static void ParamSet(byte *buf, int len)
} }
grfmsg(1, "GRM: Unable to allocate %d vehicles", count); grfmsg(1, "GRM: Unable to allocate %d vehicles", count);
src1 = -1; src1 = UINT_MAX;
} }
break; break;
} }
@ -3026,7 +3026,7 @@ static void DefineGotoLabel(byte *buf, int len)
check_length(len, 1, "DefineGotoLabel"); check_length(len, 1, "DefineGotoLabel");
buf++; len--; buf++; len--;
label = malloc(sizeof(*label)); MallocT(&label, 1);
label->label = grf_load_byte(&buf); label->label = grf_load_byte(&buf);
label->nfo_line = _nfo_line; label->nfo_line = _nfo_line;
label->pos = FioGetPos(); label->pos = FioGetPos();
@ -3198,7 +3198,7 @@ static void LoadFontGlyph(byte *buf, int len)
check_length(len, 1 + num_def * 4, "LoadFontGlyph"); check_length(len, 1 + num_def * 4, "LoadFontGlyph");
for (i = 0; i < num_def; i++) { for (i = 0; i < num_def; i++) {
FontSize size = grf_load_byte(&buf); FontSize size = (FontSize)grf_load_byte(&buf);
uint8 num_char = grf_load_byte(&buf); uint8 num_char = grf_load_byte(&buf);
uint16 base_char = grf_load_word(&buf); uint16 base_char = grf_load_word(&buf);
uint c; uint c;
@ -3489,7 +3489,7 @@ static void InitNewGRFFile(const GRFConfig *config, int sprite_offset)
return; return;
} }
newfile = calloc(1, sizeof(*newfile)); CallocT(&newfile, 1);
if (newfile == NULL) error ("Out of memory"); if (newfile == NULL) error ("Out of memory");
@ -3617,7 +3617,7 @@ static void DecodeSpecialSprite(uint num, GrfLoadingStage stage)
if (_preload_sprite == NULL) { if (_preload_sprite == NULL) {
/* No preloaded sprite to work with; allocate and read the /* No preloaded sprite to work with; allocate and read the
* pseudo sprite content. */ * pseudo sprite content. */
buf = malloc(num); MallocT(&buf, num);
if (buf == NULL) error("DecodeSpecialSprite: Could not allocate memory"); if (buf == NULL) error("DecodeSpecialSprite: Could not allocate memory");
FioReadBlock(buf, num); FioReadBlock(buf, num);
} else { } else {
@ -3770,3 +3770,4 @@ void LoadNewGRF(uint load_index, uint file_index)
} }

View File

@ -5,6 +5,7 @@
#include "station.h" #include "station.h"
#include "newgrf_config.h" #include "newgrf_config.h"
#include "helpers.hpp"
typedef enum GrfLoadingStage { typedef enum GrfLoadingStage {
GLS_FILESCAN, GLS_FILESCAN,
@ -15,6 +16,9 @@ typedef enum GrfLoadingStage {
GLS_END, GLS_END,
} GrfLoadingStage; } GrfLoadingStage;
DECLARE_POSTFIX_INCREMENT(GrfLoadingStage);
typedef struct GRFLabel { typedef struct GRFLabel {
byte label; byte label;
uint32 nfo_line; uint32 nfo_line;

View File

@ -12,6 +12,7 @@
#include "network/network_data.h" #include "network/network_data.h"
#include "newgrf.h" #include "newgrf.h"
#include "newgrf_config.h" #include "newgrf_config.h"
#include "helpers.hpp"
#include "fileio.h" #include "fileio.h"
#include "fios.h" #include "fios.h"
@ -123,7 +124,7 @@ GRFConfig **CopyGRFConfigList(GRFConfig **dst, const GRFConfig *src)
/* Clear destination as it will be overwritten */ /* Clear destination as it will be overwritten */
ClearGRFConfigList(dst); ClearGRFConfigList(dst);
for (; src != NULL; src = src->next) { for (; src != NULL; src = src->next) {
c = calloc(1, sizeof(*c)); CallocT(&c, 1);
*c = *src; *c = *src;
if (src->filename != NULL) c->filename = strdup(src->filename); if (src->filename != NULL) c->filename = strdup(src->filename);
if (src->name != NULL) c->name = strdup(src->name); if (src->name != NULL) c->name = strdup(src->name);
@ -269,7 +270,7 @@ static uint ScanPath(const char *path)
if (ext == NULL) continue; if (ext == NULL) continue;
if (strcasecmp(ext, ".grf") != 0) continue; if (strcasecmp(ext, ".grf") != 0) continue;
c = calloc(1, sizeof(*c)); CallocT(&c, 1);
c->filename = strdup(file); c->filename = strdup(file);
if (FillGRFDetails(c, false)) { if (FillGRFDetails(c, false)) {
@ -374,7 +375,7 @@ char *FindUnknownGRFName(uint32 grfid, uint8 *md5sum, bool create)
if (!create) return NULL; if (!create) return NULL;
grf = calloc(1, sizeof(*grf)); CallocT(&grf, 1);
grf->grfid = grfid; grf->grfid = grfid;
grf->next = unknown_grfs; grf->next = unknown_grfs;
ttd_strlcpy(grf->name, UNKNOWN_GRF_NAME_PLACEHOLDER, sizeof(grf->name)); ttd_strlcpy(grf->name, UNKNOWN_GRF_NAME_PLACEHOLDER, sizeof(grf->name));
@ -445,7 +446,8 @@ static void Load_NGRF(void)
GRFConfig **last = &first; GRFConfig **last = &first;
while (SlIterateArray() != -1) { while (SlIterateArray() != -1) {
GRFConfig *c = calloc(1, sizeof(*c)); GRFConfig *c;
CallocT(&c, 1);
SlObject(c, _grfconfig_desc); SlObject(c, _grfconfig_desc);
/* Append our configuration to the list */ /* Append our configuration to the list */
@ -461,7 +463,7 @@ static void Load_NGRF(void)
AppendStaticGRFConfigs(&_grfconfig); AppendStaticGRFConfigs(&_grfconfig);
} }
const ChunkHandler _newgrf_chunk_handlers[] = { extern const ChunkHandler _newgrf_chunk_handlers[] = {
{ 'NGRF', Save_NGRF, Load_NGRF, CH_ARRAY | CH_LAST } { 'NGRF', Save_NGRF, Load_NGRF, CH_ARRAY | CH_LAST }
}; };

View File

@ -17,6 +17,7 @@
#include "newgrf_spritegroup.h" #include "newgrf_spritegroup.h"
#include "newgrf_cargo.h" #include "newgrf_cargo.h"
#include "date.h" #include "date.h"
#include "helpers.hpp"
@ -82,8 +83,7 @@ void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *
wos = &_engine_wagon_overrides[engine]; wos = &_engine_wagon_overrides[engine];
wos->overrides_count++; wos->overrides_count++;
wos->overrides = realloc(wos->overrides, ReallocT(&wos->overrides, wos->overrides_count);
wos->overrides_count * sizeof(*wos->overrides));
wo = &wos->overrides[wos->overrides_count - 1]; wo = &wos->overrides[wos->overrides_count - 1];
/* FIXME: If we are replacing an override, release original SpriteGroup /* FIXME: If we are replacing an override, release original SpriteGroup
@ -92,7 +92,7 @@ void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *
wo->group = group; wo->group = group;
wo->cargo = cargo; wo->cargo = cargo;
wo->trains = trains; wo->trains = trains;
wo->train_id = malloc(trains); MallocT(&wo->train_id, trains);
memcpy(wo->train_id, train_id, trains); memcpy(wo->train_id, train_id, trains);
} }
@ -563,7 +563,7 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
} }
*available = false; *available = false;
return -1; return UINT_MAX;
} }
/* Calculated vehicle parameters */ /* Calculated vehicle parameters */
@ -628,7 +628,7 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
return v->owner; return v->owner;
case 0x44: /* Aircraft information */ case 0x44: /* Aircraft information */
if (v->type != VEH_Aircraft) return -1; if (v->type != VEH_Aircraft) return UINT_MAX;
{ {
const Vehicle *w = v->next; const Vehicle *w = v->next;
@ -806,7 +806,7 @@ static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, by
DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type); DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type);
*available = false; *available = false;
return -1; return UINT_MAX;
} }

View File

@ -11,6 +11,7 @@
#include "table/sprites.h" #include "table/sprites.h"
#include "newgrf.h" #include "newgrf.h"
#include "newgrf_config.h" #include "newgrf_config.h"
#include "helpers.hpp"
/** Parse an integerlist string and set each found value /** Parse an integerlist string and set each found value
@ -164,7 +165,7 @@ static void NewGRFAddDlgWndProc(Window *w, WindowEvent *e)
} }
/* Copy GRF details from scanned list */ /* Copy GRF details from scanned list */
c = calloc(1, sizeof(*c)); CallocT(&c, 1);
*c = *src; *c = *src;
c->filename = strdup(src->filename); c->filename = strdup(src->filename);
if (src->name != NULL) c->name = strdup(src->name); if (src->name != NULL) c->name = strdup(src->name);

View File

@ -63,6 +63,6 @@ bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event)
if (callback == CALLBACK_FAILED) return false; if (callback == CALLBACK_FAILED) return false;
if (callback >= GetNumOriginalSounds()) callback += file->sound_offset - GetNumOriginalSounds(); if (callback >= GetNumOriginalSounds()) callback += file->sound_offset - GetNumOriginalSounds();
if (callback < GetNumSounds()) SndPlayVehicleFx(callback, v); if (callback < GetNumSounds()) SndPlayVehicleFx((SoundFx)callback, v);
return true; return true;
} }

View File

@ -81,7 +81,7 @@ static inline uint32 GetVariable(const ResolverObject *object, byte variable, by
case 0x10: return object->callback_param1; case 0x10: return object->callback_param1;
case 0x11: return 0; case 0x11: return 0;
case 0x18: return object->callback_param2; case 0x18: return object->callback_param2;
case 0x1A: return -1; case 0x1A: return (uint32)-1;
case 0x1B: return GB(_display_opt, 0, 6); case 0x1B: return GB(_display_opt, 0, 6);
case 0x1C: return object->last_value; case 0x1C: return object->last_value;
case 0x20: return _opt.landscape == LT_HILLY ? _opt.snow_line : 0xFF; case 0x20: return _opt.landscape == LT_HILLY ? _opt.snow_line : 0xFF;

View File

@ -17,6 +17,7 @@
#include "newgrf_station.h" #include "newgrf_station.h"
#include "newgrf_spritegroup.h" #include "newgrf_spritegroup.h"
#include "date.h" #include "date.h"
#include "helpers.hpp"
static StationClass station_classes[STAT_CLASS_MAX]; static StationClass station_classes[STAT_CLASS_MAX];
@ -31,8 +32,7 @@ enum {
*/ */
void ResetStationClasses(void) void ResetStationClasses(void)
{ {
StationClassID i; for (StationClassID i = STAT_CLASS_BEGIN; i < STAT_CLASS_MAX; i++) {
for (i = 0; i < STAT_CLASS_MAX; i++) {
station_classes[i].id = 0; station_classes[i].id = 0;
station_classes[i].name = STR_EMPTY; station_classes[i].name = STR_EMPTY;
station_classes[i].stations = 0; station_classes[i].stations = 0;
@ -45,13 +45,13 @@ void ResetStationClasses(void)
station_classes[0].id = 'DFLT'; station_classes[0].id = 'DFLT';
station_classes[0].name = STR_STAT_CLASS_DFLT; station_classes[0].name = STR_STAT_CLASS_DFLT;
station_classes[0].stations = 1; station_classes[0].stations = 1;
station_classes[0].spec = malloc(sizeof(*station_classes[0].spec)); MallocT(&station_classes[0].spec, 1);
station_classes[0].spec[0] = NULL; station_classes[0].spec[0] = NULL;
station_classes[1].id = 'WAYP'; station_classes[1].id = 'WAYP';
station_classes[1].name = STR_STAT_CLASS_WAYP; station_classes[1].name = STR_STAT_CLASS_WAYP;
station_classes[1].stations = 1; station_classes[1].stations = 1;
station_classes[1].spec = malloc(sizeof(*station_classes[1].spec)); MallocT(&station_classes[1].spec, 1);
station_classes[1].spec[0] = NULL; station_classes[1].spec[0] = NULL;
} }
@ -60,17 +60,15 @@ void ResetStationClasses(void)
* @param classid A 32 bit value identifying the class. * @param classid A 32 bit value identifying the class.
* @return Index into station_classes of allocated class. * @return Index into station_classes of allocated class.
*/ */
StationClassID AllocateStationClass(uint32 class) StationClassID AllocateStationClass(uint32 cls)
{ {
StationClassID i; for (StationClassID i = STAT_CLASS_BEGIN; i < STAT_CLASS_MAX; i++) {
if (station_classes[i].id == cls) {
for (i = 0; i < STAT_CLASS_MAX; i++) {
if (station_classes[i].id == class) {
// ClassID is already allocated, so reuse it. // ClassID is already allocated, so reuse it.
return i; return i;
} else if (station_classes[i].id == 0) { } else if (station_classes[i].id == 0) {
// This class is empty, so allocate it to the ClassID. // This class is empty, so allocate it to the ClassID.
station_classes[i].id = class; station_classes[i].id = cls;
return i; return i;
} }
} }
@ -150,7 +148,7 @@ void SetCustomStationSpec(StationSpec *statspec)
station_class = &station_classes[statspec->sclass]; station_class = &station_classes[statspec->sclass];
i = station_class->stations++; i = station_class->stations++;
station_class->spec = realloc(station_class->spec, station_class->stations * sizeof(*station_class->spec)); ReallocT(&station_class->spec, station_class->stations);
station_class->spec[i] = statspec; station_class->spec[i] = statspec;
statspec->allocated = true; statspec->allocated = true;
@ -176,10 +174,9 @@ const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station)
const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx) const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx)
{ {
StationClassID i;
uint j; uint j;
for (i = STAT_CLASS_DFLT; i < STAT_CLASS_MAX; i++) { for (StationClassID i = STAT_CLASS_BEGIN; i < STAT_CLASS_MAX; i++) {
for (j = 0; j < station_classes[i].stations; j++) { for (j = 0; j < station_classes[i].stations; j++) {
const StationSpec *statspec = station_classes[i].spec[j]; const StationSpec *statspec = station_classes[i].spec[j];
if (statspec == NULL) continue; if (statspec == NULL) continue;
@ -364,7 +361,7 @@ static uint32 StationGetVariable(const ResolverObject *object, byte variable, by
} }
*available = false; *available = false;
return -1; return UINT_MAX;
} }
switch (variable) { switch (variable) {
@ -430,7 +427,7 @@ static uint32 StationGetVariable(const ResolverObject *object, byte variable, by
DEBUG(grf, 1, "Unhandled station property 0x%X", variable); DEBUG(grf, 1, "Unhandled station property 0x%X", variable);
*available = false; *available = false;
return -1; return UINT_MAX;
} }
@ -610,7 +607,7 @@ int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec)
if (exec) { if (exec) {
if (i >= st->num_specs) { if (i >= st->num_specs) {
st->num_specs = i + 1; st->num_specs = i + 1;
st->speclist = realloc(st->speclist, st->num_specs * sizeof(*st->speclist)); ReallocT(&st->speclist, st->num_specs);
if (st->num_specs == 2) { if (st->num_specs == 2) {
/* Initial allocation */ /* Initial allocation */
@ -656,7 +653,7 @@ void DeallocateSpecFromStation(Station* st, byte specindex)
for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--); for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--);
if (st->num_specs > 1) { if (st->num_specs > 1) {
st->speclist = realloc(st->speclist, st->num_specs * sizeof(*st->speclist)); ReallocT(&st->speclist, st->num_specs);
} else { } else {
free(st->speclist); free(st->speclist);
st->num_specs = 0; st->num_specs = 0;
@ -696,7 +693,7 @@ bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID
if (statspec->renderdata == NULL) { if (statspec->renderdata == NULL) {
sprites = GetStationTileLayout(tile + axis); sprites = GetStationTileLayout(tile + axis);
} else { } else {
sprites = &statspec->renderdata[(tile < statspec->tiles) ? tile + axis : axis]; sprites = &statspec->renderdata[(tile < statspec->tiles) ? tile + axis : (uint)axis];
} }
image = sprites->ground_sprite; image = sprites->ground_sprite;

View File

@ -7,13 +7,22 @@
#include "engine.h" #include "engine.h"
#include "newgrf_cargo.h" #include "newgrf_cargo.h"
#include "helpers.hpp"
typedef enum { typedef enum {
STAT_CLASS_DFLT, ///< Default station class. STAT_CLASS_BEGIN = 0, ///< the lowest valid value
STAT_CLASS_WAYP, ///< Waypoint class. STAT_CLASS_DFLT = 0, ///< Default station class.
STAT_CLASS_MAX = 32, ///< Maximum number of classes. STAT_CLASS_WAYP, ///< Waypoint class.
STAT_CLASS_MAX = 32, ///< Maximum number of classes.
} StationClassID; } StationClassID;
/** Define basic enum properties */
template <> struct EnumPropsT<StationClassID> : MakeEnumPropsT<StationClassID, byte, STAT_CLASS_BEGIN, STAT_CLASS_MAX, STAT_CLASS_MAX> {};
typedef TinyEnumT<StationClassID> StationClassIDByte;
/** Allow incrementing of StationClassID variables */
DECLARE_POSTFIX_INCREMENT(StationClassID);
/* Station layout for given dimensions - it is a two-dimensional array /* Station layout for given dimensions - it is a two-dimensional array
* where index is computed as (x * platforms) + platform. */ * where index is computed as (x * platforms) + platform. */
typedef byte *StationLayout; typedef byte *StationLayout;

View File

@ -20,6 +20,7 @@
#include "newgrf.h" #include "newgrf.h"
#include "newgrf_text.h" #include "newgrf_text.h"
#include "table/control_codes.h" #include "table/control_codes.h"
#include "helpers.hpp"
#define GRFTAB 28 #define GRFTAB 28
#define TABSIZE 11 #define TABSIZE 11
@ -157,7 +158,8 @@ static byte _currentLangID = GRFLX_ENGLISH; //by default, english is used.
char *TranslateTTDPatchCodes(const char *str) char *TranslateTTDPatchCodes(const char *str)
{ {
char *tmp = malloc(strlen(str) * 10 + 1); /* Allocate space to allow for expansion */ char *tmp;
MallocT(&tmp, strlen(str) * 10 + 1); /* Allocate space to allow for expansion */
char *d = tmp; char *d = tmp;
bool unicode = false; bool unicode = false;
WChar c; WChar c;
@ -253,7 +255,8 @@ char *TranslateTTDPatchCodes(const char *str)
} }
*d = '\0'; *d = '\0';
return realloc(tmp, strlen(tmp) + 1); ReallocT(&tmp, strlen(tmp) + 1);
return tmp;
} }
@ -295,7 +298,7 @@ StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool ne
translatedtext = TranslateTTDPatchCodes(text_to_add); translatedtext = TranslateTTDPatchCodes(text_to_add);
newtext = malloc(sizeof(*newtext) + strlen(translatedtext) + 1); newtext = (GRFText*)malloc(sizeof(*newtext) + strlen(translatedtext) + 1);
newtext->next = NULL; newtext->next = NULL;
newtext->langid = langid_to_add; newtext->langid = langid_to_add;
strcpy(newtext->text, translatedtext); strcpy(newtext->text, translatedtext);

View File

@ -74,6 +74,7 @@ static DrawNewsCallbackProc * const _draw_news_callback[] = {
DrawNewsBankrupcy, /* DNC_BANKRUPCY */ DrawNewsBankrupcy, /* DNC_BANKRUPCY */
}; };
extern GetNewsStringCallbackProc * const _get_news_string_callback[];
GetNewsStringCallbackProc * const _get_news_string_callback[] = { GetNewsStringCallbackProc * const _get_news_string_callback[] = {
GetNewsStringNewTrainAvail, /* DNC_TRAINAVAIL */ GetNewsStringNewTrainAvail, /* DNC_TRAINAVAIL */
GetNewsStringNewRoadVehAvail, /* DNC_ROADAVAIL */ GetNewsStringNewRoadVehAvail, /* DNC_ROADAVAIL */
@ -218,7 +219,7 @@ static void NewsWindowProc(Window *w, WindowEvent *e)
if (w->viewport != NULL) if (w->viewport != NULL)
w->viewport->top += y - w->top; w->viewport->top += y - w->top;
diff = abs(w->top - y); diff = delta(w->top, y);
w->top = y; w->top = y;
SetDirtyBlocks(w->left, w->top - diff, w->left + w->width, w->top + w->height); SetDirtyBlocks(w->left, w->top - diff, w->left + w->width, w->top + w->height);
@ -367,14 +368,14 @@ static WindowDesc _news_type0_desc = {
static const SoundFx _news_sounds[] = { static const SoundFx _news_sounds[] = {
SND_1D_APPLAUSE, SND_1D_APPLAUSE,
SND_1D_APPLAUSE, SND_1D_APPLAUSE,
0, SND_BEGIN,
0, SND_BEGIN,
0, SND_BEGIN,
0, SND_BEGIN,
SND_1E_OOOOH, SND_1E_OOOOH,
0, SND_BEGIN,
0, SND_BEGIN,
0 SND_BEGIN
}; };
/** Get the value of an item of the news-display settings. This is /** Get the value of an item of the news-display settings. This is
@ -752,7 +753,7 @@ static void MessageOptionsWndProc(Window *w, WindowEvent *e)
for (i = 0, y = 26; i != 10; i++, y += 12, click_state >>= 1, val >>= 2) { for (i = 0, y = 26; i != 10; i++, y += 12, click_state >>= 1, val >>= 2) {
bool clicked = !!(click_state & 1); bool clicked = !!(click_state & 1);
DrawFrameRect(13, y, 89, 11 + y, 3, (clicked) ? FR_LOWERED : 0); DrawFrameRect(13, y, 89, 11 + y, 3, (clicked) ? FR_LOWERED : FR_NONE);
DrawStringCentered(((13 + 89 + 1) >> 1) + clicked, ((y + 11 + y + 1) >> 1) - 5 + clicked, message_opt[val & 0x3], 0x10); DrawStringCentered(((13 + 89 + 1) >> 1) + clicked, ((y + 11 + y + 1) >> 1) - 5 + clicked, message_opt[val & 0x3], 0x10);
DrawString(103, y + 1, i + STR_0206_ARRIVAL_OF_FIRST_VEHICLE, 0); DrawString(103, y + 1, i + STR_0206_ARRIVAL_OF_FIRST_VEHICLE, 0);
} }

View File

@ -37,8 +37,8 @@ static const uint _trackdir_length[TRACKDIR_END] = {
*/ */
static uint NPFDistanceTrack(TileIndex t0, TileIndex t1) static uint NPFDistanceTrack(TileIndex t0, TileIndex t1)
{ {
const uint dx = abs(TileX(t0) - TileX(t1)); const uint dx = delta(TileX(t0), TileX(t1));
const uint dy = abs(TileY(t0) - TileY(t1)); const uint dy = delta(TileY(t0), TileY(t1));
const uint straightTracks = 2 * min(dx, dy); /* The number of straight (not full length) tracks */ const uint straightTracks = 2 * min(dx, dy); /* The number of straight (not full length) tracks */
/* OPTIMISATION: /* OPTIMISATION:
@ -74,7 +74,7 @@ static uint NPFHash(uint key1, uint key2)
uint part1 = TileX(key1) & NPF_HASH_HALFMASK; uint part1 = TileX(key1) & NPF_HASH_HALFMASK;
uint part2 = TileY(key1) & NPF_HASH_HALFMASK; uint part2 = TileY(key1) & NPF_HASH_HALFMASK;
assert(IsValidTrackdir(key2)); assert(IsValidTrackdir((Trackdir)key2));
assert(IsValidTile(key1)); assert(IsValidTile(key1));
return ((part1 << NPF_HASH_HALFBITS | part2) + (NPF_HASH_SIZE * key2 / TRACKDIR_END)) % NPF_HASH_SIZE; return ((part1 << NPF_HASH_HALFBITS | part2) + (NPF_HASH_SIZE * key2 / TRACKDIR_END)) % NPF_HASH_SIZE;
} }
@ -137,7 +137,7 @@ static int32 NPFCalcStationOrTileHeuristic(AyStar* as, AyStarNode* current, Open
if (dist < ftd->best_bird_dist) { if (dist < ftd->best_bird_dist) {
ftd->best_bird_dist = dist; ftd->best_bird_dist = dist;
ftd->best_trackdir = current->user_data[NPF_TRACKDIR_CHOICE]; ftd->best_trackdir = (Trackdir)current->user_data[NPF_TRACKDIR_CHOICE];
} }
return dist; return dist;
} }
@ -188,7 +188,7 @@ static inline uint NPFBridgeCost(AyStarNode *current)
static uint NPFSlopeCost(AyStarNode* current) static uint NPFSlopeCost(AyStarNode* current)
{ {
TileIndex next = current->tile + TileOffsByDiagDir(TrackdirToExitdir(current->direction)); TileIndex next = current->tile + TileOffsByDiagDir(TrackdirToExitdir((Trackdir)current->direction));
int x,y; int x,y;
int8 z1,z2; int8 z1,z2;
@ -290,7 +290,7 @@ static int32 NPFRoadPathCost(AyStar* as, AyStarNode* current, OpenListNode* pare
/* Check for turns. Road vehicles only really drive diagonal, turns are /* Check for turns. Road vehicles only really drive diagonal, turns are
* represented by non-diagonal tracks */ * represented by non-diagonal tracks */
if (!IsDiagonalTrackdir(current->direction)) if (!IsDiagonalTrackdir((Trackdir)current->direction))
cost += _patches.npf_road_curve_penalty; cost += _patches.npf_road_curve_penalty;
NPFMarkTile(tile); NPFMarkTile(tile);
@ -403,7 +403,7 @@ static int32 NPFFindDepot(AyStar* as, OpenListNode *current)
{ {
/* It's not worth caching the result with NPF_FLAG_IS_TARGET here as below, /* It's not worth caching the result with NPF_FLAG_IS_TARGET here as below,
* since checking the cache not that much faster than the actual check */ * since checking the cache not that much faster than the actual check */
return IsTileDepotType(current->path.node.tile, as->user_data[NPF_TYPE]) ? return IsTileDepotType(current->path.node.tile, (TransportType)as->user_data[NPF_TYPE]) ?
AYSTAR_FOUND_END_NODE : AYSTAR_DONE; AYSTAR_FOUND_END_NODE : AYSTAR_DONE;
} }
@ -511,8 +511,9 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
DiagDirection src_exitdir = TrackdirToExitdir(src_trackdir); DiagDirection src_exitdir = TrackdirToExitdir(src_trackdir);
TileIndex dst_tile = INVALID_TILE; TileIndex dst_tile = INVALID_TILE;
int i; int i;
TrackdirBits trackdirbits, ts; uint32 ts;
TransportType type = aystar->user_data[NPF_TYPE]; TrackdirBits trackdirbits;
TransportType type = (TransportType)aystar->user_data[NPF_TYPE];
bool override_dst_check = false; bool override_dst_check = false;
/* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */ /* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */
aystar->num_neighbours = 0; aystar->num_neighbours = 0;
@ -587,13 +588,13 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
/* check correct rail type (mono, maglev, etc) */ /* check correct rail type (mono, maglev, etc) */
if (type == TRANSPORT_RAIL) { if (type == TRANSPORT_RAIL) {
RailType dst_type = GetTileRailType(dst_tile, src_trackdir); RailType dst_type = GetTileRailType(dst_tile, TrackdirToTrack(src_trackdir));
if (!HASBIT(aystar->user_data[NPF_RAILTYPES], dst_type)) if (!HASBIT(aystar->user_data[NPF_RAILTYPES], dst_type))
return; return;
} }
/* Check the owner of the tile */ /* Check the owner of the tile */
if (!VehicleMayEnterTile(aystar->user_data[NPF_OWNER], dst_tile, TrackdirToExitdir(src_trackdir))) { if (!VehicleMayEnterTile((Owner)aystar->user_data[NPF_OWNER], dst_tile, TrackdirToExitdir(src_trackdir))) {
return; return;
} }
@ -614,7 +615,7 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
} else { } else {
ts = GetTileTrackStatus(dst_tile, type); ts = GetTileTrackStatus(dst_tile, type);
} }
trackdirbits = ts & TRACKDIR_BIT_MASK; /* Filter out signal status and the unused bits */ trackdirbits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK); /* Filter out signal status and the unused bits */
DEBUG(npf, 4, "Next node: (%d, %d) [%d], possible trackdirs: 0x%X", TileX(dst_tile), TileY(dst_tile), dst_tile, trackdirbits); DEBUG(npf, 4, "Next node: (%d, %d) [%d], possible trackdirs: 0x%X", TileX(dst_tile), TileY(dst_tile), dst_tile, trackdirbits);
/* Select only trackdirs we can reach from our current trackdir */ /* Select only trackdirs we can reach from our current trackdir */
@ -627,9 +628,7 @@ static void NPFFollowTrack(AyStar* aystar, OpenListNode* current)
i = 0; i = 0;
/* Enumerate possible track */ /* Enumerate possible track */
while (trackdirbits != 0) { while (trackdirbits != 0) {
Trackdir dst_trackdir; Trackdir dst_trackdir = RemoveFirstTrackdir(trackdirbits);
dst_trackdir = FindFirstBit2x64(trackdirbits);
trackdirbits = KillFirstBit2x64(trackdirbits);
DEBUG(npf, 5, "Expanded into trackdir: %d, remaining trackdirs: 0x%X", dst_trackdir, trackdirbits); DEBUG(npf, 5, "Expanded into trackdir: %d, remaining trackdirs: 0x%X", dst_trackdir, trackdirbits);
/* Check for oneway signal against us */ /* Check for oneway signal against us */
@ -739,7 +738,7 @@ NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir track
NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes) NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes)
{ {
return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, 0, target, type, owner, railtypes); return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, target, type, owner, railtypes);
} }
NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, Owner owner, RailTypeMask railtypes, uint reverse_penalty) NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, Owner owner, RailTypeMask railtypes, uint reverse_penalty)
@ -763,7 +762,7 @@ NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir t
NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes) NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes)
{ {
return NPFRouteToDepotBreadthFirstTwoWay(tile, trackdir, INVALID_TILE, 0, type, owner, railtypes, 0); return NPFRouteToDepotBreadthFirstTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, type, owner, railtypes, 0);
} }
NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes) NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes)
@ -827,7 +826,7 @@ NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir,
best_result.best_bird_dist = (uint)-1; best_result.best_bird_dist = (uint)-1;
/* Just iterate the depots in order of increasing distance */ /* Just iterate the depots in order of increasing distance */
while ((current = depots.pop(&depots))) { while ((current = (Depot*)depots.pop(&depots))) {
/* Check to see if we already have a path shorter than this /* Check to see if we already have a path shorter than this
* depot's manhattan distance. HACK: We call DistanceManhattan * depot's manhattan distance. HACK: We call DistanceManhattan
* again, we should probably modify the queue to give us that * again, we should probably modify the queue to give us that

View File

@ -80,6 +80,8 @@ typedef enum OldChunkTypes {
OC_END = 0 ///< End of the whole chunk, all 32bits set to zero OC_END = 0 ///< End of the whole chunk, all 32bits set to zero
} OldChunkType; } OldChunkType;
DECLARE_ENUM_AS_BIT_SET(OldChunkType);
typedef bool OldChunkProc(LoadgameState *ls, int num); typedef bool OldChunkProc(LoadgameState *ls, int num);
typedef struct OldChunks { typedef struct OldChunks {
@ -97,9 +99,9 @@ assert_compile(sizeof(TileIndex) == 4);
static uint32 _bump_assert_value; static uint32 _bump_assert_value;
static bool _read_ttdpatch_flags; static bool _read_ttdpatch_flags;
static OldChunkType GetOldChunkType(OldChunkType type) {return GB(type, 0, 8);} static OldChunkType GetOldChunkType(OldChunkType type) {return (OldChunkType)GB(type, 0, 8);}
static OldChunkType GetOldChunkVarType(OldChunkType type) {return GB(type, 8, 8) << 8;} static OldChunkType GetOldChunkVarType(OldChunkType type) {return (OldChunkType)(GB(type, 8, 8) << 8);}
static OldChunkType GetOldChunkFileType(OldChunkType type) {return GB(type, 16, 8) << 16;} static OldChunkType GetOldChunkFileType(OldChunkType type) {return (OldChunkType)(GB(type, 16, 8) << 16);}
static inline byte CalcOldVarLen(OldChunkType type) static inline byte CalcOldVarLen(OldChunkType type)
{ {
@ -189,10 +191,10 @@ static inline uint32 ReadUint32(LoadgameState *ls)
static bool LoadChunk(LoadgameState *ls, void *base, const OldChunks *chunks) static bool LoadChunk(LoadgameState *ls, void *base, const OldChunks *chunks)
{ {
const OldChunks *chunk = chunks; const OldChunks *chunk = chunks;
byte *base_ptr = base; byte *base_ptr = (byte*)base;
while (chunk->type != OC_END) { while (chunk->type != OC_END) {
byte* ptr = chunk->ptr; byte* ptr = (byte*)chunk->ptr;
uint i; uint i;
for (i = 0; i < chunk->amount; i++) { for (i = 0; i < chunk->amount; i++) {
@ -959,9 +961,9 @@ static const OldChunks player_chunk[] = {
static bool LoadOldPlayer(LoadgameState *ls, int num) static bool LoadOldPlayer(LoadgameState *ls, int num)
{ {
Player *p = GetPlayer(num); Player *p = GetPlayer((PlayerID)num);
_current_player_id = num; _current_player_id = (PlayerID)num;
if (!LoadChunk(ls, p, player_chunk)) return false; if (!LoadChunk(ls, p, player_chunk)) return false;
@ -996,7 +998,7 @@ static bool LoadOldPlayer(LoadgameState *ls, int num)
* really figured out as of now, p->ai.cur_veh; needed for 'sell vehicle' * really figured out as of now, p->ai.cur_veh; needed for 'sell vehicle'
* is NULL and the function will crash. To fix this, just change the state * is NULL and the function will crash. To fix this, just change the state
* to some harmless state, like 'loop vehicle'; 1 */ * to some harmless state, like 'loop vehicle'; 1 */
if (!IsHumanPlayer(num) && p->ai.state == 20) p->ai.state = 1; if (!IsHumanPlayer((PlayerID)num) && p->ai.state == 20) p->ai.state = 1;
if (p->is_ai && (!_networking || _network_server) && _ai.enabled) if (p->is_ai && (!_networking || _network_server) && _ai.enabled)
AI_StartNewAI(p->index); AI_StartNewAI(p->index);

View File

@ -5,6 +5,7 @@
#include "debug.h" #include "debug.h"
#include "functions.h" #include "functions.h"
#include "oldpool.h" #include "oldpool.h"
#include "helpers.hpp"
/** /**
* Clean a pool in a safe way (does free all blocks) * Clean a pool in a safe way (does free all blocks)
@ -49,11 +50,11 @@ bool AddBlockToPool(OldMemoryPool *pool)
DEBUG(misc, 4, "[Pool] (%s) increasing size of pool to %d items (%d bytes)", pool->name, pool->total_items, pool->total_items * pool->item_size); DEBUG(misc, 4, "[Pool] (%s) increasing size of pool to %d items (%d bytes)", pool->name, pool->total_items, pool->total_items * pool->item_size);
/* Increase the poolsize */ /* Increase the poolsize */
pool->blocks = realloc(pool->blocks, sizeof(pool->blocks[0]) * (pool->current_blocks + 1)); ReallocT(&pool->blocks, pool->current_blocks + 1);
if (pool->blocks == NULL) error("Pool: (%s) could not allocate memory for blocks", pool->name); if (pool->blocks == NULL) error("Pool: (%s) could not allocate memory for blocks", pool->name);
/* Allocate memory to the new block item */ /* Allocate memory to the new block item */
pool->blocks[pool->current_blocks] = malloc(pool->item_size * (1 << pool->block_size_bits)); MallocT(&pool->blocks[pool->current_blocks], pool->item_size * (1 << pool->block_size_bits));
if (pool->blocks[pool->current_blocks] == NULL) if (pool->blocks[pool->current_blocks] == NULL)
error("Pool: (%s) could not allocate memory for blocks", pool->name); error("Pool: (%s) could not allocate memory for blocks", pool->name);

View File

@ -16,11 +16,11 @@ typedef void OldMemoryPoolCleanBlock(uint start_item, uint end_item);
* please try to avoid manual calls! * please try to avoid manual calls!
*/ */
struct OldMemoryPool { struct OldMemoryPool {
const char* const name; ///< Name of the pool (just for debugging) const char* name; ///< Name of the pool (just for debugging)
const uint max_blocks; ///< The max amount of blocks this pool can have uint max_blocks; ///< The max amount of blocks this pool can have
const uint block_size_bits; ///< The size of each block in bits uint block_size_bits; ///< The size of each block in bits
const uint item_size; ///< How many bytes one block is uint item_size; ///< How many bytes one block is
/// Pointer to a function that is called after a new block is added /// Pointer to a function that is called after a new block is added
OldMemoryPoolNewBlock *new_block_proc; OldMemoryPoolNewBlock *new_block_proc;

View File

@ -1,6 +1,7 @@
/* $Id$ */ /* $Id$ */
#include "stdafx.h" #include "stdafx.h"
#define VARDEF
#include "string.h" #include "string.h"
#include "table/strings.h" #include "table/strings.h"
#include "debug.h" #include "debug.h"
@ -10,8 +11,8 @@
#include "map.h" #include "map.h"
#include "tile.h" #include "tile.h"
#include "void_map.h" #include "void_map.h"
#include "helpers.hpp"
#define VARDEF
#include "openttd.h" #include "openttd.h"
#include "bridge_map.h" #include "bridge_map.h"
#include "functions.h" #include "functions.h"
@ -73,7 +74,7 @@ void InitializeStations(void);
void DeleteAllPlayerStations(void); void DeleteAllPlayerStations(void);
extern void SetDifficultyLevel(int mode, GameOptions *gm_opt); extern void SetDifficultyLevel(int mode, GameOptions *gm_opt);
extern void DoStartupNewPlayer(bool is_ai); extern Player* DoStartupNewPlayer(bool is_ai);
extern void ShowOSErrorBox(const char *buf); extern void ShowOSErrorBox(const char *buf);
/* TODO: usrerror() for errors which are not of an internal nature but /* TODO: usrerror() for errors which are not of an internal nature but
@ -119,7 +120,7 @@ void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize)
fseek(in, 0, SEEK_END); fseek(in, 0, SEEK_END);
len = ftell(in); len = ftell(in);
fseek(in, 0, SEEK_SET); fseek(in, 0, SEEK_SET);
if (len > maxsize || (mem = malloc(len + 1)) == NULL) { if (len > maxsize || !MallocT(&mem, len + 1)) {
fclose(in); fclose(in);
return NULL; return NULL;
} }
@ -135,9 +136,9 @@ void *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize)
return mem; return mem;
} }
extern const char _openttd_revision[];
static void showhelp(void) static void showhelp(void)
{ {
extern const char _openttd_revision[];
char buf[4096], *p; char buf[4096], *p;
p = buf; p = buf;
@ -175,25 +176,26 @@ static void showhelp(void)
} }
typedef struct { struct MyGetOptData {
char *opt; char *opt;
int numleft; int numleft;
char **argv; char **argv;
const char *options; const char *options;
char *cont; const char *cont;
} MyGetOptData;
static void MyGetOptInit(MyGetOptData *md, int argc, char **argv, const char *options) MyGetOptData(int argc, char **argv, const char *options)
{ {
md->cont = NULL; opt = NULL;
md->numleft = argc; numleft = argc;
md->argv = argv; this->argv = argv;
md->options = options; this->options = options;
} cont = NULL;
}
};
static int MyGetOpt(MyGetOptData *md) static int MyGetOpt(MyGetOptData *md)
{ {
char *s,*r,*t; const char *s,*r,*t;
s = md->cont; s = md->cont;
if (s != NULL) if (s != NULL)
@ -226,7 +228,7 @@ md_continue_here:;
md->argv++; md->argv++;
} }
} }
md->opt = t; md->opt = (char*)t;
md->cont = NULL; md->cont = NULL;
return *s; return *s;
} }
@ -244,7 +246,7 @@ md_continue_here:;
static void ParseResolution(int res[2], const char *s) static void ParseResolution(int res[2], const char *s)
{ {
char *t = strchr(s, 'x'); const char *t = strchr(s, 'x');
if (t == NULL) { if (t == NULL) {
ShowInfoF("Invalid resolution '%s'", s); ShowInfoF("Invalid resolution '%s'", s);
return; return;
@ -308,7 +310,7 @@ static void LoadIntroGame(void)
} }
_pause = 0; _pause = 0;
SetLocalPlayer(0); SetLocalPlayer(PLAYER_FIRST);
/* Make sure you can't scroll in the menu */ /* Make sure you can't scroll in the menu */
_scrolling_viewport = 0; _scrolling_viewport = 0;
_cursor.fix_at = false; _cursor.fix_at = false;
@ -324,7 +326,6 @@ extern void DedicatedFork(void);
int ttd_main(int argc, char *argv[]) int ttd_main(int argc, char *argv[])
{ {
MyGetOptData mgo;
int i; int i;
const char *optformat; const char *optformat;
char musicdriver[16], sounddriver[16], videodriver[16]; char musicdriver[16], sounddriver[16], videodriver[16];
@ -356,7 +357,8 @@ int ttd_main(int argc, char *argv[])
#endif #endif
; ;
MyGetOptInit(&mgo, argc-1, argv+1, optformat); MyGetOptData mgo(argc-1, argv+1, optformat);
while ((i = MyGetOpt(&mgo)) != -1) { while ((i = MyGetOpt(&mgo)) != -1) {
switch (i) { switch (i) {
case 'm': ttd_strlcpy(musicdriver, mgo.opt, sizeof(musicdriver)); break; case 'm': ttd_strlcpy(musicdriver, mgo.opt, sizeof(musicdriver)); break;
@ -512,7 +514,7 @@ int ttd_main(int argc, char *argv[])
ParseConnectionString(&player, &port, network_conn); ParseConnectionString(&player, &port, network_conn);
if (player != NULL) { if (player != NULL) {
_network_playas = atoi(player); _network_playas = (PlayerID)atoi(player);
if (_network_playas != PLAYER_SPECTATOR) { if (_network_playas != PLAYER_SPECTATOR) {
_network_playas--; _network_playas--;
@ -628,7 +630,7 @@ static void MakeNewGameDone(void)
/* Create a single player */ /* Create a single player */
DoStartupNewPlayer(false); DoStartupNewPlayer(false);
SetLocalPlayer(0); SetLocalPlayer(PLAYER_FIRST);
_current_player = _local_player; _current_player = _local_player;
DoCommandP(0, (_patches.autorenew << 15 ) | (_patches.autorenew_months << 16) | 4, _patches.autorenew_money, NULL, CMD_SET_AUTOREPLACE); DoCommandP(0, (_patches.autorenew << 15 ) | (_patches.autorenew_months << 16) | 4, _patches.autorenew_money, NULL, CMD_SET_AUTOREPLACE);
@ -708,7 +710,7 @@ static void StartScenario(void)
StartupEngines(); StartupEngines();
StartupDisasters(); StartupDisasters();
SetLocalPlayer(0); SetLocalPlayer(PLAYER_FIRST);
_current_player = _local_player; _current_player = _local_player;
DoCommandP(0, (_patches.autorenew << 15 ) | (_patches.autorenew_months << 16) | 4, _patches.autorenew_money, NULL, CMD_SET_AUTOREPLACE); DoCommandP(0, (_patches.autorenew << 15 ) | (_patches.autorenew_months << 16) | 4, _patches.autorenew_money, NULL, CMD_SET_AUTOREPLACE);
@ -799,7 +801,7 @@ void SwitchMode(int new_mode)
} else { } else {
/* Update the local player for a loaded game. It is either always /* Update the local player for a loaded game. It is either always
* player #1 (eg 0) or in the case of a dedicated server a spectator */ * player #1 (eg 0) or in the case of a dedicated server a spectator */
SetLocalPlayer(_network_dedicated ? PLAYER_SPECTATOR : 0); SetLocalPlayer(_network_dedicated ? PLAYER_SPECTATOR : PLAYER_FIRST);
DoCommandP(0, 0, 0, NULL, CMD_PAUSE); // decrease pause counter (was increased from opening load dialog) DoCommandP(0, 0, 0, NULL, CMD_PAUSE); // decrease pause counter (was increased from opening load dialog)
#ifdef ENABLE_NETWORK #ifdef ENABLE_NETWORK
if (_network_server) { if (_network_server) {
@ -1096,7 +1098,7 @@ static void UpdateExclusiveRights(void)
Town *t; Town *t;
FOR_ALL_TOWNS(t) { FOR_ALL_TOWNS(t) {
t->exclusivity = (byte)-1; t->exclusivity = INVALID_PLAYER;
} }
/* FIXME old exclusive rights status is not being imported (stored in s->blocked_months_obsolete) /* FIXME old exclusive rights status is not being imported (stored in s->blocked_months_obsolete)
@ -1312,8 +1314,8 @@ bool AfterLoadGame(void)
* becomes player 0, unless we are in the scenario editor where all the * becomes player 0, unless we are in the scenario editor where all the
* players are 'invalid'. * players are 'invalid'.
*/ */
if (!_network_dedicated && IsValidPlayer(0)) { if (!_network_dedicated && IsValidPlayer(PLAYER_FIRST)) {
p = GetPlayer(0); p = GetPlayer(PLAYER_FIRST);
p->engine_renew = _patches.autorenew; p->engine_renew = _patches.autorenew;
p->engine_renew_months = _patches.autorenew_months; p->engine_renew_months = _patches.autorenew_months;
p->engine_renew_money = _patches.autorenew_money; p->engine_renew_money = _patches.autorenew_money;
@ -1387,7 +1389,7 @@ bool AfterLoadGame(void)
continue; continue;
} }
if (v->type == VEH_Train) { if (v->type == VEH_Train) {
v->u.rail.track = 0x40; v->u.rail.track = TRACK_BIT_WORMHOLE;
} else { } else {
v->u.road.state = 0xFF; v->u.road.state = 0xFF;
} }
@ -1567,10 +1569,9 @@ bool AfterLoadGame(void)
{ {
/* Set up the engine count for all players */ /* Set up the engine count for all players */
Player *players[MAX_PLAYERS]; Player *players[MAX_PLAYERS];
int i;
const Vehicle *v; const Vehicle *v;
for (i = 0; i < MAX_PLAYERS; i++) players[i] = GetPlayer(i); for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) players[i] = GetPlayer(i);
FOR_ALL_VEHICLES(v) { FOR_ALL_VEHICLES(v) {
if (!IsEngineCountable(v)) continue; if (!IsEngineCountable(v)) continue;
@ -1702,3 +1703,25 @@ void ReloadNewGRFData(void)
/* redraw the whole screen */ /* redraw the whole screen */
MarkWholeScreenDirty(); MarkWholeScreenDirty();
} }
HalMusicDriver *_music_driver;
HalSoundDriver *_sound_driver;
HalVideoDriver *_video_driver;
byte _dirkeys; // 1 = left, 2 = up, 4 = right, 8 = down
bool _fullscreen;
CursorVars _cursor;
bool _ctrl_pressed; // Is Ctrl pressed?
bool _shift_pressed; // Is Shift pressed?
byte _fast_forward;
bool _left_button_down;
bool _left_button_clicked;
bool _right_button_down;
bool _right_button_clicked;
DrawPixelInfo _screen;
bool _exit_game;
bool _networking; ///< are we in networking mode?
byte _game_mode;
byte _pause;
int _pal_first_dirty;
int _pal_last_dirty;

View File

@ -8,9 +8,8 @@
#define VARDEF extern #define VARDEF extern
#endif #endif
typedef struct Rect { #include "hal.h"
int left,top,right,bottom; #include "helpers.hpp"
} Rect;
typedef struct Oblong { typedef struct Oblong {
int x, y; int x, y;
@ -22,10 +21,6 @@ typedef struct BoundingRect {
int height; int height;
} BoundingRect; } BoundingRect;
typedef struct Point {
int x,y;
} Point;
typedef struct Pair { typedef struct Pair {
int a; int a;
int b; int b;
@ -45,13 +40,11 @@ typedef struct Town Town;
typedef struct NewsItem NewsItem; typedef struct NewsItem NewsItem;
typedef struct Industry Industry; typedef struct Industry Industry;
typedef struct DrawPixelInfo DrawPixelInfo; typedef struct DrawPixelInfo DrawPixelInfo;
typedef byte PlayerID;
typedef byte VehicleOrderID; ///< The index of an order within its current vehicle (not pool related) typedef byte VehicleOrderID; ///< The index of an order within its current vehicle (not pool related)
typedef byte CargoID; typedef byte CargoID;
typedef byte LandscapeID; typedef byte LandscapeID;
typedef uint32 SpriteID; ///< The number of a sprite, without mapping bits and colortables typedef uint32 SpriteID; ///< The number of a sprite, without mapping bits and colortables
typedef uint32 PalSpriteID; ///< The number of a sprite plus all the mapping bits and colortables typedef uint32 PalSpriteID; ///< The number of a sprite plus all the mapping bits and colortables
typedef uint32 CursorID;
typedef uint16 EngineID; typedef uint16 EngineID;
typedef uint16 UnitID; typedef uint16 UnitID;
typedef uint16 StringID; typedef uint16 StringID;
@ -77,7 +70,7 @@ assert_compile(sizeof(DestinationID) == sizeof(DepotID));
assert_compile(sizeof(DestinationID) == sizeof(WaypointID)); assert_compile(sizeof(DestinationID) == sizeof(WaypointID));
assert_compile(sizeof(DestinationID) == sizeof(StationID)); assert_compile(sizeof(DestinationID) == sizeof(StationID));
typedef uint32 WindowNumber; typedef int32 WindowNumber;
typedef byte WindowClass; typedef byte WindowClass;
enum { enum {
@ -89,12 +82,6 @@ typedef int32 Year;
typedef int32 Date; typedef int32 Date;
enum GameModes {
GM_MENU,
GM_NORMAL,
GM_EDITOR
};
enum SwitchModes { enum SwitchModes {
SM_NONE = 0, SM_NONE = 0,
SM_NEWGAME = 1, SM_NEWGAME = 1,
@ -124,6 +111,32 @@ enum InitializeGameModes {
IG_DATE_RESET = 1, /* Reset the date when initializing a game */ IG_DATE_RESET = 1, /* Reset the date when initializing a game */
}; };
enum Owner {
PLAYER_INACTIVE_CLIENT = 253,
PLAYER_NEW_COMPANY = 254,
PLAYER_SPECTATOR = 255,
OWNER_BEGIN = 0x00,
PLAYER_FIRST = 0x00,
MAX_PLAYERS = 8,
OWNER_TOWN = 0x0F, // a town owns the tile
OWNER_NONE = 0x10, // nobody owns the tile
OWNER_WATER = 0x11, // "water" owns the tile
OWNER_END = 0x12,
INVALID_OWNER = 0xFF,
INVALID_PLAYER = 0xFF,
/* Player identifiers All players below MAX_PLAYERS are playable
* players, above, they are special, computer controlled players */
};
typedef Owner PlayerID;
DECLARE_POSTFIX_INCREMENT(Owner);
/** Define basic enum properties */
template <> struct EnumPropsT<Owner> : MakeEnumPropsT<Owner, byte, OWNER_BEGIN, OWNER_END, INVALID_OWNER> {};
typedef TinyEnumT<Owner> OwnerByte;
typedef OwnerByte PlayerByte;
typedef enum TransportTypes { typedef enum TransportTypes {
/* These constants are for now linked to the representation of bridges /* These constants are for now linked to the representation of bridges
@ -132,6 +145,7 @@ typedef enum TransportTypes {
* accessing tunnels and bridges. For now, you should just not change * accessing tunnels and bridges. For now, you should just not change
* the values for road and rail. * the values for road and rail.
*/ */
TRANSPORT_BEGIN = 0,
TRANSPORT_RAIL = 0, TRANSPORT_RAIL = 0,
TRANSPORT_ROAD = 1, TRANSPORT_ROAD = 1,
TRANSPORT_WATER, // = 2 TRANSPORT_WATER, // = 2
@ -139,6 +153,11 @@ typedef enum TransportTypes {
INVALID_TRANSPORT = 0xff, INVALID_TRANSPORT = 0xff,
} TransportType; } TransportType;
/** Define basic enum properties */
template <> struct EnumPropsT<TransportType> : MakeEnumPropsT<TransportType, byte, TRANSPORT_BEGIN, TRANSPORT_END, INVALID_TRANSPORT> {};
typedef TinyEnumT<TransportType> TransportTypeByte;
typedef struct TileInfo { typedef struct TileInfo {
uint x; uint x;
uint y; uint y;

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