(svn r8938) [cpp_gui] -Sync with trunk (r8772..r8900) cpp_gui
authorbjarni
Wed, 28 Feb 2007 00:33:40 +0000
branchcpp_gui
changeset 6268 4b5241e5dd10
parent 6267 7c8ec33959b1
child 6269 3b3bd4fe0736
(svn r8938) [cpp_gui] -Sync with trunk (r8772..r8900)
Makefile.in
Makefile.src.in
bin/data/openttd.grf
config.lib
configure
docs/landscape.html
docs/landscape_grid.html
projects/generate
projects/langs.vcproj
projects/langs_vs80.vcproj
projects/langs_vs80.vcproj.in
projects/openttd.sln
projects/openttd.vcproj
projects/openttd.vcproj.in
projects/openttd_vs80.sln
projects/openttd_vs80.vcproj
projects/openttd_vs80.vcproj.in
projects/strgen_vs80.vcproj
source.list
src/ai/default/default.cpp
src/aircraft.h
src/aircraft_cmd.cpp
src/aircraft_gui.cpp
src/airport.cpp
src/airport.h
src/airport_gui.cpp
src/airport_movement.h
src/autoreplace_gui.cpp
src/aystar.cpp
src/aystar.h
src/bmp.cpp
src/bmp.h
src/bridge.h
src/bridge_gui.cpp
src/bridge_map.cpp
src/bridge_map.h
src/build_vehicle_gui.cpp
src/callback_table.cpp
src/callback_table.h
src/cargotype.cpp
src/cargotype.h
src/clear_cmd.cpp
src/clear_map.h
src/cmd_helper.h
src/command.cpp
src/command.h
src/console.cpp
src/console.h
src/console_cmds.cpp
src/currency.cpp
src/currency.h
src/date.cpp
src/date.h
src/debug.cpp
src/dedicated.cpp
src/depot.cpp
src/depot.h
src/depot_gui.cpp
src/direction.h
src/disaster_cmd.cpp
src/dock_gui.cpp
src/driver.cpp
src/driver.h
src/dummy_land.cpp
src/economy.cpp
src/economy.h
src/elrail.cpp
src/endian_check.cpp
src/engine.cpp
src/engine.h
src/engine_gui.cpp
src/fios.cpp
src/fios.h
src/gfx.cpp
src/gfx.h
src/gfxinit.cpp
src/graph_gui.cpp
src/gui.h
src/helpers.hpp
src/industry.h
src/industry_cmd.cpp
src/industry_gui.cpp
src/landscape.cpp
src/lang/brazilian_portuguese.txt
src/lang/bulgarian.txt
src/lang/catalan.txt
src/lang/czech.txt
src/lang/danish.txt
src/lang/english.txt
src/lang/finnish.txt
src/lang/french.txt
src/lang/korean.txt
src/lang/portuguese.txt
src/lang/romanian.txt
src/lang/russian.txt
src/lang/slovenian.txt
src/lang/spanish.txt
src/lang/ukrainian.txt
src/lang/unfinished/afrikaans.txt
src/lang/unfinished/croatian.txt
src/lang/unfinished/frisian.txt
src/lang/unfinished/greek.txt
src/macros.h
src/misc.cpp
src/misc_gui.cpp
src/music/bemidi.h
src/music/dmusic.cpp
src/music/extmidi.h
src/music/libtimidity.cpp
src/music/libtimidity.h
src/music/null_m.cpp
src/music/os2_m.h
src/music/qtmidi.cpp
src/music/qtmidi.h
src/music/win32_m.cpp
src/music_gui.cpp
src/network/core/config.h
src/network/core/core.cpp
src/network/core/core.h
src/network/core/game.h
src/network/core/os_abstraction.h
src/network/core/packet.cpp
src/network/core/packet.h
src/network/core/tcp.cpp
src/network/core/tcp.h
src/network/core/udp.cpp
src/network/core/udp.h
src/network/network_gamelist.cpp
src/network/network_udp.cpp
src/newgrf.cpp
src/newgrf.h
src/newgrf_cargo.cpp
src/newgrf_cargo.h
src/newgrf_config.cpp
src/newgrf_config.h
src/newgrf_engine.cpp
src/newgrf_gui.cpp
src/newgrf_sound.cpp
src/newgrf_station.cpp
src/newgrf_station.h
src/npf.cpp
src/oldloader.cpp
src/openttd.cpp
src/order_cmd.cpp
src/order_gui.cpp
src/players.cpp
src/queue.cpp
src/queue.h
src/rail.cpp
src/rail.h
src/rail_cmd.cpp
src/rail_gui.cpp
src/rail_map.h
src/road.h
src/road_cmd.cpp
src/road_gui.cpp
src/roadveh_cmd.cpp
src/saveload.cpp
src/ship_cmd.cpp
src/sound/cocoa_s.h
src/sound/sdl_s.cpp
src/sound/win32_s.h
src/station.cpp
src/station.h
src/station_cmd.cpp
src/station_gui.cpp
src/station_map.h
src/stdafx.h
src/strings.cpp
src/table/animcursors.h
src/table/build_industry.h
src/table/cargo_const.h
src/table/files.h
src/table/industry_land.h
src/table/landscape_const.h
src/table/namegen.h
src/table/sprites.h
src/terraform_gui.cpp
src/town_cmd.cpp
src/train_cmd.cpp
src/tree_cmd.cpp
src/tunnelbridge_cmd.cpp
src/variables.h
src/vehicle.cpp
src/vehicle.h
src/vehicle_gui.cpp
src/video/cocoa_v.h
src/viewport.cpp
src/water_cmd.cpp
src/win32.cpp
src/win32.h
src/window.cpp
src/window.h
src/yapf/follow_track.hpp
src/yapf/nodelist.hpp
src/yapf/yapf.h
src/yapf/yapf.hpp
src/yapf/yapf_base.hpp
src/yapf/yapf_common.hpp
src/yapf/yapf_costcache.hpp
src/yapf/yapf_costrail.hpp
src/yapf/yapf_destrail.hpp
src/yapf/yapf_node.hpp
src/yapf/yapf_node_rail.hpp
src/yapf/yapf_node_road.hpp
src/yapf/yapf_rail.cpp
src/yapf/yapf_road.cpp
src/yapf/yapf_settings.h
src/yapf/yapf_ship.cpp
--- a/Makefile.in	Tue Feb 27 23:54:28 2007 +0000
+++ b/Makefile.in	Wed Feb 28 00:33:40 2007 +0000
@@ -30,6 +30,7 @@
 OS = !!OS!!
 OSXAPP = !!OSXAPP!!
 REVISION = !!REVISION!!
+AWK = !!AWK!!
 
 RES := $(shell if ! [ -f $(CONFIG_CACHE_SOURCE_LIST) ] || [ -n "`cmp $(CONFIG_CACHE_SOURCE_LIST) $(SOURCE_LIST)`" ]; then cp $(SOURCE_LIST) $(CONFIG_CACHE_SOURCE_LIST); fi )
 
@@ -118,7 +119,7 @@
 # Find if the local source if modified
 REV_MODIFIED := $(shell svnversion $(SRC_DIR) | sed -n 's/.*\(M\).*/\1/p' )
 # Find the revision like: rXXXX-branch
-REV := $(shell LC_ALL=C svn info $(SRC_DIR) | awk '/^URL:.*branches/ { split($$2, a, "/"); BRANCH="-"a[5] } /^Last Changed Rev:/ { REV="r"$$4"$(REV_MODIFIED)" } END { print REV BRANCH }')
+REV := $(shell LC_ALL=C svn info $(SRC_DIR) | $(AWK) '/^URL:.*branches/ { split($$2, a, "/"); BRANCH="-"a[5] } /^Last Changed Rev:/ { REV="r"$$4"$(REV_MODIFIED)" } END { print REV BRANCH }')
 endif
 endif
 # Make sure we have something in REV
--- a/Makefile.src.in	Tue Feb 27 23:54:28 2007 +0000
+++ b/Makefile.src.in	Wed Feb 28 00:33:40 2007 +0000
@@ -27,6 +27,7 @@
 CFLAGS_MAKEDEP= !!CFLAGS_MAKEDEP!!
 SORT         = !!SORT!!
 REVISION     = !!REVISION!!
+AWK          = !!AWK!!
 CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!!
 CONFIG_CACHE_LINKER   = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!!
 CONFIG_CACHE_ENDIAN   = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_ENDIAN!!
@@ -82,7 +83,7 @@
 # Find if the local source if modified
 REV_MODIFIED := $(shell svnversion $(SRC_DIR) | sed -n 's/.*\(M\).*/\1/p' )
 # Find the revision like: rXXXX-branch
-REV := $(shell LC_ALL=C svn info $(SRC_DIR) | awk '/^URL:.*branch/ { split($$2, a, "/"); BRANCH="-"a[5] } /^Last Changed Rev:/ { REV="r"$$4"$(REV_MODIFIED)" } END { print REV BRANCH }')
+REV := $(shell LC_ALL=C svn info $(SRC_DIR) | $(AWK) '/^URL:.*branch/ { split($$2, a, "/"); BRANCH="-"a[5] } /^Last Changed Rev:/ { REV="r"$$4"$(REV_MODIFIED)" } END { print REV BRANCH }')
 endif
 endif
 # Make sure we have something in REV
@@ -159,14 +160,14 @@
 
 # Convert x:/... paths to /x/... for mingw
 ifeq ($(OS), MINGW)
-	@cat Makefile.dep.tmp | sed 's@\([a-zA-Z]\):/@/\1/@g' > Makefile.dep.tmp.mingw
+	@cat Makefile.dep.tmp | sed 's@\([a-zA-Z]\):\/@\/\1\/@g' > Makefile.dep.tmp.mingw
 	@cp Makefile.dep.tmp.mingw Makefile.dep.tmp
 	@rm -f Makefile.dep.tmp.mingw
 endif
 
 # Remove all comments and includes that don't start with $(SRC_DIR)
 # Remove $(SRC_DIR) from object-file-name
-	@awk '                              \
+	@$(AWK) '                           \
 	/^# DO NOT/ { print $$0 ; next}     \
 	/^#/ {next}                         \
 	/:/ {                               \
@@ -225,6 +226,9 @@
 $(TTD): rev.o $(OBJS) $(CONFIG_CACHE_LINKER)
 	$(E) '$(STAGE) Linking $@'
 ifeq ($(OS), PSP)
+	# Because of a bug in the PSP GCC tools, linking via CXX results
+	#  in total chaos and more problems then you can handle. So we need
+	#  CC to link OpenTTD for PSP
 	$(Q)$(CC_HOST) $(LDFLAGS) rev.o $(OBJS) $(LIBS) -o $@
 else
 	$(Q)$(CXX_HOST) $(LDFLAGS) rev.o $(OBJS) $(LIBS) -o $@
Binary file bin/data/openttd.grf has changed
--- a/config.lib	Tue Feb 27 23:54:28 2007 +0000
+++ b/config.lib	Wed Feb 28 00:33:40 2007 +0000
@@ -17,6 +17,7 @@
 	windres=""
 	strip=""
 	lipo=""
+	awk="awk"
 	os="DETECT"
 	endian="AUTO"
 	revision=""
@@ -57,7 +58,7 @@
 	with_fontconfig="1"
 	with_psp_config="1"
 
-	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_libtimidity with_freetype with_fontconfig with_psp_config CC CXX CFLAGS LDFLAGS"
+	save_params_array="build host cc_build cc_host cxx_build cxx_host windres strip awk 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_libtimidity with_freetype with_fontconfig with_psp_config CC CXX CFLAGS LDFLAGS"
 }
 
 detect_params() {
@@ -99,6 +100,8 @@
 			--cxx-host=*)                 cxx_host="$optarg";;
 			--windres)                    prevp_p="windres";;
 			--windres=*)                  windres="$optarg";;
+			--awk)                        prevp_p="awk";;
+			--awk=*)                      awk="$optarg";;
 			--strip)                      prevp_p="strip";;
 			--strip=*)                    strip="$optarg";;
 			--lipo)                       prevp_p="lipo";;
@@ -285,30 +288,32 @@
 	# Some params want to be in full uppercase, else they might not work as
 	# expected.. fix that here
 
-	endian=`echo $endian | tr [:lower:] [:upper:]`
-	os=`echo $os | tr [:lower:] [:upper:]`
+	endian=`echo $endian | tr '[a-z]' '[A-Z]'`
+	os=`echo $os | tr '[a-z]' '[A-Z]'`
 
 	# Check if all params have valid values
 
 	# Endian only allows AUTO, LE and, BE
-	if ! echo $endian | grep -Eq "^(AUTO|LE|BE)$"; then
+	if [ -z "`echo $endian | egrep '^(AUTO|LE|BE)$'`" ]; then
 		echo "configure: error: invalid option --endian=$endian"
 		echo " Available options are: --endian=[AUTO|LE|BE]"
 		exit 1
 	fi
 	# OS only allows DETECT, UNIX, OSX, FREEBSD, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, WINCE, and PSP
-	if ! echo $os | grep -Eq "^(DETECT|UNIX|OSX|FREEBSD|MORPHOS|BEOS|SUNOS|CYGWIN|MINGW|OS2|WINCE|PSP)$"; then
+	if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|MORPHOS|BEOS|SUNOS|CYGWIN|MINGW|OS2|WINCE|PSP)$'`" ]; then
 		echo "configure: error: invalid option --os=$os"
 		echo " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|MORPHOS|BEOS|SUNOS|CYGWIN|MINGW|OS2|WINCE|PSP]"
 		exit 1
 	fi
 	# enable_debug should be between 0 and 4
-	if ! echo $enable_debug | grep -q "^[0123]$"; then
+	if [ -z "`echo $enable_debug | grep '^[0123]$'`" ]; then
 		echo "configure: error: invalid option --enable-debug=$enable_debug"
 		echo " Available options are: --enable-debug[=0123]"
 		exit 1
 	fi
 
+	detect_awk
+
 	check_build
 	check_host
 
@@ -336,7 +341,11 @@
 	check_cxx_build
 	check_cxx_host
 	check_windres
-	check_strip
+	if [ "$enable_strip" != "0" ]; then
+		check_strip
+	else
+		log 1 "checking strip... disabled"
+	fi
 	check_lipo
 	check_makedepend
 
@@ -548,7 +557,7 @@
 			log 1 "detecting G5... yes (forced)"
 		else
 			# First, are we a real OSX system, else we can't detect it
-			native=`LC_ALL=C uname | tr [:upper:] [:lower:] | grep darwin`
+			native=`LC_ALL=C uname | tr '[A-Z]' '[a-z]' | grep darwin`
 			# If $host doesn't match $build , we are cross-compiling
 			if [ -n "$native" ] && [ "$build" != "$host" ]; then
 				$cc_build $SRC_DIR/os/macosx/G5_detector.cpp -o G5_detector
@@ -602,6 +611,7 @@
 			if [ "$os" = "MORPHOS" ]; then
 				CFLAGS="$CFLAGS -I/gg/os-include -noixemul -fstrict-aliasing -fexpensive-optimizations"
 				CFLAGS="$CFLAGS -mcpu=604 -fno-inline -mstring -mmultiple"
+				LDFLAGS="$LDFLAGS -noixemul"
 			fi
 
 			CFLAGS="$CFLAGS -O2 -fomit-frame-pointer"
@@ -1138,12 +1148,51 @@
 	log 1 "checking makedepend... $makedepend"
 }
 
+detect_awk() {
+	# Not all awks allow gsub(), so we test for that here! It is in fact all we need...
+
+	# These awks are known to work. Test for them explicit
+	awks="gawk mawk nawk"
+
+	awk_prefix="echo \"a.c b.c c.c\" | tr ' ' \\\\n | "
+	awk_param="' { ORS = \" \" } /\.c$/   { gsub(\".c$\",   \".o\", \$0); print \$0; }' 2>/dev/null"
+	awk_result="a.o b.o c.o "
+	log 2 "Detecing awk..."
+
+	log 2 "Trying: $awk_prefix $awk $awk_param"
+	res=`eval $awk_prefix $awk $awk_param`
+	log 2 "Result: '$res'"
+	if [ "$res" != "$awk_result" ] && [ "$awk" = "awk" ]; then
+		# User didn't supply his own awk, so try to detect some other known working names for an awk
+		for awk in $awks; do
+			log 2 "Trying: $awk_prefix $awk $awk_param"
+			res=`eval $awk_prefix $awk $awk_param`
+			log 2 "Result: '$res'"
+			if [ "$res" = "$awk_result" ]; then break; fi
+		done
+
+		if [ "$res" != "$awk_result" ]; then
+			log 1 "checking awk... not found"
+			log 1 "configure: error: no awk found"
+			log 1 "configure: error: please install one of the following: $awks"
+			exit 1
+		fi
+	fi
+	if [ "$res" != "$awk_result" ]; then
+		log 1 "checking awk... not found"
+		log 1 "configure: error: you supplied '$awk' but it doesn't seem a valid gawk or mawk"
+		exit 1
+	fi
+
+	log 1 "checking awk... $awk"
+}
+
 detect_os() {
-	if [ $os = "DETECT" ]; then
+	if [ "$os" = "DETECT" ]; then
 		# Detect UNIX, OSX, FREEBSD, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, WINCE, and PSP
 
 		# Try first via dumpmachine, then via uname
-		os=`echo "$host" | tr [:upper:] [:lower:] | awk '
+		os=`echo "$host" | tr '[A-Z]' '[a-z]' | $awk '
 					/linux/        { print "UNIX";    exit}
 					/darwin/       { print "OSX";     exit}
 					/freebsd/      { print "FREEBSD"; exit}
@@ -1158,7 +1207,7 @@
 		'`
 
 		if [ -z "$os" ]; then
-			os=`LC_ALL=C uname | tr [:upper:] [:lower:] | awk '
+			os=`LC_ALL=C uname | tr '[A-Z]' '[a-z]' | $awk '
 					/linux/        { print "UNIX";    exit}
 					/darwin/       { print "OSX";     exit}
 					/freebsd/      { print "FREEBSD"; exit}
@@ -1753,6 +1802,7 @@
 		s#!!OS!!#$os#g;
 		s#!!CONFIGURE_FILES!!#$CONFIGURE_FILES#g;
 		s#!!REVISION!!#$revision#g;
+		s#!!AWK!!#$awk#g;
 		s#!!ENABLE_INSTALL!!#$enable_install#g;
 	"
 }
@@ -1849,6 +1899,7 @@
 	echo "                                 on HOST [BUILD]"
 	echo "  --windres=WINDRES              the windres to use [HOST-windres]"
 	echo "  --strip=STRIP                  the strip to use [HOST-strip]"
+	echo "  --awk=AWK                      the awk to use in configure [awk]"
 	echo "  --lipo=LIPO                    the lipo to use (OSX ONLY) [HOST-lipo]"
 	echo "  --os=OS                        the OS we are compiling for [DETECT]"
 	echo "                                 DETECT/UNIX/OSX/FREEBSD/MORPHOS/BEOS/"
--- a/configure	Tue Feb 27 23:54:28 2007 +0000
+++ b/configure	Wed Feb 28 00:33:40 2007 +0000
@@ -58,7 +58,7 @@
 fi
 
 # Read the source.list and process it
-SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | awk '
+SRCS="`< $ROOT_DIR/source.list tr '\r' '\n' | $awk '
 	{  }
 	/^(	*)#end/  { if (deep == skip) { skip -= 1; } deep -= 1; next; }
 	/^(	*)#else/ { if (deep == skip) { skip -= 1; } else if (deep - 1 == skip) { skip += 1; } next; }
@@ -100,11 +100,11 @@
 	}
 ' | $PIPE_SORT`"
 
-OBJS_C="`  echo \"$SRCS\" | awk ' { ORS = " " } /\.c$/   { gsub(".c$",   ".o", $0); print $0; }'`"
-OBJS_CPP="`echo \"$SRCS\" | awk ' { ORS = " " } /\.cpp$/ { gsub(".cpp$", ".o", $0); print $0; }'`"
-OBJS_MM="` echo \"$SRCS\" | awk ' { ORS = " " } /\.mm$/  { gsub(".mm$",  ".o", $0); print $0; }'`"
-OBJS_RC="` echo \"$SRCS\" | awk ' { ORS = " " } /\.rc$/  { gsub(".rc$",  ".o", $0); print $0; }'`"
-SRCS="`    echo \"$SRCS\" | awk ' { ORS = " " } { print $0; }'`"
+OBJS_C="`  echo \"$SRCS\" | $awk ' { ORS = " " } /\.c$/   { gsub(".c$",   ".o", $0); print $0; }'`"
+OBJS_CPP="`echo \"$SRCS\" | $awk ' { ORS = " " } /\.cpp$/ { gsub(".cpp$", ".o", $0); print $0; }'`"
+OBJS_MM="` echo \"$SRCS\" | $awk ' { ORS = " " } /\.mm$/  { gsub(".mm$",  ".o", $0); print $0; }'`"
+OBJS_RC="` echo \"$SRCS\" | $awk ' { ORS = " " } /\.rc$/  { gsub(".rc$",  ".o", $0); print $0; }'`"
+SRCS="`    echo \"$SRCS\" | $awk ' { ORS = " " } { print $0; }'`"
 
 # In makefiles, we always use -u for sort
 if [ -z "$sort" ]; then
--- a/docs/landscape.html	Tue Feb 27 23:54:28 2007 +0000
+++ b/docs/landscape.html	Wed Feb 28 00:33:40 2007 +0000
@@ -488,6 +488,7 @@
     <li>m3 bits 0..3: <a href="#TrackType">track type</a> for railway stations, must be 0 for all the other stations</li>
     <li>m3 bits 4..7: persistent random data for newstations</li>
     <li>m4: custom station id; 0 means standard graphics</li>
+    <li>m6 bit 3: 1 when a drive through road stop is built over a town owned road, otherwise 0</li>
    </ul>
    </td>
   </tr>
--- a/docs/landscape_grid.html	Tue Feb 27 23:54:28 2007 +0000
+++ b/docs/landscape_grid.html	Wed Feb 28 00:33:40 2007 +0000
@@ -171,7 +171,7 @@
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
-      <td class="bits"><span class="free">OOOO OO</span>XX</td>
+      <td class="bits"><span class="free">OOOO O</span>XXX</td>
     </tr>
     <tr>
       <td>6</td>
--- a/projects/generate	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/generate	Wed Feb 28 00:33:40 2007 +0000
@@ -111,8 +111,7 @@
 		i=`basename $i | sed s/.txt$//g`
 		RES="$RES
 		<File
-			RelativePath=\"..\\src\\lang\\"$i".txt\"
-			>
+			RelativePath=\"..\\src\\lang\\"$i".txt\">
 			<FileConfiguration
 				Name=\"Debug|Win32\">
 				<Tool
@@ -120,8 +119,7 @@
 					Description=\"Generating "$i" language file\"
 					CommandLine=\"..\\objs\\strgen\\strgen.exe -s ..\\src\\lang -d ..\\bin\\lang &quot;\$(InputPath)&quot;&#x0D;&#x0A;\"
 					AdditionalDependencies=\"\"
-					Outputs=\"..\\bin\\lang\\"$i".lng\"
-				/>
+					Outputs=\"..\\bin\\lang\\"$i".lng\"/>
 			</FileConfiguration>
 		</File>"
 	done
@@ -141,7 +139,15 @@
 	' > \"$ROOT_DIR/projects/$2\"`"
 
 	# The files-list
-	echo "$1" >> "$ROOT_DIR/projects/$2"
+	if [ "$3" = "msvc2003" ]; then
+		echo "$1" | sed 's@\&#x0D;\&#x0A;@\n@' >> "$ROOT_DIR/projects/$2"
+	else
+		echo "$1" | sed '
+			s@Filter="">@>@;
+			s@^\([	]*\)\([^	<].*[^/]\)>$@\1\2\n\1>@g;
+			s@^	\([	]*\)\([^	<].*\)/>$@	\1\2\n\1/>@g;
+		' >> "$ROOT_DIR/projects/$2"
+	fi
 
 	# Everything below the !!FILES!! marker
 	RES="`cat \"$ROOT_DIR/projects/$2\".in | tr '\r' '\n' | awk '
@@ -158,7 +164,7 @@
 load_main_data "$ROOT_DIR/source.list" openttd
 load_lang_data "$ROOT_DIR/src/lang/*.txt" lang
 
-generate "$openttd" "openttd.vcproj"
-generate "$openttd" "openttd_vs80.vcproj"
-generate "$lang" "langs_vs80.vcproj"
-generate "$lang" "langs.vcproj"
+generate "$openttd" "openttd.vcproj"      "msvc2003"
+generate "$openttd" "openttd_vs80.vcproj" "msvc2005"
+generate "$lang" "langs.vcproj"           "msvc2003"
+generate "$lang" "langs_vs80.vcproj"      "msvc2005"
--- a/projects/langs.vcproj	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/langs.vcproj	Wed Feb 28 00:33:40 2007 +0000
@@ -39,493 +39,423 @@
 	<Files>
 
 		<File
-			RelativePath="..\src\lang\american.txt"
-			>
+			RelativePath="..\src\lang\american.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating american language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\american.lng"
-				/>
+					Outputs="..\bin\lang\american.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\brazilian_portuguese.txt"
-			>
+			RelativePath="..\src\lang\brazilian_portuguese.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating brazilian_portuguese language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\brazilian_portuguese.lng"
-				/>
+					Outputs="..\bin\lang\brazilian_portuguese.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\bulgarian.txt"
-			>
+			RelativePath="..\src\lang\bulgarian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating bulgarian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\bulgarian.lng"
-				/>
+					Outputs="..\bin\lang\bulgarian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\catalan.txt"
-			>
+			RelativePath="..\src\lang\catalan.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating catalan language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\catalan.lng"
-				/>
+					Outputs="..\bin\lang\catalan.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\czech.txt"
-			>
+			RelativePath="..\src\lang\czech.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating czech language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\czech.lng"
-				/>
+					Outputs="..\bin\lang\czech.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\danish.txt"
-			>
+			RelativePath="..\src\lang\danish.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating danish language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\danish.lng"
-				/>
+					Outputs="..\bin\lang\danish.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\dutch.txt"
-			>
+			RelativePath="..\src\lang\dutch.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating dutch language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\dutch.lng"
-				/>
+					Outputs="..\bin\lang\dutch.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\english.txt"
-			>
+			RelativePath="..\src\lang\english.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating english language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\english.lng"
-				/>
+					Outputs="..\bin\lang\english.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\esperanto.txt"
-			>
+			RelativePath="..\src\lang\esperanto.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating esperanto language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\esperanto.lng"
-				/>
+					Outputs="..\bin\lang\esperanto.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\estonian.txt"
-			>
+			RelativePath="..\src\lang\estonian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating estonian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\estonian.lng"
-				/>
+					Outputs="..\bin\lang\estonian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\finnish.txt"
-			>
+			RelativePath="..\src\lang\finnish.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating finnish language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\finnish.lng"
-				/>
+					Outputs="..\bin\lang\finnish.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\french.txt"
-			>
+			RelativePath="..\src\lang\french.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating french language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\french.lng"
-				/>
+					Outputs="..\bin\lang\french.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\galician.txt"
-			>
+			RelativePath="..\src\lang\galician.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating galician language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\galician.lng"
-				/>
+					Outputs="..\bin\lang\galician.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\german.txt"
-			>
+			RelativePath="..\src\lang\german.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating german language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\german.lng"
-				/>
+					Outputs="..\bin\lang\german.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\hungarian.txt"
-			>
+			RelativePath="..\src\lang\hungarian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating hungarian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\hungarian.lng"
-				/>
+					Outputs="..\bin\lang\hungarian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\icelandic.txt"
-			>
+			RelativePath="..\src\lang\icelandic.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating icelandic language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\icelandic.lng"
-				/>
+					Outputs="..\bin\lang\icelandic.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\italian.txt"
-			>
+			RelativePath="..\src\lang\italian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating italian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\italian.lng"
-				/>
+					Outputs="..\bin\lang\italian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\japanese.txt"
-			>
+			RelativePath="..\src\lang\japanese.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating japanese language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\japanese.lng"
-				/>
+					Outputs="..\bin\lang\japanese.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\korean.txt"
-			>
+			RelativePath="..\src\lang\korean.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating korean language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\korean.lng"
-				/>
+					Outputs="..\bin\lang\korean.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\lithuanian.txt"
-			>
+			RelativePath="..\src\lang\lithuanian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating lithuanian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\lithuanian.lng"
-				/>
+					Outputs="..\bin\lang\lithuanian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\norwegian_bokmal.txt"
-			>
+			RelativePath="..\src\lang\norwegian_bokmal.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating norwegian_bokmal language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\norwegian_bokmal.lng"
-				/>
+					Outputs="..\bin\lang\norwegian_bokmal.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\norwegian_nynorsk.txt"
-			>
+			RelativePath="..\src\lang\norwegian_nynorsk.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating norwegian_nynorsk language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\norwegian_nynorsk.lng"
-				/>
+					Outputs="..\bin\lang\norwegian_nynorsk.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\origveh.txt"
-			>
+			RelativePath="..\src\lang\origveh.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating origveh language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\origveh.lng"
-				/>
+					Outputs="..\bin\lang\origveh.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\polish.txt"
-			>
+			RelativePath="..\src\lang\polish.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating polish language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\polish.lng"
-				/>
+					Outputs="..\bin\lang\polish.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\portuguese.txt"
-			>
+			RelativePath="..\src\lang\portuguese.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating portuguese language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\portuguese.lng"
-				/>
+					Outputs="..\bin\lang\portuguese.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\romanian.txt"
-			>
+			RelativePath="..\src\lang\romanian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating romanian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\romanian.lng"
-				/>
+					Outputs="..\bin\lang\romanian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\russian.txt"
-			>
+			RelativePath="..\src\lang\russian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating russian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\russian.lng"
-				/>
+					Outputs="..\bin\lang\russian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\simplified_chinese.txt"
-			>
+			RelativePath="..\src\lang\simplified_chinese.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating simplified_chinese language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\simplified_chinese.lng"
-				/>
+					Outputs="..\bin\lang\simplified_chinese.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\slovak.txt"
-			>
+			RelativePath="..\src\lang\slovak.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating slovak language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\slovak.lng"
-				/>
+					Outputs="..\bin\lang\slovak.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\slovenian.txt"
-			>
+			RelativePath="..\src\lang\slovenian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating slovenian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\slovenian.lng"
-				/>
+					Outputs="..\bin\lang\slovenian.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\spanish.txt"
-			>
+			RelativePath="..\src\lang\spanish.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating spanish language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\spanish.lng"
-				/>
+					Outputs="..\bin\lang\spanish.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\swedish.txt"
-			>
+			RelativePath="..\src\lang\swedish.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating swedish language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\swedish.lng"
-				/>
+					Outputs="..\bin\lang\swedish.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\traditional_chinese.txt"
-			>
+			RelativePath="..\src\lang\traditional_chinese.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating traditional_chinese language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\traditional_chinese.lng"
-				/>
+					Outputs="..\bin\lang\traditional_chinese.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\turkish.txt"
-			>
+			RelativePath="..\src\lang\turkish.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating turkish language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\turkish.lng"
-				/>
+					Outputs="..\bin\lang\turkish.lng"/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\ukrainian.txt"
-			>
+			RelativePath="..\src\lang\ukrainian.txt">
 			<FileConfiguration
 				Name="Debug|Win32">
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating ukrainian language file"
-					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
+					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;n"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\ukrainian.lng"
-				/>
+					Outputs="..\bin\lang\ukrainian.lng"/>
 			</FileConfiguration>
 		</File>
 	</Files>
--- a/projects/langs_vs80.vcproj	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/langs_vs80.vcproj	Wed Feb 28 00:33:40 2007 +0000
@@ -25,6 +25,11 @@
 			ATLMinimizesCRunTimeLibraryUsage="false"
 			>
 			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Generating strings.h"
+				CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table"
+			/>
+			<Tool
 				Name="VCCustomBuildTool"
 			/>
 			<Tool
@@ -35,11 +40,6 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 			/>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Generating strings.h"
-				CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table"
-			/>
 		</Configuration>
 	</Configurations>
 	<References>
@@ -47,493 +47,423 @@
 	<Files>
 
 		<File
-			RelativePath="..\src\lang\american.txt"
-			>
+			RelativePath="..\src\lang\american.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating american language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\american.lng"
-				/>
+					Outputs="..\bin\lang\american.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\brazilian_portuguese.txt"
-			>
+			RelativePath="..\src\lang\brazilian_portuguese.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating brazilian_portuguese language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\brazilian_portuguese.lng"
-				/>
+					Outputs="..\bin\lang\brazilian_portuguese.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\bulgarian.txt"
-			>
+			RelativePath="..\src\lang\bulgarian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating bulgarian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\bulgarian.lng"
-				/>
+					Outputs="..\bin\lang\bulgarian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\catalan.txt"
-			>
+			RelativePath="..\src\lang\catalan.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating catalan language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\catalan.lng"
-				/>
+					Outputs="..\bin\lang\catalan.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\czech.txt"
-			>
+			RelativePath="..\src\lang\czech.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating czech language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\czech.lng"
-				/>
+					Outputs="..\bin\lang\czech.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\danish.txt"
-			>
+			RelativePath="..\src\lang\danish.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating danish language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\danish.lng"
-				/>
+					Outputs="..\bin\lang\danish.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\dutch.txt"
-			>
+			RelativePath="..\src\lang\dutch.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating dutch language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\dutch.lng"
-				/>
+					Outputs="..\bin\lang\dutch.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\english.txt"
-			>
+			RelativePath="..\src\lang\english.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating english language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\english.lng"
-				/>
+					Outputs="..\bin\lang\english.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\esperanto.txt"
-			>
+			RelativePath="..\src\lang\esperanto.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating esperanto language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\esperanto.lng"
-				/>
+					Outputs="..\bin\lang\esperanto.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\estonian.txt"
-			>
+			RelativePath="..\src\lang\estonian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating estonian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\estonian.lng"
-				/>
+					Outputs="..\bin\lang\estonian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\finnish.txt"
-			>
+			RelativePath="..\src\lang\finnish.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating finnish language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\finnish.lng"
-				/>
+					Outputs="..\bin\lang\finnish.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\french.txt"
-			>
+			RelativePath="..\src\lang\french.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating french language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\french.lng"
-				/>
+					Outputs="..\bin\lang\french.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\galician.txt"
-			>
+			RelativePath="..\src\lang\galician.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating galician language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\galician.lng"
-				/>
+					Outputs="..\bin\lang\galician.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\german.txt"
-			>
+			RelativePath="..\src\lang\german.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating german language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\german.lng"
-				/>
+					Outputs="..\bin\lang\german.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\hungarian.txt"
-			>
+			RelativePath="..\src\lang\hungarian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating hungarian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\hungarian.lng"
-				/>
+					Outputs="..\bin\lang\hungarian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\icelandic.txt"
-			>
+			RelativePath="..\src\lang\icelandic.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating icelandic language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\icelandic.lng"
-				/>
+					Outputs="..\bin\lang\icelandic.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\italian.txt"
-			>
+			RelativePath="..\src\lang\italian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating italian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\italian.lng"
-				/>
+					Outputs="..\bin\lang\italian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\japanese.txt"
-			>
+			RelativePath="..\src\lang\japanese.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating japanese language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\japanese.lng"
-				/>
+					Outputs="..\bin\lang\japanese.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\korean.txt"
-			>
+			RelativePath="..\src\lang\korean.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating korean language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\korean.lng"
-				/>
+					Outputs="..\bin\lang\korean.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\lithuanian.txt"
-			>
+			RelativePath="..\src\lang\lithuanian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating lithuanian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\lithuanian.lng"
-				/>
+					Outputs="..\bin\lang\lithuanian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\norwegian_bokmal.txt"
-			>
+			RelativePath="..\src\lang\norwegian_bokmal.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating norwegian_bokmal language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\norwegian_bokmal.lng"
-				/>
+					Outputs="..\bin\lang\norwegian_bokmal.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\norwegian_nynorsk.txt"
-			>
+			RelativePath="..\src\lang\norwegian_nynorsk.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating norwegian_nynorsk language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\norwegian_nynorsk.lng"
-				/>
+					Outputs="..\bin\lang\norwegian_nynorsk.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\origveh.txt"
-			>
+			RelativePath="..\src\lang\origveh.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating origveh language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\origveh.lng"
-				/>
+					Outputs="..\bin\lang\origveh.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\polish.txt"
-			>
+			RelativePath="..\src\lang\polish.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating polish language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\polish.lng"
-				/>
+					Outputs="..\bin\lang\polish.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\portuguese.txt"
-			>
+			RelativePath="..\src\lang\portuguese.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating portuguese language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\portuguese.lng"
-				/>
+					Outputs="..\bin\lang\portuguese.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\romanian.txt"
-			>
+			RelativePath="..\src\lang\romanian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating romanian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\romanian.lng"
-				/>
+					Outputs="..\bin\lang\romanian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\russian.txt"
-			>
+			RelativePath="..\src\lang\russian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating russian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\russian.lng"
-				/>
+					Outputs="..\bin\lang\russian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\simplified_chinese.txt"
-			>
+			RelativePath="..\src\lang\simplified_chinese.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating simplified_chinese language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\simplified_chinese.lng"
-				/>
+					Outputs="..\bin\lang\simplified_chinese.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\slovak.txt"
-			>
+			RelativePath="..\src\lang\slovak.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating slovak language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\slovak.lng"
-				/>
+					Outputs="..\bin\lang\slovak.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\slovenian.txt"
-			>
+			RelativePath="..\src\lang\slovenian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating slovenian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\slovenian.lng"
-				/>
+					Outputs="..\bin\lang\slovenian.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\spanish.txt"
-			>
+			RelativePath="..\src\lang\spanish.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating spanish language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\spanish.lng"
-				/>
+					Outputs="..\bin\lang\spanish.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\swedish.txt"
-			>
+			RelativePath="..\src\lang\swedish.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating swedish language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\swedish.lng"
-				/>
+					Outputs="..\bin\lang\swedish.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\traditional_chinese.txt"
-			>
+			RelativePath="..\src\lang\traditional_chinese.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating traditional_chinese language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\traditional_chinese.lng"
-				/>
+					Outputs="..\bin\lang\traditional_chinese.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\turkish.txt"
-			>
+			RelativePath="..\src\lang\turkish.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating turkish language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\turkish.lng"
-				/>
+					Outputs="..\bin\lang\turkish.lng"n				/>
 			</FileConfiguration>
 		</File>
 		<File
-			RelativePath="..\src\lang\ukrainian.txt"
-			>
+			RelativePath="..\src\lang\ukrainian.txt"n			>
 			<FileConfiguration
-				Name="Debug|Win32">
+				Name="Debug|Win32"n				>
 				<Tool
 					Name="VCCustomBuildTool"
 					Description="Generating ukrainian language file"
 					CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
 					AdditionalDependencies=""
-					Outputs="..\bin\lang\ukrainian.lng"
-				/>
+					Outputs="..\bin\lang\ukrainian.lng"n				/>
 			</FileConfiguration>
 		</File>
 	</Files>
--- a/projects/langs_vs80.vcproj.in	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/langs_vs80.vcproj.in	Wed Feb 28 00:33:40 2007 +0000
@@ -25,6 +25,11 @@
 			ATLMinimizesCRunTimeLibraryUsage="false"
 			>
 			<Tool
+				Name="VCPreBuildEventTool"
+				Description="Generating strings.h"
+				CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table"
+			/>
+			<Tool
 				Name="VCCustomBuildTool"
 			/>
 			<Tool
@@ -35,11 +40,6 @@
 			<Tool
 				Name="VCPostBuildEventTool"
 			/>
-			<Tool
-				Name="VCPreBuildEventTool"
-				Description="Generating strings.h"
-				CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\objs\langs\table"
-			/>
 		</Configuration>
 	</Configurations>
 	<References>
--- a/projects/openttd.sln	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/openttd.sln	Wed Feb 28 00:33:40 2007 +0000
@@ -19,17 +19,15 @@
 		Debug = Debug
 		Release = Release
 	EndGlobalSection
-	GlobalSection(ProjectDependencies) = postSolution
-	EndGlobalSection
 	GlobalSection(ProjectConfiguration) = postSolution
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug.ActiveCfg = Debug|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug.Build.0 = Debug|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release.ActiveCfg = Release|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release.Build.0 = Release|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug.ActiveCfg = Release|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug.Build.0 = Release|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release.ActiveCfg = Release|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release.Build.0 = Release|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug.ActiveCfg = Debug|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug.Build.0 = Debug|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release.ActiveCfg = Release|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release.Build.0 = Release|Win32
 		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug.ActiveCfg = Debug|Win32
 		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug.Build.0 = Debug|Win32
 		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Release.ActiveCfg = Debug|Win32
--- a/projects/openttd.vcproj	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/openttd.vcproj	Wed Feb 28 00:33:40 2007 +0000
@@ -3,7 +3,7 @@
 	ProjectType="Visual C++"
 	Version="7.10"
 	Name="openttd"
-	RootNameSpace="openttd"
+	RootNamespace="openttd"
 	SccProjectName=""
 	SccLocalPath="">
 	<Platforms>
@@ -173,6 +173,9 @@
 				RelativePath=".\..\src\callback_table.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\cargotype.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\command.cpp">
 			</File>
 			<File
@@ -260,18 +263,6 @@
 				RelativePath=".\..\src\namegen.cpp">
 			</File>
 			<File
-				RelativePath=".\..\src\network\core\core.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\packet.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\tcp.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\udp.cpp">
-			</File>
-			<File
 				RelativePath=".\..\src\network\network.cpp">
 			</File>
 			<File
@@ -399,6 +390,9 @@
 				RelativePath=".\..\src\bmp.h">
 			</File>
 			<File
+				RelativePath=".\..\src\cargotype.h">
+			</File>
+			<File
 				RelativePath=".\..\src\command.h">
 			</File>
 			<File
@@ -432,15 +426,15 @@
 				RelativePath=".\..\src\engine.h">
 			</File>
 			<File
-				RelativePath=".\..\src\fontcache.h">
-			</File>
-			<File
 				RelativePath=".\..\src\fileio.h">
 			</File>
 			<File
 				RelativePath=".\..\src\fios.h">
 			</File>
 			<File
+				RelativePath=".\..\src\fontcache.h">
+			</File>
+			<File
 				RelativePath=".\..\src\functions.h">
 			</File>
 			<File
@@ -486,27 +480,6 @@
 				RelativePath=".\..\src\music.h">
 			</File>
 			<File
-				RelativePath=".\..\src\network\core\config.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\core.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\game.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\os_abstraction.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\packet.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\tcp.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\udp.h">
-			</File>
-			<File
 				RelativePath=".\..\src\network\network.h">
 			</File>
 			<File
@@ -849,6 +822,9 @@
 				RelativePath=".\..\src\table\build_industry.h">
 			</File>
 			<File
+				RelativePath=".\..\src\table\cargo_const.h">
+			</File>
+			<File
 				RelativePath=".\..\src\table\clear_land.h">
 			</File>
 			<File
@@ -864,9 +840,6 @@
 				RelativePath=".\..\src\table\industry_land.h">
 			</File>
 			<File
-				RelativePath=".\..\src\table\landscape_const.h">
-			</File>
-			<File
 				RelativePath=".\..\src\table\landscape_sprite.h">
 			</File>
 			<File
@@ -919,10 +892,10 @@
 				RelativePath=".\..\src\ai\ai.cpp">
 			</File>
 			<File
-				RelativePath=".\..\src\ai\default\default.cpp">
+				RelativePath=".\..\src\ai\trolly\build.cpp">
 			</File>
 			<File
-				RelativePath=".\..\src\ai\trolly\build.cpp">
+				RelativePath=".\..\src\ai\default\default.cpp">
 			</File>
 			<File
 				RelativePath=".\..\src\ai\trolly\pathfinder.cpp">
@@ -941,9 +914,6 @@
 				RelativePath=".\..\src\newgrf.cpp">
 			</File>
 			<File
-				RelativePath=".\..\src\newgrf_cargo.cpp">
-			</File>
-			<File
 				RelativePath=".\..\src\newgrf_config.cpp">
 			</File>
 			<File
@@ -1119,6 +1089,43 @@
 			</File>
 		</Filter>
 		<Filter
+			Name="Network Core"
+			Filter="">
+			<File
+				RelativePath=".\..\src\network\core\config.h">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\core.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\core.h">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\game.h">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\os_abstraction.h">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\packet.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\packet.h">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\tcp.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\tcp.h">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\udp.cpp">
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\udp.h">
+			</File>
+		</Filter>
+		<Filter
 			Name="YAPF"
 			Filter="">
 			<File
--- a/projects/openttd.vcproj.in	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/openttd.vcproj.in	Wed Feb 28 00:33:40 2007 +0000
@@ -3,7 +3,7 @@
 	ProjectType="Visual C++"
 	Version="7.10"
 	Name="openttd"
-	RootNameSpace="openttd"
+	RootNamespace="openttd"
 	SccProjectName=""
 	SccLocalPath="">
 	<Platforms>
--- a/projects/openttd_vs80.sln	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/openttd_vs80.sln	Wed Feb 28 00:33:40 2007 +0000
@@ -21,6 +21,14 @@
 		Release|x64 = Release|x64
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64
+		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.ActiveCfg = Debug|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|Win32.Build.0 = Debug|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Debug|x64.ActiveCfg = Debug|Win32
@@ -29,14 +37,6 @@
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|Win32.Build.0 = Debug|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.ActiveCfg = Debug|Win32
 		{A133A442-BD0A-4ADE-B117-AD7545E4BDD1}.Release|x64.Build.0 = Debug|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.ActiveCfg = Debug|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|Win32.Build.0 = Debug|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.ActiveCfg = Debug|x64
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Debug|x64.Build.0 = Debug|x64
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.ActiveCfg = Release|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|Win32.Build.0 = Release|Win32
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.ActiveCfg = Release|x64
-		{668328A0-B40E-4CDB-BD72-D0064424414A}.Release|x64.Build.0 = Release|x64
 		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.ActiveCfg = Debug|Win32
 		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|Win32.Build.0 = Debug|Win32
 		{0F066B23-18DF-4284-8265-F4A5E7E3B966}.Debug|x64.ActiveCfg = Debug|Win32
--- a/projects/openttd_vs80.vcproj	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Wed Feb 28 00:33:40 2007 +0000
@@ -442,1069 +442,1076 @@
 	<Files>
 		<Filter
 			Name="Source Files"
-			Filter="">
-			<File
-				RelativePath=".\..\src\airport.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\aystar.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\bmp.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\callback_table.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\command.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\console.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\console_cmds.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\currency.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\date.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\debug.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\dedicated.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\depot.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\driver.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\economy.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\elrail.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\engine.cpp">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\fileio.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\fios.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\fontcache.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\genworld.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\gfx.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\gfxinit.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\heightmap.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\helpers.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\landscape.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\map.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\md5.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\mersenne.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\minilzo.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\misc.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\mixer.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\music.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\namegen.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\core.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\packet.cpp">
+				RelativePath=".\..\src\airport.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\network\core\tcp.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\udp.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_client.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_data.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_gamelist.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_server.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_udp.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\npf.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\oldloader.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\oldpool.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\openttd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\os_timer.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\ottdres.rc">
-			</File>
-			<File
-				RelativePath=".\..\src\pathfind.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\players.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\queue.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\rail.cpp">
+				RelativePath=".\..\src\aystar.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\saveload.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\screenshot.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\sdl.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\settings.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\signs.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\sound.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\spritecache.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\station.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\string.cpp">
+				RelativePath=".\..\src\bmp.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\strings.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\texteff.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\tgp.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\thread.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\tile.cpp">
+				RelativePath=".\..\src\callback_table.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\vehicle.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\viewport.cpp">
+				RelativePath=".\..\src\cargotype.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\waypoint.cpp">
+				RelativePath=".\..\src\command.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\widget.cpp">
+				RelativePath=".\..\src\console.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\win32.cpp">
+				RelativePath=".\..\src\console_cmds.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\window.cpp">
+				RelativePath=".\..\src\currency.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\date.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\debug.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\dedicated.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\depot.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\driver.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\elrail.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\engine.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\fileio.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\fios.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\fontcache.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\genworld.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfxinit.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\heightmap.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\helpers.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\landscape.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\map.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\md5.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\mersenne.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\minilzo.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\mixer.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\music.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\namegen.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_client.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_data.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gamelist.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_server.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_udp.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\npf.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\oldloader.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\oldpool.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\openttd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\os_timer.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\ottdres.rc"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\pathfind.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\players.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\queue.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\saveload.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\screenshot.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\sdl.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\spritecache.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\station.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\string.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\strings.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\texteff.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tgp.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\thread.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tile.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\viewport.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\waypoint.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\win32.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\window.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Header Files"
-			Filter="">
-			<File
-				RelativePath=".\..\src\aircraft.h">
-			</File>
-			<File
-				RelativePath=".\..\src\airport.h">
-			</File>
-			<File
-				RelativePath=".\..\src\airport_movement.h">
-			</File>
-			<File
-				RelativePath=".\..\src\aystar.h">
-			</File>
-			<File
-				RelativePath=".\..\src\bmp.h">
-			</File>
-			<File
-				RelativePath=".\..\src\command.h">
-			</File>
-			<File
-				RelativePath=".\..\src\console.h">
-			</File>
-			<File
-				RelativePath=".\..\src\currency.h">
-			</File>
-			<File
-				RelativePath=".\..\src\date.h">
-			</File>
-			<File
-				RelativePath=".\..\src\debug.h">
-			</File>
-			<File
-				RelativePath=".\..\src\video\dedicated_v.h">
-			</File>
-			<File
-				RelativePath=".\..\src\depot.h">
-			</File>
-			<File
-				RelativePath=".\..\src\music\dmusic.h">
-			</File>
-			<File
-				RelativePath=".\..\src\driver.h">
-			</File>
-			<File
-				RelativePath=".\..\src\economy.h">
-			</File>
-			<File
-				RelativePath=".\..\src\engine.h">
-			</File>
-			<File
-				RelativePath=".\..\src\fontcache.h">
-			</File>
-			<File
-				RelativePath=".\..\src\fileio.h">
-			</File>
-			<File
-				RelativePath=".\..\src\fios.h">
-			</File>
-			<File
-				RelativePath=".\..\src\functions.h">
-			</File>
-			<File
-				RelativePath=".\..\src\genworld.h">
-			</File>
-			<File
-				RelativePath=".\..\src\gfx.h">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\gfxinit.h">
-			</File>
-			<File
-				RelativePath=".\..\src\gui.h">
-			</File>
-			<File
-				RelativePath=".\..\src\hal.h">
-			</File>
-			<File
-				RelativePath=".\..\src\heightmap.h">
-			</File>
-			<File
-				RelativePath=".\..\src\helpers.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\industry.h">
-			</File>
-			<File
-				RelativePath=".\..\src\livery.h">
-			</File>
-			<File
-				RelativePath=".\..\src\macros.h">
-			</File>
-			<File
-				RelativePath=".\..\src\map.h">
-			</File>
-			<File
-				RelativePath=".\..\src\md5.h">
-			</File>
-			<File
-				RelativePath=".\..\src\mixer.h">
-			</File>
-			<File
-				RelativePath=".\..\src\music.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\config.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\core.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\game.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\os_abstraction.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\packet.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\tcp.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\core\udp.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_client.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_data.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_gamelist.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_gui.h">
+				RelativePath=".\..\src\aircraft.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\network\network_server.h">
-			</File>
-			<File
-				RelativePath=".\..\src\network\network_udp.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_callbacks.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_cargo.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_config.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_engine.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_sound.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_spritegroup.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_station.h">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_text.h">
-			</File>
-			<File
-				RelativePath=".\..\src\news.h">
-			</File>
-			<File
-				RelativePath=".\..\src\npf.h">
-			</File>
-			<File
-				RelativePath=".\..\src\music\null_m.h">
-			</File>
-			<File
-				RelativePath=".\..\src\sound\null_s.h">
-			</File>
-			<File
-				RelativePath=".\..\src\video\null_v.h">
-			</File>
-			<File
-				RelativePath=".\..\src\oldpool.h">
-			</File>
-			<File
-				RelativePath=".\..\src\openttd.h">
-			</File>
-			<File
-				RelativePath=".\..\src\pathfind.h">
-			</File>
-			<File
-				RelativePath=".\..\src\player.h">
-			</File>
-			<File
-				RelativePath=".\..\src\queue.h">
-			</File>
-			<File
-				RelativePath=".\..\src\rail.h">
-			</File>
-			<File
-				RelativePath=".\..\src\road_cmd.h">
-			</File>
-			<File
-				RelativePath=".\..\src\saveload.h">
+				RelativePath=".\..\src\airport.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\screenshot.h">
-			</File>
-			<File
-				RelativePath=".\..\src\sound\sdl_s.h">
-			</File>
-			<File
-				RelativePath=".\..\src\video\sdl_v.h">
-			</File>
-			<File
-				RelativePath=".\..\src\settings.h">
-			</File>
-			<File
-				RelativePath=".\..\src\signs.h">
-			</File>
-			<File
-				RelativePath=".\..\src\slope.h">
-			</File>
-			<File
-				RelativePath=".\..\src\sound.h">
-			</File>
-			<File
-				RelativePath=".\..\src\sprite.h">
-			</File>
-			<File
-				RelativePath=".\..\src\station.h">
-			</File>
-			<File
-				RelativePath=".\..\src\stdafx.h">
-			</File>
-			<File
-				RelativePath=".\..\src\string.h">
-			</File>
-			<File
-				RelativePath=".\..\src\tgp.h">
+				RelativePath=".\..\src\airport_movement.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\thread.h">
-			</File>
-			<File
-				RelativePath=".\..\src\tile.h">
-			</File>
-			<File
-				RelativePath=".\..\src\town.h">
-			</File>
-			<File
-				RelativePath=".\..\src\train.h">
-			</File>
-			<File
-				RelativePath=".\..\src\variables.h">
-			</File>
-			<File
-				RelativePath=".\..\src\vehicle.h">
+				RelativePath=".\..\src\aystar.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\vehicle_gui.h">
-			</File>
-			<File
-				RelativePath=".\..\src\viewport.h">
-			</File>
-			<File
-				RelativePath=".\..\src\waypoint.h">
+				RelativePath=".\..\src\bmp.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\music\win32_m.h">
+				RelativePath=".\..\src\cargotype.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\sound\win32_s.h">
+				RelativePath=".\..\src\command.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\video\win32_v.h">
+				RelativePath=".\..\src\console.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\window.h">
+				RelativePath=".\..\src\currency.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\date.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\debug.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\dedicated_v.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\depot.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\dmusic.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\driver.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\economy.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\engine.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\fileio.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\fios.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\fontcache.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\functions.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\genworld.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfx.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\gfxinit.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\gui.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\hal.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\heightmap.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\helpers.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\industry.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\livery.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\macros.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\md5.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\mixer.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\music.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_client.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_data.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gamelist.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gui.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_server.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_udp.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_callbacks.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_cargo.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_config.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_engine.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_sound.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_spritegroup.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_station.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_text.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\news.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\npf.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\null_m.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\null_s.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\null_v.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\oldpool.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\openttd.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\pathfind.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\player.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\queue.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_cmd.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\saveload.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\screenshot.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\sdl_s.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\sdl_v.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\slope.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\sprite.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\station.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\stdafx.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\string.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tgp.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\thread.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tile.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\town.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\train.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\variables.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle_gui.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\viewport.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\waypoint.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\music\win32_m.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\sound\win32_s.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\video\win32_v.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\window.h"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="GUI Source Code"
-			Filter="">
-			<File
-				RelativePath=".\..\src\aircraft_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\airport_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\autoreplace_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\bridge_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\build_vehicle_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\depot_gui.cpp">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\dock_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\engine_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\genworld_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\graph_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\industry_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\intro_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\main_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\misc_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\music_gui.cpp">
+				RelativePath=".\..\src\aircraft_gui.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\network\network_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\news_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\order_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\player_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\rail_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\road_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\roadveh_gui.cpp">
+				RelativePath=".\..\src\airport_gui.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\settings_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\ship_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\signs_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\smallmap_gui.cpp">
+				RelativePath=".\..\src\autoreplace_gui.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\station_gui.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\subsidy_gui.cpp">
+				RelativePath=".\..\src\bridge_gui.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\terraform_gui.cpp">
+				RelativePath=".\..\src\build_vehicle_gui.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\town_gui.cpp">
+				RelativePath=".\..\src\depot_gui.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\train_gui.cpp">
+				RelativePath=".\..\src\dock_gui.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\vehicle_gui.cpp">
+				RelativePath=".\..\src\engine_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\genworld_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\graph_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\industry_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\intro_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\main_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\music_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\network_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\news_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\order_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\player_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\roadveh_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\settings_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\ship_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\signs_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\smallmap_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\subsidy_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\terraform_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\town_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\train_gui.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\vehicle_gui.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Landscape"
-			Filter="">
-			<File
-				RelativePath=".\..\src\aircraft_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\clear_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\disaster_cmd.cpp">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\dummy_land.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\industry_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\misc_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\order_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\rail_cmd.cpp">
+				RelativePath=".\..\src\aircraft_cmd.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\road_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\roadveh_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\ship_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\station_cmd.cpp">
+				RelativePath=".\..\src\clear_cmd.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\town_cmd.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\train_cmd.cpp">
+				RelativePath=".\..\src\disaster_cmd.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\tree_cmd.cpp">
+				RelativePath=".\..\src\dummy_land.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\tunnelbridge_cmd.cpp">
+				RelativePath=".\..\src\industry_cmd.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\unmovable_cmd.cpp">
+				RelativePath=".\..\src\misc_cmd.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\water_cmd.cpp">
+				RelativePath=".\..\src\order_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\rail_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\roadveh_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\ship_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\town_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\train_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tree_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tunnelbridge_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\unmovable_cmd.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\water_cmd.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Tables"
-			Filter="">
-			<File
-				RelativePath=".\..\src\table\ai_rail.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\allstrings.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\animcursors.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\autorail.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\build_industry.h">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\table\clear_land.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\elrail_data.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\engines.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\genland.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\industry_land.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\landscape_const.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\landscape_sprite.h">
+				RelativePath=".\..\src\table\ai_rail.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\namegen.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\palettes.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\road_land.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\roadveh.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\sprites.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\station_land.h">
+				RelativePath=".\..\src\table\allstrings.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\strings.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\town_land.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\track_land.h">
+				RelativePath=".\..\src\table\animcursors.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\train_cmd.h">
-			</File>
-			<File
-				RelativePath=".\..\src\table\tree_land.h">
+				RelativePath=".\..\src\table\autorail.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\tunnel_land.h">
+				RelativePath=".\..\src\table\build_industry.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\unmovable_land.h">
+				RelativePath=".\..\src\table\cargo_const.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\table\water_land.h">
+				RelativePath=".\..\src\table\clear_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\elrail_data.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\engines.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\genland.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\industry_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\landscape_sprite.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\namegen.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\palettes.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\road_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\roadveh.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\sprites.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\station_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\strings.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\town_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\track_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\train_cmd.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\tree_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\tunnel_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\unmovable_land.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\table\water_land.h"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="AI Files"
-			Filter="">
+			>
 			<File
-				RelativePath=".\..\src\ai\ai.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\ai\default\default.cpp">
+				RelativePath=".\..\src\ai\ai.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\ai\trolly\build.cpp">
+				RelativePath=".\..\src\ai\trolly\build.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\ai\trolly\pathfinder.cpp">
+				RelativePath=".\..\src\ai\default\default.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\ai\trolly\shared.cpp">
+				RelativePath=".\..\src\ai\trolly\pathfinder.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\ai\trolly\trolly.cpp">
+				RelativePath=".\..\src\ai\trolly\shared.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\ai\trolly\trolly.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="NewGRF"
-			Filter="">
+			>
 			<File
-				RelativePath=".\..\src\newgrf.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_cargo.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_config.cpp">
+				RelativePath=".\..\src\newgrf.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\newgrf_engine.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\newgrf_sound.cpp">
+				RelativePath=".\..\src\newgrf_config.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\newgrf_spritegroup.cpp">
+				RelativePath=".\..\src\newgrf_engine.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\newgrf_station.cpp">
+				RelativePath=".\..\src\newgrf_sound.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\newgrf_text.cpp">
+				RelativePath=".\..\src\newgrf_spritegroup.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_station.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\newgrf_text.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Map Accessors"
-			Filter="">
-			<File
-				RelativePath=".\..\src\bridge_map.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\bridge_map.h">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\clear_map.h">
-			</File>
-			<File
-				RelativePath=".\..\src\industry_map.h">
-			</File>
-			<File
-				RelativePath=".\..\src\rail_map.h">
-			</File>
-			<File
-				RelativePath=".\..\src\road_map.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\road_map.h">
+				RelativePath=".\..\src\bridge_map.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\station_map.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\station_map.h">
-			</File>
-			<File
-				RelativePath=".\..\src\town_map.h">
-			</File>
-			<File
-				RelativePath=".\..\src\tree_map.h">
+				RelativePath=".\..\src\bridge_map.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\tunnel_map.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\tunnel_map.h">
+				RelativePath=".\..\src\clear_map.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\unmovable_map.h">
+				RelativePath=".\..\src\industry_map.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\void_map.h">
+				RelativePath=".\..\src\rail_map.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\water_map.h">
+				RelativePath=".\..\src\road_map.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\road_map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_map.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\station_map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\town_map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tree_map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tunnel_map.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\tunnel_map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\unmovable_map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\void_map.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\water_map.h"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Misc"
-			Filter="">
-			<File
-				RelativePath=".\..\src\misc\array.hpp">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\misc\autocopyptr.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\misc\autoptr.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\misc\binaryheap.hpp">
+				RelativePath=".\..\src\misc\array.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\misc\blob.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\misc\countedobj.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\misc\countedptr.hpp">
+				RelativePath=".\..\src\misc\autocopyptr.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\misc\crc32.hpp">
+				RelativePath=".\..\src\misc\autoptr.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\misc\fixedsizearray.hpp">
+				RelativePath=".\..\src\misc\binaryheap.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\misc\hashtable.hpp">
+				RelativePath=".\..\src\misc\blob.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\misc\rect.hpp">
+				RelativePath=".\..\src\misc\countedobj.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\countedptr.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\crc32.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\fixedsizearray.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\hashtable.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\misc\rect.hpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Widget"
-			Filter="">
-			<File
-				RelativePath=".\..\src\widget\widget.h">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_base.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_button.cpp">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\widget\widget_button_img2.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_button_img.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_button_txt2.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_button_txt.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_caption.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_closebox.cpp">
+				RelativePath=".\..\src\widget\widget.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\widget\widget_composite.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_frame.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_hscrollbar.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_inset.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_label.cpp">
+				RelativePath=".\..\src\widget\widget_base.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\widget\widget_list.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_panel.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\widget\widget_resizebox.cpp">
+				RelativePath=".\..\src\widget\widget_button.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\widget\widget_scrollbar.cpp">
+				RelativePath=".\..\src\widget\widget_button_img2.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\widget\widget_stickybox.cpp">
+				RelativePath=".\..\src\widget\widget_button_img.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\widget\window_event_base.h">
+				RelativePath=".\..\src\widget\widget_button_txt2.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\widget\window_events.hpp">
+				RelativePath=".\..\src\widget\widget_button_txt.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_caption.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_closebox.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_composite.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_frame.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_hscrollbar.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_inset.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_label.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_list.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_panel.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_resizebox.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_scrollbar.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\widget_stickybox.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\window_event_base.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\widget\window_events.hpp"n				>
+			</File>
+		</Filter>
+		<Filter
+			Name="Network Core"
+			>
+			<File
+				RelativePath=".\..\src\network\core\config.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\core.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\core.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\game.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\os_abstraction.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\packet.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\packet.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\tcp.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\tcp.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\udp.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\network\core\udp.h"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="YAPF"
-			Filter="">
-			<File
-				RelativePath=".\..\src\yapf\follow_track.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\follow_track.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\nodelist.hpp">
-			</File>
+			>
 			<File
-				RelativePath=".\..\src\yapf\track_dir.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf.h">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_base.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_common.cpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_common.hpp">
+				RelativePath=".\..\src\yapf\follow_track.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_costbase.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_costcache.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_costrail.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_destrail.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_node.hpp">
+				RelativePath=".\..\src\yapf\follow_track.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_node_rail.hpp">
-			</File>
-			<File
-				RelativePath=".\..\src\yapf\yapf_node_road.hpp">
+				RelativePath=".\..\src\yapf\nodelist.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_rail.cpp">
+				RelativePath=".\..\src\yapf\track_dir.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_road.cpp">
+				RelativePath=".\..\src\yapf\yapf.h"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_settings.h">
+				RelativePath=".\..\src\yapf\yapf.hpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\yapf\yapf_ship.cpp">
+				RelativePath=".\..\src\yapf\yapf_base.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_common.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_common.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_costbase.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_costcache.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_costrail.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_destrail.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_node.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_node_rail.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_node_road.hpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_rail.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_road.cpp"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_settings.h"n				>
+			</File>
+			<File
+				RelativePath=".\..\src\yapf\yapf_ship.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Video"
-			Filter="">
+			>
 			<File
-				RelativePath=".\..\src\video\dedicated_v.cpp">
+				RelativePath=".\..\src\video\dedicated_v.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\video\null_v.cpp">
+				RelativePath=".\..\src\video\null_v.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\video\sdl_v.cpp">
+				RelativePath=".\..\src\video\sdl_v.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\video\win32_v.cpp">
+				RelativePath=".\..\src\video\win32_v.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Music"
-			Filter="">
+			>
 			<File
-				RelativePath=".\..\src\music\dmusic.cpp">
+				RelativePath=".\..\src\music\dmusic.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\music\null_m.cpp">
+				RelativePath=".\..\src\music\null_m.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\music\win32_m.cpp">
+				RelativePath=".\..\src\music\win32_m.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
 			Name="Sound"
-			Filter="">
+			>
 			<File
-				RelativePath=".\..\src\sound\null_s.cpp">
+				RelativePath=".\..\src\sound\null_s.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\sound\sdl_s.cpp">
+				RelativePath=".\..\src\sound\sdl_s.cpp"n				>
 			</File>
 			<File
-				RelativePath=".\..\src\sound\win32_s.cpp">
+				RelativePath=".\..\src\sound\win32_s.cpp"n				>
 			</File>
 		</Filter>
 		<Filter
@@ -1551,13 +1558,16 @@
 			</File>
 		</Filter>
 		<File
-			RelativePath=".\..\media\mainicon.ico">
+			RelativePath=".\..\media\mainicon.ico"
+			>
 		</File>
 		<File
-			RelativePath=".\..\media\openttd.ico">
+			RelativePath=".\..\media\openttd.ico"
+			>
 		</File>
 		<File
-			RelativePath=".\..\readme.txt">
+			RelativePath=".\..\readme.txt"
+			>
 		</File>
 	</Files>
 	<Globals>
--- a/projects/openttd_vs80.vcproj.in	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/openttd_vs80.vcproj.in	Wed Feb 28 00:33:40 2007 +0000
@@ -485,13 +485,16 @@
 			</File>
 		</Filter>
 		<File
-			RelativePath=".\..\media\mainicon.ico">
+			RelativePath=".\..\media\mainicon.ico"
+			>
 		</File>
 		<File
-			RelativePath=".\..\media\openttd.ico">
+			RelativePath=".\..\media\openttd.ico"
+			>
 		</File>
 		<File
-			RelativePath=".\..\readme.txt">
+			RelativePath=".\..\readme.txt"
+			>
 		</File>
 	</Files>
 	<Globals>
--- a/projects/strgen_vs80.vcproj	Tue Feb 27 23:54:28 2007 +0000
+++ b/projects/strgen_vs80.vcproj	Wed Feb 28 00:33:40 2007 +0000
@@ -44,7 +44,6 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="1"
-				GlobalOptimizations="TRUE"
 				FavorSizeOrSpeed="2"
 				PreprocessorDefinitions="STRGEN;WIN32;_DEBUG;_CONSOLE"
 				BasicRuntimeChecks="0"
@@ -121,12 +120,14 @@
 				RelativePath="..\src\string.cpp"
 				>
 				<FileConfiguration
-					Name="Release|Win32">
+					Name="Release|Win32"
+					>
 					<Tool
 						Name="VCCLCompilerTool"
-						ObjectFile="$(IntDir)/$(InputName)1.obj"/>
-					</FileConfiguration>
-				</File>
+						ObjectFile="$(IntDir)/$(InputName)1.obj"
+					/>
+				</FileConfiguration>
+			</File>
 		</Filter>
 		<File
 			RelativePath="..\src\macros.h"
--- a/source.list	Tue Feb 27 23:54:28 2007 +0000
+++ b/source.list	Wed Feb 28 00:33:40 2007 +0000
@@ -3,6 +3,7 @@
 aystar.cpp
 bmp.cpp
 callback_table.cpp
+cargotype.cpp
 command.cpp
 console.cpp
 console_cmds.cpp
@@ -32,10 +33,6 @@
 mixer.cpp
 music.cpp
 namegen.cpp
-network/core/core.cpp
-network/core/packet.cpp
-network/core/tcp.cpp
-network/core/udp.cpp
 network/network.cpp
 network/network_client.cpp
 network/network_data.cpp
@@ -100,6 +97,7 @@
 airport_movement.h
 aystar.h
 bmp.h
+cargotype.h
 command.h
 console.h
 currency.h
@@ -111,9 +109,9 @@
 driver.h
 economy.h
 engine.h
-fontcache.h
 fileio.h
 fios.h
+fontcache.h
 functions.h
 genworld.h
 gfx.h
@@ -129,13 +127,6 @@
 md5.h
 mixer.h
 music.h
-network/core/config.h
-network/core/core.h
-network/core/game.h
-network/core/os_abstraction.h
-network/core/packet.h
-network/core/tcp.h
-network/core/udp.h
 network/network.h
 network/network_client.h
 network/network_data.h
@@ -252,12 +243,12 @@
 table/animcursors.h
 table/autorail.h
 table/build_industry.h
+table/cargo_const.h
 table/clear_land.h
 table/elrail_data.h
 table/engines.h
 table/genland.h
 table/industry_land.h
-table/landscape_const.h
 table/landscape_sprite.h
 table/namegen.h
 table/palettes.h
@@ -276,15 +267,14 @@
 
 # AI Files
 ai/ai.cpp
+ai/trolly/build.cpp
 ai/default/default.cpp
-ai/trolly/build.cpp
 ai/trolly/pathfinder.cpp
 ai/trolly/shared.cpp
 ai/trolly/trolly.cpp
 
 # NewGRF
 newgrf.cpp
-newgrf_cargo.cpp
 newgrf_config.cpp
 newgrf_engine.cpp
 newgrf_sound.cpp
@@ -346,6 +336,19 @@
 widget/window_event_base.h
 widget/window_events.hpp
 
+# Network Core
+network/core/config.h
+network/core/core.cpp
+network/core/core.h
+network/core/game.h
+network/core/os_abstraction.h
+network/core/packet.cpp
+network/core/packet.h
+network/core/tcp.cpp
+network/core/tcp.h
+network/core/udp.cpp
+network/core/udp.h
+
 # YAPF
 yapf/follow_track.cpp
 yapf/follow_track.hpp
--- a/src/ai/default/default.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/ai/default/default.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1546,7 +1546,7 @@
 		w = GB(p->attr, 1, 3);
 		h = GB(p->attr, 4, 3);
 
-		if (p->attr & 1) uintswap(w, h);
+		if (p->attr & 1) Swap(w, h);
 
 		if (cargo & 0x80) {
 			GetProductionAroundTiles(values, tile2, w, h, rad);
--- a/src/aircraft.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/aircraft.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file aircraft.h */
+
 #ifndef AIRCRAFT_H
 #define AIRCRAFT_H
 
@@ -40,11 +42,13 @@
 	return IsAircraftInHangar(v) && v->vehstatus & VS_STOPPED;
 }
 
-uint16 AircraftDefaultCargoCapacity(CargoID cid, EngineID engine_type);
+uint16 AircraftDefaultCargoCapacity(CargoID cid, const AircraftVehicleInfo*);
 
 void CcBuildAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2);
 void CcCloneAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2);
 void HandleAircraftEnterHangar(Vehicle *v);
 void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height);
 
+void UpdateAirplanesOnNewStation(const Station *st);
+
 #endif /* AIRCRAFT_H */
--- a/src/aircraft_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/aircraft_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,8 @@
 /* $Id$ */
 
+/** @file aircraft_cmd.cpp
+ * This file deals with aircraft and airport movements functionalities */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "aircraft.h"
@@ -28,17 +31,16 @@
 #include "date.h"
 #include "spritecache.h"
 
-// this maps the terminal to its corresponding state and block flag
-// currently set for 10 terms, 4 helipads
+/** this maps the terminal to its corresponding state and block flag
+ *  currently set for 10 terms, 4 helipads */
 static const byte _airport_terminal_state[] = {2, 3, 4, 5, 6, 7, 19, 20, 0, 0, 8, 9, 21, 22};
 static const byte _airport_terminal_flag[] =  {0, 1, 2, 3, 4, 5, 22, 23, 0, 0, 6, 7, 24, 25};
 
 static bool AirportMove(Vehicle *v, const AirportFTAClass *apc);
-static bool AirportSetBlocks(Vehicle *v, AirportFTA *current_pos, const AirportFTAClass *apc);
+static bool AirportSetBlocks(Vehicle *v, const AirportFTA *current_pos, const AirportFTAClass *apc);
 static bool AirportHasBlock(Vehicle *v, const AirportFTA *current_pos, const AirportFTAClass *apc);
 static bool AirportFindFreeTerminal(Vehicle *v, const AirportFTAClass *apc);
 static bool AirportFindFreeHelipad(Vehicle *v, const AirportFTAClass *apc);
-static void AirportGoToNextPosition(Vehicle *v, const AirportFTAClass *apc);
 static void CrashAirplane(Vehicle *v);
 
 static void AircraftNextAirportPos_and_Order(Vehicle *v);
@@ -54,7 +56,7 @@
 	0x0EBD, 0x0EC5
 };
 
-/* Helicopter rotor animation states */
+/** Helicopter rotor animation states */
 enum HelicopterRotorStates {
 	HRS_ROTOR_STOPPED,
 	HRS_ROTOR_MOVING_1,
@@ -62,9 +64,11 @@
 	HRS_ROTOR_MOVING_3,
 };
 
-/* Find the nearest hangar to v
+/** Find the nearest hangar to v
  * INVALID_STATION is returned, if the player does not have any suitable
  * airports (like helipads only)
+ * @param v vehicle looking for a hangar
+ * @return the StationID if one is found, otherwise, INVALID_STATION
  */
 static StationID FindNearestHangar(const Vehicle *v)
 {
@@ -86,7 +90,7 @@
 			continue;
 		}
 
-		// v->tile can't be used here, when aircraft is flying v->tile is set to 0
+		/* v->tile can't be used here, when aircraft is flying v->tile is set to 0 */
 		uint distance = DistanceSquare(vtile, st->airport_tile);
 		if (distance < best || index == INVALID_STATION) {
 			best = distance;
@@ -97,7 +101,9 @@
 }
 
 #if 0
-// returns true if vehicle v have an airport in the schedule, that has a hangar
+/** Check if given vehicle has a goto hangar in his orders
+ * @param v vehicle to inquiry
+ * @return true if vehicle v has an airport in the schedule, that has a hangar */
 static bool HaveHangarInOrderList(Vehicle *v)
 {
 	const Order *order;
@@ -105,7 +111,7 @@
 	FOR_VEHICLE_ORDERS(v, order) {
 		const Station *st = GetStation(order->station);
 		if (st->owner == v->owner && st->facilities & FACIL_AIRPORT) {
-			// If an airport doesn't have a hangar, skip it
+			/* If an airport doesn't have a hangar, skip it */
 			if (st->Airport()->nof_depots != 0)
 				return true;
 		}
@@ -130,11 +136,9 @@
 
 SpriteID GetRotorImage(const Vehicle *v)
 {
-	const Vehicle *w;
-
 	assert(v->subtype == AIR_HELICOPTER);
 
-	w = v->next->next;
+	const Vehicle *w = v->next->next;
 	if (is_custom_sprite(v->spritenum)) {
 		SpriteID spritenum = GetCustomRotorSprite(v, false);
 		if (spritenum != 0) return spritenum;
@@ -205,10 +209,8 @@
  * @param engine Which engine to find a cargo capacity for.
  * @return New cargo capacity value.
  */
-uint16 AircraftDefaultCargoCapacity(CargoID cid, EngineID engine_type)
+uint16 AircraftDefaultCargoCapacity(CargoID cid, const AircraftVehicleInfo *avi)
 {
-	const AircraftVehicleInfo *avi = AircraftVehInfo(engine_type);
-
 	assert(cid != CT_INVALID);
 
 	/* An aircraft can carry twice as much goods as normal cargo,
@@ -228,27 +230,26 @@
 
 /** Build an aircraft.
  * @param tile tile of depot where aircraft is built
+ * @param flags for command
  * @param p1 aircraft type being built (engine)
  * @param p2 bit 0 when set, the unitnumber will be 0, otherwise it will be a free number
+ * return result of operation.  Could be cost, error
  */
 int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *vl[3];
-	UnitID unit_num;
-
 	if (!IsEngineBuildable(p1, VEH_Aircraft, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
 
 	const AircraftVehicleInfo *avi = AircraftVehInfo(p1);
 	int32 value = EstimateAircraftCost(avi);
 
-	// to just query the cost, it is not neccessary to have a valid tile (automation/AI)
+	/* to just query the cost, it is not neccessary to have a valid tile (automation/AI) */
 	if (flags & DC_QUERY_COST) return value;
 
 	if (!IsHangarTile(tile) || !IsTileOwner(tile, _current_player)) return CMD_ERROR;
 
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
-	// Prevent building aircraft types at places which can't handle them
+	/* Prevent building aircraft types at places which can't handle them */
 	const Station* st = GetStationByTile(tile);
 	const AirportFTAClass* apc = st->Airport();
 	if (!(apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS))) {
@@ -257,19 +258,16 @@
 
 	/* Allocate 2 or 3 vehicle structs, depending on type
 	 * vl[0] = aircraft, vl[1] = shadow, [vl[2] = rotor] */
+	Vehicle *vl[3];
 	if (!AllocateVehicles(vl, avi->subtype & AIR_CTOL ? 2 : 3)) {
 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 	}
 
-	unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_Aircraft);
+	UnitID unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_Aircraft);
 	if (unit_num > _patches.max_aircraft)
 		return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
 	if (flags & DC_EXEC) {
-		CargoID cargo;
-		uint x;
-		uint y;
-
 		Vehicle *v = vl[0]; // aircraft
 		Vehicle *u = vl[1]; // shadow
 
@@ -282,8 +280,8 @@
 		v->tile = tile;
 //		u->tile = 0;
 
-		x = TileX(tile) * TILE_SIZE + 5;
-		y = TileY(tile) * TILE_SIZE + 3;
+		uint x = TileX(tile) * TILE_SIZE + 5;
+		uint y = TileY(tile) * TILE_SIZE + 3;
 
 		v->x_pos = u->x_pos = x;
 		v->y_pos = u->y_pos = y;
@@ -336,7 +334,7 @@
 		 * passengers, we select the cargo type from the refit mask.
 		 * This is a fairly nasty hack to get around the fact that TTD
 		 * has no default cargo type specifier for planes... */
-		cargo = FindFirstRefittableCargo(p1);
+		CargoID cargo = FindFirstRefittableCargo(p1);
 		if (cargo != CT_INVALID && cargo != CT_PASSENGERS) {
 			uint16 callback = CALLBACK_FAILED;
 
@@ -348,7 +346,7 @@
 
 			if (callback == CALLBACK_FAILED) {
 				/* Callback failed, or not executed; use the default cargo capacity */
-				v->cargo_cap = AircraftDefaultCargoCapacity(v->cargo_type, v->engine_type);
+				v->cargo_cap = AircraftDefaultCargoCapacity(v->cargo_type, avi);
 			} else {
 				v->cargo_cap = callback;
 			}
@@ -395,7 +393,7 @@
 		VehiclePositionChanged(v);
 		VehiclePositionChanged(u);
 
-		// Aircraft with 3 vehicles (chopper)?
+		/* Aircraft with 3 vehicles (chopper)? */
 		if (v->subtype == AIR_HELICOPTER) {
 			Vehicle *w = vl[2];
 
@@ -445,16 +443,16 @@
 
 /** Sell an aircraft.
  * @param tile unused
+ * @param flags for command type
  * @param p1 vehicle ID to be sold
  * @param p2 unused
+ * @return result of operation.  Error or sold value
  */
 int32 CmdSellAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Aircraft || !CheckOwnership(v->owner)) return CMD_ERROR;
 	if (!IsAircraftInHangarStopped(v)) return_cmd_error(STR_A01B_AIRCRAFT_MUST_BE_STOPPED);
@@ -472,27 +470,26 @@
 
 /** Start/Stop an aircraft.
  * @param tile unused
+ * @param flags for command type
  * @param p1 aircraft ID to start/stop
  * @param p2 unused
+ * @return result of operation.  Nothing if everything went well
  */
 int32 CmdStartStopAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-	uint16 callback;
-
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Aircraft || !CheckOwnership(v->owner)) return CMD_ERROR;
 
-	// cannot stop airplane when in flight, or when taking off / landing
+	/* cannot stop airplane when in flight, or when taking off / landing */
 	if (v->u.air.state >= STARTTAKEOFF && v->u.air.state < TERM7)
 		return_cmd_error(STR_A017_AIRCRAFT_IS_IN_FLIGHT);
 
 	/* Check if this aircraft can be started/stopped. The callback will fail or
 	 * return 0xFF if it can. */
-	callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v);
+	uint16 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v);
 	if (callback != CALLBACK_FAILED && callback != 0xFF) {
 		StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback);
 		return_cmd_error(error);
@@ -514,15 +511,15 @@
 
 /** Send an aircraft to the hangar.
  * @param tile unused
+ * @param flags for command type
  * @param p1 vehicle ID to send to the hangar
  * @param p2 various bitmasked elements
  * - p2 bit 0-3 - DEPOT_ flags (see vehicle.h)
  * - p2 bit 8-10 - VLW flag (for mass goto depot)
+ * @return o if everything went well
  */
 int32 CmdSendAircraftToHangar(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-
 	if (p2 & DEPOT_MASS_SEND) {
 		/* Mass goto depot requested */
 		if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR;
@@ -531,7 +528,7 @@
 
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Aircraft || !CheckOwnership(v->owner) || IsAircraftInHangar(v)) return CMD_ERROR;
 
@@ -560,16 +557,12 @@
 		const Station *st = GetStation(next_airport_index);
 		/* If the station is not a valid airport or if it has no hangars */
 		if (!st->IsValid() || st->airport_tile == 0 || st->Airport()->nof_depots == 0) {
-			StationID station;
-
-			// the aircraft has to search for a hangar on its own
-			station = FindNearestHangar(v);
+			/* the aircraft has to search for a hangar on its own */
+			StationID station = FindNearestHangar(v);
 
 			next_airport_has_hangar = false;
 			if (station == INVALID_STATION) return CMD_ERROR;
-			st = GetStation(station);
 			next_airport_index = station;
-
 		}
 
 		if (flags & DC_EXEC) {
@@ -592,36 +585,32 @@
 
 /** Refits an aircraft to the specified cargo type.
  * @param tile unused
+ * @param flags for command type
  * @param p1 vehicle ID of the aircraft to refit
  * @param p2 various bitstuffed elements
  * - p2 = (bit 0-7) - the new cargo type to refit to
  * - p2 = (bit 8-15) - the new cargo subtype to refit to
+ * @return cost of refit or error
  */
 int32 CmdRefitAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-	int pass, mail;
-	int32 cost;
-	CargoID new_cid = GB(p2, 0, 8);
 	byte new_subtype = GB(p2, 8, 8);
-	const AircraftVehicleInfo *avi;
-	uint16 callback = CALLBACK_FAILED;
 
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Aircraft || !CheckOwnership(v->owner)) return CMD_ERROR;
 	if (!IsAircraftInHangarStopped(v)) return_cmd_error(STR_A01B_AIRCRAFT_MUST_BE_STOPPED);
 
-	avi = AircraftVehInfo(v->engine_type);
-
 	/* Check cargo */
+	CargoID new_cid = GB(p2, 0, 8);
 	if (new_cid > NUM_CARGO || !CanRefitTo(v->engine_type, new_cid)) return CMD_ERROR;
 
 	SET_EXPENSES_TYPE(EXPENSES_AIRCRAFT_RUN);
 
 	/* Check the refit capacity callback */
+	uint16 callback = CALLBACK_FAILED;
 	if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
 		/* Back up the existing cargo type */
 		CargoID temp_cid = v->cargo_type;
@@ -636,26 +625,28 @@
 		v->cargo_subtype = temp_subtype;
 	}
 
+	const AircraftVehicleInfo *avi = AircraftVehInfo(v->engine_type);
+
+	uint pass;
 	if (callback == CALLBACK_FAILED) {
 		/* If the callback failed, or wasn't executed, use the aircraft's
 		 * default cargo capacity */
-		pass = AircraftDefaultCargoCapacity(new_cid, v->engine_type);
+		pass = AircraftDefaultCargoCapacity(new_cid, avi);
 	} else {
 		pass = callback;
 	}
 	_returned_refit_capacity = pass;
 
-	cost = 0;
+	int32 cost = 0;
 	if (IsHumanPlayer(v->owner) && new_cid != v->cargo_type) {
 		cost = GetRefitCost(v->engine_type);
 	}
 
 	if (flags & DC_EXEC) {
-		Vehicle *u;
 		v->cargo_cap = pass;
 
-		u = v->next;
-		mail = (new_cid != CT_PASSENGERS) ? 0 : avi->mail_capacity;
+		Vehicle *u = v->next;
+		uint mail = new_cid != CT_PASSENGERS ? 0 : avi->mail_capacity;
 		u->cargo_cap = mail;
 		if (v->cargo_type == new_cid) {
 			v->cargo_count = min(pass, v->cargo_count);
@@ -677,8 +668,6 @@
 
 static void CheckIfAircraftNeedsService(Vehicle *v)
 {
-	const Station* st;
-
 	if (_patches.servint_aircraft == 0) return;
 	if (!VehicleNeedsService(v)) return;
 	if (v->vehstatus & VS_STOPPED) return;
@@ -694,8 +683,8 @@
 		return;
 	}
 
-	st = GetStation(v->current_order.dest);
-	// only goto depot if the target airport has terminals (eg. it is airport)
+	const Station *st = GetStation(v->current_order.dest);
+	/* only goto depot if the target airport has terminals (eg. it is airport) */
 	if (st->IsValid() && st->airport_tile != 0 && st->Airport()->terminals != NULL) {
 //		printf("targetairport = %d, st->index = %d\n", v->u.air.targetairport, st->index);
 //		v->u.air.targetairport = st->index;
@@ -711,8 +700,6 @@
 
 void OnNewDay_Aircraft(Vehicle *v)
 {
-	int32 cost;
-
 	if (!IsNormalAircraft(v)) return;
 
 	if ((++v->day_counter & 7) == 0) DecreaseVehicleValue(v);
@@ -725,7 +712,7 @@
 
 	if (v->vehstatus & VS_STOPPED) return;
 
-	cost = AircraftVehInfo(v->engine_type)->running_cost * _price.aircraft_running / 364;
+	int32 cost = AircraftVehInfo(v->engine_type)->running_cost * _price.aircraft_running / 364;
 
 	v->profit_this_year -= cost >> 8;
 
@@ -761,16 +748,12 @@
 
 static void HelicopterTickHandler(Vehicle *v)
 {
-	Vehicle *u;
-	int tick,spd;
-	SpriteID img;
-
-	u = v->next->next;
+	Vehicle *u = v->next->next;
 
 	if (u->vehstatus & VS_HIDDEN) return;
 
-	// if true, helicopter rotors do not rotate. This should only be the case if a helicopter is
-	// loading/unloading at a terminal or stopped
+	/* if true, helicopter rotors do not rotate. This should only be the case if a helicopter is
+	 * loading/unloading at a terminal or stopped */
 	if (v->current_order.type == OT_LOADING || (v->vehstatus & VS_STOPPED)) {
 		if (u->cur_speed != 0) {
 			u->cur_speed++;
@@ -786,9 +769,10 @@
 			u->cur_speed--;
 	}
 
-	tick = ++u->tick_counter;
-	spd = u->cur_speed >> 4;
+	int tick = ++u->tick_counter;
+	int spd = u->cur_speed >> 4;
 
+	SpriteID img;
 	if (spd == 0) {
 		u->u.air.state = HRS_ROTOR_STOPPED;
 		img = GetRotorImage(v);
@@ -811,10 +795,6 @@
 
 static void SetAircraftPosition(Vehicle *v, int x, int y, int z)
 {
-	Vehicle *u;
-	int safe_x;
-	int safe_y;
-
 	v->x_pos = x;
 	v->y_pos = y;
 	v->z_pos = z;
@@ -826,10 +806,10 @@
 	VehiclePositionChanged(v);
 	EndVehicleMove(v);
 
-	u = v->next;
+	Vehicle *u = v->next;
 
-	safe_x = clamp(x, 0, MapMaxX() * TILE_SIZE);
-	safe_y = clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
+	int safe_x = clamp(x, 0, MapMaxX() * TILE_SIZE);
+	int safe_y = clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
 	u->x_pos = x;
 	u->y_pos = y - ((v->z_pos-GetSlopeZ(safe_x, safe_y)) >> 3);;
 
@@ -858,12 +838,10 @@
  */
 void HandleAircraftEnterHangar(Vehicle *v)
 {
-	Vehicle *u;
-
 	v->subspeed = 0;
 	v->progress = 0;
 
-	u = v->next;
+	Vehicle *u = v->next;
 	u->vehstatus |= VS_HIDDEN;
 	u = u->next;
 	if (u != NULL) {
@@ -898,10 +876,10 @@
 	if (speed_limit == SPEED_LIMIT_NONE) speed_limit = v->max_speed;
 	spd = min(v->cur_speed + (spd >> 8) + (v->subspeed < t), speed_limit);
 
-	// adjust speed for broken vehicles
+	/* adjust speed for broken vehicles */
 	if (v->vehstatus & VS_AIRCRAFT_BROKEN) spd = min(spd, SPEED_LIMIT_BROKEN);
 
-	//updates statusbar only if speed have changed to save CPU time
+	/* updates statusbar only if speed have changed to save CPU time */
 	if (spd != v->cur_speed) {
 		v->cur_speed = spd;
 		if (_patches.vehicle_speed)
@@ -937,7 +915,13 @@
 	 * other by providing them with vertical seperation
 	 */
 	switch (v->direction) {
-		case DIR_N: case DIR_NE: case DIR_E: case DIR_SE: base_altitude += 15; break;
+		case DIR_N:
+		case DIR_NE:
+		case DIR_E:
+		case DIR_SE:
+			base_altitude += 15;
+			break;
+
 		default: break;
 	}
 
@@ -949,35 +933,23 @@
 
 static bool AircraftController(Vehicle *v)
 {
-	Station *st;
-	Vehicle *u;
-	byte z, maxz, curz;
-	Direction newdir;
-	GetNewVehiclePosResult gp;
-	uint dist;
-	int x,y;
-
-	st = GetStation(v->u.air.targetairport);
+	const Station *st = GetStation(v->u.air.targetairport);
 
-	// prevent going to 0,0 if airport is deleted.
-	{
-		TileIndex tile = st->airport_tile;
+	/* prevent going to 0,0 if airport is deleted. */
+	TileIndex tile = st->airport_tile;
+	if (tile == 0) tile = st->xy;
+	int x = TileX(tile) * TILE_SIZE;
+	int y = TileY(tile) * TILE_SIZE;
 
-		if (tile == 0) tile = st->xy;
-		// xy of destination
-		x = TileX(tile) * TILE_SIZE;
-		y = TileY(tile) * TILE_SIZE;
-	}
-
-	// get airport moving data
+	/*  get airport moving data */
 	const AirportFTAClass *afc = st->Airport();
 	const AirportMovingData *amd = afc->MovingData(v->u.air.pos);
 
-	// Helicopter raise
+	/* Helicopter raise */
 	if (amd->flag & AMED_HELI_RAISE) {
-		u = v->next->next;
+		Vehicle *u = v->next->next;
 
-		// Make sure the rotors don't rotate too fast
+		/* Make sure the rotors don't rotate too fast */
 		if (u->cur_speed > 32) {
 			v->cur_speed = 0;
 			if (--u->cur_speed == 32) SndPlayVehicleFx(SND_18_HELICOPTER, v);
@@ -986,7 +958,7 @@
 			if (UpdateAircraftSpeed(v, SPEED_LIMIT_NONE)) {
 				v->tile = 0;
 
-				// Reached altitude?
+				/* Reached altitude? */
 				if (v->z_pos >= 184) {
 					v->cur_speed = 0;
 					return true;
@@ -997,28 +969,28 @@
 		return false;
 	}
 
-	// Helicopter landing.
+	/* Helicopter landing. */
 	if (amd->flag & AMED_HELI_LOWER) {
 		if (UpdateAircraftSpeed(v, SPEED_LIMIT_NONE)) {
 			if (st->airport_tile == 0) {
-				// FIXME - AircraftController -> if station no longer exists, do not land
-				// helicopter will circle until sign disappears, then go to next order
-				// * what to do when it is the only order left, right now it just stays in 1 place
+				/* FIXME - AircraftController -> if station no longer exists, do not land
+				 * helicopter will circle until sign disappears, then go to next order
+				 * what to do when it is the only order left, right now it just stays in 1 place */
 				v->u.air.state = FLYING;
 				AircraftNextAirportPos_and_Order(v);
 				return false;
 			}
 
-			// Vehicle is now at the airport.
+			/* Vehicle is now at the airport. */
 			v->tile = st->airport_tile;
 
-			// Find altitude of landing position.
-			z = GetSlopeZ(x, y) + 1 + afc->delta_z;
+			/* Find altitude of landing position. */
+			uint z = GetSlopeZ(x, y) + 1 + afc->delta_z;
 
 			if (z == v->z_pos) {
-				u = v->next->next;
+				Vehicle *u = v->next->next;
 
-				// Increase speed of rotors. When speed is 80, we've landed.
+				/*  Increase speed of rotors. When speed is 80, we've landed. */
 				if (u->cur_speed >= 80) return true;
 				u->cur_speed += 4;
 			} else if (v->z_pos > z) {
@@ -1030,21 +1002,19 @@
 		return false;
 	}
 
-	// Get distance from destination pos to current pos.
-	dist = myabs(x + amd->x - v->x_pos) +  myabs(y + amd->y - v->y_pos);
+	/* Get distance from destination pos to current pos. */
+	uint dist = myabs(x + amd->x - v->x_pos) +  myabs(y + amd->y - v->y_pos);
 
-	// Need exact position?
+	/* Need exact position? */
 	if (!(amd->flag & AMED_EXACTPOS) && dist <= (amd->flag & AMED_SLOWTURN ? 8U : 4U))
 		return true;
 
-	// At final pos?
+	/* At final pos? */
 	if (dist == 0) {
-		DirDiff dirdiff;
-
-		// Change direction smoothly to final direction.
-		dirdiff = DirDifference(amd->direction, v->direction);
-		// if distance is 0, and plane points in right direction, no point in calling
-		// UpdateAircraftSpeed(). So do it only afterwards
+		/* Change direction smoothly to final direction. */
+		DirDiff dirdiff = DirDifference(amd->direction, v->direction);
+		/* if distance is 0, and plane points in right direction, no point in calling
+		 * UpdateAircraftSpeed(). So do it only afterwards */
 		if (dirdiff == DIRDIFF_SAME) {
 			v->cur_speed = 0;
 			return true;
@@ -1063,8 +1033,8 @@
 
 	if (v->load_unload_time_rem != 0) v->load_unload_time_rem--;
 
-	// Turn. Do it slowly if in the air.
-	newdir = GetDirectionTowards(v, x + amd->x, y + amd->y);
+	/* Turn. Do it slowly if in the air. */
+	Direction newdir = GetDirectionTowards(v, x + amd->x, y + amd->y);
 	if (newdir != v->direction) {
 		if (amd->flag & AMED_SLOWTURN) {
 			if (v->load_unload_time_rem == 0) v->load_unload_time_rem = 8;
@@ -1075,32 +1045,30 @@
 		}
 	}
 
-	// Move vehicle.
-	GetNewVehiclePos(v, &gp);
+	/* Move vehicle. */
+	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	v->tile = gp.new_tile;
 
-	// If vehicle is in the air, use tile coordinate 0.
+	/* If vehicle is in the air, use tile coordinate 0. */
 	if (amd->flag & (AMED_TAKEOFF | AMED_SLOWTURN | AMED_LAND)) v->tile = 0;
 
-	// Adjust Z for land or takeoff?
-	z = v->z_pos;
+	/* Adjust Z for land or takeoff? */
+	uint z = v->z_pos;
 
 	if (amd->flag & AMED_TAKEOFF) {
-		z += 2;
-		maxz = GetAircraftFlyingAltitude(v);
-		if (z > maxz) z = maxz;
+		z = min(z + 2, GetAircraftFlyingAltitude(v));
 	}
 
 	if (amd->flag & AMED_LAND) {
 		if (st->airport_tile == 0) {
 			v->u.air.state = FLYING;
 			AircraftNextAirportPos_and_Order(v);
-			// get aircraft back on running altitude
+			/* get aircraft back on running altitude */
 			SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlyingAltitude(v));
 			return false;
 		}
 
-		curz = GetSlopeZ(x, y) + 1;
+		uint curz = GetSlopeZ(x, y) + 1;
 
 		if (curz > z) {
 			z++;
@@ -1112,9 +1080,9 @@
 		}
 	}
 
-	// We've landed. Decrase speed when we're reaching end of runway.
+	/* We've landed. Decrase speed when we're reaching end of runway. */
 	if (amd->flag & AMED_BRAKE) {
-		curz = GetSlopeZ(x, y) + 1;
+		uint curz = GetSlopeZ(x, y) + 1;
 
 		if (z > curz) {
 			z--;
@@ -1132,17 +1100,13 @@
 
 static void HandleCrashedAircraft(Vehicle *v)
 {
-	uint32 r;
-	Station *st;
-	int z;
-
 	v->u.air.crashed_counter++;
 
-	st = GetStation(v->u.air.targetairport);
+	Station *st = GetStation(v->u.air.targetairport);
 
-	// make aircraft crash down to the ground
+	/* make aircraft crash down to the ground */
 	if (v->u.air.crashed_counter < 500 && st->airport_tile==0 && ((v->u.air.crashed_counter % 3) == 0) ) {
-		z = GetSlopeZ(v->x_pos, v->y_pos);
+		uint z = GetSlopeZ(v->x_pos, v->y_pos);
 		v->z_pos -= 1;
 		if (v->z_pos == z) {
 			v->u.air.crashed_counter = 500;
@@ -1151,6 +1115,7 @@
 	}
 
 	if (v->u.air.crashed_counter < 650) {
+		uint32 r;
 		if (CHANCE16R(1,32,r)) {
 			static const DirDiff delta[] = {
 				DIRDIFF_45LEFT, DIRDIFF_SAME, DIRDIFF_SAME, DIRDIFF_45RIGHT
@@ -1166,14 +1131,14 @@
 				EV_EXPLOSION_SMALL);
 		}
 	} else if (v->u.air.crashed_counter >= 10000) {
-		// remove rubble of crashed airplane
+		/*  remove rubble of crashed airplane */
 
-		// clear runway-in on all airports, set by crashing plane
-		// small airports use AIRPORT_BUSY, city airports use RUNWAY_IN_OUT_block, etc.
-		// but they all share the same number
+		/* clear runway-in on all airports, set by crashing plane
+		 * small airports use AIRPORT_BUSY, city airports use RUNWAY_IN_OUT_block, etc.
+		 * but they all share the same number */
 		CLRBITS(st->airport_flags, RUNWAY_IN_block);
 		CLRBITS(st->airport_flags, RUNWAY_IN_OUT_block); // commuter airport
-		CLRBITS(st->airport_flags, RUNWAY_IN2_block); // intercontinental
+		CLRBITS(st->airport_flags, RUNWAY_IN2_block);    // intercontinental
 
 		BeginVehicleMove(v);
 		EndVehicleMove(v);
@@ -1232,8 +1197,6 @@
 
 static void ProcessAircraftOrder(Vehicle *v)
 {
-	const Order *order;
-
 	switch (v->current_order.type) {
 		case OT_GOTO_DEPOT:
 			if (!(v->current_order.flags & OF_PART_OF_ORDERS)) return;
@@ -1250,7 +1213,7 @@
 
 	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
 
-	order = GetVehicleOrder(v, v->cur_order_index);
+	const Order *order = GetVehicleOrder(v, v->cur_order_index);
 
 	if (order == NULL) {
 		v->current_order.type = OT_NOTHING;
@@ -1267,7 +1230,7 @@
 
 	v->current_order = *order;
 
-	// orders are changed in flight, ensure going to the right station
+	/* orders are changed in flight, ensure going to the right station */
 	if (order->type == OT_GOTO_STATION && v->u.air.state == FLYING) {
 		AircraftNextAirportPos_and_Order(v);
 	}
@@ -1325,10 +1288,6 @@
 
 static void CrashAirplane(Vehicle *v)
 {
-	uint16 amt;
-	Station *st;
-	StringID newsitem;
-
 	v->vehstatus |= VS_CRASHED;
 	v->u.air.crashed_counter = 0;
 
@@ -1336,13 +1295,14 @@
 
 	InvalidateWindow(WC_VEHICLE_VIEW, v->index);
 
-	amt = 2;
+	uint amt = 2;
 	if (v->cargo_type == CT_PASSENGERS) amt += v->cargo_count;
 	SetDParam(0, amt);
 
 	v->cargo_count = 0;
 	v->next->cargo_count = 0;
-	st = GetStation(v->u.air.targetairport);
+	const Station *st = GetStation(v->u.air.targetairport);
+	StringID newsitem;
 	if (st->airport_tile == 0) {
 		newsitem = STR_PLANE_CRASH_OUT_OF_FUEL;
 	} else {
@@ -1361,14 +1321,10 @@
 
 static void MaybeCrashAirplane(Vehicle *v)
 {
-	Station *st;
-	uint16 prob;
-	uint i;
+	Station *st = GetStation(v->u.air.targetairport);
 
-	st = GetStation(v->u.air.targetairport);
-
-	//FIXME -- MaybeCrashAirplane -> increase crashing chances of very modern airplanes on smaller than AT_METROPOLITAN airports
-	prob = 0x10000 / 1500;
+	/* FIXME -- MaybeCrashAirplane -> increase crashing chances of very modern airplanes on smaller than AT_METROPOLITAN airports */
+	uint16 prob = 0x10000 / 1500;
 	if (st->Airport()->flags & AirportFTAClass::SHORT_STRIP &&
 			AircraftVehInfo(v->engine_type)->subtype & AIR_FAST &&
 			!_cheats.no_jetcrash.value) {
@@ -1377,8 +1333,8 @@
 
 	if (GB(Random(), 0, 16) > prob) return;
 
-	// Crash the airplane. Remove all goods stored at the station.
-	for (i = 0; i != NUM_CARGO; i++) {
+	/* Crash the airplane. Remove all goods stored at the station. */
+	for (uint i = 0; i != NUM_CARGO; i++) {
 		st->goods[i].rating = 1;
 		SB(st->goods[i].waiting_acceptance, 0, 12, 0);
 	}
@@ -1386,15 +1342,12 @@
 	CrashAirplane(v);
 }
 
-// we've landed and just arrived at a terminal
+/** we've landed and just arrived at a terminal */
 static void AircraftEntersTerminal(Vehicle *v)
 {
-	Station *st;
-	Order old_order;
-
 	if (v->current_order.type == OT_GOTO_DEPOT) return;
 
-	st = GetStation(v->u.air.targetairport);
+	Station *st = GetStation(v->u.air.targetairport);
 	v->last_station_visited = v->u.air.targetairport;
 
 	/* Check if station was ever visited before */
@@ -1403,7 +1356,7 @@
 
 		st->had_vehicle_of_type |= HVOT_AIRCRAFT;
 		SetDParam(0, st->index);
-		// show newsitem of celebrating citizens
+		/* show newsitem of celebrating citizens */
 		flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
 		AddNewsItem(
 			STR_A033_CITIZENS_CELEBRATE_FIRST,
@@ -1412,7 +1365,7 @@
 			0);
 	}
 
-	old_order = v->current_order;
+	Order old_order = v->current_order;
 	v->BeginLoading();
 	v->current_order.flags = 0;
 
@@ -1480,7 +1433,7 @@
 }
 
 
-// set the right pos when heading to other airports after takeoff
+/** set the right pos when heading to other airports after takeoff */
 static void AircraftNextAirportPos_and_Order(Vehicle *v)
 {
 	if (v->current_order.type == OT_GOTO_STATION ||
@@ -1502,7 +1455,7 @@
 		Vehicle *u = v->next;
 		u->vehstatus &= ~VS_HIDDEN;
 
-		// Rotor blades
+		/* Rotor blades */
 		u = u->next;
 		if (u != NULL) {
 			u->vehstatus &= ~VS_HIDDEN;
@@ -1532,16 +1485,16 @@
 	v->u.air.state = apc->layout[v->u.air.pos].heading;
 }
 
-// In an Airport Hangar
+/** In an Airport Hangar */
 static void AircraftEventHandler_InHangar(Vehicle *v, const AirportFTAClass *apc)
 {
-	// if we just arrived, execute EnterHangar first
+	/* if we just arrived, execute EnterHangar first */
 	if (v->u.air.previous_pos != v->u.air.pos) {
 		AircraftEventHandler_EnterHangar(v, apc);
 		return;
 	}
 
-	// if we were sent to the depot, stay there
+	/* if we were sent to the depot, stay there */
 	if (v->current_order.type == OT_GOTO_DEPOT && (v->vehstatus & VS_STOPPED)) {
 		v->current_order.type = OT_NOTHING;
 		v->current_order.flags = 0;
@@ -1552,37 +1505,37 @@
 			v->current_order.type != OT_GOTO_DEPOT)
 		return;
 
-	// if the block of the next position is busy, stay put
+	/* if the block of the next position is busy, stay put */
 	if (AirportHasBlock(v, &apc->layout[v->u.air.pos], apc)) return;
 
-	// We are already at the target airport, we need to find a terminal
+	/* We are already at the target airport, we need to find a terminal */
 	if (v->current_order.dest == v->u.air.targetairport) {
-		// FindFreeTerminal:
-		// 1. Find a free terminal, 2. Occupy it, 3. Set the vehicle's state to that terminal
+		/* FindFreeTerminal:
+		 * 1. Find a free terminal, 2. Occupy it, 3. Set the vehicle's state to that terminal */
 		if (v->subtype == AIR_HELICOPTER) {
 			if (!AirportFindFreeHelipad(v, apc)) return; // helicopter
 		} else {
 			if (!AirportFindFreeTerminal(v, apc)) return; // airplane
 		}
 	} else { // Else prepare for launch.
-		// airplane goto state takeoff, helicopter to helitakeoff
+		/* airplane goto state takeoff, helicopter to helitakeoff */
 		v->u.air.state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
 	}
 	AircraftLeaveHangar(v);
 	AirportMove(v, apc);
 }
 
-// At one of the Airport's Terminals
+/** At one of the Airport's Terminals */
 static void AircraftEventHandler_AtTerminal(Vehicle *v, const AirportFTAClass *apc)
 {
-	// if we just arrived, execute EnterTerminal first
+	/* if we just arrived, execute EnterTerminal first */
 	if (v->u.air.previous_pos != v->u.air.pos) {
 		AircraftEventHandler_EnterTerminal(v, apc);
-		// on an airport with helipads, a helicopter will always land there
-		// and get serviced at the same time - patch setting
+		/* on an airport with helipads, a helicopter will always land there
+		 * and get serviced at the same time - patch setting */
 		if (_patches.serviceathelipad) {
 			if (v->subtype == AIR_HELICOPTER && apc->helipads != NULL) {
-				// an exerpt of ServiceAircraft, without the invisibility stuff
+				/* an exerpt of ServiceAircraft, without the invisibility stuff */
 				v->date_of_last_service = _date;
 				v->breakdowns_since_last_service = 0;
 				v->reliability = GetEngine(v->engine_type)->reliability;
@@ -1594,15 +1547,15 @@
 
 	if (v->current_order.type == OT_NOTHING) return;
 
-	// if the block of the next position is busy, stay put
+	/* if the block of the next position is busy, stay put */
 	if (AirportHasBlock(v, &apc->layout[v->u.air.pos], apc)) return;
 
-	// airport-road is free. We either have to go to another airport, or to the hangar
-	// ---> start moving
+	/* airport-road is free. We either have to go to another airport, or to the hangar
+	 * ---> start moving */
 
 	switch (v->current_order.type) {
 		case OT_GOTO_STATION: // ready to fly to another airport
-			// airplane goto state takeoff, helicopter to helitakeoff
+			/* airplane goto state takeoff, helicopter to helitakeoff */
 			v->u.air.state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
 			break;
 		case OT_GOTO_DEPOT:   // visit hangar for serivicing, sale, etc.
@@ -1625,7 +1578,8 @@
 	assert("OK, you shouldn't be here, check your Airport Scheme!" && 0);
 }
 
-static void AircraftEventHandler_TakeOff(Vehicle *v, const AirportFTAClass *apc) {
+static void AircraftEventHandler_TakeOff(Vehicle *v, const AirportFTAClass *apc)
+{
 	PlayAircraftSound(v); // play takeoffsound for airplanes
 	v->u.air.state = STARTTAKEOFF;
 }
@@ -1639,7 +1593,7 @@
 static void AircraftEventHandler_EndTakeOff(Vehicle *v, const AirportFTAClass *apc)
 {
 	v->u.air.state = FLYING;
-	// get the next position to go to, differs per airport
+	/* get the next position to go to, differs per airport */
 	AircraftNextAirportPos_and_Order(v);
 }
 
@@ -1648,11 +1602,11 @@
 	const Player* p = GetPlayer(v->owner);
 	v->sprite_width = v->sprite_height = 24; // ??? no idea what this is
 	v->u.air.state = FLYING;
-	// get the next position to go to, differs per airport
+	/* get the next position to go to, differs per airport */
 	AircraftNextAirportPos_and_Order(v);
 
-	// check if the aircraft needs to be replaced or renewed and send it to a hangar if needed
-	// unless it is due for renewal but the engine is no longer available
+	/* check if the aircraft needs to be replaced or renewed and send it to a hangar if needed
+	 * unless it is due for renewal but the engine is no longer available */
 	if (v->owner == _local_player && (
 				EngineHasReplacementForPlayer(p, v->engine_type) ||
 				((p->engine_renew && v->age - v->max_age > p->engine_renew_months * 30) &&
@@ -1666,33 +1620,29 @@
 
 static void AircraftEventHandler_Flying(Vehicle *v, const AirportFTAClass *apc)
 {
-	Station *st;
-	byte landingtype;
-	AirportFTA *current;
-	uint16 tcur_speed, tsubspeed;
+	Station *st = GetStation(v->u.air.targetairport);
 
-	st = GetStation(v->u.air.targetairport);
-	// runway busy or not allowed to use this airstation, circle
+	/* runway busy or not allowed to use this airstation, circle */
 	if (apc->flags & (v->subtype == AIR_HELICOPTER ? AirportFTAClass::HELICOPTERS : AirportFTAClass::AIRPLANES) &&
 			st->airport_tile != 0 &&
 			(st->owner == OWNER_NONE || st->owner == v->owner)) {
 		// {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
 		// if it is an airplane, look for LANDING, for helicopter HELILANDING
 		// it is possible to choose from multiple landing runways, so loop until a free one is found
-		landingtype = (v->subtype == AIR_HELICOPTER) ? HELILANDING : LANDING;
-		current = apc->layout[v->u.air.pos].next;
+		byte landingtype = (v->subtype == AIR_HELICOPTER) ? HELILANDING : LANDING;
+		const AirportFTA *current = apc->layout[v->u.air.pos].next;
 		while (current != NULL) {
 			if (current->heading == landingtype) {
-				// save speed before, since if AirportHasBlock is false, it resets them to 0
-				// we don't want that for plane in air
-				// hack for speed thingie
-				tcur_speed = v->cur_speed;
-				tsubspeed = v->subspeed;
+				/* save speed before, since if AirportHasBlock is false, it resets them to 0
+				 * we don't want that for plane in air
+				 * hack for speed thingie */
+				uint16 tcur_speed = v->cur_speed;
+				uint16 tsubspeed = v->subspeed;
 				if (!AirportHasBlock(v, current, apc)) {
 					v->u.air.state = landingtype; // LANDING / HELILANDING
-					// it's a bit dirty, but I need to set position to next position, otherwise
-					// if there are multiple runways, plane won't know which one it took (because
-					// they all have heading LANDING). And also occupy that block!
+					/* it's a bit dirty, but I need to set position to next position, otherwise
+					 * if there are multiple runways, plane won't know which one it took (because
+					 * they all have heading LANDING). And also occupy that block! */
 					v->u.air.pos = current->next_position;
 					SETBITS(st->airport_flags, apc->layout[v->u.air.pos].block);
 					return;
@@ -1709,15 +1659,15 @@
 
 static void AircraftEventHandler_Landing(Vehicle *v, const AirportFTAClass *apc)
 {
-	const Player* p = GetPlayer(v->owner);
 	AircraftLandAirplane(v);  // maybe crash airplane
 	v->u.air.state = ENDLANDING;
-	// check if the aircraft needs to be replaced or renewed and send it to a hangar if needed
+	/* check if the aircraft needs to be replaced or renewed and send it to a hangar if needed */
 	if (v->current_order.type != OT_GOTO_DEPOT && v->owner == _local_player) {
-		// only the vehicle owner needs to calculate the rest (locally)
+		/* only the vehicle owner needs to calculate the rest (locally) */
+		const Player* p = GetPlayer(v->owner);
 		if (EngineHasReplacementForPlayer(p, v->engine_type) ||
 			(p->engine_renew && v->age - v->max_age > (p->engine_renew_months * 30))) {
-			// send the aircraft to the hangar at next airport
+			/* send the aircraft to the hangar at next airport */
 			_current_player = _local_player;
 			DoCommandP(v->tile, v->index, DEPOT_SERVICE, NULL, CMD_SEND_AIRCRAFT_TO_HANGAR | CMD_SHOW_NO_ERROR);
 			_current_player = OWNER_NONE;
@@ -1733,13 +1683,13 @@
 
 static void AircraftEventHandler_EndLanding(Vehicle *v, const AirportFTAClass *apc)
 {
-	// next block busy, don't do a thing, just wait
+	/* next block busy, don't do a thing, just wait */
 	if (AirportHasBlock(v, &apc->layout[v->u.air.pos], apc)) return;
 
-	// if going to terminal (OT_GOTO_STATION) choose one
-	// 1. in case all terminals are busy AirportFindFreeTerminal() returns false or
-	// 2. not going for terminal (but depot, no order),
-	// --> get out of the way to the hangar.
+	/* if going to terminal (OT_GOTO_STATION) choose one
+	 * 1. in case all terminals are busy AirportFindFreeTerminal() returns false or
+	 * 2. not going for terminal (but depot, no order),
+	 * --> get out of the way to the hangar. */
 	if (v->current_order.type == OT_GOTO_STATION) {
 		if (AirportFindFreeTerminal(v, apc)) return;
 	}
@@ -1749,16 +1699,16 @@
 
 static void AircraftEventHandler_HeliEndLanding(Vehicle *v, const AirportFTAClass *apc)
 {
-	// next block busy, don't do a thing, just wait
+	/*  next block busy, don't do a thing, just wait */
 	if (AirportHasBlock(v, &apc->layout[v->u.air.pos], apc)) return;
 
-	// if going to helipad (OT_GOTO_STATION) choose one. If airport doesn't have helipads, choose terminal
-	// 1. in case all terminals/helipads are busy (AirportFindFreeHelipad() returns false) or
-	// 2. not going for terminal (but depot, no order),
-	// --> get out of the way to the hangar IF there are terminals on the airport.
-	// --> else TAKEOFF
-	// the reason behind this is that if an airport has a terminal, it also has a hangar. Airplanes
-	// must go to a hangar.
+	/* if going to helipad (OT_GOTO_STATION) choose one. If airport doesn't have helipads, choose terminal
+	 * 1. in case all terminals/helipads are busy (AirportFindFreeHelipad() returns false) or
+	 * 2. not going for terminal (but depot, no order),
+	 * --> get out of the way to the hangar IF there are terminals on the airport.
+	 * --> else TAKEOFF
+	 * the reason behind this is that if an airport has a terminal, it also has a hangar. Airplanes
+	 * must go to a hangar. */
 	if (v->current_order.type == OT_GOTO_STATION) {
 		if (AirportFindFreeHelipad(v, apc)) return;
 	}
@@ -1794,7 +1744,7 @@
 
 static void AirportClearBlock(const Vehicle *v, const AirportFTAClass *apc)
 {
-	// we have left the previous block, and entered the new one. Free the previous block
+	/* we have left the previous block, and entered the new one. Free the previous block */
 	if (apc->layout[v->u.air.previous_pos].block != apc->layout[v->u.air.pos].block) {
 		Station *st = GetStation(v->u.air.targetairport);
 
@@ -1802,31 +1752,30 @@
 	}
 }
 
-static void AirportGoToNextPosition(Vehicle *v, const AirportFTAClass *apc)
+static void AirportGoToNextPosition(Vehicle *v)
 {
-	// if aircraft is not in position, wait until it is
+	/* if aircraft is not in position, wait until it is */
 	if (!AircraftController(v)) return;
 
+	const AirportFTAClass *apc = GetStation(v->u.air.targetairport)->Airport();
+
 	AirportClearBlock(v, apc);
 	AirportMove(v, apc); // move aircraft to next position
 }
 
-// gets pos from vehicle and next orders
+/* gets pos from vehicle and next orders */
 static bool AirportMove(Vehicle *v, const AirportFTAClass *apc)
 {
-	AirportFTA *current;
-	byte prev_pos;
-
-	// error handling
+	/* error handling */
 	if (v->u.air.pos >= apc->nofelements) {
 		DEBUG(misc, 0, "[Ap] position %d is not valid for current airport. Max position is %d", v->u.air.pos, apc->nofelements-1);
 		assert(v->u.air.pos < apc->nofelements);
 	}
 
-	current = &apc->layout[v->u.air.pos];
-	// we have arrived in an important state (eg terminal, hangar, etc.)
+	const AirportFTA *current = &apc->layout[v->u.air.pos];
+	/* we have arrived in an important state (eg terminal, hangar, etc.) */
 	if (current->heading == v->u.air.state) {
-		prev_pos = v->u.air.pos; // location could be changed in state, so save it before-hand
+		byte prev_pos = v->u.air.pos; // location could be changed in state, so save it before-hand
 		_aircraft_state_handlers[v->u.air.state](v, apc);
 		if (v->u.air.state != FLYING) v->u.air.previous_pos = prev_pos;
 		return true;
@@ -1834,7 +1783,7 @@
 
 	v->u.air.previous_pos = v->u.air.pos; // save previous location
 
-	// there is only one choice to move to
+	/* there is only one choice to move to */
 	if (current->next == NULL) {
 		if (AirportSetBlocks(v, current, apc)) {
 			v->u.air.pos = current->next_position;
@@ -1842,8 +1791,8 @@
 		return false;
 	}
 
-	// there are more choices to choose from, choose the one that
-	// matches our heading
+	/* there are more choices to choose from, choose the one that
+	 * matches our heading */
 	do {
 		if (v->u.air.state == current->heading || current->heading == TO_ALL) {
 			if (AirportSetBlocks(v, current, apc)) {
@@ -1859,18 +1808,18 @@
 	return false;
 }
 
-// returns true if the road ahead is busy, eg. you must wait before proceeding
+/*  returns true if the road ahead is busy, eg. you must wait before proceeding */
 static bool AirportHasBlock(Vehicle *v, const AirportFTA *current_pos, const AirportFTAClass *apc)
 {
 	const AirportFTA *reference = &apc->layout[v->u.air.pos];
 	const AirportFTA *next = &apc->layout[current_pos->next_position];
 
-	// same block, then of course we can move
+	/* same block, then of course we can move */
 	if (apc->layout[current_pos->position].block != next->block) {
 		const Station *st = GetStation(v->u.air.targetairport);
 		uint64 airport_flags = next->block;
 
-		// check additional possible extra blocks
+		/* check additional possible extra blocks */
 		if (current_pos != reference && current_pos->block != NOTHING_block) {
 			airport_flags |= current_pos->block;
 		}
@@ -1884,19 +1833,24 @@
 	return false;
 }
 
-// returns true on success. Eg, next block was free and we have occupied it
-static bool AirportSetBlocks(Vehicle *v, AirportFTA *current_pos, const AirportFTAClass *apc)
+/**
+ * ...
+ * @param v airplane that requires the operation
+ * @param currentpos of the vehicle in the list of blocks
+ * @param apc airport on which block is requsted to be set
+ * @returns true on success. Eg, next block was free and we have occupied it
+ */
+static bool AirportSetBlocks(Vehicle *v, const AirportFTA *current_pos, const AirportFTAClass *apc)
 {
-	AirportFTA *next = &apc->layout[current_pos->next_position];
-	AirportFTA *reference = &apc->layout[v->u.air.pos];
+	const AirportFTA *next = &apc->layout[current_pos->next_position];
+	const AirportFTA *reference = &apc->layout[v->u.air.pos];
 
-	// if the next position is in another block, check it and wait until it is free
+	/* if the next position is in another block, check it and wait until it is free */
 	if ((apc->layout[current_pos->position].block & next->block) != next->block) {
 		uint64 airport_flags = next->block;
-		Station* st = GetStation(v->u.air.targetairport);
-		//search for all all elements in the list with the same state, and blocks != N
-		// this means more blocks should be checked/set
-			AirportFTA *current = current_pos;
+		/* search for all all elements in the list with the same state, and blocks != N
+		 * this means more blocks should be checked/set */
+		const AirportFTA *current = current_pos;
 		if (current == reference) current = current->next;
 		while (current != NULL) {
 			if (current->heading == current_pos->heading && current->block != 0) {
@@ -1906,10 +1860,11 @@
 			current = current->next;
 		};
 
-		// if the block to be checked is in the next position, then exclude that from
-		// checking, because it has been set by the airplane before
+		/* if the block to be checked is in the next position, then exclude that from
+		 * checking, because it has been set by the airplane before */
 		if (current_pos->block == next->block) airport_flags ^= next->block;
 
+		Station* st = GetStation(v->u.air.targetairport);
 		if (HASBITS(st->airport_flags, airport_flags)) {
 			v->cur_speed = 0;
 			v->subspeed = 0;
@@ -1928,7 +1883,7 @@
 	Station *st = GetStation(v->u.air.targetairport);
 	for (; i < last_terminal; i++) {
 		if (!HASBIT(st->airport_flags, _airport_terminal_flag[i])) {
-			// TERMINAL# HELIPAD#
+			/* TERMINAL# HELIPAD# */
 			v->u.air.state = _airport_terminal_state[i]; // start moving to that terminal/helipad
 			SETBIT(st->airport_flags, _airport_terminal_flag[i]); // occupy terminal/helipad
 			return true;
@@ -1940,9 +1895,8 @@
 static uint GetNumTerminals(const AirportFTAClass *apc)
 {
 	uint num = 0;
-	uint i;
 
-	for (i = apc->terminals[0]; i > 0; i--) num += apc->terminals[i];
+	for (uint i = apc->terminals[0]; i > 0; i--) num += apc->terminals[i];
 
 	return num;
 }
@@ -1960,28 +1914,25 @@
 	 * fails, then attempt fails and plane waits
 	 */
 	if (apc->terminals[0] > 1) {
-		Station *st = GetStation(v->u.air.targetairport);
-		AirportFTA *temp = apc->layout[v->u.air.pos].next;
+		const Station *st = GetStation(v->u.air.targetairport);
+		const AirportFTA *temp = apc->layout[v->u.air.pos].next;
 
 		while (temp != NULL) {
 			if (temp->heading == 255) {
 				if (!HASBITS(st->airport_flags, temp->block)) {
-					int target_group;
-					int i;
-					int group_start = 0;
-					int group_end;
+					/* read which group do we want to go to?
+					 * (the first free group) */
+					uint target_group = temp->next_position + 1;
 
-					//read which group do we want to go to?
-					//(the first free group)
-					target_group = temp->next_position + 1;
+					/* at what terminal does the group start?
+					 * that means, sum up all terminals of
+					 * groups with lower number */
+					uint group_start = 0;
+					for (uint i = 1; i < target_group; i++) {
+						group_start += apc->terminals[i];
+					}
 
-					//at what terminal does the group start?
-					//that means, sum up all terminals of
-					//groups with lower number
-					for (i = 1; i < target_group; i++)
-						group_start += apc->terminals[i];
-
-					group_end = group_start + apc->terminals[target_group];
+					uint group_end = group_start + apc->terminals[target_group];
 					if (FreeTerminal(v, group_start, group_end)) return true;
 				}
 			} else {
@@ -1993,16 +1944,15 @@
 		}
 	}
 
-	// if there is only 1 terminalgroup, all terminals are checked (starting from 0 to max)
+	/* if there is only 1 terminalgroup, all terminals are checked (starting from 0 to max) */
 	return FreeTerminal(v, 0, GetNumTerminals(apc));
 }
 
 static uint GetNumHelipads(const AirportFTAClass *apc)
 {
 	uint num = 0;
-	uint i;
 
-	for (i = apc->helipads[0]; i > 0; i--) num += apc->helipads[i];
+	for (uint i = apc->helipads[0]; i > 0; i--) num += apc->helipads[i];
 
 	return num;
 }
@@ -2010,10 +1960,10 @@
 
 static bool AirportFindFreeHelipad(Vehicle *v, const AirportFTAClass *apc)
 {
-	// if an airport doesn't have helipads, use terminals
+	/* if an airport doesn't have helipads, use terminals */
 	if (apc->helipads == NULL) return AirportFindFreeTerminal(v, apc);
 
-	// if there are more helicoptergroups, pick one, just as in AirportFindFreeTerminal()
+	/* if there are more helicoptergroups, pick one, just as in AirportFindFreeTerminal() */
 	if (apc->helipads[0] > 1) {
 		const Station* st = GetStation(v->u.air.targetairport);
 		const AirportFTA* temp = apc->layout[v->u.air.pos].next;
@@ -2021,22 +1971,20 @@
 		while (temp != NULL) {
 			if (temp->heading == 255) {
 				if (!HASBITS(st->airport_flags, temp->block)) {
-					int target_group;
-					int i;
-					int group_start = 0;
-					int group_end;
 
-					//read which group do we want to go to?
-					//(the first free group)
-					target_group = temp->next_position + 1;
+					/* read which group do we want to go to?
+					 * (the first free group) */
+					uint target_group = temp->next_position + 1;
 
-					//at what terminal does the group start?
-					//that means, sum up all terminals of
-					//groups with lower number
-					for (i = 1; i < target_group; i++)
+					/* at what terminal does the group start?
+					 * that means, sum up all terminals of
+					 * groups with lower number */
+					uint group_start = 0;
+					for (uint i = 1; i < target_group; i++) {
 						group_start += apc->helipads[i];
+					}
 
-					group_end = group_start + apc->helipads[target_group];
+					uint group_end = group_start + apc->helipads[target_group];
 					if (FreeTerminal(v, group_start, group_end)) return true;
 				}
 			} else {
@@ -2047,8 +1995,8 @@
 			temp = temp->next;
 		}
 	} else {
-		// only 1 helicoptergroup, check all helipads
-		// The blocks for helipads start after the last terminal (MAX_TERMINALS)
+		/* only 1 helicoptergroup, check all helipads
+		 * The blocks for helipads start after the last terminal (MAX_TERMINALS) */
 		return FreeTerminal(v, MAX_TERMINALS, GetNumHelipads(apc) + MAX_TERMINALS);
 	}
 	return false; // it shouldn't get here anytime, but just to be sure
@@ -2080,20 +2028,18 @@
 
 	if (v->current_order.type >= OT_LOADING) return;
 
-	AirportGoToNextPosition(v, GetStation(v->u.air.targetairport)->Airport());
+	AirportGoToNextPosition(v);
 }
 
 void Aircraft_Tick(Vehicle *v)
 {
-	int i;
-
 	if (!IsNormalAircraft(v)) return;
 
 	if (v->subtype == AIR_HELICOPTER) HelicopterTickHandler(v);
 
 	AgeAircraftCargo(v);
 
-	for (i = 0; i != 6; i++) {
+	for (uint i = 0; i != 6; i++) {
 		AircraftEventHandler(v, i);
 		if (v->type != VEH_Aircraft) // In case it was deleted
 			break;
@@ -2101,23 +2047,21 @@
 }
 
 
-// need to be called to load aircraft from old version
+/** need to be called to load aircraft from old version */
 void UpdateOldAircraft(void)
 {
+	/* set airport_flags to 0 for all airports just to be sure */
 	Station *st;
-	Vehicle *v_oldstyle;
-	GetNewVehiclePosResult gp;
-
-	// set airport_flags to 0 for all airports just to be sure
 	FOR_ALL_STATIONS(st) {
 		st->airport_flags = 0; // reset airport
 	}
 
+	Vehicle *v_oldstyle;
 	FOR_ALL_VEHICLES(v_oldstyle) {
-	// airplane has another vehicle with subtype 4 (shadow), helicopter also has 3 (rotor)
-	// skip those
+	/* airplane has another vehicle with subtype 4 (shadow), helicopter also has 3 (rotor)
+	 * skip those */
 		if (v_oldstyle->type == VEH_Aircraft && IsNormalAircraft(v_oldstyle)) {
-			// airplane in terminal stopped doesn't hurt anyone, so goto next
+			/* airplane in terminal stopped doesn't hurt anyone, so goto next */
 			if (v_oldstyle->vehstatus & VS_STOPPED && v_oldstyle->u.air.state == 0) {
 				v_oldstyle->u.air.state = HANGAR;
 				continue;
@@ -2127,46 +2071,43 @@
 			v_oldstyle->vehstatus &= ~VS_STOPPED; // make airplane moving
 			v_oldstyle->u.air.state = FLYING;
 			AircraftNextAirportPos_and_Order(v_oldstyle); // move it to the entry point of the airport
-			GetNewVehiclePos(v_oldstyle, &gp); // get the position of the plane (to be used for setting)
+			GetNewVehiclePosResult gp = GetNewVehiclePos(v_oldstyle);
 			v_oldstyle->tile = 0; // aircraft in air is tile=0
 
-			// correct speed of helicopter-rotors
+			/* correct speed of helicopter-rotors */
 			if (v_oldstyle->subtype == AIR_HELICOPTER) v_oldstyle->next->next->cur_speed = 32;
 
-			// set new position x,y,z
+			/* set new position x,y,z */
 			SetAircraftPosition(v_oldstyle, gp.x, gp.y, GetAircraftFlyingAltitude(v_oldstyle));
 		}
 	}
 }
 
-void UpdateAirplanesOnNewStation(Station *st)
+void UpdateAirplanesOnNewStation(const Station *st)
 {
-	GetNewVehiclePosResult gp;
+	/* only 1 station is updated per function call, so it is enough to get entry_point once */
+	const AirportFTAClass *ap = st->Airport();
+
 	Vehicle *v;
-	byte takeofftype;
-	uint16 cnt;
-	// only 1 station is updated per function call, so it is enough to get entry_point once
-	const AirportFTAClass *ap = st->Airport();
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_Aircraft && IsNormalAircraft(v)) {
 			if (v->u.air.targetairport == st->index) { // if heading to this airport
 				/* update position of airplane. If plane is not flying, landing, or taking off
-				 *you cannot delete airport, so it doesn't matter
-				 */
+				 *you cannot delete airport, so it doesn't matter */
 				if (v->u.air.state >= FLYING) { // circle around
 					v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, ap);
 					v->u.air.state = FLYING;
-					// landing plane needs to be reset to flying height (only if in pause mode upgrade,
-					// in normal mode, plane is reset in AircraftController. It doesn't hurt for FLYING
-					GetNewVehiclePos(v, &gp);
-					// set new position x,y,z
+					/* landing plane needs to be reset to flying height (only if in pause mode upgrade,
+					 * in normal mode, plane is reset in AircraftController. It doesn't hurt for FLYING */
+					GetNewVehiclePosResult gp = GetNewVehiclePos(v);
+					/* set new position x,y,z */
 					SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlyingAltitude(v));
 				} else {
 					assert(v->u.air.state == ENDTAKEOFF || v->u.air.state == HELITAKEOFF);
-					takeofftype = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : ENDTAKEOFF;
-					// search in airportdata for that heading
-					// easiest to do, since this doesn't happen a lot
-					for (cnt = 0; cnt < ap->nofelements; cnt++) {
+					byte takeofftype = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : ENDTAKEOFF;
+					/* search in airportdata for that heading
+					 * easiest to do, since this doesn't happen a lot */
+					for (uint cnt = 0; cnt < ap->nofelements; cnt++) {
 						if (ap->layout[cnt].heading == takeofftype) {
 							v->u.air.pos = ap->layout[cnt].position;
 							break;
--- a/src/aircraft_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/aircraft_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file aircraft_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "aircraft.h"
--- a/src/airport.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/airport.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file airport.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -288,11 +290,10 @@
  * know one element from the other by differing 'position' identifiers */
 static uint16 AirportGetNofElements(const AirportFTAbuildup *apFA)
 {
-	int i;
 	uint16 nofelements = 0;
 	int temp = apFA[0].position;
 
-	for (i = 0; i < MAX_ELEMENTS; i++) {
+	for (uint i = 0; i < MAX_ELEMENTS; i++) {
 		if (temp != apFA[i].position) {
 			nofelements++;
 			temp = apFA[i].position;
@@ -307,12 +308,11 @@
  * groups there are, and then the number of terminals for each group */
 static byte AirportGetTerminalCount(const byte *terminals, byte *groups)
 {
-	byte i;
 	byte nof_terminals = 0;
 	*groups = 0;
 
 	if (terminals != NULL) {
-		i = terminals[0];
+		uint i = terminals[0];
 		*groups = i;
 		while (i-- > 0) {
 			terminals++;
@@ -326,12 +326,11 @@
 
 static AirportFTA* AirportBuildAutomata(uint nofelements, const AirportFTAbuildup *apFA)
 {
-	AirportFTA *current;
 	AirportFTA *FAutomata = MallocT<AirportFTA>(nofelements);
 	uint16 internalcounter = 0;
 
 	for (uint i = 0; i < nofelements; i++) {
-		current = &FAutomata[i];
+		AirportFTA *current = &FAutomata[i];
 		current->position      = apFA[internalcounter].position;
 		current->heading       = apFA[internalcounter].heading;
 		current->block         = apFA[internalcounter].block;
@@ -349,7 +348,7 @@
 			current->next = newNode;
 			current = current->next;
 			internalcounter++;
-		} // while
+		}
 		current->next = NULL;
 		internalcounter++;
 	}
@@ -365,9 +364,8 @@
 		uint position = layout[i].position;
 		if (position != next_position) return i;
 		const AirportFTA *first = &layout[i];
-		const AirportFTA *current = first;
 
-		for (; current != NULL; current = current->next) {
+		for (const AirportFTA *current = first; current != NULL; current = current->next) {
 			/* A heading must always be valid. The only exceptions are
 			 * - multiple choices as start, identified by a special value of 255
 			 * - terminal group which is identified by a special value of 255 */
@@ -434,9 +432,7 @@
 	if (!full_report) printf("(P = Current Position; NP = Next Position)\n");
 
 	for (uint i = 0; i < nofelements; i++) {
-		const AirportFTA *current = &layout[i];
-
-		for (; current != NULL; current = current->next) {
+		for (const AirportFTA *current = &layout[i]; current != NULL; current = current->next) {
 			if (full_report) {
 				byte heading = (current->heading == 255) ? MAX_HEADINGS + 1 : current->heading;
 				printf("\tPos:%2d NPos:%2d Heading:%15s Block:%2d\n", current->position,
--- a/src/airport.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/airport.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file airport.h Various declarations for airports */
+
 #ifndef AIRPORT_H
 #define AIRPORT_H
 
--- a/src/airport_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/airport_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file airport_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/sprites.h"
--- a/src/airport_movement.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/airport_movement.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file airport_movement.h Heart of the airports and their finite state machines */
+
 #ifndef AIRPORT_MOVEMENT_H
 #define AIRPORT_MOVEMENT_H
 
@@ -406,7 +408,7 @@
 static const TileIndexDiffC _airport_depots_commuter[] = { { 4, 0 } };
 static const byte _airport_terminal_commuter[] = { 1, 3 };
 static const byte _airport_helipad_commuter[] = { 1, 2 };
-static const byte _airport_entries_commuter[] = {7, 7, 7, 7};
+static const byte _airport_entries_commuter[] = {21, 21, 21, 21};
 static const AirportFTAbuildup _airport_fta_commuter[] = {
 	{  0, HANGAR, NOTHING_block, 1 }, { 0, HELITAKEOFF, HELIPAD2_block, 1 }, { 0, 0, 0, 1 },
 	{  1, 255, TAXIWAY_BUSY_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, TAKEOFF, 0, 11 }, { 1, TERM1, TAXIWAY_BUSY_block, 10 }, { 1, TERM2, TAXIWAY_BUSY_block, 10 }, { 1, TERM3, TAXIWAY_BUSY_block, 10 }, { 1, HELIPAD1, TAXIWAY_BUSY_block, 10 }, { 1, HELIPAD2, TAXIWAY_BUSY_block, 10 }, { 1, HELITAKEOFF, TAXIWAY_BUSY_block, 10 }, { 1, 0, 0, 0 },
--- a/src/autoreplace_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/autoreplace_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file autoreplace_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
--- a/src/aystar.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/aystar.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file aystar.cpp */
+
 /*
  * This file has the core function for AyStar
  *  AyStar is a fast pathfinding routine and is used for things like
--- a/src/aystar.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/aystar.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/*
+/** @file aystar.h
  * This file has the header for AyStar
  *  AyStar is a fast pathfinding routine and is used for things like
  *  AI_pathfinding and Train_pathfinding.
--- a/src/bmp.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/bmp.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file bmp.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "gfx.h"
--- a/src/bmp.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/bmp.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file bmp.h */
+
 #ifndef BMP_H
 #define BMP_H
 
--- a/src/bridge.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/bridge.h	Wed Feb 28 00:33:40 2007 +0000
@@ -28,6 +28,11 @@
 extern Bridge _bridge[MAX_BRIDGES];
 
 uint GetBridgeFoundation(Slope tileh, Axis axis);
-uint SetSpeedLimitOnBridge(Vehicle *);
+
+static inline const Bridge *GetBridge(uint i)
+{
+	assert(i < lengthof(_bridge));
+	return &_bridge[i];
+}
 
 #endif /* BRIDGE_H */
--- a/src/bridge_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/bridge_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file bridge_gui.c Graphical user interface for bridge construction*/
+/** @file bridge_gui.cpp Graphical user interface for bridge construction */
 
 #include "stdafx.h"
 #include "openttd.h"
--- a/src/bridge_map.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/bridge_map.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file bridge_map.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
@@ -43,7 +45,7 @@
 	Slope tileh = GetTileSlope(t, &h);
 	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 */
 	return
 		h + TILE_HEIGHT +
 		(IS_INT_INSIDE(f, 1, 15) ? TILE_HEIGHT : 0) +
--- a/src/bridge_map.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/bridge_map.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file bridge_map.h */
+
 #ifndef BRIDGE_MAP_H
 #define BRIDGE_MAP_H
 
@@ -59,6 +61,8 @@
 
 /**
  * Get the direction pointing onto the bridge
+ * @param tile The tile to analyze
+ * @return the above mentionned direction
  */
 static inline DiagDirection GetBridgeRampDirection(TileIndex t)
 {
--- a/src/build_vehicle_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/build_vehicle_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file build_vehicle_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "train.h"
@@ -24,6 +26,7 @@
 #include "newgrf_engine.h"
 #include "date.h"
 #include "strings.h"
+#include "cargotype.h"
 
 
 enum BuildVehicleWidgets {
@@ -381,7 +384,7 @@
 
 	/* Wagon weight - (including cargo) */
 	SetDParam(0, rvi->weight);
-	SetDParam(1, (_cargoc.weights[rvi->cargo_type] * rvi->capacity >> 4) + rvi->weight);
+	SetDParam(1, (GetCargo(rvi->cargo_type)->weight * rvi->capacity >> 4) + rvi->weight);
 	DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0);
 	y += 10;
 
@@ -505,7 +508,7 @@
 		/* Note, if the default capacity is selected by the refit capacity
 		* callback, then the capacity shown is likely to be incorrect. */
 		SetDParam(0, cargo);
-		SetDParam(1, AircraftDefaultCargoCapacity(cargo, engine_number));
+		SetDParam(1, AircraftDefaultCargoCapacity(cargo, avi));
 		SetDParam(2, STR_9842_REFITTABLE);
 		DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
 	}
@@ -606,9 +609,9 @@
 	EngList_RemoveAll(&bv->eng_list);
 
 	/* Make list of all available train engines and wagons.
-		* Also check to see if the previously selected engine is still available,
-		* and if not, reset selection to INVALID_ENGINE. This could be the case
-	* when engines become obsolete and are removed */
+	 * Also check to see if the previously selected engine is still available,
+	 * and if not, reset selection to INVALID_ENGINE. This could be the case
+	 * when engines become obsolete and are removed */
 	for (sel_id = INVALID_ENGINE, eid = 0; eid < NUM_TRAIN_ENGINES; eid++) {
 		const RailVehicleInfo *rvi = RailVehInfo(eid);
 
@@ -627,15 +630,15 @@
 
 	bv->sel_engine = sel_id;
 
-	// make engines first, and then wagons, sorted by ListPositionOfEngine()
+	/* make engines first, and then wagons, sorted by ListPositionOfEngine() */
 	_internal_sort_order = false;
 	EngList_Sort(&bv->eng_list, TrainEnginesThenWagonsSorter);
 
-	// and then sort engines
+	/* and then sort engines */
 	_internal_sort_order = bv->descending_sort_order;
 	EngList_SortPartial(&bv->eng_list, _sorter[0][bv->sort_criteria], 0, num_engines);
 
-	// and finally sort wagons
+	/* and finally sort wagons */
 	EngList_SortPartial(&bv->eng_list, _sorter[0][bv->sort_criteria], num_engines, num_wagons);
 }
 
@@ -693,13 +696,13 @@
 	for (eid = AIRCRAFT_ENGINES_INDEX; eid < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES; eid++) {
 		if (IsEngineBuildable(eid, VEH_Aircraft, _local_player)) {
 			const AircraftVehicleInfo *avi = AircraftVehInfo(eid);
-			switch (bv->filter.flags & ~AirportFTAClass::SHORT_STRIP /* we don't care about the length of the runway here */) {
+			switch (bv->filter.flags & ~AirportFTAClass::SHORT_STRIP) { // we don't care about the length of the runway here
 				case AirportFTAClass::HELICOPTERS:
-					if (avi->subtype != AIR_HELICOPTER) continue;
+					if (avi->subtype != AIR_HELI) continue;
 					break;
 
 				case AirportFTAClass::AIRPLANES:
-					if (avi->subtype != AIR_AIRCRAFT) continue;
+					if (!(avi->subtype & AIR_CTOL)) continue;
 					break;
 
 				case AirportFTAClass::ALL: break;
@@ -707,9 +710,6 @@
 					NOT_REACHED();
 			}
 
-			if (bv->filter.flags & AirportFTAClass::SHORT_STRIP &&
-				avi->subtype & AIR_FAST && !_cheats.no_jetcrash.value) continue; // don't build large aircraft in small airports
-
 			EngList_Add(&bv->eng_list, eid);
 
 			if (eid == bv->sel_engine) sel_id = eid;
@@ -936,7 +936,7 @@
 			break;
 		}
 
-		case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
+		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
 			if (bv->sort_criteria != e->we.dropdown.index) {
 				bv->sort_criteria = e->we.dropdown.index;
 				_last_sort_criteria[bv->vehicle_type] = bv->sort_criteria;
--- a/src/callback_table.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/callback_table.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,57 +1,59 @@
 /* $Id$ */
 
+/** @file callback_table.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "callback_table.h"
 #include "functions.h"
 
-// If you add a callback for DoCommandP, also add the callback in here
-//   see below for the full list!
-// If you don't do it, it won't work across the network!!
+/* If you add a callback for DoCommandP, also add the callback in here
+ *   see below for the full list!
+ * If you don't do it, it won't work across the network!! */
 
-/* aircraft_gui.c */
+/* aircraft_gui.cpp */
 CommandCallback CcBuildAircraft;
 CommandCallback CcCloneAircraft;
 
-/* airport_gui.c */
+/* airport_gui.cpp */
 CommandCallback CcBuildAirport;
 
-/* bridge_gui.c */
+/* bridge_gui.cpp */
 CommandCallback CcBuildBridge;
 
-/* dock_gui.c */
+/* dock_gui.cpp */
 CommandCallback CcBuildDocks;
 CommandCallback CcBuildCanal;
 
-/* depot_gui.c */
+/* depot_gui.cpp */
 CommandCallback CcCloneVehicle;
 
-/* main_gui.c */
+/* main_gui.cpp */
 CommandCallback CcPlaySound10;
 CommandCallback CcPlaceSign;
 CommandCallback CcTerraform;
 CommandCallback CcBuildTown;
 
-/* rail_gui.c */
+/* rail_gui.cpp */
 CommandCallback CcPlaySound1E;
 CommandCallback CcRailDepot;
 CommandCallback CcStation;
 CommandCallback CcBuildRailTunnel;
 
-/* road_gui.c */
+/* road_gui.cpp */
 CommandCallback CcPlaySound1D;
 CommandCallback CcBuildRoadTunnel;
 CommandCallback CcRoadDepot;
 
-/* roadveh_gui.c */
+/* roadveh_gui.cpp */
 CommandCallback CcBuildRoadVeh;
 CommandCallback CcCloneRoadVeh;
 
-/* ship_gui.c */
+/* ship_gui.cpp */
 CommandCallback CcBuildShip;
 CommandCallback CcCloneShip;
 
-/* train_gui.c */
+/* train_gui.cpp */
 CommandCallback CcBuildWagon;
 CommandCallback CcBuildLoco;
 CommandCallback CcCloneTrain;
--- a/src/callback_table.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/callback_table.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file callback_table.h  */
+
 #ifndef CALLBACK_TABLE_H
 #define CALLBACK_TABLE_H
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cargotype.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -0,0 +1,72 @@
+/* $Id$ */
+
+/** @file cargotype.cpp */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "macros.h"
+#include "table/sprites.h"
+#include "table/strings.h"
+#include "newgrf_cargo.h"
+#include "cargotype.h"
+
+#include "table/cargo_const.h"
+
+static CargoSpec _cargo[NUM_CARGO];
+
+static const byte INVALID_CARGO = 0xFF;
+
+/* Bitmask of cargo types available */
+uint32 _cargo_mask;
+
+
+void SetupCargoForClimate(LandscapeID l)
+{
+	assert(l < lengthof(_default_climate_cargo));
+
+	/* Reset and disable all cargo types */
+	memset(_cargo, 0, sizeof(_cargo));
+	for (CargoID i = 0; i < lengthof(_cargo); i++) _cargo[i].bitnum = INVALID_CARGO;
+
+	_cargo_mask = 0;
+
+	for (CargoID i = 0; i < lengthof(_default_climate_cargo[l]); i++) {
+		CargoLabel cl = _default_climate_cargo[l][i];
+
+		/* Loop through each of the default cargo types to see if
+		 * the label matches */
+		for (uint j = 0; j < lengthof(_default_cargo); j++) {
+			if (_default_cargo[j].label == cl) {
+				_cargo[i] = _default_cargo[j];
+
+				/* Populate the available cargo mask */
+				SETBIT(_cargo_mask, i);
+				break;
+			}
+		}
+	}
+}
+
+
+const CargoSpec *GetCargo(CargoID c)
+{
+	assert(c < lengthof(_cargo));
+	return &_cargo[c];
+}
+
+
+bool CargoSpec::IsValid() const
+{
+	return bitnum != INVALID_CARGO;
+}
+
+
+CargoID GetCargoIDByLabel(CargoLabel cl)
+{
+	for (CargoID c = 0; c < lengthof(_cargo); c++) {
+		if (_cargo[c].label == cl) return c;
+	}
+
+	/* No matching label was found, so it is invalid */
+	return CT_INVALID;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cargotype.h	Wed Feb 28 00:33:40 2007 +0000
@@ -0,0 +1,52 @@
+/* $Id$ */
+
+/** @file cargotype.h */
+
+#ifndef CARGOTYPE_H
+#define CARGOTYPE_H
+
+
+typedef uint32 CargoLabel;
+
+
+typedef struct CargoSpec {
+	uint8 bitnum;
+	CargoLabel label;
+	uint32 grfid;
+	uint8 legend_colour;
+	uint8 rating_colour;
+	uint8 weight;
+	uint16 initial_payment;
+	uint8 transit_days[2];
+
+	bool is_freight;
+	uint8 substitutetowngrowth;
+	uint16 multipliertowngrowth;
+	uint8 callbackflags;
+
+	StringID name;
+	StringID name_plural;
+	StringID units_volume;
+	StringID quantifier;
+	StringID abbrev;
+
+	SpriteID sprite;
+
+	uint16 classes;
+
+	bool IsValid() const;
+} CargoSpec;
+
+
+extern uint32 _cargo_mask;
+
+
+/* Set up the default cargo types for the given landscape type */
+void SetupCargoForClimate(LandscapeID l);
+/* Retrieve cargo details for the given cargo ID */
+const CargoSpec *GetCargo(CargoID c);
+/* Get the cargo ID with the cargo label */
+CargoID GetCargoIDByLabel(CargoLabel cl);
+
+
+#endif /* CARGOTYPE_H */
--- a/src/clear_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/clear_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file clear_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "clear_map.h"
@@ -107,9 +109,9 @@
 		Slope tileh;
 		uint z;
 
-		// Nothing could be built at the steep slope - this avoids a bug
-		// when you have a single diagonal track in one corner on a
-		// basement and then you raise/lower the other corner.
+		/* Nothing could be built at the steep slope - this avoids a bug
+		 * when you have a single diagonal track in one corner on a
+		 * basement and then you raise/lower the other corner. */
 		tileh = GetTileSlope(tile, &z);
 		if (tileh == unsafe_slope[mode] ||
 				tileh == ComplementSlope(unsafe_slope[mode])) {
@@ -118,8 +120,8 @@
 			return -1;
 		}
 
-		// If we have a single diagonal track there, the other side of
-		// tile can be terraformed.
+		/* If we have a single diagonal track there, the other side of
+		 * tile can be terraformed. */
 		if (IsPlainRailTile(tile) && GetTrackBits(tile) == safe_track[mode]) {
 			/* If terraforming downwards prevent damaging a potential tunnel below.
 			 * This check is only necessary for flat tiles, because if the tile is
@@ -223,8 +225,10 @@
 
 /** Terraform land
  * @param tile tile to terraform
+ * @param flags for this command type
  * @param p1 corners to terraform.
  * @param p2 direction; eg up or down
+ * @return error or cost of terraforming
  */
 int32 CmdTerraformLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -346,8 +350,10 @@
 
 /** Levels a selected (rectangle) area of land
  * @param tile end tile of area-drag
+ * @param flags for this command type
  * @param p1 start tile of area drag
  * @param p2 unused
+ * @return  error or cost of terraforming
  */
 int32 CmdLevelLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -362,16 +368,16 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	// remember level height
+	/* remember level height */
 	h = TileHeight(p1);
 
-	// make sure sx,sy are smaller than ex,ey
+	/* make sure sx,sy are smaller than ex,ey */
 	ex = TileX(tile);
 	ey = TileY(tile);
 	sx = TileX(p1);
 	sy = TileY(p1);
-	if (ex < sx) intswap(ex, sx);
-	if (ey < sy) intswap(ey, sy);
+	if (ex < sx) Swap(ex, sx);
+	if (ey < sy) Swap(ey, sy);
 	tile = TileXY(sx, sy);
 
 	size_x = ex-sx+1;
@@ -405,8 +411,10 @@
 /** Purchase a land area. Actually you only purchase one tile, so
  * the name is a bit confusing ;p
  * @param tile the tile the player is purchasing
+ * @param flags for this command type
  * @param p1 unused
  * @param p2 unused
+ * @return error of cost of operation
  */
 int32 CmdPurchaseLandArea(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -459,8 +467,10 @@
 /** Sell a land area. Actually you only sell one tile, so
  * the name is a bit confusing ;p
  * @param tile the tile the player is selling
+ * @param flags for this command type
  * @param p1 unused
  * @param p2 unused
+ * @return error or cost of operation
  */
 int32 CmdSellLandArea(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -787,17 +797,17 @@
 }
 
 extern const TileTypeProcs _tile_type_clear_procs = {
-	DrawTile_Clear,           /* draw_tile_proc */
-	GetSlopeZ_Clear,          /* get_slope_z_proc */
-	ClearTile_Clear,          /* clear_tile_proc */
-	GetAcceptedCargo_Clear,   /* get_accepted_cargo_proc */
-	GetTileDesc_Clear,        /* get_tile_desc_proc */
-	GetTileTrackStatus_Clear, /* get_tile_track_status_proc */
-	ClickTile_Clear,          /* click_tile_proc */
-	AnimateTile_Clear,        /* animate_tile_proc */
-	TileLoop_Clear,           /* tile_loop_clear */
-	ChangeTileOwner_Clear,    /* change_tile_owner_clear */
-	NULL,                     /* get_produced_cargo_proc */
-	NULL,                     /* vehicle_enter_tile_proc */
-	GetSlopeTileh_Clear,      /* get_slope_tileh_proc */
+	DrawTile_Clear,           ///< draw_tile_proc
+	GetSlopeZ_Clear,          ///< get_slope_z_proc
+	ClearTile_Clear,          ///< clear_tile_proc
+	GetAcceptedCargo_Clear,   ///< get_accepted_cargo_proc
+	GetTileDesc_Clear,        ///< get_tile_desc_proc
+	GetTileTrackStatus_Clear, ///< get_tile_track_status_proc
+	ClickTile_Clear,          ///< click_tile_proc
+	AnimateTile_Clear,        ///< animate_tile_proc
+	TileLoop_Clear,           ///< tile_loop_clear
+	ChangeTileOwner_Clear,    ///< change_tile_owner_clear
+	NULL,                     ///< get_produced_cargo_proc
+	NULL,                     ///< vehicle_enter_tile_proc
+	GetSlopeTileh_Clear,      ///< get_slope_tileh_proc
 };
--- a/src/clear_map.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/clear_map.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file clear_map.h */
+
 #ifndef CLEAR_MAP_H
 #define CLEAR_MAP_H
 
@@ -11,12 +13,12 @@
  * valid densities (bits 0...1) in comments after the enum
  */
 typedef enum ClearGround {
-	CLEAR_GRASS  = 0, // 0-3
-	CLEAR_ROUGH  = 1, // 3
-	CLEAR_ROCKS  = 2, // 3
-	CLEAR_FIELDS = 3, // 3
-	CLEAR_SNOW   = 4, // 0-3
-	CLEAR_DESERT = 5  // 1,3
+	CLEAR_GRASS  = 0, ///< 0-3
+	CLEAR_ROUGH  = 1, ///< 3
+	CLEAR_ROCKS  = 2, ///< 3
+	CLEAR_FIELDS = 3, ///< 3
+	CLEAR_SNOW   = 4, ///< 0-3
+	CLEAR_DESERT = 5  ///< 1,3
 } ClearGround;
 
 
@@ -134,7 +136,7 @@
 	_m[t].m3 = 0;
 	_m[t].m4 = 0 << 5 | 0 << 2;
 	SetClearGroundDensity(t, g, density);
-	SB(_m[t].m6, 2, 4, 0); ///< Clear the rest of m6, bits 2 to 5
+	SB(_m[t].m6, 2, 4, 0); // Clear the rest of m6, bits 2 to 5
 }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cmd_helper.h	Wed Feb 28 00:33:40 2007 +0000
@@ -0,0 +1,28 @@
+/* $Id$ */
+
+#ifndef CMD_HELPER_H
+#define CMD_HELPER_H
+
+#include "direction.h"
+#include "macros.h"
+#include "road.h"
+
+
+template<uint N> static inline void ExtractValid();
+template<> static inline void ExtractValid<1>() {}
+
+
+template<typename T> struct ExtractBits;
+template<> struct ExtractBits<Axis>          { static const uint Count =  1; };
+template<> struct ExtractBits<DiagDirection> { static const uint Count =  2; };
+template<> struct ExtractBits<RoadBits>      { static const uint Count =  4; };
+
+
+template<typename T, uint N, typename U> static inline T Extract(U v)
+{
+	// Check if there are enough bits in v
+	ExtractValid<N + ExtractBits<T>::Count <= sizeof(U) * 8>();
+	return (T)GB(v, N, ExtractBits<T>::Count);
+}
+
+#endif
--- a/src/command.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/command.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file command.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
@@ -347,7 +349,7 @@
 
 	_docommand_recursive++;
 
-	// only execute the test call if it's toplevel, or we're not execing.
+	/* only execute the test call if it's toplevel, or we're not execing. */
 	if (_docommand_recursive == 1 || !(flags & DC_EXEC) || (flags & DC_FORCETEST) ) {
 		res = proc(tile, flags & ~DC_EXEC, p1, p2);
 		if (CmdFailed(res)) {
@@ -380,10 +382,10 @@
 		return CMD_ERROR;
 	}
 
-	// if toplevel, subtract the money.
+	/* if toplevel, subtract the money. */
 	if (--_docommand_recursive == 0) {
 		SubtractMoneyFromPlayer(res);
-		// XXX - Old AI hack which doesn't use DoCommandDP; update last build coord of player
+		/* XXX - Old AI hack which doesn't use DoCommandDP; update last build coord of player */
 		if (tile != 0 && IsValidPlayer(_current_player)) {
 			GetPlayer(_current_player)->last_build_coordinate = tile;
 		}
@@ -400,8 +402,8 @@
 	return GetPlayer(pid)->player_money;
 }
 
-// toplevel network safe docommand function for the current player. must not be called recursively.
-// the callback is called when the command succeeded or failed.
+/* toplevel network safe docommand function for the current player. must not be called recursively.
+ * the callback is called when the command succeeded or failed. */
 bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback, uint32 cmd)
 {
 	int32 res = 0,res2;
@@ -437,7 +439,7 @@
 	if (cmd & CMD_AUTO) flags |= DC_AUTO;
 	if (cmd & CMD_NO_WATER) flags |= DC_NO_WATER;
 
-	// get pointer to command handler
+	/* get pointer to command handler */
 	assert((cmd & 0xFF) < lengthof(_command_proc_table));
 	proc = _command_proc_table[cmd & 0xFF].proc;
 	if (proc == NULL) {
@@ -445,15 +447,15 @@
 		return false;
 	}
 
-	// Some commands have a different output in dryrun than the realrun
-	//  e.g.: if you demolish a whole town, the dryrun would say okay.
-	//  but by really destroying, your rating drops and at a certain point
-	//  it will fail. so res and res2 are different
-	// CMD_REMOVE_ROAD: This command has special local authority
-	// restrictions which may cause the test run to fail (the previous
-	// road fragments still stay there and the town won't let you
-	// disconnect the road system), but the exec will succeed and this
-	// fact will trigger an assertion failure. --pasky
+	/* Some commands have a different output in dryrun than the realrun
+	 *  e.g.: if you demolish a whole town, the dryrun would say okay.
+	 *  but by really destroying, your rating drops and at a certain point
+	 *  it will fail. so res and res2 are different
+	 * CMD_REMOVE_ROAD: This command has special local authority
+	 * restrictions which may cause the test run to fail (the previous
+	 * road fragments still stay there and the town won't let you
+	 * disconnect the road system), but the exec will succeed and this
+	 * fact will trigger an assertion failure. --pasky */
 	notest =
 		(cmd & 0xFF) == CMD_CLEAR_AREA ||
 		(cmd & 0xFF) == CMD_CONVERT_RAIL ||
@@ -463,13 +465,13 @@
 
 	_docommand_recursive = 1;
 
-	// cost estimation only?
+	/* cost estimation only? */
 	if (!IsGeneratingWorld() &&
 			_shift_pressed &&
 			IsLocalPlayer() &&
 			!(cmd & (CMD_NETWORK_COMMAND | CMD_SHOW_NO_ERROR)) &&
 			(cmd & 0xFF) != CMD_PAUSE) {
-		// estimate the cost.
+		/* estimate the cost. */
 		res = proc(tile, flags, p1, p2);
 		if (CmdFailed(res)) {
 			if (res & 0xFFFF) _error_message = res & 0xFFFF;
@@ -485,13 +487,13 @@
 
 
 	if (!((cmd & CMD_NO_TEST_IF_IN_NETWORK) && _networking)) {
-		// first test if the command can be executed.
+		/* first test if the command can be executed. */
 		res = proc(tile, flags, p1, p2);
 		if (CmdFailed(res)) {
 			if (res & 0xFFFF) _error_message = res & 0xFFFF;
 			goto show_error;
 		}
-		// no money? Only check if notest is off
+		/* no money? Only check if notest is off */
 		if (!notest && res != 0 && !CheckPlayerHasMoney(res)) goto show_error;
 	}
 
@@ -514,7 +516,7 @@
 	}
 #endif /* ENABLE_NETWORK */
 
-	// update last build coordinate of player.
+	/* update last build coordinate of player. */
 	if (tile != 0 && IsValidPlayer(_current_player)) {
 		GetPlayer(_current_player)->last_build_coordinate = tile;
 	}
@@ -524,8 +526,8 @@
 	_yearly_expenses_type = EXPENSES_CONSTRUCTION;
 	res2 = proc(tile, flags | DC_EXEC, p1, p2);
 
-	// If notest is on, it means the result of the test can be different than
-	//   the real command.. so ignore the test
+	/* If notest is on, it means the result of the test can be different than
+	 *  the real command.. so ignore the test */
 	if (!notest && !((cmd & CMD_NO_TEST_IF_IN_NETWORK) && _networking)) {
 		assert(res == res2); // sanity check
 	} else {
@@ -553,7 +555,7 @@
 	return true;
 
 show_error:
-	// show error message if the command fails?
+	/* show error message if the command fails? */
 	if (IsLocalPlayer() && error_part1 != 0) {
 		ShowErrorMessage(_error_message, error_part1, x,y);
 	}
--- a/src/command.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/command.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file command.h */
+
 #ifndef COMMAND_H
 #define COMMAND_H
 
@@ -122,8 +124,8 @@
 	CMD_MONEY_CHEAT                  = 102,
 	CMD_BUILD_CANAL                  = 103,
 
-	CMD_PLAYER_CTRL                  = 104, // used in multiplayer to create a new player etc.
-	CMD_LEVEL_LAND                   = 105, // level land
+	CMD_PLAYER_CTRL                  = 104, ///< used in multiplayer to create a new player etc.
+	CMD_LEVEL_LAND                   = 105, ///< level land
 
 	CMD_REFIT_RAIL_VEHICLE           = 106,
 	CMD_RESTORE_ORDER_INDEX          = 107,
@@ -145,13 +147,13 @@
 
 enum {
 	DC_EXEC            = 0x01,
-	DC_AUTO            = 0x02, // don't allow building on structures
-	DC_QUERY_COST      = 0x04, // query cost only,  don't build.
-	DC_NO_WATER        = 0x08, // don't allow building on water
-	DC_NO_RAIL_OVERLAP = 0x10, // don't allow overlap of rails (used in buildrail)
-	DC_AI_BUILDING     = 0x20, // special building rules for AI
-	DC_NO_TOWN_RATING  = 0x40, // town rating does not disallow you from building
-	DC_FORCETEST       = 0x80, // force test too.
+	DC_AUTO            = 0x02, ///< don't allow building on structures
+	DC_QUERY_COST      = 0x04, ///< query cost only,  don't build.
+	DC_NO_WATER        = 0x08, ///< don't allow building on water
+	DC_NO_RAIL_OVERLAP = 0x10, ///< don't allow overlap of rails (used in buildrail)
+	DC_AI_BUILDING     = 0x20, ///< special building rules for AI
+	DC_NO_TOWN_RATING  = 0x40, ///< town rating does not disallow you from building
+	DC_FORCETEST       = 0x80, ///< force test too.
 
 	CMD_ERROR = ((int32)0x80000000),
 };
@@ -161,17 +163,15 @@
 enum {
 	CMD_AUTO                  = 0x0200,
 	CMD_NO_WATER              = 0x0400,
-	CMD_NETWORK_COMMAND       = 0x0800, // execute the command without sending it on the network
-	CMD_NO_TEST_IF_IN_NETWORK = 0x1000, // When enabled, the command will bypass the no-DC_EXEC round if in network
+	CMD_NETWORK_COMMAND       = 0x0800, ///< execute the command without sending it on the network
+	CMD_NO_TEST_IF_IN_NETWORK = 0x1000, ///< When enabled, the command will bypass the no-DC_EXEC round if in network
 	CMD_SHOW_NO_ERROR         = 0x2000,
 };
 
-/** Command flags for the command table
- * @see _command_proc_table
- */
+/** Command flags for the command table _command_proc_table */
 enum {
-	CMD_SERVER  = 0x1, /// the command can only be initiated by the server
-	CMD_OFFLINE = 0x2, /// the command cannot be executed in a multiplayer game; single-player only
+	CMD_SERVER  = 0x1, ///< the command can only be initiated by the server
+	CMD_OFFLINE = 0x2, ///< the command cannot be executed in a multiplayer game; single-player only
 };
 
 typedef int32 CommandProc(TileIndex tile, uint32 flags, uint32 p1, uint32 p2);
@@ -191,11 +191,11 @@
  */
 static inline bool CmdFailed(int32 res)
 {
-	// lower 16bits are the StringID of the possible error
+	/* lower 16bits are the StringID of the possible error */
 	return res <= (CMD_ERROR | INVALID_STRING_ID);
 }
 
-/* command.c */
+/* command.cpp */
 typedef void CommandCallback(bool success, TileIndex tile, uint32 p1, uint32 p2);
 int32 DoCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 flags, uint procc);
 bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, CommandCallback *callback, uint32 cmd);
@@ -205,7 +205,7 @@
 void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback);
 #endif /* ENABLE_NETWORK */
 
-extern const char* _cmd_text; // Text, which gets sent with a command
+extern const char* _cmd_text; ///< Text, which gets sent with a command
 
 bool IsValidCommand(uint cmd);
 byte GetCommandFlags(uint cmd);
--- a/src/console.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/console.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file console.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
@@ -26,23 +28,23 @@
 #define ICON_MAX_ALIAS_LINES 40
 #define ICON_TOKEN_COUNT 20
 
-// ** main console ** //
+/* ** main console ** */
 static char *_iconsole_buffer[ICON_BUFFER + 1];
 static uint16 _iconsole_cbuffer[ICON_BUFFER + 1];
 static Textbuf _iconsole_cmdline;
 
-// ** stdlib ** //
+/* ** stdlib ** */
 byte _stdlib_developer = 1;
 bool _stdlib_con_developer = false;
 FILE *_iconsole_output_file;
 
-// ** main console cmd buffer
+/* ** main console cmd buffer ** */
 static char *_iconsole_history[ICON_HISTORY_SIZE];
 static byte _iconsole_historypos;
 
-/* *************** */
-/*  end of header  */
-/* *************** */
+/* *************** *
+ *  end of header  *
+ * *************** */
 
 static void IConsoleClearCommand(void)
 {
@@ -60,7 +62,7 @@
 static void IConsoleHistoryAdd(const char *cmd);
 static void IConsoleHistoryNavigate(int direction);
 
-// ** console window ** //
+/* ** console window ** */
 static void IConsoleWndProc(BaseWindow *w, WindowEvent *e)
 {
 	static byte iconsole_scroll = ICON_BUFFER;
@@ -254,7 +256,7 @@
 static void IConsoleWriteToLogFile(const char *string)
 {
 	if (_iconsole_output_file != NULL) {
-		// if there is an console output file ... also print it there
+		/* if there is an console output file ... also print it there */
 		fwrite(string, strlen(string), 1, _iconsole_output_file);
 		fwrite("\n", 1, 1, _iconsole_output_file);
 	}
@@ -337,7 +339,7 @@
 {
 	int i = _iconsole_historypos + direction;
 
-	// watch out for overflows, just wrap around
+	/* watch out for overflows, just wrap around */
 	if (i < 0) i = ICON_HISTORY_SIZE - 1;
 	if (i >= ICON_HISTORY_SIZE) i = 0;
 
@@ -350,7 +352,7 @@
 
 	_iconsole_historypos = i;
 	IConsoleClearCommand();
-	// copy history to 'command prompt / bash'
+	/* copy history to 'command prompt / bash' */
 	assert(_iconsole_history[i] != NULL && IS_INT_INSIDE(i, 0, ICON_HISTORY_SIZE));
 	ttd_strlcpy(_iconsole_cmdline.buf, _iconsole_history[i], _iconsole_cmdline.maxlength);
 	UpdateTextBufferSize(&_iconsole_cmdline);
@@ -478,9 +480,10 @@
 	return arg != endptr;
 }
 
-// * ************************* * //
-// * hooking code              * //
-// * ************************* * //
+/*  * *************************
+    * hooking code            *
+    * *************************/
+
 /**
  * General internal hooking code that is the same for both commands and variables
  * @param hooks @IConsoleHooks structure that will be set according to
@@ -706,18 +709,18 @@
 		if (a_index >= lengthof(aliases) || astream_i >= lengthof(aliasstream)) break;
 
 		switch (*cmdptr) {
-		case '\'': /* ' will double for "" */
+		case '\'': // ' will double for ""
 			aliasstream[astream_i++] = '"';
 			break;
-		case ';': /* Cmd seperator, start new command */
+		case ';': // Cmd seperator, start new command
 			aliasstream[astream_i] = '\0';
 			aliases[++a_index] = &aliasstream[++astream_i];
 			cmdptr++;
 			break;
-		case '%': /* Some or all parameters */
+		case '%': // Some or all parameters
 			cmdptr++;
 			switch (*cmdptr) {
-			case '+': { /* All parameters seperated: "[param 1]" "[param 2]" */
+			case '+': { // All parameters seperated: "[param 1]" "[param 2]"
 				for (i = 0; i != tokencount; i++) {
 					aliasstream[astream_i++] = '"';
 					astream_i += IConsoleCopyInParams(&aliasstream[astream_i], tokens[i], astream_i);
@@ -725,7 +728,7 @@
 					aliasstream[astream_i++] = ' ';
 				}
 			} break;
-			case '!': { /* Merge the parameters to one: "[param 1] [param 2] [param 3...]" */
+			case '!': { // Merge the parameters to one: "[param 1] [param 2] [param 3...]"
 				aliasstream[astream_i++] = '"';
 				for (i = 0; i != tokencount; i++) {
 					astream_i += IConsoleCopyInParams(&aliasstream[astream_i], tokens[i], astream_i);
@@ -734,7 +737,7 @@
 				aliasstream[astream_i++] = '"';
 
 			} break;
-				default: { /* One specific parameter: %A = [param 1] %B = [param 2] ... */
+				default: { // One specific parameter: %A = [param 1] %B = [param 2] ...
 				int param = *cmdptr - 'A';
 
 				if (param < 0 || param >= tokencount) {
@@ -1083,16 +1086,16 @@
 
 			tstream_i++;
 			break;
-		case '"': /* Tokens enclosed in "" are one token */
+		case '"': // Tokens enclosed in "" are one token
 			longtoken = !longtoken;
 			break;
-		case '\\': /* Escape character for "" */
+		case '\\': // Escape character for ""
 			if (cmdptr[1] == '"' && tstream_i + 1 < lengthof(tokenstream)) {
 				tokenstream[tstream_i++] = *++cmdptr;
 				break;
 			}
 			/* fallthrough */
-		default: /* Normal character */
+		default: // Normal character
 			tokenstream[tstream_i++] = *cmdptr;
 
 			if (!foundtoken) {
--- a/src/console.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/console.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,11 +1,13 @@
 /* $Id$ */
 
+/** @file console.h */
+
 #ifndef CONSOLE_H
 #define CONSOLE_H
 
-// maximum length of a typed in command
+/* maximum length of a typed in command */
 #define ICON_CMDLN_SIZE 255
-// maximum length of a totally expanded command
+/* maximum length of a totally expanded command */
 #define ICON_MAX_STREAMSIZE 1024
 
 typedef enum IConsoleVarTypes {
@@ -37,9 +39,9 @@
  */
 typedef bool IConsoleHook(void);
 typedef struct IConsoleHooks{
-	IConsoleHook *access; // trigger when accessing the variable/command
-	IConsoleHook *pre;    // trigger before the variable/command is changed/executed
-	IConsoleHook *post;   // trigger after the variable/command is changed/executed
+	IConsoleHook *access; ///< trigger when accessing the variable/command
+	IConsoleHook *pre;    ///< trigger before the variable/command is changed/executed
+	IConsoleHook *post;   ///< trigger after the variable/command is changed/executed
 } IConsoleHooks;
 
 /** --Commands--
@@ -53,11 +55,11 @@
 
 struct IConsoleCmd;
 typedef struct IConsoleCmd {
-	char *name;               // name of command
-	struct IConsoleCmd *next; // next command in list
+	char *name;               ///< name of command
+	struct IConsoleCmd *next; ///< next command in list
 
-	IConsoleCmdProc *proc;    // process executed when command is typed
-	IConsoleHooks hook;       // any special trigger action that needs executing
+	IConsoleCmdProc *proc;    ///< process executed when command is typed
+	IConsoleHooks hook;       ///< any special trigger action that needs executing
 } IConsoleCmd;
 
 /** --Variables--
@@ -71,15 +73,15 @@
  */
 struct IConsoleVar;
 typedef struct IConsoleVar {
-	char *name;               // name of the variable
-	struct IConsoleVar *next; // next variable in list
+	char *name;               ///< name of the variable
+	struct IConsoleVar *next; ///< next variable in list
 
-	void *addr;               // the address where the variable is pointing at
-	uint32 size;              // size of the variable, used for strings
-	char *help;               // the optional help string shown when requesting information
-	IConsoleVarTypes type;    // type of variable (for correct assignment/output)
-	IConsoleCmdProc *proc;    // some variables need really special handling, use a callback function for that
-	IConsoleHooks hook;       // any special trigger action that needs executing
+	void *addr;               ///< the address where the variable is pointing at
+	uint32 size;              ///< size of the variable, used for strings
+	char *help;               ///< the optional help string shown when requesting information
+	IConsoleVarTypes type;    ///< type of variable (for correct assignment/output)
+	IConsoleCmdProc *proc;    ///< some variables need really special handling, use a callback function for that
+	IConsoleHooks hook;       ///< any special trigger action that needs executing
 } IConsoleVar;
 
 /** --Aliases--
@@ -95,16 +97,16 @@
  */
 struct IConsoleAlias;
 typedef struct IConsoleAlias {
-	char *name;                 // name of the alias
-	struct IConsoleAlias *next; // next alias in list
+	char *name;                 ///< name of the alias
+	struct IConsoleAlias *next; ///< next alias in list
 
-	char *cmdline;              // command(s) that is/are being aliased
+	char *cmdline;              ///< command(s) that is/are being aliased
 } IConsoleAlias;
 
 /* console parser */
-VARDEF IConsoleCmd   *_iconsole_cmds;    // list of registred commands
-VARDEF IConsoleVar   *_iconsole_vars;    // list of registred vars
-VARDEF IConsoleAlias *_iconsole_aliases; // list of registred aliases
+VARDEF IConsoleCmd   *_iconsole_cmds;    ///< list of registred commands
+VARDEF IConsoleVar   *_iconsole_vars;    ///< list of registred vars
+VARDEF IConsoleAlias *_iconsole_aliases; ///< list of registred aliases
 
 /* console colors/modes */
 VARDEF byte _icolour_def;
--- a/src/console_cmds.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/console_cmds.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file console_cmds.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "console.h"
@@ -226,7 +228,7 @@
 		if (strcmp(file, _fios_list[i].title) == 0) break;
 	}
 
-	if (i == _fios_num) { /* If no name matches, try to parse it as number */
+	if (i == _fios_num) { // If no name matches, try to parse it as number
 		char* endptr;
 
 		i = strtol(file, &endptr, 10);
@@ -614,7 +616,7 @@
 
 DEF_CONSOLE_HOOK(ConHookValidateMaxSpectatorsCount)
 {
-	/* XXX @see ConHookValidateMaxClientsCount */
+	/* XXX see ConHookValidateMaxClientsCount */
 	if (_network_game_info.spectators_max > 10) {
 		_network_game_info.spectators_max = 10;
 		IConsoleError("Maximum spectators out of bounds, truncating to limit.");
@@ -1342,7 +1344,7 @@
 
 	if (ci == NULL) return false;
 
-	// Don't change the name if it is the same as the old name
+	/* Don't change the name if it is the same as the old name */
 	if (strcmp(ci->client_name, _network_player_name) != 0) {
 		if (!_network_server) {
 			SEND_COMMAND(PACKET_CLIENT_SET_NAME)(_network_player_name);
@@ -1441,8 +1443,8 @@
 
 static void IConsoleDebugLibRegister(void)
 {
-	// debugging variables and functions
-	extern bool _stdlib_con_developer; /* XXX extern in .c */
+	/* debugging variables and functions */
+	extern bool _stdlib_con_developer; // XXX extern in .cpp
 
 	IConsoleVarRegister("con_developer",    &_stdlib_con_developer, ICONSOLE_VAR_BOOLEAN, "Enable/disable console debugging information (internal)");
 	IConsoleCmdRegister("resettile",        ConResetTile);
@@ -1458,10 +1460,10 @@
 
 void IConsoleStdLibRegister(void)
 {
-	// stdlib
-	extern byte _stdlib_developer; /* XXX extern in .c */
+	/* stdlib */
+	extern byte _stdlib_developer; // XXX extern in .cpp
 
-	// default variables and functions
+	/* default variables and functions */
 	IConsoleCmdRegister("debug_level",  ConDebugLevel);
 	IConsoleCmdRegister("dump_vars",    ConListDumpVariables);
 	IConsoleCmdRegister("echo",         ConEcho);
--- a/src/currency.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/currency.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file currency.cpp **/
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "currency.h"
@@ -13,34 +15,34 @@
 	//   |   |    Euro year  |       |       |    name
 	//   |   |    |          |       |       |    |
 static const CurrencySpec origin_currency_specs[NUM_CURRENCY] = {
-	{    1, ',', CF_NOEURO, "£",    "",      0,  STR_CURR_GBP    }, // british pounds
-	{    2, ',', CF_NOEURO, "$",    "",      0,  STR_CURR_USD    }, // us dollars
-	{    2, ',', CF_ISEURO, "€",    "",      0,  STR_CURR_EUR    }, // Euro
-	{  220, ',', CF_NOEURO, "Â¥",    "",      0,  STR_CURR_YEN    }, // yen
-	{   20, ',', 2002,      "",     " S.",   1,  STR_CURR_ATS    }, // austrian schilling
-	{   59, ',', 2002,      "BEF ", "",      0,  STR_CURR_BEF    }, // belgian franc
-	{    2, ',', CF_NOEURO, "CHF ", "",      0,  STR_CURR_CHF    }, // swiss franc
-	{   41, ',', CF_NOEURO, "",     " KÄ",   1,  STR_CURR_CZK    }, // czech koruna
-	{    3, '.', 2002,      "DM ",  "",      0,  STR_CURR_DEM    }, // deutsche mark
-	{   11, '.', CF_NOEURO, "",     " kr",   1,  STR_CURR_DKK    }, // danish krone
-	{  245, '.', 2002,      "Pts ", "",      0,  STR_CURR_ESP    }, // spanish pesetas
-	{    9, ',', 2002,      "",     " mk",   1,  STR_CURR_FIM    }, // finnish markka
-	{   10, '.', 2002,      "FF ",  "",      0,  STR_CURR_FRF    }, // french francs
-	{  500, ',', 2002,      "",     "Dr.",   1,  STR_CURR_GRD    }, // greek drachma
-	{  378, ',', 2010,      "",     " Ft",   1,  STR_CURR_HUF    }, // hungarian forint
-	{  130, '.', CF_NOEURO, "",     " Kr",   1,  STR_CURR_ISK    }, // icelandic krona
-	{ 2850, ',', 2002,      "",     " L.",   1,  STR_CURR_ITL    }, // italian lira
-	{    3, ',', 2002,      "NLG ", "",      0,  STR_CURR_NLG    }, // dutch gulden
-	{   12, '.', CF_NOEURO, "",     " Kr",   1,  STR_CURR_NOK    }, // norwegian krone
-	{    6, ' ', CF_NOEURO, "",     " zl",   1,  STR_CURR_PLN    }, // polish zloty
-	{    5, '.', CF_NOEURO, "",     " Lei",  1,  STR_CURR_ROL    }, // romanian Lei
-	{   50, ' ', CF_NOEURO, "",     " p",    1,  STR_CURR_RUR    }, // russian rouble
-	{  352, '.', CF_NOEURO, "",     " SIT",  1,  STR_CURR_SIT    }, // slovenian tolar
-	{   13, '.', CF_NOEURO, "",     " Kr",   1,  STR_CURR_SEK    }, // swedish krona
-	{    3, '.', CF_NOEURO, "",     " YTL",  1,  STR_CURR_YTL    }, // turkish lira
-	{   52, ',', CF_NOEURO, "",     " Sk",   1,  STR_CURR_SKK    }, // slovak koruna
-	{    4, ',', CF_NOEURO, "R$ ",  "",      0,  STR_CURR_BRR    }, // brazil real
-	{    1, ' ', CF_NOEURO, "",     "",      2,  STR_CURR_CUSTOM }, // custom currency
+	{    1, ',', CF_NOEURO, "£",    "",      0,  STR_CURR_GBP    }, ///< british pounds
+	{    2, ',', CF_NOEURO, "$",    "",      0,  STR_CURR_USD    }, ///< us dollars
+	{    2, ',', CF_ISEURO, "€",    "",      0,  STR_CURR_EUR    }, ///< Euro
+	{  220, ',', CF_NOEURO, "Â¥",    "",      0,  STR_CURR_YEN    }, ///< yen
+	{   20, ',', 2002,      "",     " S.",   1,  STR_CURR_ATS    }, ///< austrian schilling
+	{   59, ',', 2002,      "BEF ", "",      0,  STR_CURR_BEF    }, ///< belgian franc
+	{    2, ',', CF_NOEURO, "CHF ", "",      0,  STR_CURR_CHF    }, ///< swiss franc
+	{   41, ',', CF_NOEURO, "",     " KÄ",   1,  STR_CURR_CZK    }, ///< czech koruna
+	{    3, '.', 2002,      "DM ",  "",      0,  STR_CURR_DEM    }, ///< deutsche mark
+	{   11, '.', CF_NOEURO, "",     " kr",   1,  STR_CURR_DKK    }, ///< danish krone
+	{  245, '.', 2002,      "Pts ", "",      0,  STR_CURR_ESP    }, ///< spanish pesetas
+	{    9, ',', 2002,      "",     " mk",   1,  STR_CURR_FIM    }, ///< finnish markka
+	{   10, '.', 2002,      "FF ",  "",      0,  STR_CURR_FRF    }, ///< french francs
+	{  500, ',', 2002,      "",     "Dr.",   1,  STR_CURR_GRD    }, ///< greek drachma
+	{  378, ',', 2010,      "",     " Ft",   1,  STR_CURR_HUF    }, ///< hungarian forint
+	{  130, '.', CF_NOEURO, "",     " Kr",   1,  STR_CURR_ISK    }, ///< icelandic krona
+	{ 2850, ',', 2002,      "",     " L.",   1,  STR_CURR_ITL    }, ///< italian lira
+	{    3, ',', 2002,      "NLG ", "",      0,  STR_CURR_NLG    }, ///< dutch gulden
+	{   12, '.', CF_NOEURO, "",     " Kr",   1,  STR_CURR_NOK    }, ///< norwegian krone
+	{    6, ' ', CF_NOEURO, "",     " zl",   1,  STR_CURR_PLN    }, ///< polish zloty
+	{    5, '.', CF_NOEURO, "",     " Lei",  1,  STR_CURR_ROL    }, ///< romanian Lei
+	{   50, ' ', CF_NOEURO, "",     " p",    1,  STR_CURR_RUR    }, ///< russian rouble
+	{  352, '.', CF_NOEURO, "",     " SIT",  1,  STR_CURR_SIT    }, ///< slovenian tolar
+	{   13, '.', CF_NOEURO, "",     " Kr",   1,  STR_CURR_SEK    }, ///< swedish krona
+	{    3, '.', CF_NOEURO, "",     " YTL",  1,  STR_CURR_YTL    }, ///< turkish lira
+	{   52, ',', CF_NOEURO, "",     " Sk",   1,  STR_CURR_SKK    }, ///< slovak koruna
+	{    4, ',', CF_NOEURO, "R$ ",  "",      0,  STR_CURR_BRR    }, ///< brazil real
+	{    1, ' ', CF_NOEURO, "",     "",      2,  STR_CURR_CUSTOM }, ///< custom currency
 };
 
 /* Array of currencies used by the system */
@@ -122,7 +124,10 @@
 	return (grfcurr_id >= lengthof(TTDPatch_To_OTTDIndex)) ? grfcurr_id : TTDPatch_To_OTTDIndex[grfcurr_id];
 }
 
-/* get a mask of the allowed currencies depending on the year */
+/**
+ * get a mask of the allowed currencies depending on the year
+ * @return mask of currencies
+ */
 uint GetMaskOfAllowedCurrencies(void)
 {
 	uint mask = 0;
--- a/src/currency.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/currency.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file currency.h */
+
 #ifndef CURRENCY_H
 #define CURRENCY_H
 
--- a/src/date.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/date.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file date.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "date.h"
@@ -197,11 +199,11 @@
 
 
 static const Month _autosave_months[] = {
-	 0, // never
-	 1, // every month
-	 3, // every 3 months
-	 6, // every 6 months
-	12, // every 12 months
+	 0, ///< never
+	 1, ///< every month
+	 3, ///< every 3 months
+	 6, ///< every 6 months
+	12, ///< every 12 months
 };
 
 /**
--- a/src/date.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/date.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file date.h */
+
 #ifndef DATE_H
 #define DATE_H
 
--- a/src/debug.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/debug.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file debug.cpp */
+
 #include "stdafx.h"
 #include <stdio.h>
 #include <stdarg.h>
@@ -105,7 +107,7 @@
 	char *end;
 	const char *t;
 
-	// global debugging level?
+	/* global debugging level? */
 	if (*s >= '0' && *s <= '9') {
 		const DebugLevel *i;
 
@@ -115,19 +117,19 @@
 		for (i = debug_level; i != endof(debug_level); ++i) *i->level = v;
 	}
 
-	// individual levels
+	/* individual levels */
 	for (;;) {
 		const DebugLevel *i;
 		int *p;
 
-		// skip delimiters
+		/* skip delimiters */
 		while (*s == ' ' || *s == ',' || *s == '\t') s++;
 		if (*s == '\0') break;
 
 		t = s;
 		while (*s >= 'a' && *s <= 'z') s++;
 
-		// check debugging levels
+		/* check debugging levels */
 		p = NULL;
 		for (i = debug_level; i != endof(debug_level); ++i)
 			if (s == t + strlen(i->name) && strncmp(t, i->name, s - t) == 0) {
--- a/src/dedicated.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/dedicated.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file dedicated.cpp */
+
 #include "stdafx.h"
 
 #ifdef ENABLE_NETWORK
@@ -43,7 +45,7 @@
 		}
 
 		default:
-			// We're the parent
+			/* We're the parent */
 			printf("Loading dedicated server...\n");
 			printf("  - Forked to background with pid %d\n", pid);
 			exit(0);
--- a/src/depot.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/depot.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file depot.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "depot.h"
--- a/src/depot.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/depot.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,11 +1,10 @@
 /* $Id$ */
 
+/** @file depot.h Header files for depots (not hangars) */
+
 #ifndef DEPOT_H
 #define DEPOT_H
 
-/** @file depot.h Header files for depots (not hangars)
- *  @see depot.c */
-
 #include "direction.h"
 #include "oldpool.h"
 #include "tile.h"
@@ -55,6 +54,7 @@
  * Get the new proposed service interval for the vehicle is indeed, clamped
  * within the given bounds. @see MIN_SERVINT_PERCENT ,etc.
  * @param index proposed service interval
+ * @return service interval
  */
 static inline Date GetServiceIntervalClamped(uint index)
 {
@@ -85,7 +85,7 @@
 
 /**
  * Find out if the slope of the tile is suitable to build a depot of given direction
- * @param direction The direction in which the depot's exit points. Starts with 0 as NE and goes Clockwise
+ * @param direction The direction in which the depot's exit points
  * @param tileh The slope of the tile in question
  * @return true if the construction is possible
 
@@ -98,7 +98,7 @@
  * 03 (exit towards NW) we need either bit 0 or 4 set in tileh: 0x4C >> 3 = 1001<p>
  * So ((0x4C >> direction) & tileh) determines whether the depot can be built on the current tileh
  */
-static inline bool CanBuildDepotByTileh(uint32 direction, Slope tileh)
+static inline bool CanBuildDepotByTileh(DiagDirection direction, Slope tileh)
 {
 	return ((0x4C >> direction) & tileh) != 0;
 }
--- a/src/depot_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/depot_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** depot_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
@@ -36,8 +38,8 @@
 	DEPOT_WIDGET_SELL_ALL,
 	DEPOT_WIDGET_AUTOREPLACE,
 	DEPOT_WIDGET_MATRIX,
-	DEPOT_WIDGET_V_SCROLL, // Vertical scrollbar
-	DEPOT_WIDGET_H_SCROLL, // Horizontal scrollbar
+	DEPOT_WIDGET_V_SCROLL, ///< Vertical scrollbar
+	DEPOT_WIDGET_H_SCROLL, ///< Horizontal scrollbar
 	DEPOT_WIDGET_BUILD,
 	DEPOT_WIDGET_CLONE,
 	DEPOT_WIDGET_LOCATION,
@@ -636,7 +638,7 @@
 /* Array to hold the default resize capacities
 * First part is the vehicle type, while the last is 0 = x, 1 = y */
 const uint _resize_cap[][2] = {
-/* VEH_Train */    {6, 10 * 29 + 36}, // flags, unitnumber and unit count uses a total of 36 pixels and we set default to 10 units
+/* VEH_Train */    {6, 10 * 29 + 36}, ///< flags, unitnumber and unit count uses a total of 36 pixels and we set default to 10 units
 /* VEH_Road */     {5, 5},
 /* VEH_Ship */     {3, 3},
 /* VEH_Aircraft */ {3, 4},
--- a/src/direction.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/direction.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file direction.h */
+
 #ifndef DIRECTION_H
 #define DIRECTION_H
 
@@ -9,7 +11,7 @@
 typedef enum Direction {
 	DIR_BEGIN = 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_SE  = 3,
 	DIR_S   = 4,
@@ -59,7 +61,7 @@
 /* Direction commonly used as the direction of entering and leaving tiles, 4-way */
 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_SW  = 2,
 	DIAGDIR_NW  = 3,
--- a/src/disaster_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/disaster_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file
+/** @file disaster_cmd.cpp
  * All disaster/easter egg vehicles are handled here.
  * The general flow of control for the disaster vehicles is as follows:
  * <ol>
@@ -99,13 +99,13 @@
 static const SpriteID _disaster_images_9[] = {SPR_ROTOR_MOVING_1, SPR_ROTOR_MOVING_1, SPR_ROTOR_MOVING_1, SPR_ROTOR_MOVING_1, SPR_ROTOR_MOVING_1, SPR_ROTOR_MOVING_1, SPR_ROTOR_MOVING_1, SPR_ROTOR_MOVING_1};
 
 static const SpriteID * const _disaster_images[] = {
-	_disaster_images_1, _disaster_images_1,                     // zeppeliner and zeppeliner shadow
-	_disaster_images_2, _disaster_images_2,                     // small ufo and small ufo shadow
-	_disaster_images_3, _disaster_images_3,                     // combat aircraft and shadow
-	_disaster_images_8, _disaster_images_8, _disaster_images_9, // combat helicopter, shadow and rotor
-	_disaster_images_6, _disaster_images_6,                     // big ufo and shadow
-	_disaster_images_7, _disaster_images_7,                     // skyranger and shadow
-	_disaster_images_4, _disaster_images_5,                     // small and big submarine sprites
+	_disaster_images_1, _disaster_images_1,                     ///< zeppeliner and zeppeliner shadow
+	_disaster_images_2, _disaster_images_2,                     ///< small ufo and small ufo shadow
+	_disaster_images_3, _disaster_images_3,                     ///< combat aircraft and shadow
+	_disaster_images_8, _disaster_images_8, _disaster_images_9, ///< combat helicopter, shadow and rotor
+	_disaster_images_6, _disaster_images_6,                     ///< big ufo and shadow
+	_disaster_images_7, _disaster_images_7,                     ///< skyranger and shadow
+	_disaster_images_4, _disaster_images_5,                     ///< small and big submarine sprites
 };
 
 static void DisasterVehicleUpdateImage(Vehicle *v)
@@ -200,7 +200,6 @@
  */
 static void DisasterTick_Zeppeliner(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
 	Station *st;
 	int x, y;
 	byte z;
@@ -211,7 +210,7 @@
 	if (v->current_order.dest < 2) {
 		if (HASBIT(v->tick_counter, 0)) return;
 
-		GetNewVehiclePos(v, &gp);
+		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 
 		SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 
@@ -308,7 +307,6 @@
  */
 static void DisasterTick_Ufo(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
 	Vehicle *u;
 	uint dist;
 	byte z;
@@ -321,7 +319,7 @@
 		int y = TileY(v->dest_tile) * TILE_SIZE;
 		if (delta(x, v->x_pos) + delta(y, v->y_pos) >= TILE_SIZE) {
 			v->direction = GetDirectionTowards(v, x, y);
-			GetNewVehiclePos(v, &gp);
+			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 			return;
 		}
@@ -356,7 +354,7 @@
 		}
 
 		v->direction = GetDirectionTowards(v, u->x_pos, u->y_pos);
-		GetNewVehiclePos(v, &gp);
+		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 
 		z = v->z_pos;
 		if (dist <= TILE_SIZE && z > u->z_pos) z--;
@@ -406,13 +404,11 @@
  */
 static void DisasterTick_Airplane(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
-
 	v->tick_counter++;
 	v->u.disaster.image_override =
 		(v->current_order.dest == 1 && HASBIT(v->tick_counter, 2)) ? SPR_F_15_FIRING : 0;
 
-	GetNewVehiclePos(v, &gp);
+	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 
 	if (gp.x < (-10 * TILE_SIZE)) {
@@ -481,13 +477,11 @@
  */
 static void DisasterTick_Helicopter(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
-
 	v->tick_counter++;
 	v->u.disaster.image_override =
 		(v->current_order.dest == 1 && HASBIT(v->tick_counter, 2)) ? SPR_AH_64A_FIRING : 0;
 
-	GetNewVehiclePos(v, &gp);
+	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 
 	if (gp.x > (int)MapSizeX() * TILE_SIZE + 9 * TILE_SIZE - 1) {
@@ -568,7 +562,6 @@
  */
 static void DisasterTick_Big_Ufo(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
 	byte z;
 	Vehicle *u, *w;
 	Town *t;
@@ -583,7 +576,7 @@
 		if (delta(v->x_pos, x) + delta(v->y_pos, y) >= 8) {
 			v->direction = GetDirectionTowards(v, x, y);
 
-			GetNewVehiclePos(v, &gp);
+			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 			return;
 		}
@@ -632,7 +625,7 @@
 		int y = TileY(v->dest_tile) * TILE_SIZE;
 		if (delta(x, v->x_pos) + delta(y, v->y_pos) >= TILE_SIZE) {
 			v->direction = GetDirectionTowards(v, x, y);
-			GetNewVehiclePos(v, &gp);
+			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 			return;
 		}
@@ -665,13 +658,12 @@
  */
 static void DisasterTick_Big_Ufo_Destroyer(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
 	Vehicle *u;
 	int i;
 
 	v->tick_counter++;
 
-	GetNewVehiclePos(v, &gp);
+	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 	SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 
 	if (gp.x > (int)MapSizeX() * TILE_SIZE + 9 * TILE_SIZE - 1) {
@@ -711,7 +703,6 @@
  */
 static void DisasterTick_Submarine(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
 	TileIndex tile;
 
 	v->tick_counter++;
@@ -731,7 +722,7 @@
 		TrackdirBits r = (TrackdirBits)GetTileTrackStatus(tile, TRANSPORT_WATER);
 
 		if (TrackdirBitsToTrackBits(r) == TRACK_BIT_ALL && !CHANCE16(1, 90)) {
-			GetNewVehiclePos(v, &gp);
+			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 			SetDisasterVehiclePos(v, gp.x, gp.y, v->z_pos);
 			return;
 		}
@@ -1029,14 +1020,14 @@
 	Year min;
 	Year max;
 } _dis_years[] = {
-	{ 1930, 1955 }, // zeppeliner
-	{ 1940, 1970 }, // ufo (small)
-	{ 1960, 1990 }, // airplane
-	{ 1970, 2000 }, // helicopter
-	{ 2000, 2100 }, // ufo (big)
-	{ 1940, 1965 }, // submarine (small)
-	{ 1975, 2010 }, // submarine (big)
-	{ 1950, 1985 }  // coalmine
+	{ 1930, 1955 }, ///< zeppeliner
+	{ 1940, 1970 }, ///< ufo (small)
+	{ 1960, 1990 }, ///< airplane
+	{ 1970, 2000 }, ///< helicopter
+	{ 2000, 2100 }, ///< ufo (big)
+	{ 1940, 1965 }, ///< submarine (small)
+	{ 1975, 2010 }, ///< submarine (big)
+	{ 1950, 1985 }  ///< coalmine
 };
 
 
--- a/src/dock_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/dock_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file dock_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/sprites.h"
--- a/src/driver.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/driver.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file driver.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -143,13 +145,13 @@
 		char buffer[256];
 		const char* parms[32];
 
-		// Extract the driver name and put parameter list in parm
+		/* Extract the driver name and put parameter list in parm */
 		ttd_strlcpy(buffer, name, sizeof(buffer));
 		parm = strchr(buffer, ':');
 		parms[0] = NULL;
 		if (parm != NULL) {
 			uint np = 0;
-			// Tokenize the parm.
+			/* Tokenize the parm. */
 			do {
 				*parm++ = '\0';
 				if (np < lengthof(parms) - 1)
--- a/src/driver.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/driver.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file driver.h */
+
 #ifndef DRIVER_H
 #define DRIVER_H
 
--- a/src/dummy_land.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/dummy_land.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file dummy_land.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
--- a/src/economy.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/economy.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file economy.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "currency.h"
@@ -33,8 +35,9 @@
 #include "newgrf_callbacks.h"
 #include "unmovable.h"
 #include "date.h"
+#include "cargotype.h"
 
-// Score info
+/* Score info */
 const ScoreInfo _score_info[] = {
 	{ SCORE_VEHICLES,        120, 100 },
 	{ SCORE_STATIONS,         80, 100 },
@@ -89,8 +92,12 @@
 	return max(value, 1LL);
 }
 
-// if update is set to true, the economy is updated with this score
-//  (also the house is updated, should only be true in the on-tick event)
+/** if update is set to true, the economy is updated with this score
+ *  (also the house is updated, should only be true in the on-tick event)
+ * @param update the economy with calculated score
+ * @param p player been evaluated
+ * @return actual score of this player
+ * */
 int UpdateCompanyRatingAndValue(Player *p, bool update)
 {
 	byte owner = p->index;
@@ -208,15 +215,15 @@
 		_score_part[owner][SCORE_LOAN] = _score_info[SCORE_LOAN].needed - p->current_loan;
 	}
 
-	// Now we calculate the score for each item..
+	/* Now we calculate the score for each item.. */
 	{
 		int total_score = 0;
 		int s;
 		score = 0;
 		for (ScoreID i = SCORE_BEGIN; i < SCORE_END; i++) {
-			// Skip the total
+			/* Skip the total */
 			if (i == SCORE_TOTAL) continue;
-			// Check the score
+			/*  Check the score */
 			s = (_score_part[owner][i] >= _score_info[i].needed) ?
 				_score_info[i].score :
 				_score_part[owner][i] * _score_info[i].score / _score_info[i].needed;
@@ -227,7 +234,7 @@
 
 		_score_part[owner][SCORE_TOTAL] = score;
 
-		// We always want the score scaled to SCORE_MAX (1000)
+		/*  We always want the score scaled to SCORE_MAX (1000) */
 		if (total_score != SCORE_MAX) score = score * SCORE_MAX / total_score;
 	}
 
@@ -241,7 +248,7 @@
 	return score;
 }
 
-// use PLAYER_SPECTATOR as new_player to delete the player.
+/*  use PLAYER_SPECTATOR as new_player to delete the player. */
 void ChangeOwnershipOfPlayerItems(PlayerID old_player, PlayerID new_player)
 {
 	Town *t;
@@ -293,7 +300,7 @@
 		int num_aircraft = 0;
 		Vehicle *v;
 
-		// Determine Ids for the new vehicles
+		/*  Determine Ids for the new vehicles */
 		FOR_ALL_VEHICLES(v) {
 			if (v->owner == new_player) {
 				switch (v->type) {
@@ -327,7 +334,7 @@
 		}
 	}
 
-	// Change ownership of tiles
+	/*  Change ownership of tiles */
 	{
 		TileIndex tile = 0;
 		do {
@@ -367,7 +374,7 @@
 	PlayerID owner;
 	int64 val;
 
-	// If the player has money again, it does not go bankrupt
+	/*  If the player has money again, it does not go bankrupt */
 	if (p->player_money >= 0) {
 		p->quarters_of_bankrupcy = 0;
 		return;
@@ -391,8 +398,8 @@
 				break;
 			}
 
-			// Check if the company has any value.. if not, declare it bankrupt
-			//  right now
+			/* Check if the company has any value.. if not, declare it bankrupt
+			 *  right now */
 			val = CalculateCompanyValue(p);
 			if (val > 0) {
 				p->bankrupt_value = val;
@@ -400,13 +407,13 @@
 				p->bankrupt_timeout = 0;
 				break;
 			}
-			// Else, falltrue to case 4...
+			/* Else, falltrue to case 4... */
 		}
 		case 4: {
-			// Close everything the owner has open
+			/* Close everything the owner has open */
 			DeletePlayerWindows(owner);
 
-//		Show bankrupt news
+			/* Show bankrupt news */
 			SetDParam(0, p->name_1);
 			SetDParam(1, p->name_2);
 			AddNewsItem( (StringID)(owner | NB_BBANKRUPT), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
@@ -612,19 +619,21 @@
 
 static void AddSingleInflation(int32 *value, uint16 *frac, int32 amt)
 {
-	int64 tmp;
-	int32 low;
-	tmp = BIGMULS(*value, amt);
-	*frac = (uint16)(low = (uint16)tmp + *frac);
-	*value += (int32)(tmp >> 16) + (low >> 16);
+	int64 tmp = (int64)*value * amt + *frac;
+	*frac   = GB(tmp, 0, 16);
+	*value += tmp >> 16;
 }
 
 static void AddInflation(void)
 {
-	int i;
+	/* Approximation for (100 + infl_amount)% ** (1 / 12) - 100%
+	 * scaled by 65536
+	 * 12 -> months per year
+	 * This is only a good approxiamtion for small values
+	 */
 	int32 inf = _economy.infl_amount * 54;
 
-	for (i = 0; i != NUM_PRICES; i++) {
+	for (uint i = 0; i != NUM_PRICES; i++) {
 		AddSingleInflation((int32*)&_price + i, _price_frac + i, inf);
 	}
 
@@ -634,7 +643,7 @@
 		_economy.max_loan += 50000;
 
 	inf = _economy.infl_amount_pr * 54;
-	for (i = 0; i != NUM_CARGO; i++) {
+	for (uint i = 0; i != NUM_CARGO; i++) {
 		AddSingleInflation(
 			(int32*)_cargo_payment_rates + i,
 			_cargo_payment_rates_frac + i,
@@ -690,55 +699,55 @@
 };
 
 static const int32 _price_base[NUM_PRICES] = {
-	    100, // station_value
-	    100, // build_rail
-	     95, // build_road
-	     65, // build_signals
-	    275, // build_bridge
-	    600, // build_train_depot
-	    500, // build_road_depot
-	    700, // build_ship_depot
-	    450, // build_tunnel
-	    200, // train_station_track
-	    180, // train_station_length
-	    600, // build_airport
-	    200, // build_bus_station
-	    200, // build_truck_station
-	    350, // build_dock
-	 400000, // build_railvehicle
-	   2000, // build_railwagon
-	 700000, // aircraft_base
-	  14000, // roadveh_base
-	  65000, // ship_base
-	     20, // build_trees
-	    250, // terraform
-	     20, // clear_1
-	     40, // purchase_land
-	    200, // clear_2
-	    500, // clear_3
-	     20, // remove_trees
-	    -70, // remove_rail
-	     10, // remove_signals
-	     50, // clear_bridge
-	     80, // remove_train_depot
-	     80, // remove_road_depot
-	     90, // remove_ship_depot
-	     30, // clear_tunnel
-	  10000, // clear_water
-	     50, // remove_rail_station
-	     30, // remove_airport
-	     50, // remove_bus_station
-	     50, // remove_truck_station
-	     55, // remove_dock
-	   1600, // remove_house
-	     40, // remove_road
-	   5600, // running_rail[0] railroad
-	   5200, // running_rail[1] monorail
-	   4800, // running_rail[2] maglev
-	   9600, // aircraft_running
-	   1600, // roadveh_running
-	   5600, // ship_running
-	1000000, // build_industry
+	    100, ///< station_value
+	    100, ///< build_rail
+	     95, ///< build_road
+	     65, ///< build_signals
+	    275, ///< build_bridge
+	    600, ///< build_train_depot
+	    500, ///< build_road_depot
+	    700, ///< build_ship_depot
+	    450, ///< build_tunnel
+	    200, ///< train_station_track
+	    180, ///< train_station_length
+	    600, ///< build_airport
+	    200, ///< build_bus_station
+	    200, ///< build_truck_station
+	    350, ///< build_dock
+	 400000, ///< build_railvehicle
+	   2000, ///< build_railwagon
+	 700000, ///< aircraft_base
+	  14000, ///< roadveh_base
+	  65000, ///< ship_base
+	     20, ///< build_trees
+	    250, ///< terraform
+	     20, ///< clear_1
+	     40, ///< purchase_land
+	    200, ///< clear_2
+	    500, ///< clear_3
+	     20, ///< remove_trees
+	    -70, ///< remove_rail
+	     10, ///< remove_signals
+	     50, ///< clear_bridge
+	     80, ///< remove_train_depot
+	     80, ///< remove_road_depot
+	     90, ///< remove_ship_depot
+	     30, ///< clear_tunnel
+	  10000, ///< clear_water
+	     50, ///< remove_rail_station
+	     30, ///< remove_airport
+	     50, ///< remove_bus_station
+	     50, ///< remove_truck_station
+	     55, ///< remove_dock
+	   1600, ///< remove_house
+	     40, ///< remove_road
+	   5600, ///< running_rail[0] railroad
+	   5200, ///< running_rail[1] monorail
+	   4800, ///< running_rail[2] maglev
+	   9600, ///< aircraft_running
+	   1600, ///< roadveh_running
+	   5600, ///< ship_running
+	1000000, ///< build_industry
 };
 
 static byte price_base_multiplier[NUM_PRICES];
@@ -750,7 +759,7 @@
 {
 	uint i;
 
-	// 8 means no multiplier.
+	/* 8 means no multiplier. */
 	for (i = 0; i < NUM_PRICES; i++)
 		price_base_multiplier[i] = 8;
 }
@@ -807,7 +816,8 @@
 	Pair tp;
 
 	/* if mode is false, use the singular form */
-	SetDParam(0, _cargoc.names_s[s->cargo_type] + (mode ? 0 : 32));
+	const CargoSpec *cs = GetCargo(s->cargo_type);
+	SetDParam(0, mode ? cs->name_plural : cs->name);
 
 	if (s->age < 12) {
 		if (s->cargo_type != CT_PASSENGERS && s->cargo_type != CT_MAIL) {
@@ -924,7 +934,7 @@
 	fr->from = i = GetRandomIndustry();
 	if (i == NULL) return;
 
-	// Randomize cargo type
+	/* Randomize cargo type */
 	if (Random()&1 && i->produced_cargo[1] != CT_INVALID) {
 		cargo = i->produced_cargo[1];
 		trans = i->pct_transported[1];
@@ -935,28 +945,28 @@
 		total = i->total_production[0];
 	}
 
-	// Quit if no production in this industry
-	//  or if the cargo type is passengers
-	//  or if the pct transported is already large enough
+	/* Quit if no production in this industry
+	 * or if the cargo type is passengers
+	 * or if the pct transported is already large enough */
 	if (total == 0 || trans > 42 || cargo == CT_INVALID || cargo == CT_PASSENGERS)
 		return;
 
 	fr->cargo = cargo;
 
 	if (cargo == CT_GOODS || cargo == CT_FOOD) {
-		// The destination is a town
+		/*  The destination is a town */
 		Town *t = GetRandomTown();
 
-		// Only want big towns
+		/* Only want big towns */
 		if (t == NULL || t->population < 900) return;
 
 		fr->distance = DistanceManhattan(i->xy, t->xy);
 		fr->to = t;
 	} else {
-		// The destination is an industry
+		/* The destination is an industry */
 		Industry *i2 = GetRandomIndustry();
 
-		// The industry must accept the cargo
+		/* The industry must accept the cargo */
 		if (i == i2 || i == NULL ||
 				(cargo != i2->accepts_cargo[0] &&
 				cargo != i2->accepts_cargo[1] &&
@@ -1014,9 +1024,9 @@
 		}
 	}
 
-	// 25% chance to go on
+	/* 25% chance to go on */
 	if (CHANCE16(1,4)) {
-		// Find a free slot
+		/*  Find a free slot*/
 		s = _subsidies;
 		while (s->cargo_type != CT_INVALID) {
 			if (++s == endof(_subsidies))
@@ -1087,6 +1097,7 @@
 int32 GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, CargoID cargo_type)
 {
 	CargoID cargo = cargo_type;
+	const CargoSpec *cs = GetCargo(cargo_type);
 	byte f;
 
 	/* zero the distance if it's the bank and very short transport. */
@@ -1094,12 +1105,12 @@
 		dist = 0;
 
 	f = 255;
-	if (transit_days > _cargoc.transit_days_1[cargo]) {
-		transit_days -= _cargoc.transit_days_1[cargo];
+	if (transit_days > cs->transit_days[0]) {
+		transit_days -= cs->transit_days[0];
 		f -= transit_days;
 
-		if (transit_days > _cargoc.transit_days_2[cargo]) {
-			transit_days -= _cargoc.transit_days_2[cargo];
+		if (transit_days > cs->transit_days[1]) {
+			transit_days -= cs->transit_days[1];
 
 			if (f < transit_days) {
 				f = 0;
@@ -1119,10 +1130,10 @@
 	Industry* ind;
 	uint u;
 
-	// Check if there's an industry close to the station that accepts the cargo
-	// XXX - Think of something better to
-	//       1) Only deliver to industries which are withing the catchment radius
-	//       2) Distribute between industries if more then one is present
+	/* Check if there's an industry close to the station that accepts the cargo
+	 * XXX - Think of something better to
+	 *       1) Only deliver to industries which are withing the catchment radius
+	 *       2) Distribute between industries if more then one is present */
 	u = (_patches.station_spread + 8) * 2;
 	FOR_ALL_INDUSTRIES(ind) {
 		uint t;
@@ -1153,7 +1164,7 @@
 	Pair pair;
 	Player *p;
 
-	// check if there is an already existing subsidy that applies to us
+	/* check if there is an already existing subsidy that applies to us */
 	for (s = _subsidies; s != endof(_subsidies); s++) {
 		if (s->cargo_type == cargo_type &&
 				s->age >= 12 &&
@@ -1222,31 +1233,31 @@
 
 	assert(num_pieces > 0);
 
-	// Update player statistics
+	/* Update player statistics */
 	{
 		Player *p = GetPlayer(_current_player);
 		p->cur_economy.delivered_cargo += num_pieces;
 		SETBIT(p->cargo_types, cargo_type);
 	}
 
-	// Get station pointers.
+	/* Get station pointers. */
 	s_from = GetStation(source);
 	s_to = GetStation(dest);
 
-	// Check if a subsidy applies.
+	/* Check if a subsidy applies. */
 	subsidised = CheckSubsidised(s_from, s_to, cargo_type);
 
-	// Increase town's counter for some special goods types
+	/* Increase town's counter for some special goods types */
 	if (cargo_type == CT_FOOD) s_to->town->new_act_food += num_pieces;
 	if (cargo_type == CT_WATER)  s_to->town->new_act_water += num_pieces;
 
-	// Give the goods to the industry.
+	/* Give the goods to the industry. */
 	DeliverGoodsToIndustry(s_to->xy, cargo_type, num_pieces);
 
-	// Determine profit
+	/* Determine profit */
 	profit = GetTransportedGoodsIncome(num_pieces, DistanceManhattan(source_tile, s_to->xy), days_in_transit, cargo_type);
 
-	// Modify profit if a subsidy is in effect
+	/* Modify profit if a subsidy is in effect */
 	if (subsidised) {
 		switch (_opt.diff.subsidy_multiplier) {
 			case 0:  profit += profit >> 1; break;
@@ -1372,10 +1383,10 @@
 			CLRBIT(u->load_status, LS_LOADING_FINISHED);
 
 			if (v->cargo_source != last_visited && ge->waiting_acceptance & 0x8000 && !(u->current_order.flags & OF_TRANSFER)) {
-				// deliver goods to the station
+				/* deliver goods to the station */
 				st->time_since_unload = 0;
 
-				unloading_time += v->cargo_count; /* TTDBUG: bug in original TTD */
+				unloading_time += v->cargo_count; // TTDBUG: bug in original TTD
 				if (just_arrived && v->cargo_paid_for < v->cargo_count) {
 					profit += DeliverGoods(v->cargo_count - v->cargo_paid_for, v->cargo_type, v->cargo_source, last_visited, v->cargo_source_xy, v->cargo_days);
 					v->cargo_paid_for = v->cargo_count;
@@ -1401,12 +1412,12 @@
 				unloading_time += v->cargo_count;
 				t = GB(ge->waiting_acceptance, 0, 12);
 				if (t == 0) {
-					// No goods waiting at station
+					/* No goods waiting at station */
 					ge->enroute_time = v->cargo_days;
 					ge->enroute_from = v->cargo_source;
 					ge->enroute_from_xy = v->cargo_source_xy;
 				} else {
-					// Goods already waiting at station. Set counters to the worst value.
+					/* Goods already waiting at station. Set counters to the worst value. */
 					if (v->cargo_days >= ge->enroute_time) ge->enroute_time = v->cargo_days;
 
 					if (last_visited != ge->enroute_from) {
@@ -1414,7 +1425,7 @@
 						ge->enroute_from_xy = v->cargo_source_xy;
 					}
 				}
-				// Update amount of waiting cargo
+				/* Update amount of waiting cargo */
 				SB(ge->waiting_acceptance, 0, 12, min(amount_unloaded + t, 0xFFF));
 
 				if (u->current_order.flags & OF_TRANSFER) {
@@ -1448,12 +1459,12 @@
 			default:        t = u->max_speed;               break;
 		}
 
-		// if last speed is 0, we treat that as if no vehicle has ever visited the station.
+		/* if last speed is 0, we treat that as if no vehicle has ever visited the station. */
 		ge->last_speed = min(t, 255);
 		ge->last_age = _cur_year - v->build_year;
 
-		// If there's goods waiting at the station, and the vehicle
-		//  has capacity for it, load it on the vehicle.
+		/* If there's goods waiting at the station, and the vehicle
+		 * has capacity for it, load it on the vehicle. */
 		if (count != 0 &&
 				(cap = v->cargo_cap - v->cargo_count) != 0) {
 			int cargoshare;
@@ -1470,7 +1481,7 @@
 			 * loading them. Since this will cause
 			 * VEHICLE_TRIGGER_EMPTY to be called at the time when
 			 * the whole vehicle chain is really totally empty, the
-			 * @completely_empty assignment can then be safely
+			 * completely_empty assignment can then be safely
 			 * removed; that's how TTDPatch behaves too. --pasky */
 			completely_empty = false;
 			anything_loaded = true;
@@ -1487,7 +1498,7 @@
 			unloading_time += cap;
 			st->time_since_load = 0;
 
-			// And record the source of the cargo, and the days in travel.
+			/* And record the source of the cargo, and the days in travel. */
 			v->cargo_source = ge->enroute_from;
 			v->cargo_source_xy = ge->enroute_from_xy;
 			v->cargo_days = ge->enroute_time;
@@ -1518,7 +1529,7 @@
 	}
 
 	if (v->type == VEH_Train) {
-		// Each platform tile is worth 2 rail vehicles.
+		/* Each platform tile is worth 2 rail vehicles. */
 		int overhang = v->u.rail.cached_total_length - st->GetPlatformLength(v->tile) * TILE_SIZE;
 		if (overhang > 0) {
 			unloading_time <<= 1;
@@ -1560,7 +1571,7 @@
 	if (_patches.inflation && _cur_year < MAX_YEAR)
 		AddInflation();
 	PlayersPayInterest();
-	// Reset the _current_player flag
+	/* Reset the _current_player flag */
 	_current_player = OWNER_NONE;
 	HandleEconomyFluctuations();
 	SubsidyMonthlyHandler();
@@ -1577,7 +1588,7 @@
 	SetDParam(2, p->bankrupt_value);
 	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 */
 	PlayerID pi = p->index;
 	ChangeOwnershipOfPlayerItems(pi, _current_player);
 
@@ -1674,7 +1685,7 @@
 
 	if (flags & DC_EXEC) {
 		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;
 		InvalidateWindow(WC_COMPANY, p1);
 	}
@@ -1707,14 +1718,14 @@
 	return p->bankrupt_value;
 }
 
-// Prices
+/** Prices */
 static void SaveLoad_PRIC(void)
 {
 	SlArray(&_price,      NUM_PRICES, SLE_INT32);
 	SlArray(&_price_frac, NUM_PRICES, SLE_UINT16);
 }
 
-// Cargo payment rates
+/** Cargo payment rates */
 static void SaveLoad_CAPR(void)
 {
 	SlArray(&_cargo_payment_rates,      NUM_CARGO, SLE_INT32);
@@ -1731,7 +1742,7 @@
 	SLE_END()
 };
 
-// Economy variables
+/** Economy variables */
 static void SaveLoad_ECMY(void)
 {
 	SlObject(&_economy, _economy_desc);
--- a/src/economy.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/economy.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file economy.h */
+
 #ifndef ECONOMY_H
 #define ECONOMY_H
 
@@ -7,15 +9,12 @@
 void SetPriceBaseMultiplier(uint price, byte factor);
 
 typedef struct {
-	// Maximum possible loan
-	int32 max_loan;
-	int32 max_loan_unround;
-	// Economy fluctuation status
+	int32 max_loan;         ///< Maximum possible loan
+	int32 max_loan_unround; ///< Economy fluctuation status
 	int fluct;
-	// Interest
-	byte interest_rate;
-	byte infl_amount;
-	byte infl_amount_pr;
+	byte interest_rate;     ///< Interest
+	byte infl_amount;       ///< inflation amount
+	byte infl_amount_pr;    ///< "floating" portion of inflation
 } Economy;
 
 VARDEF Economy _economy;
@@ -40,19 +39,19 @@
 	SCORE_CARGO      = 6,
 	SCORE_MONEY      = 7,
 	SCORE_LOAN       = 8,
-	SCORE_TOTAL      = 9, // This must always be the last entry
-	SCORE_END        = 10, // How many scores are there..
+	SCORE_TOTAL      = 9,  ///< This must always be the last entry
+	SCORE_END        = 10, ///< How many scores are there..
 
-	SCORE_MAX = 1000 // The max score that can be in the performance history
-	//  the scores together of score_info is allowed to be more!
+	SCORE_MAX = 1000       ///< The max score that can be in the performance history
+	/* the scores together of score_info is allowed to be more! */
 };
 
 DECLARE_POSTFIX_INCREMENT(ScoreID);
 
 typedef struct ScoreInfo {
-	byte id;    // Unique ID of the score
-	int needed; // How much you need to get the perfect score
-	int score;  // How much score it will give
+	byte id;    ///< Unique ID of the score
+	int needed; ///< How much you need to get the perfect score
+	int score;  ///< How much score it will give
 } ScoreInfo;
 
 extern const ScoreInfo _score_info[];
--- a/src/elrail.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/elrail.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,5 @@
 /* $Id$ */
-/** @file elrail.c
+/** @file elrail.cpp
  * This file deals with displaying wires and pylons for electric railways.
  * <h2>Basics</h2>
  *
--- a/src/endian_check.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/endian_check.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,16 +1,17 @@
 /* $Id$ */
 
+/** @file endian_check.cpp
+ * 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
+ *  number. If it is 1, it is LITTLE_ENDIAN, if it is 256, it is BIG_ENDIAN
+ *
+ * After that it outputs the contents of an include files (endian.h)
+ *  that says or TTD_LITTLE_ENDIAN, or TTD_BIG_ENDIAN. Makefile takes
+ *  care of the real writing to the file. */
+
 #include <stdio.h>
 #include <string.h>
 
-// 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
-//  number. If it is 1, it is LITTLE_ENDIAN, if it is 256, it is BIG_ENDIAN
-//
-// After that it outputs the contents of an include files (endian.h)
-//  that says or TTD_LITTLE_ENDIAN, or TTD_BIG_ENDIAN. Makefile takes
-//  care of the real writing to the file.
-
 int main (int argc, char *argv[]) {
 	unsigned char EndianTest[2] = { 1, 0 };
 	int force_BE = 0, force_LE = 0, force_PREPROCESSOR = 0;
@@ -31,9 +32,9 @@
 			printf("#define TTD_BIG_ENDIAN\n");
 		} else {
 			if (force_PREPROCESSOR == 1) {
-				// adding support for universal binaries on OSX
-				// Universal binaries supports both PPC and x86
-				// If a compiler for OSX gets this setting, it will always pick the correct endian and no test is needed
+				/** adding support for universal binaries on OSX
+				 * Universal binaries supports both PPC and x86
+				 * If a compiler for OSX gets this setting, it will always pick the correct endian and no test is needed */
 				printf("#ifdef __BIG_ENDIAN__\n");
 				printf("#define TTD_BIG_ENDIAN\n");
 				printf("#else\n");
--- a/src/engine.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/engine.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file engine.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -122,9 +124,9 @@
 		e->flags = 0;
 		e->player_avail = 0;
 
-		// The magic value of 729 days below comes from the NewGRF spec. If the
-		// base intro date is before 1922 then the random number of days is not
-		// added.
+		/* The magic value of 729 days below comes from the NewGRF spec. If the
+		 * base intro date is before 1922 then the random number of days is not
+		 * added. */
 		r = Random();
 		e->intro_date = ei->base_intro <= ConvertYMDToDate(1922, 0, 1) ? ei->base_intro : (Date)GB(r, 0, 9) + ei->base_intro;
 		if (e->intro_date <= _date) {
@@ -154,7 +156,7 @@
 
 		e->lifelength = ei->lifelength + _patches.extend_vehicle_life;
 
-		// prevent certain engines from ever appearing.
+		/* prevent certain engines from ever appearing. */
 		if (!HASBIT(ei->climates, _opt.landscape)) {
 			e->flags |= ENGINE_AVAILABLE;
 			e->player_avail = 0;
@@ -269,7 +271,7 @@
 	return 0;
 }
 
-// Determine if an engine type is a wagon (and not a loco)
+/* Determine if an engine type is a wagon (and not a loco) */
 static bool IsWagon(EngineID index)
 {
 	return index < NUM_TRAIN_ENGINES && RailVehInfo(index)->railveh_type == RAILVEH_WAGON;
@@ -281,8 +283,8 @@
 	Player *p;
 	EngineID index = e - _engines;
 
-	// In case the player didn't build the vehicle during the intro period,
-	// prevent that player from getting future intro periods for a while.
+	/* In case the player didn't build the vehicle during the intro period,
+	 * prevent that player from getting future intro periods for a while. */
 	if (e->flags & ENGINE_INTRODUCING) {
 		FOR_ALL_PLAYERS(p) {
 			uint block_preview = p->block_preview;
@@ -308,14 +310,14 @@
 	e->flags = (e->flags & ~ENGINE_INTRODUCING) | ENGINE_AVAILABLE;
 	AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type);
 
-	// Now available for all players
+	/* Now available for all players */
 	e->player_avail = (byte)-1;
 
-	// Do not introduce new rail wagons
+	/* Do not introduce new rail wagons */
 	if (IsWagon(index)) return;
 
 	if (index < NUM_TRAIN_ENGINES) {
-		// maybe make another rail type available
+		/* maybe make another rail type available */
 		RailType railtype = RailVehInfo(index)->railtype;
 		assert(railtype < RAILTYPE_END);
 		FOR_ALL_PLAYERS(p) {
@@ -338,20 +340,20 @@
 
 	if (_cur_year < YEAR_ENGINE_AGING_STOPS) {
 		for (e = _engines; e != endof(_engines); e++) {
-			// Age the vehicle
+			/* Age the vehicle */
 			if (e->flags & ENGINE_AVAILABLE && e->age != 0xFFFF) {
 				e->age++;
 				CalcEngineReliability(e);
 			}
 
 			if (!(e->flags & ENGINE_AVAILABLE) && _date >= (e->intro_date + 365)) {
-				// Introduce it to all players
+				/* Introduce it to all players */
 				NewVehicleAvailable(e);
 			} else if (!(e->flags & (ENGINE_AVAILABLE|ENGINE_INTRODUCING)) && _date >= e->intro_date) {
-				// Introduction date has passed.. show introducing dialog to one player.
+				/* Introduction date has passed.. show introducing dialog to one player. */
 				e->flags |= ENGINE_INTRODUCING;
 
-				// Do not introduce new rail wagons
+				/* Do not introduce new rail wagons */
 				if (!IsWagon(e - _engines))
 					e->preview_player = (PlayerID)1; // Give to the player with the highest rating.
 			}
@@ -399,15 +401,15 @@
 {
 	const Engine *e;
 
-	// check if it's an engine that is in the engine array
+	/* check if it's an engine that is in the engine array */
 	if (!IsEngineIndex(engine)) return false;
 
 	e = GetEngine(engine);
 
-	// check if it's an engine of specified type
+	/* check if it's an engine of specified type */
 	if (e->type != type) return false;
 
-	// check if it's available
+	/* check if it's available */
 	if (!HASBIT(e->player_avail, player)) return false;
 
 	return true;
@@ -595,7 +597,7 @@
 	SLE_CONDNULL(1, 0, 44),
 	    SLE_VAR(Engine, player_avail,        SLE_UINT8),
 
-	// reserve extra space in savegame here. (currently 16 bytes)
+	/* reserve extra space in savegame here. (currently 16 bytes) */
 	SLE_CONDNULL(16, 2, SL_MAX_VERSION),
 
 	SLE_END()
--- a/src/engine.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/engine.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,19 +1,19 @@
 /* $Id$ */
 
+/** @file engine.h */
+
 #ifndef ENGINE_H
 #define ENGINE_H
 
-/** @file engine.h */
-
 #include "oldpool.h"
 #include "rail.h"
 #include "sound.h"
 #include "vehicle.h"
 
 enum RailVehicleTypes {
-	RAILVEH_SINGLEHEAD,
-	RAILVEH_MULTIHEAD,
-	RAILVEH_WAGON,
+	RAILVEH_SINGLEHEAD,  ///< indicates a "standalone" locomotive
+	RAILVEH_MULTIHEAD,   ///< indicates a combination of two locomotives
+	RAILVEH_WAGON,       ///< simple wagon, not motorized
 };
 
 typedef struct RailVehicleInfo {
@@ -26,7 +26,7 @@
 	uint16 weight;
 	byte running_cost_base;
 	byte running_cost_class;
-	byte engclass; // 0: steam, 1: diesel, 2: electric
+	byte engclass;         ///< 0: steam, 1: diesel, 2: electric
 	byte capacity;
 	CargoID cargo_type;
 	byte ai_rank;
@@ -36,9 +36,9 @@
 	                    //       for when the 'powered wagon' callback fails. But it should really also determine what
 	                    //       kind of visual effect to generate for a vehicle (default, steam, diesel, electric).
 	                    //       Same goes for the callback result, which atm is only used to check if a wagon is powered.
-	byte shorten_factor; // length on main map for this type is 8 - shorten_factor
+	byte shorten_factor;   ///< length on main map for this type is 8 - shorten_factor
 	byte tractive_effort; ///< Tractive effort coefficient
-	byte user_def_data; ///! Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles
+	byte user_def_data;    ///< Property 0x25: "User-defined bit mask" Used only for (very few) NewGRF vehicles
 } RailVehicleInfo;
 
 typedef struct ShipVehicleInfo {
@@ -57,7 +57,7 @@
  * in which case bit 1 tells us whether it's a big(fast) plane or not */
 enum {
 	AIR_HELI = 0,
-	AIR_CTOL = 1, // Conventional Take Off and Landing, i.e. planes
+	AIR_CTOL = 1, ///< Conventional Take Off and Landing, i.e. planes
 	AIR_FAST = 2
 };
 
@@ -111,7 +111,7 @@
 	PlayerByte preview_player;
 	byte preview_wait;
 	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;
 
 /**
--- a/src/engine_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/engine_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file engine_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
--- a/src/fios.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/fios.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file fios.c
+/** @file fios.cpp
  * This file contains functions for building file lists for the save/load dialogs.
  */
 
@@ -21,7 +21,6 @@
 # include <io.h>
 #else
 # include <unistd.h>
-# include <dirent.h>
 #endif /* WIN32 */
 
 /* Variables to display file lists */
@@ -187,9 +186,7 @@
 {
 #if defined(WINCE)
 	/* There is always one platform that doesn't support basic commands... */
-	HANDLE hand;
-
-	hand = CreateFile(OTTD2FS(filename), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
+	HANDLE hand = CreateFile(OTTD2FS(filename), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
 	if (hand == INVALID_HANDLE_VALUE) return 1;
 	CloseHandle(hand);
 	return 0;
@@ -212,6 +209,7 @@
 	DIR *dir;
 	FiosItem *fios;
 	int sort_start;
+	char d_name[sizeof(fios->name)];
 
 	/* A parent directory link exists if we are not in the root directory */
 	if (!FiosIsRoot(_fios_path) && mode != SLD_NEW_GAME) {
@@ -223,9 +221,9 @@
 	}
 
 	/* Show subdirectories */
-	if (mode != SLD_NEW_GAME && (dir = opendir(_fios_path)) != NULL) {
+	if (mode != SLD_NEW_GAME && (dir = ttd_opendir(_fios_path)) != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
-			const char *d_name = FS2OTTD(dirent->d_name);
+			ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name));
 
 			/* found file must be directory, but not '.' or '..' */
 			if (FiosIsValidFile(_fios_path, dirent, &sb) && (sb.st_mode & S_IFDIR) &&
@@ -253,13 +251,12 @@
 	sort_start = _fios_count;
 
 	/* Show files */
-	dir = opendir(_fios_path);
+	dir = ttd_opendir(_fios_path);
 	if (dir != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			char fios_title[64];
 			char *t;
-			char *d_name = (char*)FS2OTTD(dirent->d_name);
-			byte type;
+			ttd_strlcpy(d_name, FS2OTTD(dirent->d_name), sizeof(d_name));
 
 			if (!FiosIsValidFile(_fios_path, dirent, &sb) || !(sb.st_mode & S_IFREG)) continue;
 
@@ -267,7 +264,7 @@
 			if ((t = strrchr(d_name, '.')) == NULL) continue;
 			fios_title[0] = '\0'; // reset the title;
 
-			type = callback_proc(mode, d_name, t, fios_title);
+			byte type = callback_proc(mode, d_name, t, fios_title);
 			if (type != FIOS_TYPE_INVALID) {
 				fios = FiosAlloc();
 				fios->mtime = sb.st_mtime;
--- a/src/fios.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/fios.h	Wed Feb 28 00:33:40 2007 +0000
@@ -77,10 +77,25 @@
 	bool at_first_entry;
 };
 
-DIR *opendir(const char *path);
+DIR *opendir(const wchar_t *path);
 struct dirent *readdir(DIR *d);
 int closedir(DIR *d);
-
+#else
+/* Use system-supplied opendir/readdir/closedir functions */
+# include <sys/types.h>
+# include <dirent.h>
 #endif /* defined(WIN32) */
 
+/**
+ * A wrapper around opendir() which will convert the string from
+ * OPENTTD encoding to that of the filesystem. For all purposes this
+ * function behaves the same as the original opendir function
+ * @param path string to open directory of
+ * @return DIR pointer
+ */
+static inline DIR *ttd_opendir(const char *path)
+{
+	return opendir(OTTD2FS(path));
+}
+
 #endif /* FIOS_H */
--- a/src/gfx.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/gfx.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1987,18 +1987,14 @@
 
 static void SwitchAnimatedCursor(void)
 {
-	CursorVars *cv = &_cursor;
-	const CursorID *cur = cv->animate_cur;
-	CursorID sprite;
+	const AnimCursor *cur = _cursor.animate_cur;
 
-	// ANIM_CURSOR_END is 0xFFFF in table/animcursors.h
-	if (cur == NULL || *cur == 0xFFFF) cur = cv->animate_list;
+	if (cur == NULL || cur->sprite == AnimCursor::LAST) cur = _cursor.animate_list;
 
-	sprite = cur[0];
-	cv->animate_timeout = cur[1];
-	cv->animate_cur = cur + 2;
+	SetCursorSprite(cur->sprite, _cursor.pal);
 
-	SetCursorSprite(sprite, cv->pal);
+	_cursor.animate_timeout = cur->display_time;
+	_cursor.animate_cur     = cur + 1;
 }
 
 void CursorTick(void)
@@ -2015,7 +2011,7 @@
 	SetCursorSprite(sprite, pal);
 }
 
-void SetAnimatedMouseCursor(const CursorID *table)
+void SetAnimatedMouseCursor(const AnimCursor *table)
 {
 	_cursor.animate_list = table;
 	_cursor.animate_cur = NULL;
--- a/src/gfx.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/gfx.h	Wed Feb 28 00:33:40 2007 +0000
@@ -96,6 +96,12 @@
 	int left,top,right,bottom;
 } Rect;
 
+/** A single sprite of a list of animated cursors */
+struct AnimCursor {
+	static const CursorID LAST = MAX_UVALUE(CursorID);
+	CursorID sprite;   ///< Must be set to LAST_ANIM when it is the last sprite of the loop
+	byte display_time; ///< Amount of ticks this sprite will be shown
+};
 
 typedef struct CursorVars {
 	Point pos, size, offs, delta; ///< position, size, offset from top-left, and movement
@@ -104,8 +110,9 @@
 	SpriteID pal;
 
 	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
+	const AnimCursor *animate_list; ///< in case of animated cursor, list of frames
+	const AnimCursor *animate_cur;  ///< in case of animated cursor, current frame
+	uint animate_timeout;           ///< in case of animated cursor, number of ticks to show the current cursor
 
 	bool visible;    ///< cursor is visible
 	bool dirty;      ///< the rect occupied by the mouse is dirty (redraw)
@@ -226,7 +233,7 @@
 
 void SetMouseCursor(CursorID cursor);
 void SetMouseCursor(SpriteID sprite, SpriteID pal);
-void SetAnimatedMouseCursor(const CursorID *table);
+void SetAnimatedMouseCursor(const AnimCursor *table);
 void CursorTick(void);
 void DrawMouseCursor(void);
 void ScreenSizeChanged(void);
--- a/src/gfxinit.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/gfxinit.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -333,6 +333,7 @@
 	377, 377, // · small
 	153, 153, // · medium
 	601, 601, // · large
+	SPR_WARNING_SIGN, SPR_WARNING_SIGN,
 	END
 };
 
--- a/src/graph_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/graph_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -13,8 +13,7 @@
 #include "variables.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};
+#include "cargotype.h"
 
 /* Bitmasks of player and cargo indices that shouldn't be drawn. */
 static uint _legend_excluded_players;
@@ -749,13 +748,14 @@
 			 * clk_dif will move one pixel down and one pixel to the right
 			 * when the button is clicked */
 			byte clk_dif = w->IsWidgetLowered(i + 3) ? 1 : 0;
+			const CargoSpec *cs = GetCargo(i);
 
 			GfxFillRect(x + clk_dif, y + clk_dif, x + 8 + clk_dif, y + 5 + clk_dif, 0);
-			GfxFillRect(x + 1 + clk_dif, y + 1 + clk_dif, x + 7 + clk_dif, y + 4 + clk_dif, _cargo_colours[i]);
-			SetDParam(0, _cargoc.names_s[i]);
+			GfxFillRect(x + 1 + clk_dif, y + 1 + clk_dif, x + 7 + clk_dif, y + 4 + clk_dif, cs->legend_colour);
+			SetDParam(0, cs->name != 0 ? cs->name : (StringID)STR_EMPTY);
 			DrawString(x + 14 + clk_dif, y + clk_dif, STR_7065, 0);
 			y += 8;
-			gd.colors[i] = _cargo_colours[i];
+			gd.colors[i] = cs->legend_colour;
 			for (j = 0; j != 20; j++) {
 				gd.cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 6 + 6, i);
 			}
--- a/src/gui.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/gui.h	Wed Feb 28 00:33:40 2007 +0000
@@ -20,7 +20,6 @@
 void DrawArrowButtons(int x, int y, int ctab, byte state, bool clickable_left, bool clickable_right);
 
 /* graph_gui.c */
-extern const byte _cargo_colours[NUM_CARGO];
 void ShowOperatingProfitGraph(void);
 void ShowIncomeGraph(void);
 void ShowDeliveredCargoGraph(void);
--- a/src/helpers.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/helpers.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -6,8 +6,6 @@
 /** @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 T* MallocT(size_t num_elements)
@@ -82,12 +80,23 @@
 
 /** 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<>. */
+ *  we will create specialization derived from MakeEnumPropsT<>.
+ *  i.e.:
+ *    template <> struct EnumPropsT<Track> : MakeEnumPropsT<Track, byte, TRACK_BEGIN, TRACK_END, INVALID_TRACK> {};
+ *  followed by:
+ *    typedef TinyEnumT<Track> TrackByte;
+ */
 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. */
+ *  dedicated to one of commonly used enumeration types.
+ *  @param Tenum_t enumeration type that you want to describe
+ *  @param Tstorage_t what storage type would be sufficient (i.e. byte)
+ *  @param Tbegin first valid value from the contiguous range (i.e. TRACK_BEGIN)
+ *  @param Tend one past the last valid value from the contiguous range (i.e. TRACK_END)
+ *  @param Tinvalid value used as invalid value marker (i.e. INVALID_TRACK)
+ */
 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)
@@ -140,25 +149,19 @@
 	}
 };
 
-template <typename T> FORCEINLINE T ClrBitT(T t, int bit_index)
+template <typename T> void ClrBitT(T &t, int bit_index)
 {
-	int val = t;
-	CLRBIT(val, bit_index);
-	return (T)val;
+	t = (T)(t & ~((T)1 << bit_index));
 }
 
-template <typename T> FORCEINLINE T SetBitT(T t, int bit_index)
+template <typename T> void SetBitT(T &t, int bit_index)
 {
-	int val = t;
-	SETBIT(val, bit_index);
-	return (T)val;
+	t = (T)(t | ((T)1 << bit_index));
 }
 
-template <typename T> FORCEINLINE T ToggleBitT(T t, int bit_index)
+template <typename T> void ToggleBitT(T &t, int bit_index)
 {
-	int val = t;
-	TOGGLEBIT(val, bit_index);
-	return (T)val;
+	t = (T)(t ^ ((T)1 << bit_index));
 }
 
 /**
@@ -182,12 +185,4 @@
 	}
 };
 
-#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 */
--- a/src/industry.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/industry.h	Wed Feb 28 00:33:40 2007 +0000
@@ -78,7 +78,13 @@
 	StringID production_down_text;
 } IndustrySpec;
 
+typedef struct IndustryTileSpec {
+	CargoID accepts_cargo[3];
+	Slope slopes_refused;
+} IndustryTileSpec;
+
 const IndustrySpec *GetIndustrySpec(IndustryType thistype);
+const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx);
 
 DECLARE_OLD_POOL(Industry, Industry, 3, 8000)
 
--- a/src/industry_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/industry_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -26,6 +26,7 @@
 #include "date.h"
 #include "water_map.h"
 #include "tree_map.h"
+#include "cargotype.h"
 
 void ShowIndustryViewWindow(int industry);
 void BuildOilRig(TileIndex tile);
@@ -86,6 +87,12 @@
 	return &_industry_specs[thistype];
 }
 
+const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx)
+{
+	assert(gfx < NUM_INDUSTRY_GFXES);
+	return &_industry_tile_specs[gfx];
+}
+
 void DestroyIndustry(Industry *i)
 {
 	BEGIN_TILE_LOOP(tile_cur, i->width, i->height, i->xy);
@@ -276,16 +283,16 @@
 
 static void GetAcceptedCargo_Industry(TileIndex tile, AcceptedCargo ac)
 {
-	IndustryGfx gfx = GetIndustryGfx(tile);
+	const IndustryTileSpec *itspec = GetIndustryTileSpec(GetIndustryGfx(tile));
 	CargoID a;
 
-	a = _industry_section_accepts_1[gfx];
-	if (a != CT_INVALID) ac[a] = (a == 0) ? 1 : 8;
+	a = itspec->accepts_cargo[0];
+	if (a != CT_INVALID) ac[a] = (a == CT_PASSENGERS) ? 1 : 8;
 
-	a = _industry_section_accepts_2[gfx];
+	a = itspec->accepts_cargo[1];
 	if (a != CT_INVALID) ac[a] = 8;
 
-	a = _industry_section_accepts_3[gfx];
+	a = itspec->accepts_cargo[2];
 	if (a != CT_INVALID) ac[a] = 8;
 }
 
@@ -1154,7 +1161,7 @@
 					 *  CheckIfCanLevelIndustryPlatform(). */
 					if (tileh != SLOPE_FLAT) {
 						Slope t;
-						byte bits = _industry_section_bits[it->gfx];
+						byte bits = GetIndustryTileSpec(it->gfx)->slopes_refused;
 
 						if (bits & 0x10) return false;
 
@@ -1624,7 +1631,7 @@
 				mag = abs(percent);
 				if (mag >= 10) {
 					SetDParam(2, mag);
-					SetDParam(0, _cargoc.names_s[i->produced_cargo[j]]);
+					SetDParam(0, GetCargo(i->produced_cargo[j])->name);
 					SetDParam(1, i->index);
 					AddNewsItem(
 						percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
--- a/src/industry_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/industry_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -17,6 +17,7 @@
 #include "town.h"
 #include "variables.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 const byte _build_industry_types[4][12] = {
 	{  1,  2,  4,  6,  8,  0,  3,  5,  9, 11, 18 },
@@ -303,13 +304,13 @@
 		if (i->accepts_cargo[0] != CT_INVALID) {
 			StringID str;
 
-			SetDParam(0, _cargoc.names_s[i->accepts_cargo[0]]);
+			SetDParam(0, GetCargo(i->accepts_cargo[0])->name);
 			str = STR_4827_REQUIRES;
 			if (i->accepts_cargo[1] != CT_INVALID) {
-				SetDParam(1, _cargoc.names_s[i->accepts_cargo[1]]);
+				SetDParam(1, GetCargo(i->accepts_cargo[1])->name);
 				str = STR_4828_REQUIRES;
 				if (i->accepts_cargo[2] != CT_INVALID) {
-					SetDParam(2, _cargoc.names_s[i->accepts_cargo[2]]);
+					SetDParam(2, GetCargo(i->accepts_cargo[2])->name);
 					str = STR_4829_REQUIRES;
 				}
 			}
--- a/src/landscape.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/landscape.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -337,8 +337,8 @@
 	ey = TileY(tile);
 	sx = TileX(p1);
 	sy = TileY(p1);
-	if (ex < sx) intswap(ex, sx);
-	if (ey < sy) intswap(ey, sy);
+	if (ex < sx) Swap(ex, sx);
+	if (ey < sy) Swap(ey, sy);
 
 	money = GetAvailableMoneyForCommand();
 	cost = 0;
--- a/src/lang/brazilian_portuguese.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/brazilian_portuguese.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -36,7 +36,7 @@
 STR_001B_MAIZE                                                  :{G=m}Milho
 STR_001C_FRUIT                                                  :{G=f}Fruta
 STR_001D_DIAMONDS                                               :{G=m}Diamante
-STR_001E_FOOD                                                   :{G=m}Alimento
+STR_001E_FOOD                                                   :{G=f}Comida
 STR_001F_PAPER                                                  :{G=m}Papel
 STR_0020_GOLD                                                   :{G=m}Ouro
 STR_0021_WATER                                                  :{G=f}Ãgua
@@ -53,37 +53,37 @@
 STR_002C_PLASTIC                                                :{G=m}Plástico
 STR_002D_FIZZY_DRINKS                                           :{G=m}Refrigerantes
 STR_002E                                                        :
-STR_002F_PASSENGER                                              :{G=m}passageiros
-STR_0030_COAL                                                   :{G=m}carvão
-STR_0031_MAIL                                                   :{G=f}cartas
-STR_0032_OIL                                                    :{G=m}petróleo
-STR_0033_LIVESTOCK                                              :{G=m}gado
-STR_0034_GOODS                                                  :{G=m}bens
-STR_0035_GRAIN                                                  :{G=m}grãos
-STR_0036_WOOD                                                   :{G=f}madeira
-STR_0037_IRON_ORE                                               :{G=m}minério de ferro
-STR_0038_STEEL                                                  :{G=m}aço
-STR_0039_VALUABLES                                              :{G=m}dinheiro
-STR_003A_COPPER_ORE                                             :{G=m}minério de cobre
-STR_003B_MAIZE                                                  :{G=m}milho
-STR_003C_FRUIT                                                  :{G=f}fruta
-STR_003D_DIAMOND                                                :{G=m}diamante
-STR_003E_FOOD                                                   :{G=m}alimento
-STR_003F_PAPER                                                  :{G=m}papel
-STR_0040_GOLD                                                   :{G=m}ouro
-STR_0041_WATER                                                  :{G=f}água
-STR_0042_WHEAT                                                  :{G=m}trigo
-STR_0043_RUBBER                                                 :{G=f}borracha
-STR_0044_SUGAR                                                  :{G=m}açúcar
-STR_0045_TOY                                                    :{G=m}brinquedos
-STR_0046_CANDY                                                  :{G=m}doces
-STR_0047_COLA                                                   :{G=f}cola
-STR_0048_COTTON_CANDY                                           :{G=m}algodão doce
-STR_0049_BUBBLE                                                 :{G=f}bolhas
-STR_004A_TOFFEE                                                 :{G=m}caramelo
-STR_004B_BATTERY                                                :{G=f}pilhas
-STR_004C_PLASTIC                                                :{G=m}plástico
-STR_004D_FIZZY_DRINK                                            :{G=m}refrigerantes
+STR_002F_PASSENGER                                              :{G=m}Passageiros
+STR_0030_COAL                                                   :{G=m}Carvão
+STR_0031_MAIL                                                   :{G=f}Cartas
+STR_0032_OIL                                                    :{G=m}Petróleo
+STR_0033_LIVESTOCK                                              :{G=m}Gado
+STR_0034_GOODS                                                  :{G=m}Bens
+STR_0035_GRAIN                                                  :{G=m}Grãos
+STR_0036_WOOD                                                   :{G=f}Madeira
+STR_0037_IRON_ORE                                               :{G=m}Minério de ferro
+STR_0038_STEEL                                                  :{G=m}Aço
+STR_0039_VALUABLES                                              :{G=m}Dinheiro
+STR_003A_COPPER_ORE                                             :{G=m}Minério de cobre
+STR_003B_MAIZE                                                  :{G=m}Milho
+STR_003C_FRUIT                                                  :{G=f}Fruta
+STR_003D_DIAMOND                                                :{G=m}Diamante
+STR_003E_FOOD                                                   :{G=f}Comida
+STR_003F_PAPER                                                  :{G=m}Papel
+STR_0040_GOLD                                                   :{G=m}Ouro
+STR_0041_WATER                                                  :{G=f}Ãgua
+STR_0042_WHEAT                                                  :{G=m}Trigo
+STR_0043_RUBBER                                                 :{G=f}Borracha
+STR_0044_SUGAR                                                  :{G=m}Açúcar
+STR_0045_TOY                                                    :{G=m}Brinquedos
+STR_0046_CANDY                                                  :{G=m}Doces
+STR_0047_COLA                                                   :{G=f}Cola
+STR_0048_COTTON_CANDY                                           :{G=m}Algodão doce
+STR_0049_BUBBLE                                                 :{G=f}Bolhas
+STR_004A_TOFFEE                                                 :{G=m}Caramelo
+STR_004B_BATTERY                                                :{G=f}Pilhas
+STR_004C_PLASTIC                                                :{G=m}Plástico
+STR_004D_FIZZY_DRINK                                            :{G=m}Refrigerantes
 STR_QUANTITY_NOTHING                                            :
 STR_QUANTITY_PASSENGERS                                         :{COMMA} passageiro{P "" s}
 STR_QUANTITY_COAL                                               :{WEIGHT} de carvão
@@ -186,7 +186,7 @@
 STR_00D8_DARK_GREEN                                             :Verde Escuro
 STR_00D9_BLUE                                                   :Azul
 STR_00DA_CREAM                                                  :Creme
-STR_00DB_MAUVE                                                  :Preto
+STR_00DB_MAUVE                                                  :Malva
 STR_00DC_PURPLE                                                 :Roxo
 STR_00DD_ORANGE                                                 :Laranja
 STR_00DE_BROWN                                                  :Marrom
@@ -214,7 +214,7 @@
 STR_00F4_500M                                                   :{BLACK}{TINYFONT}500m
 STR_00F5_TRAINS                                                 :{BLACK}{TINYFONT}Trens
 STR_00F6_ROAD_VEHICLES                                          :{BLACK}{TINYFONT}Automóveis
-STR_00F7_SHIPS                                                  :{BLACK}{TINYFONT}Embarcações
+STR_00F7_SHIPS                                                  :{BLACK}{TINYFONT}Navios
 STR_00F8_AIRCRAFT                                               :{BLACK}{TINYFONT}Aeronaves
 STR_00F9_TRANSPORT_ROUTES                                       :{BLACK}{TINYFONT}Rotas de Transporte
 STR_00FA_COAL_MINE                                              :{BLACK}{TINYFONT}Mina de Carvão
@@ -234,10 +234,10 @@
 STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}Indústria Alimentícia
 STR_0109_DIAMOND_MINE                                           :{BLACK}{TINYFONT}Mina de Diamante
 STR_010A_COPPER_ORE_MINE                                        :{BLACK}{TINYFONT}Mina de Cobre
-STR_010B_FRUIT_PLANTATION                                       :{BLACK}{TINYFONT}Pomar
+STR_010B_FRUIT_PLANTATION                                       :{BLACK}{TINYFONT}Plantação de Frutas
 STR_010C_RUBBER_PLANTATION                                      :{BLACK}{TINYFONT}Plantação de Seringueiras
-STR_010D_WATER_SUPPLY                                           :{BLACK}{TINYFONT}Poço Artesiano
-STR_010E_WATER_TOWER                                            :{BLACK}{TINYFONT}Reservatório de Ãgua
+STR_010D_WATER_SUPPLY                                           :{BLACK}{TINYFONT}Poço de Ãgua
+STR_010E_WATER_TOWER                                            :{BLACK}{TINYFONT}Reservatório
 STR_010F_LUMBER_MILL                                            :{BLACK}{TINYFONT}Serraria
 STR_0110_COTTON_CANDY_FOREST                                    :{BLACK}{TINYFONT}Floresta de Algodão Doce
 STR_0111_CANDY_FACTORY                                          :{BLACK}{TINYFONT}Fábrica de Doces
@@ -316,7 +316,7 @@
 
 STR_UNITS_IMPERIAL                                              :Imperial
 STR_UNITS_METRIC                                                :Métrico
-STR_UNITS_SI                                                    :SI
+STR_UNITS_SI                                                    :Sistema Internacional
 
 STR_UNITS_VELOCITY_IMPERIAL                                     :{COMMA} mph
 STR_UNITS_VELOCITY_METRIC                                       :{COMMA} km/h
@@ -1043,7 +1043,7 @@
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novo busca de caminho global (NPF, sobrepõe NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de peso para trens simulando trens pesados: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permite dirigir em pontos de parada nas estradas particulares de cidade: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permitir estações drive-through em ruas locais: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permitir sempre aeroportos pequenos: {ORANGE}{STRING}
 
@@ -1160,7 +1160,7 @@
 STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Bulldozer mágico (destrói indústrias, etc.): {ORANGE}{STRING}
 STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}Os túneis poderão cruzar-se: {ORANGE}{STRING}
 STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}Permitir construção quando em pausa: {ORANGE}{STRING}
-STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}Aeronaves a jato não irão acidentar (frequentemente) em aeroportos pequenos: {ORANGE} {STRING}
+STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}Aeronaves a jato não irão se acidentar (frequentemente) em aeroportos pequenos: {ORANGE} {STRING}
 STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}Mudar de clima: {ORANGE} {STRING}
 STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}Alterar data: {ORANGE} {DATE_SHORT}
 STR_CHEAT_SETUP_PROD                                            :{LTBLUE}Ativar modificação de valores de produção: {ORANGE}{STRING}
@@ -1272,7 +1272,7 @@
 STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Modificar produção
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Bem-vindo à nova IA, ainda em desenvolvimento. Se você encontrar problemas tire um printscreen e poste no fórum.
-TEMP_AI_ACTIVATED                                               :{WHITE}Atenção: esta nova IA está ainda em versão alpha! Atualmente, só funcionam caminhões e ônibus!
+TEMP_AI_ACTIVATED                                               :{WHITE}Atenção: esta nova IA está ainda em versão alfa! Atualmente, só funcionam caminhões e ônibus!
 TEMP_AI_MULTIPLAYER                                             :{WHITE}Atenção: esta função ainda é experimental (usando a nova IA). Por favor reporte quaisquer problemas para truelight@openttd.org.
 
 ############ network gui strings
@@ -1530,7 +1530,7 @@
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construir ferrovias
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construir ferrovias (elétricas)
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construir ferrovias (monotrilho)
-STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}Construir ferrovias (trem-bala)
+STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}Construir ferrovias MagLev
 STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Selecionar Ponte Ferroviária
 STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Impossível construir depósito aqui...
 STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Impossível construir estação ferroviária aqui...
@@ -1542,7 +1542,7 @@
 STR_1015_RAILROAD_CONSTRUCTION                                  :Construir ferrovias
 STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Construir ferrovias (elétricas)
 STR_1016_MONORAIL_CONSTRUCTION                                  :Construir ferrovias (monotrilho)
-STR_1017_MAGLEV_CONSTRUCTION                                    :Construir ferrovias (trem-bala)
+STR_1017_MAGLEV_CONSTRUCTION                                    :Construir ferrovias MagLev
 STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Construir ferrovias
 STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Construir depósito (para construção e manutenção de trens)
 STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Construir estação ferroviária
@@ -1572,7 +1572,7 @@
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Orientação da Garagem
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Impossível construir garagem aqui...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Impossível construir estação de ônibus...
-STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Impossível construir parada de caminhão
+STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Impossível construir estação de caminhão
 STR_180A_ROAD_CONSTRUCTION                                      :Construir rodovias
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construir trecho rodoviário
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construir garagem (para construção e manutenção de automóveis)
@@ -1723,7 +1723,7 @@
 STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING                         :{WHITE}Muito perto de uma estação/local de carga já existente
 STR_3007_TOO_MANY_STATIONS_LOADING                              :{WHITE}Muitas estações/áreas de carga nesta cidade
 STR_3008_TOO_MANY_STATIONS_LOADING                              :{WHITE}Muitas estações/áreas de carga
-STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Muitos pontos de ônibus
+STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Muitas estações de ônibus
 STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Muitos locais de carga
 STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Muito perto de outra estação/local de carga
 STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
@@ -1754,9 +1754,9 @@
 STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} agora aceita {STRING}
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} agora aceita {STRING} e {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Orientação do estação de ônibus
-STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Orientação da parada de caminhão
+STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Orientação da estação de caminhão
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Precisa demolir a estação de ônibus primeiro
-STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Precisa demolir a parada de caminhão primeiro
+STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Precisa demolir a estação de caminhão
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Estações
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Nenhuma -
@@ -1892,7 +1892,7 @@
 STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Infestação de insetos causa destruição em {INDUSTRY}!{}Produção diminui em 50%
 STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...só pode ser colocado perto das bordas do mapa
 STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}A produção de {STRING} em {INDUSTRY} aumentou em {COMMA}%!
-STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}A produção de {STRING} em {INDUSTRY} diminuiu em {COMMA}%!
+STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}A produção de {STRING} na {INDUSTRY} diminuiu em {COMMA}%!
 
 ##id 0x5000
 STR_5000_TRAIN_IN_TUNNEL                                        :{WHITE}Há um trem no túnel
@@ -2884,7 +2884,7 @@
 STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}Total:
 ############ End of order list
 STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}Número de veículos: Incluindo automóveis, trens, embarcações e aeronaves.
-STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Número de segmentos de estação. Cada parte de uma estação (ex. estação ferroviária, ponto de ônibus, aeroporto) é contado, mesmo se eles estiverem ligados a uma estação.
+STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Número de segmentos de estação. Cada parte de uma estação (ex. estação ferroviária, estação de ônibus, aeroporto) é contado, mesmo se eles estiverem ligados a uma estação.
 STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP                           :{BLACK}O lucro do veículo com o rendimento menor (de todos os veículos com mais de 2 anos)
 STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP                           :{BLACK}Dinheiro conseguido no mês com os lucros mais baixos dos últimos 12 trimestres
 STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP                           :{BLACK}Dinheiro conseguido no mês com os lucros mais altos dos últimos 12 trimestres
--- a/src/lang/bulgarian.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/bulgarian.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1828,7 +1828,7 @@
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} пречи
 STR_4801                                                        :{WHITE}{INDUSTRY}
 STR_4802_COAL_MINE                                              :Мина за въглища
-STR_4803_POWER_STATION                                          :
+STR_4803_POWER_STATION                                          :Електроцентрала
 STR_4804_SAWMILL                                                :ДъÑкорезница
 STR_4805_FOREST                                                 :Гора
 STR_4806_OIL_REFINERY                                           :Ðефтена рафинериÑ
--- a/src/lang/catalan.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/catalan.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1235,7 +1235,7 @@
 STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Activa tots
 
 STR_CONSTRUCT_COAL_MINE_TIP                                     :{BLACK}Construeix Mina de Carbó
-STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Planta Bosc
+STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Planta un Bosc
 STR_CONSTRUCT_OIL_RIG_TIP                                       :{BLACK}Construeix una Plataforma Petrolífera
 STR_CONSTRUCT_FARM_TIP                                          :{BLACK}Funda Granja
 STR_CONSTRUCT_COPPER_ORE_MINE_TIP                               :{BLACK}Construeix una Mina de Coure
@@ -1246,7 +1246,7 @@
 STR_CONSTRUCT_FRUIT_PLANTATION_TIP                              :{BLACK}Funda Plantació de Fruita
 STR_CONSTRUCT_RUBBER_PLANTATION_TIP                             :{BLACK}Funda Plantació de Cautxú
 STR_CONSTRUCT_WATER_SUPPLY_TIP                                  :{BLACK}Funda Surtidor d'Aigua
-STR_CONSTRUCT_COTTON_CANDY_TIP                                  :{BLACK}Planta Bosc de Cotó de Sucre
+STR_CONSTRUCT_COTTON_CANDY_TIP                                  :{BLACK}Planta un Bosc de Cotó de Sucre
 STR_CONSTRUCT_BATTERY_FARM_TIP                                  :{BLACK}Funda Granja de Piles
 STR_CONSTRUCT_COLA_WELLS_TIP                                    :{BLACK}Perfora per buscar Cola
 STR_CONSTRUCT_PLASTIC_FOUNTAINS_TIP                             :{BLACK}Funda Fonts de Plàstic
--- a/src/lang/czech.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/czech.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -2540,13 +2540,16 @@
 STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}PrávÄ› jsme vyvinuli nov{G ý ou é} {STRING.acc}. MÄ›l byste zájem o roÄní výhradní právo na používání tohoto prostÅ™edku, aby byl otestován pÅ™ed uvedením na trh?
 STR_8102_RAILROAD_LOCOMOTIVE                                    :{G=f}lokomotiva
 STR_8102_RAILROAD_LOCOMOTIVE.acc                                :{G=f}lokomotivu
+STR_8102_RAILROAD_LOCOMOTIVE.dat                                :{G=f}lokomotivu
 STR_8103_ROAD_VEHICLE                                           :{G=n}silniÄní vozidlo
 STR_8104_AIRCRAFT                                               :{G=n}letadlo
 STR_8105_SHIP                                                   :{G=f}loÄ
 STR_8106_MONORAIL_LOCOMOTIVE                                    :{G=f}lokomotiva pro monorail
 STR_8106_MONORAIL_LOCOMOTIVE.acc                                :{G=f}lokomotivu pro monorail
+STR_8106_MONORAIL_LOCOMOTIVE.dat                                :{G=f}lokomotivu pro monorail
 STR_8107_MAGLEV_LOCOMOTIVE                                      :{G=f}lokomotiva Maglev
 STR_8107_MAGLEV_LOCOMOTIVE.acc                                  :{G=f}lokomotivu Maglev
+STR_8107_MAGLEV_LOCOMOTIVE.dat                                  :{G=f}lokomotivu Maglev
 
 ##id 0x8800
 STR_8800_TRAIN_DEPOT                                            :{WHITE}ŽelezniÄní depo {TOWN}
--- a/src/lang/danish.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/danish.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1584,6 +1584,8 @@
 STR_1816_TREE_LINED_ROAD                                        :Vej med vejtræer
 STR_1817_ROAD_VEHICLE_DEPOT                                     :Værksted
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Jernbaneoverskæring
+STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Kan ikke fjerne rutebilstation...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Kan ikke fjerne fragtcentral...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Byer
@@ -2877,7 +2879,7 @@
 STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}Total:
 ############ End of order list
 STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}Antal af køretøjer; dette inkludere vejkøretøjer, tog, skibe og fly
-STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Antallet af stationer. Alle dele af en station (f.eks. tog station, bus station, lufthavn) tæller med, også selvom de er sat sammen til en station
+STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Antallet af stationer. Alle dele af en station (f.eks. banegård, rutebilstation, lufthavn) tæller med, selvom de er sammensat som én station
 STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP                           :{BLACK}Afkast for køretøjet med laveste indkomst (af alle køretøjer ældre end 2 år)
 STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP                           :{BLACK}Indtægt i måneden med den laveste indtægt i de sidste 12 kvartaler
 STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP                           :{BLACK}Indkomst i måneden med det højeste afkast i de sidste 12 kvartaler
--- a/src/lang/english.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/english.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -2901,6 +2901,17 @@
 STR_NEWGRF_MD5SUM                                               :{BLACK}MD5sum: {SILVER}{STRING}
 STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}You are about to make changes to a running game; this can crash OpenTTD.{}Are you absolutely sure about this?
 
+STR_NEWGRF_ERROR_MSG_INFO                                       :{SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_WARNING                                    :{RED}Warning: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}Error: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}Fatal: {SILVER}{STRING}
+STR_NEWGRF_ERROR_VERSION_NUMBER                                 :{STRING} will not work with the TTDPatch version reported by OpenTTD.
+STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} is for the {STRING} version of TTD.
+STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} is designed to be used with {STRING}
+STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Invalid parameter for {STRING}: parameter {STRING} ({NUM})
+STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} must be loaded before {STRING}.
+STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} must be loaded after {STRING}.
+
 STR_NEWGRF_ADD                                                  :{BLACK}Add
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Add a NewGRF file to the list
 STR_NEWGRF_REMOVE                                               :{BLACK}Remove
--- a/src/lang/finnish.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/finnish.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -2192,7 +2192,6 @@
 STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}Yhtiön {COMPANY} on ottanut haltuun {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Tällä yhtiöllä ei ole vielä osakkeita...
 
-STR_LIVERY_DEFAULT                                              :
 STR_LIVERY_STEAM                                                :Höyryveturi
 STR_LIVERY_DIESEL                                               :Dieselveturi
 STR_LIVERY_ELECTRIC                                             :Sähköveturi
--- a/src/lang/french.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/french.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1314,7 +1314,7 @@
 STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}SERVEUR HORS-LIGNE
 STR_NETWORK_SERVER_FULL                                         :{SILVER}SERVEUR PLEIN
 STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}VERSION NON CORRESPONDANTE
-STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF DIFFERENTS
+STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF REQUIS
 
 STR_NETWORK_JOIN_GAME                                           :{BLACK}Rejoindre la partie
 
--- a/src/lang/korean.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/korean.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1042,6 +1042,7 @@
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}ì´ë¯¸ 지어진 ì—­ì— ì¶”ê°€ë¡œ ì—­ì„ ì¦ì¶•í•˜ëŠ” ê²ƒì„ í—ˆìš© : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}í–¥ìƒëœ 글로벌 경로íƒìƒ‰ (NPF, NTP ìš°ì„ ) : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}무거운 열차를 운행하기 위해 í™”ë¬¼ì— ë¬´ê²Œë¥¼ 가함 : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}마ì„ì´ ì†Œìœ ì¤‘ì¸ ë„로를 통과하는 버스 정류장 건설 허용: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}소형 ê³µí•­ì˜ ê±´ì„¤ì„ í—ˆìš© : {ORANGE}{STRING}
 
@@ -1585,6 +1586,8 @@
 STR_1816_TREE_LINED_ROAD                                        :가로수가 있는 ë„ë¡œ
 STR_1817_ROAD_VEHICLE_DEPOT                                     :차고
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :ì² ë„ ê±´ë„목
+STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}ë²„ìŠ¤ì •ë¥˜ìž¥ì„ ì œê±°í•  수 없습니다...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}트럭 터미ë„ì„ ì œê±°í•  수 없습니다...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}ë„ì‹œ
--- a/src/lang/portuguese.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/portuguese.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -606,9 +606,9 @@
 STR_0214_ENTREPRENEUR                                           :Empresário
 STR_0215_INDUSTRIALIST                                          :Industrial
 STR_0216_CAPITALIST                                             :Capitalista
-STR_0217_MAGNATE                                                :Magnate
-STR_0218_MOGUL                                                  :Grande magnate
-STR_0219_TYCOON_OF_THE_CENTURY                                  :Magnate do século
+STR_0217_MAGNATE                                                :Magnata
+STR_0218_MOGUL                                                  :Grande magnata
+STR_0219_TYCOON_OF_THE_CENTURY                                  :Magnata do século
 STR_HIGHSCORE_NAME                                              :{BIGFONT}{PLAYERNAME}, {COMPANY}
 STR_HIGHSCORE_STATS                                             :{BIGFONT}'{STRING}'   ({COMMA})
 STR_021B_ACHIEVES_STATUS                                        :{BLACK}{BIGFONT}{COMPANY} conquista '{STRING}' desempenho!
@@ -1039,7 +1039,7 @@
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Deslocar janela quando o rato está na borda do mapa: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Permitir o suborno da autoridade local: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova procura de caminho global (NPF, overrides NTP): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova procura de caminho global (NPF, substitui NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de peso para simular comboios pesados: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permitir estações de passagem em estradas das cidades: {ORANGE}{STRING}
 
--- a/src/lang/romanian.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/romanian.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -295,6 +295,7 @@
 STR_0141_LOAD_GAME                                              :{BLACK}Încarcã joc
 STR_SINGLE_PLAYER                                               :{BLACK}Un singur jucãtor
 STR_MULTIPLAYER                                                 :{BLACK}Multiplayer
+STR_SCENARIO_EDITOR                                             :{BLACK}Editor harta
 
 STR_64                                                          :64
 STR_128                                                         :128
@@ -390,6 +391,7 @@
 STR_ENGINE_SORT_INTRO_DATE                                      :Data lansarii
 STR_ENGINE_SORT_RUNNING_COST                                    :Cost exploatare
 STR_ENGINE_SORT_POWER_VS_RUNNING_COST                           :Cost exploatare/putere
+STR_ENGINE_SORT_CARGO_CAPACITY                                  :
 STR_NO_WAITING_CARGO                                            :{BLACK}Nu este în asteptare nici un fel de încãrcãturã
 STR_SELECT_ALL_FACILITIES                                       :{BLACK}Alege toate facilitãtile
 STR_SELECT_ALL_TYPES                                            :{BLACK}Alege toate tipurile de încãrcãturi (inclusiv încãrcãturile care nu sunt în asteptare)
@@ -622,6 +624,8 @@
 STR_022A_GENERATE_RANDOM_LAND                                   :{BLACK}Genereazã teren aleator
 STR_022B_RESET_LANDSCAPE                                        :{BLACK}Reseteazã peisajul
 STR_022C_RESET_LANDSCAPE                                        :{WHITE}Resetare peisaj
+STR_RESET_LANDSCAPE_TOOLTIP                                     :{BLACK}Elimina de pe harta toate proprietatile detinute de jucatori
+STR_RESET_LANDSCAPE_CONFIRMATION_TEXT                           :{WHITE}Esti sigur ca vrei sa elimini toate proprietatile detinute de jucatori?
 STR_022E_LANDSCAPE_GENERATION                                   :{BLACK}Generare peisaj
 STR_022F_TOWN_GENERATION                                        :{BLACK}Generare oras
 STR_0230_INDUSTRY_GENERATION                                    :{BLACK}Generare industrii
@@ -726,6 +730,7 @@
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Sterge acest oras
 STR_0292_SAVE_SCENARIO                                          :Salveazã scenariul
 STR_0293_LOAD_SCENARIO                                          :Încarcã scenariu
+STR_LOAD_HEIGHTMAP                                              :Incarca harta de inaltimi
 STR_0294_QUIT_EDITOR                                            :Iesire din editor
 STR_0295                                                        :
 STR_0296_QUIT                                                   :Iesire din joc
@@ -1036,6 +1041,7 @@
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Statii neuniforme: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nou pathfinding global(NPF, dezactiveaza NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicator greutate pt marfar pt simularea trenurilor grele: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permite semafoare in intersectiile drumurilor din proprietatea orasului: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permite întotdeauna aeroporturi mici: {ORANGE}{STRING}
 
@@ -1412,6 +1418,7 @@
 STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE}Nu a fost detectatã o placã de retea valabilã
 STR_NETWORK_ERR_NOSERVER                                        :{WHITE}Nu a fost gãsit nici un joc în retea
 STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE}Serverul nu a rãspuns cererii
+STR_NETWORK_ERR_NEWGRF_MISMATCH                                 :{WHITE} Nu m-am putut conecta din cauza unei nepotriviri NewGRF
 STR_NETWORK_ERR_DESYNC                                          :{WHITE} Sincronizarea jocului in retea a esuat.
 STR_NETWORK_ERR_LOSTCONNECTION                                  :{WHITE} Conexiunea jocului in reatea a fost intrerupta.
 STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Nu am reusit sa incarc jocul-server salvat.
@@ -1433,6 +1440,7 @@
 STR_NETWORK_ERR_CLIENT_SAVEGAME                                 :nu pot incarca harta
 STR_NETWORK_ERR_CLIENT_CONNECTION_LOST                          :conexiune pierduta
 STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR                           :eroare de protocol
+STR_NETWORK_ERR_CLIENT_NEWGRF_MISMATCH                          :Nepotrivire NewGRF
 STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED                           :neautorizat
 STR_NETWORK_ERR_CLIENT_NOT_EXPECTED                             :primit pachet ciudat
 STR_NETWORK_ERR_CLIENT_WRONG_REVISION                           :versiune incorecta
@@ -1577,6 +1585,8 @@
 STR_1816_TREE_LINED_ROAD                                        :Stradã cu copaci pe margine
 STR_1817_ROAD_VEHICLE_DEPOT                                     :Autobazã
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Traversare la nivel cu calea feratã
+STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Nu pot elimina statia de autobus...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Nu pot elimina statia de camioane...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Orase
@@ -2663,6 +2673,7 @@
 STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Cumpãrã un autovehicul
 STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Mutã un autovehicul aici pentru a-l vinde
 STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Centreazã imaginea pe locatia acestei autobaze
+STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Lista selectie vehicule rutiere - apasa pe vehicul pentru informatii
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Cumpãrã autovehiculul selectat
 STR_9028_NEW_ROAD_VEHICLE_NOW_AVAILABLE                         :{BLACK}{BIGFONT}Un nou autovehicul disponibil!
 STR_9029                                                        :{BLACK}{BIGFONT}{STRING}
--- a/src/lang/russian.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/russian.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1018,45 +1018,45 @@
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Показывать ÑкороÑÑ‚ÑŒ в панели ÑтатуÑа транÑпорта: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Разрешить ÑтроительÑтво на Ñклонах и берегу: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Разрешить более реалиÑтичные зоны покрытиÑ: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Разрешить удалÑÑ‚ÑŒ больше дорог, моÑтов, Ñ‚.п.: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}ИÑпользовать очень длинные поезда: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Разрешить реалиÑтичное уÑкорение: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Запретить повороты на 90 град.: {ORANGE}{STRING} {LTBLUE} (требуетÑÑ NPF)
-STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}ОбъединÑÑ‚ÑŒ Ñтанции: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}При вкл. полной загрузке отправлÑÑ‚ÑŒÑÑ, когда заполнен один тип вагонов: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Улучшенный алгоритм загрузки: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Разрешить удаление вÑех принадлежащих городу объектов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Включить ÑтроительÑтво очень длинных поездов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Включить реалиÑтичное уÑкорение Ð´Ð»Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð²: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Запретить резкие повороты поездам и кораблÑм: {ORANGE}{STRING} {LTBLUE}(NPF)
+STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}ОбъединÑÑ‚ÑŒ поÑтроенные Ñ€Ñдом Ñтанции: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Покидать Ñтанцию, когда любой груз полноÑтью загружен: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}ИÑпользовать улучшенный алгоритм загрузки: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}ПоÑÑ‚ÐµÐ¿ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° транÑпорта: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}ИнфлÑциÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}ДоÑтавлÑÑ‚ÑŒ груз на Ñтанцию, только еÑли она его принимает: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Строить очень длинные моÑÑ‚Ñ‹: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}ДобавлÑÑ‚ÑŒ депо в раÑпиÑание: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Разрешить ÑтроительÑтво очень длинных моÑтов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Разрешить добавлÑÑ‚ÑŒ депо в маршрут: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDXTRAIND                                 :{LTBLUE}Разрешить ÑтроительÑтво Ñырьевых предприÑтий: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Строить неÑк. предприÑтий 1 типа в одном городе: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Одинаковые предприÑÑ‚Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ Ñтроить Ñ€Ñдом: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Ð’Ñегда показывать длинную дату в панели ÑоÑтоÑниÑ: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Сигналы на Ñтороне движениÑ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Показывать Ñветофоры на Ñтороне движениÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Показывать финанÑовую ÑтатиÑтику в конце года: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}Приказ без оÑтановки в Ñтиле TTDPatch: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Разрешить ожидание въезда на автоÑтанцию: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}ИÑпользовать поведение TTDP Ð´Ð»Ñ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð° "без оÑтановок": {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Разрешить автомобилÑм ожидать въезда на Ñтанцию: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Смещать обзор, когда курÑор находитÑÑ Ñƒ ÐºÑ€Ð°Ñ Ñкрана: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Разрешить взÑтку меÑтной админиÑтрации: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Станции могут быть разной формы: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ðовый поиÑк пути (NPF, без NTP): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}КоÑÑ„. ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²ÐµÑа груза: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Станции могут быть произвольной формы: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Включить новый алгоритм навигации (NPF, заменÑет NTP): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Множитель ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²ÐµÑа груза Ð´Ð»Ñ Ñ‚Ð¾Ð²Ð°Ñ€Ð½Ñ‹Ñ… поездов: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}ПозволÑÑ‚ÑŒ Ñтроить Ñквозные оÑтановки на городÑких дорогах: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Ð’Ñегда разрешать малые аÑропорты: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Ð’Ñегда разрешать ÑтроительÑтво малых аÑропортов: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Предупреждать, еÑли поезд не находит дороги: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}ПереÑмотреть раÑпиÑаниÑ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Предупреждать, еÑли поезд заблудилÑÑ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}ПроверÑÑ‚ÑŒ маршруты транÑпортных ÑредÑтв на правильноÑÑ‚ÑŒ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :нет
 STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :да, кроме оÑтановленных транÑп. ÑредÑтв
 STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :вÑего транÑпорта
-STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Предупреждать, что транÑп. ÑредÑтво приноÑит убыток: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Предупреждать, еÑли поезд приноÑит убыток: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}ТранÑпорт никогда не уÑтаревает: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}ÐвтоматичеÑки обновлÑÑ‚ÑŒ уÑтаревший транÑпорт
-STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Обновить транÑпорт за (через) {ORANGE}{STRING}{LTBLUE} меÑ. поÑле уÑтареваниÑ
-STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}ÐвтоматичеÑки обновлÑÑ‚ÑŒ изношенный транÑпорт
+STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}ОбновлÑÑ‚ÑŒ через {ORANGE}{STRING}{LTBLUE} меÑÑцев поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока Ñлужбы
+STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñумма, Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}ДлительноÑÑ‚ÑŒ Ñообщений об ошибке: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Показывать количеÑтво жителей города поÑле названиÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Убирать Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð¿Ñ€Ð¸ включении прозрачноÑти зданий: {ORANGE}{STRING}
@@ -1064,7 +1064,7 @@
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Генератор земли: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Оригинальный
 STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}МакÑ. диÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð¾Ñ‚ ÐºÑ€Ð°Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ до Ðефтепер. завода {ORANGE}{STRING}
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}МакÑ. раÑÑтоÑние от ÐºÑ€Ð°Ñ ÐºÐ°Ñ€Ñ‚Ñ‹ до нефтепер. заводов: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Ð’Ñ‹Ñота "Ñнежной" линии: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}ÐеровноÑÑ‚ÑŒ земли (только Ð´Ð»Ñ TerraGenesis) : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Очень гладкий
@@ -1091,38 +1091,38 @@
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Ð´Ð»Ñ Ð²Ñех компаний
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Предпочитать командный чат при нажатии Enter: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}МакÑ. кол-во поездов у игрока: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}МакÑ. кол-во автотранÑпорта у игрока: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}МакÑ. кол-во авиатранÑпорта у игрока: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}МакÑ. кол-во кораблей у игрока: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}МакÑимальное количеÑтво поездов у игрока: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}МакÑимальное количеÑтво кол-во автомобилей у игрока: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}МакÑимальное количеÑтво авиатранÑпорта у игрока: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}МакÑимальное количеÑтво кораблей у игрока: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Ðе допуÑкать поÑтройки поездов конкурентами: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}Ðе допуÑкать поÑтройки автомобилей конкурентами: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Ðе допуÑкать поÑтройки Ñамолётов конкурентами: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Ðе допуÑкать поÑтройки авиатранÑпорта конкурентами: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Ðе допуÑкать поÑтройки кораблей конкурентами: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Включить новый AI (альфа-верÑиÑ): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Разрешить поÑвление AI-конкурентов в Ñетевой игре: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð²: {ORANGE}{STRING} дней/%
-STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð²: {ORANGE}отключено
-STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ñ‚Ñ€Ð°Ð½Ñпорта: {ORANGE}{STRING} дней/%
-STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ñ‚Ñ€Ð°Ð½Ñпорта: {ORANGE}отключено
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñамолетов: {ORANGE}{STRING} дней/%
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñамолетов: {ORANGE}отключено
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð²: {ORANGE}не обÑлуживаютÑÑ
+STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð¾Ð±Ð¸Ð»ÐµÐ¹: {ORANGE}{STRING} дней/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð¾Ð±Ð¸Ð»ÐµÐ¹: {ORANGE}не обÑлуживаютÑÑ
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ð¸Ð°Ñ‚Ñ€Ð°Ð½Ñпорта: {ORANGE}{STRING} дней/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð°Ð²Ð¸Ð°Ñ‚Ñ€Ð°Ð½Ñпорта: {ORANGE}не обÑлуживаетÑÑ
 STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»ÐµÐ¹: {ORANGE}{STRING} дней/%
-STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»ÐµÐ¹: {ORANGE}отключено
-STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Ðе обÑлуживать, еÑли поломки выкл. : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»ÐµÐ¹: {ORANGE}не обÑлуживаютÑÑ
+STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Отключить обÑлуживание, еÑли поломки выключены: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Включить ограничение ÑкороÑти вагонов: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Откл. Ñлектрофицир. ЖД: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Отключить Ñлектрофицированную железную дорогу: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}"Цветные" новоÑти поÑвл. в : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Год начала игры: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Год Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¸Ð³Ñ€Ñ‹: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Включить плавную Ñкономику (более мелкие изменениÑ)
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Разрешить покупку акций других компаний
-STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}При перетаÑкивании Ñтавить Ñигналы каждые : {ORANGE}{STRING} клетки
-STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}ÐвтоматичеÑки Ñтроить Ñемафоры до: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}При перетаÑкивании Ñтавить Ñветофоры каждые: {ORANGE}{STRING} клетки
+STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}ÐвтоматичеÑки Ñтроить Ñемафоры: до {ORANGE}{STRING} года
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Положение главной панели инÑтрументов: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Ñлева
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :в центре
@@ -1143,9 +1143,9 @@
 
 STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Изменить значение
 STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Ðекоторые из выбранных интервалов обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ ÑовмеÑтимы Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ уÑтановкой. ДопуÑкаютÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ 5-90% или 30-800 дней.
-STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}ИÑп. YAPF Ð´Ð»Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»ÐµÐ¹: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}ИÑп. YAPF Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}ИÑп. YAPF Ð´Ð»Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð²: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}ИÑпользовать YAPF Ð´Ð»Ñ ÐºÐ¾Ñ€Ð°Ð±Ð»ÐµÐ¹: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}ИÑпользовать YAPF Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð¾Ð±Ð¸Ð»ÐµÐ¹: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}ИÑпользовать YAPF Ð´Ð»Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð²: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Умеренный ландшафт
 STR_SUB_ARCTIC_LANDSCAPE                                        :СубарктичеÑкий ландшафт
@@ -1268,7 +1268,7 @@
 STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Выбор типа груза Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð·ÐºÐ¸
 STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Переоборудование поезда Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð½Ð¾Ð³Ð¾ типа груза
 STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Ðе могу переоборуд. поезд...
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² процентах: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Интервалы обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² процентах от Ñрока Ñлужбы: {ORANGE}{STRING}
 STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Изменить производительноÑÑ‚ÑŒ
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Добро пожаловать в новый ИИ, он ÑовершенÑтвуетÑÑ. Ð’Ñ‹ должны быть готовы к проблемам. Когда Ñто ÑлучитÑÑ, Ñделайте Ñнимок и отправьте на форум. ÐаÑлаждайтеÑÑŒ!
--- a/src/lang/slovenian.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/slovenian.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -2,7 +2,7 @@
 ##ownname SlovenÅ¡Äina
 ##isocode sl_SL
 ##plural 8
-##case r d t 3sk
+##case r d t
 
 ##id 0x0000
 STR_NULL                                                        :
@@ -1871,7 +1871,6 @@
 STR_4802_COAL_MINE                                              :Premogovnik
 STR_4802_COAL_MINE.r                                            :Premogovnika
 STR_4803_POWER_STATION                                          :Termo elektrarna
-STR_4803_POWER_STATION.3sk                                      :Termo elektrarni
 STR_4804_SAWMILL                                                :Žaga
 STR_4804_SAWMILL.r                                              :Žage
 STR_4805_FOREST                                                 :Gozd
--- a/src/lang/spanish.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/spanish.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1042,7 +1042,7 @@
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Estaciones no uniformes: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nuevo sistema de busq. de rutas global (NPF, anula a NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Carga el multiplicador de peso para simular trenes pesados: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permite conducir en paradas de carretera propiedad de ciudades: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permite conducir en paradas sobre carreteras de ciudades: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permitir siempre aeropuertos pequeños: {ORANGE}{STRING}
 
--- a/src/lang/ukrainian.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/ukrainian.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -23,38 +23,55 @@
 STR_000E                                                        :
 STR_000F_PASSENGERS                                             :паÑажири
 STR_000F_PASSENGERS.r                                           :паÑажирів
+STR_000F_PASSENGERS.z                                           :паÑажирів
 STR_0010_COAL                                                   :вугіллÑ
 STR_0010_COAL.r                                                 :вугіллÑ
-STR_0011_MAIL                                                   :пошту
+STR_0010_COAL.z                                                 :вугіллÑ
+STR_0011_MAIL                                                   :пошта
 STR_0011_MAIL.r                                                 :пошти
-STR_0012_OIL                                                    :нафту
+STR_0011_MAIL.z                                                 :пошту
+STR_0012_OIL                                                    :нафта
 STR_0012_OIL.r                                                  :нафти
-STR_0013_LIVESTOCK                                              :тварин
+STR_0012_OIL.z                                                  :нафту
+STR_0013_LIVESTOCK                                              :тварини
 STR_0013_LIVESTOCK.r                                            :тварин
+STR_0013_LIVESTOCK.z                                            :тварин
 STR_0014_GOODS                                                  :товари
 STR_0014_GOODS.r                                                :товарів
+STR_0014_GOODS.z                                                :товари
 STR_0015_GRAIN                                                  :зерно
 STR_0015_GRAIN.r                                                :зерна
-STR_0016_WOOD                                                   :деревину
+STR_0015_GRAIN.z                                                :зерно
+STR_0016_WOOD                                                   :деревина
 STR_0016_WOOD.r                                                 :деревини
-STR_0017_IRON_ORE                                               :залізну руду
+STR_0016_WOOD.z                                                 :деревину
+STR_0017_IRON_ORE                                               :залізна руда
 STR_0017_IRON_ORE.r                                             :залізної руди
+STR_0017_IRON_ORE.z                                             :залізну руду
 STR_0018_STEEL                                                  :Ñталь
 STR_0018_STEEL.r                                                :Ñталі
+STR_0018_STEEL.z                                                :Ñталь
 STR_0019_VALUABLES                                              :коштовноÑÑ‚Ñ–
 STR_0019_VALUABLES.r                                            :коштовноÑтей
-STR_001A_COPPER_ORE                                             :мідну руду
+STR_0019_VALUABLES.z                                            :коштовноÑÑ‚Ñ–
+STR_001A_COPPER_ORE                                             :мідна руда
 STR_001A_COPPER_ORE.r                                           :мідної руди
-STR_001B_MAIZE                                                  :кукурудзу
+STR_001A_COPPER_ORE.z                                           :мідну руду
+STR_001B_MAIZE                                                  :кукурудза
 STR_001B_MAIZE.r                                                :кукурудзи
+STR_001B_MAIZE.z                                                :кукурудзу
 STR_001C_FRUIT                                                  :фрукти
 STR_001C_FRUIT.r                                                :фруктів
+STR_001C_FRUIT.z                                                :фрукти
 STR_001D_DIAMONDS                                               :діаманти
 STR_001D_DIAMONDS.r                                             :діамантів
+STR_001D_DIAMONDS.z                                             :діаманти
 STR_001E_FOOD                                                   :продукти
 STR_001E_FOOD.r                                                 :продуктів
+STR_001E_FOOD.z                                                 :продукти
 STR_001F_PAPER                                                  :папір
 STR_001F_PAPER.r                                                :паперу
+STR_001F_PAPER.z                                                :папір
 STR_0020_GOLD                                                   :золото
 STR_0020_GOLD.r                                                 :золота
 STR_0020_GOLD.z                                                 :золото
@@ -91,8 +108,8 @@
 STR_002B_BATTERIES                                              :батарейки
 STR_002B_BATTERIES.r                                            :батарейок
 STR_002B_BATTERIES.z                                            :батарейки
-STR_002C_PLASTIC                                                :плаÑтик
-STR_002C_PLASTIC.z                                              :плаÑтик
+STR_002C_PLASTIC                                                :плаÑтилін
+STR_002C_PLASTIC.z                                              :плаÑтилін
 STR_002D_FIZZY_DRINKS                                           :газована водф
 STR_002D_FIZZY_DRINKS.r                                         :газованої води
 STR_002D_FIZZY_DRINKS.z                                         :газовану воду
@@ -184,9 +201,8 @@
 STR_004B_BATTERY                                                :батарейки
 STR_004B_BATTERY.r                                              :батарейок
 STR_004B_BATTERY.z                                              :батарейки
-STR_004C_PLASTIC                                                :плаÑтик
-STR_004C_PLASTIC.r                                              :плаÑтику
-STR_004C_PLASTIC.z                                              :плаÑтик
+STR_004C_PLASTIC                                                :плаÑтилін
+STR_004C_PLASTIC.z                                              :плаÑтилін
 STR_004D_FIZZY_DRINK                                            :газована вода
 STR_004D_FIZZY_DRINK.r                                          :газованої води
 STR_004D_FIZZY_DRINK.z                                          :газовану воду
@@ -267,7 +283,7 @@
 STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Ðеможливо очиÑтити цю ділÑнку...
 STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}ÐвторÑьке право {COPYRIGHT} 1995 ÐšÑ€Ñ–Ñ Ð¡Ð¾Ð¹Ñ”Ñ€, Ð’ÑÑ– права захищені
 STR_00B7_VERSION                                                :{BLACK}OpenTTD верÑÑ–Ñ {REV}
-STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 OpenTTD-група
+STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 команда OpenTTD
 STR_TRANSLATED_BY                                               :{BLACK} Перекладач(і) -
 
 STR_00C5                                                        :{BLACK}{CROSS}
@@ -2343,8 +2359,6 @@
 STR_LIVERY_ELECTRIC                                             :Електричні потÑги
 STR_LIVERY_MONORAIL                                             :МонорельÑ
 STR_LIVERY_MAGLEV                                               :ПотÑги на магнітній подушці
-STR_LIVERY_DMU                                                  :
-STR_LIVERY_EMU                                                  :
 STR_LIVERY_PASSENGER_WAGON_STEAM                                :ПаÑажирÑький вагон (пар)
 STR_LIVERY_PASSENGER_WAGON_DIESEL                               :ПаÑажирÑький вагон (дизель)
 STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :ПаÑажирÑький вагон (електричка)
--- a/src/lang/unfinished/afrikaans.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/unfinished/afrikaans.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -298,7 +298,6 @@
 STR_0148_GAME_OPTIONS                                           :{BLACK}Spel Opsies
 
 STR_0150_SOMEONE                                                :iemand{SKIP}{SKIP}
-STR_0151_MAP_OF_WORLD                                           :
 STR_0152_TOWN_DIRECTORY                                         :Stad index
 STR_0153_SUBSIDIES                                              :Subsidiëe
 
--- a/src/lang/unfinished/croatian.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/unfinished/croatian.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -396,8 +396,6 @@
 STR_MANAGE_LIST                                                 :{BLACK}Uredi popis
 STR_MANAGE_LIST_TIP                                             :{BLACK}Pošalji upute svim vozilima na ovoj listi
 STR_REPLACE_VEHICLES                                            :Zamjeni vozila
-STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :
-STR_SEND_SHIP_TO_DEPOT                                          :
 STR_SEND_AIRCRAFT_TO_HANGAR                                     :Pošalji u hangar
 STR_SEND_FOR_SERVICING                                          :Pošalji na servis
 
--- a/src/lang/unfinished/frisian.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/unfinished/frisian.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -1010,8 +1010,6 @@
 STR_3037_POOR                                                   :Min
 STR_3039_GOOD                                                   :Goed
 STR_303A_VERY_GOOD                                              :Hiel Goed
-STR_303B_EXCELLENT                                              :
-STR_303C_OUTSTANDING                                            :
 ############ range for rating ends
 
 STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
--- a/src/lang/unfinished/greek.txt	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/lang/unfinished/greek.txt	Wed Feb 28 00:33:40 2007 +0000
@@ -480,7 +480,6 @@
 STR_01FF                                                        :{TINYFONT}{BLACK}{DATE_LONG}
 STR_0200_LAST_MESSAGE_NEWS_REPORT                               :Τελευταίο μήνυμα/αναφοÏά νέων
 STR_0201_MESSAGE_SETTINGS                                       :Ρυθμίσεις μηνυμάτων
-STR_MESSAGE_HISTORY_MENU                                        :
 STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Εμφάνιση τελευταίου μηνÏματος/αναφοÏάς νέων, επιλογές μηνυμάτων
 STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Επιλογές Μηνυμάτων
 STR_0205_MESSAGE_TYPES                                          :{BLACK}ΤÏποι μηνυμάτων:
--- a/src/macros.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/macros.h	Wed Feb 28 00:33:40 2007 +0000
@@ -18,14 +18,11 @@
 #undef max
 #endif
 
-/* Objective C don't like templates */
-#ifdef __cplusplus
 template <typename T>
 static inline T max(T a, T b)
 {
 	return a >= b ? a : b;
 }
-#endif
 
 static inline int min(int a, int b) { if (a <= b) return a; return b; }
 
@@ -46,44 +43,39 @@
 	return a;
 }
 
-static inline int32 BIGMULSS(int32 a, int32 b, int shift) {
-	return (int32)(((int64)(a) * (int64)(b)) >> (shift));
+static inline int32 BIGMULSS(int32 a, int32 b, int shift)
+{
+	return (int32)((int64)a * (int64)b >> shift);
 }
 
-static inline uint32 BIGMULUS(uint32 a, uint32 b, int shift) {
-	return (uint32)(((uint64)(a) * (uint64)(b)) >> (shift));
+static inline uint32 BIGMULUS(uint32 a, uint32 b, int shift)
+{
+	return (uint32)((uint64)a * (uint64)b >> shift);
 }
 
-static inline int64 BIGMULS(int32 a, int32 b) {
-	return (int64)(a) * (int64)(b);
-}
 
 /* OPT: optimized into an unsigned comparison */
 //#define IS_INSIDE_1D(x, base, size) ((x) >= (base) && (x) < (base) + (size))
 #define IS_INSIDE_1D(x, base, size) ( (uint)((x) - (base)) < ((uint)(size)) )
 
-template <typename T>
-static inline bool HASBIT(T x, int y)
+template<typename T> static inline bool HASBIT(T x, int y)
 {
-	return (x & (((T)1) << y)) != 0;
+	return (x & ((T)1 << y)) != 0;
 }
 
-template <typename T>
-static inline T SETBIT(T& x, int y)
+template<typename T> static inline T SETBIT(T& x, int y)
 {
-	return x |= (((T)1) << y);
+	return x |= (T)1 << y;
 }
 
-template <typename T>
-static inline T CLRBIT(T& x, int y)
+template<typename T> static inline T CLRBIT(T& x, int y)
 {
-	return x &= ~(((T)1) << y);
+	return x &= ~((T)1 << y);
 }
 
-template <typename T>
-static inline T TOGGLEBIT(T& x, int y)
+template<typename T> static inline T TOGGLEBIT(T& x, int y)
 {
-	return x ^= (((T)1) << y);
+	return x ^= (T)1 << y;
 }
 
 
@@ -154,11 +146,6 @@
 
 #define abs myabs
 
-static inline int intxchg_(int *a, int b) { int t = *a; *a = b; return t; }
-#define intswap(a,b) ((b) = intxchg_(&(a), (b)))
-static inline int uintxchg_(uint *a, uint b) { uint t = *a; *a = b; return t; }
-#define uintswap(a,b) ((b) = uintxchg_(&(a), (b)))
-
 
 static inline uint16 ReadLE16Aligned(const void* x)
 {
@@ -189,8 +176,6 @@
 #define ALIGN(x, n) (((x) + (n) - 1) & ~((n) - 1))
 
 /** return the largest value that can be entered in a variable.
- *  known to work for uint32.
- *  used by TGP to set the max value of the _patches.generation_seed in its definition
  */
 #define MAX_UVALUE(type) ((type)~(type)0)
 
--- a/src/misc.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/misc.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -16,8 +16,8 @@
 #include "vehicle_gui.h"
 #include "variables.h"
 #include "ai/ai.h"
-#include "table/landscape_const.h"
 #include "date.h"
+#include "cargotype.h"
 
 char _name_array[512][32];
 
@@ -237,28 +237,11 @@
 // Calculate constants that depend on the landscape type.
 void InitializeLandscapeVariables(bool only_constants)
 {
-	const CargoTypesValues *lpd;
-	uint i;
-	StringID str;
-
-	lpd = &_cargo_types_base_values[_opt.landscape];
-
-	for (i = 0; i != NUM_CARGO; i++) {
-		_cargoc.sprites[i] = lpd->sprites[i];
+	if (only_constants) return;
 
-		str = lpd->names[i];
-		_cargoc.names_s[i] = str;
-		_cargoc.names_long[i] = (str += 0x40);
-		_cargoc.names_short[i] = (str += 0x20);
-		_cargoc.weights[i] = lpd->weights[i];
-
-		if (!only_constants) {
-			_cargo_payment_rates[i] = lpd->initial_cargo_payment[i];
-			_cargo_payment_rates_frac[i] = 0;
-		}
-
-		_cargoc.transit_days_1[i] = lpd->transit_days_table_1[i];
-		_cargoc.transit_days_2[i] = lpd->transit_days_table_2[i];
+	for (CargoID i = 0; i != NUM_CARGO; i++) {
+		_cargo_payment_rates[i] = GetCargo(i)->initial_payment;
+		_cargo_payment_rates_frac[i] = 0;
 	}
 }
 
--- a/src/misc_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/misc_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -30,6 +30,7 @@
 #include "tgp.h"
 #include "settings.h"
 #include "date.h"
+#include "cargotype.h"
 
 #include "fios.h"
 /* Variables to display file lists */
@@ -153,10 +154,10 @@
 				/* If the accepted value is less than 8, show it in 1/8:ths */
 				if (ac[i] < 8) {
 					SetDParam(0, ac[i]);
-					SetDParam(1, _cargoc.names_s[i]);
+					SetDParam(1, GetCargo(i)->name);
 					p = GetString(p, STR_01D1_8, lastof(_landinfo_data[5]));
 				} else {
-					p = GetString(p, _cargoc.names_s[i], lastof(_landinfo_data[5]));
+					p = GetString(p, GetCargo(i)->name, lastof(_landinfo_data[5]));
 				}
 			}
 		}
@@ -740,7 +741,7 @@
 				*b++ = ',';
 				*b++ = ' ';
 			}
-			b = InlineString(b, _cargoc.names_s[i]);
+			b = InlineString(b, GetCargo(i)->name);
 		}
 	}
 
--- a/src/music/bemidi.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/bemidi.h	Wed Feb 28 00:33:40 2007 +0000
@@ -7,4 +7,4 @@
 
 extern const HalMusicDriver _bemidi_music_driver;
 
-#endif
+#endif /* MUSIC_BEMIDI_H */
--- a/src/music/dmusic.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/dmusic.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,9 +1,8 @@
 /* $Id$ */
 
-#include "../stdafx.h"
-
 #ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT
 
+#include "../stdafx.h"
 #include "../debug.h"
 #include "../win32.h"
 #include "dmusic.h"
--- a/src/music/extmidi.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/extmidi.h	Wed Feb 28 00:33:40 2007 +0000
@@ -7,4 +7,4 @@
 
 extern const HalMusicDriver _extmidi_music_driver;
 
-#endif
+#endif /* MUSIC_EXTERNAL_H */
--- a/src/music/libtimidity.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/libtimidity.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,4 +1,4 @@
-/* $Id: extmidi.c 4692 2006-05-02 19:09:49Z peter1138 $ */
+/* $Id$ */
 
 #include "../stdafx.h"
 #include "../openttd.h"
--- a/src/music/libtimidity.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/libtimidity.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,4 +1,4 @@
-/* $Id: extmidi.h 2704 2005-07-25 07:16:10Z tron $ */
+/* $Id$ */
 
 #ifndef MUSIC_LIBTIMIDITY_H
 #define MUSIC_LIBTIMIDITY_H
--- a/src/music/null_m.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/null_m.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,7 +1,6 @@
 /* $Id$ */
 
 #include "../stdafx.h"
-#include "../openttd.h"
 #include "null_m.h"
 
 static const char* NullMidiStart(const char* const* parm) { return NULL; }
--- a/src/music/os2_m.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/os2_m.h	Wed Feb 28 00:33:40 2007 +0000
@@ -7,4 +7,4 @@
 
 extern const HalMusicDriver _os2_music_driver;
 
-#endif
+#endif /* MUSIC_OS2_H */
--- a/src/music/qtmidi.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/qtmidi.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,7 +1,7 @@
 /* $Id$ */
 
 /**
- * @file qtmidi.c
+ * @file qtmidi.cpp
  * @brief MIDI music player for MacOS X using QuickTime.
  *
  * This music player should work in all MacOS X releases starting from 10.0,
--- a/src/music/qtmidi.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/qtmidi.h	Wed Feb 28 00:33:40 2007 +0000
@@ -7,4 +7,4 @@
 
 extern const HalMusicDriver _qtime_music_driver;
 
-#endif /* !MUSIC_MACOSX_QUICKTIME_H */
+#endif /* MUSIC_MACOSX_QUICKTIME_H */
--- a/src/music/win32_m.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music/win32_m.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,7 +1,6 @@
 /* $Id$ */
 
 #include "../stdafx.h"
-#include "../openttd.h"
 #include "win32_m.h"
 #include <windows.h>
 #include <mmsystem.h>
@@ -50,7 +49,7 @@
 	char buf[512];
 
 	va_start(va, cmd);
-	vsprintf(buf, cmd, va);
+	vsnprintf(buf, lengthof(buf), cmd, va);
 	va_end(va);
 	return mciSendStringA(buf, NULL, 0, 0);
 }
@@ -58,12 +57,9 @@
 static bool MidiIntPlaySong(const char *filename)
 {
 	MidiSendCommand("close all");
-	if (MidiSendCommand("open \"%s\" type sequencer alias song", filename) != 0)
-		return false;
+	if (MidiSendCommand("open \"%s\" type sequencer alias song", filename) != 0) return false;
 
-	if (MidiSendCommand("play song from 0") != 0)
-		return false;
-	return true;
+	return MidiSendCommand("play song from 0") == 0;
 }
 
 static void MidiIntStopSong(void)
@@ -104,9 +100,7 @@
 			s[0] = '\0';
 
 			// Delay somewhat in case we don't manage to play.
-			if (!_midi.playing) {
-				Sleep(5000);
-			}
+			if (!_midi.playing) Sleep(5000);
 		}
 
 		if (_midi.stop_song && _midi.playing) {
@@ -115,8 +109,7 @@
 			MidiIntStopSong();
 		}
 
-		if (_midi.playing && !MidiIntIsSongPlaying())
-			_midi.playing = false;
+		if (_midi.playing && !MidiIntIsSongPlaying()) _midi.playing = false;
 
 		WaitForMultipleObjects(1, &_midi.wait_obj, FALSE, 1000);
 	} while (!_midi.terminate);
@@ -148,8 +141,7 @@
 		}
 	}
 
-	if (CreateThread(NULL, 8192, MidiThread, 0, 0, &threadId) == NULL)
-		return "Failed to create thread";
+	if (CreateThread(NULL, 8192, MidiThread, 0, 0, &threadId) == NULL) return "Failed to create thread";
 
 	return NULL;
 }
--- a/src/music_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/music_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -422,12 +422,11 @@
 		case 5: // start playing
 			msf.playing = true;
 			break;
-		case 6:{ // volume sliders
-			byte *vol,new_vol;
+		case 6: { // volume sliders
+			byte *vol, new_vol;
 			int x = e->we.click.pt.x - 88;
 
-			if (x < 0)
-				return;
+			if (x < 0) return;
 
 			vol = &msf.music_vol;
 			if (x >= 106) {
@@ -435,7 +434,7 @@
 				x -= 106;
 			}
 
-			new_vol = min(max(x-21,0)*2,127);
+			new_vol = min(max(x - 21, 0) * 2, 127);
 			if (new_vol != *vol) {
 				*vol = new_vol;
 				if (vol == &msf.music_vol)
--- a/src/network/core/config.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/config.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,14 +1,14 @@
 /* $Id$ */
 
+/**
+ * @file config.h Configuration options of the network stuff
+ */
+
 #ifndef NETWORK_CORE_CONFIG_H
 #define NETWORK_CORE_CONFIG_H
 
 #ifdef ENABLE_NETWORK
 
-/**
- * @file config.h Configuration options of the network stuff
- */
-
 /** DNS hostname of the masterserver */
 #define NETWORK_MASTER_SERVER_HOST "master.openttd.org"
 /** Message sent to the masterserver to 'identify' this client as OpenTTD */
--- a/src/network/core/core.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/core.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,9 @@
 /* $Id$ */
 
+/**
+ * @file core.cpp Functions used to initialize/shut down the core network
+ */
+
 #ifdef ENABLE_NETWORK
 
 #include "../../stdafx.h"
@@ -8,10 +12,6 @@
 #include "core.h"
 #include "packet.h"
 
-/**
- * @file core.cpp Functions used to initialize/shut down the core network
- */
-
 #ifdef __MORPHOS__
 /* the library base is required here */
 struct Library *SocketBase = NULL;
--- a/src/network/core/core.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/core.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,9 @@
 /* $Id$ */
 
+/**
+ * @file core.h Base for all network types (UDP and TCP)
+ */
+
 #ifndef NETWORK_CORE_H
 #define NETWORK_CORE_H
 
@@ -8,10 +12,6 @@
 #include "os_abstraction.h"
 #include "../../newgrf_config.h"
 
-/**
- * @file core.h Base for all network types (UDP and TCP)
- */
-
 bool NetworkCoreInitialize(void);
 void NetworkCoreShutdown(void);
 
--- a/src/network/core/game.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/game.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,10 @@
 /* $Id$ */
 
+/**
+ * @file game.h Information about a game that is sent between a
+ *              game server, game client and masterserver.
+ */
+
 #ifndef NETWORK_CORE_GAME_H
 #define NETWORK_CORE_GAME_H
 
@@ -10,11 +15,6 @@
 #include "../../newgrf_config.h"
 
 /**
- * @file game.h Information about a game that is sent between a
- *              game server, game client and masterserver.
- */
-
-/**
  * This is the struct used by both client and server
  * some fields will be empty on the client (like game_password) by default
  * and only filled with data a player enters.
--- a/src/network/core/os_abstraction.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/os_abstraction.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,14 +1,14 @@
 /* $Id$ */
 
-#ifndef NETWORK_CORE_OS_ABSTRACTION_H
-#define NETWORK_CORE_OS_ABSTRACTION_H
-
 /**
  * @file os_abstraction.h Network stuff has many things that needs to be
  *                        included and/or implemented by default.
  *                        All those things are in this file.
  */
 
+#ifndef NETWORK_CORE_OS_ABSTRACTION_H
+#define NETWORK_CORE_OS_ABSTRACTION_H
+
 /* Include standard stuff per OS */
 
 #ifdef ENABLE_NETWORK
--- a/src/network/core/packet.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/packet.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,9 @@
 /* $Id$ */
 
+/**
+ * @file packet.cpp Basic functions to create, fill and read packets.
+ */
+
 #ifdef ENABLE_NETWORK
 
 #include "../../stdafx.h"
@@ -9,10 +13,6 @@
 
 #include "packet.h"
 
-/**
- * @file packet.cpp Basic functions to create, fill and read packets.
- */
-
 
 /* Do not want to include functions.h and all required headers */
 extern void NORETURN CDECL error(const char *str, ...);
--- a/src/network/core/packet.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/packet.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,9 @@
 /* $Id$ */
 
+/**
+ * @file packet.h Basic functions to create, fill and read packets.
+ */
+
 #ifndef NETWORK_CORE_PACKET_H
 #define NETWORK_CORE_PACKET_H
 
@@ -8,10 +12,6 @@
 #include "config.h"
 #include "core.h"
 
-/**
- * @file packet.h Basic functions to create, fill and read packets.
- */
-
 typedef uint16 PacketSize; ///< Size of the whole packet.
 typedef uint8  PacketType; ///< Identifier for the packet
 
--- a/src/network/core/tcp.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/tcp.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,9 @@
 /* $Id$ */
 
+/**
+ * @file tcp.cpp Basic functions to receive and send TCP packets.
+ */
+
 #ifdef ENABLE_NETWORK
 
 #include "../../stdafx.h"
@@ -14,10 +18,6 @@
 #include "tcp.h"
 #include "../../helpers.hpp"
 
-/**
- * @file tcp.cpp Basic functions to receive and send TCP packets.
- */
-
 /** Very ugly temporary hack !!! */
 void NetworkTCPSocketHandler::Initialize()
 {
--- a/src/network/core/tcp.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/tcp.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,9 @@
 /* $Id$ */
 
+/**
+ * @file tcp.h Basic functions to receive and send TCP packets.
+ */
+
 #ifndef NETWORK_CORE_TCP_H
 #define NETWORK_CORE_TCP_H
 
@@ -10,10 +14,6 @@
 #include "packet.h"
 
 /**
- * @file tcp.h Basic functions to receive and send TCP packets.
- */
-
-/**
  * Enum with all types of UDP packets.
  * The order of the first 4 packets MUST not be changed, as
  * it protects old clients from joining newer servers
--- a/src/network/core/udp.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/udp.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,9 @@
 /* $Id$ */
 
+/**
+ * @file core/udp.cpp Basic functions to receive and send UDP packets.
+ */
+
 #ifdef ENABLE_NETWORK
 
 #include "../../stdafx.h"
@@ -10,10 +14,6 @@
 #include "udp.h"
 
 /**
- * @file core/udp.cpp Basic functions to receive and send UDP packets.
- */
-
-/**
  * Start listening on the given host and port.
  * @param host      the host (ip) to listen on
  * @param port      the port to listen on
--- a/src/network/core/udp.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/core/udp.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,16 +1,5 @@
 /* $Id$ */
 
-#ifndef NETWORK_CORE_UDP_H
-#define NETWORK_CORE_UDP_H
-
-#ifdef ENABLE_NETWORK
-
-#include "os_abstraction.h"
-#include "core.h"
-#include "game.h"
-#include "packet.h"
-#include "../../debug.h"
-
 /**
  * @file udp.h Basic functions to receive and send UDP packets.
  *
@@ -72,6 +61,17 @@
  *   1+       1       whether the server is dedicated (0 = no, 1 = yes)
  */
 
+#ifndef NETWORK_CORE_UDP_H
+#define NETWORK_CORE_UDP_H
+
+#ifdef ENABLE_NETWORK
+
+#include "os_abstraction.h"
+#include "core.h"
+#include "game.h"
+#include "packet.h"
+#include "../../debug.h"
+
 /** Enum with all types of UDP packets. The order MUST not be changed **/
 enum PacketUDPType {
 	PACKET_UDP_CLIENT_FIND_SERVER,   ///< Queries a game server for game information
--- a/src/network/network_gamelist.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/network_gamelist.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,10 @@
 /* $Id$ */
 
+/**
+ * @file network_gamelist.cpp This file handles the GameList
+ * Also, it handles the request to a server for data about the server
+ */
+
 #ifdef ENABLE_NETWORK
 
 #include "../stdafx.h"
@@ -11,11 +16,6 @@
 #include "network_gamelist.h"
 #include "network_gui.h"
 
-/**
- * @file network_gamelist.cpp This file handles the GameList
- * Also, it handles the request to a server for data about the server
- */
-
 NetworkGameList *_network_game_list = NULL;
 
 /** Should we stop/contiue requerying of offline servers? */
--- a/src/network/network_udp.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/network/network_udp.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,12 @@
 /* $Id$ */
 
+/**
+ * @file network_udp.cpp This file handles the UDP related communication.
+ *
+ * This is the GameServer <-> MasterServer and GameServer <-> GameClient
+ * communication before the game is being joined.
+ */
+
 #ifdef ENABLE_NETWORK
 
 #include "../stdafx.h"
@@ -15,13 +22,6 @@
 
 #include "core/udp.h"
 
-/**
- * @file network_udp.c This file handles the UDP related communication.
- *
- * This is the GameServer <-> MasterServer and GameServer <-> GameClient
- * communication before the game is being joined.
- */
-
 enum {
 	ADVERTISE_NORMAL_INTERVAL = 30000, // interval between advertising in ticks (15 minutes)
 	ADVERTISE_RETRY_INTERVAL  =   300, // readvertise when no response after this many ticks (9 seconds)
--- a/src/newgrf.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -31,6 +31,7 @@
 #include "newgrf_sound.h"
 #include "newgrf_spritegroup.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 /* TTDPatch extended GRF format codec
  * (c) Petr Baudis 2004 (GPL'd)
@@ -67,6 +68,10 @@
 /* Set if any vehicle is loaded which uses 2cc (two company colours) */
 bool _have_2cc = false;
 
+/* Default cargo translation table. By default there are 27 possible cargo types */
+static const uint _default_cargo_max = 27;
+static CargoLabel _default_cargo_list[_default_cargo_max];
+
 
 typedef enum GrfDataType {
 	GDT_SOUND,
@@ -183,6 +188,24 @@
 	}
 }
 
+static const char *grf_load_string(byte **buf, size_t max_len)
+{
+	const char *string   = *(const char **)buf;
+	size_t string_length = ttd_strnlen(string, max_len);
+
+	if (string_length == max_len) {
+		/* String was not NUL terminated, so make sure it is now. */
+		(*buf)[string_length - 1] = '\0';
+		grfmsg(7, "String was not terminated with a zero byte.");
+	} else {
+		/* Increase the string length to include the NUL byte. */
+		string_length++;
+	}
+	*buf += string_length;
+
+	return string;
+}
+
 static GRFFile *GetFileByGRFID(uint32 grfid)
 {
 	GRFFile *file;
@@ -345,7 +368,8 @@
 				if (ctype < NUM_CARGO) {
 					rvi[i].cargo_type = ctype;
 				} else {
-					grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, ignoring", ctype);
+					rvi[i].cargo_type = CT_INVALID;
+					grfmsg(2, "RailVehicleChangeInfo: Invalid cargo type %d, using first refittable", ctype);
 				}
 			}
 			break;
@@ -536,7 +560,8 @@
 				if (cargo < NUM_CARGO) {
 					rvi[i].cargo_type = cargo;
 				} else {
-					grfmsg(2, "RoadVehicleChangeInfo: Invalid cargo type %d, ignoring", cargo);
+					rvi[i].cargo_type = CT_INVALID;
+					grfmsg(2, "RoadVehicleChangeInfo: Invalid cargo type %d, using first refittable", cargo);
 				}
 			}
 			break;
@@ -646,17 +671,11 @@
 			FOR_EACH_OBJECT {
 				uint8 cargo = grf_load_byte(&buf);
 
-				// XXX: Need to consult this with patchman yet.
-#if 0
-				// Documentation claims this is already the
-				// per-landscape cargo type id, but newships.grf
-				// assume otherwise.
-				cargo = local_cargo_id_ctype[cargo];
-#endif
 				if (cargo < NUM_CARGO) {
 					svi[i].cargo_type = cargo;
 				} else {
-					grfmsg(2, "ShipVehicleChangeInfo: Invalid cargo type %d, ignoring", cargo);
+					svi[i].cargo_type = CT_INVALID;
+					grfmsg(2, "ShipVehicleChangeInfo: Invalid cargo type %d, using first refittable", cargo);
 				}
 			}
 			break;
@@ -1174,6 +1193,12 @@
 			}
 			break;
 
+		case 0x09: /* Cargo translation table */
+			/* This is loaded during the initialisation stage, so just skip it here. */
+			/* Each entry is 4 bytes. */
+			buf += numinfo * 4;
+			break;
+
 		case 0x0A: // Currency display names
 			FOR_EACH_OBJECT {
 				uint curidx = GetNewgrfCurrencyIdConverted(gvid + i);
@@ -1258,7 +1283,6 @@
 			}
 			break;
 
-		case 0x09: // Cargo translation table
 		case 0x10: // 12 * 32 * B Snow line height table
 		default:
 			ret = true;
@@ -1461,6 +1485,11 @@
 	uint8 numinfo;
 	uint8 index;
 
+	if (len == 1) {
+		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
+		return;
+	}
+
 	if (!check_length(len, 6, "SafeChangeInfo")) return;
 	buf++;
 	feature  = grf_load_byte(&buf);
@@ -1481,6 +1510,55 @@
 	_skip_sprites = -1;
 }
 
+/* Action 0x00 (GLS_INIT) */
+static void InitChangeInfo(byte *buf, int len)
+{
+	byte *bufend = buf + len;
+	uint8 feature;
+	uint8 numprops;
+	uint8 numinfo;
+	uint8 index;
+
+	if (len == 1) {
+		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
+		return;
+	}
+
+	if (!check_length(len, 6, "InitChangeInfo")) return;
+	buf++;
+	feature  = grf_load_byte(&buf);
+	numprops = grf_load_byte(&buf);
+	numinfo  = grf_load_byte(&buf);
+	index    = grf_load_byte(&buf);
+
+	while (numprops-- && buf < bufend) {
+		uint8 prop = grf_load_byte(&buf);
+
+		switch (feature) {
+			case GSF_GLOBALVAR:
+				switch (prop) {
+					case 0x09: /* Cargo Translation Table */
+						if (index != 0) {
+							grfmsg(1, "InitChangeInfo: Cargo translation table must start at zero");
+							return;
+						}
+
+						free(_cur_grffile->cargo_list);
+						_cur_grffile->cargo_max = numinfo;
+						_cur_grffile->cargo_list = MallocT<CargoLabel>(numinfo);
+
+						int i;
+						FOR_EACH_OBJECT {
+							CargoLabel cl = grf_load_dword(&buf);
+							_cur_grffile->cargo_list[i] = BSWAP32(cl);
+						}
+						break;
+				}
+				break;
+		}
+	}
+}
+
 #undef FOR_EACH_OBJECT
 
 /**
@@ -1814,6 +1892,35 @@
 	_cur_grffile->spritegroups[setid] = group;
 }
 
+static CargoID TranslateCargo(uint8 feature, uint8 ctype)
+{
+	/* Special cargo types for purchase list and stations */
+	if (feature == GSF_STATION && ctype == 0xFE) return CT_DEFAULT_NA;
+	if (ctype == 0xFF) return CT_PURCHASE;
+
+	/* Check if the cargo type is out of bounds of the cargo translation table */
+	if (ctype >= (_cur_grffile->cargo_max == 0 ? _default_cargo_max : _cur_grffile->cargo_max)) {
+		grfmsg(1, "FeatureMapSpriteGroup: Cargo type %d out of range (max %d), skipping.", ctype, (_cur_grffile->cargo_max == 0 ? _default_cargo_max : _cur_grffile->cargo_max) - 1);
+		return CT_INVALID;
+	}
+
+	/* Look up the cargo label from the translation table */
+	CargoLabel cl = _cur_grffile->cargo_max == 0 ? _default_cargo_list[ctype] : _cur_grffile->cargo_list[ctype];
+	if (cl == 0) {
+		grfmsg(5, "FeatureMapSpriteGroup: Cargo type %d not available in this climate, skipping.", ctype);
+		return CT_INVALID;
+	}
+
+	ctype = GetCargoIDByLabel(cl);
+	if (ctype == CT_INVALID) {
+		grfmsg(5, "FeatureMapSpriteGroup: Cargo '%c%c%c%c' unsupported, skipping.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8));
+		return CT_INVALID;
+	}
+
+	grfmsg(6, "FeatureMapSpriteGroup: Cargo '%c%c%c%c' mapped to cargo type %d.", GB(cl, 24, 8), GB(cl, 16, 8), GB(cl, 8, 8), GB(cl, 0, 8), ctype);
+	return ctype;
+}
+
 /* Action 0x03 */
 static void FeatureMapSpriteGroup(byte *buf, int len)
 {
@@ -1885,13 +1992,8 @@
 					return;
 				}
 
-				if (ctype == 0xFE) ctype = GC_DEFAULT_NA;
-				if (ctype == 0xFF) ctype = GC_PURCHASE;
-
-				if (ctype >= NUM_GLOBAL_CID) {
-					grfmsg(1, "FeatureMapSpriteGroup: Cargo type %d out of range, skipping.", ctype);
-					continue;
-				}
+				ctype = TranslateCargo(feature, ctype);
+				if (ctype == CT_INVALID) continue;
 
 				statspec->spritegroup[ctype] = _cur_grffile->spritegroups[groupid];
 			}
@@ -1911,7 +2013,7 @@
 				uint8 stid = buf[3 + i];
 				StationSpec *statspec = _cur_grffile->stations[stid];
 
-				statspec->spritegroup[GC_DEFAULT] = _cur_grffile->spritegroups[groupid];
+				statspec->spritegroup[CT_DEFAULT] = _cur_grffile->spritegroups[groupid];
 				statspec->grfid = _cur_grffile->grfid;
 				statspec->localidx = stid;
 				SetCustomStationSpec(statspec);
@@ -1967,12 +2069,8 @@
 				return;
 			}
 
-			if (ctype == GC_INVALID) ctype = GC_PURCHASE;
-
-			if (ctype >= NUM_GLOBAL_CID) {
-				grfmsg(1, "FeatureMapSpriteGroup: Cargo type %d out of range, skipping.", ctype);
-				continue;
-			}
+			ctype = TranslateCargo(feature, ctype);
+			if (ctype == CT_INVALID) continue;
 
 			if (wagover) {
 				SetWagonOverrideSprites(engine, ctype, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
@@ -2005,10 +2103,10 @@
 					SetRotorOverrideSprites(engine, _cur_grffile->spritegroups[groupid]);
 				} else {
 					// TODO: No multiple cargo types per vehicle yet. --pasky
-					SetWagonOverrideSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
+					SetWagonOverrideSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid], last_engines, last_engines_count);
 				}
 			} else {
-				SetCustomEngineSprites(engine, GC_DEFAULT, _cur_grffile->spritegroups[groupid]);
+				SetCustomEngineSprites(engine, CT_DEFAULT, _cur_grffile->spritegroups[groupid]);
 				SetEngineGRF(engine, _cur_grffile);
 				last_engines[i] = engine;
 			}
@@ -2046,7 +2144,6 @@
 	uint8 num;
 	uint16 id;
 	uint16 endid;
-	const char* name;
 	bool new_scheme = _cur_grffile->grf_version >= 7;
 	bool generic;
 
@@ -2068,13 +2165,19 @@
 	grfmsg(6, "FeatureNewName: About to rename engines %d..%d (feature %d) in language 0x%02X",
 	               id, endid, feature, lang);
 
-	name = (const char*)buf; /*transfer read value*/
 	len -= generic ? 6 : 5;
 
 	for (; id < endid && len > 0; id++) {
-		size_t ofs = strlen(name) + 1;
-
-		if (ofs < 128) {
+		const char *name   = grf_load_string(&buf, len);
+		size_t name_length = strlen(name) + 1;
+
+		len -= (int)name_length;
+
+		if (name_length == 1) {
+			grfmsg(7, "FeatureNewName: Can't add empty name");
+		} else if (name_length > 127) {
+			grfmsg(7, "FeatureNewName: Too long a name (%d)", name_length);
+		} else {
 			grfmsg(8, "FeatureNewName: %d <- %s", id, name);
 
 			switch (feature) {
@@ -2143,17 +2246,7 @@
 					break;
 #endif
 			}
-		} else {
-			/* ofs is the string length + 1, so if the string is empty, ofs
-			 * is 1 */
-			if (ofs == 1) {
-				grfmsg(7, "FeatureNewName: Can't add empty name");
-			} else {
-				grfmsg(7, "FeatureNewName: Too long a name (%d)", ofs);
-			}
 		}
-		name += ofs;
-		len -= (int)ofs;
 	}
 }
 
@@ -2521,6 +2614,9 @@
 		 * we use -1 to indicate that all further
 		 * sprites should be skipped. */
 		_skip_sprites = -1;
+
+		/* If an action 8 hasn't been encountered yet, disable the grf. */
+		if (!HASBIT(_cur_grfconfig->flags, GCF_ACTIVATED)) SETBIT(_cur_grfconfig->flags, GCF_DISABLED);
 	}
 }
 
@@ -2579,7 +2675,7 @@
 	if (!check_length(len, 8, "GRFInfo")) return; buf++;
 	version = grf_load_byte(&buf);
 	grfid = grf_load_dword(&buf);
-	name = (const char*)buf;
+	name = grf_load_string(&buf, len - 6);
 
 	_cur_grffile->grfid = grfid;
 	_cur_grffile->grf_version = version;
@@ -2622,7 +2718,7 @@
 }
 
 /* Action 0x0B */
-static void GRFError(byte *buf, int len)
+static void GRFLoadError(byte *buf, int len)
 {
 	/* <0B> <severity> <language-id> <message-id> [<message...> 00] [<data...>] 00 [<parnum>]
 	 *
@@ -2637,40 +2733,105 @@
 	 * S message       for custom messages (message-id FF), text of the message
 	 *                 not present for built-in messages.
 	 * V data          additional data for built-in (or custom) messages
-	 * B parnum        see action 6, only used with built-in message 03 */
-	/* TODO: For now we just show the message, sometimes incomplete and never translated. */
-
-	static const char *const msgstr[] = {
-		"%sRequires at least pseudo-TTDPatch version %s",
-		"%sThis file is for %s version of TTD",
-		"%sDesigned to be used with %s",
-		"%sInvalid parameter %s",
-		"%sMust be loaded before %s",
-		"%sMust be loaded after %s",
-		"%s%s"
+	 * B parnum        parameter numbers to be shown in the message (maximum of 2) */
+
+	static const StringID msgstr[] = {
+		STR_NEWGRF_ERROR_VERSION_NUMBER,
+		STR_NEWGRF_ERROR_DOS_OR_WINDOWS,
+		STR_NEWGRF_ERROR_UNSET_SWITCH,
+		STR_NEWGRF_ERROR_INVALID_PARAMETER,
+		STR_NEWGRF_ERROR_LOAD_BEFORE,
+		STR_NEWGRF_ERROR_LOAD_AFTER
 	};
 
-	static const char *const sevstr[] = {
-		"",
-		"Warning: ",
-		"Error: ",
-		"Fatal: ",
+	static const StringID sevstr[] = {
+		STR_NEWGRF_ERROR_MSG_INFO,
+		STR_NEWGRF_ERROR_MSG_WARNING,
+		STR_NEWGRF_ERROR_MSG_ERROR,
+		STR_NEWGRF_ERROR_MSG_FATAL
 	};
-	uint8 sevid;
-	uint8 msgid;
-
-	if (!check_length(len, 6, "GRFError")) return;
-	sevid = buf[1];
-	msgid = buf[3];
-
-	// Undocumented TTDPatch feature.
-	if (!HASBIT(sevid, 7) && _cur_stage < GLS_ACTIVATION) {
-		grfmsg(7, "Skipping non-fatal GRFError in stage 1");
+
+	/* AddGRFString expects the string to be referred to by an id in the newgrf
+	 * file. Errors messages are never referred to however, so invent ids that
+	 * are unlikely to be reached in a newgrf file so they don't overwrite
+	 * anything else. */
+	enum {
+		MESSAGE_STRING_ID = MAX_UVALUE(StringID) - 1,
+		MESSAGE_DATA_ID   = MAX_UVALUE(StringID)
+	};
+
+	if (!check_length(len, 6, "GRFLoadError")) return;
+
+	/* For now we can only show one message per newgrf file. */
+	if (_cur_grfconfig->error != NULL) return;
+
+	buf++; /* Skip the action byte. */
+	byte severity   = grf_load_byte(&buf);
+	byte lang       = grf_load_byte(&buf);
+	byte message_id = grf_load_byte(&buf);
+	len -= 4;
+
+	/* Skip the error until the activation stage unless bit 7 of the severity
+	 * is set. */
+	if (!HASBIT(severity, 7) && _cur_stage < GLS_ACTIVATION) {
+		grfmsg(7, "Skipping non-fatal GRFLoadError in stage 1");
 		return;
 	}
-
-	sevid = GB(sevid, 0, 2);
-	grfmsg(0,  msgstr[(msgid == 0xFF) ? lengthof(msgstr) - 1 : msgid], sevstr[sevid], &buf[4]);
+	CLRBIT(severity, 7);
+
+	if (severity >= lengthof(sevstr)) {
+		grfmsg(7, "GRFLoadError: Invalid severity id %d. Setting to 2 (non-fatal error).", severity);
+		severity = 2;
+	} else if (severity == 3) {
+		/* This is a fatal error, so make sure the GRF is deactivated and no
+		 * more of it gets loaded. */
+		SETBIT(_cur_grfconfig->flags, GCF_DISABLED);
+		CLRBIT(_cur_grfconfig->flags, GCF_ACTIVATED);
+
+		_skip_sprites = -1;
+	}
+
+	if (message_id >= lengthof(msgstr) && message_id != 0xFF) {
+		grfmsg(7, "GRFLoadError: Invalid message id.");
+		return;
+	}
+
+	if (len <= 1) {
+		grfmsg(7, "GRFLoadError: No message data supplied.");
+		return;
+	}
+
+	bool new_scheme = _cur_grffile->grf_version >= 7;
+	GRFError *error = CallocT<GRFError>(1);
+
+	error->severity = sevstr[severity];
+
+	if (message_id == 0xFF) {
+		/* This is a custom error message. */
+		const char *message = grf_load_string(&buf, len);
+		len -= (strlen(message) + 1);
+
+		error->message = AddGRFString(_cur_grffile->grfid, MESSAGE_STRING_ID, lang, new_scheme, message, STR_UNDEFINED);
+	} else {
+		error->message = msgstr[message_id];
+	}
+
+	if (len > 0) {
+		const char *data = grf_load_string(&buf, len);
+		len -= (strlen(data) + 1);
+
+		error->data = AddGRFString(_cur_grffile->grfid, MESSAGE_DATA_ID, lang, new_scheme, data, STR_UNDEFINED);
+	}
+
+	/* Only two parameter numbers can be used in the string. */
+	uint i = 0;
+	for (; i < 2 && len > 0; i++) {
+		error->param_number[i] = grf_load_byte(&buf);
+		len--;
+	}
+	error->num_params = i;
+
+	_cur_grfconfig->error = error;
 }
 
 /* Action 0x0C */
@@ -2680,11 +2841,11 @@
 	 *
 	 * V ignored       Anything following the 0C is ignored */
 
-	static char comment[256];
 	if (len == 1) return;
 
-	ttd_strlcpy(comment, (char*)(buf + 1), minu(sizeof(comment), len));
-	grfmsg(2, "GRFComment: %s", comment);
+	int text_len = len - 1;
+	const char *text = (const char*)(buf + 1);
+	grfmsg(2, "GRFComment: %.*s", text_len, text);
 }
 
 /* Action 0x0D (GLS_SAFETYSCAN) */
@@ -3503,6 +3664,16 @@
 	// Add engine type to engine data. This is needed for the refit precalculation.
 	AddTypeToEngines();
 
+	/* Set up the default cargo types */
+	SetupCargoForClimate(_opt.landscape);
+
+	/* Generate default cargo translation table */
+	memset(_default_cargo_list, 0, sizeof(_default_cargo_list));
+	for (CargoID c = 0; c != NUM_CARGO; c++) {
+		const CargoSpec *cs = GetCargo(c);
+		if (cs->IsValid()) _default_cargo_list[cs->bitnum] = cs->label;
+	}
+
 	/* Reset misc GRF features and train list display variables */
 	_misc_grf_features = 0;
 	_traininfo_vehicle_pitch = 0;
@@ -3533,6 +3704,29 @@
 	_cur_grffile->spritegroups_count = 0;
 }
 
+static void BuildCargoTranslationMap()
+{
+	memset(_cur_grffile->cargo_map, 0xFF, sizeof(_cur_grffile->cargo_map));
+
+	for (CargoID c = 0; c < NUM_CARGO; c++) {
+		const CargoSpec *cs = GetCargo(c);
+		if (!cs->IsValid()) continue;
+
+		if (_cur_grffile->cargo_max == 0) {
+			/* Default translation table, so just a straight mapping to bitnum */
+			_cur_grffile->cargo_map[c] = cs->bitnum;
+		} else {
+			/* Check the translation table for this cargo's label */
+			for (uint i = 0; i < _cur_grffile->cargo_max; i++) {
+				if (cs->label == _cur_grffile->cargo_list[i]) {
+					_cur_grffile->cargo_map[c] = i;
+					break;
+				}
+			}
+		}
+	}
+}
+
 static void InitNewGRFFile(const GRFConfig *config, int sprite_offset)
 {
 	GRFFile *newfile;
@@ -3567,28 +3761,36 @@
 }
 
 
-/** Bitmasked values of what type of cargo is refittable for the given vehicle-type.
- * This coupled with the landscape information (_landscape_global_cargo_mask) gives
- * us exactly what is refittable and what is not */
-#define MC(cargo) (1 << cargo)
-static const uint32 _default_refitmasks[NUM_VEHICLE_TYPES] = {
-	/* Trains */
-	MC(GC_PASSENGERS) | MC(GC_COAL)      | MC(GC_MAIL)   | MC(GC_LIVESTOCK) | MC(GC_GOODS)        | MC(GC_GRAIN)      | MC(GC_WOOD)    | MC(GC_IRON_ORE)    |
-	MC(GC_STEEL)      | MC(GC_VALUABLES) | MC(GC_PAPER)  | MC(GC_FOOD)      | MC(GC_FRUIT)        | MC(GC_COPPER_ORE) | MC(GC_WATER)   | MC(GC_SUGAR)       |
-	MC(GC_TOYS)       | MC(GC_CANDY)     | MC(GC_TOFFEE) | MC(GC_COLA)      | MC(GC_COTTON_CANDY) | MC(GC_BUBBLES)    | MC(GC_PLASTIC) | MC(GC_FIZZY_DRINKS),
-	/* Road vehicles (not refittable by default) */
-	0,
-	/* Ships */
-	MC(GC_COAL)  | MC(GC_MAIL)   | MC(GC_LIVESTOCK) | MC(GC_GOODS)        | MC(GC_GRAIN)   | MC(GC_WOOD)    | MC(GC_IRON_ORE) | MC(GC_STEEL) | MC(GC_VALUABLES) |
-	MC(GC_PAPER) | MC(GC_FOOD)   | MC(GC_FRUIT)     | MC(GC_COPPER_ORE)   | MC(GC_WATER)   | MC(GC_RUBBER)  | MC(GC_SUGAR)    | MC(GC_TOYS)  | MC(GC_BATTERIES) |
-	MC(GC_CANDY) | MC(GC_TOFFEE) | MC(GC_COLA)      | MC(GC_COTTON_CANDY) | MC(GC_BUBBLES) | MC(GC_PLASTIC) | MC(GC_FIZZY_DRINKS),
-	/* Aircraft */
-	MC(GC_PASSENGERS) | MC(GC_MAIL)  | MC(GC_GOODS)  | MC(GC_VALUABLES) | MC(GC_FOOD)         | MC(GC_FRUIT)   | MC(GC_SUGAR)   | MC(GC_TOYS) |
-	MC(GC_BATTERIES)  | MC(GC_CANDY) | MC(GC_TOFFEE) | MC(GC_COLA)      | MC(GC_COTTON_CANDY) | MC(GC_BUBBLES) | MC(GC_PLASTIC) | MC(GC_FIZZY_DRINKS),
-	/* Special/Disaster */
-	0,0
+/** List of what cargo labels are refittable for the given the vehicle-type.
+ * Only currently active labels are applied. */
+static const CargoLabel _default_refitmasks_rail[] = {
+	'PASS', 'COAL', 'MAIL', 'LVST', 'GOOD', 'GRAI', 'WHEA', 'MAIZ', 'WOOD',
+	'IORE', 'STEL', 'VALU', 'GOLD', 'DIAM', 'PAPR', 'FOOD', 'FRUT', 'CORE',
+	'WATR', 'SUGR', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL',
+	'PLST', 'FZDR',
+	0 };
+
+static const CargoLabel _default_refitmasks_road[] = {
+	0 };
+
+static const CargoLabel _default_refitmasks_ships[] = {
+	'COAL', 'MAIL', 'LVST', 'GOOD', 'GRAI', 'WHEA', 'MAIZ', 'WOOD', 'IORE',
+	'STEL', 'VALU', 'GOLD', 'DIAM', 'PAPR', 'FOOD', 'FRUT', 'CORE', 'WATR',
+	'RUBR', 'SUGR', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL',
+	'PLST', 'FZDR',
+	0 };
+
+static const CargoLabel _default_refitmasks_aircraft[] = {
+	'PASS', 'MAIL', 'GOOD', 'VALU', 'GOLD', 'DIAM', 'FOOD', 'FRUT', 'SUGR',
+	'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR',
+	0 };
+
+static const CargoLabel *_default_refitmasks[] = {
+	_default_refitmasks_rail,
+	_default_refitmasks_road,
+	_default_refitmasks_ships,
+	_default_refitmasks_aircraft,
 };
-#undef MC
 
 
 /**
@@ -3606,9 +3808,10 @@
 
 		if (cargo_allowed[engine] != 0) {
 			// Build up the list of cargo types from the set cargo classes.
-			for (i = 0; i < lengthof(cargo_classes); i++) {
-				if (HASBIT(cargo_allowed[engine], i)) mask |= cargo_classes[i];
-				if (HASBIT(cargo_disallowed[engine], i)) not_mask |= cargo_classes[i];
+			for (i = 0; i < NUM_CARGO; i++) {
+				const CargoSpec *cs = GetCargo(i);
+				if (cargo_allowed[engine]    & cs->classes) SETBIT(mask,     i);
+				if (cargo_disallowed[engine] & cs->classes) SETBIT(not_mask, i);
 			}
 		} else {
 			// Don't apply default refit mask to wagons or engines with no capacity
@@ -3618,10 +3821,40 @@
 							RailVehInfo(engine)->railveh_type != RAILVEH_WAGON
 						)
 					)) {
-				xor_mask = _default_refitmasks[GetEngine(engine)->type];
+				const CargoLabel *cl = _default_refitmasks[GetEngine(engine)->type];
+				for (uint i = 0;; i++) {
+					if (cl[i] == 0) break;
+
+					CargoID cargo = GetCargoIDByLabel(cl[i]);
+					if (cargo == CT_INVALID) continue;
+
+					SETBIT(xor_mask, cargo);
+				}
 			}
 		}
-		_engine_info[engine].refit_mask = ((mask & ~not_mask) ^ xor_mask) & _landscape_global_cargo_mask[_opt.landscape];
+		_engine_info[engine].refit_mask = ((mask & ~not_mask) ^ xor_mask) & _cargo_mask;
+
+		if (_engine_info[engine].refit_mask == 0) continue;
+
+		/* Check if this engine's cargo type is valid. If not, set to the first refittable
+		 * cargo type. Apparently cargo_type isn't a common property... */
+		switch (GetEngine(engine)->type) {
+			case VEH_Train: {
+				RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
+				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
+				break;
+			}
+			case VEH_Road: {
+				RoadVehicleInfo *rvi = &_road_vehicle_info[engine - ROAD_ENGINES_INDEX];
+				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
+				break;
+			}
+			case VEH_Ship: {
+				ShipVehicleInfo *svi = &_ship_vehicle_info[engine - SHIP_ENGINES_INDEX];
+				if (svi->cargo_type == CT_INVALID) svi->cargo_type = FindFirstRefittableCargo(engine);
+				break;
+			}
+		}
 	}
 }
 
@@ -3646,7 +3879,7 @@
 	 * is not in memory and scanning the file every time would be too expensive.
 	 * In other stages we skip action 0x10 since it's already dealt with. */
 	static const SpecialSpriteHandler handlers[][GLS_END] = {
-		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       NULL,       FeatureChangeInfo, },
+		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       InitChangeInfo, FeatureChangeInfo, },
 		/* 0x01 */ { NULL,     GRFUnsafe, NULL,            NULL,       NewSpriteSet, },
 		/* 0x02 */ { NULL,     GRFUnsafe, NULL,            NULL,       NewSpriteGroup, },
 		/* 0x03 */ { NULL,     GRFUnsafe, NULL,            NULL,       FeatureMapSpriteGroup, },
@@ -3657,7 +3890,7 @@
 		/* 0x08 */ { ScanInfo, NULL,      NULL,            GRFInfo,    GRFInfo, },
 		/* 0x09 */ { NULL,     NULL,      NULL,            SkipIf,     SkipIf, },
 		/* 0x0A */ { NULL,     NULL,      NULL,            NULL,       SpriteReplace, },
-		/* 0x0B */ { NULL,     NULL,      NULL,            GRFError,   GRFError, },
+		/* 0x0B */ { NULL,     NULL,      NULL,            GRFLoadError, GRFLoadError, },
 		/* 0x0C */ { NULL,     NULL,      NULL,            GRFComment, GRFComment, },
 		/* 0x0D */ { NULL,     SafeParamSet, NULL,         ParamSet,   ParamSet, },
 		/* 0x0E */ { NULL,     SafeGRFInhibit, NULL,       GRFInhibit, GRFInhibit, },
@@ -3726,6 +3959,8 @@
 		if (stage == GLS_ACTIVATION && !HASBIT(config->flags, GCF_ACTIVATED)) return;
 	}
 
+	if (stage == GLS_ACTIVATION) CLRBIT(config->flags, GCF_ACTIVATED);
+
 	FioOpenFile(file_index, filename);
 	_file_index = file_index; // XXX
 
@@ -3817,6 +4052,7 @@
 			LoadNewGRFFile(c, slot++, stage);
 			if (stage == GLS_ACTIVATION) {
 				ClearTemporaryNewGRFData();
+				BuildCargoTranslationMap();
 				DEBUG(sprite, 2, "Currently %i sprites are loaded", _cur_spriteid);
 			}
 		}
--- a/src/newgrf.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf.h	Wed Feb 28 00:33:40 2007 +0000
@@ -6,6 +6,7 @@
 #include "station.h"
 #include "newgrf_config.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 typedef enum GrfLoadingStage {
 	GLS_FILESCAN,
@@ -60,6 +61,10 @@
 	uint param_end; /// one more than the highest set parameter
 
 	GRFLabel *label; ///< Pointer to the first label. This is a linked list, not an array.
+
+	uint8 cargo_max;
+	CargoLabel *cargo_list;
+	uint8 cargo_map[NUM_CARGO];
 } GRFFile;
 
 extern GRFFile *_first_grffile;
--- a/src/newgrf_cargo.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/* $Id$ */
-
-#include "stdafx.h"
-#include "openttd.h"
-#include "newgrf_cargo.h"
-
-/** TRANSLATE FROM LOCAL CARGO TO GLOBAL CARGO ID'S.
- * This maps the per-landscape cargo ID's to globally unique cargo ID's usable ie. in
- * the custom GRF  files. It is basically just a transcribed table from TTDPatch's newgrf.txt.
- */
-const CargoID _global_cargo_id[NUM_LANDSCAPE][NUM_CARGO] = {
-	/* LT_NORMAL */ {GC_PASSENGERS, GC_COAL,   GC_MAIL, GC_OIL,  GC_LIVESTOCK, GC_GOODS, GC_GRAIN,  GC_WOOD, GC_IRON_ORE,     GC_STEEL,   GC_VALUABLES, GC_PAPER_TEMP},
-	/* LT_HILLY */  {GC_PASSENGERS, GC_COAL,   GC_MAIL, GC_OIL,  GC_LIVESTOCK, GC_GOODS, GC_GRAIN,  GC_WOOD, GC_INVALID,      GC_PAPER,   GC_VALUABLES, GC_FOOD },
-	/* LT_DESERT */ {GC_PASSENGERS, GC_RUBBER, GC_MAIL, GC_OIL,  GC_FRUIT,     GC_GOODS, GC_GRAIN,  GC_WOOD, GC_COPPER_ORE,   GC_WATER,   GC_VALUABLES, GC_FOOD },
-	/* LT_CANDY */  {GC_PASSENGERS, GC_SUGAR,  GC_MAIL, GC_TOYS, GC_BATTERIES, GC_CANDY, GC_TOFFEE, GC_COLA, GC_COTTON_CANDY, GC_BUBBLES, GC_PLASTIC,   GC_FIZZY_DRINKS },
-	/**
-	 * - GC_INVALID (255) means that  cargo is not available for that climate
-	 * - GC_PAPER_TEMP (27) is paper in  temperate climate in TTDPatch
-	 * Following can  be renumbered:
-	 * - GC_DEFAULT (29) is the defa ult cargo for the purpose of spritesets
-	 * - GC_PURCHASE (30) is the purchase list image (the equivalent of 0xff) for the purpose of spritesets
-	 */
-};
-
-/** BEGIN --- TRANSLATE FROM GLOBAL CARGO TO LOCAL CARGO ID'S **/
-/** Map global cargo ID's to local-cargo ID's */
-const CargoID _local_cargo_id_ctype[NUM_GLOBAL_CID] = {
-	CT_PASSENGERS, CT_COAL,    CT_MAIL,         CT_OIL,       CT_LIVESTOCK, CT_GOODS,  CT_GRAIN,      CT_WOOD,         /*  0- 7 */
-	CT_IRON_ORE,   CT_STEEL,   CT_VALUABLES,    CT_PAPER,     CT_FOOD,      CT_FRUIT,  CT_COPPER_ORE, CT_WATER,        /*  8-15 */
-	CT_RUBBER,     CT_SUGAR,   CT_TOYS,         CT_BATTERIES, CT_CANDY,     CT_TOFFEE, CT_COLA,       CT_COTTON_CANDY, /* 16-23 */
-	CT_BUBBLES,    CT_PLASTIC, CT_FIZZY_DRINKS, CT_PAPER      /* unsup. */, CT_HILLY_UNUSED,                           /* 24-28 */
-	CT_INVALID,    CT_INVALID                                                                                          /* 29-30 */
-};
-
-/** Bitmasked value where the global cargo ID is available in landscape
- * 0: LT_NORMAL, 1: LT_HILLY, 2: LT_DESERT, 3: LT_CANDY */
-#define MC(cargo) (1 << cargo)
-const uint32 _landscape_global_cargo_mask[NUM_LANDSCAPE] =
-{ /* LT_NORMAL: temperate */
-	MC(GC_PASSENGERS) | MC(GC_COAL) | MC(GC_MAIL)  | MC(GC_OIL)   | MC(GC_LIVESTOCK) | MC(GC_GOODS) | MC(GC_GRAIN)     | MC(GC_WOOD) | MC(GC_IRON_ORE)     | MC(GC_STEEL)      | MC(GC_VALUABLES),
-	/* LT_HILLY: arctic */
-	MC(GC_PASSENGERS) | MC(GC_COAL) | MC(GC_MAIL)  | MC(GC_OIL)   | MC(GC_LIVESTOCK) | MC(GC_GOODS) | MC(GC_GRAIN)     | MC(GC_WOOD) | MC(GC_VALUABLES)    | MC(GC_PAPER)      | MC(GC_FOOD),
-	/* LT_DESERT: rainforest/desert */
-	MC(GC_PASSENGERS) | MC(GC_MAIL) | MC(GC_OIL)   | MC(GC_GOODS) | MC(GC_GRAIN)     | MC(GC_WOOD)  | MC(GC_VALUABLES) | MC(GC_FOOD) | MC(GC_FRUIT)        | MC(GC_COPPER_ORE) | MC(GC_WATER)   | MC(GC_RUBBER),
-	/* LT_CANDY: toyland */
-	MC(GC_PASSENGERS) | MC(GC_MAIL) | MC(GC_SUGAR) | MC(GC_TOYS)  | MC(GC_BATTERIES) | MC(GC_CANDY) | MC(GC_TOFFEE)    | MC(GC_COLA) | MC(GC_COTTON_CANDY) | MC(GC_BUBBLES)    | MC(GC_PLASTIC) | MC(GC_FIZZY_DRINKS)
-};
-/** END   --- TRANSLATE FROM GLOBAL CARGO TO LOCAL CARGO ID'S **/
-
-/**
- * Bitmask of classes for cargo types.
- */
-const uint32 cargo_classes[16] = {
-	/* Passengers */ MC(GC_PASSENGERS),
-	/* Mail       */ MC(GC_MAIL),
-	/* Express    */ MC(GC_GOODS)     | MC(GC_FOOD)  | MC(GC_CANDY),
-	/* Armoured   */ MC(GC_VALUABLES),
-	/* Bulk       */ MC(GC_COAL)      | MC(GC_GRAIN) | MC(GC_IRON_ORE) | MC(GC_COPPER_ORE) | MC(GC_FRUIT)   | MC(GC_SUGAR)     | MC(GC_TOFFEE)  | MC(GC_COTTON_CANDY),
-	/* Piece      */ MC(GC_LIVESTOCK) | MC(GC_WOOD)  | MC(GC_STEEL)    | MC(GC_PAPER)      | MC(GC_TOYS)    | MC(GC_BATTERIES) | MC(GC_BUBBLES) | MC(GC_FIZZY_DRINKS),
-	/* Liquids    */ MC(GC_OIL)       | MC(GC_WATER) | MC(GC_RUBBER)   | MC(GC_COLA)       | MC(GC_PLASTIC),
-	/* Chilled    */ MC(GC_FOOD)      | MC(GC_FRUIT),
-	/* Undefined  */ 0, 0, 0, 0, 0, 0, 0, 0
-};
-#undef MC
-
-/**
- *there are 32 slots available per climate with newcargo.*/
-#define MAXSLOTS 32
--- a/src/newgrf_cargo.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_cargo.h	Wed Feb 28 00:33:40 2007 +0000
@@ -15,46 +15,8 @@
 	CC_REFRIGERATED = 1 << 7,
 };
 
-enum GlobalCargo {
-	GC_PASSENGERS   =   0,
-	GC_COAL         =   1,
-	GC_MAIL         =   2,
-	GC_OIL          =   3,
-	GC_LIVESTOCK    =   4,
-	GC_GOODS        =   5,
-	GC_GRAIN        =   6, // GC_WHEAT / GC_MAIZE
-	GC_WOOD         =   7,
-	GC_IRON_ORE     =   8,
-	GC_STEEL        =   9,
-	GC_VALUABLES    =  10, // GC_GOLD / GC_DIAMONDS
-	GC_PAPER        =  11,
-	GC_FOOD         =  12,
-	GC_FRUIT        =  13,
-	GC_COPPER_ORE   =  14,
-	GC_WATER        =  15,
-	GC_RUBBER       =  16,
-	GC_SUGAR        =  17,
-	GC_TOYS         =  18,
-	GC_BATTERIES    =  19,
-	GC_CANDY        =  20,
-	GC_TOFFEE       =  21,
-	GC_COLA         =  22,
-	GC_COTTON_CANDY =  23,
-	GC_BUBBLES      =  24,
-	GC_PLASTIC      =  25,
-	GC_FIZZY_DRINKS =  26,
-	GC_PAPER_TEMP   =  27,
-	GC_UNDEFINED    =  28, // undefined; unused slot in arctic climate
-	GC_DEFAULT      =  29,
-	GC_PURCHASE     =  30,
-	GC_DEFAULT_NA   =  31, // New stations only
-	GC_INVALID      = 255,
-	NUM_GLOBAL_CID  =  32
-};
-
-extern const CargoID _global_cargo_id[NUM_LANDSCAPE][NUM_CARGO];
-extern const uint32 _landscape_global_cargo_mask[NUM_LANDSCAPE];
-extern const CargoID _local_cargo_id_ctype[NUM_GLOBAL_CID];
-extern const uint32 cargo_classes[16];
+static const CargoID CT_DEFAULT      = NUM_CARGO + 0;
+static const CargoID CT_PURCHASE     = NUM_CARGO + 1;
+static const CargoID CT_DEFAULT_NA   = NUM_CARGO + 2;
 
 #endif /* NEWGRF_CARGO_H */
--- a/src/newgrf_config.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_config.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -16,14 +16,10 @@
 
 #include "fileio.h"
 #include "fios.h"
-#include <sys/types.h>
 #include <sys/stat.h>
 
 #ifdef WIN32
 # include <io.h>
-#else
-# include <unistd.h>
-# include <dirent.h>
 #endif /* WIN32 */
 
 
@@ -95,6 +91,7 @@
 		free((*config)->filename);
 		free((*config)->name);
 		free((*config)->info);
+		free((*config)->error);
 	}
 	free(*config);
 	*config = NULL;
@@ -115,7 +112,7 @@
 
 /** Copy a GRF Config list
  * @param dst pointer to destination list
- * @param srt pointer to source list values
+ * @param src pointer to source list values
  * @return pointer to the last value added to the destination list */
 GRFConfig **CopyGRFConfigList(GRFConfig **dst, const GRFConfig *src)
 {
@@ -127,6 +124,10 @@
 		if (src->filename != NULL) c->filename = strdup(src->filename);
 		if (src->name     != NULL) c->name     = strdup(src->name);
 		if (src->info     != NULL) c->info     = strdup(src->info);
+		if (src->error    != NULL) {
+			c->error = CallocT<GRFError>(1);
+			memcpy(c->error, src->error, sizeof(GRFError));
+		}
 
 		*dst = c;
 		dst = &c->next;
@@ -179,6 +180,17 @@
 	RemoveDuplicatesFromGRFConfigList(*dst);
 }
 
+/** Appends an element to a list of GRFs
+ * @param dst the head of the list to add to */
+void AppendToGRFConfigList(GRFConfig **dst, GRFConfig *el)
+{
+	GRFConfig **tail = dst;
+	while (*tail != NULL) tail = &(*tail)->next;
+	*tail = el;
+
+	RemoveDuplicatesFromGRFConfigList(*dst);
+}
+
 
 /* Reset the current GRF Config to either blank or newgame settings */
 void ResetGRFConfig(bool defaults)
@@ -245,6 +257,7 @@
 				memcpy(c->md5sum, f->md5sum, sizeof(c->md5sum));
 				if (c->name == NULL) c->name = strdup(f->name);
 				if (c->info == NULL) c->info = strdup(f->info);
+				c->error = NULL;
 			}
 		}
 	}
@@ -263,7 +276,7 @@
 	struct dirent *dirent;
 	DIR *dir;
 
-	if ((dir = opendir(path)) == NULL) return 0;
+	if ((dir = ttd_opendir(path)) == NULL) return 0;
 
 	while ((dirent = readdir(dir)) != NULL) {
 		const char *d_name = FS2OTTD(dirent->d_name);
@@ -441,10 +454,9 @@
 
 static void Save_NGRF(void)
 {
-	GRFConfig *c;
 	int index = 0;
 
-	for (c = _grfconfig; c != NULL; c = c->next) {
+	for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
 		if (HASBIT(c->flags, GCF_STATIC)) continue;
 		SlSetArrayIndex(index++);
 		SlObject(c, _grfconfig_desc);
@@ -454,23 +466,14 @@
 
 static void Load_NGRF(void)
 {
-	GRFConfig *first = NULL;
-	GRFConfig **last = &first;
-
+	ClearGRFConfigList(&_grfconfig);
 	while (SlIterateArray() != -1) {
 		GRFConfig *c = CallocT<GRFConfig>(1);
 		SlObject(c, _grfconfig_desc);
-
-		/* Append our configuration to the list */
-		*last = c;
-		last = &c->next;
+		AppendToGRFConfigList(&_grfconfig, c);
 	}
 
 	/* Append static NewGRF configuration */
-	CopyGRFConfigList(last, _grfconfig_static);
-
-	ClearGRFConfigList(&_grfconfig);
-	_grfconfig = first;
 	AppendStaticGRFConfigs(&_grfconfig);
 }
 
--- a/src/newgrf_config.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_config.h	Wed Feb 28 00:33:40 2007 +0000
@@ -3,6 +3,8 @@
 #ifndef NEWGRF_CONFIG_H
 #define NEWGRF_CONFIG_H
 
+#include "openttd.h"
+
 /* GRF config bit flags */
 typedef enum {
 	GCF_DISABLED,  ///< GRF file is disabled
@@ -20,10 +22,19 @@
 	uint8 md5sum[16];
 } GRF;
 
+typedef struct GRFError {
+	StringID message;
+	StringID data;
+	StringID severity;
+	uint8 num_params;
+	uint8 param_number[2];
+} GRFError;
+
 typedef struct GRFConfig : public GRFIdentifier {
 	char *filename;
 	char *name;
 	char *info;
+	GRFError *error;
 
 	uint8 flags;
 	uint32 param[0x80];
@@ -49,6 +60,7 @@
 GRFConfig *GetGRFConfig(uint32 grfid);
 GRFConfig **CopyGRFConfigList(GRFConfig **dst, const GRFConfig *src);
 void AppendStaticGRFConfigs(GRFConfig **dst);
+void AppendToGRFConfigList(GRFConfig **dst, GRFConfig *el);
 void ClearGRFConfig(GRFConfig **config);
 void ClearGRFConfigList(GRFConfig **config);
 void ResetGRFConfig(bool defaults);
--- a/src/newgrf_engine.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_engine.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -18,43 +18,8 @@
 #include "newgrf_cargo.h"
 #include "date.h"
 #include "helpers.hpp"
-
-
+#include "cargotype.h"
 
-/* Default cargo classes */
-static const uint16 _cargo_classes[NUM_GLOBAL_CID] = {
-	CC_PASSENGERS,
-	CC_BULK,
-	CC_MAIL,
-	CC_LIQUID,
-	CC_PIECE_GOODS,
-	CC_EXPRESS,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_ARMOURED,
-	CC_PIECE_GOODS,
-	CC_REFRIGERATED | CC_EXPRESS,
-	CC_REFRIGERATED | CC_EXPRESS,
-	CC_BULK,
-	CC_LIQUID,
-	CC_LIQUID,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_PIECE_GOODS,
-	CC_EXPRESS,
-	CC_BULK,
-	CC_LIQUID,
-	CC_BULK,
-	CC_PIECE_GOODS,
-	CC_LIQUID,
-	CC_PIECE_GOODS,
-	CC_PIECE_GOODS,
-	CC_NOAVAILABLE,
-	CC_NOAVAILABLE,
-	CC_NOAVAILABLE,
-};
 
 int _traininfo_vehicle_pitch = 0;
 int _traininfo_vehicle_width = 29;
@@ -79,7 +44,7 @@
 	WagonOverride *wo;
 
 	assert(engine < TOTAL_NUM_ENGINES);
-	assert(cargo < NUM_GLOBAL_CID);
+	assert(cargo < NUM_CARGO + 1); // Include CT_DEFAULT pseudo cargo. CT_PURCHASE does not apply to overrides.
 
 	wos = &_engine_wagon_overrides[engine];
 	wos->overrides_count++;
@@ -111,7 +76,7 @@
 		int j;
 
 		for (j = 0; j < wo->trains; j++) {
-			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == GC_DEFAULT)) return wo->group;
+			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == CT_DEFAULT)) return wo->group;
 		}
 	}
 	return NULL;
@@ -140,22 +105,19 @@
 	}
 }
 
-// 0 - 28 are cargos, 29 is default, 30 is the advert (purchase list)
-// (It isn't and shouldn't be like this in the GRF files since new cargo types
-// may appear in future - however it's more convenient to store it like this in
-// memory. --pasky)
-static const SpriteGroup *engine_custom_sprites[TOTAL_NUM_ENGINES][NUM_GLOBAL_CID];
+/* Space for NUM_CARGO real cargos and 2 pseudo cargos, CT_DEFAULT and CT_PURCHASE */
+static const SpriteGroup *_engine_custom_sprites[TOTAL_NUM_ENGINES][NUM_CARGO + 2];
 static const GRFFile *_engine_grf[TOTAL_NUM_ENGINES];
 
 void SetCustomEngineSprites(EngineID engine, byte cargo, const SpriteGroup *group)
 {
-	assert(engine < TOTAL_NUM_ENGINES);
-	assert(cargo < NUM_GLOBAL_CID);
+	assert(engine < lengthof(_engine_custom_sprites));
+	assert(cargo < lengthof(*_engine_custom_sprites));
 
-	if (engine_custom_sprites[engine][cargo] != NULL) {
+	if (_engine_custom_sprites[engine][cargo] != NULL) {
 		grfmsg(6, "SetCustomEngineSprites: engine %d cargo %d already has group -- replacing", engine, cargo);
 	}
-	engine_custom_sprites[engine][cargo] = group;
+	_engine_custom_sprites[engine][cargo] = group;
 }
 
 /**
@@ -163,15 +125,8 @@
  */
 void UnloadCustomEngineSprites(void)
 {
-	EngineID engine;
-	CargoID cargo;
-
-	for (engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
-		for (cargo = 0; cargo < NUM_GLOBAL_CID; cargo++) {
-			engine_custom_sprites[engine][cargo] = NULL;
-		}
-		_engine_grf[engine] = 0;
-	}
+	memset(_engine_custom_sprites, 0, sizeof(_engine_custom_sprites));
+	memset(_engine_grf, 0, sizeof(_engine_grf));
 }
 
 static const SpriteGroup *heli_rotor_custom_sprites[NUM_AIRCRAFT_ENGINES];
@@ -574,10 +529,9 @@
 			const Vehicle *u;
 			byte cargo_classes = 0;
 			uint common_cargo_best = 0;
-			uint common_cargos[NUM_GLOBAL_CID];
+			uint common_cargos[NUM_CARGO];
 			byte user_def_data = 0;
-			CargoID cargo;
-			CargoID common_cargo_type = GC_PASSENGERS;
+			CargoID common_cargo_type = CT_PASSENGERS;
 
 			/* Reset our arrays */
 			memset(common_cargos, 0, sizeof(common_cargos));
@@ -585,18 +539,17 @@
 			for (u = v; u != NULL; u = u->next) {
 				/* Skip empty engines */
 				if (u->cargo_cap == 0) continue;
-				/* Map from climate to global cargo ID */
-				cargo = _global_cargo_id[_opt.landscape][u->cargo_type];
-				cargo_classes |= _cargo_classes[cargo];
-				common_cargos[cargo]++;
+
+				cargo_classes |= GetCargo(u->cargo_type)->classes;
+				common_cargos[u->cargo_type]++;
 				user_def_data |= RailVehInfo(u->engine_type)->user_def_data;
 			}
 
 			/* Pick the most common cargo type */
-			for (cargo = 0; cargo < NUM_GLOBAL_CID; cargo++) {
+			for (CargoID cargo = 0; cargo < NUM_CARGO; cargo++) {
 				if (common_cargos[cargo] > common_cargo_best) {
 					common_cargo_best = common_cargos[cargo];
-					common_cargo_type = cargo;
+					common_cargo_type = GetCargo(cargo)->bitnum;
 				}
 			}
 
@@ -643,9 +596,9 @@
 			 * ww - cargo unit weight in 1/16 tons, same as cargo prop. 0F.
 			 * cccc - the cargo class value of the cargo transported by the vehicle.
 			 */
-			CargoID cid = _global_cargo_id[_opt.landscape][v->cargo_type];
+			const CargoSpec *cs = GetCargo(v->cargo_type);
 
-			return (_cargo_classes[cid] << 16) | (_cargoc.weights[v->cargo_type] << 8) | cid;
+			return (cs->classes << 16) | (cs->weight << 8) | GetEngineGRF(v->engine_type)->cargo_map[v->cargo_type];
 		}
 
 		case 0x48: return GetVehicleTypeInfo(v->engine_type); /* Vehicle Type Info */
@@ -855,10 +808,9 @@
 	CargoID cargo;
 
 	if (v == NULL) {
-		cargo = GC_PURCHASE;
+		cargo = CT_PURCHASE;
 	} else {
-		cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
-		assert(cargo != GC_INVALID);
+		cargo = v->cargo_type;
 
 		if (v->type == VEH_Train) {
 			group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
@@ -867,11 +819,11 @@
 		}
 	}
 
-	group = engine_custom_sprites[engine][cargo];
+	group = _engine_custom_sprites[engine][cargo];
 	if (group != NULL) return group;
 
 	/* Fall back to the default set if the selected cargo type is not defined */
-	return engine_custom_sprites[engine][GC_DEFAULT];
+	return _engine_custom_sprites[engine][CT_DEFAULT];
 }
 
 
@@ -923,7 +875,7 @@
 bool UsesWagonOverride(const Vehicle* v)
 {
 	assert(v->type == VEH_Train);
-	return GetWagonOverrideSpriteSet(v->engine_type, _global_cargo_id[_opt.landscape][v->cargo_type], v->u.rail.first_engine) != NULL;
+	return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL;
 }
 
 /**
--- a/src/newgrf_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -11,6 +11,7 @@
 #include "table/sprites.h"
 #include "newgrf.h"
 #include "newgrf_config.h"
+#include "strings.h"
 #include "helpers.hpp"
 
 
@@ -43,6 +44,25 @@
 {
 	char buff[256];
 
+	if (c->error != NULL) {
+		SetDParamStr(0, c->filename);
+		SetDParam(1, c->error->data);
+		for (uint i = 0; i < c->error->num_params; i++) {
+			uint32 param = 0;
+			byte param_number = c->error->param_number[i];
+
+			if (param_number < c->num_params) param = c->param[param_number];
+
+			SetDParam(2 + i, param);
+		}
+
+		char message[512];
+		GetString(message, c->error->message, lastof(message));
+
+		SetDParamStr(0, message);
+		y += DrawStringMultiLine(x, y, c->error->severity, w);
+	}
+
 	/* Draw filename or not if it is not known (GRF sent over internet) */
 	if (c->filename != NULL) {
 		SetDParamStr(0, c->filename);
@@ -328,7 +348,8 @@
 					}
 
 					DrawSprite(SPR_SQUARE, pal, 5, y + 2);
-					DoDrawString(text, 25, y + 3, WP(w, newgrf_d).sel == c ? 0xC : 0x10);
+					if (c->error != NULL) DrawSprite(SPR_WARNING_SIGN, 0, 20, y + 2);
+					DoDrawString(text, c->error != NULL ? 35 : 25, y + 3, WP(w, newgrf_d).sel == c ? 0xC : 0x10);
 					y += 14;
 				}
 			}
--- a/src/newgrf_sound.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_sound.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -37,7 +37,7 @@
 
 FileEntry *GetSound(uint index)
 {
-	if (index >= _sound_count) return NULL;
+	if (index >= GetNumSounds()) return NULL;
 	return GetSoundInternal(index);
 }
 
--- a/src/newgrf_station.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_station.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file newgrf_station.c Functions for dealing with station classes and custom stations. */
+/** @file newgrf_station.cpp Functions for dealing with station classes and custom stations. */
 
 #include "stdafx.h"
 #include "openttd.h"
@@ -18,6 +18,7 @@
 #include "newgrf_spritegroup.h"
 #include "date.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 static StationClass station_classes[STAT_CLASS_MAX];
 
@@ -200,8 +201,8 @@
 	uint32 retval = 0;
 
 	if (axis == AXIS_X) {
-		intswap(platforms, length);
-		intswap(x, y);
+		Swap(platforms, length);
+		Swap(x, y);
 	}
 
 	/* Limit our sizes to 4 bits */
@@ -446,20 +447,20 @@
 	}
 
 	switch (cargo_type) {
-		case GC_INVALID:
-		case GC_DEFAULT_NA:
-		case GC_PURCHASE:
+		case CT_INVALID:
+		case CT_DEFAULT_NA:
+		case CT_PURCHASE:
 			cargo = 0;
 			break;
 
-		case GC_DEFAULT:
+		case CT_DEFAULT:
 			for (cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) {
 				cargo += GB(st->goods[cargo_type].waiting_acceptance, 0, 12);
 			}
 			break;
 
 		default:
-			cargo = GB(st->goods[_local_cargo_id_ctype[cargo_type]].waiting_acceptance, 0, 12);
+			cargo = GB(st->goods[cargo_type].waiting_acceptance, 0, 12);
 			break;
 	}
 
@@ -505,20 +506,17 @@
 static const SpriteGroup *ResolveStation(ResolverObject *object)
 {
 	const SpriteGroup *group;
-	CargoID ctype = GC_DEFAULT_NA;
+	CargoID ctype = CT_DEFAULT_NA;
 
 	if (object->u.station.st == NULL) {
 		/* No station, so we are in a purchase list */
-		ctype = GC_PURCHASE;
+		ctype = CT_PURCHASE;
 	} else {
-		CargoID cargo;
-
 		/* Pick the first cargo that we have waiting */
-		for (cargo = 0; cargo < NUM_GLOBAL_CID; cargo++) {
-			CargoID lcid = _local_cargo_id_ctype[cargo];
-			if (lcid != CT_INVALID &&
-					object->u.station.statspec->spritegroup[cargo] != NULL &&
-					GB(object->u.station.st->goods[lcid].waiting_acceptance, 0, 12) != 0) {
+		for (CargoID cargo = 0; cargo < NUM_CARGO; cargo++) {
+			const CargoSpec *cs = GetCargo(cargo);
+			if (cs->IsValid() && object->u.station.statspec->spritegroup[cargo] != NULL &&
+					GB(object->u.station.st->goods[cargo].waiting_acceptance, 0, 12) != 0) {
 				ctype = cargo;
 				break;
 			}
@@ -527,7 +525,7 @@
 
 	group = object->u.station.statspec->spritegroup[ctype];
 	if (group == NULL) {
-		ctype = GC_DEFAULT;
+		ctype = CT_DEFAULT;
 		group = object->u.station.statspec->spritegroup[ctype];
 	}
 
--- a/src/newgrf_station.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/newgrf_station.h	Wed Feb 28 00:33:40 2007 +0000
@@ -79,11 +79,11 @@
 	bool copied_layouts;
 
 	/**
-	 * NUM_GLOBAL_CID sprite groups.
+	 * NUM_CARGO real cargo plus three pseudo cargo sprite groups.
 	 * Used for obtaining the sprite offset of custom sprites, and for
 	 * evaluating callbacks.
 	 */
-	const struct SpriteGroup *spritegroup[NUM_GLOBAL_CID];
+	const struct SpriteGroup *spritegroup[NUM_CARGO + 3];
 } StationSpec;
 
 /**
--- a/src/npf.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/npf.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -594,7 +594,7 @@
 
 	/* check correct rail type (mono, maglev, etc) */
 	if (type == TRANSPORT_RAIL) {
-		RailType dst_type = GetTileRailType(dst_tile, TrackdirToTrack(src_trackdir));
+		RailType dst_type = GetTileRailType(dst_tile);
 		if (!HASBIT(aystar->user_data[NPF_RAILTYPES], dst_type))
 			return;
 	}
--- a/src/oldloader.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/oldloader.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -372,6 +372,7 @@
 static uint32 _old_town_index;
 static uint16 _old_string_id;
 static uint16 _old_string_id_2;
+static uint16 _old_extra_chunk_nums;
 
 static void ReadTTDPatchFlags(void)
 {
@@ -397,6 +398,8 @@
 	/* Check if we have a modern TTDPatch savegame (has extra data all around) */
 	_new_ttdpatch_format = (memcmp(&_old_map3[0x1FFFA], "TTDp", 4) == 0);
 
+	_old_extra_chunk_nums = _old_map3[_new_ttdpatch_format ? 0x1FFFE : 0x2];
+
 	/* Clean the misused places */
 	for (i = 0;       i < 17;      i++) _old_map3[i] = 0;
 	for (i = 0x1FE00; i < 0x20000; i++) _old_map3[i] = 0;
@@ -1345,6 +1348,60 @@
 	return !ls->failed;
 }
 
+static bool LoadTTDPatchExtraChunks(LoadgameState *ls, int num)
+{
+	ReadTTDPatchFlags();
+
+	DEBUG(oldloader, 2, "Found %d extra chunk(s)", _old_extra_chunk_nums);
+
+	for (int i = 0; i != _old_extra_chunk_nums; i++) {
+		uint16 id = ReadUint16(ls);
+		uint32 len = ReadUint32(ls);
+
+		switch (id) {
+			/* List of GRFIDs, used in the savegame. 0x8004 is the new ID
+			 * They are saved in a 'GRFID:4 active:1' format, 5 bytes for each entry */
+			case 0x2:
+			case 0x8004: {
+				/* Skip the first element: TTDP hack for the Action D special variables (FFFF0000 01) */
+				ReadUint32(ls); ReadByte(ls); len -= 5;
+
+				ClearGRFConfigList(&_grfconfig);
+				while (len != 0) {
+					uint32 grfid = ReadUint32(ls);
+
+					if (ReadByte(ls) == 1) {
+						GRFConfig *c = CallocT<GRFConfig>(1);
+						c->grfid = grfid;
+						c->filename = strdup("TTDP game, no information");
+
+						AppendToGRFConfigList(&_grfconfig, c);
+						DEBUG(oldloader, 3, "TTDPatch game using GRF file with GRFID %0X", BSWAP32(c->grfid));
+					}
+					len -= 5;
+				};
+
+				/* Append static NewGRF configuration */
+				AppendStaticGRFConfigs(&_grfconfig);
+			} break;
+
+			case 0x3: { /* TTDPatch version and configuration */
+				uint32 ttdpv = ReadUint32(ls);
+				DEBUG(oldloader, 3, "Game saved with TTDPatch version %d.%d.%d r%d", GB(ttdpv, 24, 8), GB(ttdpv, 20, 4), GB(ttdpv, 16, 4), GB(ttdpv, 0, 16));
+				len -= 4;
+				while (len-- != 0) ReadByte(ls); // skip the configuration
+			} break;
+
+			default:
+				DEBUG(oldloader, 4, "Skipping unknown extra chunk %X", id);
+				while (len-- != 0) ReadByte(ls);
+				break;
+		}
+	}
+
+	return !ls->failed;
+}
+
 static uint32 _old_cur_town_ctr;
 static const OldChunks main_chunk[] = {
 	OCL_ASSERT( 0 ),
@@ -1458,6 +1515,7 @@
 	OCL_ASSERT( 0x97179 ),
 
 	/* Below any (if available) extra chunks from TTDPatch can follow */
+	OCL_CHUNK(1, LoadTTDPatchExtraChunks),
 
 	OCL_END()
 };
--- a/src/openttd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/openttd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1288,20 +1288,23 @@
 	DoZoomInOutWindow(ZOOM_NONE, w); // update button status
 	MarkWholeScreenDirty();
 
-	/* From this version on there can be multiple road stops of the same type per
-	 * station. Convert the existing stops to the new internal data structure.
-	 */
 	for (TileIndex t = 0; t < map_size; t++) {
 		switch (GetTileType(t)) {
-			case MP_STATION:
+			case MP_STATION: {
+				Station *st = GetStationByTile(t);
+
+				st->rect.BeforeAddTile(t, StationRect::ADD_FORCE);
+
 				switch (GetStationType(t)) {
 					case STATION_TRUCK:
 					case STATION_BUS:
 						if (CheckSavegameVersion(6)) {
+							/* From this version on there can be multiple road stops of the
+							 * same type per station. Convert the existing stops to the new
+							 * internal data structure. */
 							RoadStop *rs = new RoadStop(t);
 							if (rs == NULL) error("Too many road stops in savegame");
 
-							Station *st = GetStationByTile(t);
 							RoadStop **head =
 								IsTruckStop(t) ? &st->truck_stops : &st->bus_stops;
 							*head = rs;
@@ -1330,6 +1333,7 @@
 					default: break;
 				}
 				break;
+			}
 
 			default: break;
 		}
--- a/src/order_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/order_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -167,6 +167,16 @@
 }
 
 
+static TileIndex GetOrderLocation(const Order& o)
+{
+	switch (o.type) {
+		default: NOT_REACHED();
+		case OT_GOTO_STATION: return GetStation(o.dest)->xy;
+		case OT_GOTO_DEPOT:   return GetDepot(o.dest)->xy;
+	}
+}
+
+
 /** Add an order to the orderlist of a vehicle.
  * @param tile unused
  * @param p1 various bitstuffed elements
@@ -198,7 +208,7 @@
 			if (!IsValidStationID(new_order.dest)) return CMD_ERROR;
 			st = GetStation(new_order.dest);
 
-			if (st->airport_type != AT_OILRIG && !st->IsBuoy() && !CheckOwnership(st->owner)) {
+			if (st->owner != OWNER_NONE && !CheckOwnership(st->owner)) {
 				return CMD_ERROR;
 			}
 
@@ -343,18 +353,29 @@
 	 * handle any more then this.. */
 	if (v->num_orders >= MAX_BACKUP_ORDER_COUNT) return_cmd_error(STR_8832_TOO_MANY_ORDERS);
 
-	/* For ships, make sure that the station is not too far away from the
-	 * previous destination, for human players with new pathfinding disabled */
-	if (v->type == VEH_Ship && IsHumanPlayer(v->owner) &&
-		sel_ord != 0 && GetVehicleOrder(v, sel_ord - 1)->type == OT_GOTO_STATION
-		&& !_patches.new_pathfinding_all) {
+	if (v->type == VEH_Ship &&
+			IsHumanPlayer(v->owner) &&
+			!_patches.new_pathfinding_all) {
+		// Make sure the new destination is not too far away from the previous
+		const Order *prev = NULL;
+		uint n = 0;
 
-		int dist = DistanceManhattan(
-			GetStation(GetVehicleOrder(v, sel_ord - 1)->dest)->xy,
-			GetStation(new_order.dest)->xy // XXX type != OT_GOTO_STATION?
-		);
-		if (dist >= 130)
-			return_cmd_error(STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO);
+		/* Find the last goto station or depot order before the insert location.
+		 * If the order is to be inserted at the beginning of the order list this
+		 * finds the last order in the list. */
+		for (const Order *o = v->orders; o != NULL; o = o->next) {
+			if (o->type == OT_GOTO_STATION || o->type == OT_GOTO_DEPOT) prev = o;
+			if (++n == sel_ord && prev != NULL) break;
+		}
+		if (prev != NULL) {
+			uint dist = DistanceManhattan(
+				GetOrderLocation(*prev),
+				GetOrderLocation(new_order)
+			);
+			if (dist >= 130) {
+				return_cmd_error(STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO);
+			}
+		}
 	}
 
 	if (flags & DC_EXEC) {
--- a/src/order_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/order_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -22,6 +22,7 @@
 #include "train.h"
 #include "water_map.h"
 #include "vehicle_gui.h"
+#include "cargotype.h"
 
 enum OrderWindowWidgets {
 	ORDER_WIDGET_CLOSEBOX = 0,
@@ -180,7 +181,7 @@
 					SetDParam(1, s);
 					if (order->refit_cargo < NUM_CARGO) {
 						SetDParam(3, STR_REFIT_ORDER);
-						SetDParam(4, _cargoc.names_s[order->refit_cargo]);
+						SetDParam(4, GetCargo(order->refit_cargo)->name);
 					} else {
 						SetDParam(3, STR_EMPTY);
 					}
--- a/src/players.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/players.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,7 +1,6 @@
 /* $Id$ */
 
-/** @file players.c
- * @todo Cleanup the messy DrawPlayerFace function asap
+/** @file players.cpp
  */
 #include "stdafx.h"
 #include "openttd.h"
@@ -65,161 +64,151 @@
 	DrawSprite(SPR_PLAYER_ICON, PLAYER_SPRITE_COLOR(p), x, y);
 }
 
+/** The gender/race combinations that we have faces for */
+enum GenderRace {
+	GENDER_FEMALE = 0,                                    ///< This bit set means a female, otherwise male
+	RACE_BLACK    = 1,                                    ///< This bit set means black, otherwise white
 
-static const SpriteID cheeks_table[4] = {
-	0x325, 0x326,
-	0x390, 0x3B0,
+	WHITE_MALE    = 0,                                    ///< A male of Caucasian origin
+	WHITE_FEMALE  = 1 << GENDER_FEMALE,                   ///< A female of Caucasian origin
+	BLACK_MALE    = 1 << RACE_BLACK,                      ///< A male of African origin
+	BLACK_FEMALE  = 1 << RACE_BLACK | 1 << GENDER_FEMALE, ///< A female of African origin
 };
+DECLARE_ENUM_AS_BIT_SET(GenderRace); ///< See GenderRace as a bitset
 
-static const SpriteID mouth_table[3] = {
-	0x34C, 0x34D, 0x34F
-};
-
+/**
+ * Draws the face of a player.
+ *
+ * Meaning of the bits in face (some bits are used in several times):
+ * - 4 and 5: chin
+ * - 6 to 9: eyebrows
+ * - 10 to 13: nose
+ * - 13 to 15: lips (also moustache for males)
+ * - 16 to 19: hair
+ * - 20 to 22: eye color
+ * - 20 to 27: tie, ear rings etc.
+ * - 28 to 30: glasses
+ * - 19, 26 and 27: race (bit 27 set and bit 19 equal to bit 26 = black, otherwise white)
+ * - 31: gender (0 = male, 1 = female)
+ *
+ * @param face  the bit-encoded representation of the face
+ * @param color the (background) color of the gradient
+ * @param x     x-position to draw the face
+ * @param y     y-position to draw the face
+ *
+ * @note all magic hexadecimal numbers in this function as sprite IDs.
+ * @todo replace magic hexadecimal numbers with enums
+ */
 void DrawPlayerFace(uint32 face, int color, int x, int y)
 {
-	byte flag = 0;
+	GenderRace gen_race = WHITE_MALE;
 
-	if ( (int32)face < 0)
-		flag |= 1;
-	if ((((((face >> 7) ^ face) >> 7) ^ face) & 0x8080000) == 0x8000000)
-		flag |= 2;
+	if (HASBIT(face, 31)) SetBitT(gen_race, GENDER_FEMALE);
+	if (HASBIT(face, 27) && (HASBIT(face, 26) == HASBIT(face, 19))) SetBitT(gen_race, RACE_BLACK);
 
-	/* draw the gradient */
+	/* Draw the gradient (background) */
 	DrawSprite(SPR_GRADIENT, GENERAL_SPRITE_COLOR(color), x, y);
 
-	/* draw the cheeks */
-	DrawSprite(cheeks_table[flag&3], PAL_NONE, x, y);
-
-	/* draw the chin */
-	/* FIXME: real code uses -2 in zoomlevel 1 */
-	{
-		uint val = GB(face, 4, 2);
-		if (!(flag & 2)) {
-			DrawSprite(0x327 + (flag&1?0:val), PAL_NONE, x, y);
-		} else {
-			DrawSprite((flag&1?0x3B1:0x391) + (val>>1), PAL_NONE, x, y);
-		}
-	}
-	/* draw the eyes */
-	{
-		uint val1 = GB(face,  6, 4);
-		uint val2 = GB(face, 20, 3);
-		SpriteID pal;
+	/* Draw the cheeks */
+	static const SpriteID cheeks_table[] = { 0x325, 0x326, 0x390, 0x3B0 };
+	DrawSprite(cheeks_table[gen_race], PAL_NONE, x, y);
 
-		if (val2 < 6) {
-			pal = PALETTE_TO_BROWN;
-		} else if (val2 == 6) {
-			pal = PALETTE_TO_BLUE;
-		} else {
-			pal = PALETTE_TO_GREEN;
-		}
-
-		if (!(flag & 2)) {
-			if (!(flag & 1)) {
-				DrawSprite(0x32B + (val1 * 12 >> 4), pal, x, y);
-			} else {
-				DrawSprite(0x337 + val1, pal, x, y);
-			}
-		} else {
-			if (!(flag & 1)) {
-				DrawSprite(0x39A + (val1 * 11 >> 4), pal, x, y);
-			} else {
-				DrawSprite(0x3B8 + val1, pal, x, y);
-			}
-		}
+	/* Draw the chin */
+	uint chin = GB(face, 4, 2);
+	if (HASBIT(gen_race, RACE_BLACK)) {
+		DrawSprite((HASBIT(gen_race, GENDER_FEMALE) ? 0x3B1 : 0x391) + (chin >> 1), PAL_NONE, x, y);
+	} else {
+		DrawSprite(0x327 + (HASBIT(gen_race, GENDER_FEMALE) ? 0 : chin), PAL_NONE, x, y);
 	}
 
-	/* draw the mouth */
-	{
-		uint val = GB(face, 10, 6);
-		uint val2;
-
-		if (!(flag&1)) {
-			val2 = ((val&0xF) * 15 >> 4);
+	/* Draw the eyes */
+	uint eye_colour = GB(face, 20, 3);
+	uint eyebrows   = GB(face,  6, 4);
+	SpriteID pal;
 
-			if (val2 < 3) {
-				DrawSprite((flag&2 ? 0x397 : 0x367) + val2, PAL_NONE, x, y);
-				/* skip the rest */
-				goto skip_mouth;
-			}
+	if (eye_colour < 6) {
+		pal = PALETTE_TO_BROWN;
+	} else if (eye_colour == 6) {
+		pal = PALETTE_TO_BLUE;
+	} else {
+		pal = PALETTE_TO_GREEN;
+	}
 
-			val2 -= 3;
-			if (flag & 2) {
-				if (val2 > 8) val2 = 0;
-				val2 += 0x3A5 - 0x35B;
-			}
-			DrawSprite(val2 + 0x35B, PAL_NONE, x, y);
-		} else if (!(flag&2)) {
-			DrawSprite(((val&0xF) * 10 >> 4) + 0x351, PAL_NONE, x, y);
-		} else {
-			DrawSprite(((val&0xF) * 9 >> 4) + 0x3C8, PAL_NONE, x, y);
+	switch (gen_race) {
+		case WHITE_MALE:   DrawSprite(0x32B + (eyebrows * 12 >> 4), pal, x, y); break;
+		case WHITE_FEMALE: DrawSprite(0x337 + eyebrows,             pal, x, y); break;
+		case BLACK_MALE:   DrawSprite(0x39A + (eyebrows * 11 >> 4), pal, x, y); break;
+		case BLACK_FEMALE: DrawSprite(0x3B8 + eyebrows,             pal, x, y); break;
+	}
+
+	/* Draw the mouth */
+	uint nose = GB(face, 13, 3);
+	uint lips = GB(face, 10, 4);
+
+	if (!HASBIT(gen_race, GENDER_FEMALE)) {
+		lips = (lips * 15 >> 4);
+
+		if (lips < 3) {
+			/* Moustache, including nose and lips */
+			DrawSprite((HASBIT(gen_race, RACE_BLACK) ? 0x397 : 0x367) + lips, PAL_NONE, x, y);
+
+			/* Skip the rest */
+			goto skip_mouth;
 		}
 
-		val >>= 3;
-
-		if (!(flag&2)) {
-			if (!(flag&1)) {
-				DrawSprite(0x349 + val, PAL_NONE, x, y);
-			} else {
-				DrawSprite( mouth_table[(val*3>>3)], PAL_NONE, x, y);
-			}
-		} else {
-			if (!(flag&1)) {
-				DrawSprite(0x393 + (val&3), PAL_NONE, x, y);
-			} else {
-				DrawSprite(0x3B3 + (val*5>>3), PAL_NONE, x, y);
-			}
+		/* Lips */
+		lips -= 3;
+		if (HASBIT(gen_race, RACE_BLACK)) {
+			if (lips > 8) lips = 0;
+			lips += 0x3A5 - 0x35B;
 		}
-
-		skip_mouth:;
+		DrawSprite(lips + 0x35B, PAL_NONE, x, y);
+	} else if (HASBIT(gen_race, RACE_BLACK)) {
+		/* Female lips with make up */
+		DrawSprite((lips * 9 >> 4) + 0x3C8, PAL_NONE, x, y);
+	} else {
+		/* Female lips */
+		DrawSprite((lips * 10 >> 4) + 0x351, PAL_NONE, x, y);
 	}
 
-
-	/* draw the hair */
 	{
-		uint val = GB(face, 16, 4);
-		if (flag & 2) {
-			if (flag & 1) {
-				DrawSprite(0x3D9 + (val * 5 >> 4), PAL_NONE, x, y);
-			} else {
-				DrawSprite(0x3D4 + (val * 5 >> 4), PAL_NONE, x, y);
-			}
-		} else {
-			if (flag & 1) {
-				DrawSprite(0x38B + (val * 5 >> 4), PAL_NONE, x, y);
-			} else {
-				DrawSprite(0x382 + (val * 9 >> 4), PAL_NONE, x, y);
-			}
+		/* Nose */
+		static const SpriteID mouth_table[] = { 0x34C, 0x34D, 0x34F };
+		switch (gen_race) {
+			case WHITE_MALE:   DrawSprite(0x349 + nose,                 PAL_NONE, x, y); break;
+			case WHITE_FEMALE: DrawSprite(mouth_table[(nose * 3 >> 3)], PAL_NONE, x, y); break;
+			case BLACK_MALE:   DrawSprite(0x393 + (nose & 3),           PAL_NONE, x, y); break;
+			case BLACK_FEMALE: DrawSprite(0x3B3 + (nose * 5 >> 3),      PAL_NONE, x, y); break;
 		}
 	}
-
-	/* draw the tie */
-	{
-		uint val = GB(face, 20, 8);
+skip_mouth:
 
-		if (!(flag&1)) {
-			DrawSprite(0x36B + (GB(val, 0, 2) * 3 >> 2), PAL_NONE, x, y);
-			DrawSprite(0x36E + (GB(val, 2, 2) * 4 >> 2), PAL_NONE, x, y);
-			DrawSprite(0x372 + (GB(val, 4, 4) * 6 >> 4), PAL_NONE, x, y);
-		} else {
-			DrawSprite(0x378 + (GB(val, 0, 2) * 3 >> 2), PAL_NONE, x, y);
-			DrawSprite(0x37B + (GB(val, 2, 2) * 4 >> 2), PAL_NONE, x, y);
+	/* Draw the hair */
+	uint hair = GB(face, 16, 4);
+	switch (gen_race) {
+		case WHITE_MALE:   DrawSprite(0x382 + (hair * 9 >> 4), PAL_NONE, x, y); break;
+		case WHITE_FEMALE: DrawSprite(0x38B + (hair * 5 >> 4), PAL_NONE, x, y); break;
+		case BLACK_MALE:   DrawSprite(0x3D4 + (hair * 5 >> 4), PAL_NONE, x, y); break;
+		case BLACK_FEMALE: DrawSprite(0x3D9 + (hair * 5 >> 4), PAL_NONE, x, y); break;
+	}
 
-			val >>= 4;
-			if (val < 3) DrawSprite((flag & 2 ? 0x3D1 : 0x37F) + val, PAL_NONE, x, y);
-		}
+	/* Draw the tie, ear rings etc. */
+	uint tie = GB(face, 20, 8);
+	if (HASBIT(gen_race, GENDER_FEMALE)) {
+		DrawSprite(0x378 + (GB(tie, 0, 2) * 3 >> 2), PAL_NONE, x, y);
+		DrawSprite(0x37B + (GB(tie, 2, 2) * 4 >> 2), PAL_NONE, x, y);
+
+		tie >>= 4;
+		if (tie < 3) DrawSprite((HASBIT(gen_race, RACE_BLACK) ? 0x3D1 : 0x37F) + tie, PAL_NONE, x, y);
+	} else {
+		DrawSprite(0x36B + (GB(tie, 0, 2) * 3 >> 2), PAL_NONE, x, y);
+		DrawSprite(0x36E + (GB(tie, 2, 2) * 4 >> 2), PAL_NONE, x, y);
+		DrawSprite(0x372 + (GB(tie, 4, 4) * 6 >> 4), PAL_NONE, x, y);
 	}
 
 	/* draw the glasses */
-	{
-		uint val = GB(face, 28, 3);
-
-		if (flag & 2) {
-			if (val <= 1) DrawSprite(0x3AE + val, PAL_NONE, x, y);
-		} else {
-			if (val <= 1) DrawSprite(0x347 + val, PAL_NONE, x, y);
-		}
-	}
+	uint glasses = GB(face, 28, 3);
+	if (glasses <= 1) DrawSprite((HASBIT(gen_race, RACE_BLACK) ? 0x3AE : 0x347) + glasses, PAL_NONE, x, y);
 }
 
 void InvalidatePlayerWindows(const Player *p)
--- a/src/queue.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/queue.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -5,140 +5,6 @@
 #include "queue.h"
 #include "helpers.hpp"
 
-static void Stack_Clear(Queue* q, bool free_values)
-{
-	if (free_values) {
-		uint i;
-
-		for (i = 0; i < q->data.stack.size; i++) free(q->data.stack.elements[i]);
-	}
-	q->data.stack.size = 0;
-}
-
-static void Stack_Free(Queue* q, bool free_values)
-{
-	q->clear(q, free_values);
-	free(q->data.stack.elements);
-	if (q->freeq) free(q);
-}
-
-static bool Stack_Push(Queue* q, void* item, int priority)
-{
-	if (q->data.stack.size == q->data.stack.max_size) return false;
-	q->data.stack.elements[q->data.stack.size++] = item;
-	return true;
-}
-
-static void* Stack_Pop(Queue* q)
-{
-	if (q->data.stack.size == 0) return NULL;
-	return q->data.stack.elements[--q->data.stack.size];
-}
-
-static bool Stack_Delete(Queue* q, void* item, int priority)
-{
-	return false;
-}
-
-static Queue* init_stack(Queue* q, uint max_size)
-{
-	q->push = Stack_Push;
-	q->pop = Stack_Pop;
-	q->del = Stack_Delete;
-	q->clear = Stack_Clear;
-	q->free = Stack_Free;
-	q->data.stack.max_size = max_size;
-	q->data.stack.size = 0;
-	q->data.stack.elements = MallocT<void*>(max_size);
-	q->freeq = false;
-	return q;
-}
-
-Queue* new_Stack(uint max_size)
-{
-	Queue* q = MallocT<Queue>(1);
-
-	init_stack(q, max_size);
-	q->freeq = true;
-	return q;
-}
-
-/*
- * Fifo
- */
-
-static void Fifo_Clear(Queue* q, bool free_values)
-{
-	if (free_values) {
-		uint head = q->data.fifo.head;
-		uint tail = q->data.fifo.tail; /* cache for speed */
-
-		while (head != tail) {
-			free(q->data.fifo.elements[tail]);
-			tail = (tail + 1) % q->data.fifo.max_size;
-		}
-	}
-	q->data.fifo.head = 0;
-	q->data.fifo.tail = 0;
-}
-
-static void Fifo_Free(Queue* q, bool free_values)
-{
-	q->clear(q, free_values);
-	free(q->data.fifo.elements);
-	if (q->freeq) free(q);
-}
-
-static bool Fifo_Push(Queue* q, void* item, int priority)
-{
-	uint next = (q->data.fifo.head + 1) % q->data.fifo.max_size;
-
-	if (next == q->data.fifo.tail) return false;
-	q->data.fifo.elements[q->data.fifo.head] = item;
-
-	q->data.fifo.head = next;
-	return true;
-}
-
-static void* Fifo_Pop(Queue* q)
-{
-	void* result;
-
-	if (q->data.fifo.head == q->data.fifo.tail) return NULL;
-	result = q->data.fifo.elements[q->data.fifo.tail];
-
-	q->data.fifo.tail = (q->data.fifo.tail + 1) % q->data.fifo.max_size;
-	return result;
-}
-
-static bool Fifo_Delete(Queue* q, void* item, int priority)
-{
-	return false;
-}
-
-static Queue* init_fifo(Queue* q, uint max_size)
-{
-	q->push = Fifo_Push;
-	q->pop = Fifo_Pop;
-	q->del = Fifo_Delete;
-	q->clear = Fifo_Clear;
-	q->free = Fifo_Free;
-	q->data.fifo.max_size = max_size;
-	q->data.fifo.head = 0;
-	q->data.fifo.tail = 0;
-	q->data.fifo.elements = MallocT<void*>(max_size);
-	q->freeq = false;
-	return q;
-}
-
-Queue* new_Fifo(uint max_size)
-{
-	Queue* q = MallocT<Queue>(1);
-	init_fifo(q, max_size);
-	q->freeq = true;
-	return q;
-}
-
 
 /*
  * Insertion Sorter
@@ -161,7 +27,6 @@
 static void InsSort_Free(Queue* q, bool free_values)
 {
 	q->clear(q, free_values);
-	if (q->freeq) free(q);
 }
 
 static bool InsSort_Push(Queue* q, void* item, int priority)
@@ -215,16 +80,6 @@
 	q->clear = InsSort_Clear;
 	q->free = InsSort_Free;
 	q->data.inssort.first = NULL;
-	q->freeq = false;
-}
-
-Queue* new_InsSort(void)
-{
-	Queue* q = MallocT<Queue>(1);
-
-	init_InsSort(q);
-	q->freeq = true;
-	return q;
 }
 
 
@@ -284,7 +139,6 @@
 		free(q->data.binaryheap.elements[i]);
 	}
 	free(q->data.binaryheap.elements);
-	if (q->freeq) free(q);
 }
 
 static bool BinaryHeap_Push(Queue* q, void* item, int priority)
@@ -430,21 +284,11 @@
 	q->data.binaryheap.elements = CallocT<BinaryHeapNode*>((max_size - 1) / BINARY_HEAP_BLOCKSIZE + 1);
 	q->data.binaryheap.elements[0] = MallocT<BinaryHeapNode>(BINARY_HEAP_BLOCKSIZE);
 	q->data.binaryheap.blocks = 1;
-	q->freeq = false;
 #ifdef QUEUE_DEBUG
 	printf("[BinaryHeap] Initial size of elements is %d nodes\n", BINARY_HEAP_BLOCKSIZE);
 #endif
 }
 
-Queue* new_BinaryHeap(uint max_size)
-{
-	Queue* q = MallocT<Queue>(1);
-
-	init_BinaryHeap(q, max_size);
-	q->freeq = true;
-	return q;
-}
-
 // Because we don't want anyone else to bother with our defines
 #undef BIN_HEAP_ARR
 
@@ -469,18 +313,9 @@
 	debug("Buckets = %p", h->buckets);
 #endif
 	h->buckets_in_use = (bool*)(h->buckets + num_buckets);
-	h->freeh = false;
 	for (i = 0; i < num_buckets; i++) h->buckets_in_use[i] = false;
 }
 
-Hash* new_Hash(Hash_HashProc* hash, int num_buckets)
-{
-	Hash* h = MallocT<Hash>(1);
-
-	init_Hash(h, hash, num_buckets);
-	h->freeh = true;
-	return h;
-}
 
 void delete_Hash(Hash* h, bool free_values)
 {
@@ -511,7 +346,6 @@
 #ifdef HASH_DEBUG
 	debug("Freeing Hash: %p", h);
 #endif
-	if (h->freeh) free(h);
 }
 
 #ifdef HASH_STATS
--- a/src/queue.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/queue.h	Wed Feb 28 00:33:40 2007 +0000
@@ -61,17 +61,6 @@
 
 	union {
 		struct {
-			uint max_size;
-			uint size;
-			void** elements;
-		} stack;
-		struct {
-			uint max_size;
-			uint head; /* The index where the last element should be inserted */
-			uint tail; /* The index where the next element should be read */
-			void** elements;
-		} fifo;
-		struct {
 			InsSortNode* first;
 		} inssort;
 		struct {
@@ -81,32 +70,8 @@
 			BinaryHeapNode** elements;
 		} binaryheap;
 	} data;
-
-	/* If true, this struct will be free'd when the
-	 * Queue is deleted. */
-	bool freeq;
 };
 
-/* Initializes a stack and allocates internal memory. */
-void init_Stack(Queue* q, uint max_size);
-
-/* Allocate a new stack with a maximum of max_size elements. */
-Queue* new_Stack(uint max_size);
-
-/*
- * Fifo
- */
-
-/* Initializes a fifo and allocates internal memory for maximum of max_size
- * elements */
-void init_Fifo(Queue* q, uint max_size);
-
-/* Allocate a new fifo and initializes it with a maximum of max_size elements. */
-Queue* new_Fifo(uint max_size);
-
-Queue* new_Fifo_in_buffer(uint max_size, void* buffer);
-
-int build_Fifo(void* buffer, uint size);
 
 /*
  * Insertion Sorter
@@ -116,8 +81,6 @@
  * size */
 void init_InsSort(Queue* q);
 
-/* Allocate a new fifo and initializes it. There is no maximum size */
-Queue* new_InsSort(void);
 
 /*
  *  Binary Heap
@@ -132,9 +95,6 @@
  * max_size elements */
 void init_BinaryHeap(Queue* q, uint max_size);
 
-/* Allocate a new binary heap and initializes it with a maximum of max_size
- * elements. */
-Queue* new_BinaryHeap(uint max_size);
 
 /*
  * Hash
@@ -163,10 +123,6 @@
 	/* A pointer to an array of numbuckets booleans, which will be true if
 	 * there are any Nodes in the bucket */
 	bool* buckets_in_use;
-	/* If true, buckets will be freed in delete_hash */
-	bool freeb;
-	/* If true, the pointer to this struct will be freed in delete_hash */
-	bool freeh;
 } Hash;
 
 /* Call these function to manipulate a hash */
@@ -184,9 +140,6 @@
 
 /* Call these function to create/destroy a hash */
 
-/* Builds a new hash, with num_buckets buckets. Make sure that hash() always
- * returns a hash less than num_buckets! Call delete_hash after use */
-Hash* new_Hash(Hash_HashProc* hash, int num_buckets);
 /* Builds a new hash in an existing struct. Make sure that hash() always
  * returns a hash less than num_buckets! Call delete_hash after use */
 void init_Hash(Hash* h, Hash_HashProc* hash, uint num_buckets);
--- a/src/rail.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/rail.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -102,7 +102,7 @@
 };
 
 
-RailType GetTileRailType(TileIndex tile, Track track)
+RailType GetTileRailType(TileIndex tile)
 {
 	switch (GetTileType(tile)) {
 		case MP_RAILWAY:
--- a/src/rail.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/rail.h	Wed Feb 28 00:33:40 2007 +0000
@@ -88,7 +88,6 @@
 typedef TinyEnumT<TrackBits> TrackBitsByte;
 
 DECLARE_ENUM_AS_BIT_SET(TrackBits);
-DECLARE_ENUM_AS_BIT_INDEX(Track, TrackBits);
 
 /**
  * Maps a Track to the corresponding TrackBits value
@@ -261,7 +260,7 @@
 {
 	if (*tracks != TRACK_BIT_NONE && *tracks != INVALID_TRACK_BIT) {
 		Track first = (Track)FIND_FIRST_BIT(*tracks);
-		*tracks = ClrBitT(*tracks, first);
+		ClrBitT(*tracks, first);
 		return first;
 	}
 	return INVALID_TRACK;
@@ -274,7 +273,7 @@
 {
 	if (*trackdirs != TRACKDIR_BIT_NONE && *trackdirs != INVALID_TRACKDIR_BIT) {
 		Trackdir first = (Trackdir)FindFirstBit2x64(*trackdirs);
-		*trackdirs = ClrBitT(*trackdirs, first);
+		ClrBitT(*trackdirs, first);
 		return first;
 	}
 	return INVALID_TRACKDIR;
--- a/src/rail_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/rail_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -3,6 +3,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
+#include "cmd_helper.h"
 #include "debug.h"
 #include "functions.h"
 #include "rail_map.h"
@@ -450,7 +451,7 @@
 		(trdy >= 0 && dy < 0)
 	) {
 		if (!HASBIT(*trackdir, 3)) { // first direction is invalid, try the other
-			*trackdir = SetBitT(*trackdir, 3); // reverse the direction
+			SetBitT(*trackdir, 3); // reverse the direction
 			trdx = -trdx;
 			trdy = -trdy;
 		} else { // other direction is invalid too, invalid drag
@@ -513,7 +514,7 @@
 		tile += ToTileIndexDiff(_trackdelta[trackdir]);
 
 		// toggle railbit for the non-diagonal tracks
-		if (!IsDiagonalTrackdir(trackdir)) trackdir = ToggleBitT(trackdir, 0);
+		if (!IsDiagonalTrackdir(trackdir)) ToggleBitT(trackdir, 0);
 	}
 
 	return (total_cost == 0) ? CMD_ERROR : total_cost;
@@ -540,7 +541,7 @@
 /** Build a train depot
  * @param tile position of the train depot
  * @param p1 rail type
- * @param p2 entrance direction (DiagDirection)
+ * @param p2 bit 0..1 entrance direction (DiagDirection)
  *
  * @todo When checking for the tile slope,
  * distingush between "Flat land required" and "land sloped in wrong direction"
@@ -553,12 +554,13 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
 	/* check railtype and valid direction for depot (0 through 3), 4 in total */
-	if (!ValParamRailtype(p1) || p2 > 3) return CMD_ERROR;
+	if (!ValParamRailtype(p1)) return CMD_ERROR;
 
 	tileh = GetTileSlope(tile, NULL);
 
+	DiagDirection dir = Extract<DiagDirection, 0>(p2);
+
 	/* Prohibit construction if
 	 * The tile is non-flat AND
 	 * 1) The AI is "old-school"
@@ -571,7 +573,7 @@
 				_is_old_ai_player ||
 				!_patches.build_on_slopes ||
 				IsSteepSlope(tileh) ||
-				!CanBuildDepotByTileh(p2, tileh)
+				!CanBuildDepotByTileh(dir, tileh)
 			)) {
 		return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 	}
@@ -586,7 +588,6 @@
 	if (d == NULL) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
-		DiagDirection dir = (DiagDirection)p2;
 		MakeRailDepot(tile, _current_player, dir, (RailType)p1);
 		MarkTileDirtyByTile(tile);
 
@@ -777,7 +778,7 @@
 		signal_ctr++;
 
 		// toggle railbit for the non-diagonal tracks (|, -- tracks)
-		if (!IsDiagonalTrackdir(trackdir)) trackdir = ToggleBitT(trackdir, 0);
+		if (!IsDiagonalTrackdir(trackdir)) ToggleBitT(trackdir, 0);
 	}
 
 	return error ? CMD_ERROR : total_cost;
@@ -914,8 +915,8 @@
 	ey = TileY(tile);
 	sx = TileX(p1);
 	sy = TileY(p1);
-	if (ex < sx) intswap(ex, sx);
-	if (ey < sy) intswap(ey, sy);
+	if (ex < sx) Swap(ex, sx);
+	if (ey < sy) Swap(ey, sy);
 
 	money = GetAvailableMoneyForCommand();
 	cost = 0;
--- a/src/rail_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/rail_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file rail_gui.c File for dealing with rail construction user interface */
+/** @file rail_gui.cpp File for dealing with rail construction user interface */
 
 #include "stdafx.h"
 #include "openttd.h"
@@ -638,11 +638,11 @@
 	uint ey = TileY(end);
 	uint w,h;
 
-	if (sx > ex) uintswap(sx,ex);
-	if (sy > ey) uintswap(sy,ey);
+	if (sx > ex) Swap(sx, ex);
+	if (sy > ey) Swap(sy, ey);
 	w = ex - sx + 1;
 	h = ey - sy + 1;
-	if (!_railstation.orientation) uintswap(w,h);
+	if (!_railstation.orientation) Swap(w, h);
 
 	DoCommandP(TileXY(sx, sy),
 			_railstation.orientation | (w << 8) | (h << 16),
@@ -704,7 +704,7 @@
 		} else {
 			int x = _railstation.numtracks;
 			int y = _railstation.platlength;
-			if (_railstation.orientation == 0) intswap(x,y);
+			if (_railstation.orientation == 0) Swap(x, y);
 			if (!_remove_button_clicked)
 				SetTileSelectSize(x, y);
 		}
--- a/src/rail_map.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/rail_map.h	Wed Feb 28 00:33:40 2007 +0000
@@ -261,12 +261,8 @@
 
 /**
  * Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile.
- * Note that there is no check if the given trackdir is actually present on
- * the tile!
- * The given trackdir is used when there are (could be) multiple rail types on
- * one tile.
  */
-RailType GetTileRailType(TileIndex tile, Track track);
+RailType GetTileRailType(TileIndex tile);
 
 
 typedef enum RailGroundType {
--- a/src/road.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/road.h	Wed Feb 28 00:33:40 2007 +0000
@@ -40,4 +40,14 @@
 	return (dir & 0x06) == 0;
 }
 
+/**
+ * Is it allowed to remove the given road bits from the given tile?
+ * @param tile      the tile to remove the road from
+ * @param remove    the roadbits that are going to be removed
+ * @param owner     the actual owner of the roadbits of the tile
+ * @param edge_road are the removed bits from a town?
+ * @return true when it is allowed to remove the road bits
+ */
+bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road);
+
 #endif /* ROAD_H */
--- a/src/road_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/road_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -3,6 +3,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
+#include "cmd_helper.h"
 #include "rail_map.h"
 #include "road_map.h"
 #include "sprite.h"
@@ -35,11 +36,10 @@
 }
 
 
-static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool* edge_road)
+bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road)
 {
 	RoadBits present;
 	RoadBits n;
-	Owner owner;
 	*edge_road = true;
 
 	if (_game_mode == GM_EDITOR) return true;
@@ -47,8 +47,6 @@
 	// Only do the special processing for actual players.
 	if (!IsValidPlayer(_current_player)) return true;
 
-	owner = IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile);
-
 	// Only do the special processing if the road is owned
 	// by a town
 	if (owner != OWNER_TOWN) return (owner == OWNER_NONE) || CheckOwnership(owner);
@@ -81,10 +79,14 @@
 	return true;
 }
 
+static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool *edge_road)
+{
+	return CheckAllowRemoveRoad(tile, remove, IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile), edge_road);
+}
 
 /** Delete a piece of road.
  * @param tile tile where to remove road from
- * @param p1 road piece flags
+ * @param p1 bit 0..3 road pieces to remove (RoadBits)
  * @param p2 unused
  */
 int32 CmdRemoveRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -97,14 +99,9 @@
 	/* true if the roadpiece was always removeable,
 	 * false if it was a center piece. Affects town ratings drop */
 	bool edge_road;
-	RoadBits pieces;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	/* Road pieces are max 4 bitset values (NE, NW, SE, SW) */
-	if (p1 >> 4) return CMD_ERROR;
-	pieces = (RoadBits)p1;
-
 	if (!IsTileType(tile, MP_STREET)) return CMD_ERROR;
 
 	owner = IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile);
@@ -115,6 +112,8 @@
 		t = NULL;
 	}
 
+	RoadBits pieces = Extract<RoadBits, 0>(p1);
+
 	if (!CheckAllowRemoveRoad(tile, pieces, &edge_road)) return CMD_ERROR;
 
 	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
@@ -248,7 +247,7 @@
 
 /** Build a piece of road.
  * @param tile tile where to build road
- * @param p1 road piece flags
+ * @param p1 bit 0..3 road pieces to build (RoadBits)
  * @param p2 the town that is building the road (0 if not applicable)
  */
 int32 CmdBuildRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -256,15 +255,15 @@
 	int32 cost = 0;
 	int32 ret;
 	RoadBits existing = ROAD_NONE;
-	RoadBits pieces;
 	Slope tileh;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	/* Road pieces are max 4 bitset values (NE, NW, SE, SW) and town can only be non-zero
 	 * if a non-player is building the road */
-	if ((p1 >> 4) || (IsValidPlayer(_current_player) && p2 != 0) || (_current_player == OWNER_TOWN && !IsValidTownID(p2))) return CMD_ERROR;
-	pieces = (RoadBits)p1;
+	if ((IsValidPlayer(_current_player) && p2 != 0) || (_current_player == OWNER_TOWN && !IsValidTownID(p2))) return CMD_ERROR;
+
+	RoadBits pieces = Extract<RoadBits, 0>(p1);
 
 	tileh = GetTileSlope(tile, NULL);
 
@@ -501,7 +500,7 @@
 
 /** Build a road depot.
  * @param tile tile where to build the depot
- * @param p1 entrance direction (DiagDirection)
+ * @param p1 bit 0..1 entrance direction (DiagDirection)
  * @param p2 unused
  *
  * @todo When checking for the tile slope,
@@ -515,15 +514,13 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	if (p1 > 3) return CMD_ERROR; // check direction
-
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	DiagDirection dir = Extract<DiagDirection, 0>(p1);
 
 	tileh = GetTileSlope(tile, NULL);
 	if (tileh != SLOPE_FLAT && (
 				!_patches.build_on_slopes ||
 				IsSteepSlope(tileh) ||
-				!CanBuildDepotByTileh(p1, tileh)
+				!CanBuildDepotByTileh(dir, tileh)
 			)) {
 		return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 	}
@@ -540,7 +537,7 @@
 		dep->xy = tile;
 		dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 
-		MakeRoadDepot(tile, _current_player, (DiagDirection)p1);
+		MakeRoadDepot(tile, _current_player, dir);
 		MarkTileDirtyByTile(tile);
 	}
 	return cost + _price.build_road_depot;
--- a/src/road_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/road_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -84,7 +84,9 @@
 	if (success) {
 		SndPlayTileFx(SND_1F_SPLAT, tile);
 		ResetObjectToPlace();
-		if (!HASBIT(p2, 1)) BuildRoadOutsideStation(tile, (DiagDirection)p1);
+		BuildRoadOutsideStation(tile, (DiagDirection)p1);
+		/* For a drive-through road stop build connecting road for other entrance */
+		if (HASBIT(p2, 1)) BuildRoadOutsideStation(tile, ReverseDiagDir((DiagDirection)p1));
 	}
 }
 
--- a/src/roadveh_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/roadveh_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -880,7 +880,9 @@
 
 	// Clamp
 	spd = min(spd, v->max_speed);
-	if (v->u.road.state == RVSB_WORMHOLE) spd = min(spd, SetSpeedLimitOnBridge(v));
+	if (v->u.road.state == RVSB_WORMHOLE && !(v->vehstatus & VS_HIDDEN)) {
+		spd = min(spd, GetBridge(GetBridgeType(v->tile))->speed * 2);
+	}
 
 	//updates statusbar only if speed have changed to save CPU time
 	if (spd != v->cur_speed) {
@@ -972,7 +974,7 @@
 	if (v->direction != u->direction || !(v->direction & 1)) return;
 
 	/* Check if vehicle is in a road stop, depot, tunnel or bridge or not on a straight road */
-	if (v->u.road.state >= RVS_IN_ROAD_STOP || !IsStraightRoadTrackdir((Trackdir)(v->u.road.state & RVSB_TRACKDIR_MASK))) return;
+	if (v->u.road.state >= RVSB_IN_ROAD_STOP || !IsStraightRoadTrackdir((Trackdir)(v->u.road.state & RVSB_TRACKDIR_MASK))) return;
 
 	tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD) & 0x3F;
 	if ((tt & 3) == 0) return;
@@ -1355,9 +1357,7 @@
 
 	if (v->u.road.state == RVSB_WORMHOLE) {
 		/* Vehicle is entering a depot or is on a bridge or in a tunnel */
-		GetNewVehiclePosResult gp;
-
-		GetNewVehiclePos(v, &gp);
+		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 
 		const Vehicle *u = RoadVehFindCloseTo(v, gp.x, gp.y, v->direction);
 		if (u != NULL && u->cur_speed < v->cur_speed) {
--- a/src/saveload.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/saveload.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file
+/** @file saveload.cpp
  * All actions handling saving and loading goes on in this file. The general actions
  * are as follows for saving a game (loading is analogous):
  * <ol>
@@ -12,8 +12,6 @@
  * <li>when the buffer is full; flush it to the output (eg save to file) (_sl.buf, _sl.bufp, _sl.bufe)
  * <li>repeat this until everything is done, and flush any remaining output to file
  * </ol>
- * @see ChunkHandler
- * @see SaveLoad
  */
 #include "stdafx.h"
 #include "openttd.h"
@@ -31,43 +29,43 @@
 #include <setjmp.h>
 
 extern const uint16 SAVEGAME_VERSION = 47;
-uint16 _sl_version;       /// the major savegame version identifier
-byte   _sl_minor_version; /// the minor savegame version, DO NOT USE!
+uint16 _sl_version;       ///< the major savegame version identifier
+byte   _sl_minor_version; ///< the minor savegame version, DO NOT USE!
 
 typedef void WriterProc(uint len);
 typedef uint ReaderProc(void);
 
 /** The saveload struct, containing reader-writer functions, bufffer, version, etc. */
 static struct {
-	bool save;                           /// are we doing a save or a load atm. True when saving
-	byte need_length;                    /// ???
-	byte block_mode;                     /// ???
-	bool error;                          /// did an error occur or not
-
-	int obj_len;                         /// the length of the current object we are busy with
-	int array_index, last_array_index;   /// in the case of an array, the current and last positions
-
-	uint32 offs_base;                    /// the offset in number of bytes since we started writing data (eg uncompressed savegame size)
-
-	WriterProc *write_bytes;             /// savegame writer function
-	ReaderProc *read_bytes;              /// savegame loader function
+	bool save;                           ///< are we doing a save or a load atm. True when saving
+	byte need_length;                    ///< ???
+	byte block_mode;                     ///< ???
+	bool error;                          ///< did an error occur or not
 
-	const ChunkHandler* const *chs;      /// the chunk of data that is being processed atm (vehicles, signs, etc.)
-	const SaveLoad* const *includes;     /// the internal layouf of the given chunk
-
-	/** When saving/loading savegames, they are always saved to a temporary memory-place
-	 * to be flushed to file (save) or to final place (load) when full. */
-	byte *bufp, *bufe;                   /// bufp(ointer) gives the current position in the buffer bufe(nd) gives the end of the buffer
+	int obj_len;                         ///< the length of the current object we are busy with
+	int array_index, last_array_index;   ///< in the case of an array, the current and last positions
 
-	// these 3 may be used by compressor/decompressors.
-	byte *buf;                           /// pointer to temporary memory to read/write, initialized by SaveLoadFormat->initread/write
-	byte *buf_ori;                       /// pointer to the original memory location of buf, used to free it afterwards
-	uint bufsize;                        /// the size of the temporary memory *buf
-	FILE *fh;                            /// the file from which is read or written to
+	uint32 offs_base;                    ///< the offset in number of bytes since we started writing data (eg uncompressed savegame size)
 
-	void (*excpt_uninit)(void);          /// the function to execute on any encountered error
-	const char *excpt_msg;               /// the error message
-	jmp_buf excpt;                       /// @todo used to jump to "exception handler";  really ugly
+	WriterProc *write_bytes;             ///< savegame writer function
+	ReaderProc *read_bytes;              ///< savegame loader function
+
+	const ChunkHandler* const *chs;      ///< the chunk of data that is being processed atm (vehicles, signs, etc.)
+	const SaveLoad* const *includes;     ///< the internal layouf of the given chunk
+
+	/* When saving/loading savegames, they are always saved to a temporary memory-place
+	 * to be flushed to file (save) or to final place (load) when full. */
+	byte *bufp, *bufe;                   ///< bufp(ointer) gives the current position in the buffer bufe(nd) gives the end of the buffer
+
+	/* these 3 may be used by compressor/decompressors. */
+	byte *buf;                           ///< pointer to temporary memory to read/write, initialized by SaveLoadFormat->initread/write
+	byte *buf_ori;                       ///< pointer to the original memory location of buf, used to free it afterwards
+	uint bufsize;                        ///< the size of the temporary memory *buf
+	FILE *fh;                            ///< the file from which is read or written to
+
+	void (*excpt_uninit)(void);          ///< the function to execute on any encountered error
+	const char *excpt_msg;               ///< the error message
+	jmp_buf excpt;                       ///< @todo used to jump to "exception handler";  really ugly
 } _sl;
 
 
@@ -89,8 +87,8 @@
 static inline uint32 SlGetOffs(void) {return _sl.offs_base - (_sl.bufe - _sl.bufp);}
 
 /** Return the size in bytes of a certain type of normal/atomic variable
- * as it appears in memory. @see VarTypes
- * @param conv @VarType type of variable that is used for calculating the size
+ * as it appears in memory. See VarTypes
+ * @param conv VarType type of variable that is used for calculating the size
  * @return Return the size of this type in bytes */
 static inline byte SlCalcConvMemLen(VarType conv)
 {
@@ -101,8 +99,8 @@
 }
 
 /** Return the size in bytes of a certain type of normal/atomic variable
- * as it appears in a saved game. @see VarTypes
- * @param conv @VarType type of variable that is used for calculating the size
+ * as it appears in a saved game. See VarTypes
+ * @param conv VarType type of variable that is used for calculating the size
  * @return Return the size of this type in bytes */
 static inline byte SlCalcConvFileLen(VarType conv)
 {
@@ -112,7 +110,7 @@
 	return conv_file_size[length];
 }
 
-/* Return the size in bytes of a reference (pointer) */
+/** Return the size in bytes of a reference (pointer) */
 static inline size_t SlCalcRefLen(void) {return 2;}
 
 /** Flush the output buffer by writing to disk with the given reader.
@@ -121,7 +119,7 @@
  */
 static void SlWriteFill(void)
 {
-	// flush the buffer to disk (the writer)
+	/* flush the buffer to disk (the writer) */
 	if (_sl.bufp != NULL) {
 		uint len = _sl.bufp - _sl.buf;
 		_sl.offs_base += len;
@@ -129,7 +127,7 @@
 	}
 
 	/* All the data from the buffer has been written away, rewind to the beginning
-	* to start reading in more data */
+	 * to start reading in more data */
 	_sl.bufp = _sl.buf;
 	_sl.bufe = _sl.buf + _sl.bufsize;
 }
@@ -333,9 +331,9 @@
 		_sl.need_length = NL_NONE;
 		switch (_sl.block_mode) {
 		case CH_RIFF:
-			// Ugly encoding of >16M RIFF chunks
-			// The lower 24 bits are normal
-			// The uppermost 4 bits are bits 24:27
+			/* Ugly encoding of >16M RIFF chunks
+			 * The lower 24 bits are normal
+			 * The uppermost 4 bits are bits 24:27 */
 			assert(length < (1<<28));
 			SlWriteUint32((length & 0xFFFFFF) | ((length >> 24) << 28));
 			break;
@@ -439,13 +437,13 @@
  * and then write them to file, endian safely. Loading a value
  * goes exactly the opposite way
  * @param ptr The object being filled/read
- * @param conv @VarType type of the current element of the struct
+ * @param conv VarType type of the current element of the struct
  */
 static void SlSaveLoadConv(void *ptr, VarType conv)
 {
 	int64 x = 0;
 
-	if (_sl.save) { /* SAVE values */
+	if (_sl.save) { // SAVE values
 		/* Read a value from the struct. These ARE endian safe. */
 		x = ReadValue(ptr, conv);
 
@@ -462,7 +460,7 @@
 		case SLE_FILE_U64:                                   SlWriteUint64(x);break;
 		default: NOT_REACHED();
 		}
-	} else { /* LOAD values */
+	} else { // LOAD values
 
 		/* Read a value from the file */
 		switch (GetVarFileType(conv)) {
@@ -533,7 +531,7 @@
 {
 	size_t len;
 
-	if (_sl.save) { /* SAVE string */
+	if (_sl.save) { // SAVE string
 		switch (GetVarMemType(conv)) {
 			default: NOT_REACHED();
 			case SLE_VAR_STRB:
@@ -549,7 +547,7 @@
 
 		SlWriteArrayLength(len);
 		SlCopyBytes(ptr, len);
-	} else { /* LOAD string */
+	} else { // LOAD string
 		len = SlReadArrayLength();
 
 		switch (GetVarMemType(conv)) {
@@ -566,7 +564,7 @@
 				}
 				break;
 			case SLE_VAR_STR:
-			case SLE_VAR_STRQ: /* Malloc'd string, free previous incarnation, and allocate */
+			case SLE_VAR_STRQ: // Malloc'd string, free previous incarnation, and allocate
 				free(*(char**)ptr);
 				*(char**)ptr = (char*)malloc(len + 1); // terminating '\0'
 				ptr = *(char**)ptr;
@@ -581,7 +579,7 @@
 /**
  * Return the size in bytes of a certain type of atomic array
  * @param length The length of the array counted in elements
- * @param conv @VarType type of the variable that is used in calculating the size
+ * @param conv VarType type of the variable that is used in calculating the size
  */
 static inline size_t SlCalcArrayLen(uint length, VarType conv)
 {
@@ -592,14 +590,14 @@
  * Save/Load an array.
  * @param array The array being manipulated
  * @param length The length of the array in elements
- * @param conv @VarType type of the atomic array (int, byte, uint64, etc.)
+ * @param conv VarType type of the atomic array (int, byte, uint64, etc.)
  */
 void SlArray(void *array, uint length, VarType conv)
 {
-	// Automatically calculate the length?
+	/* Automatically calculate the length? */
 	if (_sl.need_length != NL_NONE) {
 		SlSetLength(SlCalcArrayLen(length, conv));
-		// Determine length only?
+		/* Determine length only? */
 		if (_sl.need_length == NL_CALCLENGTH) return;
 	}
 
@@ -628,7 +626,7 @@
 	}
 }
 
-/* Are we going to save this object or not? */
+/** Are we going to save this object or not? */
 static inline bool SlIsObjectValidInSavegame(const SaveLoad *sld)
 {
 	if (_sl_version < sld->version_from || _sl_version > sld->version_to) return false;
@@ -652,13 +650,13 @@
 
 /**
  * Calculate the size of an object.
- * @param sld The @SaveLoad description of the object so we know how to manipulate it
+ * @param sld The SaveLoad description of the object so we know how to manipulate it
  */
 static size_t SlCalcObjLength(const void *object, const SaveLoad *sld)
 {
 	size_t length = 0;
 
-	// Need to determine the length and write a length tag.
+	/* Need to determine the length and write a length tag. */
 	for (; sld->cmd != SL_END; sld++) {
 		length += SlCalcObjMemberLength(object, sld);
 	}
@@ -711,8 +709,8 @@
 
 		switch (sld->cmd) {
 		case SL_VAR: SlSaveLoadConv(ptr, conv); break;
-		case SL_REF: /* Reference variable, translate */
-			/// @todo XXX - another artificial limitof 65K elements of pointers?
+		case SL_REF: // Reference variable, translate
+			/* @todo XXX - another artificial limitof 65K elements of pointers? */
 			if (_sl.save) { // XXX - read/write pointer as uint16? What is with higher indeces?
 				SlWriteUint16(ReferenceToInt(*(void**)ptr, (SLRefType)conv));
 			} else {
@@ -726,10 +724,10 @@
 		break;
 
 	/* SL_WRITEBYTE translates a value of a variable to another one upon
-   * saving or loading.
-   * XXX - variable renaming abuse
-   * game_value: the value of the variable ingame is abused by sld->version_from
-   * file_value: the value of the variable in the savegame is abused by sld->version_to */
+	 * saving or loading.
+	 * XXX - variable renaming abuse
+	 * game_value: the value of the variable ingame is abused by sld->version_from
+	 * file_value: the value of the variable in the savegame is abused by sld->version_to */
 	case SL_WRITEBYTE:
 		if (_sl.save) {
 			SlWriteByte(sld->version_to);
@@ -752,11 +750,11 @@
 /**
  * Main SaveLoad function.
  * @param object The object that is being saved or loaded
- * @param sld The @SaveLoad description of the object so we know how to manipulate it
+ * @param sld The SaveLoad description of the object so we know how to manipulate it
  */
 void SlObject(void *object, const SaveLoad *sld)
 {
-	// Automatically calculate the length?
+	/* Automatically calculate the length? */
 	if (_sl.need_length != NL_NONE) {
 		SlSetLength(SlCalcObjLength(object, sld));
 		if (_sl.need_length == NL_CALCLENGTH) return;
@@ -795,18 +793,18 @@
 
 	assert(_sl.save);
 
-	// Tell it to calculate the length
+	/* Tell it to calculate the length */
 	_sl.need_length = NL_CALCLENGTH;
 	_sl.obj_len = 0;
 	proc(arg);
 
-	// Setup length
+	/* Setup length */
 	_sl.need_length = NL_WANTLENGTH;
 	SlSetLength(_sl.obj_len);
 
 	offs = SlGetOffs() + _sl.obj_len;
 
-	// And write the stuff
+	/* And write the stuff */
 	proc(arg);
 
 	assert(offs == SlGetOffs());
@@ -835,7 +833,7 @@
 		break;
 	default:
 		if ((m & 0xF) == CH_RIFF) {
-			// Read length
+			/* Read length */
 			len = (SlReadByte() << 16) | ((m >> 4) << 24);
 			len += SlReadUint16();
 			_sl.obj_len = len;
@@ -866,7 +864,7 @@
 	DEBUG(sl, 2, "Saving chunk %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id);
 
 	if (ch->flags & CH_AUTO_LENGTH) {
-		// Need to calculate the length. Solve that by calling SlAutoLength in the save_proc.
+		/* Need to calculate the length. Solve that by calling SlAutoLength in the save_proc. */
 		_tmp_proc_1 = proc;
 		proc = SlStubSaveProc;
 	}
@@ -911,7 +909,7 @@
 		}
 	}
 
-	// Terminator
+	/* Terminator */
 	SlWriteUint32(0);
 }
 
@@ -949,9 +947,9 @@
 	}
 }
 
-//*******************************************
-//********** START OF LZO CODE **************
-//*******************************************
+/*******************************************
+ ********** START OF LZO CODE **************
+ *******************************************/
 #define LZO_SIZE 8192
 
 #include "minilzo.h"
@@ -963,10 +961,10 @@
 	uint32 size;
 	uint len;
 
-	// Read header
+	/* Read header*/
 	if (fread(tmp, sizeof(tmp), 1, _sl.fh) != 1) SlError("file read failed");
 
-	// Check if size is bad
+	/* Check if size is bad */
 	((uint32*)out)[0] = size = tmp[1];
 
 	if (_sl_version != 0) {
@@ -976,19 +974,19 @@
 
 	if (size >= sizeof(out)) SlError("inconsistent size");
 
-	// Read block
+	/* Read block */
 	if (fread(out + sizeof(uint32), size, 1, _sl.fh) != 1) SlError("file read failed");
 
-	// Verify checksum
+	/* Verify checksum */
 	if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlError("bad checksum");
 
-	// Decompress
+	/* Decompress */
 	lzo1x_decompress(out + sizeof(uint32)*1, size, _sl.buf, &len, NULL);
 	return len;
 }
 
-// p contains the pointer to the buffer, len contains the pointer to the length.
-// len bytes will be written, p and l will be updated to reflect the next buffer.
+/* p contains the pointer to the buffer, len contains the pointer to the length.
+ * len bytes will be written, p and l will be updated to reflect the next buffer. */
 static void WriteLZO(uint size)
 {
 	byte out[LZO_SIZE + LZO_SIZE / 64 + 16 + 3 + 8];
@@ -1013,9 +1011,9 @@
 	free(_sl.buf_ori);
 }
 
-//*********************************************
-//******** START OF NOCOMP CODE (uncompressed)*
-//*********************************************
+/*********************************************
+ ******** START OF NOCOMP CODE (uncompressed)*
+ *********************************************/
 static uint ReadNoComp(void)
 {
 	return fread(_sl.buf, 1, LZO_SIZE, _sl.fh);
@@ -1038,9 +1036,9 @@
 	free(_sl.buf_ori);
 }
 
-//********************************************
-//********** START OF MEMORY CODE (in ram)****
-//********************************************
+/********************************************
+ ********** START OF MEMORY CODE (in ram)****
+ ********************************************/
 
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -1084,9 +1082,9 @@
 	_sl.buf = GetSavegame(_ts.count);
 }
 
-//********************************************
-//********** START OF ZLIB CODE **************
-//********************************************
+/********************************************
+ ********** START OF ZLIB CODE **************
+ ********************************************/
 
 #if defined(WITH_ZLIB)
 #include <zlib.h>
@@ -1111,12 +1109,12 @@
 	_z.avail_out = 4096;
 
 	do {
-		// read more bytes from the file?
+		/* read more bytes from the file?*/
 		if (_z.avail_in == 0) {
 			_z.avail_in = fread(_z.next_in = _sl.buf + 4096, 1, 4096, _sl.fh);
 		}
 
-		// inflate the data
+		/* inflate the data */
 		r = inflate(&_z, 0);
 		if (r == Z_STREAM_END)
 			break;
@@ -1155,7 +1153,7 @@
 		z->next_out = buf;
 		z->avail_out = sizeof(buf);
 		r = deflate(z, mode);
-			// bytes were emitted?
+			/* bytes were emitted? */
 		if ((n=sizeof(buf) - z->avail_out) != 0) {
 			if (fwrite(buf, n, 1, _sl.fh) != 1) SlError("file write error");
 		}
@@ -1172,7 +1170,7 @@
 
 static void UninitWriteZlib(void)
 {
-	// flush any pending output.
+	/* flush any pending output. */
 	if (_sl.fh) WriteZlibLoop(&_z, NULL, 0, Z_FINISH);
 	deflateEnd(&_z);
 	free(_sl.buf_ori);
@@ -1180,11 +1178,11 @@
 
 #endif /* WITH_ZLIB */
 
-//*******************************************
-//************* END OF CODE *****************
-//*******************************************
+/*******************************************
+ ************* END OF CODE *****************
+ *******************************************/
 
-// these define the chunks
+/* these define the chunks */
 extern const ChunkHandler _misc_chunk_handlers[];
 extern const ChunkHandler _setting_chunk_handlers[];
 extern const ChunkHandler _player_chunk_handlers[];
@@ -1220,7 +1218,7 @@
 	NULL,
 };
 
-// used to include a vehicle desc in another desc.
+/* used to include a vehicle desc in another desc. */
 extern const SaveLoad _common_veh_desc[];
 static const SaveLoad* const _desc_includes[] = {
 	_common_veh_desc
@@ -1233,7 +1231,7 @@
  * Remember that a NULL item has value 0, and all
  * indeces have +1, so vehicle 0 is saved as index 1.
  * @param obj The object that we want to get the index of
- * @param rt @SLRefType type of the object the index is being sought of
+ * @param rt SLRefType type of the object the index is being sought of
  * @return Return the pointer converted to an index of the type pointed to
  */
 static uint ReferenceToInt(const void *obj, SLRefType rt)
@@ -1261,7 +1259,7 @@
  * Remember that an index of 0 is a NULL pointer so all indeces
  * are +1 so vehicle 0 is saved as 1.
  * @param index The index that is being converted to a pointer
- * @param rt @SLRefType type of the object the pointer is sought of
+ * @param rt SLRefType type of the object the pointer is sought of
  * @return Return the index converted to a pointer of any type
  */
 static void *IntToReference(uint index, SLRefType rt)
@@ -1329,16 +1327,16 @@
 
 /** The format for a reader/writer type of a savegame */
 typedef struct {
-	const char *name;           /// name of the compressor/decompressor (debug-only)
-	uint32 tag;                 /// the 4-letter tag by which it is identified in the savegame
+	const char *name;           ///< name of the compressor/decompressor (debug-only)
+	uint32 tag;                 ///< the 4-letter tag by which it is identified in the savegame
 
-	bool (*init_read)(void);    /// function executed upon initalization of the loader
-	ReaderProc *reader;         /// function that loads the data from the file
-	void (*uninit_read)(void);  /// function executed when reading is finished
+	bool (*init_read)(void);    ///< function executed upon initalization of the loader
+	ReaderProc *reader;         ///< function that loads the data from the file
+	void (*uninit_read)(void);  ///< function executed when reading is finished
 
-	bool (*init_write)(void);   /// function executed upon intialization of the saver
-	WriterProc *writer;         /// function that saves the data to the file
-	void (*uninit_write)(void); /// function executed when writing is done
+	bool (*init_write)(void);   ///< function executed upon intialization of the saver
+	WriterProc *writer;         ///< function that saves the data to the file
+	void (*uninit_write)(void); ///< function executed when writing is done
 } SaveLoadFormat;
 
 static const SaveLoadFormat _saveload_formats[] = {
@@ -1356,13 +1354,13 @@
  * Return the savegameformat of the game. Whether it was create with ZLIB compression
  * uncompressed, or another type
  * @param s Name of the savegame format. If NULL it picks the first available one
- * @return Pointer to @SaveLoadFormat struct giving all characteristics of this type of savegame
+ * @return Pointer to SaveLoadFormat struct giving all characteristics of this type of savegame
  */
 static const SaveLoadFormat *GetSavegameFormat(const char *s)
 {
 	const SaveLoadFormat *def = endof(_saveload_formats) - 1;
 
-	// find default savegame format, the highest one with which files can be written
+	/* find default savegame format, the highest one with which files can be written */
 	while (!def->init_write) def--;
 
 	if (s != NULL && s[0] != '\0') {
@@ -1377,7 +1375,7 @@
 	return def;
 }
 
-// actual loader/saver function
+/* actual loader/saver function */
 void InitializeGame(int mode, uint size_x, uint size_y);
 extern bool AfterLoadGame(void);
 extern void BeforeSaveGame(void);
@@ -1509,7 +1507,7 @@
 
 	/* An instance of saving is already active, so don't go saving again */
 	if (_ts.saveinprogress && mode == SL_SAVE) {
-		// if not an autosave, but a user action, show error message
+		/* if not an autosave, but a user action, show error message */
 		if (!_do_autosave) ShowErrorMessage(INVALID_STRING_ID, STR_SAVE_STILL_IN_PROGRESS, 0, 0);
 		return SL_OK;
 	}
@@ -1541,7 +1539,7 @@
 	if (setjmp(_sl.excpt)) {
 		AbortSaveLoad();
 
-		// deinitialize compressor.
+		/* deinitialize compressor. */
 		_sl.excpt_uninit();
 
 		/* A saver/loader exception!! reinitialize all variables to prevent crash! */
@@ -1590,7 +1588,7 @@
 			return AbortSaveLoad();
 		}
 
-		// see if we have any loader for this type.
+		/* see if we have any loader for this type. */
 		for (fmt = _saveload_formats; ; fmt++) {
 			/* No loader found, treat as version 0 and use LZO format */
 			if (fmt == endof(_saveload_formats)) {
@@ -1609,12 +1607,12 @@
 			}
 
 			if (fmt->tag == hdr[0]) {
-				// check version number
+				/* check version number */
 				_sl_version = TO_BE32(hdr[1]) >> 16;
 				/* Minor is not used anymore from version 18.0, but it is still needed
-				 *  in versions before that (4 cases) which can't be removed easy.
-				 *  Therefor it is loaded, but never saved (or, it saves a 0 in any scenario).
-				 *  So never EVER use this minor version again. -- TrueLight -- 22-11-2005 */
+				 * in versions before that (4 cases) which can't be removed easy.
+				 * Therefor it is loaded, but never saved (or, it saves a 0 in any scenario).
+				 * So never EVER use this minor version again. -- TrueLight -- 22-11-2005 */
 				_sl_minor_version = (TO_BE32(hdr[1]) >> 8) & 0xFF;
 
 				DEBUG(sl, 1, "Loading savegame version %d", _sl_version);
@@ -1631,7 +1629,7 @@
 		_sl.read_bytes = fmt->reader;
 		_sl.excpt_uninit = fmt->uninit_read;
 
-		// loader for this savegame type is not implemented?
+		/* loader for this savegame type is not implemented? */
 		if (fmt->init_read == NULL) {
 			ShowInfoF("Loader for '%s' is not available.", fmt->name);
 			return AbortSaveLoad();
@@ -1686,7 +1684,7 @@
 		DEBUG(sl, 0, "Savegame is obsolete or invalid format");
 		mode = SL_LOAD; // don't try to get filename, just show name as it is written
 	} else {
-		// see if we have any loader for this type.
+		/* see if we have any loader for this type. */
 		for (fmt = _saveload_formats; fmt != endof(_saveload_formats); fmt++) {
 			if (fmt->tag == hdr) {
 				mode = SL_LOAD; // new type of savegame
--- a/src/ship_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/ship_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -662,7 +662,6 @@
 
 static void ShipController(Vehicle *v)
 {
-	GetNewVehiclePosResult gp;
 	uint32 r;
 	const byte *b;
 	Direction dir;
@@ -692,7 +691,8 @@
 
 	BeginVehicleMove(v);
 
-	if (GetNewVehiclePos(v, &gp)) {
+	GetNewVehiclePosResult gp = GetNewVehiclePos(v);
+	if (gp.old_tile == gp.new_tile) {
 		/* Staying in tile */
 		if (IsShipInDepot(v)) {
 			gp.x = v->x_pos;
--- a/src/sound/cocoa_s.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/sound/cocoa_s.h	Wed Feb 28 00:33:40 2007 +0000
@@ -7,4 +7,4 @@
 
 extern const HalSoundDriver _cocoa_sound_driver;
 
-#endif
+#endif /* SOUND_COCOA_H */
--- a/src/sound/sdl_s.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/sound/sdl_s.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,10 +1,9 @@
 /* $Id$ */
 
+#ifdef WITH_SDL
+
 #include "../stdafx.h"
 
-#ifdef WITH_SDL
-
-#include "../openttd.h"
 #include "../driver.h"
 #include "../mixer.h"
 #include "../sdl.h"
--- a/src/sound/win32_s.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/sound/win32_s.h	Wed Feb 28 00:33:40 2007 +0000
@@ -7,4 +7,4 @@
 
 extern const HalSoundDriver _win32_sound_driver;
 
-#endif
+#endif /* SOUND_WIN32_H */
--- a/src/station.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/station.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file station_cmd.c */
+/** @file station.cpp */
 
 #include "stdafx.h"
 #include "openttd.h"
--- a/src/station.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/station.h	Wed Feb 28 00:33:40 2007 +0000
@@ -205,13 +205,13 @@
 	HVOT_BUOY     = 1 << 6
 };
 
-typedef enum CatchmentAeras {
+typedef enum CatchmentAreas {
 	CA_NONE            =  0,
 	CA_BUS             =  3,
 	CA_TRUCK           =  3,
 	CA_TRAIN           =  4,
 	CA_DOCK            =  5
-} CatchmentAera;
+} CatchmentArea;
 
 void ModifyStationRatingAround(TileIndex tile, PlayerID owner, int amount, uint radius);
 
--- a/src/station_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/station_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,10 +1,12 @@
 /* $Id$ */
 
-/** @file station_cmd.c */
+/** @file station_cmd.cpp */
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "aircraft.h"
 #include "bridge_map.h"
+#include "cmd_helper.h"
 #include "debug.h"
 #include "functions.h"
 #include "station_map.h"
@@ -36,24 +38,21 @@
 #include "helpers.hpp"
 #include "misc/autoptr.hpp"
 #include "road.h"
+#include "cargotype.h"
 
 /**
  * Called if a new block is added to the station-pool
  */
 static void StationPoolNewBlock(uint start_item)
 {
-	Station *st;
-
 	/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
 	 *  TODO - This is just a temporary stage, this will be removed. */
-	for (st = GetStation(start_item); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) st->index = start_item++;
+	for (Station *st = GetStation(start_item); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) st->index = start_item++;
 }
 
 static void StationPoolCleanBlock(uint start_item, uint end_item)
 {
-	uint i;
-
-	for (i = start_item; i <= end_item; i++) {
+	for (uint i = start_item; i <= end_item; i++) {
 		Station *st = GetStation(i);
 		if (st->IsValid()) st->~Station();
 	}
@@ -64,11 +63,9 @@
  */
 static void RoadStopPoolNewBlock(uint start_item)
 {
-	RoadStop *rs;
-
 	/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
 	 * TODO - This is just a temporary stage, this will be removed. */
-	for (rs = GetRoadStop(start_item); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) {
+	for (RoadStop *rs = GetRoadStop(start_item); rs != NULL; rs = (rs->index + 1U < GetRoadStopPoolSize()) ? GetRoadStop(rs->index + 1U) : NULL) {
 		rs->xy    = INVALID_TILE;
 		rs->index = start_item++;
 	}
@@ -78,29 +75,25 @@
 DEFINE_OLD_POOL(RoadStop, RoadStop, RoadStopPoolNewBlock, NULL)
 
 
-extern void UpdateAirplanesOnNewStation(Station *st);
-
-
 RoadStop* GetRoadStopByTile(TileIndex tile, RoadStop::Type type)
 {
 	const Station* st = GetStationByTile(tile);
-	RoadStop* rs;
-
-	for (rs = st->GetPrimaryRoadStop(type); rs->xy != tile; rs = rs->next) {
+
+	for (RoadStop *rs = st->GetPrimaryRoadStop(type);; rs = rs->next) {
+		if (rs->xy == tile) return rs;
 		assert(rs->next != NULL);
 	}
-
-	return rs;
 }
 
 
 static uint GetNumRoadStopsInStation(const Station* st, RoadStop::Type type)
 {
 	uint num = 0;
-	const RoadStop *rs;
 
 	assert(st != NULL);
-	for (rs = st->GetPrimaryRoadStop(type); rs != NULL; rs = rs->next) num++;
+	for (const RoadStop *rs = st->GetPrimaryRoadStop(type); rs != NULL; rs = rs->next) {
+		num++;
+	}
 
 	return num;
 }
@@ -129,12 +122,6 @@
 	BEGIN_TILE_LOOP(tile_cur, w + 2, h + 2, tile - TileDiffXY(1, 1))
 		if (IsTileType(tile_cur, MP_STATION)) {
 			StationID t = GetStationIndex(tile_cur);
-			{
-				Station *st = GetStation(t);
-				// you cannot take control of an oilrig!!
-				if (st->airport_type == AT_OILRIG && st->facilities == (FACIL_AIRPORT|FACIL_DOCK))
-					continue;
-			}
 
 			if (closest_station == INVALID_STATION) {
 				closest_station = t;
@@ -147,29 +134,6 @@
 	return (closest_station == INVALID_STATION) ? NULL : GetStation(closest_station);
 }
 
-static Station *AllocateStation(void)
-{
-	Station *st = NULL;
-
-	/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
-	 * TODO - This is just a temporary stage, this will be removed. */
-	for (st = GetStation(0); st != NULL; st = (st->index + 1U < GetStationPoolSize()) ? GetStation(st->index + 1U) : NULL) {
-		if (!st->IsValid()) {
-			StationID index = st->index;
-
-			memset(st, 0, sizeof(Station));
-			st->index = index;
-			return st;
-		}
-	}
-
-	/* Check if we can add a block to the pool */
-	if (AddBlockToPool(&_Station_pool)) return AllocateStation();
-
-	_error_message = STR_3008_TOO_MANY_STATIONS_LOADING;
-	return NULL;
-}
-
 
 /**
  * Counts the numbers of tiles matching a specific type in the area around
@@ -181,13 +145,11 @@
  */
 static int CountMapSquareAround(TileIndex tile, TileType type, IndustryType industry)
 {
-	TileIndex cur_tile;
-	int dx, dy;
 	int num = 0;
 
-	for (dx = -3; dx <= 3; dx++) {
-		for (dy = -3; dy <= 3; dy++) {
-			cur_tile = TILE_MASK(tile + TileDiffXY(dx, dy));
+	for (int dx = -3; dx <= 3; dx++) {
+		for (int dy = -3; dy <= 3; dy++) {
+			TileIndex cur_tile = TILE_MASK(tile + TileDiffXY(dx, dy));
 
 			if (IsTileType(cur_tile, type)) {
 				switch (type) {
@@ -230,7 +192,6 @@
 	Town *t = st->town;
 	uint32 free_names = (uint32)-1;
 	int found;
-	uint z,z2;
 	unsigned long tmp;
 
 	{
@@ -295,14 +256,16 @@
 	}
 
 	/* check elevation compared to town */
-	z = GetTileZ(tile);
-	z2 = GetTileZ(t->xy);
-	if (z < z2) {
-		found = M(STR_SV_STNAME_VALLEY);
-		if (HASBIT(free_names, M(STR_SV_STNAME_VALLEY))) goto done;
-	} else if (z > z2) {
-		found = M(STR_SV_STNAME_HEIGHTS);
-		if (HASBIT(free_names, M(STR_SV_STNAME_HEIGHTS))) goto done;
+	{
+		uint z = GetTileZ(tile);
+		uint z2 = GetTileZ(t->xy);
+		if (z < z2) {
+			found = M(STR_SV_STNAME_VALLEY);
+			if (HASBIT(free_names, M(STR_SV_STNAME_VALLEY))) goto done;
+		} else if (z > z2) {
+			found = M(STR_SV_STNAME_HEIGHTS);
+			if (HASBIT(free_names, M(STR_SV_STNAME_HEIGHTS))) goto done;
+		}
 	}
 
 	/* check direction compared to town */
@@ -332,13 +295,14 @@
 }
 #undef M
 
-static Station* GetClosestStationFromTile(TileIndex tile, uint threshold, PlayerID owner)
+static Station* GetClosestStationFromTile(TileIndex tile)
 {
+	uint threshold = 8;
 	Station* best_station = NULL;
 	Station* st;
 
 	FOR_ALL_STATIONS(st) {
-		if ((owner == PLAYER_SPECTATOR || st->owner == owner)) {
+		if (st->facilities == 0 && st->owner == _current_player) {
 			uint cur_dist = DistanceManhattan(tile, st->xy);
 
 			if (cur_dist < threshold) {
@@ -387,9 +351,8 @@
 static uint GetAcceptanceMask(const Station *st)
 {
 	uint mask = 0;
-	uint i;
-
-	for (i = 0; i != NUM_CARGO; i++) {
+
+	for (uint i = 0; i != NUM_CARGO; i++) {
 		if (st->goods[i].waiting_acceptance & 0x8000) mask |= 1 << i;
 	}
 	return mask;
@@ -400,7 +363,7 @@
 static void ShowRejectOrAcceptNews(const Station *st, uint num_items, CargoID *cargo, StringID msg)
 {
 	for (uint i = 0; i < num_items; i++) {
-		SetDParam(i + 1, _cargoc.names_s[cargo[i]]);
+		SetDParam(i + 1, GetCargo(cargo[i])->name);
 	}
 
 	SetDParam(0, st->index);
@@ -411,35 +374,30 @@
 void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile,
 	int w, int h, int rad)
 {
-	int x,y;
-	int x1,y1,x2,y2;
-	int xc,yc;
-
 	memset(produced, 0, sizeof(AcceptedCargo));
 
-	x = TileX(tile);
-	y = TileY(tile);
+	int x = TileX(tile);
+	int y = TileY(tile);
 
 	// expand the region by rad tiles on each side
 	// while making sure that we remain inside the board.
-	x2 = min(x + w + rad, MapSizeX());
-	x1 = max(x - rad, 0);
-
-	y2 = min(y + h + rad, MapSizeY());
-	y1 = max(y - rad, 0);
+	int x2 = min(x + w + rad, MapSizeX());
+	int x1 = max(x - rad, 0);
+
+	int y2 = min(y + h + rad, MapSizeY());
+	int y1 = max(y - rad, 0);
 
 	assert(x1 < x2);
 	assert(y1 < y2);
 	assert(w > 0);
 	assert(h > 0);
 
-	for (yc = y1; yc != y2; yc++) {
-		for (xc = x1; xc != x2; xc++) {
+	for (int yc = y1; yc != y2; yc++) {
+		for (int xc = x1; xc != x2; xc++) {
 			if (!(IS_INSIDE_1D(xc, x, w) && IS_INSIDE_1D(yc, y, h))) {
-				GetProducedCargoProc *gpc;
 				TileIndex tile = TileXY(xc, yc);
 
-				gpc = _tile_type_procs[GetTileType(tile)]->get_produced_cargo_proc;
+				GetProducedCargoProc *gpc = _tile_type_procs[GetTileType(tile)]->get_produced_cargo_proc;
 				if (gpc != NULL) {
 					CargoID cargos[2] = { CT_INVALID, CT_INVALID };
 
@@ -460,37 +418,32 @@
 void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile,
 	int w, int h, int rad)
 {
-	int x,y;
-	int x1,y1,x2,y2;
-	int xc,yc;
-
 	memset(accepts, 0, sizeof(AcceptedCargo));
 
-	x = TileX(tile);
-	y = TileY(tile);
+	int x = TileX(tile);
+	int y = TileY(tile);
 
 	// expand the region by rad tiles on each side
 	// while making sure that we remain inside the board.
-	x2 = min(x + w + rad, MapSizeX());
-	y2 = min(y + h + rad, MapSizeY());
-	x1 = max(x - rad, 0);
-	y1 = max(y - rad, 0);
+	int x2 = min(x + w + rad, MapSizeX());
+	int y2 = min(y + h + rad, MapSizeY());
+	int x1 = max(x - rad, 0);
+	int y1 = max(y - rad, 0);
 
 	assert(x1 < x2);
 	assert(y1 < y2);
 	assert(w > 0);
 	assert(h > 0);
 
-	for (yc = y1; yc != y2; yc++) {
-		for (xc = x1; xc != x2; xc++) {
+	for (int yc = y1; yc != y2; yc++) {
+		for (int xc = x1; xc != x2; xc++) {
 			TileIndex tile = TileXY(xc, yc);
 
 			if (!IsTileType(tile, MP_STATION)) {
 				AcceptedCargo ac;
-				uint i;
 
 				GetAcceptedCargo(tile, ac);
-				for (i = 0; i < lengthof(ac); ++i) accepts[i] += ac[i];
+				for (uint i = 0; i < lengthof(ac); ++i) accepts[i] += ac[i];
 			}
 		}
 	}
@@ -518,21 +471,17 @@
 // show_msg controls whether to display a message that acceptance was changed.
 static void UpdateStationAcceptance(Station *st, bool show_msg)
 {
-	uint old_acc, new_acc;
-	const RoadStop *cur_rs;
-	int i;
+	// Don't update acceptance for a buoy
+	if (st->IsBuoy()) return;
+
 	ottd_Rectangle rect;
-	int rad;
-	AcceptedCargo accepts;
-
 	rect.min_x = MapSizeX();
 	rect.min_y = MapSizeY();
-	rect.max_x = rect.max_y = 0;
-	// Don't update acceptance for a buoy
-	if (st->IsBuoy()) return;
+	rect.max_x = 0;
+	rect.max_y = 0;
 
 	/* old accepted goods types */
-	old_acc = GetAcceptanceMask(st);
+	uint old_acc = GetAcceptanceMask(st);
 
 	// Put all the tiles that span an area in the table.
 	if (st->train_tile != 0) {
@@ -553,31 +502,30 @@
 
 	if (st->dock_tile != 0) MergePoint(&rect, st->dock_tile);
 
-	for (cur_rs = st->bus_stops; cur_rs != NULL; cur_rs = cur_rs->next) {
-		MergePoint(&rect, cur_rs->xy);
+	for (const RoadStop *rs = st->bus_stops; rs != NULL; rs = rs->next) {
+		MergePoint(&rect, rs->xy);
 	}
 
-	for (cur_rs = st->truck_stops; cur_rs != NULL; cur_rs = cur_rs->next) {
-		MergePoint(&rect, cur_rs->xy);
+	for (const RoadStop *rs = st->truck_stops; rs != NULL; rs = rs->next) {
+		MergePoint(&rect, rs->xy);
 	}
 
-	rad = (_patches.modified_catchment) ? FindCatchmentRadius(st) : 4;
-
 	// And retrieve the acceptance.
+	AcceptedCargo accepts;
 	if (rect.max_x >= rect.min_x) {
 		GetAcceptanceAroundTiles(
 			accepts,
 			TileXY(rect.min_x, rect.min_y),
 			rect.max_x - rect.min_x + 1,
 			rect.max_y - rect.min_y + 1,
-			rad
+			_patches.modified_catchment ? FindCatchmentRadius(st) : 4
 		);
 	} else {
 		memset(accepts, 0, sizeof(accepts));
 	}
 
 	// Adjust in case our station only accepts fewer kinds of goods
-	for (i = 0; i != NUM_CARGO; i++) {
+	for (uint i = 0; i != NUM_CARGO; i++) {
 		uint amt = min(accepts[i], 15);
 
 		// Make sure the station can accept the goods type.
@@ -589,7 +537,7 @@
 	}
 
 	// Only show a message in case the acceptance was actually changed.
-	new_acc = GetAcceptanceMask(st);
+	uint new_acc = GetAcceptanceMask(st);
 	if (old_acc == new_acc)
 		return;
 
@@ -638,7 +586,7 @@
 
 static void UpdateStationSignCoord(Station *st)
 {
-	StationRect *r = &st->rect;
+	const StationRect *r = &st->rect;
 
 	if (r->IsEmpty()) return; // no tiles belong to this station
 
@@ -667,21 +615,18 @@
 // Or an error code if it failed.
 int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID* station)
 {
-	int32 cost = 0, ret;
-
-	Slope tileh;
-	uint z;
+	int32 cost = 0;
 	int allowed_z = -1;
-	int flat_z;
-
-	BEGIN_TILE_LOOP(tile_cur, w, h, tile)
+
+	BEGIN_TILE_LOOP(tile_cur, w, h, tile) {
 		if (MayHaveBridgeAbove(tile_cur) && IsBridgeAbove(tile_cur)) {
 			return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
 		}
 
 		if (!EnsureNoVehicle(tile_cur)) return CMD_ERROR;
 
-		tileh = GetTileSlope(tile_cur, &z);
+		uint z;
+		Slope tileh = GetTileSlope(tile_cur, &z);
 
 		/* Prohibit building if
 		 *   1) The tile is "steep" (i.e. stretches two height levels)
@@ -696,7 +641,7 @@
 			return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 		}
 
-		flat_z = z;
+		int flat_z = z;
 		if (tileh != SLOPE_FLAT) {
 			// need to check so the entrance to the station is not pointing at a slope.
 			if ((invalid_dirs&1 && !(tileh & SLOPE_NE) && (uint)w_cur == w) ||
@@ -732,18 +677,19 @@
 				}
 			}
 		} else {
-			ret = DoCommand(tile_cur, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+			int32 ret = DoCommand(tile_cur, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 			if (CmdFailed(ret)) return ret;
 			cost += ret;
 		}
-	END_TILE_LOOP(tile_cur, w, h, tile)
+	} END_TILE_LOOP(tile_cur, w, h, tile)
 
 	return cost;
 }
 
-static bool CanExpandRailroadStation(Station* st, uint* fin, Axis axis)
+static bool CanExpandRailroadStation(const Station* st, uint* fin, Axis axis)
 {
-	uint curw = st->trainst_w, curh = st->trainst_h;
+	uint curw = st->trainst_w;
+	uint curh = st->trainst_h;
 	TileIndex tile = fin[0];
 	uint w = fin[1];
 	uint h = fin[2];
@@ -842,7 +788,7 @@
 /** Build railroad station
  * @param tile_org starting position of station dragging/placement
  * @param p1 various bitstuffed elements
- * - p1 = (bit  0)    - orientation (p1 & 1)
+ * - p1 = (bit  0)    - orientation (Axis)
  * - p1 = (bit  8-15) - number of tracks
  * - p1 = (bit 16-23) - platform length
  * @param p2 various bitstuffed elements
@@ -852,15 +798,8 @@
  */
 int32 CmdBuildRailroadStation(TileIndex tile_org, uint32 flags, uint32 p1, uint32 p2)
 {
-	Station *st;
 	int w_org, h_org;
-	int32 cost, ret;
-	StationID est;
-	int plat_len, numtracks;
-	Axis axis;
-	uint finalvalues[3];
-	const StationSpec *statspec;
-	int specindex;
+	int32 ret;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
@@ -869,10 +808,9 @@
 	if (!ValParamRailtype(p2 & 0xF)) return CMD_ERROR;
 
 	/* unpack parameters */
-	axis = (Axis)(p1 & 1);
-	numtracks = GB(p1,  8, 8);
-	plat_len  = GB(p1, 16, 8);
-	/* w = length, h = num_tracks */
+	Axis axis = Extract<Axis, 0>(p1);
+	uint numtracks = GB(p1,  8, 8);
+	uint plat_len  = GB(p1, 16, 8);
 	if (axis == AXIS_X) {
 		w_org = plat_len;
 		h_org = numtracks;
@@ -884,27 +822,25 @@
 	if (h_org > _patches.station_spread || w_org > _patches.station_spread) return CMD_ERROR;
 
 	// these values are those that will be stored in train_tile and station_platforms
+	uint finalvalues[3];
 	finalvalues[0] = tile_org;
 	finalvalues[1] = w_org;
 	finalvalues[2] = h_org;
 
 	// Make sure the area below consists of clear tiles. (OR tiles belonging to a certain rail station)
-	est = INVALID_STATION;
+	StationID est = INVALID_STATION;
 	// If DC_EXEC is in flag, do not want to pass it to CheckFlatLandBelow, because of a nice bug
 	//  for detail info, see: https://sourceforge.net/tracker/index.php?func=detail&aid=1029064&group_id=103924&atid=636365
 	ret = CheckFlatLandBelow(tile_org, w_org, h_org, flags & ~DC_EXEC, 5 << axis, _patches.nonuniform_stations ? &est : NULL);
 	if (CmdFailed(ret)) return ret;
-	cost = ret + (numtracks * _price.train_station_track + _price.train_station_length) * plat_len;
+	int32 cost = ret + (numtracks * _price.train_station_track + _price.train_station_length) * plat_len;
 
 	// Make sure there are no similar stations around us.
-	st = GetStationAround(tile_org, w_org, h_org, est);
+	Station *st = GetStationAround(tile_org, w_org, h_org, est);
 	if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 
 	// See if there is a deleted station close to us.
-	if (st == NULL) {
-		st = GetClosestStationFromTile(tile_org, 8, _current_player);
-		if (st != NULL && st->facilities) st = NULL;
-	}
+	if (st == NULL) st = GetClosestStationFromTile(tile_org);
 
 	/* In case of new station if DC_EXEC is NOT set we still need to create the station
 	 * to test if everything is OK. In this case we need to delete it before return. */
@@ -912,7 +848,7 @@
 
 	if (st != NULL) {
 		// Reuse an existing station.
-		if (st->owner != OWNER_NONE && st->owner != _current_player)
+		if (st->owner != _current_player)
 			return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
 
 		if (st->train_tile != 0) {
@@ -945,8 +881,8 @@
 	if (GB(p2, 8, 8) >= STAT_CLASS_MAX) return CMD_ERROR;
 
 	/* Check if we can allocate a custom stationspec to this station */
-	statspec = GetCustomStationSpec((StationClassID)GB(p2, 8, 8), GB(p2, 16, 8));
-	specindex = AllocateSpecToStation(statspec, st, flags & DC_EXEC);
+	const StationSpec *statspec = GetCustomStationSpec((StationClassID)GB(p2, 8, 8), GB(p2, 16, 8));
+	int specindex = AllocateSpecToStation(statspec, st, flags & DC_EXEC);
 	if (specindex == -1) return CMD_ERROR;
 
 	if (statspec != NULL) {
@@ -1031,14 +967,13 @@
 	uint w = st->trainst_w;
 	uint h = st->trainst_h;
 	TileIndex tile = st->train_tile;
-	uint i;
 
 restart:
 
 	// too small?
 	if (w != 0 && h != 0) {
 		// check the left side, x = constant, y changes
-		for (i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(0, i));) {
+		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(0, i));) {
 			// the left side is unused?
 			if (++i == h) {
 				tile += TileDiffXY(1, 0);
@@ -1048,7 +983,7 @@
 		}
 
 		// check the right side, x = constant, y changes
-		for (i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(w - 1, i));) {
+		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(w - 1, i));) {
 			// the right side is unused?
 			if (++i == h) {
 				w--;
@@ -1057,7 +992,7 @@
 		}
 
 		// check the upper side, y = constant, x changes
-		for (i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(i, 0));) {
+		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(i, 0));) {
 			// the left side is unused?
 			if (++i == w) {
 				tile += TileDiffXY(0, 1);
@@ -1067,7 +1002,7 @@
 		}
 
 		// check the lower side, y = constant, x changes
-		for (i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(i, h - 1));) {
+		for (uint i = 0; !st->TileBelongsToRailStation(tile + TileDiffXY(i, h - 1));) {
 			// the left side is unused?
 			if (++i == w) {
 				h--;
@@ -1091,13 +1026,11 @@
  */
 int32 CmdRemoveFromRailroadStation(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Station *st;
-
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	// make sure the specified tile belongs to the current player, and that it is a railroad station.
 	if (!IsTileType(tile, MP_STATION) || !IsRailwayStation(tile) || !_patches.nonuniform_stations) return CMD_ERROR;
-	st = GetStationByTile(tile);
+	Station *st = GetStationByTile(tile);
 	if (_current_player != OWNER_WATER && (!CheckOwnership(st->owner) || !EnsureNoVehicle(tile))) return CMD_ERROR;
 
 	// if we reached here, it means we can actually delete it. do that.
@@ -1130,9 +1063,6 @@
 
 static int32 RemoveRailroadStation(Station *st, TileIndex tile, uint32 flags)
 {
-	int w,h;
-	int32 cost = 0;
-
 	/* if there is flooding and non-uniform stations are enabled, remove platforms tile by tile */
 	if (_current_player == OWNER_WATER && _patches.nonuniform_stations)
 		return DoCommand(tile, 0, 0, DC_EXEC, CMD_REMOVE_FROM_RAILROAD_STATION);
@@ -1143,11 +1073,12 @@
 
 	/* determine width and height of platforms */
 	tile = st->train_tile;
-	w = st->trainst_w;
-	h = st->trainst_h;
+	int w = st->trainst_w;
+	int h = st->trainst_h;
 
 	assert(w != 0 && h != 0);
 
+	int32 cost = 0;
 	/* clear all areas of the station */
 	do {
 		int w_bak = w;
@@ -1239,13 +1170,10 @@
  */
 int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Station *st;
-	RoadStop *road_stop;
-	int32 cost;
-	int32 ret;
 	bool type = HASBIT(p2, 0);
 	bool is_drive_through = HASBIT(p2, 1);
 	bool build_over_road  = is_drive_through && IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL;
+	bool town_owned_road  = build_over_road && IsTileOwner(tile, OWNER_TOWN);
 	Owner cur_owner = _current_player;
 
 	/* Saveguard the parameters */
@@ -1264,23 +1192,20 @@
 
 	if (build_over_road) flags ^= DC_AUTO;
 
-	if (build_over_road && IsTileOwner(tile, OWNER_TOWN)) _current_player = OWNER_TOWN;
-	ret = CheckFlatLandBelow(tile, 1, 1, flags, is_drive_through ? 5 << p1 : 1 << p1, NULL);
+	if (town_owned_road) _current_player = OWNER_TOWN;
+	int32 ret = CheckFlatLandBelow(tile, 1, 1, flags, is_drive_through ? 5 << p1 : 1 << p1, NULL);
 	_current_player = cur_owner;
 	if (CmdFailed(ret)) return ret;
-	cost = build_over_road ? 0 : ret; // Don't add cost of clearing road when overbuilding
-
-	st = GetStationAround(tile, 1, 1, INVALID_STATION);
+	int32 cost = build_over_road ? 0 : ret; // Don't add cost of clearing road when overbuilding
+
+	Station *st = GetStationAround(tile, 1, 1, INVALID_STATION);
 	if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 
 	/* Find a station close to us */
-	if (st == NULL) {
-		st = GetClosestStationFromTile(tile, 8, _current_player);
-		if (st != NULL && st->facilities != 0) st = NULL;
-	}
+	if (st == NULL) st = GetClosestStationFromTile(tile);
 
 	//give us a road stop in the list, and check if something went wrong
-	road_stop = new RoadStop(tile);
+	RoadStop *road_stop = new RoadStop(tile);
 	if (road_stop == NULL) {
 		return_cmd_error(type ? STR_3008B_TOO_MANY_TRUCK_STOPS : STR_3008A_TOO_MANY_BUS_STOPS);
 	}
@@ -1298,7 +1223,7 @@
 	AutoPtrT<Station> st_auto_delete;
 
 	if (st != NULL) {
-		if (st->owner != OWNER_NONE && st->owner != _current_player) {
+		if (st->owner != _current_player) {
 			return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
 		}
 
@@ -1334,8 +1259,12 @@
 
 		st->rect.BeforeAddTile(tile, StationRect::ADD_TRY);
 
-		MakeRoadStop(tile, st->owner, st->index, type ? RoadStop::TRUCK : RoadStop::BUS, is_drive_through, (DiagDirection)p1);
-		if (is_drive_through & HASBIT(p2, 3)) SetStopBuiltOnTownRoad(tile);
+		RoadStop::Type rs_type = type ? RoadStop::TRUCK : RoadStop::BUS;
+		if (is_drive_through) {
+			MakeDriveThroughRoadStop(tile, st->owner, st->index, rs_type, (Axis)p1, town_owned_road);
+		} else {
+			MakeRoadStop(tile, st->owner, st->index, rs_type, (DiagDirection)p1);
+		}
 
 		UpdateStationVirtCoordDirty(st);
 		UpdateStationAcceptance(st, false);
@@ -1351,14 +1280,14 @@
 // Remove a bus station
 static int32 RemoveRoadStop(Station *st, uint32 flags, TileIndex tile)
 {
-	RoadStop **primary_stop;
-	RoadStop *cur_stop;
-	bool is_truck = IsTruckStop(tile);
-
 	if (_current_player != OWNER_WATER && !CheckOwnership(st->owner)) {
 		return CMD_ERROR;
 	}
 
+	bool is_truck = IsTruckStop(tile);
+
+	RoadStop **primary_stop;
+	RoadStop *cur_stop;
 	if (is_truck) { // truck stop
 		primary_stop = &st->truck_stops;
 		cur_stop = GetRoadStopByTile(tile, RoadStop::TRUCK);
@@ -1404,21 +1333,15 @@
  */
 int32 CmdRemoveRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Station* st;
-	bool is_drive_through;
-	bool is_towns_road = false;
-	RoadBits road_bits;
-	int32 ret;
-
 	/* Make sure the specified tile is a road stop of the correct type */
 	if (!IsTileType(tile, MP_STATION) || !IsRoadStop(tile) || (uint32)GetRoadStopType(tile) != p2) return CMD_ERROR;
-	st = GetStationByTile(tile);
+	Station *st = GetStationByTile(tile);
 	/* Save the stop info before it is removed */
-	is_drive_through = IsDriveThroughStopTile(tile);
-	road_bits = GetAnyRoadBits(tile);
-	if (is_drive_through) is_towns_road = GetStopBuiltOnTownRoad(tile);
-
-	ret = RemoveRoadStop(st, flags, tile);
+	bool is_drive_through = IsDriveThroughStopTile(tile);
+	RoadBits road_bits = GetAnyRoadBits(tile);
+	bool is_towns_road = is_drive_through && GetStopBuiltOnTownRoad(tile);
+
+	int32 ret = RemoveRoadStop(st, flags, tile);
 
 	/* If the stop was a drive-through stop replace the road */
 	if ((flags & DC_EXEC) && !CmdFailed(ret) && is_drive_through) {
@@ -1426,7 +1349,7 @@
 		Owner cur_owner = _current_player;
 
 		if (is_towns_road) {
-			index = ClosestTownFromTile(tile, _patches.dist_local_authority)->index;
+			index = ClosestTownFromTile(tile, (uint)-1)->index;
 			_current_player = OWNER_TOWN;
 		}
 		DoCommand(tile, road_bits, index, DC_EXEC, CMD_BUILD_ROAD);
@@ -1535,13 +1458,7 @@
  */
 int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Town *t;
-	Station *st;
-	int32 cost;
-	int32 ret;
-	int w, h;
 	bool airport_upgrade = true;
-	const AirportFTAClass* afc;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
@@ -1551,11 +1468,12 @@
 	if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile))
 		return CMD_ERROR;
 
-	t = ClosestTownFromTile(tile, (uint)-1);
+	Town *t = ClosestTownFromTile(tile, (uint)-1);
 
 	/* Check if local auth refuses a new airport */
 	{
 		uint num = 0;
+		const Station *st;
 		FOR_ALL_STATIONS(st) {
 			if (st->town == t && st->facilities&FACIL_AIRPORT && st->airport_type != AT_OILRIG)
 				num++;
@@ -1566,22 +1484,19 @@
 		}
 	}
 
-	afc = GetAirport(p1);
-	w = afc->size_x;
-	h = afc->size_y;
-
-	ret = CheckFlatLandBelow(tile, w, h, flags, 0, NULL);
+	const AirportFTAClass *afc = GetAirport(p1);
+	int w = afc->size_x;
+	int h = afc->size_y;
+
+	int32 ret = CheckFlatLandBelow(tile, w, h, flags, 0, NULL);
 	if (CmdFailed(ret)) return ret;
-	cost = ret;
-
-	st = GetStationAround(tile, w, h, INVALID_STATION);
+	int32 cost = ret;
+
+	Station *st = GetStationAround(tile, w, h, INVALID_STATION);
 	if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 
 	/* Find a station close to us */
-	if (st == NULL) {
-		st = GetClosestStationFromTile(tile, 8, _current_player);
-		if (st != NULL && st->facilities) st = NULL;
-	}
+	if (st == NULL) st = GetClosestStationFromTile(tile);
 
 	if (w > _patches.station_spread || h > _patches.station_spread) {
 		_error_message = STR_306C_STATION_TOO_SPREAD_OUT;
@@ -1593,7 +1508,7 @@
 	AutoPtrT<Station> st_auto_delete;
 
 	if (st != NULL) {
-		if (st->owner != OWNER_NONE && st->owner != _current_player)
+		if (st->owner != _current_player)
 			return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
 
 		if (!st->rect.BeforeAddRect(tile, w, h, StationRect::ADD_TEST)) return CMD_ERROR;
@@ -1618,10 +1533,11 @@
 
 		st->sign.width_1 = 0;
 
-		// if airport type equals Heliport then generate
-		// type 5 name, which is heliport, otherwise airport names (1)
-		if (!GenerateStationName(st, tile, (p1 == AT_HELIPORT)||(p1 == AT_HELIDEPOT)||(p1 == AT_HELISTATION) ? 5 : 1))
+		/* If only helicopters may use the airport generate a helicopter related (5)
+		 * station name, otherwise generate a normal airport name (1) */
+		if (!GenerateStationName(st, tile, !(afc->flags & AirportFTAClass::AIRPLANES) ? 5 : 1)) {
 			return CMD_ERROR;
+		}
 	}
 
 	cost += _price.build_airport * w * h;
@@ -1664,20 +1580,16 @@
 
 static int32 RemoveAirport(Station *st, uint32 flags)
 {
-	TileIndex tile;
-	int w,h;
-	int32 cost;
-
 	if (_current_player != OWNER_WATER && !CheckOwnership(st->owner))
 		return CMD_ERROR;
 
-	tile = st->airport_tile;
+	TileIndex tile = st->airport_tile;
 
 	const AirportFTAClass *afc = st->Airport();
-	w = afc->size_x;
-	h = afc->size_y;
-
-	cost = w * h * _price.remove_airport;
+	int w = afc->size_x;
+	int h = afc->size_y;
+
+	int32 cost = w * h * _price.remove_airport;
 
 	BEGIN_TILE_LOOP(tile_cur, w, h, tile) {
 		if (!EnsureNoVehicle(tile_cur)) return CMD_ERROR;
@@ -1689,9 +1601,7 @@
 	} END_TILE_LOOP(tile_cur, w,h,tile)
 
 	if (flags & DC_EXEC) {
-		uint i;
-
-		for (i = 0; i < afc->nof_depots; ++i) {
+		for (uint i = 0; i < afc->nof_depots; ++i) {
 			DeleteWindowById(
 				WC_VEHICLE_DEPOT, tile + ToTileIndexDiff(afc->airport_depots[i])
 			);
@@ -1716,14 +1626,12 @@
  */
 int32 CmdBuildBuoy(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Station *st;
-
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	if (!IsClearWaterTile(tile) || tile == 0) return_cmd_error(STR_304B_SITE_UNSUITABLE);
 
 	/* allocate and initialize new station */
-	st = new Station(tile);
+	Station *st = new Station(tile);
 	if (st == NULL) return CMD_ERROR;
 
 	/* ensure that in case of error (or no DC_EXEC) the station gets deleted upon return */
@@ -1776,12 +1684,10 @@
 
 static int32 RemoveBuoy(Station *st, uint32 flags)
 {
-	TileIndex tile;
-
 	/* XXX: strange stuff */
 	if (!IsValidPlayer(_current_player))  return_cmd_error(INVALID_STRING_ID);
 
-	tile = st->dock_tile;
+	TileIndex tile = st->dock_tile;
 
 	if (CheckShipsOnBuoy(st))   return_cmd_error(STR_BUOY_IS_IN_USE);
 	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
@@ -1827,13 +1733,11 @@
  */
 int32 CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	TileIndex tile_cur;
-	DiagDirection direction;
 	int32 cost;
-	Station *st;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
+	DiagDirection direction;
 	switch (GetTileSlope(tile, NULL)) {
 		case SLOPE_SW: direction = DIAGDIR_NE; break;
 		case SLOPE_SE: direction = DIAGDIR_NW; break;
@@ -1844,14 +1748,10 @@
 
 	if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile)) return CMD_ERROR;
 
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
-
 	cost = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(cost)) return CMD_ERROR;
 
-	tile_cur = tile + TileOffsByDiagDir(direction);
-
-	if (!EnsureNoVehicle(tile_cur)) return CMD_ERROR;
+	TileIndex tile_cur = tile + TileOffsByDiagDir(direction);
 
 	if (!IsTileType(tile_cur, MP_WATER) || GetTileSlope(tile_cur, NULL) != SLOPE_FLAT) {
 		return_cmd_error(STR_304B_SITE_UNSUITABLE);
@@ -1866,23 +1766,20 @@
 	}
 
 	/* middle */
-	st = GetStationAround(
+	Station *st = GetStationAround(
 		tile + ToTileIndexDiff(_dock_tileoffs_chkaround[direction]),
 		_dock_w_chk[direction], _dock_h_chk[direction], INVALID_STATION);
 	if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
 
 	/* Find a station close to us */
-	if (st == NULL) {
-		st = GetClosestStationFromTile(tile, 8, _current_player);
-		if (st!=NULL && st->facilities) st = NULL;
-	}
+	if (st == NULL) st = GetClosestStationFromTile(tile);
 
 	/* In case of new station if DC_EXEC is NOT set we still need to create the station
 	* to test if everything is OK. In this case we need to delete it before return. */
 	AutoPtrT<Station> st_auto_delete;
 
 	if (st != NULL) {
-		if (st->owner != OWNER_NONE && st->owner != _current_player)
+		if (st->owner != _current_player)
 			return_cmd_error(STR_3009_TOO_CLOSE_TO_ANOTHER_STATION);
 
 		if (!st->rect.BeforeAddRect(tile, _dock_w_chk[direction], _dock_h_chk[direction], StationRect::ADD_TEST)) return CMD_ERROR;
@@ -1927,13 +1824,10 @@
 
 static int32 RemoveDock(Station *st, uint32 flags)
 {
-	TileIndex tile1;
-	TileIndex tile2;
-
 	if (!CheckOwnership(st->owner)) return CMD_ERROR;
 
-	tile1 = st->dock_tile;
-	tile2 = tile1 + TileOffsByDiagDir(GetDockDirection(tile1));
+	TileIndex tile1 = st->dock_tile;
+	TileIndex tile2 = tile1 + TileOffsByDiagDir(GetDockDirection(tile1));
 
 	if (!EnsureNoVehicle(tile1)) return CMD_ERROR;
 	if (!EnsureNoVehicle(tile2)) return CMD_ERROR;
@@ -1969,7 +1863,6 @@
 
 static void DrawTile_Station(TileInfo *ti)
 {
-	const DrawTileSeqStruct *dtss;
 	const DrawTileSprites *t = NULL;
 	RailType railtype = GetRailType(ti->tile);
 	const RailtypeInfo *rti = GetRailTypeInfo(railtype);
@@ -1977,9 +1870,8 @@
 	const Station *st = NULL;
 	const StationSpec *statspec = NULL;
 	PlayerID owner = GetTileOwner(ti->tile);
-	SpriteID image;
+
 	SpriteID palette;
-
 	if (IsValidPlayer(owner)) {
 		palette = PLAYER_SPRITE_COLOR(owner);
 	} else {
@@ -2017,7 +1909,7 @@
 
 	if (t == NULL || t->seq == NULL) t = &_station_display_datas[GetStationGfx(ti->tile)];
 
-	image = t->ground_sprite;
+	SpriteID image = t->ground_sprite;
 	if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
 		image += GetCustomStationGroundRelocation(statspec, st, ti->tile);
 		image += rti->custom_ground_offset;
@@ -2033,9 +1925,8 @@
 
 	if (IsBuoyTile(ti->tile) && (ti->z != 0 || !IsTileOwner(ti->tile, OWNER_WATER))) DrawCanalWater(ti->tile);
 
+	const DrawTileSeqStruct *dtss;
 	foreach_draw_tile_seq(dtss, t->seq) {
-		SpriteID pal;
-
 		image = dtss->image;
 		if (relocation == 0 || HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
 			image += rti->total_offset;
@@ -2043,6 +1934,7 @@
 			image += relocation;
 		}
 
+		SpriteID pal;
 		if (_display_opt & DO_TRANS_BUILDINGS) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
@@ -2067,18 +1959,14 @@
 
 void StationPickerDrawSprite(int x, int y, RailType railtype, int image)
 {
-	SpriteID pal, img;
-	const DrawTileSeqStruct *dtss;
-	const DrawTileSprites *t;
 	const RailtypeInfo *rti = GetRailTypeInfo(railtype);
-
-	pal = PLAYER_SPRITE_COLOR(_local_player);
-
-	t = &_station_display_datas[image];
-
-	img = t->ground_sprite;
+	SpriteID pal = PLAYER_SPRITE_COLOR(_local_player);
+	const DrawTileSprites *t = &_station_display_datas[image];
+
+	SpriteID img = t->ground_sprite;
 	DrawSprite(img + rti->total_offset, HASBIT(img, PALETTE_MODIFIER_COLOR) ? pal : PAL_NONE, x, y);
 
+	const DrawTileSeqStruct *dtss;
 	foreach_draw_tile_seq(dtss, t->seq) {
 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
 		DrawSprite(dtss->image + rti->total_offset, pal, x + pt.x, y + pt.y);
@@ -2102,11 +1990,10 @@
 
 static void GetTileDesc_Station(TileIndex tile, TileDesc *td)
 {
-	StringID str;
-
 	td->owner = GetTileOwner(tile);
 	td->build_date = GetStationByTile(tile)->build_date;
 
+	StringID str;
 	switch (GetStationType(tile)) {
 		default: NOT_REACHED();
 		case STATION_RAIL:    str = STR_305E_RAILROAD_STATION; break;
@@ -2200,9 +2087,8 @@
 	};
 
 	StationGfx gfx = GetStationGfx(tile);
-	const AnimData* i;
-
-	for (i = data; i != endof(data); i++) {
+
+	for (const AnimData *i = data; i != endof(data); i++) {
 		if (i->from <= gfx && gfx <= i->to) {
 			if ((_tick_counter & i->delay) == 0) {
 				SetStationGfx(tile, gfx < i->to ? gfx + 1 : i->from);
@@ -2244,7 +2130,7 @@
 					x &= 0xF;
 					y &= 0xF;
 
-					if (DiagDirToAxis(dir) != AXIS_X) intswap(x, y);
+					if (DiagDirToAxis(dir) != AXIS_X) Swap(x, y);
 					if (y == TILE_SIZE / 2) {
 						if (dir != DIAGDIR_SE && dir != DIAGDIR_SW) x = TILE_SIZE - 1 - x;
 						if (x == 12) return VETSB_ENTERED_STATION | (station_id << VETS_STATION_ID_OFFSET); /* enter station */
@@ -2260,7 +2146,7 @@
 			}
 		}
 	} else if (v->type == VEH_Road) {
-		if (v->u.road.state < RVSB_IN_ROAD_STOP && v->u.road.frame == 0) {
+		if (v->u.road.state < RVSB_IN_ROAD_STOP && !IsReversingRoadTrackdir((Trackdir)v->u.road.state) && v->u.road.frame == 0) {
 			if (IsRoadStop(tile)) {
 				/* Attempt to allocate a parking bay in a road stop */
 				RoadStop *rs = GetRoadStopByTile(tile, GetRoadStopType(tile));
@@ -2317,22 +2203,18 @@
 
 static void UpdateStationRating(Station *st)
 {
-	GoodsEntry *ge;
-	int rating;
-	StationID index;
-	int waiting;
 	bool waiting_changed = false;
 
 	byte_inc_sat(&st->time_since_load);
 	byte_inc_sat(&st->time_since_unload);
 
-	ge = st->goods;
+	GoodsEntry *ge = st->goods;
 	do {
 		if (ge->enroute_from != INVALID_STATION) {
 			byte_inc_sat(&ge->enroute_time);
 			byte_inc_sat(&ge->days_since_pickup);
 
-			rating = 0;
+			int rating = 0;
 
 			{
 				int b = ge->last_speed;
@@ -2361,15 +2243,13 @@
 				(rating += 35, true);
 			}
 
-			{
-				waiting = GB(ge->waiting_acceptance, 0, 12);
-				(rating -= 90, waiting > 1500) ||
-				(rating += 55, waiting > 1000) ||
-				(rating += 35, waiting > 600) ||
-				(rating += 10, waiting > 300) ||
-				(rating += 20, waiting > 100) ||
-				(rating += 10, true);
-			}
+			int waiting = GB(ge->waiting_acceptance, 0, 12);
+			(rating -= 90, waiting > 1500) ||
+			(rating += 55, waiting > 1000) ||
+			(rating += 35, waiting > 600) ||
+			(rating += 10, waiting > 300) ||
+			(rating += 20, waiting > 100) ||
+			(rating += 10, true);
 
 			{
 				int or_ = ge->rating; // old rating
@@ -2399,8 +2279,7 @@
 		}
 	} while (++ge != endof(st->goods));
 
-	index = st->index;
-
+	StationID index = st->index;
 	if (waiting_changed) {
 		InvalidateWindow(WC_STATION_VIEW, index);
 	} else {
@@ -2411,11 +2290,9 @@
 /* called for every station each tick */
 static void StationHandleSmallTick(Station *st)
 {
-	byte b;
-
 	if (st->facilities == 0) return;
 
-	b = st->delete_ctr + 1;
+	byte b = st->delete_ctr + 1;
 	if (b >= 185) b = 0;
 	st->delete_ctr = b;
 
@@ -2424,19 +2301,15 @@
 
 void OnTick_Station(void)
 {
-	uint i;
-	Station *st;
-
 	if (_game_mode == GM_EDITOR) return;
 
-	i = _station_tick_ctr;
+	uint i = _station_tick_ctr;
 	if (++_station_tick_ctr > GetMaxStationIndex()) _station_tick_ctr = 0;
 
 	if (IsValidStationID(i)) StationHandleBigTick(GetStation(i));
 
-	FOR_ALL_STATIONS(st) {
-		StationHandleSmallTick(st);
-	}
+	Station *st;
+	FOR_ALL_STATIONS(st) StationHandleSmallTick(st);
 }
 
 void StationMonthlyLoop(void)
@@ -2451,9 +2324,7 @@
 	FOR_ALL_STATIONS(st) {
 		if (st->owner == owner &&
 				DistanceManhattan(tile, st->xy) <= radius) {
-			uint i;
-
-			for (i = 0; i != NUM_CARGO; i++) {
+			for (uint i = 0; i != NUM_CARGO; i++) {
 				GoodsEntry* ge = &st->goods[i];
 
 				if (ge->enroute_from != INVALID_STATION) {
@@ -2484,15 +2355,12 @@
  */
 int32 CmdRenameStation(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	StringID str;
-	Station *st;
-
 	if (!IsValidStationID(p1) || _cmd_text[0] == '\0') return CMD_ERROR;
-	st = GetStation(p1);
+	Station *st = GetStation(p1);
 
 	if (!CheckOwnership(st->owner)) return CMD_ERROR;
 
-	str = AllocateNameUnique(_cmd_text, 6);
+	StringID str = AllocateNameUnique(_cmd_text, 6);
 	if (str == 0) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
@@ -2514,18 +2382,12 @@
 uint MoveGoodsToStation(TileIndex tile, int w, int h, int type, uint amount)
 {
 	Station* around[8];
-	uint i;
-	uint moved;
-	uint best_rating, best_rating2;
-	Station *st1, *st2;
-	uint t;
-	int rad = 0;
+
+	for (uint i = 0; i < lengthof(around); i++) around[i] = NULL;
+
 	int w_prod; //width and height of the "producer" of the cargo
 	int h_prod;
 	int max_rad;
-
-	for (i = 0; i < lengthof(around); i++) around[i] = NULL;
-
 	if (_patches.modified_catchment) {
 		w_prod = w;
 		h_prod = h;
@@ -2541,14 +2403,12 @@
 	}
 
 	BEGIN_TILE_LOOP(cur_tile, w, h, tile - TileDiffXY(max_rad, max_rad))
-		Station* st;
-
 		cur_tile = TILE_MASK(cur_tile);
 		if (!IsTileType(cur_tile, MP_STATION)) continue;
 
-		st = GetStationByTile(cur_tile);
-
-		for (i = 0; i != lengthof(around); i++) {
+		Station *st = GetStationByTile(cur_tile);
+
+		for (uint i = 0; i != lengthof(around); i++) {
 			if (around[i] == NULL) {
 				if (!st->IsBuoy() &&
 						(st->town->exclusive_counter == 0 || st->town->exclusivity == st->owner) && // check exclusive transport rights
@@ -2556,9 +2416,6 @@
 						(!_patches.selectgoods || st->goods[type].last_speed > 0) && // if last_speed is 0, no vehicle has been there.
 						((st->facilities & ~FACIL_BUS_STOP)   != 0 || type == CT_PASSENGERS) && // if we have other fac. than a bus stop, or the cargo is passengers
 						((st->facilities & ~FACIL_TRUCK_STOP) != 0 || type != CT_PASSENGERS)) { // if we have other fac. than a cargo bay or the cargo is not passengers
-					int x_dist;
-					int y_dist;
-
 					if (_patches.modified_catchment) {
 						// min and max coordinates of the producer relative
 						const int x_min_prod = 9;
@@ -2566,27 +2423,26 @@
 						const int y_min_prod = 9;
 						const int y_max_prod = 8 + h_prod;
 
-						rad = FindCatchmentRadius(st);
-
-						x_dist = min(w_cur - x_min_prod, x_max_prod - w_cur);
+						int rad = FindCatchmentRadius(st);
+
+						int x_dist = min(w_cur - x_min_prod, x_max_prod - w_cur);
 						if (w_cur < x_min_prod) {
 							x_dist = x_min_prod - w_cur;
 						} else if (w_cur > x_max_prod) {
 							x_dist = w_cur - x_max_prod;
 						}
 
-						y_dist = min(h_cur - y_min_prod, y_max_prod - h_cur);
+						int y_dist = min(h_cur - y_min_prod, y_max_prod - h_cur);
 						if (h_cur < y_min_prod) {
 							y_dist = y_min_prod - h_cur;
 						} else if (h_cur > y_max_prod) {
 							y_dist = h_cur - y_max_prod;
 						}
-					} else {
-						x_dist = 0;
-						y_dist = 0;
+
+						if (x_dist > rad || y_dist > rad) break;
 					}
 
-					if (x_dist <= rad && y_dist <= rad) around[i] = st;
+					around[i] = st;
 				}
 				break;
 			} else if (around[i] == st) {
@@ -2600,16 +2456,18 @@
 
 	if (around[1] == NULL) {
 		/* only one station around */
-		moved = (amount * around[0]->goods[type].rating >> 8) + 1;
+		uint moved = (amount * around[0]->goods[type].rating >> 8) + 1;
 		UpdateStationWaiting(around[0], type, moved);
 		return moved;
 	}
 
 	/* several stations around, find the two with the highest rating */
-	st2 = st1 = NULL;
-	best_rating = best_rating2 = 0;
-
-	for (i = 0; i != lengthof(around) && around[i] != NULL; i++) {
+	Station *st1 = NULL;
+	Station *st2 = NULL;
+	uint best_rating  = 0;
+	uint best_rating2 = 0;
+
+	for (uint i = 0; i != lengthof(around) && around[i] != NULL; i++) {
 		if (around[i]->goods[type].rating >= best_rating) {
 			best_rating2 = best_rating;
 			st2 = st1;
@@ -2630,9 +2488,9 @@
 	best_rating2 >>= 1;
 
 	/* amount given to station 1 */
-	t = (best_rating * (amount + 1)) / (best_rating + best_rating2);
-
-	moved = 0;
+	uint t = (best_rating * (amount + 1)) / (best_rating + best_rating2);
+
+	uint moved = 0;
 	if (t != 0) {
 		moved = t * best_rating / 256 + 1;
 		amount -= t;
@@ -2650,7 +2508,6 @@
 
 void BuildOilRig(TileIndex tile)
 {
-	uint j;
 	Station *st = new Station();
 
 	if (st == NULL) {
@@ -2684,7 +2541,7 @@
 	st->facilities = FACIL_AIRPORT | FACIL_DOCK;
 	st->build_date = _date;
 
-	for (j = 0; j != NUM_CARGO; j++) {
+	for (uint j = 0; j != NUM_CARGO; j++) {
 		st->goods[j].waiting_acceptance = 0;
 		st->goods[j].days_since_pickup = 0;
 		st->goods[j].enroute_from = INVALID_STATION;
@@ -2724,14 +2581,33 @@
 		RebuildStationLists();
 		InvalidateWindowClasses(WC_STATION_LIST);
 	} else {
-		DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+		if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile)) {
+			/* For a drive-through stop on a town-owned road remove the stop and replace the road */
+			DoCommand(tile, 0, (GetStationType(tile) == STATION_TRUCK) ? RoadStop::TRUCK : RoadStop::BUS, DC_EXEC, CMD_REMOVE_ROAD_STOP);
+		} else {
+			DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+		}
 	}
 }
 
+/**
+ * Check if a drive-through road stop tile can be cleared.
+ * Road stops built on town-owned roads check the conditions
+ * that would allow clearing of the original road.
+ * @param tile road stop tile to check
+ * @return true if the road can be cleared
+ */
+static bool CanRemoveRoadWithStop(TileIndex tile)
+{
+	/* The road can always be cleared if it was not a town-owned road */
+	if (!GetStopBuiltOnTownRoad(tile)) return true;
+
+	bool edge_road;
+	return CheckAllowRemoveRoad(tile, GetAnyRoadBits(tile), OWNER_TOWN, &edge_road);
+}
+
 static int32 ClearTile_Station(TileIndex tile, byte flags)
 {
-	Station *st;
-
 	if (flags & DC_AUTO) {
 		switch (GetStationType(tile)) {
 			case STATION_RAIL:    return_cmd_error(STR_300B_MUST_DEMOLISH_RAILROAD);
@@ -2746,17 +2622,17 @@
 		}
 	}
 
-	st = GetStationByTile(tile);
+	Station *st = GetStationByTile(tile);
 
 	switch (GetStationType(tile)) {
 		case STATION_RAIL:    return RemoveRailroadStation(st, tile, flags);
 		case STATION_AIRPORT: return RemoveAirport(st, flags);
 		case STATION_TRUCK:
-			if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile))
+			if (IsDriveThroughStopTile(tile) && !CanRemoveRoadWithStop(tile))
 				return_cmd_error(STR_3047_MUST_DEMOLISH_TRUCK_STATION);
 			return RemoveRoadStop(st, flags, tile);
 		case STATION_BUS:
-			if (IsDriveThroughStopTile(tile) && GetStopBuiltOnTownRoad(tile))
+			if (IsDriveThroughStopTile(tile) && !CanRemoveRoadWithStop(tile))
 				return_cmd_error(STR_3046_MUST_DEMOLISH_BUS_STATION);
 			return RemoveRoadStop(st, flags, tile);
 		case STATION_BUOY:    return RemoveBuoy(st, flags);
@@ -2784,24 +2660,15 @@
 
 void AfterLoadStations(void)
 {
+	/* Update the speclists of all stations to point to the currently loaded custom stations. */
 	Station *st;
-	uint i;
-	TileIndex tile;
-
-	/* Update the speclists of all stations to point to the currently loaded custom stations. */
 	FOR_ALL_STATIONS(st) {
-		for (i = 0; i < st->num_specs; i++) {
+		for (uint i = 0; i < st->num_specs; i++) {
 			if (st->speclist[i].grfid == 0) continue;
 
 			st->speclist[i].spec = GetCustomStationSpecByGrf(st->speclist[i].grfid, st->speclist[i].localidx);
 		}
 	}
-
-	for (tile = 0; tile < MapSize(); tile++) {
-		if (GetTileType(tile) != MP_STATION) continue;
-		st = GetStationByTile(tile);
-		st->rect.BeforeAddTile(tile, StationRect::ADD_FORCE);
-	}
 }
 
 
@@ -2920,10 +2787,8 @@
 
 static void SaveLoad_STNS(Station *st)
 {
-	uint i;
-
 	SlObject(st, _station_desc);
-	for (i = 0; i != NUM_CARGO; i++) {
+	for (uint i = 0; i != NUM_CARGO; i++) {
 		SlObject(&st->goods[i], _goods_desc);
 
 		/* In older versions, enroute_from had 0xFF as INVALID_STATION, is now 0xFFFF */
@@ -2942,7 +2807,9 @@
 	if (st->num_specs != 0) {
 		/* Allocate speclist memory when loading a game */
 		if (st->speclist == NULL) st->speclist = CallocT<StationSpecList>(st->num_specs);
-		for (i = 0; i < st->num_specs; i++) SlObject(&st->speclist[i], _station_speclist_desc);
+		for (uint i = 0; i < st->num_specs; i++) {
+			SlObject(&st->speclist[i], _station_speclist_desc);
+		}
 	}
 }
 
@@ -2969,7 +2836,7 @@
 			uint w = GB(st->trainst_w, 4, 4);
 			uint h = GB(st->trainst_w, 0, 4);
 
-			if (GetRailStationAxis(st->train_tile) == AXIS_Y) uintswap(w, h);
+			if (GetRailStationAxis(st->train_tile) != AXIS_X) Swap(w, h);
 			st->trainst_w = w;
 			st->trainst_h = h;
 		}
@@ -3004,5 +2871,3 @@
 	{ 'STNS', Save_STNS,      Load_STNS,      CH_ARRAY },
 	{ 'ROAD', Save_ROADSTOP,  Load_ROADSTOP,  CH_ARRAY | CH_LAST},
 };
-
-
--- a/src/station_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/station_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -20,6 +20,7 @@
 #include "vehicle.h"
 #include "table/sprites.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 enum StationListWidgets {
 	STATIONLIST_WIDGET_CLOSEBOX = 0,
@@ -57,7 +58,10 @@
  * @param rating ratings data for that particular cargo */
 static void StationsWndShowStationRating(int x, int y, CargoID type, uint amount, byte rating)
 {
-	int colour = _cargo_colours[type];
+	const CargoSpec *cs = GetCargo(type);
+	if (!cs->IsValid()) return;
+
+	int colour = cs->rating_colour;
 	uint w = (minu(amount, 576) + 5) / 36;
 
 	/* Draw total cargo (limited) on station (fits into 16 pixels) */
@@ -73,7 +77,7 @@
 		}
 	}
 
-	DrawString(x + 1, y, _cargoc.names_short[type], 0x10);
+	DrawString(x + 1, y, cs->abbrev, 0x10);
 
 	/* Draw green/red ratings bar (fits into 14 pixels) */
 	y += 8;
@@ -321,8 +325,11 @@
 			for (i = 0; i < NUM_CARGO; i++) {
 				cg_ofst = w->IsWidgetLowered(i + STATIONLIST_WIDGET_CARGOSTART) ? 2 : 1;
 
-				GfxFillRect(x + cg_ofst, y + cg_ofst, x + cg_ofst + 10 , y + cg_ofst + 7, _cargo_colours[i]);
-				DrawStringCentered(x + 6 + cg_ofst, y + cg_ofst, _cargoc.names_short[i], 0x10);
+				const CargoSpec *cs = GetCargo(i);
+				if (cs->IsValid()) {
+					GfxFillRect(x + cg_ofst, y + cg_ofst, x + cg_ofst + 10 , y + cg_ofst + 7, cs->rating_colour);
+					DrawStringCentered(x + 6 + cg_ofst, y + cg_ofst, cs->abbrev, 0x10);
+				}
 				x += 14;
 			}
 
@@ -654,7 +661,7 @@
 			int cur_x = x;
 			num = min(num, 23);
 			do {
-				DrawSprite(_cargoc.sprites[i], PAL_NONE, cur_x, y);
+				DrawSprite(GetCargo(i)->sprite, PAL_NONE, cur_x, y);
 				cur_x += 10;
 			} while (--num);
 		}
@@ -699,7 +706,7 @@
 					*b++ = ',';
 					*b++ = ' ';
 				}
-				b = InlineString(b, _cargoc.names_s[i]);
+				b = InlineString(b, GetCargo(i)->name);
 			}
 		}
 
@@ -714,7 +721,7 @@
 		y = 77;
 		for (i = 0; i != NUM_CARGO; i++) {
 			if (st->goods[i].enroute_from != INVALID_STATION) {
-				SetDParam(0, _cargoc.names_s[i]);
+				SetDParam(0, GetCargo(i)->name);
 				SetDParam(2, st->goods[i].rating * 101 >> 8);
 				SetDParam(1, STR_3035_APPALLING + (st->goods[i].rating >> 5));
 				DrawString(8, y, STR_303D, 0);
--- a/src/station_map.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/station_map.h	Wed Feb 28 00:33:40 2007 +0000
@@ -169,11 +169,6 @@
 	return HASBIT(_m[t].m6, 3);
 }
 
-static inline void SetStopBuiltOnTownRoad(TileIndex t)
-{
-	assert(IsDriveThroughStopTile(t));
-	SETBIT(_m[t].m6, 3);
-}
 
 /**
  * Gets the direction the road stop entrance points towards.
@@ -312,13 +307,15 @@
 	SetRailType(t, rt);
 }
 
-static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, bool is_drive_through, DiagDirection d)
+static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, DiagDirection d)
 {
-	if (is_drive_through) {
-		MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE_EXT : GFX_TRUCK_BASE_EXT) + d);
-	} else {
-		MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE : GFX_TRUCK_BASE) + d);
-	}
+	MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE : GFX_TRUCK_BASE) + d);
+}
+
+static inline void MakeDriveThroughRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, Axis a, bool on_town_road)
+{
+	MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE_EXT : GFX_TRUCK_BASE_EXT) + a);
+	SB(_m[t].m6, 3, 1, on_town_road);
 }
 
 static inline void MakeAirport(TileIndex t, Owner o, StationID sid, byte section)
--- a/src/stdafx.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/stdafx.h	Wed Feb 28 00:33:40 2007 +0000
@@ -234,23 +234,12 @@
 #endif
 
 #ifndef __BEOS__
-
-/* some platforms use 4 bytes bool in C++
- * C bool has to be the same */
-#	ifndef __cplusplus
-#		ifdef FOUR_BYTE_BOOL
-			typedef unsigned long bool;
-#		else /* FOUR_BYTE_BOOL */
-			typedef unsigned char bool;
-#		endif /* FOUR_BYTE_BOOL */
-#	endif /* __cplusplus */
-
 	typedef signed char int8;
 	typedef signed short int16;
 	typedef signed int int32;
 	typedef signed __int64 int64;
 	typedef unsigned __int64 uint64;
-#endif /* __BEOS__ */
+#endif /* !__BEOS__ */
 
 #if defined(ARM) || defined(__arm__) || defined(__alpha__)
 # define OTTD_ALIGNMENT
@@ -289,24 +278,11 @@
 # define PERSONAL_DIR ""
 #endif
 
-#ifndef __cplusplus
-# ifndef __BEOS__
-   enum {
-    false = 0,
-    true = 1,
-   };
-# endif
-#endif /* __cplusplus */
-
 /* Compile time assertions */
 #ifdef __OS2__
 # define assert_compile(expr)
 #else
-# ifdef __cplusplus
-#  define assert_compile(expr) extern "C" void __ct_assert__(int a[1 - 2 * !(expr)])
-# else /* __cplusplus */
-#  define assert_compile(expr) void __ct_assert__(int a[1 - 2 * !(expr)])
-# endif /* !__cplusplus */
+# define assert_compile(expr) extern "C" void __ct_assert__(int a[1 - 2 * !(expr)])
 #endif /* __OS2__ */
 
 assert_compile(sizeof(uint32) == 4);
@@ -317,16 +293,10 @@
 #define endof(x) (&x[lengthof(x)])
 #define lastof(x) (&x[lengthof(x) - 1])
 
-#ifdef offsetof
-# undef offsetof
-#endif
-
-#ifndef __cplusplus
-# define offsetof(s,m)   (size_t)&(((s *)0)->m)
-#else /* __cplusplus */
-# define cpp_offsetof(s,m)   (((size_t)&reinterpret_cast<const volatile char&>((((s*)(char*)8)->m))) - 8)
+#define cpp_offsetof(s,m)   (((size_t)&reinterpret_cast<const volatile char&>((((s*)(char*)8)->m))) - 8)
+#ifndef offsetof
 # define offsetof(s,m)       cpp_offsetof(s, m)
-#endif /* __cplusplus */
+#endif /* offsetof */
 
 
 /* take care of some name clashes on MacOS */
--- a/src/strings.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/strings.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -17,20 +17,15 @@
 #include "industry.h"
 #include "variables.h"
 #include "newgrf_text.h"
-#include "table/landscape_const.h"
 #include "table/control_codes.h"
 #include "music.h"
 #include "date.h"
 #include "industry.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
-#ifdef WIN32
 /* for opendir/readdir/closedir */
 # include "fios.h"
-#else
-# include <sys/types.h>
-# include <dirent.h>
-#endif /* WIN32 */
 
 char _userstring[128];
 
@@ -566,7 +561,7 @@
 				// Short description of cargotypes. Layout:
 				// 8-bit = cargo type
 				// 16-bit = cargo count
-				StringID cargo_str = _cargo_types_base_values[_opt_ptr->landscape].units_volume[GetInt32(&argv)];
+				StringID cargo_str = GetCargo(GetInt32(&argv))->units_volume;
 				switch (cargo_str) {
 					case STR_TONS: {
 						int32 args[1];
@@ -690,7 +685,7 @@
 				//   8bit   - cargo type
 				//   16-bit - cargo count
 				CargoID cargo = GetInt32(&argv);
-				StringID cargo_str = (cargo == CT_INVALID) ? (StringID)STR_8838_N_A : _cargoc.names_long[cargo];
+				StringID cargo_str = (cargo == CT_INVALID) ? (StringID)STR_8838_N_A : GetCargo(cargo)->quantifier;
 				buff = GetStringWithArgs(buff, cargo_str, argv++, last);
 				break;
 			}
@@ -1164,7 +1159,7 @@
 	struct dirent *dirent;
 	int num = 0;
 
-	dir = opendir(_paths.lang_dir);
+	dir = ttd_opendir(_paths.lang_dir);
 	if (dir != NULL) {
 		while ((dirent = readdir(dir)) != NULL) {
 			const char *d_name = FS2OTTD(dirent->d_name);
--- a/src/table/animcursors.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/table/animcursors.h	Wed Feb 28 00:33:40 2007 +0000
@@ -5,9 +5,7 @@
  * Animated cursors consist of the number of sprites that are
  * displayed in a round-robin manner. Each sprite also has a time
  * associated that indicates how many ticks the corresponding sprite
- * is to be displayed. Currently all this information is recorded in a single
- * array. @todo This should be converted into an array of structs on the long run
- * All these arrays end up in an array of pointers called _animcursors.
+ * is to be displayed.
  */
 
 /** Creates two array entries that define one
@@ -15,15 +13,15 @@
  *  @param Sprite The Sprite to be displayed
  *  @param display_time The Number of ticks to display the sprite
  */
-#define ANIM_CURSOR_LINE(Sprite, display_time) Sprite, display_time,
+#define ANIM_CURSOR_LINE(Sprite, display_time) { Sprite, display_time },
 
 /** This indicates the termination of the cursor list
  */
-#define ANIM_CURSOR_END() 0xFFFF
+#define ANIM_CURSOR_END() ANIM_CURSOR_LINE(AnimCursor::LAST, 0)
 
 /** Animated cursor elements for demolishion
  */
-static const CursorID _demolish_animcursor[] = {
+static const AnimCursor _demolish_animcursor[] = {
 	ANIM_CURSOR_LINE(0x2C0, 8)
 	ANIM_CURSOR_LINE(0x2C1, 8)
 	ANIM_CURSOR_LINE(0x2C2, 8)
@@ -33,7 +31,7 @@
 
 /** Animated cursor elements for lower land
  */
-static const CursorID _lower_land_animcursor[] = {
+static const AnimCursor _lower_land_animcursor[] = {
 	ANIM_CURSOR_LINE(0x2BB, 10)
 	ANIM_CURSOR_LINE(0x2BC, 10)
 	ANIM_CURSOR_LINE(0x2BD, 29)
@@ -42,7 +40,7 @@
 
 /** Animated cursor elements for raise land
  */
-static const CursorID _raise_land_animcursor[] = {
+static const AnimCursor _raise_land_animcursor[] = {
 	ANIM_CURSOR_LINE(0x2B8, 10)
 	ANIM_CURSOR_LINE(0x2B9, 10)
 	ANIM_CURSOR_LINE(0x2BA, 29)
@@ -51,7 +49,7 @@
 
 /** Animated cursor elements for the goto icon
  */
-static const CursorID _order_goto_animcursor[] = {
+static const AnimCursor _order_goto_animcursor[] = {
 	ANIM_CURSOR_LINE(0x2CC, 10)
 	ANIM_CURSOR_LINE(0x2CD, 10)
 	ANIM_CURSOR_LINE(0x2CE, 29)
@@ -60,7 +58,7 @@
 
 /** Animated cursor elements for the build signal icon
  */
-static const CursorID _build_signals_animcursor[] = {
+static const AnimCursor _build_signals_animcursor[] = {
 	ANIM_CURSOR_LINE(0x50C, 20)
 	ANIM_CURSOR_LINE(0x50D, 20)
 	ANIM_CURSOR_END()
@@ -70,7 +68,7 @@
  *  definitions we have above. This is the only thing that is
  *  accessed directly from other files
  */
-static const CursorID * const _animcursors[] = {
+static const AnimCursor * const _animcursors[] = {
 	_demolish_animcursor,
 	_lower_land_animcursor,
 	_raise_land_animcursor,
--- a/src/table/build_industry.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/table/build_industry.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,7 @@
 /* $Id$ */
 
-
+#ifndef BUILD_INDUSTRY_H
+#define BUILD_INDUSTRY_H
 
 #define MK(x,y, m) {{x, y}, m}
 
@@ -1460,141 +1461,257 @@
 	_industry_create_table_3,
 };
 
-
-#define PAS CT_PASSENGERS
-
-#define COL CT_COAL
-#define RUB CT_RUBBER
-#define SUG CT_SUGAR
-
-#define MAL CT_MAIL
-
-#define OIL CT_OIL
-#define TOY CT_TOYS
-
-#define LIV CT_LIVESTOCK // Fruit too
-#define BAT CT_BATTERIES
-
-#define GRA CT_GRAIN
-#define WHT CT_WHEAT // Maize too
-#define TOF CT_TOFFEE
-
-#define WOD CT_WOOD
-#define CLA CT_COLA
-
-#define IRN CT_IRON_ORE
-#define COP CT_COPPER_ORE
-#define CCY CT_COTTON_CANDY
-
-#define STL CT_STEEL
-#define PAP CT_PAPER
-#define WAT CT_WATER
-#define BBL CT_BUBBLES
-
-#define VAL CT_VALUABLES
-#define GLD CT_GOLD // Diamonds too
-#define PLC CT_PLASTIC
-
-#define INV CT_INVALID
-
-static const CargoID _industry_section_accepts_1[] = {
-	INV, INV, INV, PAS, INV, INV, INV, INV,
-	PAS, INV, INV, PAS, PAS, PAS, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, PAS,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, PAS, PAS, INV, INV, INV, INV, GRA,
-	GRA, GRA, GRA, INV, INV, INV, INV, INV,
-	INV, INV, PAS, PAS, PAS, PAS, PAS, PAS,
-	PAS, PAS, PAS, PAS, WHT, WHT, WHT, WHT,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, COP, COP, COP, COP, INV, INV, INV,
-	INV, INV, INV, CCY, CCY, CCY, CCY, INV,
-	INV, INV, INV, INV, INV, INV, BAT, BAT,
-	BAT, BAT, BAT, BAT, INV, INV, INV, INV,
-	INV, INV, INV, INV, BBL, BBL, BBL, BBL,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV
-};
-
+#define MK(c1, c2, c3, sl) \
+	{{c1, c2, c3}, sl}
 
-static const CargoID _industry_section_accepts_2[] = {
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, STL,
-	STL, STL, STL, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, WOD, WOD, WOD, WOD, INV, INV, INV,
-	INV, INV, INV, TOF, TOF, TOF, TOF, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV
-};
+static const IndustryTileSpec _industry_tile_specs[] = {
+	/* Coal Mine */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
 
-static const CargoID _industry_section_accepts_3[] = {
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	COL, INV, INV, INV, INV, WOD, INV, INV,
-	INV, INV, INV, INV, OIL, INV, INV, INV,
-	PAS, MAL, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, LIV,
-	LIV, LIV, LIV, PAP, PAP, PAP, PAP, INV,
-	INV, INV, INV, INV, IRN, IRN, IRN, IRN,
-	IRN, IRN, VAL, VAL, LIV, LIV, LIV, LIV,
-	WOD, WOD, WOD, WOD, WOD, WOD, WOD, WOD,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, GLD, GLD, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	WAT, RUB, RUB, RUB, RUB, INV, INV, INV,
-	INV, INV, INV, SUG, SUG, SUG, SUG, INV,
-	INV, INV, TOY, TOY, TOY, TOY, PLC, PLC,
-	PLC, PLC, PLC, PLC, INV, INV, INV, INV,
-	INV, INV, INV, INV, CLA, CLA, CLA, CLA,
-	INV, INV, INV, INV, INV, INV, INV, INV,
-	INV, INV, INV, INV, INV, INV, INV
-};
+	/* Power Station */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_COAL,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
 
-#undef PAS
-#undef COL
-#undef RUB
-#undef SUG
-#undef MAL
-#undef OIL
-#undef TOY
-#undef LIV
-#undef BAT
-#undef GRA
-#undef WHT
-#undef TOF
-#undef WOD
-#undef CLA
-#undef IRN
-#undef COP
-#undef CCY
-#undef STL
-#undef PAP
-#undef WAT
-#undef BBL
-#undef VAL
-#undef GLD
-#undef PLC
-#undef INV
+	/* Sawmill */
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Forest Artic, temperate */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Oil refinery */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_OIL,        SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* oil Rig */
+	MK(CT_INVALID,      CT_INVALID,   CT_PASSENGERS, SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_MAIL,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Oil Wells artic, temperate */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Farm tropic, arctic and temperate */
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Factory temperate */
+	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP),
+	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP),
+	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP),
+	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP),
+
+	/* Printing works */
+	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP),
+
+	/* Copper ore mine */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Steel mill */
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP),
+
+	/* Bank temperate*/
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_VALUABLES,  SLOPE_E),
+	MK(CT_PASSENGERS,   CT_INVALID,   CT_VALUABLES,  SLOPE_S),
+
+	/* Food processing plant, tropic and arctic. CT_MAIZE or CT_WHEAT, CT_LIVESTOCK or CT_FRUIT*/
+	MK(CT_MAIZE,        CT_INVALID,   CT_LIVESTOCK,  SLOPE_STEEP),
+	MK(CT_MAIZE,        CT_INVALID,   CT_LIVESTOCK,  SLOPE_STEEP),
+	MK(CT_MAIZE,        CT_INVALID,   CT_LIVESTOCK,  SLOPE_STEEP),
+	MK(CT_MAIZE,        CT_INVALID,   CT_LIVESTOCK,  SLOPE_STEEP),
+
+	/* Paper mill */
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP),
+
+	/* Gold mine */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Bank Sub Arctic */
+	MK(CT_INVALID,      CT_INVALID,   CT_GOLD,       SLOPE_E),
+	MK(CT_INVALID,      CT_INVALID,   CT_GOLD,       SLOPE_S),
+
+	/* Diamond mine */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Iron ore Mine */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Fruit plantation */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Rubber plantation */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Water supply */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Water tower */
+	MK(CT_INVALID,      CT_INVALID,   CT_WATER,      SLOPE_STEEP),
+
+	/* Factory (sub-tropical) */
+	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP),
+	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP),
+	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP),
+	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP),
+
+	/* Lumber mill */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Candyfloss forest */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Sweet factory */
+	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP),
+	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP),
+	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP),
+	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP),
+
+	/* Batter farm */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Cola wells */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Toy shop */
+	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP),
+
+	/* Toy factory */
+	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP),
+	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP),
+	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP),
+	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP),
+	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP),
+	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP),
+
+	/* Plastic Fountain */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Fizzy drink factory */
+	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP),
+	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP),
+	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP),
+	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP),
+
+	/* Bubble generator */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Toffee quarry */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+
+	/* Sugar mine */
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP),
+};
+#undef MK
+
+#endif  /* BUILD_INDUSTRY_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/table/cargo_const.h	Wed Feb 28 00:33:40 2007 +0000
@@ -0,0 +1,142 @@
+/* $Id$ */
+
+/* Table of all default cargo types */
+
+#define MK(bt, label, c, e, f, g, h, fr, ks1, ks2, ks3, ks4, ks5, l, m) \
+          {bt, label, 0, c, c, e, f, {g, h}, fr, 0, 0, 0, ks1, ks2, ks3, ks4, ks5, l, m}
+static const CargoSpec _default_cargo[] = {
+	MK(  0, 'PASS', 152,  1, 3185,  0,  24, false,
+		STR_000F_PASSENGERS,     STR_002F_PASSENGER,      STR_PASSENGERS, STR_QUANTITY_PASSENGERS,   STR_ABBREV_PASSENGERS,
+		SPR_CARGO_PASSENGER,     CC_PASSENGERS  ),
+
+	MK(  1, 'COAL',  32, 16, 5916,  7, 255, true,
+		STR_0010_COAL,           STR_0030_COAL,           STR_TONS,       STR_QUANTITY_COAL,         STR_ABBREV_COAL,
+		SPR_CARGO_COAL,          CC_BULK        ),
+
+	MK(  2, 'MAIL',  15,  4, 4550, 20,  90, false,
+		STR_0011_MAIL,           STR_0031_MAIL,           STR_BAGS,       STR_QUANTITY_MAIL,         STR_ABBREV_MAIL,
+		SPR_CARGO_MAIL,          CC_MAIL        ),
+
+	MK(  3, 'OIL_', 174, 16, 4437, 25, 255, true,
+		STR_0012_OIL,            STR_0032_OIL,            STR_LITERS,     STR_QUANTITY_OIL,          STR_ABBREV_OIL,
+		SPR_CARGO_OIL,           CC_LIQUID      ),
+
+	MK(  4, 'LVST', 208,  3, 4322,  4,  18, true,
+		STR_0013_LIVESTOCK,      STR_0033_LIVESTOCK,      STR_ITEMS,      STR_QUANTITY_LIVESTOCK,    STR_ABBREV_LIVESTOCK,
+		SPR_CARGO_LIVESTOCK,     CC_PIECE_GOODS ),
+
+	MK(  5, 'GOOD', 194,  8, 6144,  5,  28, true,
+		STR_0014_GOODS,          STR_0034_GOODS,          STR_CRATES,     STR_QUANTITY_GOODS,        STR_ABBREV_GOODS,
+		SPR_CARGO_GOODS,         CC_EXPRESS     ),
+
+	MK(  6, 'GRAI', 191, 16, 4778,  4,  40, true,
+		STR_0015_GRAIN,          STR_0035_GRAIN,          STR_TONS,       STR_QUANTITY_GRAIN,        STR_ABBREV_GRAIN,
+		SPR_CARGO_GRAIN,         CC_BULK        ),
+
+	MK(  6, 'WHEA', 191, 16, 4778,  4,  40, true,
+		STR_0022_WHEAT,          STR_0042_WHEAT,          STR_TONS,       STR_QUANTITY_WHEAT,        STR_ABBREV_WHEAT,
+		SPR_CARGO_GRAIN,         CC_BULK        ),
+
+	MK(  6, 'MAIZ', 191,  6, 4778,  4,  40, true,
+		STR_001B_MAIZE,          STR_003B_MAIZE,          STR_TONS,       STR_QUANTITY_MAIZE,        STR_ABBREV_MAIZE,
+		SPR_CARGO_GRAIN,         CC_BULK        ),
+
+	MK(  7, 'WOOD',  84, 16, 5005, 15, 255, true,
+		STR_0016_WOOD,           STR_0036_WOOD,           STR_TONS,       STR_QUANTITY_WOOD,         STR_ABBREV_WOOD,
+		SPR_CARGO_WOOD,          CC_PIECE_GOODS ),
+
+	MK(  8, 'IORE', 184, 16, 5120,  9, 255, true,
+		STR_0017_IRON_ORE,       STR_0037_IRON_ORE,       STR_TONS,       STR_QUANTITY_IRON_ORE,     STR_ABBREV_IRON_ORE,
+		SPR_CARGO_IRON_ORE,      CC_BULK        ),
+
+	MK(  9, 'STEL',  10, 16, 5688,  7, 255, true,
+		STR_0018_STEEL,          STR_0038_STEEL,          STR_TONS,       STR_QUANTITY_STEEL,        STR_ABBREV_STEEL,
+		SPR_CARGO_STEEL,         CC_PIECE_GOODS ),
+
+	MK( 10, 'VALU', 202,  2, 7509,  1,  32, true,
+		STR_0019_VALUABLES,      STR_0039_VALUABLES,      STR_BAGS,       STR_QUANTITY_VALUABLES,    STR_ABBREV_VALUABLES,
+		SPR_CARGO_VALUES_GOLD,   CC_ARMOURED    ),
+
+	MK( 10, 'GOLD', 202,  8, 7509, 10,  40, true,
+		STR_0020_GOLD,           STR_0040_GOLD,           STR_BAGS,       STR_QUANTITY_GOLD,         STR_ABBREV_GOLD,
+		SPR_CARGO_VALUES_GOLD,   CC_ARMOURED    ),
+
+	MK( 10, 'DIAM', 202,  2, 7509, 10, 255, true,
+		STR_001D_DIAMONDS,       STR_003D_DIAMOND,        STR_BAGS,       STR_QUANTITY_DIAMONDS,     STR_ABBREV_DIAMONDS,
+		SPR_CARGO_DIAMONDS,      CC_ARMOURED    ),
+
+	MK( 11, 'PAPR',  10, 16, 5688,  7,  60, true,
+		STR_001F_PAPER,          STR_003F_PAPER,          STR_TONS,       STR_QUANTITY_PAPER,        STR_ABBREV_PAPER,
+		SPR_CARGO_PAPER,         CC_PIECE_GOODS ),
+
+	MK( 12, 'FOOD',  48, 16, 5688,  0,  30, true,
+		STR_001E_FOOD,           STR_003E_FOOD,           STR_TONS,       STR_QUANTITY_FOOD,         STR_ABBREV_FOOD,
+		SPR_CARGO_FOOD,          CC_EXPRESS     | CC_REFRIGERATED),
+
+	MK( 13, 'FRUT', 208,  6, 4322,  0,  15, true,
+		STR_001C_FRUIT,          STR_003C_FRUIT,          STR_TONS,       STR_QUANTITY_FRUIT,        STR_ABBREV_FRUIT,
+		SPR_CARGO_FRUIT,         CC_BULK        | CC_REFRIGERATED),
+
+	MK( 14, 'CORE', 184,  6, 5120, 12, 255, true,
+		STR_001A_COPPER_ORE,     STR_003A_COPPER_ORE,     STR_TONS,       STR_QUANTITY_COPPER_ORE,   STR_ABBREV_COPPER_ORE,
+		SPR_CARGO_COPPER_ORE,    CC_BULK        ),
+
+	MK( 15, 'WATR',  10,  6, 5688, 20,  80, true,
+		STR_0021_WATER,          STR_0041_WATER,          STR_LITERS,     STR_QUANTITY_WATER,        STR_ABBREV_WATER,
+		SPR_CARGO_WATERCOLA,     CC_LIQUID      ),
+
+	MK( 16, 'RUBR',  32,  6, 5916,  2,  20, true,
+		STR_0023_RUBBER,         STR_0043_RUBBER,         STR_LITERS,     STR_QUANTITY_RUBBER,       STR_ABBREV_RUBBER,
+		SPR_CARGO_RUBBER,        CC_LIQUID      ),
+
+	MK( 17, 'SUGR',  32, 16, 5916, 20, 255, true,
+		STR_0024_SUGAR,          STR_0044_SUGAR,          STR_TONS,       STR_QUANTITY_SUGAR,        STR_ABBREV_SUGAR,
+		SPR_CARGO_SUGAR,         CC_BULK        ),
+
+	MK( 18, 'TOYS', 174,  2, 4437, 25, 255, true,
+		STR_0025_TOYS,           STR_0045_TOY,            STR_NOTHING,    STR_QUANTITY_TOYS,         STR_ABBREV_TOYS,
+		SPR_CARGO_TOYS,          CC_PIECE_GOODS ),
+
+	MK( 19, 'BATT', 208,  4, 4322,  2,  30, true,
+		STR_002B_BATTERIES,      STR_004B_BATTERY,        STR_NOTHING,    STR_QUANTITY_BATTERIES,    STR_ABBREV_BATTERIES,
+		SPR_CARGO_BATTERIES,     CC_PIECE_GOODS ),
+
+	MK( 20, 'SWET', 194,  5, 6144,  8,  40, true,
+		STR_0026_CANDY,          STR_0046_CANDY,          STR_TONS,       STR_QUANTITY_SWEETS,       STR_ABBREV_SWEETS,
+		SPR_CARGO_CANDY,         CC_EXPRESS     ),
+
+	MK( 21, 'TOFF', 191, 16, 4778, 14,  60, true,
+		STR_002A_TOFFEE,         STR_004A_TOFFEE,         STR_TONS,       STR_QUANTITY_TOFFEE,       STR_ABBREV_TOFFEE,
+		SPR_CARGO_TOFFEE,        CC_BULK        ),
+
+	MK( 22, 'COLA',  84, 16, 5005,  5,  75, true,
+		STR_0027_COLA,           STR_0047_COLA,           STR_LITERS,     STR_QUANTITY_COLA,         STR_ABBREV_COLA,
+		SPR_CARGO_WATERCOLA,     CC_LIQUID      ),
+
+	MK( 23, 'CTCD', 184, 16, 5120, 10,  25, true,
+		STR_0028_COTTON_CANDY,   STR_0048_COTTON_CANDY,   STR_TONS,       STR_QUANTITY_CANDYFLOSS,   STR_ABBREV_CANDYFLOSS,
+		SPR_CARGO_COTTONCANDY,   CC_BULK        ),
+
+	MK( 24, 'BUBL',  10,  1, 5688, 20,  80, true,
+		STR_0029_BUBBLES,        STR_0049_BUBBLE,         STR_NOTHING,    STR_QUANTITY_BUBBLES,      STR_ABBREV_BUBBLES,
+		SPR_CARGO_BUBBLES,       CC_PIECE_GOODS ),
+
+	MK( 25, 'PLST', 202, 16, 7509, 30, 255, true,
+		STR_002C_PLASTIC,        STR_004C_PLASTIC,        STR_LITERS,     STR_QUANTITY_PLASTIC,      STR_ABBREV_PLASTIC,
+		SPR_CARGO_PLASTIC,       CC_LIQUID      ),
+
+	MK( 26, 'FZDR',  48,  2, 5688, 30,  50, true,
+		STR_002D_FIZZY_DRINKS,   STR_004D_FIZZY_DRINK,    STR_NOTHING,    STR_QUANTITY_FIZZY_DRINKS, STR_ABBREV_FIZZY_DRINKS,
+		SPR_CARGO_FIZZYDRINK,    CC_PIECE_GOODS ),
+
+};
+
+
+/* Table of which cargo types are available in each climate, by default */
+static const CargoLabel _default_climate_cargo[NUM_LANDSCAPE][12] = {
+	{ 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'GRAI', 'WOOD', 'IORE', 'STEL', 'VALU', 'VOID', },
+	{ 'PASS', 'COAL', 'MAIL', 'OIL_', 'LVST', 'GOOD', 'WHEA', 'WOOD', 'VOID', 'PAPR', 'GOLD', 'FOOD', },
+	{ 'PASS', 'RUBR', 'MAIL', 'OIL_', 'FRUT', 'GOOD', 'MAIZ', 'WOOD', 'CORE', 'WATR', 'DIAM', 'FOOD', },
+	{ 'PASS', 'SUGR', 'MAIL', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR', },
+};
+
--- a/src/table/files.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/table/files.h	Wed Feb 28 00:33:40 2007 +0000
@@ -59,7 +59,7 @@
 	{ "autorail.grf",  { 0xed, 0x44, 0x7f, 0xbb, 0x19, 0x44, 0x48, 0x4c, 0x07, 0x8a, 0xb1, 0xc1, 0x5c, 0x12, 0x3a, 0x60 } },
 	{ "canalsw.grf",   { 0x13, 0x9c, 0x98, 0xcf, 0xb8, 0x7c, 0xd7, 0x1f, 0xca, 0x34, 0xa5, 0x6b, 0x65, 0x31, 0xec, 0x0f } },
 	{ "elrailsw.grf",  { 0x4f, 0xf9, 0xac, 0x79, 0x50, 0x28, 0x9b, 0xe2, 0x15, 0x30, 0xa8, 0x1e, 0xd5, 0xfd, 0xe1, 0xda } },
-	{ "openttd.grf",   { 0x59, 0x22, 0x19, 0xe0, 0x6e, 0xe7, 0xb6, 0xa3, 0x55, 0x53, 0xcc, 0x9e, 0xbc, 0xaf, 0xcc, 0x83 } },
+	{ "openttd.grf",   { 0x10, 0xc1, 0x68, 0x56, 0x9e, 0x1e, 0x0e, 0x85, 0x9d, 0xf8, 0x53, 0x27, 0x48, 0x7e, 0x17, 0x58 } },
 	{ "trkfoundw.grf", { 0x12, 0x33, 0x3f, 0xa3, 0xd1, 0x86, 0x8b, 0x04, 0x53, 0x18, 0x9c, 0xee, 0xf9, 0x2d, 0xf5, 0x95 } },
 	{ "roadstops.grf", { 0x8c, 0xd9, 0x45, 0x21, 0x28, 0x82, 0x96, 0x45, 0x33, 0x22, 0x7a, 0xb9, 0x0d, 0xf3, 0x67, 0x4a } },
 };
--- a/src/table/industry_land.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/table/industry_land.h	Wed Feb 28 00:33:40 2007 +0000
@@ -961,34 +961,6 @@
 
 #undef N
 
-/**
- * The indices into this table are the ones as described by
- * the enum with GFX_*s in industry_map.h.
- */
-static const byte _industry_section_bits[NUM_INDUSTRY_GFXES] = {
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16,  4,  2, 16, 16, 16, 16, // <- temperate bank
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16,  4,  2, 16, 16, 16, 16, 16, // <- sub-arctic/sub-tropical bank
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16, 16,
-	16, 16, 16, 16, 16, 16, 16,
-};
 
 /**
  * When true, the tile has to be drawn using the animation
--- a/src/table/landscape_const.h	Tue Feb 27 23:54:28 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,257 +0,0 @@
-/* $Id$ */
-
-#include "sprites.h"
-
-typedef struct CargoTypesValues {
-	StringID names[NUM_CARGO];
-	StringID units_volume[NUM_CARGO];
-	byte weights[NUM_CARGO];
-	SpriteID sprites[NUM_CARGO];
-
-	uint16 initial_cargo_payment[NUM_CARGO];
-	byte transit_days_table_1[NUM_CARGO];
-	byte transit_days_table_2[NUM_CARGO];
-} CargoTypesValues;
-
-
-static const CargoTypesValues _cargo_types_base_values[4] = {
-	{
-		/* normal names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0010_COAL,
-			STR_0011_MAIL,
-			STR_0012_OIL,
-			STR_0013_LIVESTOCK,
-			STR_0014_GOODS,
-			STR_0015_GRAIN,
-			STR_0016_WOOD,
-			STR_0017_IRON_ORE,
-			STR_0018_STEEL,
-			STR_0019_VALUABLES,
-			STR_000E,
-		},
-
-		{ /* normal units of volume */
-			STR_PASSENGERS,
-			STR_TONS,
-			STR_BAGS,
-			STR_LITERS,
-			STR_ITEMS,
-			STR_CRATES,
-			STR_TONS,
-			STR_TONS,
-			STR_TONS,
-			STR_TONS,
-			STR_BAGS,
-			STR_RES_OTHER
-		},
-
-		/* normal weights */
-		{
-			1, 16, 4, 16, 3, 8, 16, 16, 16, 16, 2, 0,
-		},
-
-		/* normal sprites */
-		{
-			SPR_CARGO_PASSENGER,      SPR_CARGO_COAL,  SPR_CARGO_MAIL, SPR_CARGO_OIL,      SPR_CARGO_LIVESTOCK,
-			SPR_CARGO_GOODS,          SPR_CARGO_GRAIN, SPR_CARGO_WOOD, SPR_CARGO_IRON_ORE, SPR_CARGO_STEEL,
-			SPR_CARGO_VALUES_GOLD,    SPR_ASCII_SPACE
-		},
-
-		/* normal initial cargo payment */
-		{
-			3185, 5916, 4550, 4437, 4322, 6144, 4778, 5005, 5120, 5688, 7509, 5688
-		},
-
-		/* normal transit days table 1 */
-		{
-			0, 7, 20, 25, 4, 5, 4, 15, 9, 7, 1, 0,
-		},
-
-		/* normal transit days table 2 */
-		{
-			24, 255, 90, 255, 18, 28, 40, 255, 255, 255, 32, 30,
-		},
-	},
-
-	{
-		/* hilly names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0010_COAL,
-			STR_0011_MAIL,
-			STR_0012_OIL,
-			STR_0013_LIVESTOCK,
-			STR_0014_GOODS,
-			STR_0022_WHEAT,
-			STR_0016_WOOD,
-			STR_000E,
-			STR_001F_PAPER,
-			STR_0020_GOLD,
-			STR_001E_FOOD,
-		},
-
-		{ /* hilly units of volume */
-			STR_PASSENGERS,
-			STR_TONS,
-			STR_BAGS,
-			STR_LITERS,
-			STR_ITEMS,
-			STR_CRATES,
-			STR_TONS,
-			STR_TONS,
-			STR_RES_OTHER,
-			STR_TONS,
-			STR_BAGS,
-			STR_TONS
-		},
-
-		/* hilly weights */
-		{
-			1, 16, 4, 16, 3, 8, 16, 16, 0, 16, 8, 16
-		},
-
-		/* hilly sprites */
-		{
-			SPR_CARGO_PASSENGER,   SPR_CARGO_COAL,  SPR_CARGO_MAIL, SPR_CARGO_OIL,   SPR_CARGO_LIVESTOCK,
-			SPR_CARGO_GOODS,       SPR_CARGO_GRAIN, SPR_CARGO_WOOD, SPR_ASCII_SPACE, SPR_CARGO_PAPER,
-			SPR_CARGO_VALUES_GOLD, SPR_CARGO_FOOD
-		},
-
-		/* hilly initial cargo payment */
-		{
-			3185, 5916, 4550, 4437, 4322, 6144, 4778, 5005, 5120, 5461, 5802, 5688
-		},
-
-		/* hilly transit days table 1 */
-		{
-			0, 7, 20, 25, 4, 5, 4, 15, 9, 7, 10, 0,
-		},
-
-		/* hilly transit days table 2 */
-		{
-			24, 255, 90, 255, 18, 28, 40, 255, 255, 60, 40, 30
-		},
-	},
-
-	{
-		/* desert names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0023_RUBBER,
-			STR_0011_MAIL,
-			STR_0012_OIL,
-			STR_001C_FRUIT,
-			STR_0014_GOODS,
-			STR_001B_MAIZE,
-			STR_0016_WOOD,
-			STR_001A_COPPER_ORE,
-			STR_0021_WATER,
-			STR_001D_DIAMONDS,
-			STR_001E_FOOD
-		},
-
-		{ /* desert units of volume */
-			STR_PASSENGERS,
-			STR_LITERS,
-			STR_BAGS,
-			STR_LITERS,
-			STR_TONS,
-			STR_CRATES,
-			STR_TONS,
-			STR_TONS,
-			STR_TONS,
-			STR_LITERS,
-			STR_BAGS,
-			STR_TONS
-		},
-
-		/* desert weights */
-		{
-			1, 16, 4, 16, 16, 8, 16, 16, 16, 16, 2, 16,
-		},
-
-		/* desert sprites */
-		{
-			SPR_CARGO_PASSENGER, SPR_CARGO_RUBBER, SPR_CARGO_MAIL, SPR_CARGO_OIL,        SPR_CARGO_FRUIT,
-			SPR_CARGO_GOODS,     SPR_CARGO_GRAIN,  SPR_CARGO_WOOD, SPR_CARGO_COPPER_ORE, SPR_CARGO_WATERCOLA,
-			SPR_CARGO_DIAMONDS,  SPR_CARGO_FOOD
-		},
-
-		/* desert initial cargo payment */
-		{
-			3185, 4437, 4550, 4892, 4209, 6144, 4322, 7964, 4892, 4664, 5802, 5688
-		},
-
-		/* desert transit days table 1 */
-		{
-			0, 2, 20, 25, 0, 5, 4, 15, 12, 20, 10, 0
-		},
-
-		/* desert transit days table 2 */
-		{
-			24, 20, 90, 255, 15, 28, 40, 255, 255, 80, 255, 30
-		},
-	},
-
-	{
-		/* candy names */
-		{
-			STR_000F_PASSENGERS,
-			STR_0024_SUGAR,
-			STR_0011_MAIL,
-			STR_0025_TOYS,
-			STR_002B_BATTERIES,
-			STR_0026_CANDY,
-			STR_002A_TOFFEE,
-			STR_0027_COLA,
-			STR_0028_COTTON_CANDY,
-			STR_0029_BUBBLES,
-			STR_002C_PLASTIC,
-			STR_002D_FIZZY_DRINKS,
-		},
-
-		{ /* candy unitrs of volume */
-			STR_PASSENGERS,
-			STR_TONS,
-			STR_BAGS,
-			STR_NOTHING,
-			STR_NOTHING,
-			STR_TONS,
-			STR_TONS,
-			STR_LITERS,
-			STR_TONS,
-			STR_NOTHING,
-			STR_LITERS,
-			STR_NOTHING
-		},
-
-		/* candy weights */
-		{
-			1, 16, 4, 2, 4, 5, 16, 16, 16, 1, 16, 2
-		},
-
-		/* candy sprites */
-		{
-			SPR_CARGO_PASSENGER, SPR_CARGO_SUGAR,  SPR_CARGO_MAIL,      SPR_CARGO_TOYS,        SPR_CARGO_BATTERIES,
-			SPR_CARGO_CANDY,     SPR_CARGO_TOFFEE, SPR_CARGO_WATERCOLA, SPR_CARGO_COTTONCANDY, SPR_CARGO_BUBBLES,
-			SPR_CARGO_PLASTIC,   SPR_CARGO_FIZZYDRINK
-		},
-
-		/* candy initial cargo payment */
-		{
-			3185, 4437, 4550, 5574, 4322, 6144, 4778, 4892, 5005, 5077, 4664, 6250
-		},
-
-		/* candy transit days table 1 */
-		{
-			0, 20, 20, 25, 2, 8, 14, 5, 10, 20, 30, 30,
-		},
-
-		/* candy transit days table 2 */
-		{
-			24, 255, 90, 255, 30, 40, 60, 75, 25, 80, 255, 50
-		},
-	}
-};
--- a/src/table/namegen.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/table/namegen.h	Wed Feb 28 00:33:40 2007 +0000
@@ -709,17 +709,17 @@
 	"Bordeaux",
 	"Bayonne",
 	"Montpellier",
-	"Montelimar",
+	"Montélimar",
 	"Valence",
 	"Digne",
 	"Nice",
 	"Cannes",
 	"St. Tropez",
-	"Marseilles",
+	"Marseille",
 	"Narbonne",
 	"Sète",
 	"Aurillac",
-	"Gueret",
+	"Guéret",
 	"Le Creusot",
 	"Nevers",
 	"Auxerre",
@@ -731,7 +731,7 @@
 	"Chaumont",
 	"Langres",
 	"Bourg",
-	"Lyons",
+	"Lyon",
 	"Vienne",
 	"Grenoble",
 	"Toulon",
@@ -763,7 +763,7 @@
 	"Beaujolais",
 	"Narbonne",
 	"Albi",
-	"St. Valery",
+	"Paris",
 	"Biarritz",
 	"Béziers",
 	"Nîmes",
--- a/src/table/sprites.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/table/sprites.h	Wed Feb 28 00:33:40 2007 +0000
@@ -48,7 +48,7 @@
 	SPR_ASCII_SPACE_BIG   = 450,
 
 	/* Extra graphic spritenumbers */
-	OPENTTD_SPRITES_COUNT = 116, // number of gfx-sprites in openttd.grf
+	OPENTTD_SPRITES_COUNT = 117, // number of gfx-sprites in openttd.grf
 	SPR_SIGNALS_BASE  = 4896,
 	SPR_CANALS_BASE   = SPR_SIGNALS_BASE + 486,
 	SPR_SLOPES_BASE   = SPR_CANALS_BASE + 70,
@@ -95,6 +95,8 @@
 
 	SPR_SHARED_ORDERS_ICON = SPR_OPENTTD_BASE + 115,
 
+	SPR_WARNING_SIGN      = SPR_OPENTTD_BASE + 116, // warning sign (shown if there are any newgrf errors)
+
 	/* Network GUI sprites */
 	SPR_SQUARE = SPR_OPENTTD_BASE + 20,     // colored square (used for newgrf compatibility)
 	SPR_LOCK = SPR_OPENTTD_BASE + 19,       // lock icon (for password protected servers)
--- a/src/terraform_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/terraform_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -40,8 +40,8 @@
 
 	if (_game_mode != GM_EDITOR) return;
 
-	if (ex < sx) intswap(ex, sx);
-	if (ey < sy) intswap(ey, sy);
+	if (ex < sx) Swap(ex, sx);
+	if (ey < sy) Swap(ey, sy);
 	size_x = (ex - sx) + 1;
 	size_y = (ey - sy) + 1;
 
@@ -68,8 +68,8 @@
 
 	if (_game_mode != GM_EDITOR) return;
 
-	if (ex < sx) intswap(ex, sx);
-	if (ey < sy) intswap(ey, sy);
+	if (ex < sx) Swap(ex, sx);
+	if (ey < sy) Swap(ey, sy);
 	size_x = (ex - sx) + 1;
 	size_y = (ey - sy) + 1;
 
--- a/src/town_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/town_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -350,8 +350,6 @@
 	int32 cost;
 	Town *t;
 
-	// safety checks
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
 	if (flags&DC_AUTO && !(flags&DC_AI_BUILDING)) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
 
 	house = GetHouseType(tile);
@@ -730,7 +728,7 @@
 
 		// Exclude the source position from the bitmask
 		// and return if no more road blocks available
-		mask = ClrBitT(mask, (block ^ 2));
+		ClrBitT(mask, (block ^ 2));
 		if (mask == 0)
 			return _grow_town_result;
 
@@ -1303,8 +1301,6 @@
 {
 	int32 r;
 
-	// make sure it's possible
-	if (!EnsureNoVehicle(tile)) return false;
 	if (IsSteepSlope(GetTileSlope(tile, NULL))) return false;
 	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return false;
 
--- a/src/train_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/train_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -33,6 +33,7 @@
 #include "direction.h"
 #include "yapf/yapf.h"
 #include "date.h"
+#include "cargotype.h"
 
 static bool TrainCheckIfLineEnds(Vehicle *v);
 static void TrainController(Vehicle *v, bool update_image);
@@ -48,8 +49,7 @@
  */
 byte FreightWagonMult(CargoID cargo)
 {
-	// XXX NewCargos introduces a specific "is freight" flag for this test.
-	if (cargo == CT_PASSENGERS || cargo == CT_MAIL) return 1;
+	if (!GetCargo(cargo)->is_freight) return 1;
 	return _patches.freight_trains;
 }
 
@@ -60,11 +60,10 @@
  */
 void TrainPowerChanged(Vehicle* v)
 {
-	Vehicle* u;
 	uint32 power = 0;
 	uint32 max_te = 0;
 
-	for (u = v; u != NULL; u = u->next) {
+	for (const Vehicle *u = v; u != NULL; u = u->next) {
 		/* Power is not added for articulated parts */
 		if (IsArticulatedPart(u)) continue;
 
@@ -101,17 +100,15 @@
  */
 static void TrainCargoChanged(Vehicle* v)
 {
-	Vehicle *u;
 	uint32 weight = 0;
 
-	for (u = v; u != NULL; u = u->next) {
-		const RailVehicleInfo *rvi = RailVehInfo(u->engine_type);
-		uint32 vweight = (_cargoc.weights[u->cargo_type] * u->cargo_count * FreightWagonMult(u->cargo_type)) / 16;
+	for (Vehicle *u = v; u != NULL; u = u->next) {
+		uint32 vweight = GetCargo(u->cargo_type)->weight * u->cargo_count * FreightWagonMult(u->cargo_type) / 16;
 
 		// Vehicle weight is not added for articulated parts.
 		if (!IsArticulatedPart(u)) {
 			// vehicle weight is the sum of the weight of the vehicle and the weight of its cargo
-			vweight += rvi->weight;
+			vweight += RailVehInfo(u->engine_type)->weight;
 
 			// powered wagons have extra weight added
 			if (HASBIT(u->u.rail.flags, VRF_POWEREDWAGON))
@@ -123,7 +120,7 @@
 
 		// store vehicle weight in cache
 		u->u.rail.cached_veh_weight = vweight;
-	};
+	}
 
 	// store consist weight in cache
 	v->u.rail.cached_weight = weight;
@@ -141,29 +138,24 @@
  */
 void TrainConsistChanged(Vehicle* v)
 {
-	const RailVehicleInfo *rvi_v;
-	Vehicle *u;
 	uint16 max_speed = 0xFFFF;
-	EngineID first_engine;
 
 	assert(v->type == VEH_Train);
-
 	assert(IsFrontEngine(v) || IsFreeWagon(v));
 
-	rvi_v = RailVehInfo(v->engine_type);
-	first_engine = IsFrontEngine(v) ? v->engine_type : INVALID_ENGINE;
+	const RailVehicleInfo *rvi_v = RailVehInfo(v->engine_type);
+	EngineID first_engine = IsFrontEngine(v) ? v->engine_type : INVALID_ENGINE;
 	v->u.rail.cached_total_length = 0;
 	v->u.rail.compatible_railtypes = 0;
 
-	for (u = v; u != NULL; u = u->next) {
+	for (Vehicle *u = v; u != NULL; u = u->next) {
 		const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);
-		uint16 veh_len;
 
 		// Update the v->first cache. This is faster than having to brute force it later.
 		if (u->first == NULL) u->first = v;
 
 		// update the 'first engine'
-		u->u.rail.first_engine = (v == u) ? (EngineID)INVALID_ENGINE : first_engine;
+		u->u.rail.first_engine = v == u ? INVALID_ENGINE : first_engine;
 		u->u.rail.railtype = rvi_u->railtype;
 
 		if (IsTrainEngine(u)) first_engine = u->engine_type;
@@ -184,9 +176,6 @@
 		}
 
 		if (!IsArticulatedPart(u)) {
-			// check if its a powered wagon
-			CLRBIT(u->u.rail.flags, VRF_POWEREDWAGON);
-
 			/* Check powered wagon / visual effect callback */
 			if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_WAGON_POWER)) {
 				uint16 callback = GetVehicleCallback(CBID_TRAIN_WAGON_POWER, 0, 0, u->engine_type, u);
@@ -198,6 +187,8 @@
 				UsesWagonOverride(u) && (u->u.rail.cached_vis_effect < 0x40)) {
 				/* wagon is powered */
 				SETBIT(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
+			} else {
+				CLRBIT(u->u.rail.flags, VRF_POWEREDWAGON);
 			}
 
 			/* Do not count powered wagons for the compatible railtypes, as wagons always
@@ -220,7 +211,7 @@
 		}
 
 		// check the vehicle length (callback)
-		veh_len = CALLBACK_FAILED;
+		uint16 veh_len = CALLBACK_FAILED;
 		if (HASBIT(EngInfo(u->engine_type)->callbackmask, CBM_VEHICLE_LENGTH)) {
 			veh_len = GetVehicleCallback(CBID_TRAIN_VEHICLE_LENGTH, 0, 0, u->engine_type, u);
 		}
@@ -228,8 +219,7 @@
 		veh_len = clamp(veh_len, 0, u->next == NULL ? 7 : 5); // the clamp on vehicles not the last in chain is stricter, as too short wagons can break the 'follow next vehicle' code
 		u->u.rail.cached_veh_length = 8 - veh_len;
 		v->u.rail.cached_total_length += u->u.rail.cached_veh_length;
-
-	};
+	}
 
 	// store consist weight/max speed in cache
 	v->u.rail.cached_max_speed = max_speed;
@@ -291,30 +281,16 @@
 //new acceleration
 static int GetTrainAcceleration(Vehicle *v, bool mode)
 {
-	const Vehicle *u;
-	int num = 0; //number of vehicles, change this into the number of axles later
-	int power = 0;
-	int mass = 0;
 	int max_speed = 2000;
-	int area = 120;
-	int friction = 35; //[1e-3]
-	int drag_coeff = 20; //[1e-4]
-	int incl = 0;
-	int resistance;
-	int speed = v->cur_speed; //[mph]
-	int force = 0x3FFFFFFF;
+	int speed = v->cur_speed * 10 / 16; //[mph]
+	int curvecount[2] = {0, 0};
+
+	//first find the curve speed limit
+	int numcurve = 0;
+	int sum = 0;
 	int pos = 0;
 	int lastpos = -1;
-	int curvecount[2] = {0, 0};
-	int sum = 0;
-	int numcurve = 0;
-	int max_te = v->u.rail.cached_max_te; // [N]
-
-	speed *= 10;
-	speed /= 16;
-
-	//first find the curve speed limit
-	for (u = v; u->next != NULL; u = u->next, pos++) {
+	for (const Vehicle *u = v; u->next != NULL; u = u->next, pos++) {
 		Direction dir = u->direction;
 		Direction ndir = u->next->direction;
 		int i;
@@ -369,11 +345,14 @@
 		}
 	}
 
-	mass = v->u.rail.cached_weight;
-	power = v->u.rail.cached_power * 746;
+	int mass = v->u.rail.cached_weight;
+	int power = v->u.rail.cached_power * 746;
 	max_speed = min(max_speed, v->u.rail.cached_max_speed);
 
-	for (u = v; u != NULL; u = u->next) {
+	int num = 0; //number of vehicles, change this into the number of axles later
+	int incl = 0;
+	int drag_coeff = 20; //[1e-4]
+	for (const Vehicle *u = v; u != NULL; u = u->next) {
 		num++;
 		drag_coeff += 3;
 
@@ -388,6 +367,9 @@
 
 	v->max_speed = max_speed;
 
+	const int area = 120;
+	const int friction = 35; //[1e-3]
+	int resistance;
 	if (v->u.rail.railtype != RAILTYPE_MAGLEV) {
 		resistance = 13 * mass / 10;
 		resistance += 60 * num;
@@ -401,6 +383,8 @@
 
 	/* Due to the mph to m/s conversion below, at speeds below 3 mph the force is
 	 * actually double the train's power */
+	const int max_te = v->u.rail.cached_max_te; // [N]
+	int force;
 	if (speed > 2) {
 		switch (v->u.rail.railtype) {
 			case RAILTYPE_RAIL:
@@ -412,11 +396,10 @@
 				if (mode == AM_ACCEL && force > max_te) force = max_te;
 				break;
 
+			default: NOT_REACHED();
 			case RAILTYPE_MAGLEV:
 				force = power / 25;
 				break;
-
-			default: NOT_REACHED();
 		}
 	} else {
 		//"kickoff" acceleration
@@ -437,17 +420,13 @@
 
 static void UpdateTrainAcceleration(Vehicle* v)
 {
-	uint power = 0;
-	uint weight = 0;
-
 	assert(IsFrontEngine(v));
 
-	weight = v->u.rail.cached_weight;
-	power = v->u.rail.cached_power;
 	v->max_speed = v->u.rail.cached_max_speed;
 
+	uint power = v->u.rail.cached_power;
+	uint weight = v->u.rail.cached_weight;
 	assert(weight != 0);
-
 	v->acceleration = clamp(power / weight * 4, 1, 255);
 }
 
@@ -508,13 +487,11 @@
 
 uint CountArticulatedParts(EngineID engine_type)
 {
-	uint16 callback;
+	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
+
 	uint i;
-
-	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
-
 	for (i = 1; i < 10; i++) {
-		callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL);
+		uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL);
 		if (callback == CALLBACK_FAILED || callback == 0xFF) break;
 	}
 
@@ -523,18 +500,13 @@
 
 static void AddArticulatedParts(Vehicle **vl)
 {
-	const RailVehicleInfo *rvi_artic;
-	EngineID engine_type;
-	Vehicle *v = vl[0];
-	Vehicle *u = v;
-	uint16 callback;
-	bool flip_image;
-	uint i;
+	const Vehicle *v = vl[0];
+	Vehicle *u = vl[0];
 
 	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
 
-	for (i = 1; i < 10; i++) {
-		callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, v);
+	for (uint i = 1; i < 10; i++) {
+		uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, v->engine_type, v);
 		if (callback == CALLBACK_FAILED || callback == 0xFF) return;
 
 		/* Attempt to use pre-allocated vehicles until they run out. This can happen
@@ -545,9 +517,9 @@
 
 		u = u->next;
 
-		engine_type = GB(callback, 0, 7);
-		flip_image = HASBIT(callback, 7);
-		rvi_artic = RailVehInfo(engine_type);
+		EngineID engine_type = GB(callback, 0, 7);
+		bool flip_image = HASBIT(callback, 7);
+		const RailVehicleInfo *rvi_artic = RailVehInfo(engine_type);
 
 		// get common values from first engine
 		u->direction = v->direction;
@@ -585,22 +557,15 @@
 
 static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
 {
-	int32 value;
-	const RailVehicleInfo *rvi;
-	uint num_vehicles;
-
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
-	rvi = RailVehInfo(engine);
-	value = (rvi->base_cost * _price.build_railwagon) >> 8;
-
-	num_vehicles = 1 + CountArticulatedParts(engine);
+	const RailVehicleInfo *rvi = RailVehInfo(engine);
+	int32 value = (rvi->base_cost * _price.build_railwagon) >> 8;
+
+	uint num_vehicles = 1 + CountArticulatedParts(engine);
 
 	if (!(flags & DC_QUERY_COST)) {
 		Vehicle *vl[11]; // Allow for wagon and upto 10 artic parts.
-		Vehicle* v;
-		int x;
-		int y;
 
 		memset(&vl, 0, sizeof(vl));
 
@@ -608,14 +573,12 @@
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
 		if (flags & DC_EXEC) {
-			Vehicle *u, *w;
-			DiagDirection dir;
-
-			v = vl[0];
+			Vehicle *v = vl[0];
 			v->spritenum = rvi->image_index;
 
-			u = NULL;
-
+			Vehicle *u = NULL;
+
+			Vehicle *w;
 			FOR_ALL_VEHICLES(w) {
 				if (w->type == VEH_Train && w->tile == tile &&
 				    IsFreeWagon(w) && w->engine_type == engine) {
@@ -626,17 +589,17 @@
 
 			v->engine_type = engine;
 
-			dir = GetRailDepotDirection(tile);
+			DiagDirection dir = GetRailDepotDirection(tile);
 
 			v->direction = DiagDirToDir(dir);
 			v->tile = tile;
 
-			x = TileX(tile) * TILE_SIZE | _vehicle_initial_x_fract[dir];
-			y = TileY(tile) * TILE_SIZE | _vehicle_initial_y_fract[dir];
+			int x = TileX(tile) * TILE_SIZE | _vehicle_initial_x_fract[dir];
+			int y = TileY(tile) * TILE_SIZE | _vehicle_initial_y_fract[dir];
 
 			v->x_pos = x;
 			v->y_pos = y;
-			v->z_pos = GetSlopeZ(x,y);
+			v->z_pos = GetSlopeZ(x, y);
 			v->owner = _current_player;
 			v->z_height = 6;
 			v->u.rail.track = TRACK_BIT_DEPOT;
@@ -740,12 +703,6 @@
  */
 int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	const RailVehicleInfo *rvi;
-	int value;
-	Vehicle *v;
-	UnitID unit_num;
-	uint num_vehicles;
-
 	/* Check if the engine-type is valid (for the player) */
 	if (!IsEngineBuildable(p1, VEH_Train, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
 
@@ -758,7 +715,7 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
-	rvi = RailVehInfo(p1);
+	const RailVehicleInfo *rvi = RailVehInfo(p1);
 
 	/* Check if depot and new engine uses the same kind of tracks */
 	/* We need to see if the engine got power on the tile to avoid eletric engines in non-electric depots */
@@ -766,10 +723,11 @@
 
 	if (rvi->railveh_type == RAILVEH_WAGON) return CmdBuildRailWagon(p1, tile, flags);
 
-	value = EstimateTrainCost(rvi);
-
-	num_vehicles = (rvi->railveh_type == RAILVEH_MULTIHEAD) ? 2 : 1;
-	num_vehicles += CountArticulatedParts(p1);
+	int32 value = EstimateTrainCost(rvi);
+
+	uint num_vehicles =
+		(rvi->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1) +
+		CountArticulatedParts(p1);
 
 	if (!(flags & DC_QUERY_COST)) {
 		Vehicle *vl[12]; // Allow for upto 10 artic parts and dual-heads
@@ -779,9 +737,9 @@
 		if (!AllocateVehicles(vl, num_vehicles))
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
-		v = vl[0];
-
-		unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_Train);
+		Vehicle *v = vl[0];
+
+		UnitID unit_num = HASBIT(p2, 0) ? 0 : GetFreeUnitNumber(VEH_Train);
 		if (unit_num > _patches.max_trains)
 			return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
@@ -796,7 +754,7 @@
 			v->owner = _current_player;
 			v->x_pos = x;
 			v->y_pos = y;
-			v->z_pos = GetSlopeZ(x,y);
+			v->z_pos = GetSlopeZ(x, y);
 			v->z_height = 6;
 			v->u.rail.track = TRACK_BIT_DEPOT;
 			v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
@@ -871,13 +829,12 @@
  * number of cars (including loco) then. If not it returns -1 */
 int CheckTrainInDepot(const Vehicle *v, bool needs_to_be_stopped)
 {
-	int count;
 	TileIndex tile = v->tile;
 
 	/* check if stopped in a depot */
 	if (!IsTileDepotType(tile, TRANSPORT_RAIL) || v->cur_speed != 0) return -1;
 
-	count = 0;
+	int count = 0;
 	for (; v != NULL; v = v->next) {
 		/* This count is used by the depot code to determine the number of engines
 		 * in the consist. Exclude articulated parts so that autoreplacing to
@@ -903,7 +860,7 @@
 /* Used to check if the train is inside the depot, but not checking the VS_STOPPED flag */
 inline bool CheckTrainIsInsideDepot(const Vehicle *v)
 {
-	return (CheckTrainInDepot(v, false) > 0);
+	return CheckTrainInDepot(v, false) > 0;
 }
 
 /**
@@ -914,8 +871,6 @@
  */
 static Vehicle *UnlinkWagon(Vehicle *v, Vehicle *first)
 {
-	Vehicle *u;
-
 	// unlinking the first vehicle of the chain?
 	if (v == first) {
 		v = GetNextVehicle(v);
@@ -926,6 +881,7 @@
 		return v;
 	}
 
+	Vehicle *u;
 	for (u = first; GetNextVehicle(u) != v; u = GetNextVehicle(u)) {}
 	GetLastEnginePart(u)->next = GetNextVehicle(v);
 	return first;
@@ -973,8 +929,6 @@
  */
 static void NormaliseTrainConsist(Vehicle *v)
 {
-	Vehicle *u;
-
 	if (IsFreeWagon(v)) return;
 
 	assert(IsFrontEngine(v));
@@ -983,7 +937,8 @@
 		if (!IsMultiheaded(v) || !IsTrainEngine(v)) continue;
 
 		/* make sure that there are no free cars before next engine */
-		for (u = v; u->next != NULL && !IsTrainEngine(u->next); u = u->next);
+		Vehicle *u;
+		for (u = v; u->next != NULL && !IsTrainEngine(u->next); u = u->next) {}
 
 		if (u == v->u.rail.other_multiheaded_part) continue;
 		AddWagonToConsist(v->u.rail.other_multiheaded_part, u);
@@ -1001,19 +956,21 @@
 {
 	VehicleID s = GB(p1, 0, 16);
 	VehicleID d = GB(p1, 16, 16);
-	Vehicle *src, *dst, *src_head, *dst_head;
 
 	if (!IsValidVehicleID(s)) return CMD_ERROR;
 
-	src = GetVehicle(s);
-
-	if (src->type != VEH_Train) return CMD_ERROR;
+	Vehicle *src = GetVehicle(s);
+
+	if (src->type != VEH_Train || !CheckOwnership(src->owner)) return CMD_ERROR;
 
 	// if nothing is selected as destination, try and find a matching vehicle to drag to.
+	Vehicle *dst;
 	if (d == INVALID_VEHICLE) {
 		dst = IsTrainEngine(src) ? NULL : FindGoodVehiclePos(src);
 	} else {
+		if (!IsValidVehicleID(d)) return CMD_ERROR;
 		dst = GetVehicle(d);
+		if (dst->type != VEH_Train || !CheckOwnership(dst->owner)) return CMD_ERROR;
 	}
 
 	// if an articulated part is being handled, deal with its parent vehicle
@@ -1025,17 +982,16 @@
 	// don't move the same vehicle..
 	if (src == dst) return 0;
 
-	/* the player must be the owner */
-	if (!CheckOwnership(src->owner) || (dst != NULL && !CheckOwnership(dst->owner)))
-		return CMD_ERROR;
-
 	/* locate the head of the two chains */
-	src_head = GetFirstVehicleInChain(src);
-	dst_head = NULL;
+	Vehicle *src_head = GetFirstVehicleInChain(src);
+	Vehicle *dst_head;
 	if (dst != NULL) {
 		dst_head = GetFirstVehicleInChain(dst);
+		if (dst_head->tile != src_head->tile) return CMD_ERROR;
 		// Now deal with articulated part of destination wagon
 		dst = GetLastEnginePart(dst);
+	} else {
+		dst_head = NULL;
 	}
 
 	if (dst != NULL && IsMultiheaded(dst) && !IsTrainEngine(dst) && IsTrainWagon(src)) {
@@ -1055,9 +1011,9 @@
 
 	if (IsTrainEngine(src) && dst_head != NULL) {
 		/* we need to make sure that we didn't place it between a pair of multiheaded engines */
-		Vehicle *u, *engine = NULL;
-
-		for (u = dst_head; u != NULL; u = u->next) {
+		Vehicle *engine = NULL;
+
+		for (Vehicle *u = dst_head; u != NULL; u = u->next) {
 			if (IsTrainEngine(u) && IsMultiheaded(u) && u->u.rail.other_multiheaded_part != NULL) {
 				engine = u;
 			}
@@ -1077,11 +1033,10 @@
 	if (HASBIT(p2, 0) && src_head == dst_head) return 0;
 
 	{
-		int src_len = 0;
 		int max_len = _patches.mammoth_trains ? 100 : 9;
 
 		// check if all vehicles in the source train are stopped inside a depot.
-		src_len = CheckTrainStoppedInDepot(src_head);
+		int src_len = CheckTrainStoppedInDepot(src_head);
 		if (src_len < 0) return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
 
 		// check the destination row if the source and destination aren't the same.
@@ -1092,8 +1047,6 @@
 				// check if all vehicles in the dest train are stopped.
 				dst_len = CheckTrainStoppedInDepot(dst_head);
 				if (dst_len < 0) return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
-
-				assert(dst_head->tile == src_head->tile);
 			}
 
 			// We are moving between rows, so only count the wagons from the source
@@ -1144,12 +1097,8 @@
 	/* do it? */
 	if (flags & DC_EXEC) {
 		/* clear the ->first cache */
-		{
-			Vehicle *u;
-
-			for (u = src_head; u != NULL; u = u->next) u->first = NULL;
-			for (u = dst_head; u != NULL; u = u->next) u->first = NULL;
-		}
+		for (Vehicle *u = src_head; u != NULL; u = u->next) u->first = NULL;
+		for (Vehicle *u = dst_head; u != NULL; u = u->next) u->first = NULL;
 
 		if (HASBIT(p2, 0)) {
 			// unlink ALL wagons
@@ -1257,7 +1206,7 @@
 			}
 			/* Update the depot window */
 			InvalidateWindow(WC_VEHICLE_DEPOT, src_head->tile);
-		};
+		}
 
 		if (dst_head != NULL) {
 			NormaliseTrainConsist(dst_head);
@@ -1286,18 +1235,15 @@
  */
 int32 CmdStartStopTrain(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-	uint16 callback;
-
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Train || !CheckOwnership(v->owner)) return CMD_ERROR;
 
 	/* Check if this train can be started/stopped. The callback will fail or
 	 * return 0xFF if it can. */
-	callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v);
+	uint16 callback = GetVehicleCallback(CBID_VEHICLE_START_STOP_CHECK, 0, 0, v->engine_type, v);
 	if (callback != CALLBACK_FAILED && callback != 0xFF) {
 		StringID error = GetGRFStringID(GetEngineGRFID(v->engine_type), 0xD000 + callback);
 		return_cmd_error(error);
@@ -1330,20 +1276,16 @@
  */
 int32 CmdSellRailWagon(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v, *tmp, *first;
-	Vehicle *new_f = NULL;
-	int32 cost = 0;
-
 	if (!IsValidVehicleID(p1) || p2 > 2) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Train || !CheckOwnership(v->owner)) return CMD_ERROR;
 
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
 	while (IsArticulatedPart(v)) v = GetPrevVehicleInChain(v);
-	first = GetFirstVehicleInChain(v);
+	Vehicle *first = GetFirstVehicleInChain(v);
 
 	// make sure the vehicle is stopped in the depot
 	if (CheckTrainStoppedInDepot(first) < 0) {
@@ -1360,6 +1302,7 @@
 		RebuildVehicleLists();
 	}
 
+	int32 cost = 0;
 	switch (p2) {
 		case 0: case 2: { /* Delete given wagon */
 			bool switch_engine = false;    // update second wagon to engine?
@@ -1382,10 +1325,10 @@
 			/* 2. We are selling the first engine, some special action might be required
 			 * here, so take attention */
 			if ((flags & DC_EXEC) && v == first) {
-				new_f = GetNextVehicle(first);
+				Vehicle *new_f = GetNextVehicle(first);
 
 				/* 2.1 If the first wagon is sold, update the first-> pointers to NULL */
-				for (tmp = first; tmp != NULL; tmp = tmp->next) tmp->first = NULL;
+				for (Vehicle *tmp = first; tmp != NULL; tmp = tmp->next) tmp->first = NULL;
 
 				/* 2.2 If there are wagons present after the deleted front engine, check
          * if the second wagon (which will be first) is an engine. If it is one,
@@ -1443,6 +1386,7 @@
 				 * Totally braindead cause building a new engine adds all loco-less
 				 * engines to its train anyways */
 				if (p2 == 2 && HASBIT(ori_subtype, Train_Front)) {
+					Vehicle *tmp;
 					for (v = first; v != NULL; v = tmp) {
 						tmp = GetNextVehicle(v);
 						DoCommand(v->tile, v->index | INVALID_VEHICLE << 16, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
@@ -1454,6 +1398,7 @@
 			/* Start deleting every vehicle after the selected one
 			 * If we encounter a matching rear-engine to a front-engine
 			 * earlier in the chain (before deletion), leave it alone */
+			Vehicle *tmp;
 			for (; v != NULL; v = tmp) {
 				tmp = GetNextVehicle(v);
 
@@ -1541,10 +1486,8 @@
 
 static void SwapTrainFlags(byte *swap_flag1, byte *swap_flag2)
 {
-	byte flag1, flag2;
-
-	flag1 = *swap_flag1;
-	flag2 = *swap_flag2;
+	byte flag1 = *swap_flag1;
+	byte flag2 = *swap_flag2;
 
 	/* Clear the flags */
 	CLRBIT(*swap_flag1, VRF_GOINGUP);
@@ -1638,35 +1581,25 @@
  */
 static void AdvanceWagons(Vehicle *v, bool before)
 {
-	Vehicle* base;
-	Vehicle* first;
-	int length;
-
-	base = v;
-	first = base->next;
-	length = CountVehiclesInChain(v);
+	Vehicle *base = v;
+	Vehicle *first = base->next;
+	uint length = CountVehiclesInChain(v);
 
 	while (length > 2) {
-		Vehicle* last;
-		int differential;
-		int i;
-
 		// find pairwise matching wagon
 		// start<>end, start+1<>end-1, ...
-		last = first;
-		for (i = length - 3; i > 0; i--) last = last->next;
-
-		differential = last->u.rail.cached_veh_length - base->u.rail.cached_veh_length;
+		Vehicle *last = first;
+		for (uint i = length - 3; i > 0; i--) last = last->next;
+
+		int differential = last->u.rail.cached_veh_length - base->u.rail.cached_veh_length;
 		if (before) differential *= -1;
 
 		if (differential > 0) {
-			Vehicle* tempnext;
-
 			// disconnect last car to make sure only this subset moves
-			tempnext = last->next;
+			Vehicle *tempnext = last->next;
 			last->next = NULL;
 
-			for (i = 0; i < differential; i++) TrainController(first, false);
+			for (int i = 0; i < differential; i++) TrainController(first, false);
 
 			last->next = tempnext;
 		}
@@ -1680,9 +1613,6 @@
 
 static void ReverseTrainDirection(Vehicle *v)
 {
-	int l = 0, r = -1;
-	Vehicle *u;
-
 	if (IsTileDepotType(v->tile, TRANSPORT_RAIL)) {
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
 	}
@@ -1704,12 +1634,14 @@
 	}
 
 	// count number of vehicles
-	u = v;
+	int r = -1;
+	const Vehicle *u = v;
 	do r++; while ( (u = u->next) != NULL );
 
 	AdvanceWagons(v, true);
 
 	/* swap start<>end, start+1<>end-1, ... */
+	int l = 0;
 	do {
 		ReverseTrainSwapVeh(v, l++, r--);
 	} while (l <= r);
@@ -1730,23 +1662,20 @@
  */
 int32 CmdReverseTrainDirection(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Train || !CheckOwnership(v->owner)) return CMD_ERROR;
 
 	if (p2) {
 		// turn a single unit around
-		Vehicle *front;
 
 		if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) {
 			return_cmd_error(STR_ONLY_TURN_SINGLE_UNIT);
 		}
 
-		front = GetFirstVehicleInChain(v);
+		Vehicle *front = GetFirstVehicleInChain(v);
 		// make sure the vehicle is stopped in the depot
 		if (CheckTrainStoppedInDepot(front) < 0) {
 			return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
@@ -1781,11 +1710,9 @@
  */
 int32 CmdForceTrainProceed(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Train || !CheckOwnership(v->owner)) return CMD_ERROR;
 
@@ -1805,13 +1732,10 @@
 {
 	CargoID new_cid = GB(p2, 0, 8);
 	byte new_subtype = GB(p2, 8, 8);
-	Vehicle *v;
-	int32 cost;
-	uint num;
 
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Train || !CheckOwnership(v->owner)) return CMD_ERROR;
 	if (CheckTrainStoppedInDepot(v) < 0) return_cmd_error(STR_TRAIN_MUST_BE_STOPPED);
@@ -1821,8 +1745,8 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_TRAIN_RUN);
 
-	cost = 0;
-	num = 0;
+	int32 cost = 0;
+	uint num = 0;
 
 	do {
 		/* XXX: We also refit all the attached wagons en-masse if they
@@ -1831,7 +1755,6 @@
 		if (!CanRefitTo(v->engine_type, new_cid)) continue;
 
 		if (v->cargo_cap != 0) {
-			const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
 			uint16 amount = CALLBACK_FAILED;
 
 			if (HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_REFIT_CAPACITY)) {
@@ -1848,6 +1771,7 @@
 			}
 
 			if (amount == CALLBACK_FAILED) { // callback failed or not used, use default
+				const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
 				CargoID old_cid = rvi->cargo_type;
 				/* normally, the capacity depends on the cargo type, a rail vehicle can
 				 * carry twice as much mail/goods as normal cargo, and four times as
@@ -1866,7 +1790,7 @@
 					case CT_GOODS: amount /= 2; break;
 					default:       amount /= 4; break;
 				}
-			};
+			}
 
 			if (amount != 0) {
 				if (new_cid != v->cargo_type) {
@@ -1924,16 +1848,15 @@
 // crashed!
 static TrainFindDepotData FindClosestTrainDepot(Vehicle *v, int max_distance)
 {
+	assert(!(v->vehstatus & VS_CRASHED));
+
 	TrainFindDepotData tfdd;
-	TileIndex tile = v->tile;
-
-	assert(!(v->vehstatus & VS_CRASHED));
-
 	tfdd.owner = v->owner;
 	tfdd.best_length = (uint)-1;
 	tfdd.reverse = false;
 
-	if (IsTileDepotType(tile, TRANSPORT_RAIL)){
+	TileIndex tile = v->tile;
+	if (IsTileDepotType(tile, TRANSPORT_RAIL)) {
 		tfdd.tile = tile;
 		tfdd.best_length = 0;
 		return tfdd;
@@ -1943,13 +1866,12 @@
 		bool found = YapfFindNearestRailDepotTwoWay(v, max_distance, NPF_INFINITE_PENALTY, &tfdd.tile, &tfdd.reverse);
 		tfdd.best_length = found ? max_distance / 2 : -1; // some fake distance or NOT_FOUND
 	} else if (_patches.new_pathfinding_all) {
-		NPFFoundTargetData ftd;
 		Vehicle* last = GetLastVehicleInChain(v);
 		Trackdir trackdir = GetVehicleTrackdir(v);
 		Trackdir trackdir_rev = ReverseTrackdir(GetVehicleTrackdir(last));
 
-		assert (trackdir != INVALID_TRACKDIR);
-		ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, last->tile, trackdir_rev, TRANSPORT_RAIL, v->owner, v->u.rail.compatible_railtypes, NPF_INFINITE_PENALTY);
+		assert(trackdir != INVALID_TRACKDIR);
+		NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, last->tile, trackdir_rev, TRANSPORT_RAIL, v->owner, v->u.rail.compatible_railtypes, NPF_INFINITE_PENALTY);
 		if (ftd.best_bird_dist == 0) {
 			/* Found target */
 			tfdd.tile = ftd.node.tile;
@@ -1962,9 +1884,7 @@
 		}
 	} else {
 		// search in the forward direction first.
-		DiagDirection i;
-
-		i = DirToDiagDir(v->direction);
+		DiagDirection i = DirToDiagDir(v->direction);
 		if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) {
 			i = ChangeDiagDir(i, DIAGDIRDIFF_90LEFT);
 		}
@@ -1992,9 +1912,6 @@
  */
 int32 CmdSendTrainToDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	Vehicle *v;
-	TrainFindDepotData tfdd;
-
 	if (p2 & DEPOT_MASS_SEND) {
 		/* Mass goto depot requested */
 		if (!ValidVLWFlags(p2 & VLW_MASK)) return CMD_ERROR;
@@ -2003,7 +1920,7 @@
 
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
-	v = GetVehicle(p1);
+	Vehicle *v = GetVehicle(p1);
 
 	if (v->type != VEH_Train || !CheckOwnership(v->owner)) return CMD_ERROR;
 
@@ -2039,7 +1956,7 @@
 	 * the check is down here to make it possible to alter stop/service for trains entering the depot */
 	if (IsTileDepotType(v->tile, TRANSPORT_RAIL) && v->cur_speed == 0) return CMD_ERROR;
 
-	tfdd = FindClosestTrainDepot(v, 0);
+	TrainFindDepotData tfdd = FindClosestTrainDepot(v, 0);
 	if (tfdd.best_length == (uint)-1) return_cmd_error(STR_883A_UNABLE_TO_FIND_ROUTE_TO);
 
 	if (flags & DC_EXEC) {
@@ -2070,20 +1987,18 @@
 
 static void HandleLocomotiveSmokeCloud(const Vehicle* v)
 {
-	const Vehicle* u;
 	bool sound = false;
 
 	if (v->vehstatus & VS_TRAIN_SLOWING || v->load_unload_time_rem != 0 || v->cur_speed < 2)
 		return;
 
-	u = v;
+	const Vehicle* u = v;
 
 	do {
 		const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
 		int effect_offset = GB(v->u.rail.cached_vis_effect, 0, 4) - 8;
 		byte effect_type = GB(v->u.rail.cached_vis_effect, 4, 2);
 		bool disable_effect = HASBIT(v->u.rail.cached_vis_effect, 6);
-		int x, y;
 
 		// no smoke?
 		if ((rvi->railveh_type == RAILVEH_WAGON && effect_type == 0) ||
@@ -2097,7 +2012,7 @@
 		if (IsTileDepotType(v->tile, TRANSPORT_RAIL) || IsTunnelTile(v->tile)) continue;
 
 		// No sparks for electric vehicles on nonelectrified tracks
-		if (!HasPowerOnRail(v->u.rail.railtype, GetTileRailType(v->tile, TrackdirToTrack(GetVehicleTrackdir(v))))) continue;
+		if (!HasPowerOnRail(v->u.rail.railtype, GetTileRailType(v->tile))) continue;
 
 		if (effect_type == 0) {
 			// Use default effect type for engine class.
@@ -2106,8 +2021,8 @@
 			effect_type--;
 		}
 
-		x = _vehicle_smoke_pos[v->direction] * effect_offset;
-		y = _vehicle_smoke_pos[(v->direction + 2) % 8] * effect_offset;
+		int x = _vehicle_smoke_pos[v->direction] * effect_offset;
+		int y = _vehicle_smoke_pos[(v->direction + 2) % 8] * effect_offset;
 
 		if (HASBIT(v->u.rail.flags, VRF_REVERSE_DIRECTION)) {
 			x = -x;
@@ -2152,10 +2067,9 @@
 		SND_0A_TRAIN_HORN
 	};
 
+	if (PlayVehicleSound(v, VSE_START)) return;
+
 	EngineID engtype = v->engine_type;
-
-	if (PlayVehicleSound(v, VSE_START)) return;
-
 	switch (RailVehInfo(engtype)->railtype) {
 		case RAILTYPE_RAIL:
 		case RAILTYPE_ELECTRIC:
@@ -2170,10 +2084,8 @@
 
 static bool CheckTrainStayInDepot(Vehicle *v)
 {
-	Vehicle *u;
-
 	// bail out if not all wagons are in the same depot or not in a depot at all
-	for (u = v; u != NULL; u = u->next) {
+	for (const Vehicle *u = v; u != NULL; u = u->next) {
 		if (u->u.rail.track != TRACK_BIT_DEPOT || u->tile != v->tile) return false;
 	}
 
@@ -2245,10 +2157,8 @@
 		ttfd->best_track = track;
 		return true;
 	} else {
-		uint dist;
-
 		// didn't find station, keep track of the best path so far.
-		dist = DistanceManhattan(tile, ttfd->dest_coords);
+		uint dist = DistanceManhattan(tile, ttfd->dest_coords);
 		if (dist < ttfd->best_bird_dist) {
 			ttfd->best_bird_dist = dist;
 			ttfd->best_track = track;
@@ -2297,7 +2207,6 @@
 /* choose a track */
 static Track ChooseTrainTrack(Vehicle* v, TileIndex tile, DiagDirection enterdir, TrackBits tracks)
 {
-	TrainTrackFollowerData fd;
 	Track best_track;
 	// pathfinders are able to tell that route was only 'guessed'
 	bool path_not_found = false;
@@ -2320,18 +2229,14 @@
 		}
 	} else if (_patches.new_pathfinding_all) { /* Use a new pathfinding for everything */
 		void* perf = NpfBeginInterval();
-		int time = 0;
 
 		NPFFindStationOrTileData fstd;
-		NPFFoundTargetData ftd;
-		Trackdir trackdir;
-
 		NPFFillWithOrderData(&fstd, v);
 		/* The enterdir for the new tile, is the exitdir for the old tile */
-		trackdir = GetVehicleTrackdir(v);
+		Trackdir trackdir = GetVehicleTrackdir(v);
 		assert(trackdir != 0xff);
 
-		ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.compatible_railtypes);
+		NPFFoundTargetData ftd = NPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.compatible_railtypes);
 
 		if (ftd.best_trackdir == 0xff) {
 			/* We are already at our target. Just do something */
@@ -2348,12 +2253,12 @@
 			best_track = TrackdirToTrack(ftd.best_trackdir);
 		}
 
-		time = NpfEndInterval(perf);
+		int time = NpfEndInterval(perf);
 		DEBUG(yapf, 4, "[NPFT] %d us - %d rounds - %d open - %d closed -- ", time, 0, _aystar_stats_open_size, _aystar_stats_closed_size);
 	} else {
 		void* perf = NpfBeginInterval();
-		int time = 0;
-
+
+		TrainTrackFollowerData fd;
 		FillWithStationData(&fd, v);
 
 		/* New train pathfinding */
@@ -2374,7 +2279,7 @@
 			best_track = TrackdirToTrack(fd.best_track);
 		}
 
-		time = NpfEndInterval(perf);
+		int time = NpfEndInterval(perf);
 		DEBUG(yapf, 4, "[NTPT] %d us - %d rounds - %d open - %d closed -- ", time, 0, 0, 0);
 	}
 	// handle "path not found" state
@@ -2412,26 +2317,19 @@
 
 static bool CheckReverseTrain(Vehicle *v)
 {
-	TrainTrackFollowerData fd;
-	int i, r;
-	int best_track;
-	uint best_bird_dist  = 0;
-	uint best_track_dist = 0;
-	uint reverse, reverse_best;
-
 	if (_opt.diff.line_reverse_mode != 0 ||
 			v->u.rail.track == TRACK_BIT_DEPOT || v->u.rail.track == TRACK_BIT_WORMHOLE ||
 			!(v->direction & 1))
 		return false;
 
+	TrainTrackFollowerData fd;
 	FillWithStationData(&fd, v);
 
-	best_track = -1;
-	reverse_best = reverse = 0;
+	uint reverse_best = 0;
 
 	assert(v->u.rail.track);
 
-	i = _search_directions[FIND_FIRST_BIT(v->u.rail.track)][DirToDiagDir(v->direction)];
+	int i = _search_directions[FIND_FIRST_BIT(v->u.rail.track)][DirToDiagDir(v->direction)];
 
 	if (_patches.yapf.rail_use_yapf) {
 		reverse_best = YapfCheckReverseTrain(v);
@@ -2460,6 +2358,11 @@
 			}
 		}
 	} else {
+		int best_track = -1;
+		uint reverse = 0;
+		uint best_bird_dist  = 0;
+		uint best_track_dist = 0;
+
 		for (;;) {
 			fd.best_bird_dist = (uint)-1;
 			fd.best_track_dist = (uint)-1;
@@ -2489,7 +2392,7 @@
 
 				/* if we reach this position, there's two paths of equal value so far.
 				 * pick one randomly. */
-				r = GB(Random(), 0, 8);
+				int r = GB(Random(), 0, 8);
 				if (_pick_track_table[i] == (v->direction & 3)) r += 80;
 				if (_pick_track_table[best_track] == (v->direction & 3)) r -= 80;
 				if (r <= 127) goto bad;
@@ -2510,9 +2413,6 @@
 
 static bool ProcessTrainOrder(Vehicle *v)
 {
-	const Order *order;
-	bool at_waypoint = false;
-
 	switch (v->current_order.type) {
 		case OT_GOTO_DEPOT:
 			if (!(v->current_order.flags & OF_PART_OF_ORDERS)) return false;
@@ -2530,6 +2430,7 @@
 	}
 
 	// check if we've reached the waypoint?
+	bool at_waypoint = false;
 	if (v->current_order.type == OT_GOTO_WAYPOINT && v->tile == v->dest_tile) {
 		v->cur_order_index++;
 		at_waypoint = true;
@@ -2546,7 +2447,7 @@
 	// Get the current order
 	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
 
-	order = GetVehicleOrder(v, v->cur_order_index);
+	const Order *order = GetVehicleOrder(v, v->cur_order_index);
 
 	// If no order, do nothing.
 	if (order == NULL) {
@@ -2651,7 +2552,6 @@
 
 static int UpdateTrainSpeed(Vehicle *v)
 {
-	uint spd;
 	uint accel;
 
 	if (v->vehstatus & VS_STOPPED || HASBIT(v->u.rail.flags, VRF_REVERSING)) {
@@ -2668,7 +2568,7 @@
 		}
 	}
 
-	spd = v->subspeed + accel * 2;
+	uint spd = v->subspeed + accel * 2;
 	v->subspeed = (byte)spd;
 	{
 		int tempmax = v->max_speed;
@@ -2686,17 +2586,16 @@
 
 static void TrainEnterStation(Vehicle *v, StationID station)
 {
-	Station *st;
-	uint32 flags;
-
 	v->last_station_visited = station;
 
 	/* check if a train ever visited this station before */
-	st = GetStation(station);
+	Station *st = GetStation(station);
 	if (!(st->had_vehicle_of_type & HVOT_TRAIN)) {
 		st->had_vehicle_of_type |= HVOT_TRAIN;
 		SetDParam(0, st->index);
-		flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
+		uint32 flags = v->owner == _local_player ?
+			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) :
+			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ARRIVAL_OTHER,  0);
 		AddNewsItem(
 			STR_8801_CITIZENS_CELEBRATE_FIRST,
 			flags,
@@ -2732,12 +2631,10 @@
 
 static byte AfterSetTrainPos(Vehicle *v, bool new_tile)
 {
-	byte new_z, old_z;
-
 	// need this hint so it returns the right z coordinate on bridges.
-	new_z = GetSlopeZ(v->x_pos, v->y_pos);
-
-	old_z = v->z_pos;
+	byte new_z = GetSlopeZ(v->x_pos, v->y_pos);
+
+	byte old_z = v->z_pos;
 	v->z_pos = new_z;
 
 	if (new_tile) {
@@ -2832,25 +2729,21 @@
 /* Modify the speed of the vehicle due to a turn */
 static void AffectSpeedByDirChange(Vehicle* v, Direction new_dir)
 {
-	DirDiff diff;
-	const RailtypeSlowdownParams *rsp;
-
 	if (_patches.realistic_acceleration) return;
 
-	diff = DirDifference(v->direction, new_dir);
+	DirDiff diff = DirDifference(v->direction, new_dir);
 	if (diff == DIRDIFF_SAME) return;
 
-	rsp = &_railtype_slowdown[v->u.rail.railtype];
+	const RailtypeSlowdownParams *rsp = &_railtype_slowdown[v->u.rail.railtype];
 	v->cur_speed -= (diff == DIRDIFF_45RIGHT || diff == DIRDIFF_45LEFT ? rsp->small_turn : rsp->large_turn) * v->cur_speed >> 8;
 }
 
 /* Modify the speed of the vehicle due to a change in altitude */
 static void AffectSpeedByZChange(Vehicle *v, byte old_z)
 {
-	const RailtypeSlowdownParams *rsp;
 	if (old_z == v->z_pos || _patches.realistic_acceleration) return;
 
-	rsp = &_railtype_slowdown[v->u.rail.railtype];
+	const RailtypeSlowdownParams *rsp = &_railtype_slowdown[v->u.rail.railtype];
 
 	if (old_z < v->z_pos) {
 		v->cur_speed -= (v->cur_speed * rsp->z_up >> 8);
@@ -2899,13 +2792,11 @@
 
 static void SetVehicleCrashed(Vehicle *v)
 {
-	Vehicle *u;
-
 	if (v->u.rail.crash_anim_pos != 0) return;
 
 	v->u.rail.crash_anim_pos++;
 
-	u = v;
+	Vehicle *u = v;
 	BEGIN_ENUM_WAGONS(v)
 		v->vehstatus |= VS_CRASHED;
 	END_ENUM_WAGONS(v)
@@ -2930,24 +2821,20 @@
  */
 static void CheckTrainCollision(Vehicle *v)
 {
-	TrainCollideChecker tcc;
-	Vehicle *coll;
-	Vehicle *realcoll;
-	uint num;
-
 	/* can't collide in depot */
 	if (v->u.rail.track == TRACK_BIT_DEPOT) return;
 
 	assert(v->u.rail.track == TRACK_BIT_WORMHOLE || TileVirtXY(v->x_pos, v->y_pos) == v->tile);
 
+	TrainCollideChecker tcc;
 	tcc.v = v;
 	tcc.v_skip = v->next;
 
 	/* find colliding vehicle */
-	realcoll = (Vehicle*)VehicleFromPos(TileVirtXY(v->x_pos, v->y_pos), &tcc, FindTrainCollideEnum);
+	Vehicle *realcoll = (Vehicle*)VehicleFromPos(TileVirtXY(v->x_pos, v->y_pos), &tcc, FindTrainCollideEnum);
 	if (realcoll == NULL) return;
 
-	coll = GetFirstVehicleInChain(realcoll);
+	Vehicle *coll = GetFirstVehicleInChain(realcoll);
 
 	/* it can't collide with its own wagons */
 	if (v == coll ||
@@ -2955,7 +2842,7 @@
 		return;
 
 	//two drivers + passangers killed in train v
-	num = 2 + CountPassengersInTrain(v);
+	uint num = 2 + CountPassengersInTrain(v);
 	if (!(coll->vehstatus & VS_CRASHED))
 		//two drivers + passangers killed in train coll (if it was not crashed already)
 		num += 2 + CountPassengersInTrain(coll);
@@ -2994,23 +2881,15 @@
 static void TrainController(Vehicle *v, bool update_image)
 {
 	Vehicle *prev;
-	GetNewVehiclePosResult gp;
-	uint32 r, tracks, ts;
-	Trackdir i;
-	DiagDirection enterdir;
-	Direction dir;
-	Direction newdir;
-	Direction chosen_dir;
-	TrackBits chosen_track;
-	byte old_z;
 
 	/* For every vehicle after and including the given vehicle */
 	for (prev = GetPrevVehicleInChain(v); v != NULL; prev = v, v = v->next) {
 		BeginVehicleMove(v);
 
+		GetNewVehiclePosResult gp = GetNewVehiclePos(v);
 		if (v->u.rail.track != TRACK_BIT_WORMHOLE) {
 			/* Not inside tunnel */
-			if (GetNewVehiclePos(v, &gp)) {
+			if (gp.old_tile == gp.new_tile) {
 				/* Staying in the old tile */
 				if (v->u.rail.track == TRACK_BIT_DEPOT) {
 					/* Inside depot */
@@ -3021,7 +2900,7 @@
 
 					if (IsFrontEngine(v) && !TrainCheckIfLineEnds(v)) return;
 
-					r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
+					uint32 r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
 					if (HASBIT(r, VETS_CANNOT_ENTER)) {
 						goto invalid_rail;
 					}
@@ -3039,21 +2918,20 @@
 			} else {
 				/* A new tile is about to be entered. */
 
-				TrackBits bits;
 				/* Determine what direction we're entering the new tile from */
-				dir = GetNewVehicleDirectionByTile(gp.new_tile, gp.old_tile);
-				enterdir = DirToDiagDir(dir);
+				Direction dir = GetNewVehicleDirectionByTile(gp.new_tile, gp.old_tile);
+				DiagDirection enterdir = DirToDiagDir(dir);
 				assert(IsValidDiagDirection(enterdir));
 
 				/* Get the status of the tracks in the new tile and mask
 				 * away the bits that aren't reachable. */
-				ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL) & _reachable_tracks[enterdir];
+				uint32 ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL) & _reachable_tracks[enterdir];
 
 				/* Combine the from & to directions.
 				 * Now, the lower byte contains the track status, and the byte at bit 16 contains
 				 * the signal status. */
-				tracks = ts | (ts >> 8);
-				bits = (TrackBits)(tracks & TRACK_BIT_MASK);
+				uint32 tracks = ts | (ts >> 8);
+				TrackBits bits = (TrackBits)(tracks & TRACK_BIT_MASK);
 				if ((_patches.new_pathfinding_all || _patches.yapf.rail_use_yapf) && _patches.forbid_90_deg && prev == NULL) {
 					/* We allow wagons to make 90 deg turns, because forbid_90_deg
 					 * can be switched on halfway a turn */
@@ -3066,14 +2944,41 @@
 				 * with the current train, if not, bail out. */
 				if (!CheckCompatibleRail(v, gp.new_tile)) goto invalid_rail;
 
+				TrackBits chosen_track;
 				if (prev == NULL) {
 					/* Currently the locomotive is active. Determine which one of the
 					 * available tracks to choose */
-					chosen_track = 1 << ChooseTrainTrack(v, gp.new_tile, enterdir, bits);
+					chosen_track = TrackToTrackBits(ChooseTrainTrack(v, gp.new_tile, enterdir, bits));
 					assert(chosen_track & tracks);
 
 					/* Check if it's a red signal and that force proceed is not clicked. */
-					if ((tracks >> 16) & chosen_track && v->u.rail.force_proceed == 0) goto red_light;
+					if ((tracks >> 16) & chosen_track && v->u.rail.force_proceed == 0) {
+						// In front of a red signal
+						/* find the first set bit in ts. need to do it in 2 steps, since
+						 * FIND_FIRST_BIT only handles 6 bits at a time. */
+						Trackdir i = FindFirstTrackdir((TrackdirBits)(uint16)ts);
+
+						if (!HasSignalOnTrackdir(gp.new_tile, ReverseTrackdir(i))) {
+							v->cur_speed = 0;
+							v->subspeed = 0;
+							v->progress = 255 - 100;
+							if (++v->load_unload_time_rem < _patches.wait_oneway_signal * 20) return;
+						} else if (HasSignalOnTrackdir(gp.new_tile, i)) {
+							v->cur_speed = 0;
+							v->subspeed = 0;
+							v->progress = 255-10;
+							if (++v->load_unload_time_rem < _patches.wait_twoway_signal * 73) {
+								TileIndex o_tile = gp.new_tile + TileOffsByDiagDir(enterdir);
+								VehicleAtSignalData vasd;
+								vasd.tile = o_tile;
+								vasd.direction = ReverseDir(dir);
+
+								/* check if a train is waiting on the other side */
+								if (VehicleFromPos(o_tile, &vasd, CheckVehicleAtSignal) == NULL) return;
+							}
+						}
+						goto reverse_train_direction;
+					}
 				} else {
 					static const TrackBits _matching_tracks[8] = {
 							TRACK_BIT_LEFT  | TRACK_BIT_RIGHT, TRACK_BIT_X,
@@ -3093,15 +2998,13 @@
 						chosen_track == TRACK_BIT_LEFT  || chosen_track == TRACK_BIT_RIGHT);
 
 				/* Update XY to reflect the entrance to the new tile, and select the direction to use */
-				{
-					const byte *b = _initial_tile_subcoord[FIND_FIRST_BIT(chosen_track)][enterdir];
-					gp.x = (gp.x & ~0xF) | b[0];
-					gp.y = (gp.y & ~0xF) | b[1];
-					chosen_dir = (Direction)b[2];
-				}
+				const byte *b = _initial_tile_subcoord[FIND_FIRST_BIT(chosen_track)][enterdir];
+				gp.x = (gp.x & ~0xF) | b[0];
+				gp.y = (gp.y & ~0xF) | b[1];
+				Direction chosen_dir = (Direction)b[2];
 
 				/* Call the landscape function and tell it that the vehicle entered the tile */
-				r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
+				uint32 r = VehicleEnterTile(v, gp.new_tile, gp.x, gp.y);
 				if (HASBIT(r, VETS_CANNOT_ENTER)) {
 					goto invalid_rail;
 				}
@@ -3116,7 +3019,7 @@
 				if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) {
 					v->tile = gp.new_tile;
 
-					if (GetTileRailType(gp.new_tile, FindFirstTrack(chosen_track)) != GetTileRailType(gp.old_tile, FindFirstTrack(v->u.rail.track))) {
+					if (GetTileRailType(gp.new_tile) != GetTileRailType(gp.old_tile)) {
 						TrainPowerChanged(GetFirstVehicleInChain(v));
 					}
 
@@ -3136,9 +3039,10 @@
 			}
 		} else {
 			/* In tunnel or on a bridge */
-			GetNewVehiclePos(v, &gp);
-
-			SetSpeedLimitOnBridge(v);
+			if (!(v->vehstatus & VS_HIDDEN)) {
+				v->cur_speed =
+					min(v->cur_speed, GetBridge(GetBridgeType(v->tile))->speed);
+			}
 
 			if (!(IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) || !HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
 				v->x_pos = gp.x;
@@ -3150,7 +3054,7 @@
 		}
 
 		/* update image of train, as well as delta XY */
-		newdir = GetNewVehicleDirection(v, gp.x, gp.y);
+		Direction newdir = GetNewVehicleDirection(v, gp.x, gp.y);
 		UpdateTrainDeltaXY(v, newdir);
 		if (update_image) v->cur_image = GetTrainImage(v, newdir);
 
@@ -3158,7 +3062,7 @@
 		v->y_pos = gp.y;
 
 		/* update the Z position of the vehicle */
-		old_z = AfterSetTrainPos(v, (gp.new_tile != gp.old_tile));
+		byte old_z = AfterSetTrainPos(v, (gp.new_tile != gp.old_tile));
 
 		if (prev == NULL) {
 			/* This is the first vehicle in the train */
@@ -3170,34 +3074,6 @@
 invalid_rail:
 	/* We've reached end of line?? */
 	if (prev != NULL) error("!Disconnecting train");
-	goto reverse_train_direction;
-
-red_light: {
-	/* We're in front of a red signal ?? */
-		/* find the first set bit in ts. need to do it in 2 steps, since
-		 * FIND_FIRST_BIT only handles 6 bits at a time. */
-		i = FindFirstTrackdir((TrackdirBits)(uint16)ts);
-
-		if (!HasSignalOnTrackdir(gp.new_tile, ReverseTrackdir(i))) {
-			v->cur_speed = 0;
-			v->subspeed = 0;
-			v->progress = 255 - 100;
-			if (++v->load_unload_time_rem < _patches.wait_oneway_signal * 20) return;
-		} else if (HasSignalOnTrackdir(gp.new_tile, i)){
-			v->cur_speed = 0;
-			v->subspeed = 0;
-			v->progress = 255-10;
-			if (++v->load_unload_time_rem < _patches.wait_twoway_signal * 73) {
-				TileIndex o_tile = gp.new_tile + TileOffsByDiagDir(enterdir);
-				VehicleAtSignalData vasd;
-				vasd.tile = o_tile;
-				vasd.direction = ReverseDir(dir);
-
-				/* check if a train is waiting on the other side */
-				if (VehicleFromPos(o_tile, &vasd, CheckVehicleAtSignal) == NULL) return;
-			}
-		}
-	}
 
 reverse_train_direction:
 	v->load_unload_time_rem = 0;
@@ -3217,11 +3093,10 @@
  */
 static void DeleteLastWagon(Vehicle *v)
 {
-	Vehicle *u = v;
-
 	/* Go to the last wagon and delete the link pointing there
 	 * *u is then the one-before-last wagon, and *v the last
 	 * one which will physicially be removed */
+	Vehicle *u = v;
 	for (; v->next != NULL; v = v->next) u = v;
 	u->next = NULL;
 
@@ -3289,17 +3164,16 @@
 static void HandleCrashedTrain(Vehicle *v)
 {
 	int state = ++v->u.rail.crash_anim_pos;
-	uint32 r;
-	Vehicle *u;
 
 	if (state == 4 && !(v->vehstatus & VS_HIDDEN)) {
 		CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
 	}
 
+	uint32 r;
 	if (state <= 200 && CHANCE16R(1, 7, r)) {
 		int index = (r * 10 >> 16);
 
-		u = v;
+		Vehicle *u = v;
 		do {
 			if (--index < 0) {
 				r = Random();
@@ -3358,18 +3232,11 @@
 
 static bool TrainCheckIfLineEnds(Vehicle *v)
 {
-	TileIndex tile;
-	uint x,y;
-	uint16 break_speed;
-	DiagDirection dir;
-	int t;
-	uint32 ts;
-
-	t = v->breakdown_ctr;
+	int t = v->breakdown_ctr;
 	if (t > 1) {
 		v->vehstatus |= VS_TRAIN_SLOWING;
 
-		break_speed = _breakdown_speeds[GB(~t, 4, 4)];
+		uint16 break_speed = _breakdown_speeds[GB(~t, 4, 4)];
 		if (break_speed < v->cur_speed) v->cur_speed = break_speed;
 	} else {
 		v->vehstatus &= ~VS_TRAIN_SLOWING;
@@ -3378,12 +3245,10 @@
 	if (v->u.rail.track == TRACK_BIT_WORMHOLE) return true; // exit if inside a tunnel
 	if (v->u.rail.track == TRACK_BIT_DEPOT) return true; // exit if inside a depot
 
-	tile = v->tile;
+	TileIndex tile = v->tile;
 
 	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
-		DiagDirection dir;
-
-		dir = IsTunnel(tile) ? GetTunnelDirection(tile) : GetBridgeRampDirection(tile);
+		DiagDirection dir = IsTunnel(tile) ? GetTunnelDirection(tile) : GetBridgeRampDirection(tile);
 		if (DiagDirToDir(dir) == v->direction) return true;
 	}
 
@@ -3394,18 +3259,18 @@
 		return true;*/
 
 	/* Determine the non-diagonal direction in which we will exit this tile */
-	dir = DirToDiagDir(v->direction);
+	DiagDirection dir = DirToDiagDir(v->direction);
 	if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[dir]) {
 		dir = ChangeDiagDir(dir, DIAGDIRDIFF_90LEFT);
 	}
 	/* Calculate next tile */
 	tile += TileOffsByDiagDir(dir);
 	// determine the track status on the next tile.
-	ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[dir];
+	uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[dir];
 
 	/* Calc position within the current tile ?? */
-	x = v->x_pos & 0xF;
-	y = v->y_pos & 0xF;
+	uint x = v->x_pos & 0xF;
+	uint y = v->y_pos & 0xF;
 
 	switch (v->direction) {
 		case DIR_N : x = ~x + ~y + 24; break;
@@ -3447,7 +3312,7 @@
 
 	// slow down
 	v->vehstatus |= VS_TRAIN_SLOWING;
-	break_speed = _breakdown_speeds[x & 0xF];
+	uint16 break_speed = _breakdown_speeds[x & 0xF];
 	if (!(v->direction & 1)) break_speed >>= 1;
 	if (break_speed < v->cur_speed) v->cur_speed = break_speed;
 
@@ -3456,8 +3321,6 @@
 
 static void TrainLocoHandler(Vehicle *v, bool mode)
 {
-	int j;
-
 	/* train has crashed? */
 	if (v->u.rail.crash_anim_pos != 0) {
 		if (!mode) HandleCrashedTrain(v);
@@ -3498,7 +3361,7 @@
 
 	if (!mode) HandleLocomotiveSmokeCloud(v);
 
-	j = UpdateTrainSpeed(v);
+	int j = UpdateTrainSpeed(v);
 	if (j == 0) {
 		// if the vehicle has speed 0, update the last_speed field.
 		if (v->cur_speed != 0) return;
@@ -3541,9 +3404,6 @@
 
 static void CheckIfTrainNeedsService(Vehicle *v)
 {
-	const Depot* depot;
-	TrainFindDepotData tfdd;
-
 	if (_patches.servint_trains == 0)                   return;
 	if (!VehicleNeedsService(v))                        return;
 	if (v->vehstatus & VS_STOPPED)                      return;
@@ -3560,7 +3420,7 @@
 		return;
 	}
 
-	tfdd = FindClosestTrainDepot(v, MAX_ACCEPTABLE_DEPOT_DIST);
+	TrainFindDepotData tfdd = FindClosestTrainDepot(v, MAX_ACCEPTABLE_DEPOT_DIST);
 	/* Only go to the depot if it is not too far out of our way. */
 	if (tfdd.best_length == (uint)-1 || tfdd.best_length > MAX_ACCEPTABLE_DEPOT_DIST) {
 		if (v->current_order.type == OT_GOTO_DEPOT) {
@@ -3574,7 +3434,7 @@
 		return;
 	}
 
-	depot = GetDepotByTile(tfdd.tile);
+	const Depot* depot = GetDepotByTile(tfdd.tile);
 
 	if (v->current_order.type == OT_GOTO_DEPOT &&
 			v->current_order.dest != depot->index &&
@@ -3604,8 +3464,6 @@
 
 void OnNewDay_Train(Vehicle *v)
 {
-	TileIndex tile;
-
 	if ((++v->day_counter & 7) == 0) DecreaseVehicleValue(v);
 
 	if (IsFrontEngine(v)) {
@@ -3617,9 +3475,9 @@
 		CheckOrders(v);
 
 		/* update destination */
-		if (v->current_order.type == OT_GOTO_STATION &&
-				(tile = GetStation(v->current_order.dest)->train_tile) != 0) {
-			v->dest_tile = tile;
+		if (v->current_order.type == OT_GOTO_STATION) {
+			TileIndex tile = GetStation(v->current_order.dest)->train_tile;
+			if (tile != 0) v->dest_tile = tile;
 		}
 
 		if ((v->vehstatus & VS_STOPPED) == 0) {
@@ -3643,7 +3501,6 @@
 
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_Train && IsFrontEngine(v)) {
-
 			// show warning if train is not generating enough income last 2 years (corresponds to a red icon in the vehicle list)
 			if (_patches.train_income_warn && v->owner == _local_player && v->age >= 730 && v->profit_this_year < 0) {
 				SetDParam(1, v->profit_this_year);
@@ -3696,25 +3553,19 @@
 						u->spritenum--;
 					}
 
-					{
-						Vehicle *w;
-
-						for (w = u->next; w != NULL && (w->engine_type != u->engine_type || w->u.rail.other_multiheaded_part != NULL); w = GetNextVehicle(w));
-						if (w != NULL) {
-							/* we found a car to partner with this engine. Now we will make sure it face the right way */
-							if (IsTrainEngine(w)) {
-								ClearTrainEngine(w);
-								w->spritenum++;
-							}
+					Vehicle *w;
+					for (w = u->next; w != NULL && (w->engine_type != u->engine_type || w->u.rail.other_multiheaded_part != NULL); w = GetNextVehicle(w));
+					if (w != NULL) {
+						/* we found a car to partner with this engine. Now we will make sure it face the right way */
+						if (IsTrainEngine(w)) {
+							ClearTrainEngine(w);
+							w->spritenum++;
 						}
-
-						if (w != NULL) {
-							w->u.rail.other_multiheaded_part = u;
-							u->u.rail.other_multiheaded_part = w;
-						} else {
-							/* we got a front car and no rear cars. We will fake this one for forget that it should have been multiheaded */
-							ClearMultiheaded(u);
-						}
+						w->u.rail.other_multiheaded_part = u;
+						u->u.rail.other_multiheaded_part = w;
+					} else {
+						/* we got a front car and no rear cars. We will fake this one for forget that it should have been multiheaded */
+						ClearMultiheaded(u);
 					}
 				}
 			} END_ENUM_WAGONS(u)
--- a/src/tree_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/tree_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -228,8 +228,8 @@
 	ey = TileY(tile);
 	sx = TileX(p2);
 	sy = TileY(p2);
-	if (ex < sx) intswap(ex, sx);
-	if (ey < sy) intswap(ey, sy);
+	if (ex < sx) Swap(ex, sx);
+	if (ey < sy) Swap(ey, sy);
 
 	cost = 0; // total cost
 
@@ -237,8 +237,6 @@
 		for (y = sy; y <= ey; y++) {
 			TileIndex tile = TileXY(x, y);
 
-			if (!EnsureNoVehicle(tile)) continue;
-
 			switch (GetTileType(tile)) {
 				case MP_TREES:
 					// no more space for trees?
--- a/src/tunnelbridge_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file tunnelbridge_cmd.c
+/** @file tunnelbridge_cmd.cpp
  * This file deals with tunnels and bridges (non-gui stuff)
  * @todo seperate this file into two
  */
@@ -218,10 +218,10 @@
 	if (x == sx) {
 		if (y == sy) return_cmd_error(STR_5008_CANNOT_START_AND_END_ON);
 		direction = AXIS_Y;
-		if (y > sy) uintswap(y,sy);
+		if (y > sy) Swap(y, sy);
 	} else if (y == sy) {
 		direction = AXIS_X;
-		if (x > sx) uintswap(x,sx);
+		if (x > sx) Swap(x, sx);
 	} else {
 		return_cmd_error(STR_500A_START_AND_END_MUST_BE_IN);
 	}
@@ -1051,21 +1051,6 @@
 }
 
 
-uint SetSpeedLimitOnBridge(Vehicle *v)
-{
-	uint bridge_speed;
-	if (v->vehstatus & VS_HIDDEN) return v->max_speed; /* in tunnel */
-
-	bridge_speed = _bridge[GetBridgeType(v->tile)].speed;
-
-	if (v->type == VEH_Road) bridge_speed *= 2; /* XXX give vehicles proper speeds */
-
-	if (v->cur_speed > bridge_speed) v->cur_speed = bridge_speed;
-	return bridge_speed;
-}
-
-
-
 static uint GetSlopeZ_TunnelBridge(TileIndex tile, uint x, uint y)
 {
 	uint z;
--- a/src/variables.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/variables.h	Wed Feb 28 00:33:40 2007 +0000
@@ -337,19 +337,6 @@
 VARDEF char *_highscore_file;
 VARDEF char *_log_file;
 
-// NOSAVE: These can be recalculated from InitializeLandscapeVariables
-typedef struct {
-	StringID names_s[NUM_CARGO];
-	StringID names_long[NUM_CARGO];
-	StringID names_short[NUM_CARGO];
-	byte weights[NUM_CARGO];
-	SpriteID sprites[NUM_CARGO];
-	byte transit_days_1[NUM_CARGO];
-	byte transit_days_2[NUM_CARGO];
-} CargoConst;
-
-VARDEF CargoConst _cargoc;
-
 
 static inline void SetDParamX(uint32 *s, uint n, uint32 v)
 {
--- a/src/vehicle.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/vehicle.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -37,6 +37,7 @@
 #include "newgrf_engine.h"
 #include "newgrf_sound.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 #define INVALID_COORD (-0x8000)
 #define GEN_HASH(x, y) ((GB((y), 6, 6) << 6) + GB((x), 7, 6))
@@ -180,8 +181,8 @@
 
 	/* Make sure x1 < x2 or y1 < y2 */
 	if (x1 > x2 || y1 > y2) {
-		intswap(x1,x2);
-		intswap(y1,y2);
+		Swap(x1, x2);
+		Swap(y1, y2);
 	}
 	FOR_ALL_VEHICLES(veh) {
 		if (without_crashed && (veh->vehstatus & VS_CRASHED) != 0) continue;
@@ -761,8 +762,7 @@
  */
 bool CanRefitTo(EngineID engine_type, CargoID cid_to)
 {
-	CargoID cid = _global_cargo_id[_opt_ptr->landscape][cid_to];
-	return HASBIT(EngInfo(engine_type)->refit_mask, cid);
+	return HASBIT(EngInfo(engine_type)->refit_mask, cid_to);
 }
 
 /** Find the first cargo type that an engine can be refitted to.
@@ -771,12 +771,11 @@
  */
 CargoID FindFirstRefittableCargo(EngineID engine_type)
 {
-	CargoID cid;
 	uint32 refit_mask = EngInfo(engine_type)->refit_mask;
 
 	if (refit_mask != 0) {
-		for (cid = CT_PASSENGERS; cid < NUM_CARGO; cid++) {
-			if (HASBIT(refit_mask, _global_cargo_id[_opt_ptr->landscape][cid])) return cid;
+		for (CargoID cid = CT_PASSENGERS; cid < NUM_CARGO; cid++) {
+			if (HASBIT(refit_mask, cid)) return cid;
 		}
 	}
 
@@ -1848,11 +1847,18 @@
 		if (flags & DC_EXEC) {
 			w = GetVehicle(_new_vehicle_id);
 
-			if (v->cargo_type != w->cargo_type || v->cargo_subtype != w->cargo_subtype) {
-				// we can't pay for refitting because we can't estimate refitting costs for a vehicle before it's build
-				// if we pay for it anyway, the cost and the estimated cost will not be the same and we will have an assert
-				DoCommand(0, w->index, v->cargo_type | (v->cargo_subtype << 8), flags, GetCmdRefitVeh(v));
-			}
+			Vehicle *w2 = w;
+			Vehicle *v2 = v;
+			do {
+				if (v2->cargo_type != w2->cargo_type || v2->cargo_subtype != w2->cargo_subtype) {
+					/* We can't pay for refitting because we can't estimate refitting costs for a vehicle before it's build.
+					 * If we pay for it anyway, the cost and the estimated cost will not be the same and we will have an assert.
+					 * We need to check the whole chain if it is a train because some newgrf articulated engines can refit some units only (and not the front) */
+					DoCommand(0, w->index, v2->cargo_type | (v2->cargo_subtype << 8), flags, GetCmdRefitVeh(v));
+					break; // We learned that the engine in question needed a refit. No need to check anymore
+				}
+			} while (v->type == VEH_Train && (w2 = w2->next) != NULL && (v2 = v2->next) != NULL);
+
 			if (v->type == VEH_Train && HASBIT(v->u.rail.flags, VRF_REVERSE_DIRECTION)) {
 				SETBIT(w->u.rail.flags, VRF_REVERSE_DIRECTION);
 			}
@@ -2686,7 +2692,7 @@
 }
 
 /* returns true if staying in the same tile */
-bool GetNewVehiclePos(const Vehicle *v, GetNewVehiclePosResult *gp)
+GetNewVehiclePosResult GetNewVehiclePos(const Vehicle *v)
 {
 	static const int8 _delta_coord[16] = {
 		-1,-1,-1, 0, 1, 1, 1, 0, /* x */
@@ -2696,11 +2702,12 @@
 	int x = v->x_pos + _delta_coord[v->direction];
 	int y = v->y_pos + _delta_coord[v->direction + 8];
 
-	gp->x = x;
-	gp->y = y;
-	gp->old_tile = v->tile;
-	gp->new_tile = TileVirtXY(x, y);
-	return gp->old_tile == gp->new_tile;
+	GetNewVehiclePosResult gp;
+	gp.x = x;
+	gp.y = y;
+	gp.old_tile = v->tile;
+	gp.new_tile = TileVirtXY(x, y);
+	return gp;
 }
 
 static const Direction _new_direction_table[] = {
--- a/src/vehicle.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/vehicle.h	Wed Feb 28 00:33:40 2007 +0000
@@ -427,7 +427,7 @@
 Trackdir GetVehicleTrackdir(const Vehicle* v);
 
 /* returns true if staying in the same tile */
-bool GetNewVehiclePos(const Vehicle *v, GetNewVehiclePosResult *gp);
+GetNewVehiclePosResult GetNewVehiclePos(const Vehicle *v);
 Direction GetDirectionTowards(const Vehicle* v, int x, int y);
 
 #define BEGIN_ENUM_WAGONS(v) do {
--- a/src/vehicle_gui.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/vehicle_gui.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -28,6 +28,7 @@
 #include "roadveh.h"
 #include "depot.h"
 #include "helpers.hpp"
+#include "cargotype.h"
 
 typedef struct Sorting {
 	Listing aircraft;
@@ -198,7 +199,6 @@
 	uint i;
 
 	do {
-		CargoID cid;
 		uint32 cmask = EngInfo(u->engine_type)->refit_mask;
 		byte callbackmask = EngInfo(u->engine_type)->callbackmask;
 
@@ -206,14 +206,9 @@
 		if (u->cargo_cap == 0) continue;
 
 		/* Loop through all cargos in the refit mask */
-		for (cid = 0; cmask != 0 && num_lines < max_lines; cmask >>= 1, cid++) {
-			CargoID lcid;
-
+		for (CargoID cid = 0; cid != NUM_CARGO && num_lines < max_lines; cid++) {
 			/* Skip cargo type if it's not listed */
-			if (!HASBIT(cmask, 0)) continue;
-
-			lcid = _local_cargo_id_ctype[cid];
-			if (lcid == CT_INVALID) continue;
+			if (!HASBIT(cmask, cid)) continue;
 
 			/* Check the vehicle's callback mask for cargo suffixes */
 			if (HASBIT(callbackmask, CBM_CARGO_SUFFIX)) {
@@ -223,7 +218,7 @@
 				byte temp_subtype  = u->cargo_subtype;
 				byte refit_cyc;
 
-				u->cargo_type = lcid;
+				u->cargo_type = cid;
 
 				for (refit_cyc = 0; refit_cyc < 16 && num_lines < max_lines; refit_cyc++) {
 					bool duplicate = false;
@@ -237,12 +232,12 @@
 
 					/* Check if this cargo and subtype combination are listed */
 					for (i = 0; i < num_lines && !duplicate; i++) {
-						if (refit[i].cargo == lcid && refit[i].value == callback) duplicate = true;
+						if (refit[i].cargo == cid && refit[i].value == callback) duplicate = true;
 					}
 
 					if (duplicate) continue;
 
-					refit[num_lines].cargo   = lcid;
+					refit[num_lines].cargo   = cid;
 					refit[num_lines].subtype = refit_cyc;
 					refit[num_lines].value   = callback;
 					refit[num_lines].engine  = u->engine_type;
@@ -257,11 +252,11 @@
 				bool duplicate = false;
 
 				for (i = 0; i < num_lines && !duplicate; i++) {
-					if (refit[i].cargo == lcid && refit[i].value == CALLBACK_FAILED) duplicate = true;
+					if (refit[i].cargo == cid && refit[i].value == CALLBACK_FAILED) duplicate = true;
 				}
 
 				if (!duplicate) {
-					refit[num_lines].cargo   = lcid;
+					refit[num_lines].cargo   = cid;
 					refit[num_lines].subtype = 0;
 					refit[num_lines].value   = CALLBACK_FAILED;
 					refit[num_lines].engine  = INVALID_ENGINE;
@@ -301,7 +296,7 @@
 
 		if (i >= pos && i < pos + rows) {
 			/* Draw the cargo name */
-			int last_x = DrawString(2, y, _cargoc.names_s[refit[i].cargo], colour);
+			int last_x = DrawString(2, y, GetCargo(refit[i].cargo)->name, colour);
 
 			/* If the callback succeeded, draw the cargo suffix */
 			if (refit[i].value != CALLBACK_FAILED) {
@@ -343,15 +338,11 @@
 			WP(w,refit_d).cargo = DrawVehicleRefitWindow(WP(w, refit_d).list, WP(w, refit_d).sel, w->vscroll.pos, w->vscroll.cap, w->resize.step_height);
 
 			if (WP(w,refit_d).cargo != NULL) {
-				int32 cost = 0;
-				switch (GetVehicle(w->window_number)->type) {
-					case VEH_Train:    cost = CMD_REFIT_RAIL_VEHICLE; break;
-					case VEH_Road:     cost = CMD_REFIT_ROAD_VEH;     break;
-					case VEH_Ship:     cost = CMD_REFIT_SHIP;         break;
-					case VEH_Aircraft: cost = CMD_REFIT_AIRCRAFT;     break;
-				}
+				int32 cost;
 
-				cost = DoCommand(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8, DC_QUERY_COST, cost);
+				cost = DoCommand(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8,
+								 DC_QUERY_COST, GetCmdRefitVeh(GetVehicle(w->window_number)->type));
+
 				if (!CmdFailed(cost)) {
 					SetDParam(0, WP(w,refit_d).cargo->cargo);
 					SetDParam(1, _returned_refit_capacity);
@@ -497,7 +488,7 @@
 	/* List of cargo types of this engine */
 	uint32 cmask = EngInfo(engine)->refit_mask;
 	/* List of cargo types available in this climate */
-	uint32 lmask = _landscape_global_cargo_mask[_opt.landscape];
+	uint32 lmask = _cargo_mask;
 	char *b = _userstring;
 
 	/* Draw nothing if the engine is not refittable */
@@ -509,8 +500,6 @@
 		/* Engine can be refitted to all types in this climate */
 		b = InlineString(b, STR_PURCHASE_INFO_ALL_TYPES);
 	} else {
-		CargoID cid;
-
 		/* Check if we are able to refit to more cargo types and unable to. If
 		 * so, invert the cargo types to list those that we can't refit to. */
 		if (CountBits(cmask ^ lmask) < CountBits(cmask)) {
@@ -518,12 +507,16 @@
 			b = InlineString(b, STR_PURCHASE_INFO_ALL_BUT);
 		}
 
+		bool first = true;
+
 		/* Add each cargo type to the list */
-		for (cid = 0; cmask != 0; cmask >>= 1, cid++) {
-			if (!HASBIT(cmask, 0)) continue;
+		for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
+			if (!HASBIT(cmask, cid)) continue;
 
-			b = InlineString(b, _cargoc.names_s[_local_cargo_id_ctype[cid]]);
-			if (cmask > 1) b = strecpy(b, ", ", lastof(_userstring));
+			if (!first) b = strecpy(b, ", ", lastof(_userstring));
+			first = false;
+
+			b = InlineString(b, GetCargo(cid)->name);
 		}
 	}
 
--- a/src/video/cocoa_v.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/video/cocoa_v.h	Wed Feb 28 00:33:40 2007 +0000
@@ -10,4 +10,4 @@
 
 extern const HalVideoDriver _cocoa_video_driver;
 
-#endif
+#endif /* VIDEO_COCOA_H */
--- a/src/viewport.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/viewport.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file viewport.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -23,7 +25,6 @@
 
 #define VIEWPORT_DRAW_MEM (65536 * 2)
 
-/* viewport.c */
 // XXX - maximum viewports is maximum windows - 2 (main toolbar + status bar)
 static ViewPort _viewports[25 - 2];
 static uint32 _active_viewports;    ///< bitmasked variable where each bit signifies if a viewport is in use or not
@@ -1597,7 +1598,7 @@
 {
 	const Sign *si;
 
-	if (!(_display_opt & DO_SHOW_SIGNS)) return false;
+	if (!(_display_opt & DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
 
 	switch (vp->zoom) {
 		case 0:
@@ -1883,8 +1884,8 @@
 			x1 &= ~0xF;
 			y1 &= ~0xF;
 
-			if (x1 >= x2) intswap(x1,x2);
-			if (y1 >= y2) intswap(y1,y2);
+			if (x1 >= x2) Swap(x1, x2);
+			if (y1 >= y2) Swap(y1, y2);
 			_thd.new_pos.x = x1;
 			_thd.new_pos.y = y1;
 			_thd.new_size.x = x2 - x1 + TILE_SIZE;
--- a/src/water_cmd.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/water_cmd.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -3,6 +3,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
+#include "cmd_helper.h"
 #include "station_map.h"
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -45,7 +46,7 @@
 
 /** Build a ship depot.
  * @param tile tile where ship depot is built
- * @param p1 depot direction (0 == X or 1 == Y)
+ * @param p1 bit 0 depot orientation (Axis)
  * @param p2 unused
  */
 int32 CmdBuildShipDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -57,11 +58,11 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	if (p1 > 1) return CMD_ERROR;
-
 	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
 
-	tile2 = tile + (p1 ? TileDiffXY(0, 1) : TileDiffXY(1, 0));
+	Axis axis = Extract<Axis, 0>(p1);
+
+	tile2 = tile + (axis == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
 	if (!EnsureNoVehicle(tile2)) return CMD_ERROR;
 
 	if (!IsClearWaterTile(tile) || !IsClearWaterTile(tile2))
@@ -84,8 +85,8 @@
 		depot->xy = tile;
 		depot->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 
-		MakeShipDepot(tile, _current_player, DEPOT_NORTH, (Axis)p1);
-		MakeShipDepot(tile2, _current_player, DEPOT_SOUTH, (Axis)p1);
+		MakeShipDepot(tile,  _current_player, DEPOT_NORTH, axis);
+		MakeShipDepot(tile2, _current_player, DEPOT_SOUTH, axis);
 		MarkTileDirtyByTile(tile);
 		MarkTileDirtyByTile(tile2);
 	}
@@ -229,8 +230,8 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	if (x < sx) intswap(x, sx);
-	if (y < sy) intswap(y, sy);
+	if (x < sx) Swap(x, sx);
+	if (y < sy) Swap(y, sy);
 	size_x = (x - sx) + 1;
 	size_y = (y - sy) + 1;
 
--- a/src/win32.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/win32.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file win32.cpp Implementation of MS Windows system calls */
+
 #include "stdafx.h"
 #include "hal.h"
 #include "openttd.h"
@@ -653,19 +655,20 @@
 	}
 }
 
-DIR *opendir(const char *path)
+DIR *opendir(const wchar_t *path)
 {
 	DIR *d;
 	UINT sem = SetErrorMode(SEM_FAILCRITICALERRORS); // disable 'no-disk' message box
-	DWORD fa = GetFileAttributesW(OTTD2FS(path));
+	DWORD fa = GetFileAttributesW(path);
 
 	if ((fa != INVALID_FILE_ATTRIBUTES) && (fa & FILE_ATTRIBUTE_DIRECTORY)) {
 		d = dir_calloc();
 		if (d != NULL) {
-			char search_path[MAX_PATH];
+			wchar_t search_path[MAX_PATH];
 			/* build search path for FindFirstFile */
-			snprintf(search_path, lengthof(search_path), "%s" PATHSEP "*", path);
-			d->hFind = FindFirstFileW(OTTD2FS(search_path), &d->fd);
+			_snwprintf(search_path, lengthof(search_path), L"%s\\*", path);
+			*lastof(search_path) = '\0';
+			d->hFind = FindFirstFileW(search_path, &d->fd);
 
 			if (d->hFind != INVALID_HANDLE_VALUE ||
 					GetLastError() == ERROR_NO_MORE_FILES) { // the directory is empty
@@ -865,12 +868,12 @@
 	int _set_error_mode(int);
 #endif
 
-#if defined(WINCE)
-int APIENTRY WinMain
-#else
-int APIENTRY _tWinMain
-#endif
-        (HINSTANCE hInstance, HINSTANCE hPrevInstance,
+#if defined(WINCE) && !defined(_tWinMain)
+/* GCC crosscompiler for WINCE doesn't support wide version */
+# define _tWinMain WinMain
+#endif /* WINCE */
+
+int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 	LPTSTR lpCmdLine, int nCmdShow)
 {
 	int argc;
@@ -919,12 +922,11 @@
 #if defined(WINCE)
 void GetCurrentDirectoryW(int length, wchar_t *path)
 {
-	wchar_t *pDest = NULL;
 	/* Get the name of this module */
 	GetModuleFileName(NULL, path, length);
 
 	/* Remove the executable name, this we call CurrentDir */
-	pDest = wcsrchr(path, '\\');
+	wchar_t *pDest = wcsrchr(path, '\\');
 	if (pDest != NULL) {
 		int result = pDest - path + 1;
 		path[result] = '\0';
--- a/src/win32.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/win32.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file win32.h declarations of functions for MS windows systems */
+
 #ifndef WIN32_H
 #define WIN32_H
 
--- a/src/window.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/window.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file window.cpp windowing system, widgets and events */
+
 #include "stdafx.h"
 #include <stdarg.h>
 #include "openttd.h"
--- a/src/window.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/window.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file window.h regroups declarations for all windowing system, as well as a few helper functions */
+
 #ifndef WINDOW_H
 #define WINDOW_H
 
@@ -55,9 +57,9 @@
 	 * They are used in the same place as the above RESIZE_x flags, Widget visual_flags.
 	 * These states are used in exceptions. If nothing is specified, they will indicate
 	 * Enabled, visible or unclicked widgets*/
-	WIDG_DISABLED = 4,  // widget is greyed out, not available
-	WIDG_HIDDEN   = 5,  // widget is made invisible
-	WIDG_LOWERED  = 6,  // widget is paint lowered, a pressed button in fact
+	WIDG_DISABLED = 4,  ///< widget is greyed out, not available
+	WIDG_HIDDEN   = 5,  ///< widget is made invisible
+	WIDG_LOWERED  = 6,  ///< widget is paint lowered, a pressed button in fact
 };
 
 DECLARE_ENUM_AS_BIT_SET(ResizeFlag);
@@ -90,7 +92,6 @@
 /****************** THESE ARE NOT WIDGET TYPES!!!!! *******************/
 enum WindowWidgetBehaviours {
 	WWB_PUSHBUTTON  = 1 << 5,
-
 	WWB_MASK        = 0xE0,
 };
 
@@ -206,23 +207,23 @@
 		} mouseover;
 
 		struct {
-			bool cont;     // continue the search? (default true)
-			uint16 key;    // 16-bit Unicode value of the key
-			uint16 keycode;// untranslated key (including shift-state)
+			bool cont;      ///< continue the search? (default true)
+			uint16 key;     ///< 16-bit Unicode value of the key
+			uint16 keycode; ///< untranslated key (including shift-state)
 		} keypress;
 
 		struct {
-			int msg;      // message to be sent
-			int wparam;   // additional message-specific information
-			int lparam;   // additional message-specific information
+			int msg;      ///< message to be sent
+			int wparam;   ///< additional message-specific information
+			int lparam;   ///< additional message-specific information
 		} message;
 
 		struct {
-			PointRaw delta;   // delta position against position of last call
+			PointRaw delta;   ///< delta position against position of last call
 		} scroll;
 
 		struct {
-			int wheel;     // how much was 'wheel'd'
+			int wheel;     ///< how much was 'wheel'd'
 		} wheel;
 	} we;
 };
@@ -239,14 +240,14 @@
 } WindowDesc;
 
 enum WindowDefaultFlag {
-	WDF_STD_TOOLTIPS    =   1, /* use standard routine when displaying tooltips */
-	WDF_DEF_WIDGET      =   2, /* default widget control for some widgets in the on click event */
-	WDF_STD_BTN         =   4, /* default handling for close and drag widgets (widget no 0 and 1) */
+	WDF_STD_TOOLTIPS    =   1, ///< use standard routine when displaying tooltips
+	WDF_DEF_WIDGET      =   2, ///< default widget control for some widgets in the on click event
+	WDF_STD_BTN         =   4, ///< default handling for close and drag widgets (widget no 0 and 1)
 
-	WDF_UNCLICK_BUTTONS =  16, /* Unclick buttons when the window event times out */
-	WDF_STICKY_BUTTON   =  32, /* Set window to sticky mode; they are not closed unless closed with 'X' (widget 2) */
-	WDF_RESIZABLE       =  64, /* A window can be resized */
-	WDF_MODAL           = 128, /* The window is a modal child of some other window, meaning the parent is 'inactive' */
+	WDF_UNCLICK_BUTTONS =  16, ///< Unclick buttons when the window event times out */
+	WDF_STICKY_BUTTON   =  32, ///< Set window to sticky mode; they are not closed unless closed with 'X' (widget 2)
+	WDF_RESIZABLE       =  64, ///< A window can be resized
+	WDF_MODAL           = 128, ///< The window is a modal child of some other window, meaning the parent is 'inactive'
 };
 
 /* can be used as x or y coordinates to cause a specific placement */
@@ -258,12 +259,12 @@
 };
 
 typedef struct Textbuf {
-	char *buf;                  /* buffer in which text is saved */
-	uint16 maxlength, maxwidth; /* the maximum size of the buffer. Maxwidth specifies screensize in pixels, maxlength is in bytes */
-	uint16 length, width;       /* the current size of the string. Width specifies screensize in pixels, length is in bytes */
-	bool caret;                 /* is the caret ("_") visible or not */
-	uint16 caretpos;            /* the current position of the caret in the buffer, in bytes */
-	uint16 caretxoffs;          /* the current position of the caret in pixels */
+	char *buf;                  ///< buffer in which text is saved
+	uint16 maxlength, maxwidth; ///< the maximum size of the buffer. Maxwidth specifies screensize in pixels, maxlength is in bytes
+	uint16 length, width;       ///< the current size of the string. Width specifies screensize in pixels, length is in bytes
+	bool caret;                 ///< is the caret ("_") visible or not
+	uint16 caretpos;            ///< the current position of the caret in the buffer, in bytes
+	uint16 caretxoffs;          ///< the current position of the caret in pixels
 } Textbuf;
 
 #define WP(ptr,str) (*(str*)(ptr)->custom)
@@ -277,10 +278,10 @@
 } Scrollbar;
 
 typedef struct ResizeInfo {
-	uint width; /* Minimum width and height */
+	uint width; ///< Minimum width and height
 	uint height;
 
-	uint step_width; /* In how big steps the width and height go */
+	uint step_width; ///< In how big steps the width and height go
 	uint step_height;
 } ResizeInfo;
 
@@ -601,12 +602,12 @@
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(querystr_d));
 
 typedef struct {
-	byte item_count;      /* follow_vehicle */
-	byte sel_index;       /* scrollpos_x */
-	byte main_button;     /* scrollpos_y */
+	byte item_count;      ///< follow_vehicle
+	byte sel_index;       ///< scrollpos_x
+	byte main_button;     ///< scrollpos_y
 	byte action_id;
-	StringID string_id;   /* unk30 */
-	uint16 checked_items; /* unk32 */
+	StringID string_id;   ///< unk30
+	uint16 checked_items; ///< unk32
 	byte disabled_items;
 } menu_d;
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(menu_d));
@@ -643,7 +644,7 @@
 		RailTypeByte railtype;
 		AirportFTAClass::Flags flags;
 	} filter;
-	byte sel_index;  // deprecated value, used for 'unified' ship and road
+	byte sel_index;  ///< deprecated value, used for 'unified' ship and road
 	bool descending_sort_order;
 	byte sort_criteria;
 	bool regenerate_list;
@@ -657,7 +658,7 @@
 	byte sel_index[2];
 	EngineID sel_engine[2];
 	uint16 count[2];
-	bool wagon_btnstate; // true means engine is selected
+	bool wagon_btnstate; ///< true means engine is selected
 	EngineList list[2];
 	bool update_left;
 	bool update_right;
@@ -717,7 +718,7 @@
 } vp_d;
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vp_d));
 
-// vp2_d is the same as vp_d, except for the data_# values..
+/* vp2_d is the same as vp_d, except for the data_# values.. */
 typedef struct {
 	VehicleID follow_vehicle;
 	int32 scrollpos_x;
@@ -750,24 +751,24 @@
 
 typedef enum SortListFlags {
 	VL_NONE    = 0x00,
-	VL_DESC    = 0x01,  // sort descending or ascending
-	VL_RESORT  = 0x02,  // instruct the code to resort the list in the next loop
-	VL_REBUILD = 0x04,  // create sort-listing to use for qsort and friends
+	VL_DESC    = 0x01,  ///< sort descending or ascending
+	VL_RESORT  = 0x02,  ///< instruct the code to resort the list in the next loop
+	VL_REBUILD = 0x04,  ///< create sort-listing to use for qsort and friends
 	VL_END     = 0x08
 } SortListFlags;
 
 DECLARE_ENUM_AS_BIT_SET(SortListFlags);
 
 typedef struct Listing {
-	bool order;    // Ascending/descending
-	byte criteria; // Sorting criteria
+	bool order;    ///< Ascending/descending
+	byte criteria; ///< Sorting criteria
 } Listing;
 
 typedef struct list_d {
-	uint16 list_length;  // length of the list being sorted
-	byte sort_type;      // what criteria to sort on
-	SortListFlags flags; // used to control sorting/resorting/etc.
-	uint16 resort_timer; // resort list after a given amount of ticks if set
+	uint16 list_length;  ///< length of the list being sorted
+	byte sort_type;      ///< what criteria to sort on
+	SortListFlags flags; ///< used to control sorting/resorting/etc.
+	uint16 resort_timer; ///< resort list after a given amount of ticks if set
 } list_d;
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(list_d));
 
@@ -793,7 +794,7 @@
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(dropdown_d));
 
 
-/* window.c */
+/* window.cpp */
 //void CallWindowEventNP(BaseWindow *w, int event);
 void CallWindowTickEvent(void);
 //void SetWindowDirty(const BaseWindow *w);
@@ -981,7 +982,7 @@
 //void CDECL SetWindowWidgetsHiddenState(BaseWindow *w, bool hidden_stat, int widgets, ...);
 //void CDECL SetWindowWidgetsLoweredState(BaseWindow *w, bool lowered_stat, int widgets, ...);
 
-/* misc_gui.c*/
+/* misc_gui.cpp */
 void GuiShowTooltipsWithArgs(StringID str, uint paramcount, const uint params[]);
 static inline void GuiShowTooltips(StringID str)
 {
@@ -993,7 +994,7 @@
 BaseWindow *GetCallbackWnd(void);
 //WindowList::Iterator FindWindowZPosition(const BaseWindow *w);
 
-/* window.c */
+/* window.cpp */
 //extern BaseWindow *_z_windows[];
 //extern BaseWindow **_last_z_window;
 
--- a/src/yapf/follow_track.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/follow_track.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file follow_track.hpp Template function for track followers */
+
 #ifndef  FOLLOW_TRACK_HPP
 #define  FOLLOW_TRACK_HPP
 
@@ -171,7 +173,7 @@
 
 		// rail transport is possible only on compatible rail types
 		if (IsRailTT()) {
-			RailType rail_type = GetTileRailType(m_new_tile, TrackdirToTrack(DiagdirToDiagTrackdir(m_exitdir)));
+			RailType rail_type = GetTileRailType(m_new_tile);
 			if (!HASBIT(m_veh->u.rail.compatible_railtypes, rail_type)) {
 				// incompatible rail type
 				return false;
--- a/src/yapf/nodelist.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/nodelist.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file nodelist.hpp */
+
 #ifndef  NODELIST_HPP
 #define  NODELIST_HPP
 
--- a/src/yapf/yapf.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf.h */
+
 #ifndef  YAPF_H
 #define  YAPF_H
 
--- a/src/yapf/yapf.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -78,10 +78,10 @@
 #include "../misc/hashtable.hpp"
 #include "../misc/binaryheap.hpp"
 #include "nodelist.hpp"
+#include "follow_track.hpp"
 #include "yapf_base.hpp"
 #include "yapf_node.hpp"
 #include "yapf_common.hpp"
-#include "follow_track.hpp"
 #include "yapf_costbase.hpp"
 #include "yapf_costcache.hpp"
 
--- a/src/yapf/yapf_base.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_base.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,14 +1,12 @@
 /* $Id$ */
 
+/** @file yapf_base.hpp */
+
 #ifndef  YAPF_BASE_HPP
 #define  YAPF_BASE_HPP
 
 #include "../debug.h"
 
-#include "../misc/fixedsizearray.hpp"
-#include "../misc/blob.hpp"
-#include "nodelist.hpp"
-
 extern int _total_pf_time_us;
 
 /** CYapfBaseT - A-star type path finder base class.
@@ -44,6 +42,7 @@
 class CYapfBaseT {
 public:
 	typedef typename Types::Tpf Tpf;           ///< the pathfinder class (derived from THIS class)
+	typedef typename Types::TrackFollower TrackFollower;
 	typedef typename Types::NodeList NodeList; ///< our node list
 	typedef typename NodeList::Titem Node;     ///< this will be our node type
 	typedef typename Node::Key Key;            ///< key to hash tables
@@ -134,7 +133,7 @@
 			}
 		}
 
-		bool bDestFound = (m_pBestDestNode != NULL);
+		bool bDestFound = (m_pBestDestNode != NULL) && (m_pBestDestNode != m_pBestIntermediateNode);
 
 #ifndef NO_DEBUG_MESSAGES
 		perf.Stop();
@@ -190,20 +189,20 @@
 	}
 
 	/** add multiple nodes - direct children of the given node */
-	FORCEINLINE void AddMultipleNodes(Node* parent, TileIndex tile, TrackdirBits td_bits)
+	FORCEINLINE void AddMultipleNodes(Node* parent, const TrackFollower &tf)
 	{
-		bool is_choice = (KillFirstBit2x64(td_bits) != 0);
-		for (TrackdirBits rtds = td_bits; rtds != TRACKDIR_BIT_NONE; rtds = (TrackdirBits)KillFirstBit2x64(rtds)) {
+		bool is_choice = (KillFirstBit2x64(tf.m_new_td_bits) != 0);
+		for (TrackdirBits rtds = tf.m_new_td_bits; rtds != TRACKDIR_BIT_NONE; rtds = (TrackdirBits)KillFirstBit2x64(rtds)) {
 			Trackdir td = (Trackdir)FindFirstBit2x64(rtds);
 			Node& n = Yapf().CreateNewNode();
-			n.Set(parent, tile, td, is_choice);
-			Yapf().AddNewNode(n);
+			n.Set(parent, tf.m_new_tile, td, is_choice);
+			Yapf().AddNewNode(n, tf);
 		}
 	}
 
 	/** AddNewNode() - called by Tderived::PfFollowNode() for each child node.
 	 *  Nodes are evaluated here and added into open list */
-	void AddNewNode(Node& n)
+	void AddNewNode(Node &n, const TrackFollower &tf)
 	{
 		// evaluate the node
 		bool bCached = Yapf().PfNodeCacheFetch(n);
@@ -213,7 +212,7 @@
 			m_stats_cache_hits++;
 		}
 
-		bool bValid = Yapf().PfCalcCost(n);
+		bool bValid = Yapf().PfCalcCost(n, tf);
 
 		if (bCached) {
 			Yapf().PfNodeCacheFlush(n);
--- a/src/yapf/yapf_common.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_common.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_common.hpp */
+
 #ifndef  YAPF_COMMON_HPP
 #define  YAPF_COMMON_HPP
 
--- a/src/yapf/yapf_costcache.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_costcache.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,4 +1,7 @@
 /* $Id$ */
+
+/** @file yapf_costcache.hpp */
+
 #ifndef  YAPF_COSTCACHE_HPP
 #define  YAPF_COSTCACHE_HPP
 
--- a/src/yapf/yapf_costrail.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_costrail.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_costrail.hpp */
+
 #ifndef  YAPF_COSTRAIL_HPP
 #define  YAPF_COSTRAIL_HPP
 
@@ -64,7 +66,7 @@
 	}
 
 	/** return one tile cost. If tile is a tunnel entry, it is moved to the end of tunnel */
-	FORCEINLINE int OneTileCost(TileIndex& tile, Trackdir trackdir)
+	FORCEINLINE int OneTileCost(TileIndex prev_tile, TileIndex& tile, Trackdir trackdir)
 	{
 		int cost = 0;
 		// set base cost
@@ -77,11 +79,6 @@
 						cost += Yapf().PfGetSettings().rail_crossing_penalty;
 					break;
 
-				case MP_STATION:
-					// penalty for passing station tiles
-					cost += Yapf().PfGetSettings().rail_station_penalty;
-					break;
-
 				default:
 					break;
 			}
@@ -176,7 +173,7 @@
 	/** Called by YAPF to calculate the cost from the origin to the given node.
 	 *  Calculates only the cost of given node, adds it to the parent node cost
 	 *  and stores the result into Node::m_cost member */
-	FORCEINLINE bool PfCalcCost(Node& n)
+	FORCEINLINE bool PfCalcCost(Node &n, const TrackFollower &tf)
 	{
 		assert(!n.flags_u.flags_s.m_targed_seen);
 		CPerfStart perf_cost(Yapf().m_perf_cost);
@@ -195,12 +192,17 @@
 		Trackdir trackdir = n.m_key.m_td;
 		TileType tile_type = GetTileType(tile);
 
-		RailType rail_type = GetTileRailType(tile, TrackdirToTrack(trackdir));
+		RailType rail_type = GetTileRailType(tile);
 
 		bool target_seen = Yapf().PfDetectDestination(tile, trackdir);
 
+		if (tf.m_is_station) {
+			// station tiles have an extra penalty
+			segment_cost += Yapf().PfGetSettings().rail_station_penalty * (tf.m_tiles_skipped + 1);
+		}
+
 		while (true) {
-			segment_cost += Yapf().OneTileCost(tile, trackdir);
+			segment_cost += Yapf().OneTileCost(prev_tile, tile, trackdir);
 			segment_cost += Yapf().CurveCost(prev_trackdir, trackdir);
 			segment_cost += Yapf().SlopeCost(tile, trackdir);
 			segment_cost += Yapf().SignalCost(n, tile, trackdir);
@@ -252,7 +254,7 @@
 
 			// if tail type changes, finish segment (cached segment can't contain more rail types)
 			{
-				RailType new_rail_type = GetTileRailType(F.m_new_tile, TrackdirToTrack(FindFirstTrackdir(F.m_new_td_bits)));
+				RailType new_rail_type = GetTileRailType(F.m_new_tile);
 				if (new_rail_type != rail_type) {
 					break;
 				}
--- a/src/yapf/yapf_destrail.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_destrail.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_destrail.hpp */
+
 #ifndef  YAPF_DESTRAIL_HPP
 #define  YAPF_DESTRAIL_HPP
 
--- a/src/yapf/yapf_node.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_node.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_node.hpp */
+
 #ifndef  YAPF_NODE_HPP
 #define  YAPF_NODE_HPP
 
--- a/src/yapf/yapf_node_rail.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_node_rail.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_node_rail.hpp */
+
 #ifndef  YAPF_NODE_RAIL_HPP
 #define  YAPF_NODE_RAIL_HPP
 
--- a/src/yapf/yapf_node_road.hpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_node_road.hpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_node_road.hpp */
+
 #ifndef  YAPF_NODE_ROAD_HPP
 #define  YAPF_NODE_ROAD_HPP
 
--- a/src/yapf/yapf_rail.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_rail.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_rail.cpp */
+
 #include "../stdafx.h"
 
 #include "yapf.hpp"
@@ -34,7 +36,7 @@
 	{
 		TrackFollower F(Yapf().GetVehicle());
 		if (F.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir()))
-			Yapf().AddMultipleNodes(&old_node, F.m_new_tile, F.m_new_td_bits);
+			Yapf().AddMultipleNodes(&old_node, F);
 	}
 
 	/// return debug report character to identify the transportation type
@@ -97,7 +99,7 @@
 	{
 		TrackFollower F(Yapf().GetVehicle());
 		if (F.Follow(old_node.GetLastTile(), old_node.GetLastTrackdir()))
-			Yapf().AddMultipleNodes(&old_node, F.m_new_tile, F.m_new_td_bits);
+			Yapf().AddMultipleNodes(&old_node, F);
 	}
 
 	/// return debug report character to identify the transportation type
--- a/src/yapf/yapf_road.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_road.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_road.cpp */
+
 #include "../stdafx.h"
 
 #include "yapf.hpp"
@@ -70,7 +72,7 @@
 	/** Called by YAPF to calculate the cost from the origin to the given node.
 	 *  Calculates only the cost of given node, adds it to the parent node cost
 	 *  and stores the result into Node::m_cost member */
-	FORCEINLINE bool PfCalcCost(Node& n)
+	FORCEINLINE bool PfCalcCost(Node& n, const TrackFollower &tf)
 	{
 		int segment_cost = 0;
 		// start at n.m_key.m_tile / n.m_key.m_td and walk to the end of segment
@@ -244,7 +246,7 @@
 	{
 		TrackFollower F(Yapf().GetVehicle());
 		if (F.Follow(old_node.m_segment_last_tile, old_node.m_segment_last_td))
-			Yapf().AddMultipleNodes(&old_node, F.m_new_tile, F.m_new_td_bits);
+			Yapf().AddMultipleNodes(&old_node, F);
 	}
 
 	/// return debug report character to identify the transportation type
--- a/src/yapf/yapf_settings.h	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_settings.h	Wed Feb 28 00:33:40 2007 +0000
@@ -1,4 +1,7 @@
 /* $Id$ */
+
+/** @file yapf_settings.h */
+
 #if !defined(YAPF_SETTINGS_H) || defined(YS_DEF)
 
 # ifndef  YAPF_SETTINGS_H
--- a/src/yapf/yapf_ship.cpp	Tue Feb 27 23:54:28 2007 +0000
+++ b/src/yapf/yapf_ship.cpp	Wed Feb 28 00:33:40 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file yapf_ship.cpp */
+
 #include "../stdafx.h"
 
 #include "yapf.hpp"
@@ -26,7 +28,7 @@
 	{
 		TrackFollower F;
 		if (F.Follow(old_node.m_key.m_tile, old_node.m_key.m_td))
-			Yapf().AddMultipleNodes(&old_node, F.m_new_tile, F.m_new_td_bits);
+			Yapf().AddMultipleNodes(&old_node, F);
 	}
 
 	/// return debug report character to identify the transportation type
@@ -86,6 +88,7 @@
 {
 public:
 	typedef typename Types::Tpf Tpf;              ///< the pathfinder class (derived from THIS class)
+	typedef typename Types::TrackFollower TrackFollower;
 	typedef typename Types::NodeList::Titem Node; ///< this will be our node type
 	typedef typename Node::Key Key;               ///< key to hash tables
 
@@ -97,7 +100,7 @@
 	/** Called by YAPF to calculate the cost from the origin to the given node.
 	 *  Calculates only the cost of given node, adds it to the parent node cost
 	 *  and stores the result into Node::m_cost member */
-	FORCEINLINE bool PfCalcCost(Node& n)
+	FORCEINLINE bool PfCalcCost(Node& n, const TrackFollower &tf)
 	{
 		// base tile cost depending on distance
 		int c = IsDiagonalTrackdir(n.GetTrackdir()) ? 10 : 7;