(svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026 NewGRF_ports
authorrichk
Sat, 02 Jun 2007 19:59:29 +0000
branchNewGRF_ports
changeset 6719 4cc327ad39d5
parent 6718 5a8b295aa345
child 6720 35756db7e577
(svn r10027) [NewGRF_ports] -Sync: with trunk r9506-10026
Makefile.src.in
bin/data/flags.grf
bin/data/group.grf
bin/data/oneway.grf
bin/data/openttd.grf
bin/data/tramtrkw.grf
changelog.txt
config.lib
docs/landscape.html
docs/landscape_grid.html
docs/openttd.6
known-bugs.txt
os/debian/changelog
os/win32/installer/install.nsi
os/win32/installer/notice.ini
projects/openttd.vcproj
projects/openttd.xcode/default.pbxuser
projects/openttd.xcode/project.pbxproj
projects/openttd_vs80.vcproj
readme.txt
source.list
src/ai/ai.h
src/ai/default/default.cpp
src/ai/trolly/build.cpp
src/ai/trolly/pathfinder.cpp
src/ai/trolly/trolly.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/articulated_vehicles.cpp
src/articulated_vehicles.h
src/autoreplace_cmd.cpp
src/autoreplace_gui.cpp
src/bridge_map.cpp
src/bridge_map.h
src/build_vehicle_gui.cpp
src/cargotype.cpp
src/cargotype.h
src/clear_cmd.cpp
src/clear_map.h
src/command.cpp
src/command.h
src/console.cpp
src/console_cmds.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/dummy_land.cpp
src/economy.cpp
src/economy.h
src/elrail.cpp
src/endian_check.cpp
src/engine.cpp
src/engine.h
src/fileio.cpp
src/fios.cpp
src/fontcache.cpp
src/functions.h
src/genworld.cpp
src/genworld_gui.cpp
src/gfx.cpp
src/gfx.h
src/gfxinit.cpp
src/graph_gui.cpp
src/group.h
src/group_cmd.cpp
src/group_gui.cpp
src/gui.h
src/heightmap.cpp
src/helpers.cpp
src/industry.h
src/industry_cmd.cpp
src/industry_gui.cpp
src/industry_map.h
src/intro_gui.cpp
src/landscape.cpp
src/landscape.h
src/lang/american.txt
src/lang/brazilian_portuguese.txt
src/lang/bulgarian.txt
src/lang/catalan.txt
src/lang/czech.txt
src/lang/danish.txt
src/lang/dutch.txt
src/lang/english.txt
src/lang/esperanto.txt
src/lang/estonian.txt
src/lang/finnish.txt
src/lang/french.txt
src/lang/galician.txt
src/lang/german.txt
src/lang/hungarian.txt
src/lang/icelandic.txt
src/lang/italian.txt
src/lang/japanese.txt
src/lang/korean.txt
src/lang/lithuanian.txt
src/lang/norwegian_bokmal.txt
src/lang/norwegian_nynorsk.txt
src/lang/polish.txt
src/lang/portuguese.txt
src/lang/romanian.txt
src/lang/russian.txt
src/lang/simplified_chinese.txt
src/lang/slovak.txt
src/lang/slovenian.txt
src/lang/spanish.txt
src/lang/swedish.txt
src/lang/traditional_chinese.txt
src/lang/turkish.txt
src/lang/ukrainian.txt
src/lang/unfinished/afrikaans.txt
src/lang/unfinished/croatian.txt
src/lang/unfinished/frisian.txt
src/livery.h
src/macros.h
src/main_gui.cpp
src/map.cpp
src/map.h
src/misc.cpp
src/misc/array.hpp
src/misc/autocopyptr.hpp
src/misc/autoptr.hpp
src/misc/binaryheap.hpp
src/misc/blob.hpp
src/misc/countedptr.hpp
src/misc/crc32.hpp
src/misc/fixedsizearray.hpp
src/misc/hashtable.hpp
src/misc_cmd.cpp
src/misc_gui.cpp
src/music/bemidi.cpp
src/music/dmusic.cpp
src/music_gui.cpp
src/namegen.cpp
src/namegen.h
src/network/core/config.h
src/network/core/os_abstraction.h
src/network/network.cpp
src/network/network_client.cpp
src/network/network_gui.cpp
src/network/network_gui.h
src/network/network_server.cpp
src/network/network_udp.cpp
src/newgrf.cpp
src/newgrf.h
src/newgrf_callbacks.h
src/newgrf_canal.cpp
src/newgrf_canal.h
src/newgrf_cargo.cpp
src/newgrf_cargo.h
src/newgrf_commons.cpp
src/newgrf_commons.h
src/newgrf_config.cpp
src/newgrf_config.h
src/newgrf_engine.cpp
src/newgrf_engine.h
src/newgrf_gui.cpp
src/newgrf_house.cpp
src/newgrf_house.h
src/newgrf_spritegroup.cpp
src/newgrf_spritegroup.h
src/newgrf_station.cpp
src/newgrf_station.h
src/newgrf_text.cpp
src/newgrf_town.cpp
src/news.h
src/news_gui.cpp
src/npf.cpp
src/npf.h
src/oldloader.cpp
src/openttd.cpp
src/openttd.h
src/order_cmd.cpp
src/order_gui.cpp
src/os2.cpp
src/pathfind.cpp
src/pathfind.h
src/player.h
src/player_gui.cpp
src/players.cpp
src/rail.cpp
src/rail.h
src/rail_cmd.cpp
src/rail_gui.cpp
src/rail_map.h
src/railtypes.h
src/resource.h
src/road.h
src/road_cmd.cpp
src/road_cmd.h
src/road_gui.cpp
src/road_map.cpp
src/road_map.h
src/roadveh.h
src/roadveh_cmd.cpp
src/roadveh_gui.cpp
src/saveload.cpp
src/saveload.h
src/screenshot.cpp
src/screenshot.h
src/sdl.cpp
src/sdl.h
src/settings.cpp
src/settings.h
src/settings_gui.cpp
src/ship.h
src/ship_cmd.cpp
src/ship_gui.cpp
src/signs.cpp
src/signs.h
src/signs_gui.cpp
src/slope.h
src/smallmap_gui.cpp
src/sound.cpp
src/sound.h
src/sprite.h
src/spritecache.cpp
src/spritecache.h
src/station.cpp
src/station.h
src/station_cmd.cpp
src/station_gui.cpp
src/station_map.cpp
src/station_map.h
src/stdafx.h
src/strgen/strgen.cpp
src/string.cpp
src/string.h
src/strings.cpp
src/strings.h
src/subsidy_gui.cpp
src/table/ai_rail.h
src/table/build_industry.h
src/table/cargo_const.h
src/table/control_codes.h
src/table/engines.h
src/table/files.h
src/table/industry_land.h
src/table/namegen.h
src/table/palettes.h
src/table/road_land.h
src/table/roadveh.h
src/table/sprites.h
src/table/station_land.h
src/table/town_land.h
src/table/tree_land.h
src/table/water_land.h
src/terraform_gui.cpp
src/texteff.cpp
src/tgp.cpp
src/tgp.h
src/thread.cpp
src/thread.h
src/tile.cpp
src/tile.h
src/town.h
src/town_cmd.cpp
src/town_gui.cpp
src/town_map.h
src/train.h
src/train_cmd.cpp
src/train_gui.cpp
src/transparency_gui.cpp
src/transparency_gui.h
src/tree_cmd.cpp
src/tree_map.h
src/tunnel_map.cpp
src/tunnel_map.h
src/tunnelbridge_cmd.cpp
src/unix.cpp
src/unmovable.h
src/unmovable_cmd.cpp
src/unmovable_map.h
src/variables.h
src/vehicle.cpp
src/vehicle.h
src/vehicle_gui.cpp
src/vehicle_gui.h
src/video/dedicated_v.cpp
src/video/null_v.cpp
src/video/sdl_v.cpp
src/video/win32_v.cpp
src/viewport.cpp
src/viewport.h
src/void_map.h
src/water_cmd.cpp
src/water_map.h
src/waypoint.cpp
src/waypoint.h
src/widget.cpp
src/win32.cpp
src/window.cpp
src/window.h
src/yapf/follow_track.hpp
src/yapf/yapf.h
src/yapf/yapf.hpp
src/yapf/yapf_base.hpp
src/yapf/yapf_costrail.hpp
src/yapf/yapf_destrail.hpp
src/yapf/yapf_rail.cpp
src/yapf/yapf_road.cpp
src/yapf/yapf_ship.cpp
src/zoom.hpp
--- a/Makefile.src.in	Tue Mar 27 23:27:27 2007 +0000
+++ b/Makefile.src.in	Sat Jun 02 19:59:29 2007 +0000
@@ -28,6 +28,7 @@
 SORT         = !!SORT!!
 REVISION     = !!REVISION!!
 AWK          = !!AWK!!
+GCC295       = !!GCC295!!
 CONFIG_CACHE_COMPILER = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_COMPILER!!
 CONFIG_CACHE_LINKER   = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_LINKER!!
 CONFIG_CACHE_ENDIAN   = $(SRC_OBJS_DIR)/!!CONFIG_CACHE_ENDIAN!!
@@ -51,6 +52,17 @@
 
 ENDIAN_TARGETS := endian_target.h $(ENDIAN_CHECK)
 
+# This 'sed' basicly just removes 'const' from the line if it is a 2+D array
+# For more information, please check:
+#  http://maillist.openttd.org/pipermail/devs/2007-April/000284.html
+#  http://maillist.openttd.org/pipermail/devs/2007-February/000248.html
+GCC295_FIX=sed -r 's/^(\t*)(.*)( const )([A-Za-z0-9_ ]+(\[.*\]){2,})(( = \{)|(;))(.*)$$/\1\2 \4\6\8\9/g'
+# This 'sed' removes the 3rd '4' in the # lines of the -E output of
+#  gcc 2.95.3 and lower, as it should indicate that it is a C-linkage, but the
+#  compiler can't handle that information (just don't ask). So we remove it
+#  and then it compiles happily and without bitching :)
+GCC295_FIX_2=sed -e 's|\(^\# [0-9][0-9]* "[^"]*"[ 0-9]*\) 4$$|\1|g'
+
 # Check if we want to show what we are doing
 ifdef VERBOSE
 	Q =
@@ -210,7 +222,11 @@
 
 $(OBJS_CPP): %.o: $(SRC_DIR)/%.cpp $(DEP_MASK) $(FILE_DEP)
 	$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.cpp=%.cpp)'
+ifeq ($(GCC295), 1)
+	$(Q)$(CXX_HOST) -E $(CFLAGS) $< | $(GCC295_FIX) | $(GCC295_FIX_2) | $(CXX_HOST) $(CFLAGS) -c -o $@ -x c++ -
+else
 	$(Q)$(CXX_HOST) $(CFLAGS) -c -o $@ $<
+endif
 
 $(OBJS_MM): %.o: $(SRC_DIR)/%.mm $(DEP_MASK) $(FILE_DEP)
 	$(E) '$(STAGE) Compiling $(<:$(SRC_DIR)/%.mm=%.mm)'
Binary file bin/data/flags.grf has changed
Binary file bin/data/group.grf has changed
Binary file bin/data/oneway.grf has changed
Binary file bin/data/openttd.grf has changed
Binary file bin/data/tramtrkw.grf has changed
--- a/changelog.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/changelog.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -1,3 +1,53 @@
+0.5.2 (2007-05-29)
+------------------------------------------------------------------------
+- Feature: Add threading support for MorphOS (r9759)
+- Fix: Bridges and tunnels were not always removed on bankruptcy, thus leaving tunnels/bridges with an invalid owner that would crash the game when clicking with the query tool on them (r9966)
+- Fix: Null pointer dereference under MorphOS and AmigaOS (r9861)
+
+
+0.5.2-RC1 (2007-05-16)
+------------------------------------------------------------------------
+- Feature: Windows 95/98/ME check in Windows 2000/XP/2003/Vista builds (r9834)
+- Feature: Add password protected status to 'players' (network server) console command (r9771)
+- Feature: Add server_lang in [network] section of openttd.cfg (r9716)
+- Fix: Loading some TTDP savegames caused an instant assertion on loading (r9857)
+- Fix: [NewGRF] Catch occurance of division-by-zero in varaction handling (r9837)
+- Fix: Only non dedicated servers cannot have 0 players [FS#765] (r9785)
+- Fix: Remove arbitrary limit on length of NewGRF strings (r9775)
+- Fix: [NewGRF] Ignore axis-bit of station tile layouts [FS#756] (r9758)
+- Fix: [win32] Dead key and open/close console. (r9728)
+- Fix: When you have closed the "Load game"/"New game" windows which you started from the "start server" menu, you shouldn't start a server when starting a new game [SF#1244842] (r9757)
+- Fix: Trains were lost after autorenewal/autoreplace [FS#732] (r9753)
+- Fix: Stop flooded towns from building roads on water [FS#598] (r9743)
+- Fix: Station signs were not resized when the language changed [FS#672] (r9741)
+- Fix: In news history, newlines were not replaced with spaces [FS#677] (r9731)
+- Fix: Crash when destroying bridge with train partially on it [FS#738] (r9726)
+- Fix: Planes made a 270 degree turn instead of a 90 degree turn on the southern runway of the intercontinental airport [FS#743] (r9725)
+- Fix: In-game private messages did not work for clients with high ClientIDs (r9719)
+- Fix: Do not allow building of rail vehicles whose railtype is not available (r9718)
+- Fix: [YAPF] The guessed path was ignored for ships [FS#736] (r9694)
+
+
+0.5.1 (2007-04-20)
+------------------------------------------------------------------------
+(None)
+
+
+0.5.1-RC3 (2007-04-17)
+------------------------------------------------------------------------
+- Feature: Add list_patches to console commands; shows all patches and values (r9565)
+- Fix: Select "Custom" in the difficulty settings gui when changing a setting [FS#733] (r9647)
+- Fix: Building rail on steep slopes ignored build_on_slopes patch setting (r9602)
+- Fix: Wrong characters in Finnish town names (r9641)
+- Fix: When checking for no vehicle on ground-tiles, do not take into account vehicles that are in the air (r9542)
+- Fix: Bankrupt AIs no longer buy over themselves (also added safeguards to prevent in future) (r9540 / r9541)
+- Fix: When company is removed, sell all shares of the and in the company (r9533)
+- Fix: Crash when 2 or more clients joined at roughly the same time (r9529)
+- Fix: Custom currency was overwritten and fix euro introduction (r9467, r9469)
+- Fix: Values of diff_custom and snow_line in .cfg were not checked properly (r9455)
+- Fix: When deleting a vehicle which has shared orders with one more vehicle and no orders, segfaulted (r9429)
+
+
 0.5.1-RC2 (2007-03-23)
 ------------------------------------------------------------------------
 - Fix: crashes when the chatbox would be drawn outside of the main window [FS#701] (r9420)
@@ -1337,7 +1387,6 @@
 
 0.2.1 (2004-04-04)
 ------------------------------------------------------------------------
-
 - Fix: copy orders crashed if you clicked on a wagon
 - Feature: 'A' hotkey now always opens autorail
 - Change: Moved autorail button
@@ -1350,7 +1399,6 @@
 
 0.2 (2004-04-03)
 ------------------------------------------------------------------------
-
 - Feature: autoscroll (only works to left/right)
 - Feature: train checkpoints, instead of ttdpatch's nonstop handling
 - Feature: ttdpatch compatible nonstop handling
@@ -1411,7 +1459,6 @@
 
 0.1.4 (2004-03-25)
 ------------------------------------------------------------------------
-
 - Feature: crash submit system on win32
 - Fix: train smoke clouds
 - Fix: train engine sounds
@@ -1452,7 +1499,6 @@
 
 0.1.3 (2004-03-18)
 ------------------------------------------------------------------------
-
 - Fixed message options window
 - Fixed company takeover/purchase
 - Feature: Improved mouse scroll zooming
@@ -1476,7 +1522,6 @@
 
 0.1.2 (2004-03-15)
 ------------------------------------------------------------------------
-
 - Mouse wheel can be used to zoom in out on win32 (ludde)
 - Implemented some support for resizing the window dynamically in win32 (ludde)
 - Fixed tunnel mouse icon for maglev and monorail
@@ -1484,7 +1529,6 @@
 
 0.1.1 (2004-03-14)
 ------------------------------------------------------------------------
-
 - Preliminary presignal support
 - Added external MIDI driver for unix version (by robertnorris)
 - Added DirectMusic driver for Win32 version
--- a/config.lib	Tue Mar 27 23:27:27 2007 +0000
+++ b/config.lib	Sat Jun 02 19:59:29 2007 +0000
@@ -237,9 +237,9 @@
 			--with-osx-sysroot)           with_osx_sysroot="2";;
 			--with-osx-sysroot=*)         with_osx_sysroot="$optarg";;
 
-			--without-application-bundle) with_applicant_bundle="0";;
-			--with-application-bundle)    with_applicant_bundle="1";;
-			--with-application-bundle=*)  with_applicant_bundle="$optarg";;
+			--without-application-bundle) with_application_bundle="0";;
+			--with-application-bundle)    with_application_bundle="1";;
+			--with-application-bundle=*)  with_application_bundle="$optarg";;
 
 			CC=* | --CC=*)                CC="$optarg";;
 			CXX=* | --CXX=*)              CXX="$optarg";;
@@ -303,10 +303,10 @@
 		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 [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|MORPHOS|BEOS|SUNOS|CYGWIN|MINGW|OS2|WINCE|PSP)$'`" ]; then
+	# OS only allows DETECT, UNIX, OSX, FREEBSD, OPENBSD, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, WINCE, and PSP
+	if [ -z "`echo $os | egrep '^(DETECT|UNIX|OSX|FREEBSD|OPENBSD|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]"
+		echo " Available options are: --os=[DETECT|UNIX|OSX|FREEBSD|OPENBSD|MORPHOS|BEOS|SUNOS|CYGWIN|MINGW|OS2|WINCE|PSP]"
 		exit 1
 	fi
 	# enable_debug should be between 0 and 4
@@ -673,6 +673,13 @@
 		CC_CFLAGS="$CC_CFLAGS -Wstrict-prototypes"
 	fi
 
+	gcc295=""
+	if [ "$cc_version" = 29 ]; then
+		# Make sure we mark GCC 2.95 flag for Makefile.src.in, as we
+		#  need a lovely hack there to make it compile correctly.
+		gcc295="1"
+	fi
+
 	if [ $cc_version -ge 30 ]; then
 		CFLAGS="$CFLAGS -W -Wno-unused-parameter"
 	fi
@@ -702,7 +709,7 @@
 		fi
 	fi
 
-	if [ "$os" != "CYGWIN" ] && [ "$os" != "FREEBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ]; then
+	if [ "$os" != "CYGWIN" ] && [ "$os" != "FREEBSD" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ]; then
 		LIBS="$LIBS -lpthread"
 		LIBS="$LIBS -lrt"
 	fi
@@ -726,6 +733,10 @@
 		CFLAGS="$CFLAGS -Wno-strict-prototypes"
 	fi
 
+	if [ "$os" = "OPENBSD" ]; then
+		LIBS="$LIBS -pthread"
+	fi
+
 	if [ "$os" = "OSX" ]; then
 		LDFLAGS="$LDFLAGS -framework Cocoa"
 		if [ "$enable_dedicated" = "0" ]; then
@@ -738,7 +749,7 @@
 	fi
 
 	# Most targets act like UNIX, just with some additions
-	if [ "$os" = "BEOS" ] || [ "$os" = "OSX" ] || [ "$os" = "MORPHOS" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OS2" ]; then
+	if [ "$os" = "BEOS" ] || [ "$os" = "OSX" ] || [ "$os" = "MORPHOS" ] || [ "$os" = "FREEBSD" ] || [ "$os" = "OPENBSD" ] || [ "$os" = "SUNOS" ] || [ "$os" = "OS2" ]; then
 		CFLAGS="$CFLAGS -DUNIX"
 	fi
 	# And others like Windows
@@ -1232,13 +1243,14 @@
 
 detect_os() {
 	if [ "$os" = "DETECT" ]; then
-		# Detect UNIX, OSX, FREEBSD, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, WINCE, and PSP
+		# Detect UNIX, OSX, FREEBSD, OPENBSD, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, WINCE, and PSP
 
 		# Try first via dumpmachine, then via uname
 		os=`echo "$host" | tr '[A-Z]' '[a-z]' | $awk '
 					/linux/        { print "UNIX";    exit}
 					/darwin/       { print "OSX";     exit}
 					/freebsd/      { print "FREEBSD"; exit}
+					/openbsd/      { print "OPENBSD"; exit}
 					/morphos/      { print "MORPHOS"; exit}
 					/beos/         { print "BEOS";    exit}
 					/sunos/        { print "SUNOS";   exit}
@@ -1255,6 +1267,7 @@
 					/linux/        { print "UNIX";    exit}
 					/darwin/       { print "OSX";     exit}
 					/freebsd/      { print "FREEBSD"; exit}
+					/openbsd/      { print "OPENBSD"; exit}
 					/morphos/      { print "MORPHOS"; exit}
 					/beos/         { print "BEOS";    exit}
 					/sunos/        { print "SUNOS";   exit}
@@ -1266,8 +1279,8 @@
 
 		if [ -z "$os" ]; then
 			log 1 "detecting OS... none detected"
-			log 1 "I couldn't detect your OS. Please use --with-os=OS to force one"
-			log 1 "Allowed values are: UNIX, OSX, FREEBSD, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, WINCE, and PSP"
+			log 1 "I couldn't detect your OS. Please use --os=OS to force one"
+			log 1 "Allowed values are: UNIX, OSX, FREEBSD, OPENBSD, MORPHOS, BEOS, SUNOS, CYGWIN, MINGW, OS2, WINCE, and PSP"
 			exit 1
 		fi
 
@@ -1853,6 +1866,7 @@
 		s#!!CONFIGURE_FILES!!#$CONFIGURE_FILES#g;
 		s#!!REVISION!!#$revision#g;
 		s#!!AWK!!#$awk#g;
+		s#!!GCC295!!#$gcc295#g;
 		s#!!ENABLE_INSTALL!!#$enable_install#g;
 	"
 }
@@ -1952,8 +1966,8 @@
 	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/"
-	echo "                                 SUNOS/CYGWIN/MINGW/OS2/WINCE/PSP"
+	echo "                                 DETECT/UNIX/OSX/FREEBSD/OPENBSD/MORPHOS/"
+	echo "                                 BEOS/SUNOS/CYGWIN/MINGW/OS2/WINCE/PSP"
 	echo "  --endian=ENDIAN                set the endian of the HOST (AUTO/LE/BE)"
 	echo "  --revision=rXXXX               overwrite the revision detection."
 	echo "                                 Use with care!"
--- a/docs/landscape.html	Tue Mar 27 23:27:27 2007 +0000
+++ b/docs/landscape.html	Sat Jun 02 19:59:29 2007 +0000
@@ -355,9 +355,9 @@
     </li>
     <li>m5 bit 6 set = with signals:
      <ul>
-      <li>m2 bits 7..4: bit clear = signal shows red; same bits as in m3</li>
-      <li>m2 bit 2: set = semaphore signals, clear = light signals </li>
-      <li>m2 bits 1..0 : type of signal
+      <li>m4 bits 7..4: bit clear = signal shows red; same bits as in m3</li>
+      <li>m2 bit 2 <i>(6)</i>: set = semaphore signals, clear = light signals <i>(lower and right tracks)</i></li>
+      <li>m2 bits 1..0 <i>(5..4)</i>: type of signal <i>(lower and right tracks)</i>
        <table>
          <tr>
           <td nowrap="nowrap" valign="top"><tt>00</tt>: </td>
@@ -475,9 +475,9 @@
    <td valign=top nowrap>&nbsp;</td>
    <td>
     <ul>
-     <li>m5 bits 7..4 clear: road
+     <li>m5 bits 7..6 clear: road
       <ul>
-       <li>m1: <a href="#OwnershipInfo">owner</a> of the road</li>
+       <li>m1: <a href="#OwnershipInfo">owner</a> of the road type #1</li>
        <li>m2: Index into the array of towns, 0 for non-town roads</li>
        <li>m3 bit 7 set = on snow or desert</li>
        <li>m3 bits 6..4:
@@ -513,7 +513,7 @@
         </table>
        </li>
        <li>m3 bits 3..0: counter for the roadworks</li>
-       <li>m5 bits 3..0: road layout: bit set = road piece present:
+       <li>m4 bits 3..0: road layout road type #1: bit set = road piece present:
         <table>
          <tr>
           <td nowrap valign=top>bit 0: </td>
@@ -533,25 +533,36 @@
          </tr>
         </table>
        </li>
+       <li>m4 bits 7..4: road layout road type #2
+       <li>m5 bits 5..4: bits to disallow vehicles to go a specific direction
+       <li>m5 bits 3..0: owner of road type #2
+       <li>m6 bits 5..2: road layout road type #3
+       <li>m7 bits 7..5: road types
+       <li>m7 bits 4..0: owner of road type #3
+       </li>
       </ul>
      </li>
-     <li>m5 bit 5 set: road depot
+     <li>m5 bit 7 set, bit 6 clear: road depot
       <ul>
        <li>m1: <a href="#OwnershipInfo">owner</a> of the depot</li>
        <li>m3 bit 7 set = on snow or desert (not displayed, but set internally)</li>
        <li>m5 bits 3..0 - direction: exit towards: <tt>0</tt> = NE, <tt>1</tt> = SE, <tt>2</tt> = SW, <tt>3</tt> = NW</li>
+       <li>m7 bits 7..5: road types
       </ul>
      </li>
-     <li>m5 bit 4 set, bits 7..5 clear: level crossing
+     <li>m5 bit 6 set, bit 7 clear: level crossing
       <ul>
        <li>m1: <a href="#OwnershipInfo">owner</a> of the railway track</li>
        <li>m2: Index into the array of towns, 0 for non-town roads</li>
        <li>m3 bit 7 set = on snow or desert</li>
        <li>m3 bits 6..4: <tt>0</tt> - on bare land, <tt>1</tt> - on grass, <tt>2</tt> or higher - paved</li>
        <li>m3 bits 3..0: <a href="#TrackType">track type</a></li>
-       <li>m4: <a href="#OwnershipInfo">owner</a> of the road</li>
-       <li>m5 bit 3: clear - road in the X direction, set - road in the Y direction (railway track always perpendicular)</li>
-       <li>m5 bit 2: set if crossing lights are on</li>
+       <li>m4 bit 6: clear - road in the X direction, set - road in the Y direction (railway track always perpendicular)</li>
+       <li>m4 bit 5: set if crossing lights are on</li>
+       <li>m4 bits 4..0: <a href="#OwnershipInfo">owner</a> of the road type #1</li>
+       <li>m5 bits 3..0: owner of road type #2
+       <li>m7 bits 7..5: road types
+       <li>m7 bits 4..0: owner of road type #3
       </ul>
      </li>
      <li>m6 bits 7..6 : Possibility of a bridge above, in the <a href="#bridge_direction">direction specified</a></li>
--- a/docs/landscape_grid.html	Tue Mar 27 23:27:27 2007 +0000
+++ b/docs/landscape_grid.html	Sat Jun 02 19:59:29 2007 +0000
@@ -88,9 +88,9 @@
       <td class="caption">rail</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span> XXXX XXXX</td>
+      <td class="bits"><span class="free">OOOO OOOO O</span>XXX <span class="free">O</span>XXX</td>
       <td class="bits">XXXX XXXX</td>
-      <td class="bits"><span class="free">OOOO O</span>XXX</td>
+      <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XX<span class="free">OO OO</span>XX</td>
       <td class="bits"><span class="free">OOOO OOOO</span></td>
@@ -123,11 +123,11 @@
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX XXXX XXXX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
       <td class="bits">XXXX XXXX</td>
       <td class="bits">XXXX XXXX</td>
-      <td class="bits">XX<span class="free">OO OO</span>XX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
+      <td class="bits">XXXX XXXX</td>
+      <td class="bits">XXXX XXXX</td>
+      <td class="bits">XXXX XXXX</td>
     </tr>
     <tr>
       <td class="caption">level crossing</td>
@@ -135,10 +135,10 @@
       <td class="bits">-inherit-</td>
       <td class="bits">-inherit-</td>
       <td class="bits">XXXX XXXX</td>
+      <td class="bits"><span class="free">O</span>XXX XXXX</td>
+      <td class="bits">XX<span class="free">OO</span> XXXX</td>
+      <td class="bits">XX<span class="free">OO OO</span>XX</td>
       <td class="bits">XXXX XXXX</td>
-      <td class="bits">XXXX XX<span class="free">OO</span></td>
-      <td class="bits">XX<span class="free">OO OO</span>XX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
     </tr>
     <tr>
       <td class="caption">road depot</td>
@@ -147,9 +147,9 @@
       <td class="bits"><span class="free">OOOO OOOO OOOO OOOO</span></td>
       <td class="bits">X<span class="free">OOO OOOO</span></td>
       <td class="bits"><span class="free">OOOO OOOO</span></td>
-      <td class="bits">XXXX XXXX</td>
+      <td class="bits">XX<span class="free">OO</span> XXXX</td>
       <td class="bits">XX<span class="free">OO OO</span>XX</td>
-      <td class="bits"><span class="free">OOOO OOOO</span></td>
+      <td class="bits">XXX<span class="free">O OOOO</span></td>
     </tr>
     <tr>
       <td>3</td>
--- a/docs/openttd.6	Tue Mar 27 23:27:27 2007 +0000
+++ b/docs/openttd.6	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 .\"                                      Hey, EMACS: -*- nroff -*-
 .\" Please adjust this date whenever revising the manpage.
-.Dd March 23, 2007
+.Dd May 29, 2007
 .Dt OPENTTD 6
 .Sh NAME
 .Nm openttd
--- a/known-bugs.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/known-bugs.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -15,27 +15,25 @@
 If the bug report is closed, it has been fixed, which then can be verified
 in the latest SVN version.
 
-Bugs for 0.5.1
+Bugs for 0.5.2
 ------------------------------------------------------------------------
 URL: http://bugs.openttd.org
 
--677 	Badspacing in news summaries
--674 	Map signs allow less nonenglish characters than english ones
--672 	Non-transparent station names' backgrounds do not resize properly upon language change
+-735	Plural rule not expanded correctly when non-numeric placeholder uses
+-716	Train Crash in Depot
+-674	Map signs allow less nonenglish characters than english ones
 -669	Docks/Airports/RV Stations can be built without available vehicles
 -646	AI builds useless stations
--601	airports can't get flooded when they have planes in them
--599	reloaded game lost company passwords
--594	terraforming wipes out canals
+-601	Airports can't get flooded when they have planes in them
+-599	Reloaded game lost company passwords
+-594	Terraforming wipes out canals
 -591	Autorenew fails under certain conditions
--583	Fatal fault or crash during startup
--571	Problems with vehicle purchase lists with NewGRFs
 -559	Front-/Rear-facing engines don't line up with each other
 -553	Autorenew doesn't warn when replacement isn't available
--546	[0.5.0 RC3] Inflation overflow
+-546	Overflows due to inflation
 -540	Planes vanished when offered exclusive
 -539	Trains can cash the same cargo multiple times
--522	overflow on vehicle costs
+-522	Overflow on vehicle costs
 -508	Destroying trees and replanting => raised rating
 -502	OSX can incorrectly print "dbg: [sl] Cannot open savegame 'data/opntitle.dat' for saving/loading."
 -501	Mouse pointer gets hidden, when draging out of window and back again. Only affects Wacom etc.
@@ -51,7 +49,7 @@
 -355	graphics bugs with trains - water, tunnels
 -354	Maglev Trains faster than All Planes
 -339	Crash in Quicktime when exiting game
--299	disable 90 deg turns patch - AI builds 90 deg turns
+-299	Disable 90 deg turns patch - AI builds 90 deg turns
 -290	NPF - no path to depot from tunnel
 -282	AI Players do not clear loans as soon as they could
 -274	Autoclean ignores any share holdings
@@ -60,11 +58,11 @@
 -216	AI build train vans one van less
 -202	2 Locomotives in 1 Train - Selling one results in Age of the other one Being 0
 -193	Inconsistent directory usage on Mac OS X
--165	vehicle length not taken into account
+-165	Vehicle length not taken into account
 -153	Language crash with app renaming OSX
 -119	Clipping problems with vehicles on slopes
 - 89	Able to build railways/stations before engines become available
-- 65	short wagons bug
+- 65	Short wagons bug
 - 51	Windows doesn't support CUSTOM_LANG_DIR
 - 47	Low rating calculation and cargo loading priority
 
@@ -76,30 +74,25 @@
 -1459262	Towns building too many roads way too long now
 -1458995	Another bug with smooth_economy
 -1393415	NPF & one-way sigs
--1244842	Multiplayer interface bug (0.4.0.1)
--1212267	station visited twice when servicing
+-1212267	Station visited twice when servicing
 -1208170	Duplicate station names can be created
 -1116638	"More, but smaller changes" deficiency
--1106356	re-offered prototypes
+-1106356	Re-offered prototypes
 
-Minor Bugs for 0.5.1
 ------------------------------------------------------------------------
 URL: http://sourceforge.net/tracker/?atid=669662&group_id=103924&func=browse
 
 -1461629	[r4180]Subsidy calculated wrong
--1412031	fast forward scrolling is also fast forward :)
--1387424	overtake insolvent company is to cheap
+-1412031	Fast forward scrolling is also fast forward :)
 -1382782	Loan interest calculated 'wrong'
--1201284	permanent hilight in a depot
+-1201284	Permanent hilight in a depot
 -1185852	Scrollbars get arbitrarily small
--1160732	little bug with transparency
--1117731	Editor-StartingDate
--1108046	game freezes
+-1160732	Little bug with transparency
+-1108046	Game freezes
 -1102174	Bug if 3 people buy 25% shares in one company
 -1084620	Minor bug considering buses/trucks
--1034310	color mauve in diagrams
+-1034310	Color mauve in diagrams
 -1030661	It's possible to build a tunnel under oil wells
-- 987891	Large UFO destruction bug
 - 987883	Aircraft landing/taking off
-- 987880	company league table updating
-- 985924	aircraft taxi speed
+- 987880	Company league table updating
+- 985924	Aircraft taxi speed
--- a/os/debian/changelog	Tue Mar 27 23:27:27 2007 +0000
+++ b/os/debian/changelog	Sat Jun 02 19:59:29 2007 +0000
@@ -4,6 +4,30 @@
 
  -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Mon, 26 Feb 2007 21:07:05 +0100
 
+openttd (0.5.2-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Tue, 29 May 2007 20:00:00 +0100
+
+openttd (0.5.2~rc1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Wed, 16 May 2007 23:35:39 +0100
+
+openttd (0.5.1-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Fri, 20 Apr 2007 21:45:32 +0100
+
+openttd (0.5.1~rc3-1) unstable; urgency=low
+
+  * New upstream release.
+
+ -- Matthijs Kooijman <m.kooijman@student.utwente.nl>  Tue, 17 Apr 2007 22:00:46 +0100
+
 openttd (0.5.1~rc2-1) unstable; urgency=low
 
   * New upstream release.
--- a/os/win32/installer/install.nsi	Tue Mar 27 23:27:27 2007 +0000
+++ b/os/win32/installer/install.nsi	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 !define APPNAME "OpenTTD"   ; Define application name
-!define APPVERSION "0.5.1"  ; Define application version
-!define INSTALLERVERSION 30 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
+!define APPVERSION "0.5.2"  ; Define application version
+!define INSTALLERVERSION 34 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
 
 !define APPURLLINK "http://www.openttd.org"
 !define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}"
@@ -81,6 +81,7 @@
 !define MUI_FINISHPAGE_NOREBOOTSUPPORT
 !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\readme.txt"
 !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
+!define MUI_WELCOMEFINISHPAGE_CUSTOMFUNCTION_INIT DisableBack
 
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_UNPAGE_CONFIRM
@@ -355,26 +356,30 @@
 hasCD:
 FunctionEnd
 
-;---------------------------------------------------------------------
-; Custom page function to show notices for running OpenTTD
+;----------------------------------------------------------------------------------
+; Disable the "Back" button on finish page if the installer is run on Win9x systems
+Function DisableBack
+	Call GetWindowsVersion
+	Pop $R0
+	StrCmp $R0 "win9x" 0 WinNT
+	!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Settings" "BackEnabled" "0"
+WinNT:
+	ClearErrors
+FunctionEnd
+
+;----------------------------------------------------------------------------------
+; Custom page function to show notices for running OpenTTD (only for win32 systems)
 ; We have extracted this custom page as Notice in the .onInit function
 Function ShowWarningsPage
+	Call GetWindowsVersion
+	Pop $R0
+	; Don't show the UNICODE notice if the installer is run on Win9x systems
+	StrCmp $R0 "win9x" 0 WinNT
+	Abort
+WinNT:
 	!insertmacro MUI_HEADER_TEXT "Installation Complete" "Important notices for OpenTTD usage."
 	!insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS "notice.ini" "Notice"
 	!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "Notice"
-
-	Call GetWindowsVersion
-	Pop $R0
-
-	; Hide the MSLU text if the installer is not run on Win9x systems
-	StrCmp $R0 "winnt" 0 Win9x
-	!insertmacro MUI_INSTALLOPTIONS_READ $R1 "Notice" "Field 1" "HWND" ; MSLU groupbox
-	ShowWindow $R1 0
-	!insertmacro MUI_INSTALLOPTIONS_READ $R1 "Notice" "Field 2" "HWND" ; MSLU text
-	ShowWindow $R1 0
-	!insertmacro MUI_INSTALLOPTIONS_READ $R1 "Notice" "Field 3" "HWND" ; MSLU link
-	ShowWindow $R1 0
-Win9x:
 	ClearErrors
 	!insertmacro MUI_INSTALLOPTIONS_SHOW
 FunctionEnd
--- a/os/win32/installer/notice.ini	Tue Mar 27 23:27:27 2007 +0000
+++ b/os/win32/installer/notice.ini	Sat Jun 02 19:59:29 2007 +0000
@@ -1,41 +1,17 @@
 ; Ini file generated by the HM NIS Edit IO designer.
 [Settings]
-NumFields=6
+NumFields=3
+CancelEnabled=0
 
 [Field 1]
 Type=Groupbox
-Text=Notice for Windows 9x/ME users!
-Left=8
-Right=292
-Top=80
-Bottom=138
-
-[Field 2]
-Type=Label
-Text=OpenTTD will not work without the Microsoft Layer for Unicode installed.\r\nDue to licensing issues we cannot bundle this file with the installer. Please download MSLU from the Microsoft website and extract UnicoWS.dll to the same directory as the openttd executabe.
-Left=13
-Right=284
-Top=91
-Bottom=127
-
-[Field 3]
-Type=Link
-Text=Microsoft Layer for Unicode
-State=http://www.microsoft.com/downloads/details.aspx?FamilyId=73BA7BD7-ED06-4F0D-80A4-2A7EEAEE17E2&displaylang=en
-Left=197
-Right=284
-Top=127
-Bottom=135
-
-[Field 4]
-Type=Groupbox
 Text=UNICODE support
 Left=8
 Right=292
 Top=0
 Bottom=75
 
-[Field 5]
+[Field 2]
 Type=Label
 Text=This version of OpenTTD has support for UNICODE, allowing users to use non-ASCII character sets such as Russian or Japanese.\r\nSelecting such a language will result in an unusable and garbled interface. You will need to specify a font that has support for these characters in openttd.cfg, or alternatively use an appropiate grf file.\r\n\r\nFor more information please refer to the readme or the wiki.
 Left=13
@@ -43,7 +19,7 @@
 Top=9
 Bottom=65
 
-[Field 6]
+[Field 3]
 Type=Link
 Text=OpenTTD wiki
 Left=238
--- a/projects/openttd.vcproj	Tue Mar 27 23:27:27 2007 +0000
+++ b/projects/openttd.vcproj	Sat Jun 02 19:59:29 2007 +0000
@@ -164,12 +164,15 @@
 				RelativePath=".\..\src\airport.cpp">
 			</File>
 			<File
-				RelativePath=".\..\src\aystar.cpp">
+				RelativePath=".\..\src\articulated_vehicles.cpp">
 			</File>
 			<File
 				RelativePath=".\..\src\autoreplace_cmd.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\aystar.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\bmp.cpp">
 			</File>
 			<File
@@ -387,6 +390,12 @@
 				RelativePath=".\..\src\airport_movement.h">
 			</File>
 			<File
+				RelativePath=".\..\src\articulated_vehicles.h">
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_cmd.h">
+			</File>
+			<File
 				RelativePath=".\..\src\airport_states.h">
 			</File>
 			<File
@@ -420,6 +429,9 @@
 				RelativePath=".\..\src\depot.h">
 			</File>
 			<File
+				RelativePath=".\..\src\direction.h">
+			</File>
+			<File
 				RelativePath=".\..\src\music\dmusic.h">
 			</File>
 			<File
@@ -453,6 +465,9 @@
 				RelativePath=".\..\src\gfxinit.h">
 			</File>
 			<File
+				RelativePath=".\..\src\group.h">
+			</File>
+			<File
 				RelativePath=".\..\src\gui.h">
 			</File>
 			<File
@@ -513,9 +528,15 @@
 				RelativePath=".\..\src\newgrf_callbacks.h">
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_canal.h">
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_cargo.h">
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_commons.h">
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_config.h">
 			</File>
 			<File
@@ -630,6 +651,9 @@
 				RelativePath=".\..\src\train.h">
 			</File>
 			<File
+				RelativePath=".\..\src\transparency_gui.h">
+			</File>
+			<File
 				RelativePath=".\..\src\variables.h">
 			</File>
 			<File
@@ -656,6 +680,9 @@
 			<File
 				RelativePath=".\..\src\window.h">
 			</File>
+			<File
+				RelativePath=".\..\src\zoom.hpp">
+			</File>
 		</Filter>
 		<Filter
 			Name="GUI Source Code"
@@ -691,6 +718,9 @@
 				RelativePath=".\..\src\graph_gui.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\group_gui.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\industry_gui.cpp">
 			</File>
 			<File
@@ -757,6 +787,9 @@
 				RelativePath=".\..\src\train_gui.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\transparency_gui.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\vehicle_gui.cpp">
 			</File>
 		</Filter>
@@ -776,6 +809,9 @@
 				RelativePath=".\..\src\dummy_land.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\group_cmd.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\industry_cmd.cpp">
 			</File>
 			<File
@@ -932,9 +968,15 @@
 				RelativePath=".\..\src\newgrf.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_canal.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_cargo.cpp">
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_commons.cpp">
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_config.cpp">
 			</File>
 			<File
--- a/projects/openttd.xcode/default.pbxuser	Tue Mar 27 23:27:27 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,532 +0,0 @@
-// !$*UTF8*$!
-{
-	08FB7793FE84155DC02AAC07 = {
-		activeBuildStyle = 014CEA520018CE5811CA2923;
-		activeExecutable = 68C517A107AB2F1F00652893;
-		activeTarget = 92BA222C07AAF30200DBA913;
-		codeSenseManager = 68C517A007AB2E2100652893;
-		executables = (
-			68C517A107AB2F1F00652893,
-		);
-		perUserDictionary = {
-			PBXConfiguration.PBXFileTableDataSource3.PBXExecutablesDataSource = {
-				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
-				PBXFileTableDataSourceColumnSortingKey = PBXExecutablesDataSource_NameID;
-				PBXFileTableDataSourceColumnWidthsKey = (
-					22,
-					372.7974,
-				);
-				PBXFileTableDataSourceColumnsKey = (
-					PBXExecutablesDataSource_ActiveFlagID,
-					PBXExecutablesDataSource_NameID,
-				);
-			};
-			PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
-				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
-				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
-				PBXFileTableDataSourceColumnWidthsKey = (
-					20,
-					190,
-					20,
-					39,
-					43,
-					43,
-					20,
-				);
-				PBXFileTableDataSourceColumnsKey = (
-					PBXFileDataSource_FiletypeID,
-					PBXFileDataSource_Filename_ColumnID,
-					PBXFileDataSource_Built_ColumnID,
-					PBXFileDataSource_ObjectSize_ColumnID,
-					PBXFileDataSource_Errors_ColumnID,
-					PBXFileDataSource_Warnings_ColumnID,
-					PBXFileDataSource_Target_ColumnID,
-				);
-			};
-			PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
-				PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
-				PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
-				PBXFileTableDataSourceColumnWidthsKey = (
-					20,
-					167,
-					41,
-					20,
-					41,
-					43,
-					43,
-				);
-				PBXFileTableDataSourceColumnsKey = (
-					PBXFileDataSource_FiletypeID,
-					PBXFileDataSource_Filename_ColumnID,
-					PBXTargetDataSource_PrimaryAttribute,
-					PBXFileDataSource_Built_ColumnID,
-					PBXFileDataSource_ObjectSize_ColumnID,
-					PBXFileDataSource_Errors_ColumnID,
-					PBXFileDataSource_Warnings_ColumnID,
-				);
-			};
-			PBXPerProjectTemplateStateSaveDate = 128685251;
-			PBXPrepackagedSmartGroups_v2 = (
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					activationKey = OldTargetSmartGroup;
-					clz = PBXTargetSmartGroup;
-					description = "Displays all targets of the project.";
-					globalID = 1C37FABC04509CD000000102;
-					name = Targets;
-					preferences = {
-						image = Targets;
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = PBXTargetSmartGroup2;
-					description = "Displays all targets of the project as well as nested build phases.";
-					globalID = 1C37FBAC04509CD000000102;
-					name = Targets;
-					preferences = {
-						image = Targets;
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = PBXExecutablesSmartGroup;
-					description = "Displays all executables of the project.";
-					globalID = 1C37FAAC04509CD000000102;
-					name = Executables;
-					preferences = {
-						image = Executable;
-					};
-				},
-				{
-					" PBXTransientLocationAtTop " = bottom;
-					absolutePathToBundle = "";
-					clz = PBXErrorsWarningsSmartGroup;
-					description = "Displays files with errors or warnings.";
-					globalID = 1C08E77C0454961000C914BD;
-					name = "Errors and Warnings";
-					preferences = {
-						fnmatch = "";
-						image = WarningsErrors;
-						recursive = 1;
-						regex = "";
-						root = "<PROJECT>";
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = PBXFilenameSmartGroup;
-					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
-					globalID = 1CC0EA4004350EF90044410B;
-					name = "Implementation Files";
-					preferences = {
-						canSave = 1;
-						fnmatch = "";
-						image = SmartFolder;
-						isLeaf = 0;
-						recursive = 1;
-						regex = "?*\\.[mcMC]";
-						root = "<PROJECT>";
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = PBXFilenameSmartGroup;
-					description = "This group displays Interface Builder NIB Files.";
-					globalID = 1CC0EA4004350EF90041110B;
-					name = "NIB Files";
-					preferences = {
-						canSave = 1;
-						fnmatch = "*.nib";
-						image = SmartFolder;
-						isLeaf = 0;
-						recursive = 1;
-						regex = "";
-						root = "<PROJECT>";
-					};
-				},
-				{
-					PBXTransientLocationAtTop = no;
-					absolutePathToBundle = "";
-					clz = PBXFindSmartGroup;
-					description = "Displays Find Results.";
-					globalID = 1C37FABC05509CD000000102;
-					name = "Find Results";
-					preferences = {
-						image = spyglass;
-					};
-				},
-				{
-					PBXTransientLocationAtTop = no;
-					absolutePathToBundle = "";
-					clz = PBXBookmarksSmartGroup;
-					description = "Displays Project Bookmarks.";
-					globalID = 1C37FABC05539CD112110102;
-					name = Bookmarks;
-					preferences = {
-						image = Bookmarks;
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = XCSCMSmartGroup;
-					description = "Displays files with interesting SCM status.";
-					globalID = E2644B35053B69B200211256;
-					name = SCM;
-					preferences = {
-						image = PBXRepository;
-						isLeaf = 0;
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = PBXSymbolsSmartGroup;
-					description = "Displays all symbols for the project.";
-					globalID = 1C37FABC04509CD000100104;
-					name = "Project Symbols";
-					preferences = {
-						image = ProjectSymbols;
-						isLeaf = 1;
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = PBXFilenameSmartGroup;
-					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
-					globalID = PBXTemplateMarker;
-					name = "Simple Filter SmartGroup";
-					preferences = {
-						canSave = 1;
-						fnmatch = "*.nib";
-						image = SmartFolder;
-						isLeaf = 0;
-						recursive = 1;
-						regex = "";
-						root = "<PROJECT>";
-					};
-				},
-				{
-					PBXTransientLocationAtTop = bottom;
-					absolutePathToBundle = "";
-					clz = PBXFilenameSmartGroup;
-					description = "Filters items in a given group (potentially recursively) based on matching the name with the regular expression of the filter.";
-					globalID = PBXTemplateMarker;
-					name = "Simple Regular Expression SmartGroup";
-					preferences = {
-						canSave = 1;
-						fnmatch = "";
-						image = SmartFolder;
-						isLeaf = 0;
-						recursive = 1;
-						regex = "?*\\.[mcMC]";
-						root = "<PROJECT>";
-					};
-				},
-			);
-			PBXWorkspaceContents = (
-				{
-					PBXProjectWorkspaceModule_StateKey_Rev39 = {
-						PBXProjectWorkspaceModule_DataSourceSelectionKey_Rev6 = {
-							BoundsStr = "{{0, 0}, {403, 284}}";
-							Rows = (
-							);
-							VisibleRectStr = "{{0, 0}, {403, 284}}";
-						};
-						PBXProjectWorkspaceModule_EditorOpen = false;
-						PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
-							PBXSplitModuleInNavigatorKey = {
-								SplitCount = 1;
-							};
-						};
-						PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
-							PBXProjectWorkspaceModule_SGTM_Geometry = {
-								_collapsingFrameDimension = 0;
-								_indexOfCollapsedView = 0;
-								_percentageOfCollapsedView = 0;
-								sizes = (
-									"{{0, 0}, {182, 301}}",
-									"{{182, 0}, {418, 301}}",
-								);
-							};
-						};
-						PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {418, 301}}";
-						PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 0}, {750, 480}}";
-						PBXProjectWorkspaceModule_OldSuperviewFrame = "{{182, 0}, {418, 301}}";
-						PBXProjectWorkspaceModule_SGTM = {
-							PBXBottomSmartGroupGIDs = (
-								1C37FBAC04509CD000000102,
-								1C37FAAC04509CD000000102,
-								1C08E77C0454961000C914BD,
-								1CC0EA4004350EF90044410B,
-								1CC0EA4004350EF90041110B,
-								1C37FABC05509CD000000102,
-								1C37FABC05539CD112110102,
-								E2644B35053B69B200211256,
-								1C37FABC04509CD000100104,
-							);
-							PBXSmartGroupTreeModuleColumnData = {
-								PBXSmartGroupTreeModuleColumnWidthsKey = (
-									165,
-								);
-								PBXSmartGroupTreeModuleColumnsKey_v4 = (
-									MainColumn,
-								);
-							};
-							PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
-								PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
-								);
-								PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
-									(
-										1,
-									),
-								);
-								PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {165, 283}}";
-							};
-							PBXTopSmartGroupGIDs = (
-							);
-						};
-					};
-				},
-			);
-			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
-			};
-			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXCVSModule" = {
-			};
-			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
-			};
-			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXDebugSessionModule" = {
-				Debugger = {
-					HorizontalSplitView = {
-						_collapsingFrameDimension = 0;
-						_indexOfCollapsedView = 0;
-						_percentageOfCollapsedView = 0;
-						isCollapsed = yes;
-						sizes = (
-							"{{0, 0}, {283, 209}}",
-							"{{283, 0}, {462, 209}}",
-						);
-					};
-					VerticalSplitView = {
-						_collapsingFrameDimension = 0;
-						_indexOfCollapsedView = 0;
-						_percentageOfCollapsedView = 0;
-						isCollapsed = yes;
-						sizes = (
-							"{{0, 0}, {745, 209}}",
-							"{{0, 209}, {745, 213}}",
-						);
-					};
-				};
-				LauncherConfigVersion = 8;
-			};
-			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
-				PBXSplitModuleInNavigatorKey = {
-					SplitCount = 1;
-				};
-			};
-			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
-				PBXProjectWorkspaceModule_StateKey_Rev39 = {
-					PBXProjectWorkspaceModule_EditorOpen = false;
-					PBXProjectWorkspaceModule_EmbeddedNavigatorGroup = {
-						PBXSplitModuleInNavigatorKey = {
-							SplitCount = 1;
-						};
-					};
-					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
-						PBXProjectWorkspaceModule_SGTM_Geometry = {
-							_collapsingFrameDimension = 0;
-							_indexOfCollapsedView = 0;
-							_percentageOfCollapsedView = 0;
-							sizes = (
-								"{{0, 0}, {182, 301}}",
-								"{{182, 0}, {418, 301}}",
-							);
-						};
-					};
-					PBXProjectWorkspaceModule_OldDetailFrame = "{{0, 0}, {418, 301}}";
-					PBXProjectWorkspaceModule_OldEditorFrame = "{{0, 0}, {750, 480}}";
-					PBXProjectWorkspaceModule_OldSuperviewFrame = "{{182, 0}, {418, 301}}";
-					PBXProjectWorkspaceModule_SGTM = {
-						PBXBottomSmartGroupGIDs = (
-							1C37FBAC04509CD000000102,
-							1C37FAAC04509CD000000102,
-							1C08E77C0454961000C914BD,
-							1CC0EA4004350EF90044410B,
-							1CC0EA4004350EF90041110B,
-							1C37FABC05509CD000000102,
-							1C37FABC05539CD112110102,
-							E2644B35053B69B200211256,
-							1C37FABC04509CD000100104,
-						);
-						PBXSmartGroupTreeModuleColumnData = {
-							PBXSmartGroupTreeModuleColumnWidthsKey = (
-								165,
-							);
-							PBXSmartGroupTreeModuleColumnsKey_v4 = (
-								MainColumn,
-							);
-						};
-						PBXSmartGroupTreeModuleOutlineStateKey_v7 = {
-							PBXSmartGroupTreeModuleOutlineStateExpansionKey = (
-							);
-							PBXSmartGroupTreeModuleOutlineStateSelectionKey = (
-							);
-							PBXSmartGroupTreeModuleOutlineStateVisibleRectKey = "{{0, 0}, {165, 283}}";
-						};
-						PBXTopSmartGroupGIDs = (
-						);
-					};
-				};
-			};
-			"PBXWorkspaceContents:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
-				LauncherConfigVersion = 3;
-				Runner = {
-					HorizontalSplitView = {
-						_collapsingFrameDimension = 0;
-						_indexOfCollapsedView = 0;
-						_percentageOfCollapsedView = 0;
-						isCollapsed = yes;
-						sizes = (
-							"{{0, 0}, {491, 167}}",
-							"{{0, 176}, {491, 267}}",
-						);
-					};
-					VerticalSplitView = {
-						_collapsingFrameDimension = 0;
-						_indexOfCollapsedView = 0;
-						_percentageOfCollapsedView = 0;
-						isCollapsed = yes;
-						sizes = (
-							"{{0, 0}, {405, 443}}",
-							"{{414, 0}, {514, 443}}",
-						);
-					};
-				};
-			};
-			PBXWorkspaceGeometries = (
-				{
-					Frame = "{{0, 0}, {600, 301}}";
-					PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
-						PBXProjectWorkspaceModule_DebuggerWindowVisible = true;
-					};
-					RubberWindowFrame = "50 403 600 343 0 0 1024 746 ";
-				},
-			);
-			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXBuildResultsModule" = {
-				Frame = "{{0, 0}, {481, 201}}";
-				PBXModuleWindowStatusBarHidden = YES;
-				RubberWindowFrame = "272 423 481 222 0 0 1024 746 ";
-			};
-			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXCVSModule" = {
-				Frame = "{{0, 0}, {482, 276}}";
-				RubberWindowFrame = "262 214 482 318 0 0 1024 746 ";
-			};
-			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugCLIModule" = {
-				Frame = "{{0, 0}, {400, 201}}";
-				PBXModuleWindowStatusBarHidden = YES;
-				RubberWindowFrame = "50 718 400 222 0 0 1024 746 ";
-			};
-			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXDebugSessionModule" = {
-				DebugConsoleDrawerSize = "{100, 120}";
-				DebugConsoleVisible = None;
-				DebugConsoleWindowFrame = "{{200, 200}, {500, 300}}";
-				DebugSTDIOWindowFrame = "{{200, 200}, {500, 300}}";
-				Frame = "{{0, 0}, {745, 422}}";
-				RubberWindowFrame = "208 276 745 464 0 0 1024 746 ";
-			};
-			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXNavigatorGroup" = {
-				Frame = "{{0, 0}, {750, 481}}";
-				PBXModuleWindowStatusBarHidden = YES;
-				RubberWindowFrame = "84 176 750 502 0 0 1024 746 ";
-			};
-			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXProjectWorkspaceModule" = {
-				Frame = "{{0, 0}, {600, 301}}";
-				PBXProjectWorkspaceModule_GeometryKey_Rev15 = {
-				};
-				RubberWindowFrame = "50 403 600 343 0 0 1024 746 ";
-			};
-			"PBXWorkspaceGeometries:PBXConfiguration.PBXModule.PBXRunSessionModule" = {
-				Frame = "{{0, 0}, {745, 422}}";
-				RubberWindowFrame = "139 272 745 464 0 0 1024 746 ";
-			};
-			PBXWorkspaceStateSaveDate = 128685251;
-		};
-		sourceControlManager = 68C5179F07AB2E2100652893;
-		userBuildSettings = {
-		};
-	};
-	68C5179F07AB2E2100652893 = {
-		isa = PBXSourceControlManager;
-		scmConfiguration = {
-		};
-		scmType = scm.cvs;
-	};
-	68C517A007AB2E2100652893 = {
-		indexTemplatePath = "";
-		isa = PBXCodeSenseManager;
-		usesDefaults = 1;
-		wantsCodeCompletion = 1;
-		wantsCodeCompletionAutoPopup = 0;
-		wantsCodeCompletionAutoSuggestions = 0;
-		wantsCodeCompletionCaseSensitivity = 1;
-		wantsCodeCompletionOnlyMatchingItems = 1;
-		wantsCodeCompletionParametersIncluded = 1;
-		wantsCodeCompletionPlaceholdersInserted = 1;
-		wantsCodeCompletionTabCompletes = 1;
-		wantsIndex = 1;
-	};
-	68C517A107AB2F1F00652893 = {
-		activeArgIndex = 2147483647;
-		activeArgIndices = (
-		);
-		argumentStrings = (
-		);
-		configStateDict = {
-		};
-		debuggerPlugin = GDBDebugging;
-		dylibVariantSuffix = "";
-		enableDebugStr = 1;
-		environmentEntries = (
-		);
-		isa = PBXExecutable;
-		launchableReference = 68C517A707AB353500652893;
-		name = Executable;
-		shlibInfoDictList = (
-		);
-		sourceDirectories = (
-		);
-		startupPath = "<<ProjectDirectory>>";
-	};
-	68C517A707AB353500652893 = {
-		isa = PBXFileReference;
-		lastKnownFileType = "compiled.mach-o.executable";
-		path = openttd;
-		refType = 4;
-		sourceTree = "<group>";
-	};
-	92BA20FC07AAF1EE00DBA913 = {
-		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {842, 19935}}";
-			sepNavSelRange = "{33085, 0}";
-			sepNavVisRect = "{{0, 19643}, {706, 181}}";
-		};
-	};
-	92BA212307AAF1EE00DBA913 = {
-		uiCtxt = {
-			sepNavIntBoundsRect = "{{0, 0}, {992, 11857}}";
-			sepNavSelRange = "{19846, 0}";
-			sepNavVisRect = "{{0, 11676}, {706, 181}}";
-		};
-	};
-	92BA222C07AAF30200DBA913 = {
-		activeExec = 0;
-	};
-}
--- a/projects/openttd.xcode/project.pbxproj	Tue Mar 27 23:27:27 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,3168 +0,0 @@
-// !$*UTF8*$!
-{
-	archiveVersion = 1;
-	classes = {
-	};
-	objectVersion = 39;
-	objects = {
-		014CEA520018CE5811CA2923 = {
-			buildSettings = {
-				COPY_PHASE_STRIP = NO;
-				GCC_DYNAMIC_NO_PIC = NO;
-				GCC_ENABLE_FIX_AND_CONTINUE = YES;
-				GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
-				GCC_OPTIMIZATION_LEVEL = 0;
-				HEADER_SEARCH_PATHS = /sw/include/SDL;
-				LIBRARY_SEARCH_PATHS = /sw/include/SDL;
-				ZERO_LINK = NO;
-			};
-			isa = PBXBuildStyle;
-			name = Development;
-		};
-		014CEA530018CE5811CA2923 = {
-			buildSettings = {
-				COPY_PHASE_STRIP = YES;
-				GCC_ENABLE_FIX_AND_CONTINUE = NO;
-				ZERO_LINK = NO;
-			};
-			isa = PBXBuildStyle;
-			name = Deployment;
-		};
-//010
-//011
-//012
-//013
-//014
-//080
-//081
-//082
-//083
-//084
-		08FB7793FE84155DC02AAC07 = {
-			buildSettings = {
-			};
-			buildStyles = (
-				014CEA520018CE5811CA2923,
-				014CEA530018CE5811CA2923,
-			);
-			hasScannedForEncodings = 1;
-			isa = PBXProject;
-			mainGroup = 08FB7794FE84155DC02AAC07;
-			projectDirPath = "";
-			targets = (
-				92BA222C07AAF30200DBA913,
-			);
-		};
-		08FB7794FE84155DC02AAC07 = {
-			children = (
-				08FB7795FE84155DC02AAC07,
-				C6A0FF2B0290797F04C91782,
-				1AB674ADFE9D54B511CA2CBB,
-			);
-			isa = PBXGroup;
-			name = OpenTTD;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		08FB7795FE84155DC02AAC07 = {
-			children = (
-				92BA20DF07AAF1EE00DBA913,
-				92BA20E007AAF1EE00DBA913,
-				92BA20E107AAF1EE00DBA913,
-				92BA20E207AAF1EE00DBA913,
-				92BA20E307AAF1EE00DBA913,
-				92BA20E407AAF1EE00DBA913,
-				92BA20E507AAF1EE00DBA913,
-				92BA20E607AAF1EE00DBA913,
-				92BA20E707AAF1EE00DBA913,
-				92BA20E807AAF1EE00DBA913,
-				92BA20E907AAF1EE00DBA913,
-				92BA20EA07AAF1EE00DBA913,
-				92BA20EB07AAF1EE00DBA913,
-				92BA20EC07AAF1EE00DBA913,
-				92BA20ED07AAF1EE00DBA913,
-				92BA20EE07AAF1EE00DBA913,
-				92BA20EF07AAF1EE00DBA913,
-				92BA20F007AAF1EE00DBA913,
-				92BA20F107AAF1EE00DBA913,
-				92BA20F207AAF1EE00DBA913,
-				92BA20F307AAF1EE00DBA913,
-				92BA20F407AAF1EE00DBA913,
-				92BA20F507AAF1EE00DBA913,
-				92BA20F607AAF1EE00DBA913,
-				92BA20F707AAF1EE00DBA913,
-				92BA20F807AAF1EE00DBA913,
-				92BA20F907AAF1EE00DBA913,
-				92BA20FA07AAF1EE00DBA913,
-				92BA20FB07AAF1EE00DBA913,
-				92BA20FC07AAF1EE00DBA913,
-				92BA20FD07AAF1EE00DBA913,
-				92BA20FE07AAF1EE00DBA913,
-				92BA20FF07AAF1EE00DBA913,
-				92BA210007AAF1EE00DBA913,
-				92BA210107AAF1EE00DBA913,
-				92BA210207AAF1EE00DBA913,
-				92BA210307AAF1EE00DBA913,
-				92BA210407AAF1EE00DBA913,
-				92BA210507AAF1EE00DBA913,
-				92BA212107AAF1EE00DBA913,
-				92BA212207AAF1EE00DBA913,
-				92BA212307AAF1EE00DBA913,
-				92BA212407AAF1EE00DBA913,
-				92BA212C07AAF1EE00DBA913,
-				92BA212D07AAF1EE00DBA913,
-				92BA212E07AAF1EE00DBA913,
-				92BA212F07AAF1EE00DBA913,
-				92BA213007AAF1EE00DBA913,
-				92BA213107AAF1EE00DBA913,
-				92BA213207AAF1EE00DBA913,
-				92BA213307AAF1EE00DBA913,
-				92BA213407AAF1EE00DBA913,
-				92BA213507AAF1EE00DBA913,
-				92BA213607AAF1EE00DBA913,
-				92BA213707AAF1EE00DBA913,
-				92BA213807AAF1EE00DBA913,
-				92BA213907AAF1EE00DBA913,
-				92BA213A07AAF1EE00DBA913,
-				92BA213B07AAF1EE00DBA913,
-				92BA213C07AAF1EE00DBA913,
-				92BA213D07AAF1EE00DBA913,
-				92BA213E07AAF1EE00DBA913,
-				92BA214607AAF1EE00DBA913,
-				92BA214707AAF1EE00DBA913,
-				92BA214807AAF1EE00DBA913,
-				92BA214C07AAF1EE00DBA913,
-				92BA214D07AAF1EE00DBA913,
-				92BA214E07AAF1EE00DBA913,
-				92BA214F07AAF1EE00DBA913,
-				92BA215007AAF1EE00DBA913,
-				92BA215107AAF1EE00DBA913,
-				92BA215207AAF1EE00DBA913,
-				92BA215307AAF1EE00DBA913,
-				92BA215407AAF1EE00DBA913,
-				92BA215507AAF1EE00DBA913,
-				92BA215607AAF1EE00DBA913,
-				92BA215707AAF1EE00DBA913,
-				92BA215807AAF1EE00DBA913,
-				92BA215907AAF1EE00DBA913,
-				92BA215A07AAF1EE00DBA913,
-				92BA215B07AAF1EE00DBA913,
-				92BA215C07AAF1EE00DBA913,
-				92BA215D07AAF1EE00DBA913,
-				92BA215E07AAF1EE00DBA913,
-				92BA218807AAF1EF00DBA913,
-				92BA218907AAF1EF00DBA913,
-				92BA218A07AAF1EF00DBA913,
-				92BA218B07AAF1EF00DBA913,
-				92BA218C07AAF1EF00DBA913,
-				92BA218D07AAF1EF00DBA913,
-				92BA218E07AAF1EF00DBA913,
-				92BA218F07AAF1EF00DBA913,
-				92BA219007AAF1EF00DBA913,
-				92BA219107AAF1EF00DBA913,
-				92BA219207AAF1EF00DBA913,
-				92BA219307AAF1EF00DBA913,
-				92BA219407AAF1EF00DBA913,
-				92BA219507AAF1EF00DBA913,
-				92BA219607AAF1EF00DBA913,
-				92BA219707AAF1EF00DBA913,
-				92BA219807AAF1EF00DBA913,
-				92BA219907AAF1EF00DBA913,
-				92BA219A07AAF1EF00DBA913,
-				92BA219B07AAF1EF00DBA913,
-				92BA219C07AAF1EF00DBA913,
-				92BA219D07AAF1EF00DBA913,
-				92BA219E07AAF1EF00DBA913,
-				92BA219F07AAF1EF00DBA913,
-				92BA21A007AAF1EF00DBA913,
-				92BA21A107AAF1EF00DBA913,
-				92BA21A207AAF1EF00DBA913,
-				92BA21A307AAF1EF00DBA913,
-				92BA21A407AAF1EF00DBA913,
-				92BA21A507AAF1EF00DBA913,
-				92BA21AE07AAF1EF00DBA913,
-				92BA21AF07AAF1EF00DBA913,
-				92BA21B007AAF1EF00DBA913,
-				92BA21B107AAF1EF00DBA913,
-				92BA21B207AAF1EF00DBA913,
-				92BA21B507AAF1EF00DBA913,
-				92BA21B607AAF1EF00DBA913,
-				92BA21B707AAF1EF00DBA913,
-				92BA21B807AAF1EF00DBA913,
-				92BA21B907AAF1EF00DBA913,
-				92BA21BA07AAF1EF00DBA913,
-				92BA21BB07AAF1EF00DBA913,
-				92BA21D607AAF1EF00DBA913,
-				92BA21D707AAF1EF00DBA913,
-				92BA21D807AAF1EF00DBA913,
-				92BA21D907AAF1EF00DBA913,
-				92BA21DA07AAF1EF00DBA913,
-				92BA21DB07AAF1EF00DBA913,
-				92BA21DC07AAF1EF00DBA913,
-				92BA21DD07AAF1EF00DBA913,
-				92BA21DE07AAF1EF00DBA913,
-				92BA21DF07AAF1EF00DBA913,
-				92BA21E007AAF1EF00DBA913,
-				92BA21E107AAF1EF00DBA913,
-				92BA21E207AAF1EF00DBA913,
-				92BA21E307AAF1EF00DBA913,
-				92BA21E407AAF1EF00DBA913,
-				92BA21E507AAF1EF00DBA913,
-				92BA21E607AAF1EF00DBA913,
-				92BA21E707AAF1EF00DBA913,
-				92BA21E807AAF1EF00DBA913,
-				92BA21E907AAF1EF00DBA913,
-				92BA21EA07AAF1EF00DBA913,
-				92BA21EB07AAF1EF00DBA913,
-				92BA21EC07AAF1EF00DBA913,
-				92BA21FC07AAF1EF00DBA913,
-				92BA21FD07AAF1EF00DBA913,
-				92BA21FE07AAF1EF00DBA913,
-				92BA21FF07AAF1EF00DBA913,
-				92BA220C07AAF1EF00DBA913,
-				92BA220D07AAF1EF00DBA913,
-				92BA220E07AAF1EF00DBA913,
-				92BA220F07AAF1EF00DBA913,
-				92BA221007AAF1EF00DBA913,
-				92BA221107AAF1EF00DBA913,
-				92BA221207AAF1EF00DBA913,
-				92BA221307AAF1EF00DBA913,
-				92BA221407AAF1EF00DBA913,
-				92BA221507AAF1EF00DBA913,
-				92BA221607AAF1EF00DBA913,
-				92BA221707AAF1EF00DBA913,
-				92BA221807AAF1EF00DBA913,
-				92BA221907AAF1EF00DBA913,
-				92BA221A07AAF1EF00DBA913,
-				92BA221B07AAF1EF00DBA913,
-				92BA221C07AAF1EF00DBA913,
-				92BA221D07AAF1EF00DBA913,
-				92BA221E07AAF1EF00DBA913,
-				92BA221F07AAF1EF00DBA913,
-				92BA222007AAF1EF00DBA913,
-				92BA222107AAF1EF00DBA913,
-				92BA222207AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			name = Source;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-//080
-//081
-//082
-//083
-//084
-//1A0
-//1A1
-//1A2
-//1A3
-//1A4
-		1AB674ADFE9D54B511CA2CBB = {
-			children = (
-			);
-			isa = PBXGroup;
-			name = Products;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-//1A0
-//1A1
-//1A2
-//1A3
-//1A4
-//920
-//921
-//922
-//923
-//924
-		92BA20DF07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = sdl.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = news_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = news.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.make;
-			path = Makefile;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = console.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = console.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = window.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = window.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = win32.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = widget.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20E907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = water_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20EA07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.cpp.cpp;
-			path = w32dm2.cpp;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20EB07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = w32dm.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20EC07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = viewport.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20ED07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = viewport.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20EE07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = vehicle_gui.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20EF07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = vehicle_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = vehicle.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = vehicle.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = variables.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = unmovable_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = unix.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = tunnelbridge_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.plist.xml;
-			path = ttd.vcproj;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = ttd.sln;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = ttd.rc;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20F907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = ttd.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20FA07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = ttd.dsw;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20FB07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = ttd.dsp;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20FC07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ttd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20FD07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = tree_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20FE07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = train_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA20FF07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = train_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = town_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = town_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = town.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = texteff.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = terraform_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210507AAF1EE00DBA913 = {
-			children = (
-				92BA210607AAF1EE00DBA913,
-				92BA210707AAF1EE00DBA913,
-				92BA210807AAF1EE00DBA913,
-				92BA210907AAF1EE00DBA913,
-				92BA210A07AAF1EE00DBA913,
-				92BA210B07AAF1EE00DBA913,
-				92BA210C07AAF1EE00DBA913,
-				92BA210D07AAF1EE00DBA913,
-				92BA210E07AAF1EE00DBA913,
-				92BA210F07AAF1EE00DBA913,
-				92BA211007AAF1EE00DBA913,
-				92BA211107AAF1EE00DBA913,
-				92BA211207AAF1EE00DBA913,
-				92BA211307AAF1EE00DBA913,
-				92BA211407AAF1EE00DBA913,
-				92BA211507AAF1EE00DBA913,
-				92BA211607AAF1EE00DBA913,
-				92BA211707AAF1EE00DBA913,
-				92BA211807AAF1EE00DBA913,
-				92BA211907AAF1EE00DBA913,
-				92BA211A07AAF1EE00DBA913,
-				92BA211B07AAF1EE00DBA913,
-				92BA211C07AAF1EE00DBA913,
-				92BA211D07AAF1EE00DBA913,
-				92BA211E07AAF1EE00DBA913,
-				92BA211F07AAF1EE00DBA913,
-				92BA212007AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = table;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = ai_rail.h;
-			path = table/ai_rail.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = animcursors.h;
-			path = table/animcursors.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = autorail.h;
-			path = table/autorail.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = bridge_land.h;
-			path = table/bridge_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210A07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = build_industry.h;
-			path = table/build_industry.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210B07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = clear_land.h;
-			path = table/clear_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210C07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = currency.h;
-			path = table/currency.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210D07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = directions.h;
-			path = table/directions.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210E07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = engines.h;
-			path = table/engines.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA210F07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = files.h;
-			path = table/files.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = genland.h;
-			path = table/genland.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = industry_land.h;
-			path = table/industry_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = landscape_const.h;
-			path = table/landscape_const.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = landscape_sprite.h;
-			path = table/landscape_sprite.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = namegen.h;
-			path = table/namegen.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = palettes.h;
-			path = table/palettes.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = road_land.h;
-			path = table/road_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = roadveh.h;
-			path = table/roadveh.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = sprites.h;
-			path = table/sprites.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = station_land.h;
-			path = table/station_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211A07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = town_land.h;
-			path = table/town_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211B07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = track_land.h;
-			path = table/track_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211C07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = train_cmd.h;
-			path = table/train_cmd.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211D07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = tree_land.h;
-			path = table/tree_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211E07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = tunnel_land.h;
-			path = table/tunnel_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA211F07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = unmovable_land.h;
-			path = table/unmovable_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = water_land.h;
-			path = table/water_land.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.script.sh;
-			path = svnup.sh;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = subsidy_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = strings.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212407AAF1EE00DBA913 = {
-			children = (
-				92BA212507AAF1EE00DBA913,
-				92BA212607AAF1EE00DBA913,
-				92BA212707AAF1EE00DBA913,
-				92BA212807AAF1EE00DBA913,
-				92BA212907AAF1EE00DBA913,
-				92BA212A07AAF1EE00DBA913,
-				92BA212B07AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = strgen;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			name = stdafx.c;
-			path = strgen/stdafx.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			name = stdafx.h;
-			path = strgen/stdafx.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			name = strgen.c;
-			path = strgen/strgen.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = strgen.dsp;
-			path = strgen/strgen.dsp;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = strgen.dsw;
-			path = strgen/strgen.dsw;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212A07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = strgen.tgt;
-			path = strgen/strgen.tgt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212B07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.plist.xml;
-			name = strgen.vcproj;
-			path = strgen/strgen.vcproj;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212C07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = stdafx.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212D07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = StdAfx.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212E07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = station_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA212F07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = station_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = station.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = spritecache.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = sprite.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = sprite.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = sound.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = sound.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = smallmap_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = signs.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = signs.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ship_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213A07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ship_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213B07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = settings_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213C07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = settings.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213D07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = settings.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213E07AAF1EE00DBA913 = {
-			children = (
-				92BA213F07AAF1EE00DBA913,
-				92BA214007AAF1EE00DBA913,
-				92BA214107AAF1EE00DBA913,
-				92BA214207AAF1EE00DBA913,
-				92BA214307AAF1EE00DBA913,
-				92BA214407AAF1EE00DBA913,
-				92BA214507AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = scripts;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA213F07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = autoexec.scr.example;
-			path = scripts/autoexec.scr.example;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = on_client.scr.example;
-			path = scripts/on_client.scr.example;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = on_dedicated.scr.example;
-			path = scripts/on_dedicated.scr.example;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = on_server.scr.example;
-			path = scripts/on_server.scr.example;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = pre_dedicated.scr.example;
-			path = scripts/pre_dedicated.scr.example;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = pre_server.scr.example;
-			path = scripts/pre_server.scr.example;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = readme.txt;
-			path = scripts/readme.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = screenshot.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = screenshot.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214807AAF1EE00DBA913 = {
-			children = (
-				92BA214907AAF1EE00DBA913,
-				92BA214A07AAF1EE00DBA913,
-				92BA214B07AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = scenario;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214907AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = "Linkgame Islands 2004.scn";
-			path = "scenario/Linkgame Islands 2004.scn";
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214A07AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = "Mountain Pass.scn";
-			path = "scenario/Mountain Pass.scn";
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214B07AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = "Volcano City.scn";
-			path = "scenario/Volcano City.scn";
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214C07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = saveload.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214D07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = saveload.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214E07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = roadveh_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA214F07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = roadveh_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = road_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = road_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = resource.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = readme.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = rail_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = rail_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = queue.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = queue.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = players.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = player_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215A07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = player.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215B07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = pathfind.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215C07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = pathfind.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215D07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = os2.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215E07AAF1EE00DBA913 = {
-			children = (
-				92BA215F07AAF1EE00DBA913,
-				92BA216107AAF1EE00DBA913,
-				92BA216C07AAF1EE00DBA913,
-				92BA216F07AAF1EE00DBA913,
-				92BA217707AAF1EE00DBA913,
-				92BA217D07AAF1EE00DBA913,
-				92BA218107AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = os;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA215F07AAF1EE00DBA913 = {
-			children = (
-				92BA216007AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = beos;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA216007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.cpp.cpp;
-			name = bemidi.cpp;
-			path = os/beos/bemidi.cpp;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216107AAF1EE00DBA913 = {
-			children = (
-				92BA216207AAF1EE00DBA913,
-				92BA216307AAF1EE00DBA913,
-				92BA216407AAF1EE00DBA913,
-				92BA216507AAF1EE00DBA913,
-				92BA216607AAF1EE00DBA913,
-				92BA216707AAF1EE00DBA913,
-				92BA216807AAF1EE00DBA913,
-				92BA216907AAF1EE00DBA913,
-				92BA216A07AAF1EE00DBA913,
-				92BA216B07AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = debian;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA216207AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = changelog;
-			path = os/debian/changelog;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = compat;
-			path = os/debian/compat;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = control;
-			path = os/debian/control;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = copyright;
-			path = os/debian/copyright;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = docs;
-			path = os/debian/docs;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216707AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = menu;
-			path = os/debian/menu;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216807AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.script.sh;
-			name = postinst;
-			path = os/debian/postinst;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216907AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.script.sh;
-			name = postrm;
-			path = os/debian/postrm;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216A07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = README.Debian;
-			path = os/debian/README.Debian;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216B07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = rules;
-			path = os/debian/rules;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216C07AAF1EE00DBA913 = {
-			children = (
-				92BA216D07AAF1EE00DBA913,
-				92BA216E07AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = linux;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA216D07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = openttd.spec;
-			path = os/linux/openttd.spec;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216E07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = README.urpmi;
-			path = os/linux/README.urpmi;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA216F07AAF1EE00DBA913 = {
-			children = (
-				92BA217007AAF1EE00DBA913,
-				92BA217107AAF1EE00DBA913,
-				92BA217207AAF1EE00DBA913,
-				92BA217307AAF1EE00DBA913,
-				92BA217407AAF1EE00DBA913,
-				92BA217507AAF1EE00DBA913,
-				92BA217607AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = macos;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA217007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Open_Transport_Tycoon_Forum.webloc;
-			path = os/macos/Open_Transport_Tycoon_Forum.webloc;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217107AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Open_Transport_Tycoon_Homepage.webloc;
-			path = os/macos/Open_Transport_Tycoon_Homepage.webloc;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217207AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.icns;
-			name = openttd.icns;
-			path = os/macos/openttd.icns;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.java;
-			name = openttdmidi.java;
-			path = os/macos/openttdmidi.java;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.script.sh;
-			name = plistgen.sh;
-			path = os/macos/plistgen.sh;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = SourceForge_OpenTTD_project_homepage.webloc;
-			path = os/macos/SourceForge_OpenTTD_project_homepage.webloc;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217607AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.script.sh;
-			name = track_starter;
-			path = os/macos/track_starter;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217707AAF1EE00DBA913 = {
-			children = (
-				92BA217807AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = morphos;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA217807AAF1EE00DBA913 = {
-			children = (
-				92BA217907AAF1EE00DBA913,
-				92BA217A07AAF1EE00DBA913,
-				92BA217B07AAF1EE00DBA913,
-				92BA217C07AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = icons;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA217907AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = docs.info;
-			path = os/morphos/icons/docs.info;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217A07AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = document.info;
-			path = os/morphos/icons/document.info;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217B07AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = drawer.info;
-			path = os/morphos/icons/drawer.info;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217C07AAF1EE00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = OpenTTD.info;
-			path = os/morphos/icons/OpenTTD.info;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217D07AAF1EE00DBA913 = {
-			children = (
-				92BA217E07AAF1EE00DBA913,
-				92BA217F07AAF1EE00DBA913,
-				92BA218007AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = os2;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA217E07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = build_lang.cmd;
-			path = os/os2/build_lang.cmd;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA217F07AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = dedicated.cmd;
-			path = os/os2/dedicated.cmd;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218007AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = openttd.wpj;
-			path = os/os2/openttd.wpj;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218107AAF1EE00DBA913 = {
-			children = (
-				92BA218207AAF1EE00DBA913,
-			);
-			isa = PBXGroup;
-			path = win32;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA218207AAF1EE00DBA913 = {
-			children = (
-				92BA218307AAF1EE00DBA913,
-				92BA218407AAF1EE00DBA913,
-				92BA218507AAF1EE00DBA913,
-				92BA218607AAF1EF00DBA913,
-				92BA218707AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			path = installer;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA218307AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = CDFinder.ini;
-			path = os/win32/installer/CDFinder.ini;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218407AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = gpl.txt;
-			path = os/win32/installer/gpl.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218507AAF1EE00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = install.nsi;
-			path = os/win32/installer/install.nsi;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = InstallChoices.ini;
-			path = os/win32/installer/InstallChoices.ini;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = "TTD to OpenTTD Transition Guide.txt";
-			path = "os/win32/installer/TTD to OpenTTD Transition Guide.txt";
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = order_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = order_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218A07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = order.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218B07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = openttd.tgt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218C07AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.ico;
-			path = openttd.ico;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218D07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = oldloader.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218E07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = newgrf.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA218F07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = newgrf.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = network_udp.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = network_udp.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = network_server.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = network_server.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = network_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219507AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = network_gamelist.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = network_gamelist.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = network_data.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = network_data.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = network_core.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219A07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = network_client.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219B07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = network_client.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219C07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = network.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219D07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = network.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219E07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = namegen.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA219F07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = music_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = misc_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = misc_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = misc.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = minilzo.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = minilzo.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A507AAF1EF00DBA913 = {
-			children = (
-				92BA21A607AAF1EF00DBA913,
-				92BA21A707AAF1EF00DBA913,
-				92BA21A807AAF1EF00DBA913,
-				92BA21A907AAF1EF00DBA913,
-				92BA21AA07AAF1EF00DBA913,
-				92BA21AB07AAF1EF00DBA913,
-				92BA21AC07AAF1EF00DBA913,
-				92BA21AD07AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			path = media;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A607AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.png;
-			name = openttd.128.png;
-			path = media/openttd.128.png;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A707AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.png;
-			name = openttd.16.png;
-			path = media/openttd.16.png;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A807AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.png;
-			name = openttd.256.png;
-			path = media/openttd.256.png;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21A907AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.png;
-			name = openttd.32.png;
-			path = media/openttd.32.png;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21AA07AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.png;
-			name = openttd.48.png;
-			path = media/openttd.48.png;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21AB07AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.png;
-			name = openttd.64.png;
-			path = media/openttd.64.png;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21AC07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = openttd.64.xpm;
-			path = media/openttd.64.xpm;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21AD07AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = palette.act;
-			path = media/palette.act;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21AE07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = md5.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21AF07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = md5.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = map.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = map.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B207AAF1EF00DBA913 = {
-			children = (
-				92BA21B307AAF1EF00DBA913,
-				92BA21B407AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			path = makefiledir;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Makefile.config_writer;
-			path = makefiledir/Makefile.config_writer;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Makefile.libdetection;
-			path = makefiledir/Makefile.libdetection;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B507AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.ico;
-			path = mainicon.ico;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = main_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = macros.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = lzoconf.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21B907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.plist.xml;
-			path = langs.vcproj;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21BA07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = langs.dsp;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21BB07AAF1EF00DBA913 = {
-			children = (
-				92BA21BC07AAF1EF00DBA913,
-				92BA21BD07AAF1EF00DBA913,
-				92BA21BE07AAF1EF00DBA913,
-				92BA21BF07AAF1EF00DBA913,
-				92BA21C007AAF1EF00DBA913,
-				92BA21C107AAF1EF00DBA913,
-				92BA21C207AAF1EF00DBA913,
-				92BA21C307AAF1EF00DBA913,
-				92BA21C407AAF1EF00DBA913,
-				92BA21C507AAF1EF00DBA913,
-				92BA21C607AAF1EF00DBA913,
-				92BA21C707AAF1EF00DBA913,
-				92BA21C807AAF1EF00DBA913,
-				92BA21C907AAF1EF00DBA913,
-				92BA21CA07AAF1EF00DBA913,
-				92BA21CB07AAF1EF00DBA913,
-				92BA21CC07AAF1EF00DBA913,
-				92BA21CD07AAF1EF00DBA913,
-				92BA21CE07AAF1EF00DBA913,
-				92BA21CF07AAF1EF00DBA913,
-				92BA21D007AAF1EF00DBA913,
-				92BA21D107AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			path = lang;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21BC07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = american.txt;
-			path = lang/american.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21BD07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = catalan.txt;
-			path = lang/catalan.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21BE07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = czech.txt;
-			path = lang/czech.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21BF07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = danish.txt;
-			path = lang/danish.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = dutch.txt;
-			path = lang/dutch.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = english.txt;
-			path = lang/english.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = finnish.txt;
-			path = lang/finnish.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = french.txt;
-			path = lang/french.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = galician.txt;
-			path = lang/galician.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C507AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = german.txt;
-			path = lang/german.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = hungarian.txt;
-			path = lang/hungarian.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = icelandic.txt;
-			path = lang/icelandic.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = italian.txt;
-			path = lang/italian.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21C907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = norwegian.txt;
-			path = lang/norwegian.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21CA07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = origveh.txt;
-			path = lang/origveh.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21CB07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = polish.txt;
-			path = lang/polish.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21CC07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = portuguese.txt;
-			path = lang/portuguese.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21CD07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = romanian.txt;
-			path = lang/romanian.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21CE07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = slovak.txt;
-			path = lang/slovak.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21CF07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = spanish.txt;
-			path = lang/spanish.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = swedish.txt;
-			path = lang/swedish.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D107AAF1EF00DBA913 = {
-			children = (
-				92BA21D207AAF1EF00DBA913,
-				92BA21D307AAF1EF00DBA913,
-				92BA21D407AAF1EF00DBA913,
-				92BA21D507AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			path = unfinished;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-		92BA21D207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = estonian.txt;
-			path = lang/unfinished/estonian.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = latvian.txt;
-			path = lang/unfinished/latvian.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = russian.txt;
-			path = lang/unfinished/russian.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D507AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = turkish.txt;
-			path = lang/unfinished/turkish.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = landscape.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = "known-bugs.txt";
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = intro_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21D907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = industry_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21DA07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = industry_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21DB07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = industry.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21DC07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = hal.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21DD07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = gui.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21DE07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = graph_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21DF07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = gfx.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = gfx.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = functions.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = fileio.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = fileio.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = extmidi.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E507AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = engine_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = engine.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = engine.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = endian_check.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21E907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = economy.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21EA07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = economy.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21EB07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = dummy_land.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21EC07AAF1EF00DBA913 = {
-			children = (
-				92BA21ED07AAF1EF00DBA913,
-				92BA21EE07AAF1EF00DBA913,
-				92BA21EF07AAF1EF00DBA913,
-				92BA21F007AAF1EF00DBA913,
-				92BA21F107AAF1EF00DBA913,
-				92BA21F207AAF1EF00DBA913,
-				92BA21F307AAF1EF00DBA913,
-				92BA21F407AAF1EF00DBA913,
-				92BA21F507AAF1EF00DBA913,
-				92BA21F607AAF1EF00DBA913,
-				92BA21F707AAF1EF00DBA913,
-				92BA21F807AAF1EF00DBA913,
-				92BA21F907AAF1EF00DBA913,
-				92BA21FA07AAF1EF00DBA913,
-				92BA21FB07AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			path = docs;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21ED07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = console.txt;
-			path = docs/console.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21EE07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = directmusic.txt;
-			path = docs/directmusic.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21EF07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Howto_compile_lng_files_from_CLI.txt;
-			path = docs/Howto_compile_lng_files_from_CLI.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text.html;
-			name = landscape.html;
-			path = docs/landscape.html;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Manual.txt;
-			path = docs/Manual.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = multiplayer.txt;
-			path = docs/multiplayer.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = openttd.6;
-			path = docs/openttd.6;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = OSX_where_did_the_package_go.txt;
-			path = docs/OSX_where_did_the_package_go.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F507AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.gif;
-			name = "ottd-colour-palette.gif";
-			path = "docs/ottd-colour-palette.gif";
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = README_if_game_crashed_on_OSX.txt;
-			path = docs/README_if_game_crashed_on_OSX.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Readme_Mandrake_Linux.txt;
-			path = docs/Readme_Mandrake_Linux.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Readme_OS2.txt;
-			path = docs/Readme_OS2.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21F907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = Readme_Windows_MSVC6.0.txt;
-			path = docs/Readme_Windows_MSVC6.0.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21FA07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			name = textcolor.txt;
-			path = docs/textcolor.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21FB07AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = image.png;
-			name = tileh.png;
-			path = docs/tileh.png;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21FC07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = dock_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21FD07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = disaster_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21FE07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = dedicated.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA21FF07AAF1EF00DBA913 = {
-			children = (
-				92BA220007AAF1EF00DBA913,
-				92BA220107AAF1EF00DBA913,
-				92BA220207AAF1EF00DBA913,
-				92BA220307AAF1EF00DBA913,
-				92BA220407AAF1EF00DBA913,
-				92BA220507AAF1EF00DBA913,
-				92BA220607AAF1EF00DBA913,
-				92BA220707AAF1EF00DBA913,
-				92BA220807AAF1EF00DBA913,
-				92BA220907AAF1EF00DBA913,
-				92BA220A07AAF1EF00DBA913,
-				92BA220B07AAF1EF00DBA913,
-			);
-			isa = PBXGroup;
-			path = data;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220007AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = autorail.grf;
-			path = data/autorail.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220107AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = canalsw.grf;
-			path = data/canalsw.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220207AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = openttd.grf;
-			path = data/openttd.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220307AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = opntitle.dat;
-			path = data/opntitle.dat;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220407AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = sample.cat;
-			path = data/sample.cat;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220507AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = signalsw.grf;
-			path = data/signalsw.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220607AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = trg1r.grf;
-			path = data/trg1r.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220707AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = trgcr.grf;
-			path = data/trgcr.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220807AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = trghr.grf;
-			path = data/trghr.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220907AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = trgir.grf;
-			path = data/trgir.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220A07AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = trgtr.grf;
-			path = data/trgtr.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220B07AAF1EF00DBA913 = {
-			isa = PBXFileReference;
-			lastKnownFileType = file;
-			name = trkfoundw.grf;
-			path = data/trkfoundw.grf;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220C07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = COPYING;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220D07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = console_cmds.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220E07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = command.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA220F07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = command.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = clear_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = text;
-			path = changelog.txt;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = callback_table.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221307AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = callback_table.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221407AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = bridge_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221507AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = aystar.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221607AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = aystar.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221707AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = airport_movement.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221807AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = airport_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221907AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = airport.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221A07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = airport.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221B07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = aircraft_gui.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221C07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = aircraft_cmd.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221D07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ai_shared.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221E07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ai_pathfinder.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA221F07AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ai_new.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA222007AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ai_build.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA222107AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.h;
-			path = ai_new.h;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA222207AAF1EF00DBA913 = {
-			fileEncoding = 30;
-			isa = PBXFileReference;
-			lastKnownFileType = sourcecode.c.c;
-			path = ai_old.c;
-			refType = 2;
-			sourceTree = SOURCE_ROOT;
-		};
-		92BA222C07AAF30200DBA913 = {
-			buildArgumentsString = "$(ACTION) OSX=1 STATIC=1 DEBUG=1";
-			buildPhases = (
-			);
-			buildSettings = {
-				C_INCLUDE_PATH = "/sw/include:/sw/include/SDL";
-				OTHER_LDFLAGS = "";
-				OTHER_REZFLAGS = "";
-				PATH = "/sw/bin:/sw/sbin:/bin:/sbin:/usr/bin:/usr/sbin";
-				PRODUCT_NAME = openttd;
-				SECTORDER_FLAGS = "";
-				WARNING_CFLAGS = "";
-			};
-			buildToolPath = /usr/bin/make;
-			buildWorkingDirectory = "";
-			dependencies = (
-			);
-			isa = PBXLegacyTarget;
-			name = openttd;
-			passBuildSettingsInEnvironment = 1;
-			productName = open;
-		};
-//920
-//921
-//922
-//923
-//924
-//C60
-//C61
-//C62
-//C63
-//C64
-		C6A0FF2B0290797F04C91782 = {
-			children = (
-			);
-			isa = PBXGroup;
-			name = Documentation;
-			refType = 4;
-			sourceTree = "<group>";
-		};
-	};
-	rootObject = 08FB7793FE84155DC02AAC07;
-}
--- a/projects/openttd_vs80.vcproj	Tue Mar 27 23:27:27 2007 +0000
+++ b/projects/openttd_vs80.vcproj	Sat Jun 02 19:59:29 2007 +0000
@@ -448,7 +448,7 @@
 				>
 			</File>
 			<File
-				RelativePath=".\..\src\aystar.cpp"
+				RelativePath=".\..\src\articulated_vehicles.cpp"
 				>
 			</File>
 			<File
@@ -456,6 +456,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\aystar.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\bmp.cpp"
 				>
 			</File>
@@ -744,6 +748,14 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\articulated_vehicles.h"
+				>
+			</File>
+			<File
+				RelativePath=".\..\src\autoreplace_cmd.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\airport_states.h"
 				>
 			</File>
@@ -788,6 +800,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\direction.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\music\dmusic.h"
 				>
 			</File>
@@ -832,6 +848,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\group.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\gui.h"
 				>
 			</File>
@@ -912,10 +932,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_canal.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_cargo.h"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_commons.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_config.h"
 				>
 			</File>
@@ -1068,6 +1096,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\transparency_gui.h"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\variables.h"
 				>
 			</File>
@@ -1103,6 +1135,10 @@
 				RelativePath=".\..\src\window.h"
 				>
 			</File>
+			<File
+				RelativePath=".\..\src\zoom.hpp"
+				>
+			</File>
 		</Filter>
 		<Filter
 			Name="GUI Source Code"
@@ -1148,6 +1184,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\group_gui.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\industry_gui.cpp"
 				>
 			</File>
@@ -1236,6 +1276,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\transparency_gui.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\vehicle_gui.cpp"
 				>
 			</File>
@@ -1260,6 +1304,10 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\group_cmd.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\industry_cmd.cpp"
 				>
 			</File>
@@ -1464,10 +1512,18 @@
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_canal.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_cargo.cpp"
 				>
 			</File>
 			<File
+				RelativePath=".\..\src\newgrf_commons.cpp"
+				>
+			</File>
+			<File
 				RelativePath=".\..\src\newgrf_config.cpp"
 				>
 			</File>
--- a/readme.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/readme.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 OpenTTD README
-Last updated:    2007-03-23
-Release version: 0.5.1-RC2
+Last updated:    2007-05-29
+Release version: 0.5.2
 ------------------------------------------------------------------------
 
 
@@ -75,6 +75,7 @@
   Linux                - SDL
   MacOS X (universal)  - Cocoa video and sound drivers (SDL works too, but not 100% and not as a universal binary)
   MorphOS              - SDL
+  OpenBSD              - SDL
   OS/2                 - SDL
   Windows              - Win32 GDI (faster) or SDL
 
@@ -174,6 +175,10 @@
   graphics/png is optional for screenshots in the PNG format.
   Use "gmake", but do a "./configure" before the first build.
 
+OpenBSD:
+  Use "gmake", but do a "./configure" before the first build.
+  Note that you need the port devel/sdl to compile OpenTTD.
+
 MorphOS:
   Use "make". However, for the first build one has to do a "./configure" first.
   Note that you need the MorphOS SDK, latest libnix updates (else C++ parts of
@@ -312,6 +317,7 @@
   Richard Kempton (RichK67)      - Additional airports, initial TGP implementation
   Michael Blunck                 - For revolutionizing TTD with awesome graphics
   George                         - Canal graphics
+  David Dallaston (Pikka)        - Tram tracks
   All Translators                - For their support to make OpenTTD a truly international game
   Bug Reporters                  - Thanks for all bug reports
   Chris Sawyer                   - For an amazing game!
--- a/source.list	Tue Mar 27 23:27:27 2007 +0000
+++ b/source.list	Sat Jun 02 19:59:29 2007 +0000
@@ -1,7 +1,8 @@
 # Source Files
 airport.cpp
+articulated_vehicles.cpp
+autoreplace_cmd.cpp
 aystar.cpp
-autoreplace_cmd.cpp
 bmp.cpp
 callback_table.cpp
 cargotype.cpp
@@ -97,6 +98,8 @@
 airport.h
 airport_movement.h
 airport_states.h
+articulated_vehicles.h
+autoreplace_cmd.h
 aystar.h
 bmp.h
 cargotype.h
@@ -107,6 +110,7 @@
 debug.h
 video/dedicated_v.h
 depot.h
+direction.h
 music/dmusic.h
 driver.h
 economy.h
@@ -118,6 +122,7 @@
 genworld.h
 gfx.h
 gfxinit.h
+group.h
 gui.h
 hal.h
 heightmap.h
@@ -138,7 +143,9 @@
 network/network_udp.h
 newgrf.h
 newgrf_callbacks.h
+newgrf_canal.h
 newgrf_cargo.h
+newgrf_commons.h
 newgrf_config.h
 newgrf_engine.h
 newgrf_house.h
@@ -177,6 +184,7 @@
 tile.h
 town.h
 train.h
+transparency_gui.h
 variables.h
 vehicle.h
 vehicle_gui.h
@@ -186,6 +194,7 @@
 sound/win32_s.h
 video/win32_v.h
 window.h
+zoom.hpp
 
 # GUI Source Code
 aircraft_gui.cpp
@@ -198,6 +207,7 @@
 engine_gui.cpp
 genworld_gui.cpp
 graph_gui.cpp
+group_gui.cpp
 industry_gui.cpp
 intro_gui.cpp
 main_gui.cpp
@@ -220,6 +230,7 @@
 terraform_gui.cpp
 town_gui.cpp
 train_gui.cpp
+transparency_gui.cpp
 vehicle_gui.cpp
 
 # Landscape
@@ -227,6 +238,7 @@
 clear_cmd.cpp
 disaster_cmd.cpp
 dummy_land.cpp
+group_cmd.cpp
 industry_cmd.cpp
 misc_cmd.cpp
 order_cmd.cpp
@@ -281,7 +293,9 @@
 
 # NewGRF
 newgrf.cpp
+newgrf_canal.cpp
 newgrf_cargo.cpp
+newgrf_commons.cpp
 newgrf_config.cpp
 newgrf_engine.cpp
 newgrf_house.cpp
--- a/src/ai/ai.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ai/ai.h	Sat Jun 02 19:59:29 2007 +0000
@@ -77,8 +77,8 @@
 	return true;
 }
 
-#define AI_CHANCE16(a,b)    ((uint16)     AI_Random()  <= (uint16)((65536 * a) / b))
-#define AI_CHANCE16R(a,b,r) ((uint16)(r = AI_Random()) <= (uint16)((65536 * a) / b))
+#define AI_CHANCE16(a, b)    ((uint16)     AI_Random()  <= (uint16)((65536 * a) / b))
+#define AI_CHANCE16R(a, b, r) ((uint16)(r = AI_Random()) <= (uint16)((65536 * a) / b))
 
 /**
  * The random-function that should be used by ALL AIs.
--- a/src/ai/default/default.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ai/default/default.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -5,6 +5,7 @@
 #include "../../aircraft.h"
 #include "../../bridge_map.h"
 #include "../../functions.h"
+#include "../../landscape.h"
 #include "../../map.h"
 #include "../../rail_map.h"
 #include "../../road_map.h"
@@ -66,7 +67,7 @@
 
 static TrackBits GetRailTrackStatus(TileIndex tile)
 {
-	uint32 r = GetTileTrackStatus(tile, TRANSPORT_RAIL);
+	uint32 r = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0);
 	return (TrackBits)(byte) (r | r >> 8);
 }
 
@@ -515,7 +516,7 @@
 {
 	uint i;
 	const Subsidy* s;
-	Town *from,*to;
+	Town *from, *to;
 
 	// initially error
 	fr->distance = -1;
@@ -542,6 +543,7 @@
 static void AiFindRandomIndustryRoute(FoundRoute *fr)
 {
 	Industry* i;
+	const IndustrySpec *indsp;
 	uint32 r;
 	CargoID cargo;
 
@@ -555,8 +557,9 @@
 	if (i == NULL) return;
 
 	// pick a random produced cargo
-	cargo = i->produced_cargo[0];
-	if (r & 1 && i->produced_cargo[1] != CT_INVALID) cargo = i->produced_cargo[1];
+	indsp = GetIndustrySpec(i->type);
+	cargo = indsp->produced_cargo[0];
+	if (r & 1 && indsp->produced_cargo[1] != CT_INVALID) cargo = indsp->produced_cargo[1];
 
 	fr->cargo = cargo;
 
@@ -566,12 +569,16 @@
 	if (cargo != CT_GOODS && cargo != CT_FOOD) {
 		// pick a dest, and see if it can receive
 		Industry* i2 = AiFindRandomIndustry();
-
-		if (i2 == NULL || i == i2 || (
-					i2->accepts_cargo[0] != cargo &&
-					i2->accepts_cargo[1] != cargo &&
-					i2->accepts_cargo[2] != cargo)
-				) {
+		if (i2 == NULL) {
+			return;
+		}
+
+		indsp = GetIndustrySpec(i2->type);
+
+		if (i == i2 ||
+				(indsp->accepts_cargo[0] != cargo &&
+				indsp->accepts_cargo[1] != cargo &&
+				indsp->accepts_cargo[2] != cargo)) {
 			return;
 		}
 
@@ -663,9 +670,10 @@
 		}
 	} else {
 		const Industry* i = (const Industry*)fr->from;
-
-		if (i->pct_transported[fr->cargo != i->produced_cargo[0]] > 0x99 ||
-				i->total_production[fr->cargo != i->produced_cargo[0]] == 0) {
+		const IndustrySpec *indsp = GetIndustrySpec(i->type);
+
+		if (i->pct_transported[fr->cargo != indsp->produced_cargo[0]] > 0x99 ||
+				i->total_production[fr->cargo != indsp->produced_cargo[0]] == 0) {
 			return false;
 		}
 	}
@@ -1424,7 +1432,7 @@
 		if (t != NULL) {
 			// Find a random oil rig industry
 			in = AiFindRandomIndustry();
-			if (in != NULL && in->type == IT_OIL_RIG) {
+			if (in != NULL && GetIndustrySpec(in->type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) {
 				if (DistanceManhattan(t->xy, in->xy) < 60)
 					break;
 			}
@@ -1560,7 +1568,7 @@
 				return false;
 			if (cargo != CT_MAIL)
 				return true;
-			return !!((values[cargo]>>1) & ~7);
+			return !!((values[cargo] >> 1) & ~7);
 		}
 	}
 
@@ -1573,7 +1581,7 @@
 	int32 total_cost = 0;
 	Town *t = NULL;
 	int rating = 0;
-	int i,j,k;
+	int i, j, k;
 
 	for (;;) {
 		// This will seldomly overflow for valid reasons. Mask it to be on the safe side.
@@ -1587,7 +1595,7 @@
 				ret = DoCommand(c, railtype, p->attr, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_TRAIN_DEPOT);
 			} else {
 				// Station
-				ret = DoCommand(c, (p->attr&1) | (p->attr>>4)<<8 | (p->attr>>1&7)<<16, railtype, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_RAILROAD_STATION);
+				ret = DoCommand(c, (p->attr & 1) | (p->attr >> 4) << 8 | (p->attr >> 1 & 7) << 16, railtype, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_RAILROAD_STATION);
 			}
 
 			if (CmdFailed(ret)) return CMD_ERROR;
@@ -1609,7 +1617,7 @@
 
 			// Build the rail
 			for (i = 0; i != 6; i++, j >>= 1) {
-				if (j&1) {
+				if (j & 1) {
 					k = i;
 					ret = DoCommand(c, railtype, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL);
 					if (CmdFailed(ret)) return CMD_ERROR;
@@ -1641,7 +1649,7 @@
 			total_cost += ret + _price.build_rail;
 
 			if (flag & DC_EXEC) {
-				DoCommand(c, railtype, p->attr&1, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_SINGLE_RAIL);
+				DoCommand(c, railtype, p->attr & 1, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_SINGLE_RAIL);
 			}
 
 			goto clear_town_stuff;
@@ -1783,7 +1791,7 @@
 			if (rule == -1) {
 				// cannot build, terraform after a while
 				if (p->ai.state_counter >= 600) {
-					AiDoTerraformLand(aib->use_tile, Random()&3, 3, (int8)p->ai.state_mode);
+					AiDoTerraformLand(aib->use_tile, Random() & 3, 3, (int8)p->ai.state_mode);
 				}
 				// also try the other terraform direction
 				if (++p->ai.state_counter >= 1000) {
@@ -1791,19 +1799,17 @@
 					p->ai.state_mode = -p->ai.state_mode;
 				}
 			} else if (CheckPlayerHasMoney(cost)) {
-				int32 r;
 				// player has money, build it.
 				aib->cur_building_rule = rule;
 
-				r = AiDoBuildDefaultRailTrack(
+				AiDoBuildDefaultRailTrack(
 					aib->use_tile,
 					_default_rail_track_data[rule]->data,
 					p->ai.railtype_to_use,
 					DC_EXEC | DC_NO_TOWN_RATING
 				);
-				assert(!CmdFailed(r));
 			}
-		} while (++aib,--j);
+		} while (++aib, --j);
 	}
 
 	// check if we're done with all of them
@@ -1811,7 +1817,7 @@
 	j = p->ai.num_build_rec;
 	do {
 		if (aib->cur_building_rule == 255) return;
-	} while (++aib,--j);
+	} while (++aib, --j);
 
 	// yep, all are done. switch state to the rail building state.
 	p->ai.state = AIS_BUILD_RAIL;
@@ -1856,7 +1862,7 @@
 	arpfd.tile2 = p->ai.cur_tile_a;
 	arpfd.flag = false;
 	arpfd.count = 0;
-	FollowTrack(p->ai.cur_tile_a + TileOffsByDiagDir(p->ai.cur_dir_a), 0x2000 | TRANSPORT_RAIL, (DiagDirection)(p->ai.cur_dir_a^2),
+	FollowTrack(p->ai.cur_tile_a + TileOffsByDiagDir(p->ai.cur_dir_a), 0x2000 | TRANSPORT_RAIL, 0, (DiagDirection)(p->ai.cur_dir_a ^ 2),
 		(TPFEnumProc*)AiEnumFollowTrack, NULL, &arpfd);
 	return arpfd.count > 8;
 }
@@ -2000,8 +2006,8 @@
 	if (GetTileSlope(tile, &z) == _dir_table_2[p[0] & 3] && z != 0) {
 		int32 cost = DoCommand(tile, arf->player->ai.railtype_to_use, 0, DC_AUTO, CMD_BUILD_TUNNEL);
 
-		if (!CmdFailed(cost) && cost <= (arf->player->player_money>>4)) {
-			AiBuildRailRecursive(arf, _build_tunnel_endtile, p[0]&3);
+		if (!CmdFailed(cost) && cost <= (arf->player->player_money >> 4)) {
+			AiBuildRailRecursive(arf, _build_tunnel_endtile, p[0] & 3);
 			if (arf->depth == 1) AiCheckRailPathBetter(arf, p);
 		}
 	}
@@ -2016,7 +2022,7 @@
 
 	// Reached destination?
 	if (tile == arf->final_tile) {
-		if (arf->final_dir != (dir^2)) {
+		if (arf->final_dir != (dir ^ 2)) {
 			if (arf->recursive_mode != 2) arf->recursive_mode = 1;
 		} else if (arf->recursive_mode != 2) {
 			arf->recursive_mode = 2;
@@ -2062,17 +2068,17 @@
 			if (arf->depth == 1) AiCheckRailPathBetter(arf, p);
 
 			p += 2;
-		} while (!(p[0]&0x80));
+		} while (!(p[0] & 0x80));
 	}
 
 	AiCheckBuildRailBridgeHere(arf, tile, p);
-	AiCheckBuildRailTunnelHere(arf, tile, p+1);
+	AiCheckBuildRailTunnelHere(arf, tile, p + 1);
 
 	arf->depth--;
 }
 
 
-static const byte _dir_table_3[]= {0x25, 0x2A, 0x19, 0x16};
+static const byte _dir_table_3[] = {0x25, 0x2A, 0x19, 0x16};
 
 static void AiBuildRailConstruct(Player *p)
 {
@@ -2323,23 +2329,23 @@
 	}
 
 	// Find first edge to build from.
-	tile = AiGetEdgeOfDefaultRailBlock(aib->cur_building_rule, aib->use_tile, cmd&3, &dir);
+	tile = AiGetEdgeOfDefaultRailBlock(aib->cur_building_rule, aib->use_tile, cmd & 3, &dir);
 	p->ai.start_tile_a = tile;
 	p->ai.cur_tile_a = tile;
 	p->ai.start_dir_a = dir;
 	p->ai.cur_dir_a = dir;
-	DoCommand(TILE_MASK(tile + TileOffsByDiagDir(dir)), 0, (dir&1)?1:0, DC_EXEC, CMD_REMOVE_SINGLE_RAIL);
+	DoCommand(TILE_MASK(tile + TileOffsByDiagDir(dir)), 0, (dir & 1) ? 1 : 0, DC_EXEC, CMD_REMOVE_SINGLE_RAIL);
 
 	assert(TILE_MASK(tile) != 0xFF00);
 
 	// Find second edge to build to
-	aib = (&p->ai.src) + ((cmd >> 4)&0xF);
-	tile = AiGetEdgeOfDefaultRailBlock(aib->cur_building_rule, aib->use_tile, (cmd>>2)&3, &dir);
+	aib = (&p->ai.src) + ((cmd >> 4) & 0xF);
+	tile = AiGetEdgeOfDefaultRailBlock(aib->cur_building_rule, aib->use_tile, (cmd >> 2) & 3, &dir);
 	p->ai.start_tile_b = tile;
 	p->ai.cur_tile_b = tile;
 	p->ai.start_dir_b = dir;
 	p->ai.cur_dir_b = dir;
-	DoCommand(TILE_MASK(tile + TileOffsByDiagDir(dir)), 0, (dir&1)?1:0, DC_EXEC, CMD_REMOVE_SINGLE_RAIL);
+	DoCommand(TILE_MASK(tile + TileOffsByDiagDir(dir)), 0, (dir & 1) ? 1 : 0, DC_EXEC, CMD_REMOVE_SINGLE_RAIL);
 
 	assert(TILE_MASK(tile) != 0xFF00);
 
@@ -2502,7 +2508,7 @@
 		for (b = _default_rail_track_data[aib->cur_building_rule]->data; b->mode != 4; b++) {
 			DoCommand(TILE_ADD(aib->use_tile, ToTileIndexDiff(b->tileoffs)), 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
 		}
-	} while (++aib,--num);
+	} while (++aib, --num);
 
 	p->ai.state = AIS_0;
 }
@@ -2573,11 +2579,11 @@
 		if (p->mode == 2) {
 			if (IsTileType(c, MP_STREET) &&
 					GetRoadTileType(c) == ROAD_TILE_NORMAL &&
-					(GetRoadBits(c) & p->attr) != 0) {
+					(GetRoadBits(c, ROADTYPE_ROAD) & p->attr) != 0) {
 				roadflag |= 2;
 
 				// all bits are already built?
-				if ((GetRoadBits(c) & p->attr) == p->attr) continue;
+				if ((GetRoadBits(c, ROADTYPE_ROAD) & p->attr) == p->attr) continue;
 			}
 
 			ret = DoCommand(c, p->attr, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD);
@@ -2594,10 +2600,10 @@
 		} else if (p->mode == 1) {
 			if (_want_road_truck_station) {
 				// Truck station
-				ret = DoCommand(c, p->attr, RoadStop::TRUCK, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
+				ret = DoCommand(c, p->attr, ROADTYPES_ROAD << 2 | RoadStop::TRUCK, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
 			} else {
 				// Bus station
-				ret = DoCommand(c, p->attr, RoadStop::BUS, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
+				ret = DoCommand(c, p->attr, ROADTYPES_ROAD << 2 | RoadStop::BUS, flag | DC_AUTO | DC_NO_WATER | DC_AI_BUILDING, CMD_BUILD_ROAD_STOP);
 			}
 clear_town_stuff:;
 
@@ -2681,14 +2687,14 @@
 			if (rule == -1) {
 				// cannot build, terraform after a while
 				if (p->ai.state_counter >= 600) {
-					AiDoTerraformLand(aib->use_tile, Random()&3, 3, (int8)p->ai.state_mode);
+					AiDoTerraformLand(aib->use_tile, Random() & 3, 3, (int8)p->ai.state_mode);
 				}
 				// also try the other terraform direction
 				if (++p->ai.state_counter >= 1000) {
 					p->ai.state_counter = 0;
 					p->ai.state_mode = -p->ai.state_mode;
 				}
-			} else if (CheckPlayerHasMoney(cost) && AiCheckBlockDistances(p,aib->use_tile)) {
+			} else if (CheckPlayerHasMoney(cost) && AiCheckBlockDistances(p, aib->use_tile)) {
 				int32 r;
 
 				// player has money, build it.
@@ -2701,7 +2707,7 @@
 				);
 				assert(!CmdFailed(r));
 			}
-		} while (++aib,--j);
+		} while (++aib, --j);
 	}
 
 	// check if we're done with all of them
@@ -2709,7 +2715,7 @@
 	j = p->ai.num_build_rec;
 	do {
 		if (aib->cur_building_rule == 255) return;
-	} while (++aib,--j);
+	} while (++aib, --j);
 
 	// yep, all are done. switch state to the rail building state.
 	p->ai.state = AIS_BUILD_ROAD;
@@ -2818,13 +2824,13 @@
 	tile = TILE_MASK(p->ai.cur_tile_a + TileOffsByDiagDir(dir));
 
 	if (IsRoadStopTile(tile) || IsTileDepotType(tile, TRANSPORT_ROAD)) return false;
-	bits = GetTileTrackStatus(tile, TRANSPORT_ROAD) & _ai_road_table_and[dir];
+	bits = GetTileTrackStatus(tile, TRANSPORT_ROAD, ROADTYPES_ROAD) & _ai_road_table_and[dir];
 	if (bits == 0) return false;
 
 	are.best_dist = (uint)-1;
 
 	for_each_bit(i, bits) {
-		FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
+		FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, ROADTYPES_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
 	}
 
 	if (DistanceManhattan(tile, are.dest) <= are.best_dist) return false;
@@ -2900,8 +2906,8 @@
 	if (GetTileSlope(tile, &z) == _dir_table_2[p[0] & 3] && z != 0) {
 		int32 cost = DoCommand(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL);
 
-		if (!CmdFailed(cost) && cost <= (arf->player->player_money>>4)) {
-			AiBuildRoadRecursive(arf, _build_tunnel_endtile, p[0]&3);
+		if (!CmdFailed(cost) && cost <= (arf->player->player_money >> 4)) {
+			AiBuildRoadRecursive(arf, _build_tunnel_endtile, p[0] & 3);
 			if (arf->depth == 1)  AiCheckRoadPathBetter(arf, p);
 		}
 	}
@@ -2917,7 +2923,7 @@
 
 	// Reached destination?
 	if (tile == arf->final_tile) {
-		if ((arf->final_dir^2) == dir) {
+		if ((arf->final_dir ^ 2) == dir) {
 			arf->recursive_mode = 2;
 			arf->cur_best_depth = arf->depth;
 		}
@@ -2961,7 +2967,7 @@
 	}
 
 	AiCheckBuildRoadBridgeHere(arf, tile, p);
-	AiCheckBuildRoadTunnelHere(arf, tile, p+1);
+	AiCheckBuildRoadTunnelHere(arf, tile, p + 1);
 
 	arf->depth--;
 }
@@ -3019,7 +3025,7 @@
 
 	tile = TILE_MASK(p->ai.cur_tile_a + TileOffsByDiagDir(p->ai.cur_dir_a));
 
-	if (arf.best_ptr[0]&0x80) {
+	if (arf.best_ptr[0] & 0x80) {
 		int i;
 		int32 bridge_len;
 		p->ai.cur_tile_a = arf.bridge_end_tile;
@@ -3041,7 +3047,7 @@
 		DoCommand(tile, p->ai.cur_tile_a, i + (0x80 << 8), DC_AUTO | DC_EXEC, CMD_BUILD_BRIDGE);
 
 		p->ai.state_counter = 0;
-	} else if (arf.best_ptr[0]&0x40) {
+	} else if (arf.best_ptr[0] & 0x40) {
 		// tunnel
 		DoCommand(tile, 0x200, 0, DC_AUTO | DC_EXEC, CMD_BUILD_TUNNEL);
 		p->ai.cur_tile_a = _build_tunnel_endtile;
@@ -3147,7 +3153,7 @@
 	p->ai.cur_dir_a = dir;
 
 	// Find second edge to build to
-	aib = (&p->ai.src) + (cmd&0xF);
+	aib = (&p->ai.src) + (cmd & 0xF);
 	tile = AiGetRoadBlockEdge(aib->cur_building_rule, aib->use_tile, &dir);
 	p->ai.start_tile_b = tile;
 	p->ai.cur_tile_b = tile;
@@ -3238,7 +3244,7 @@
 			if (b->mode > 1) continue;
 			DoCommand(TILE_ADD(aib->use_tile, ToTileIndexDiff(b->tileoffs)), 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
 		}
-	} while (++aib,--num);
+	} while (++aib, --num);
 
 	p->ai.state = AIS_0;
 }
@@ -3325,7 +3331,7 @@
 
 	for (; p->mode == 0; p++) {
 		if (!HASBIT(avail_airports, p->attr)) return CMD_ERROR;
-		ret = DoCommand(TILE_MASK(tile + ToTileIndexDiff(p->tileoffs)), p->attr,0,flag | DC_AUTO | DC_NO_WATER,CMD_BUILD_AIRPORT);
+		ret = DoCommand(TILE_MASK(tile + ToTileIndexDiff(p->tileoffs)), p->attr, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_AIRPORT);
 		if (CmdFailed(ret)) return CMD_ERROR;
 		total_cost += ret;
 	}
@@ -3407,14 +3413,14 @@
 			if (rule == -1) {
 				// cannot build, terraform after a while
 				if (p->ai.state_counter >= 600) {
-					AiDoTerraformLand(aib->use_tile, Random()&3, 3, (int8)p->ai.state_mode);
+					AiDoTerraformLand(aib->use_tile, Random() & 3, 3, (int8)p->ai.state_mode);
 				}
 				// also try the other terraform direction
 				if (++p->ai.state_counter >= 1000) {
 					p->ai.state_counter = 0;
 					p->ai.state_mode = -p->ai.state_mode;
 				}
-			} else if (CheckPlayerHasMoney(cost) && AiCheckBlockDistances(p,aib->use_tile)) {
+			} else if (CheckPlayerHasMoney(cost) && AiCheckBlockDistances(p, aib->use_tile)) {
 				// player has money, build it.
 				int32 r;
 
@@ -3427,7 +3433,7 @@
 				);
 				assert(!CmdFailed(r));
 			}
-		} while (++aib,--j);
+		} while (++aib, --j);
 	} while (--i);
 
 	// check if we're done with all of them
@@ -3435,7 +3441,7 @@
 	j = p->ai.num_build_rec;
 	do {
 		if (aib->cur_building_rule == 255) return;
-	} while (++aib,--j);
+	} while (++aib, --j);
 
 	// yep, all are done. switch state.
 	p->ai.state = AIS_BUILD_AIRCRAFT_VEHICLES;
@@ -3649,7 +3655,7 @@
 				}
 			}
 		} else {
-			static const byte _depot_bits[] = {0x19,0x16,0x25,0x2A};
+			static const byte _depot_bits[] = {0x19, 0x16, 0x25, 0x2A};
 
 			DiagDirection dir = GetRailDepotDirection(tile);
 
@@ -3794,13 +3800,13 @@
 		// Ask the guy with the highest performance hist.
 		FOR_ALL_PLAYERS(pp) {
 			if (pp->is_active &&
-					!(asked&1) &&
+					!(asked & 1) &&
 					pp->bankrupt_asked == 0 &&
 					best_val < pp->old_economy[1].performance_history) {
 				best_val = pp->old_economy[1].performance_history;
 				best_pl = pp;
 			}
-			asked>>=1;
+			asked >>= 1;
 		}
 
 		// Asked all players?
@@ -3822,7 +3828,7 @@
 		if (best_pl->player_money >> 1 >= p->bankrupt_value) {
 			// Computer wants to buy it.
 			PlayerID old_p = _current_player;
-			_current_player = p->index;
+			_current_player = best_pl->index;
 			DoCommand(0, old_p, 0, DC_EXEC, CMD_BUY_COMPANY);
 			_current_player = old_p;
 		}
@@ -3842,7 +3848,7 @@
 		// Increase loan
 		if (p->current_loan < _economy.max_loan &&
 				p->num_valid_stat_ent >= 2 &&
-				-(p->old_economy[0].expenses+p->old_economy[1].expenses) < base * 60) {
+				-(p->old_economy[0].expenses + p->old_economy[1].expenses) < base * 60) {
 			DoCommand(0, 0, 0, DC_EXEC, CMD_INCREASE_LOAN);
 		}
 	}
@@ -3871,7 +3877,7 @@
 	//  to the patch-setting
 	// Also, it takes into account the setting if the service-interval is in days
 	//  or in %
-	_ai_service_interval = _patches.servint_ispercent?80:180;
+	_ai_service_interval = _patches.servint_ispercent ? 80 : 180;
 
 	if (IsHumanPlayer(_current_player)) return;
 
@@ -3882,7 +3888,7 @@
 	{
 		static byte old_state = 99;
 		static bool hasdots = false;
-		char *_ai_state_names[]={
+		char *_ai_state_names[] = {
 			"AiCase0",
 			"AiCase1",
 			"AiStateVehLoop",
--- a/src/ai/trolly/build.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ai/trolly/build.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -42,9 +42,9 @@
 		return AI_DoCommand(tile, direction + (numtracks << 8) + (length << 16), 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_RAILROAD_STATION);
 
 	if (type == AI_BUS)
-		return AI_DoCommand(tile, direction, RoadStop::BUS, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
+		return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | RoadStop::BUS, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
 
-	return AI_DoCommand(tile, direction, RoadStop::TRUCK, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
+	return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | RoadStop::TRUCK, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
 }
 
 
@@ -75,7 +75,7 @@
 	if (p->ainew.tbt == AI_TRAIN) {
 		return AI_DoCommand(tile_a, tile_b, (0x00 << 8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE);
 	} else {
-		return AI_DoCommand(tile_a, tile_b, (0x80 << 8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE);
+		return AI_DoCommand(tile_a, tile_b, ((0x80 | ROADTYPES_ROAD) << 8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE);
 	}
 }
 
@@ -123,7 +123,7 @@
 		}
 		// Bridge code
 		if ((AI_PATHFINDER_FLAG_BRIDGE & route_extra[part]) != 0) {
-			cost += AiNew_Build_Bridge(p, route[part], route[part-1], flag);
+			cost += AiNew_Build_Bridge(p, route[part], route[part - 1], flag);
 			PathFinderInfo->position++;
 			// TODO: problems!
 			if (CmdFailed(cost)) {
@@ -162,7 +162,7 @@
 	} else {
 		// Tunnel code
 		if ((AI_PATHFINDER_FLAG_TUNNEL & route_extra[part]) != 0) {
-			cost += AI_DoCommand(route[part], 0x200, 0, flag, CMD_BUILD_TUNNEL);
+			cost += AI_DoCommand(route[part], 0x200 | ROADTYPES_ROAD, 0, flag, CMD_BUILD_TUNNEL);
 			PathFinderInfo->position++;
 			// TODO: problems!
 			if (CmdFailed(cost)) {
@@ -173,7 +173,7 @@
 		}
 		// Bridge code
 		if ((AI_PATHFINDER_FLAG_BRIDGE & route_extra[part]) != 0) {
-			cost += AiNew_Build_Bridge(p, route[part], route[part+1], flag);
+			cost += AiNew_Build_Bridge(p, route[part], route[part + 1], flag);
 			PathFinderInfo->position++;
 			// TODO: problems!
 			if (CmdFailed(cost)) {
--- a/src/ai/trolly/pathfinder.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ai/trolly/pathfinder.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -237,17 +237,10 @@
 					if (IsTunnel(atile)) {
 						if (GetTunnelDirection(atile) != i) continue;
 					} else {
-						if ((_m[atile].m5 & 1) != DiagDirToAxis(i)) continue;
+						if (GetBridgeRampDirection(atile) != i) continue;
 					}
 				}
 			}
-			// But also if we are on a bridge, we can only move a certain direction
-			if (!PathFinderInfo->rail_or_road && IsRoad(ctile)) {
-				if (IsTileType(ctile, MP_TUNNELBRIDGE)) {
-					// An existing bridge/tunnel... let's test the direction ;)
-					if ((_m[ctile].m5 & 1) != (i & 1)) continue;
-				}
-			}
 
 			if ((AI_PATHFINDER_FLAG_BRIDGE & current->path.node.user_data[0]) != 0 ||
 					(AI_PATHFINDER_FLAG_TUNNEL & current->path.node.user_data[0]) != 0) {
@@ -291,9 +284,9 @@
 							dir = 0;
 						} else {
 							// It already has road.. check if we miss any bits!
-							if ((_m[ctile].m5 & dir) != dir) {
+							if ((GetAnyRoadBits(ctile, ROADTYPE_ROAD) & dir) != dir) {
 								// We do miss some pieces :(
-								dir &= ~_m[ctile].m5;
+								dir &= ~GetAnyRoadBits(ctile, ROADTYPE_ROAD);
 							} else {
 								dir = 0;
 							}
--- a/src/ai/trolly/trolly.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ai/trolly/trolly.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -220,9 +220,9 @@
 
 		// Check if the rating in a city is high enough
 		//  If not, take a chance if we want to continue
-		if (t->ratings[_current_player] < 0 && AI_CHANCE16(1,4)) return false;
+		if (t->ratings[_current_player] < 0 && AI_CHANCE16(1, 4)) return false;
 
-		if (t->max_pass - t->act_pass < AI_CHECKCITY_NEEDED_CARGO && !AI_CHANCE16(1,AI_CHECKCITY_CITY_CHANCE)) return false;
+		if (t->max_pass - t->act_pass < AI_CHECKCITY_NEEDED_CARGO && !AI_CHANCE16(1, AI_CHECKCITY_CITY_CHANCE)) return false;
 
 		// Check if we have build a station in this town the last 6 months
 		//  else we don't do it. This is done, because stat updates can be slow
@@ -271,15 +271,16 @@
 	}
 	if (type == AI_INDUSTRY) {
 		const Industry* i = GetIndustry(ic);
+		const IndustrySpec *indsp = GetIndustrySpec(i->type);
 		const Station* st;
 		int count = 0;
 		int j = 0;
 
-		if (i->town != NULL && i->town->ratings[_current_player] < 0 && AI_CHANCE16(1,4)) return false;
+		if (i->town != NULL && i->town->ratings[_current_player] < 0 && AI_CHANCE16(1, 4)) return false;
 
 		// No limits on delevering stations!
 		//  Or for industry that does not give anything yet
-		if (i->produced_cargo[0] == CT_INVALID || i->total_production[0] == 0) return true;
+		if (indsp->produced_cargo[0] == CT_INVALID || i->total_production[0] == 0) return true;
 
 		if (i->total_production[0] - i->total_transported[0] < AI_CHECKCITY_NEEDED_CARGO) return false;
 
@@ -302,13 +303,13 @@
 				//  we want to know if this station gets the same good. If so,
 				//  we want to know its rating. If it is too high, we are not going
 				//  to build there
-				if (i->produced_cargo[0] == CT_INVALID) continue;
+				if (indsp->produced_cargo[0] == CT_INVALID) continue;
 				// It does not take this cargo
-				if (!st->goods[i->produced_cargo[0]].last_speed) continue;
+				if (!st->goods[indsp->produced_cargo[0]].last_speed) continue;
 				// Is it around our industry
 				if (DistanceManhattan(st->xy, i->xy) > 5) continue;
 				// It does take this cargo.. what is his rating?
-				if (st->goods[i->produced_cargo[0]].rating < AI_CHECKCITY_CARGO_RATING) continue;
+				if (st->goods[indsp->produced_cargo[0]].rating < AI_CHECKCITY_CARGO_RATING) continue;
 				j++;
 				// The rating is high.. a little chance that we still continue
 				//  But if there are 2 stations of this size, we never go on...
@@ -458,17 +459,19 @@
 			}
 		} else if (p->ainew.tbt == AI_TRUCK) {
 			const Industry* ind_from = GetIndustry(p->ainew.from_ic);
+			const IndustrySpec *indsp_from = GetIndustrySpec(ind_from->type);
 			const Industry* ind_temp = GetIndustry(p->ainew.temp);
+			const IndustrySpec *indsp_temp = GetIndustrySpec(ind_temp->type);
 			bool found = false;
 			int max_cargo = 0;
 			uint i;
 
 			// TODO: in max_cargo, also check other cargo (beside [0])
 			// First we check if the from_ic produces cargo that this ic accepts
-			if (ind_from->produced_cargo[0] != CT_INVALID && ind_from->total_production[0] != 0) {
-				for (i = 0; i < lengthof(ind_temp->accepts_cargo); i++) {
-					if (ind_temp->accepts_cargo[i] == CT_INVALID) break;
-					if (ind_from->produced_cargo[0] == ind_temp->accepts_cargo[i]) {
+			if (indsp_from->produced_cargo[0] != CT_INVALID && ind_from->total_production[0] != 0) {
+				for (i = 0; i < lengthof(indsp_temp->accepts_cargo); i++) {
+					if (indsp_temp->accepts_cargo[i] == CT_INVALID) break;
+					if (indsp_from->produced_cargo[0] == indsp_temp->accepts_cargo[i]) {
 						// Found a compatible industry
 						max_cargo = ind_from->total_production[0] - ind_from->total_transported[0];
 						found = true;
@@ -478,11 +481,11 @@
 					}
 				}
 			}
-			if (!found && ind_temp->produced_cargo[0] != CT_INVALID && ind_temp->total_production[0] != 0) {
+			if (!found && indsp_temp->produced_cargo[0] != CT_INVALID && ind_temp->total_production[0] != 0) {
 				// If not check if the current ic produces cargo that the from_ic accepts
-				for (i = 0; i < lengthof(ind_from->accepts_cargo); i++) {
-					if (ind_from->accepts_cargo[i] == CT_INVALID) break;
-					if (ind_temp->produced_cargo[0] == ind_from->accepts_cargo[i]) {
+				for (i = 0; i < lengthof(indsp_from->accepts_cargo); i++) {
+					if (indsp_from->accepts_cargo[i] == CT_INVALID) break;
+					if (indsp_from->produced_cargo[0] == indsp_from->accepts_cargo[i]) {
 						// Found a compatbiel industry
 						found = true;
 						max_cargo = ind_temp->total_production[0] - ind_temp->total_transported[0];
@@ -501,9 +504,9 @@
 						distance <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
 					p->ainew.to_ic = p->ainew.temp;
 					if (p->ainew.from_deliver) {
-						p->ainew.cargo = ind_from->produced_cargo[0];
+						p->ainew.cargo = indsp_from->produced_cargo[0];
 					} else {
-						p->ainew.cargo = ind_temp->produced_cargo[0];
+						p->ainew.cargo = indsp_temp->produced_cargo[0];
 					}
 					p->ainew.state = AI_STATE_FIND_STATION;
 
@@ -642,8 +645,8 @@
 		int r;
 		uint best;
 		uint accepts[NUM_CARGO];
-		TileIndex found_spot[AI_FINDSTATION_TILE_RANGE*AI_FINDSTATION_TILE_RANGE*4];
-		uint found_best[AI_FINDSTATION_TILE_RANGE*AI_FINDSTATION_TILE_RANGE*4];
+		TileIndex found_spot[AI_FINDSTATION_TILE_RANGE*AI_FINDSTATION_TILE_RANGE * 4];
+		uint found_best[AI_FINDSTATION_TILE_RANGE*AI_FINDSTATION_TILE_RANGE * 4];
 		// To find a good spot we scan a range from the center, a get the point
 		//  where we get the most cargo and where it is buildable.
 		// TODO: also check for station of myself and make sure we are not
@@ -961,13 +964,13 @@
 
 	// Now we can build the route, check the direction of the stations!
 	if (p->ainew.from_direction == AI_PATHFINDER_NO_DIRECTION) {
-		p->ainew.from_direction = AiNew_GetDirection(p->ainew.path_info.route[p->ainew.path_info.route_length-1], p->ainew.path_info.route[p->ainew.path_info.route_length-2]);
+		p->ainew.from_direction = AiNew_GetDirection(p->ainew.path_info.route[p->ainew.path_info.route_length - 1], p->ainew.path_info.route[p->ainew.path_info.route_length - 2]);
 	}
 	if (p->ainew.to_direction == AI_PATHFINDER_NO_DIRECTION) {
 		p->ainew.to_direction = AiNew_GetDirection(p->ainew.path_info.route[0], p->ainew.path_info.route[1]);
 	}
 	if (p->ainew.from_tile == AI_STATION_RANGE)
-		p->ainew.from_tile = p->ainew.path_info.route[p->ainew.path_info.route_length-1];
+		p->ainew.from_tile = p->ainew.path_info.route[p->ainew.path_info.route_length - 1];
 	if (p->ainew.to_tile == AI_STATION_RANGE)
 		p->ainew.to_tile = p->ainew.path_info.route[0];
 
--- a/src/aircraft.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/aircraft.h	Sat Jun 02 19:59:29 2007 +0000
@@ -8,11 +8,12 @@
 #include "station_map.h"
 #include "vehicle.h"
 
+/** An aircraft can be one ot those types */
 enum AircraftSubType {
-	AIR_HELICOPTER = 0,
-	AIR_AIRCRAFT   = 2,
-	AIR_SHADOW     = 4,
-	AIR_ROTOR      = 6
+	AIR_HELICOPTER = 0, ///< an helicopter
+	AIR_AIRCRAFT   = 2, ///< an airplane
+	AIR_SHADOW     = 4, ///< shadow of the aircraft
+	AIR_ROTOR      = 6  ///< rotor of an helicopter
 };
 
 
@@ -30,13 +31,20 @@
 	return v->subtype <= AIR_AIRCRAFT;
 }
 
-
+/** Check if this aircraft is in a hangar
+ * @param v vehicle to check
+ * @return true if in hangar
+ */
 static inline bool IsAircraftInHangar(const Vehicle* v)
 {
 	assert(v->type == VEH_AIRCRAFT);
 	return v->vehstatus & VS_HIDDEN && IsHangarTile(v->tile);
 }
 
+/** Check if this aircraft is in a hangar and stopped
+ * @param v vehicle to check
+ * @return true if in hangar and stopped
+ */
 static inline bool IsAircraftInHangarStopped(const Vehicle* v)
 {
 	return IsAircraftInHangar(v) && v->vehstatus & VS_STOPPED;
@@ -56,13 +64,78 @@
 	return (apc->flags & (avi->subtype & AIR_CTOL ? AirportFTAClass::AIRPLANES : AirportFTAClass::HELICOPTERS)) != 0;
 }
 
-uint16 AircraftDefaultCargoCapacity(CargoID cid, const AircraftVehicleInfo*);
+/**
+ * Calculates cargo capacity based on an aircraft's passenger
+ * and mail capacities.
+ * @param cid Which cargo type to calculate a capacity for.
+ * @param avi Which engine to find a cargo capacity for.
+ * @return New cargo capacity value.
+ */
+uint16 AircraftDefaultCargoCapacity(CargoID cid, const AircraftVehicleInfo *avi);
 
+/**
+ * This is the Callback method after the construction attempt of an aircraft
+ * @param success indicates completion (or not) of the operation
+ * @param tile of depot where aircraft is built
+ * @param p1 unused
+ * @param p2 unused
+ */
 void CcBuildAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2);
+
+/**
+ * This is the Callback method after the cloning attempt of an aircraft
+ * @param success indicates completion (or not) of the operation
+ * @param tile unused
+ * @param p1 unused
+ * @param p2 unused
+ */
 void CcCloneAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2);
+
+/** Handle Aircraft specific tasks when a an Aircraft enters a hangar
+ * @param *v Vehicle that enters the hangar
+ */
 void HandleAircraftEnterHangar(Vehicle *v);
+
+/** Get the size of the sprite of an aircraft sprite heading west (used for lists)
+ * @param engine The engine to get the sprite from
+ * @param width The width of the sprite
+ * @param height The height of the sprite
+ */
 void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height);
 
+/**
+ * Updates the status of the Aircraft heading or in the station
+ * @param st Station been updated
+ */
 void UpdateAirplanesOnNewStation(const Station *st);
 
+/** Update cached values of an aircraft.
+ * Currently caches callback 36 max speed.
+ * @param v Vehicle
+ */
+void UpdateAircraftCache(Vehicle *v);
+
+/**
+ * This class 'wraps' Vehicle; you do not actually instantiate this class.
+ * You create a Vehicle using AllocateVehicle, so it is added to the pool
+ * and you reinitialize that to a Train using:
+ *   v = new (v) Aircraft();
+ *
+ * As side-effect the vehicle type is set correctly.
+ */
+struct Aircraft : public Vehicle {
+	/** Initializes the Vehicle to an aircraft */
+	Aircraft() { this->type = VEH_AIRCRAFT; }
+
+	/** We want to 'destruct' the right class. */
+	virtual ~Aircraft() {}
+
+	const char *GetTypeString() const { return "aircraft"; }
+	void MarkDirty();
+	void UpdateDeltaXY(Direction direction);
+	ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_AIRCRAFT_INC : EXPENSES_AIRCRAFT_RUN; }
+	WindowClass GetVehicleListWindowClass() const { return WC_AIRCRAFT_LIST; }
+	bool IsPrimaryVehicle() const { return IsNormalAircraft(this); }
+};
+
 #endif /* AIRCRAFT_H */
--- a/src/aircraft_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/aircraft_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -8,6 +8,7 @@
 #include "aircraft.h"
 #include "debug.h"
 #include "functions.h"
+#include "landscape.h"
 #include "station_map.h"
 #include "table/strings.h"
 #include "map.h"
@@ -33,6 +34,34 @@
 #include "cargotype.h"
 #include "airport_states.h"
 
+void Aircraft::UpdateDeltaXY(Direction direction)
+{
+	uint32 x;
+#define MKIT(a, b, c, d) ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | ((d & 0xFF) << 0)
+	switch (this->subtype) {
+		default: NOT_REACHED();
+		case AIR_AIRCRAFT:
+		case AIR_HELICOPTER:
+			switch (this->u.air.state) {
+				case ENDTAKEOFF:
+				case LANDING:
+				case HELILANDING:
+				case FLYING:     x = MKIT(24, 24, -1, -1); break;
+				default:         x = MKIT( 2,  2, -1, -1); break;
+			}
+			this->z_height = 5;
+			break;
+		case AIR_SHADOW:     this->z_height = 1; x = MKIT(2,  2,  0,  0); break;
+		case AIR_ROTOR:      this->z_height = 1; x = MKIT(2,  2, -1, -1); break;
+	}
+#undef MKIT
+
+	this->x_offs        = GB(x,  0, 8);
+	this->y_offs        = GB(x,  8, 8);
+	this->sprite_width  = GB(x, 16, 8);
+	this->sprite_height = GB(x, 24, 8);
+}
+
 static bool AirportMove(Vehicle *v, 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);
@@ -170,8 +199,8 @@
 
 /** Get the size of the sprite of an aircraft sprite heading west (used for lists)
  * @param engine The engine to get the sprite from
- * @param &width The width of the sprite
- * @param &height The height of the sprite
+ * @param width The width of the sprite
+ * @param height The height of the sprite
  */
 void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height)
 {
@@ -193,9 +222,9 @@
 	height = spr->height;
 }
 
-static int32 EstimateAircraftCost(const AircraftVehicleInfo *avi)
+static int32 EstimateAircraftCost(EngineID engine, const AircraftVehicleInfo *avi)
 {
-	return avi->base_cost * (_price.aircraft_base >> 3) >> 5;
+	return GetEngineProperty(engine, 0x0B, avi->base_cost) * (_price.aircraft_base >> 3) >> 5;
 }
 
 
@@ -203,7 +232,7 @@
  * Calculates cargo capacity based on an aircraft's passenger
  * and mail capacities.
  * @param cid Which cargo type to calculate a capacity for.
- * @param engine Which engine to find a cargo capacity for.
+ * @param avi Which engine to find a cargo capacity for.
  * @return New cargo capacity value.
  */
 uint16 AircraftDefaultCargoCapacity(CargoID cid, const AircraftVehicleInfo *avi)
@@ -233,10 +262,10 @@
  */
 int32 CmdBuildAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	if (!IsEngineBuildable(p1, VEH_AIRCRAFT, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
+	if (!IsEngineBuildable(p1, VEH_AIRCRAFT, _current_player)) return_cmd_error(STR_AIRCRAFT_NOT_AVAILABLE);
 
 	const AircraftVehicleInfo *avi = AircraftVehInfo(p1);
-	int32 value = EstimateAircraftCost(avi);
+	int32 value = EstimateAircraftCost(p1, avi);
 
 	/* to just query the cost, it is not neccessary to have a valid tile (automation/AI) */
 	if (flags & DC_QUERY_COST) return value;
@@ -264,7 +293,8 @@
 		Vehicle *u = vl[1]; // shadow
 
 		v->unitnumber = unit_num;
-		v->type = u->type = VEH_AIRCRAFT;
+		v = new (v) Aircraft();
+		u = new (u) Aircraft();
 		v->direction = DIR_SE;
 
 		v->owner = u->owner = _current_player;
@@ -281,15 +311,8 @@
 		u->z_pos = GetSlopeZ(x, y);
 		v->z_pos = u->z_pos + 1;
 
-		v->x_offs = v->y_offs = -1;
 //		u->delta_x = u->delta_y = 0;
 
-		v->sprite_width = v->sprite_height = 2;
-		v->z_height = 5;
-
-		u->sprite_width = u->sprite_height = 2;
-		u->z_height = 1;
-
 		v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
 		u->vehstatus = VS_HIDDEN | VS_UNCLICKABLE | VS_SHADOW;
 
@@ -317,9 +340,11 @@
 		v->engine_type = p1;
 
 		v->subtype = (avi->subtype & AIR_CTOL ? AIR_AIRCRAFT : AIR_HELICOPTER);
+		v->UpdateDeltaXY(INVALID_DIR);
 		v->value = value;
 
 		u->subtype = AIR_SHADOW;
+		u->UpdateDeltaXY(INVALID_DIR);
 
 		/* Danger, Will Robinson!
 		 * If the aircraft is refittable, but cannot be refitted to
@@ -388,6 +413,8 @@
 		v->vehicle_flags = 0;
 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
+		UpdateAircraftCache(v);
+
 		VehiclePositionChanged(v);
 		VehiclePositionChanged(u);
 
@@ -397,15 +424,12 @@
 
 			u->next = w;
 
-			w->type = VEH_AIRCRAFT;
+			w = new (w) Aircraft();
 			w->direction = DIR_N;
 			w->owner = _current_player;
 			w->x_pos = v->x_pos;
 			w->y_pos = v->y_pos;
 			w->z_pos = v->z_pos + 5;
-			w->x_offs = w->y_offs = -1;
-			w->sprite_width = w->sprite_height = 2;
-			w->z_height = 1;
 			w->vehstatus = VS_HIDDEN | VS_UNCLICKABLE;
 			w->spritenum = 0xFF;
 			w->subtype = AIR_ROTOR;
@@ -413,6 +437,7 @@
 			w->random_bits = VehicleRandomBits();
 			/* Use rotor's air.state to store the rotor animation frame */
 			w->u.air.state = HRS_ROTOR_STOPPED;
+			w->UpdateDeltaXY(INVALID_DIR);
 			VehiclePositionChanged(w);
 		}
 
@@ -564,6 +589,8 @@
 		}
 
 		if (flags & DC_EXEC) {
+			if (v->current_order.type == OT_LOADING) v->LeaveStation();
+
 			v->current_order.type = OT_GOTO_DEPOT;
 			v->current_order.flags = OF_NON_STOP;
 			if (!(p2 & DEPOT_SERVICE)) SETBIT(v->current_order.flags, OFB_HALT_IN_DEPOT);
@@ -588,6 +615,7 @@
  * @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
+ * - p2 = (bit 16) - refit only this vehicle (ignored)
  * @return cost of refit or error
  */
 int32 CmdRefitAircraft(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -686,6 +714,7 @@
 	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;
+		if (v->current_order.type == OT_LOADING) v->LeaveStation();
 		v->current_order.type = OT_GOTO_DEPOT;
 		v->current_order.flags = OF_NON_STOP;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
@@ -710,7 +739,7 @@
 
 	if (v->vehstatus & VS_STOPPED) return;
 
-	int32 cost = AircraftVehInfo(v->engine_type)->running_cost * _price.aircraft_running / 364;
+	int32 cost = GetVehicleProperty(v, 0x0E, AircraftVehInfo(v->engine_type)->running_cost) * _price.aircraft_running / 364;
 
 	v->profit_this_year -= cost >> 8;
 
@@ -857,6 +886,21 @@
 	}
 }
 
+
+void UpdateAircraftCache(Vehicle *v)
+{
+	uint max_speed = GetVehicleProperty(v, 0x0C, 0);
+	if (max_speed != 0) {
+		/* Convert from original units to (approx) km/h */
+		max_speed = (max_speed * 129) / 10;
+
+		v->u.air.cached_max_speed = max_speed;
+	} else {
+		v->u.air.cached_max_speed = 0xFFFF;
+	}
+}
+
+
 /**
  * Special velocities for aircraft
  */
@@ -880,6 +924,11 @@
 	uint spd = v->acceleration * 16;
 	byte t;
 
+	if (v->u.air.cached_max_speed < speed_limit) {
+		if (v->cur_speed < speed_limit) hard_limit = false;
+		speed_limit = v->u.air.cached_max_speed;
+	}
+
 	speed_limit = min(speed_limit, v->max_speed);
 
 	v->subspeed = (t=v->subspeed) + (byte)spd;
@@ -940,6 +989,42 @@
 }
 
 /**
+ * Find the entry point to an airport depending on direction which
+ * the airport is being approached from. Each airport can have up to
+ * four entry points for its approach system so that approaching
+ * aircraft do not fly through each other or are forced to do 180
+ * degree turns during the approach. The arrivals are grouped into
+ * four sectors dependent on the DiagDirection from which the airport
+ * is approached.
+ *
+ * @param v   The vehicle that is approaching the airport
+ * @param apc The Airport Class being approached.
+ * @returns   The index of the entry point
+ */
+static byte AircraftGetEntryPoint(const Vehicle *v, const AirportFTAClass *apc)
+{
+	assert(v != NULL);
+	assert(apc != NULL);
+
+	const Station *st = GetStation(v->u.air.targetairport);
+	/* Make sure we don't go to 0,0 if the airport has been removed. */
+	TileIndex tile = (st->airport_tile != 0) ? st->airport_tile : st->xy;
+
+	int delta_x = v->x_pos - TileX(tile) * TILE_SIZE;
+	int delta_y = v->y_pos - TileY(tile) * TILE_SIZE;
+
+	DiagDirection dir;
+	if (abs(delta_y) < abs(delta_x)) {
+		/* We are northeast or southwest of the airport */
+		dir = delta_x < 0 ? DIAGDIR_NE : DIAGDIR_SW;
+	} else {
+		/* We are northwest or southeast of the airport */
+		dir = delta_y < 0 ? DIAGDIR_NW : DIAGDIR_SE;
+	}
+	return apc->entry_points[dir];
+}
+
+/**
  * Controls the movement of an aircraft. This function actually moves the vehicle
  * on the map and takes care of minor things like sound playback.
  * @todo    De-mystify the cur_speed values for helicopter rotors.
@@ -950,17 +1035,24 @@
 {
 	int count;
 	const Station *st = GetStation(v->u.air.targetairport);
+	const AirportFTAClass *afc = st->Airport();
+	const AirportMovingData *amd;
 
 	/* prevent going to 0,0 if airport is deleted. */
 	TileIndex tile = st->airport_tile;
-	if (tile == 0) tile = st->xy;
+	if (tile == 0) {
+		tile = st->xy;
+
+		/* Jump into our "holding pattern" state machine if possible */
+	if (v->u.air.pos >= afc->nofelements) v->u.air.pos = v->u.air.previous_pos = AircraftGetEntryPoint(v, afc);
+	}
+
+	/*  get airport moving data */
+	amd = afc->MovingData(v->u.air.pos);
+
 	int x = TileX(tile) * TILE_SIZE;
 	int y = TileY(tile) * TILE_SIZE;
 
-	/*  get airport moving data */
-	const AirportFTAClass *afc = st->Airport();
-	const AirportMovingData *amd = afc->MovingData(v->u.air.pos);
-
 	/* Helicopter raise */
 	if (amd->flag & AMED_HELI_RAISE) {
 		Vehicle *u = v->next->next;
@@ -995,6 +1087,7 @@
 				 * 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;
+				UpdateAircraftCache(v);
 				AircraftNextAirportPos_and_Order(v);
 				return false;
 			}
@@ -1109,6 +1202,7 @@
 			if (st->airport_tile == 0) {
 				/* Airport has been removed, abort the landing procedure */
 				v->u.air.state = FLYING;
+				UpdateAircraftCache(v);
 				AircraftNextAirportPos_and_Order(v);
 				/* get aircraft back on running altitude */
 				SetAircraftPosition(v, gp.x, gp.y, GetAircraftFlyingAltitude(v));
@@ -1311,49 +1405,11 @@
 	InvalidateWindowClasses(WC_AIRCRAFT_LIST);
 }
 
-/** Mark all views dirty for an aircraft.
- * @param v vehicle to be redrawn.
- */
-static void MarkAircraftDirty(Vehicle *v)
-{
-		v->cur_image = GetAircraftImage(v, v->direction);
-		if (v->subtype == AIR_HELICOPTER) v->next->next->cur_image = GetRotorImage(v);
-		MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1);
-}
-
-static void HandleAircraftLoading(Vehicle *v, int mode)
+void Aircraft::MarkDirty()
 {
-	switch (v->current_order.type) {
-		case OT_LOADING: {
-			if (mode != 0) return;
-			if (--v->load_unload_time_rem != 0) return;
-
-			if (CanFillVehicle(v) && (
-						v->current_order.flags & OF_FULL_LOAD ||
-						(_patches.gradual_loading && !HASBIT(v->vehicle_flags, VF_LOADING_FINISHED))
-					)) {
-				SET_EXPENSES_TYPE(EXPENSES_AIRCRAFT_INC);
-				if (LoadUnloadVehicle(v, false)) {
-					InvalidateWindow(WC_AIRCRAFT_LIST, v->owner);
-					MarkAircraftDirty(v);
-				}
-				return;
-			}
-
-			Order b = v->current_order;
-			v->current_order.Free();
-			MarkAircraftDirty(v);
-			if (!(b.flags & OF_NON_STOP)) return;
-			break;
-		}
-
-		case OT_DUMMY: break;
-
-		default: return;
-	}
-
-	v->cur_order_index++;
-	InvalidateVehicleOrder(v);
+		this->cur_image = GetAircraftImage(this, this->direction);
+		if (this->subtype == AIR_HELICOPTER) this->next->next->cur_image = GetRotorImage(this);
+		MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1);
 }
 
 static void CrashAirplane(Vehicle *v)
@@ -1435,73 +1491,19 @@
 			0);
 	}
 
-	Order old_order = v->current_order;
 	v->BeginLoading();
-	v->current_order.flags = 0;
-
-	if (old_order.type == OT_GOTO_STATION &&
-			v->current_order.dest == v->last_station_visited) {
-		v->current_order.flags =
-			(old_order.flags & (OF_FULL_LOAD | OF_UNLOAD | OF_TRANSFER)) | OF_NON_STOP;
-	}
-
-	SET_EXPENSES_TYPE(EXPENSES_AIRCRAFT_INC);
-	LoadUnloadVehicle(v, true);
-	MarkAircraftDirty(v);
-	InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
-	InvalidateWindowClasses(WC_AIRCRAFT_LIST);
-}
-
-static void AircraftLand(Vehicle *v)
-{
-	v->sprite_width = v->sprite_height = 2;
 }
 
 static void AircraftLandAirplane(Vehicle *v)
 {
-	AircraftLand(v);
+	v->UpdateDeltaXY(INVALID_DIR);
+
 	if (!PlayVehicleSound(v, VSE_TOUCHDOWN)) {
 		SndPlayVehicleFx(SND_17_SKID_PLANE, v);
 	}
 	MaybeCrashAirplane(v);
 }
 
-/**
- * Find the entry point to an airport depending on direction which
- * the airport is being approached from. Each airport can have up to
- * four entry points for its approach system so that approaching
- * aircraft do not fly through each other or are forced to do 180
- * degree turns during the approach. The arrivals are grouped into
- * four sectors dependent on the DiagDirection from which the airport
- * is approached.
- *
- * @param v   The vehicle that is approaching the airport
- * @param apc The Airport Class being approached.
- * @returns   The index of the entry point
- */
-static byte AircraftGetEntryPoint(const Vehicle *v, const AirportFTAClass *apc)
-{
-	assert(v != NULL);
-	assert(apc != NULL);
-
-	const Station *st = GetStation(v->u.air.targetairport);
-	/* Make sure we don't go to 0,0 if the airport has been removed. */
-	TileIndex tile = (st->airport_tile != 0) ? st->airport_tile : st->xy;
-
-	int delta_x = v->x_pos - TileX(tile) * TILE_SIZE;
-	int delta_y = v->y_pos - TileY(tile) * TILE_SIZE;
-
-	DiagDirection dir;
-	if (abs(delta_y) < abs(delta_x)) {
-		/* We are northeast or southwest of the airport */
-		dir = delta_x < 0 ? DIAGDIR_NE : DIAGDIR_SW;
-	} else {
-		/* We are northwest or southeast of the airport */
-		dir = delta_y < 0 ? DIAGDIR_NW : DIAGDIR_SE;
-	}
-	return apc->entry_points[dir];
-}
-
 
 /** set the right pos when heading to other airports after takeoff */
 static void AircraftNextAirportPos_and_Order(Vehicle *v)
@@ -1654,8 +1656,8 @@
 
 static void AircraftEventHandler_StartTakeOff(Vehicle *v, const AirportFTAClass *apc)
 {
-	v->sprite_width = v->sprite_height = 24; // ??? no idea what this is
 	v->u.air.state = ENDTAKEOFF;
+	v->UpdateDeltaXY(INVALID_DIR);
 }
 
 static void AircraftEventHandler_EndTakeOff(Vehicle *v, const AirportFTAClass *apc)
@@ -1668,15 +1670,16 @@
 static void AircraftEventHandler_HeliTakeOff(Vehicle *v, const AirportFTAClass *apc)
 {
 	const Player* p = GetPlayer(v->owner);
-	v->sprite_width = v->sprite_height = 24; // ??? no idea what this is
 	v->u.air.state = FLYING;
+	v->UpdateDeltaXY(INVALID_DIR);
+
 	/* 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 */
 	if (v->owner == _local_player && (
-				EngineHasReplacementForPlayer(p, v->engine_type) ||
+				EngineHasReplacementForPlayer(p, v->engine_type, v->group_id) ||
 				((p->engine_renew && v->age - v->max_age > p->engine_renew_months * 30) &&
 				HASBIT(GetEngine(v->engine_type)->player_avail, _local_player))
 			)) {
@@ -1727,13 +1730,14 @@
 
 static void AircraftEventHandler_Landing(Vehicle *v, const AirportFTAClass *apc)
 {
+	v->u.air.state = ENDLANDING;
 	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 */
 	if (v->current_order.type != OT_GOTO_DEPOT && v->owner == _local_player) {
 		/* only the vehicle owner needs to calculate the rest (locally) */
 		const Player* p = GetPlayer(v->owner);
-		if (EngineHasReplacementForPlayer(p, v->engine_type) ||
+		if (EngineHasReplacementForPlayer(p, v->engine_type, v->group_id) ||
 			(p->engine_renew && v->age - v->max_age > (p->engine_renew_months * 30))) {
 			/* send the aircraft to the hangar at next airport */
 			_current_player = _local_player;
@@ -1745,8 +1749,8 @@
 
 static void AircraftEventHandler_HeliLanding(Vehicle *v, const AirportFTAClass *apc)
 {
-	AircraftLand(v); // helicopters don't crash
 	v->u.air.state = HELIENDLANDING;
+	v->UpdateDeltaXY(INVALID_DIR);
 }
 
 static void AircraftEventHandler_EndLanding(Vehicle *v, const AirportFTAClass *apc)
@@ -1844,8 +1848,10 @@
 	/* we have arrived in an important state (eg terminal, hangar, etc.) */
 	if (current->heading == v->u.air.state) {
 		byte prev_pos = v->u.air.pos; // location could be changed in state, so save it before-hand
+		byte prev_state = v->u.air.state;
 		_aircraft_state_handlers[v->u.air.state](v, apc);
 		if (v->u.air.state != FLYING) v->u.air.previous_pos = prev_pos;
+		if (v->u.air.state != prev_state || v->u.air.pos != prev_pos) UpdateAircraftCache(v);
 		return true;
 	}
 
@@ -1855,6 +1861,7 @@
 	if (current->next == NULL) {
 		if (AirportSetBlocks(v, current, apc)) {
 			v->u.air.pos = current->next_position;
+			UpdateAircraftCache(v);
 		} // move to next position
 		return false;
 	}
@@ -1865,6 +1872,7 @@
 		if (v->u.air.state == current->heading || current->heading == TO_ALL) {
 			if (AirportSetBlocks(v, current, apc)) {
 				v->u.air.pos = current->next_position;
+				UpdateAircraftCache(v);
 			} // move to next position
 			return false;
 		}
@@ -1902,9 +1910,9 @@
 }
 
 /**
- * ...
+ * "reserve" a block for the plane
  * @param v airplane that requires the operation
- * @param currentpos of the vehicle in the list of blocks
+ * @param current_pos 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
  */
@@ -2091,7 +2099,7 @@
 
 	HandleAircraftSmoke(v);
 	ProcessAircraftOrder(v);
-	HandleAircraftLoading(v, loop);
+	v->HandleLoading(loop != 0);
 
 	if (v->current_order.type >= OT_LOADING) return;
 
@@ -2150,6 +2158,10 @@
 	}
 }
 
+/**
+ * Updates the status of the Aircraft heading or in the station
+ * @param st Station been updated
+ */
 void UpdateAirplanesOnNewStation(const Station *st)
 {
 	/* only 1 station is updated per function call, so it is enough to get entry_point once */
@@ -2160,10 +2172,11 @@
 		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;
+					UpdateAircraftCache(v);
 					/* 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);
@@ -2177,6 +2190,7 @@
 					for (uint cnt = 0; cnt < ap->nofelements; cnt++) {
 						if (ap->layout[cnt].heading == takeofftype) {
 							v->u.air.pos = ap->layout[cnt].position;
+							UpdateAircraftCache(v);
 							break;
 						}
 					}
--- a/src/aircraft_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/aircraft_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -36,6 +36,13 @@
 	}
 }
 
+/**
+ * This is the Callback method after the construction attempt of an aircraft
+ * @param success indicates completion (or not) of the operation
+ * @param tile of depot where aircraft is built
+ * @param p1 unused
+ * @param p2 unused
+ */
 void CcBuildAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
 	if (success) {
@@ -49,6 +56,13 @@
 	}
 }
 
+/**
+ * This is the Callback method after the cloning attempt of an aircraft
+ * @param success indicates completion (or not) of the operation
+ * @param tile unused
+ * @param p1 unused
+ * @param p2 unused
+ */
 void CcCloneAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
 	if (success) ShowAircraftViewWindow(GetVehicle(_new_vehicle_id));
@@ -379,6 +393,6 @@
 
 	if (w != NULL) {
 		w->caption_color = v->owner;
-		AssignWindowViewport(w, 3, 17, 0xE2, 0x54, w->window_number | (1 << 31), 0);
+		AssignWindowViewport(w, 3, 17, 0xE2, 0x54, w->window_number | (1 << 31), ZOOM_LVL_AIRCRAFT);
 	}
 }
--- a/src/airport.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/airport.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -20,6 +20,7 @@
  * - false: give a summarized report which only shows current and next position */
 //#define DEBUG_AIRPORT false
 
+static AirportFTAClass *DummyAirport;
 static AirportFTAClass *CountryAirport;
 static AirportFTAClass *CityAirport;
 static AirportFTAClass *Oilrig;
@@ -34,6 +35,20 @@
 
 void InitializeAirports()
 {
+	DummyAirport = new AirportFTAClass(
+		_airport_moving_data_dummy,
+		NULL,
+		NULL,
+		_airport_entries_dummy,
+		AirportFTAClass::ALL,
+		_airport_fta_dummy,
+		NULL,
+		0,
+		0, 0,
+		0,
+		0
+	);
+
 	CountryAirport = new AirportFTAClass(
 		_airport_moving_data_country,
 		_airport_terminal_country,
@@ -463,6 +478,7 @@
 		case AT_HELIDEPOT:     return HeliDepot;
 		case AT_INTERCON:      return IntercontinentalAirport;
 		case AT_HELISTATION:   return HeliStation;
+		case AT_DUMMY:         return DummyAirport;
 	}
 }
 
--- a/src/airport.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/airport.h	Sat Jun 02 19:59:29 2007 +0000
@@ -27,7 +27,8 @@
 	AT_MUC           = 10,
 	AT_SFO           = 11,
 	AT_AMS           = 12,
-	AT_OILRIG        = 15
+	AT_OILRIG        = 15,
+	AT_DUMMY         = 255
 };
 
 
--- a/src/airport_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/airport_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -34,12 +34,12 @@
 
 static void PlaceAirport(TileIndex tile)
 {
-	DoCommandP(tile, _selected_airport_type, 0, CcBuildAirport, CMD_BUILD_AIRPORT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE));
+	DoCommandP(tile, _selected_airport_type, _ctrl_pressed, CcBuildAirport, CMD_BUILD_AIRPORT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_A001_CAN_T_BUILD_AIRPORT_HERE));
 }
 
 static void PlaceAir_DemolishArea(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, 4);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_DEMOLISH_AREA);
 }
 
 
@@ -91,11 +91,11 @@
 		break;
 
 	case WE_PLACE_DRAG:
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata);
+		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		break;
 
 	case WE_PLACE_MOUSEUP:
-		if (e->we.place.pt.x != -1) {
+		if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_DEMOLISH_AREA) {
 			DoCommandP(e->we.place.tile, e->we.place.starttile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
 		}
 		break;
@@ -105,7 +105,7 @@
 
 		w = FindWindowById(WC_BUILD_STATION, 0);
 		if (w != 0)
-			WP(w,def_d).close = true;
+			WP(w, def_d).close = true;
 		break;
 
 	case WE_DESTROY:
@@ -155,7 +155,7 @@
 		uint32 avail_airports;
 		const AirportFTAClass *airport;
 
-		if (WP(w,def_d).close) return;
+		if (WP(w, def_d).close) return;
 
 		avail_airports = GetValidAirports();
 
@@ -209,7 +209,7 @@
 	} break;
 
 	case WE_MOUSELOOP: {
-		if (WP(w,def_d).close) {
+		if (WP(w, def_d).close) {
 			DeleteWindow(w);
 			return;
 		}
@@ -218,7 +218,7 @@
 	} break;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
--- a/src/airport_movement.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/airport_movement.h	Sat Jun 02 19:59:29 2007 +0000
@@ -18,6 +18,14 @@
 
 ///////////////////////////////////////////////////////////////////////
 /////*********Movement Positions on Airports********************///////
+
+static const AirportMovingData _airport_moving_data_dummy[] = {
+	{    0,    0, AMED_NOSPDCLAMP | AMED_SLOWTURN,     {DIR_N} },
+	{    0,   96, AMED_NOSPDCLAMP | AMED_SLOWTURN,     {DIR_N} },
+	{   96,   96, AMED_NOSPDCLAMP | AMED_SLOWTURN,     {DIR_N} },
+	{   96,    0, AMED_NOSPDCLAMP | AMED_SLOWTURN,     {DIR_N} },
+};
+
 // Country Airfield (small) 4x3
 static const AirportMovingData _airport_moving_data_country[22] = {
 	{   53,    3, AMED_EXACTPOS,                   {DIR_SE} }, // 00 In Hangar
@@ -269,7 +277,7 @@
 	{  136,   96, AMED_HELI_LOWER,                 {DIR_N} }, // 56 Land in front of hangar2
 	{  126,  104, 0,                               {DIR_SE} }, // 57 Outway 2
 	{  136,  136, 0,                               {DIR_NE} }, // 58 Airport OUTWAY 2
-	{  136,  152, AMED_EXACTPOS,                   {DIR_SW} }, // 59 Accelerate to end of runway2
+	{  136,  152, AMED_EXACTPOS,                   {DIR_NE} }, // 59 Accelerate to end of runway2
 	{   16,  152, AMED_NOSPDCLAMP,                 {DIR_N} }, // 60 Release control of runway2, for smoother movement
 	{   20,  152, AMED_NOSPDCLAMP,                 {DIR_N} }, // 61 End of runway2
 	{  -56,  152, AMED_NOSPDCLAMP | AMED_TAKEOFF,  {DIR_N} }, // 62 Take off2
@@ -377,6 +385,15 @@
 
 ///////////////////////////////////////////////////////////////////////
 /////**********Movement Machine on Airports*********************///////
+static const byte _airport_entries_dummy[] = {0, 1, 2, 3};
+static const AirportFTAbuildup _airport_fta_dummy[] = {
+	{ 0, 0, 0, 3},
+	{ 1, 0, 0, 0},
+	{ 2, 0, 0, 1},
+	{ 3, 0, 0, 2},
+	{ MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE
+};
+
 /* First element of terminals array tells us how many depots there are (to know size of array)
  * this may be changed later when airports are moved to external file  */
 static const TileIndexDiffC _airport_depots_country[] = {{3, 0}};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/articulated_vehicles.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,84 @@
+/* $Id$ */
+
+/** @file articulated_vehicles.cpp */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "debug.h"
+#include "functions.h"
+#include "command.h"
+#include "vehicle.h"
+#include "articulated_vehicles.h"
+#include "engine.h"
+#include "train.h"
+#include "newgrf_callbacks.h"
+#include "newgrf_engine.h"
+
+uint CountArticulatedParts(EngineID engine_type)
+{
+	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
+
+	uint i;
+	for (i = 1; i < 10; i++) {
+		uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL);
+		if (callback == CALLBACK_FAILED || callback == 0xFF) break;
+	}
+
+	return i - 1;
+}
+
+void AddArticulatedParts(Vehicle **vl)
+{
+	const Vehicle *v = vl[0];
+	Vehicle *u = vl[0];
+
+	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
+
+	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
+		 * if the callback returns different values depending on the cargo type. */
+		u->next = vl[i];
+		if (u->next == NULL) u->next = AllocateVehicle();
+		if (u->next == NULL) return;
+
+		u = u->next;
+
+		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;
+		u->owner = v->owner;
+		u->tile = v->tile;
+		u->x_pos = v->x_pos;
+		u->y_pos = v->y_pos;
+		u->z_pos = v->z_pos;
+		u->u.rail.track = v->u.rail.track;
+		u->u.rail.railtype = v->u.rail.railtype;
+		u->build_year = v->build_year;
+		u->vehstatus = v->vehstatus & ~VS_STOPPED;
+		u->u.rail.first_engine = v->engine_type;
+
+		/* get more settings from rail vehicle info */
+		u->spritenum = rvi_artic->image_index;
+		if (flip_image) u->spritenum++;
+		u->cargo_type = rvi_artic->cargo_type;
+		u->cargo_subtype = 0;
+		u->cargo_cap = rvi_artic->capacity;
+		u->max_speed = 0;
+		u->max_age = 0;
+		u->engine_type = engine_type;
+		u->value = 0;
+		u = new (u) Train();
+		u->subtype = 0;
+		SetArticulatedPart(u);
+		u->cur_image = 0xAC2;
+		u->random_bits = VehicleRandomBits();
+
+		VehiclePositionChanged(u);
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/articulated_vehicles.h	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,11 @@
+/* $Id$ */
+
+/** @file articulated_vehicles.h */
+
+#ifndef ARTICULATED_VEHICLES_H
+#define ARTICULATED_VEHICLES_H
+
+uint CountArticulatedParts(EngineID engine_type);
+void AddArticulatedParts(Vehicle **vl);
+
+#endif /* ARTICULATED_VEHICLES_H */
--- a/src/autoreplace_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/autoreplace_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -16,6 +16,7 @@
 #include "train.h"
 #include "aircraft.h"
 #include "cargotype.h"
+#include "group.h"
 
 
 /*
@@ -87,34 +88,9 @@
  */
 static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type)
 {
-	bool new_cargo_capacity = true;
-	CargoID new_cargo_type = CT_INVALID;
-
-	switch (v->type) {
-		case VEH_TRAIN:
-			new_cargo_capacity = (RailVehInfo(engine_type)->capacity > 0);
-			new_cargo_type     = RailVehInfo(engine_type)->cargo_type;
-			break;
+	CargoID new_cargo_type = GetEngineCargoType(engine_type);
 
-		case VEH_ROAD:
-			new_cargo_capacity = (RoadVehInfo(engine_type)->capacity > 0);
-			new_cargo_type     = RoadVehInfo(engine_type)->cargo_type;
-			break;
-		case VEH_SHIP:
-			new_cargo_capacity = (ShipVehInfo(engine_type)->capacity > 0);
-			new_cargo_type     = ShipVehInfo(engine_type)->cargo_type;
-			break;
-
-		case VEH_AIRCRAFT:
-			/* all aircraft starts as passenger planes with cargo capacity
-			 * new_cargo_capacity is always true for aircraft, which is the init value. No need to set it here */
-			new_cargo_type     = CT_PASSENGERS;
-			break;
-
-		default: NOT_REACHED(); break;
-	}
-
-	if (!new_cargo_capacity) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity
+	if (new_cargo_type == CT_INVALID) return CT_NO_REFIT; // Don't try to refit an engine with no cargo capacity
 
 	if (v->cargo_type == new_cargo_type || CanRefitTo(engine_type, v->cargo_type)) {
 		if (VerifyAutoreplaceRefitForOrders(v, engine_type)) {
@@ -137,7 +113,7 @@
 		/* Now we found a cargo type being carried on the train and we will see if it is possible to carry to this one */
 		if (v->cargo_type == new_cargo_type) return CT_NO_REFIT;
 		if (CanRefitTo(engine_type, v->cargo_type)) return v->cargo_type;
-	} while ((v=v->next) != NULL);
+	} while ((v = v->next) != NULL);
 	return CT_NO_REFIT; // We failed to find a cargo type on the old vehicle and we will not refit the new one
 }
 
@@ -161,7 +137,18 @@
 	char vehicle_name[32];
 	CargoID replacement_cargo_type;
 
-	new_engine_type = EngineReplacementForPlayer(p, old_v->engine_type);
+	/* If the vehicle belongs to a group, check if the group is protected from the global autoreplace.
+	 *  If not, chek if an global auto replacement is defined */
+	new_engine_type = (IsValidGroupID(old_v->group_id) && GetGroup(old_v->group_id)->replace_protection) ?
+			INVALID_ENGINE :
+			EngineReplacementForPlayer(p, old_v->engine_type, DEFAULT_GROUP);
+
+	/* If we don't set new_egnine_type previously, we try to check if an autoreplacement was defined
+	 *  for the group and the engine_type of the vehicle */
+	if (new_engine_type == INVALID_ENGINE && !IsDefaultGroupID(old_v->group_id)) {
+		new_engine_type = EngineReplacementForPlayer(p, old_v->engine_type, old_v->group_id);
+	}
+
 	if (new_engine_type == INVALID_ENGINE) new_engine_type = old_v->engine_type;
 
 	replacement_cargo_type = GetNewCargoTypeForReplace(old_v, new_engine_type);
@@ -184,7 +171,12 @@
 		return cost;
 	}
 
-	if (replacement_cargo_type != CT_NO_REFIT) cost += GetRefitCost(new_engine_type); // add refit cost
+	if (replacement_cargo_type != CT_NO_REFIT) {
+		/* add refit cost */
+		int32 refit_cost = GetRefitCost(new_engine_type);
+		if (old_v->type == VEH_TRAIN && IsMultiheaded(old_v)) refit_cost += refit_cost; // pay for both ends
+		cost += refit_cost;
+	}
 
 	if (flags & DC_EXEC) {
 		new_v = GetVehicle(_new_vehicle_id);
@@ -208,9 +200,14 @@
 			 * We add the new engine after the old one instead of replacing it. It will give the same result anyway when we
 			 * sell the old engine in a moment
 			 */
-			DoCommand(0, (GetPrevVehicleInChain(old_v)->index << 16) | new_v->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+			/* Get the vehicle in front of the one we move out */
+			Vehicle *front = GetPrevVehicleInChain(old_v);
+			/* If the vehicle in front is the rear end of a dualheaded engine, then we need to use the one in front of that one */
+			if (IsMultiheaded(front) && !IsTrainEngine(front)) front = GetPrevVehicleInChain(front);
 			/* Now we move the old one out of the train */
 			DoCommand(0, (INVALID_VEHICLE << 16) | old_v->index, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+			/* Add the new vehicle */
+			DoCommand(0, (front->index << 16) | new_v->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
 		} else {
 			// copy/clone the orders
 			DoCommand(0, (old_v->index << 16) | new_v->index, IsOrderListShared(old_v) ? CO_SHARE : CO_COPY, DC_EXEC, CMD_CLONE_ORDER);
@@ -219,8 +216,10 @@
 			new_v->profit_this_year = old_v->profit_this_year;
 			new_v->profit_last_year = old_v->profit_last_year;
 			new_v->service_interval = old_v->service_interval;
+			DoCommand(0, old_v->group_id, new_v->index, flags, CMD_ADD_VEHICLE_GROUP);
 			new_front = true;
 			new_v->unitnumber = old_v->unitnumber; // use the same unit number
+			new_v->dest_tile  = old_v->dest_tile;
 
 			new_v->current_order = old_v->current_order;
 			if (old_v->type == VEH_TRAIN && GetNextVehicle(old_v) != NULL){
@@ -329,8 +328,17 @@
 			if (!p->engine_renew ||
 					w->age - w->max_age < (p->engine_renew_months * 30) || // replace if engine is too old
 					w->max_age == 0) { // rail cars got a max age of 0
-				if (!EngineHasReplacementForPlayer(p, w->engine_type)) // updates to a new model
+				/* If the vehicle belongs to a group, check if the group is protected from the global autoreplace.
+				   If not, chek if an global auto remplacement is defined */
+				if (IsValidGroupID(w->group_id)) {
+					if (!EngineHasReplacementForPlayer(p, w->engine_type, w->group_id) && (
+							GetGroup(w->group_id)->replace_protection ||
+							!EngineHasReplacementForPlayer(p, w->engine_type, DEFAULT_GROUP))) {
+						continue;
+					}
+				} else if (!EngineHasReplacementForPlayer(p, w->engine_type, DEFAULT_GROUP)) {
 					continue;
+				}
 			}
 
 			/* Now replace the vehicle */
--- a/src/autoreplace_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/autoreplace_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -14,6 +14,7 @@
 #include "variables.h"
 #include "vehicle_gui.h"
 #include "newgrf_engine.h"
+#include "group.h"
 
 
 static RailType _railtype_selected_in_replace_gui;
@@ -62,7 +63,7 @@
 /** When an engine is made buildable or is removed from being buildable, add/remove it from the build/autoreplace lists
  * @param type The type of engine
  */
-void AddRemoveEngineFromAutoreplaceAndBuildWindows(byte type)
+void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type)
 {
 	_rebuild_left_list = false; // left list is only for the vehicles the player owns and is not related to being buildable
 	_rebuild_right_list = true;
@@ -150,12 +151,18 @@
 		if (type == VEH_TRAIN && !GenerateReplaceRailList(e, draw_left, WP(w, replaceveh_d).wagon_btnstate)) continue; // special rules for trains
 
 		if (draw_left) {
+			const GroupID selected_group = WP(w, replaceveh_d).sel_group;
+			const uint num_engines = IsDefaultGroupID(selected_group) ? p->num_engines[e] : GetGroup(selected_group)->num_engines[e];
+
 			/* Skip drawing the engines we don't have any of and haven't set for replacement */
-			if (p->num_engines[e] == 0 && EngineReplacementForPlayer(GetPlayer(_local_player), e) == INVALID_ENGINE) continue;
+			if (num_engines == 0 && EngineReplacementForPlayer(GetPlayer(_local_player), e, selected_group) == INVALID_ENGINE) continue;
 		} else {
 			/* This is for engines we can replace to and they should depend on what we selected to replace from */
 			if (!IsEngineBuildable(e, type, _local_player)) continue; // we need to be able to build the engine
 			if (!EnginesGotCargoInCommon(e, WP(w, replaceveh_d).sel_engine[0])) continue; // the engines needs to be able to carry the same cargo
+
+			/* Road vehicles can't be replaced by trams and vice-versa */
+			if (type == VEH_ROAD && HASBIT(EngInfo(WP(w, replaceveh_d).sel_engine[0])->misc_flags, EF_ROAD_TRAM) != HASBIT(EngInfo(e)->misc_flags, EF_ROAD_TRAM)) continue;
 			if (e == WP(w, replaceveh_d).sel_engine[0]) continue; // we can't replace an engine into itself (that would be autorenew)
 		}
 
@@ -202,7 +209,7 @@
 }
 
 
-void DrawEngineList(byte type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count);
+void DrawEngineList(VehicleType type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group);
 
 static void ReplaceVehicleWndProc(Window *w, WindowEvent *e)
 {
@@ -231,6 +238,7 @@
 
 			Player *p = GetPlayer(_local_player);
 			EngineID selected_id[2];
+			const GroupID selected_group = WP(w,replaceveh_d).sel_group;
 
 			selected_id[0] = WP(w, replaceveh_d).sel_engine[0];
 			selected_id[1] = WP(w, replaceveh_d).sel_engine[1];
@@ -242,15 +250,15 @@
 			SetWindowWidgetDisabledState(w, 4,
 										 selected_id[0] == INVALID_ENGINE ||
 										 selected_id[1] == INVALID_ENGINE ||
-										 EngineReplacementForPlayer(p, selected_id[1]) != INVALID_ENGINE ||
-										 EngineReplacementForPlayer(p, selected_id[0]) == selected_id[1]);
+										 EngineReplacementForPlayer(p, selected_id[1], selected_group) != INVALID_ENGINE ||
+										 EngineReplacementForPlayer(p, selected_id[0], selected_group) == selected_id[1]);
 
 			/* Disable the "Stop Replacing" button if:
 			 *   The left list (existing vehicle) is empty
 			 *   or The selected vehicle has no replacement set up */
 			SetWindowWidgetDisabledState(w, 6,
 										 selected_id[0] == INVALID_ENGINE ||
-										 !EngineHasReplacementForPlayer(p, selected_id[0]));
+										 !EngineHasReplacementForPlayer(p, selected_id[0], selected_group));
 
 			/* now the actual drawing of the window itself takes place */
 			SetDParam(0, _vehicle_type_names[w->window_number]);
@@ -261,14 +269,14 @@
 
 				/* set wagon/engine button */
 				SetDParam(2, WP(w, replaceveh_d).wagon_btnstate ? STR_ENGINES : STR_WAGONS);
+
+				/* sets the colour of that art thing */
+				w->widget[13].color = _player_colors[_local_player];
+				w->widget[16].color = _player_colors[_local_player];
 			}
 
-			w->widget[13].color = _player_colors[_local_player]; // sets the colour of that art thing
-			w->widget[16].color = _player_colors[_local_player]; // sets the colour of that art thing
-
 			DrawWindowWidgets(w);
 
-
 			if (w->window_number == VEH_TRAIN) {
 				/* Draw the selected railtype in the pulldown menu */
 				RailType railtype = _railtype_selected_in_replace_gui;
@@ -277,10 +285,10 @@
 
 			/* sets up the string for the vehicle that is being replaced to */
 			if (selected_id[0] != INVALID_ENGINE) {
-				if (!EngineHasReplacementForPlayer(p, selected_id[0])) {
+				if (!EngineHasReplacementForPlayer(p, selected_id[0], selected_group)) {
 					SetDParam(0, STR_NOT_REPLACING);
 				} else {
-					SetDParam(0, GetCustomEngineName(EngineReplacementForPlayer(p, selected_id[0])));
+					SetDParam(0, GetCustomEngineName(EngineReplacementForPlayer(p, selected_id[0], selected_group)));
 				}
 			} else {
 				SetDParam(0, STR_NOT_REPLACING_VEHICLE_SELECTED);
@@ -296,7 +304,7 @@
 				EngineID end    = min((i == 0 ? w->vscroll.cap : w->vscroll2.cap) + start, EngList_Count(&list));
 
 				/* Do the actual drawing */
-				DrawEngineList(w->window_number, x, 15, list, start, end, WP(w, replaceveh_d).sel_engine[i], i == 0);
+				DrawEngineList((VehicleType)w->window_number, x, 15, list, start, end, WP(w, replaceveh_d).sel_engine[i], i == 0, selected_group);
 
 				/* Also draw the details if an engine is selected */
 				if (WP(w, replaceveh_d).sel_engine[i] != INVALID_ENGINE) {
@@ -328,12 +336,12 @@
 				case 4: { /* Start replacing */
 					EngineID veh_from = WP(w, replaceveh_d).sel_engine[0];
 					EngineID veh_to = WP(w, replaceveh_d).sel_engine[1];
-					DoCommandP(0, 3, veh_from + (veh_to << 16), NULL, CMD_SET_AUTOREPLACE);
+					DoCommandP(0, 3 + (WP(w, replaceveh_d).sel_group << 16) , veh_from + (veh_to << 16), NULL, CMD_SET_AUTOREPLACE);
 				} break;
 
 				case 6: { /* Stop replacing */
 					EngineID veh_from = WP(w, replaceveh_d).sel_engine[0];
-					DoCommandP(0, 3, veh_from + (INVALID_ENGINE << 16), NULL, CMD_SET_AUTOREPLACE);
+					DoCommandP(0, 3 + (WP(w, replaceveh_d).sel_group << 16), veh_from + (INVALID_ENGINE << 16), NULL, CMD_SET_AUTOREPLACE);
 				} break;
 
 				case 7:
@@ -480,7 +488,7 @@
 };
 
 
-void ShowReplaceVehicleWindow(byte vehicletype)
+void ShowReplaceVehicleWindow(VehicleType vehicletype)
 {
 	Window *w;
 
@@ -509,4 +517,37 @@
 
 	w->caption_color = _local_player;
 	w->vscroll2.cap = w->vscroll.cap;   // these two are always the same
+	WP(w, replaceveh_d).sel_group = DEFAULT_GROUP;
+ }
+
+void ShowReplaceGroupVehicleWindow(GroupID id_g, VehicleType vehicletype)
+{
+	Window *w;
+
+	DeleteWindowById(WC_REPLACE_VEHICLE, vehicletype);
+
+	switch (vehicletype) {
+		default: NOT_REACHED();
+		case VEH_TRAIN:
+			w = AllocateWindowDescFront(&_replace_rail_vehicle_desc, vehicletype);
+			w->vscroll.cap  = 8;
+			w->resize.step_height = 14;
+			WP(w, replaceveh_d).wagon_btnstate = true;
+			break;
+		case VEH_ROAD:
+			w = AllocateWindowDescFront(&_replace_road_vehicle_desc, vehicletype);
+			w->vscroll.cap  = 8;
+			w->resize.step_height = 14;
+			break;
+		case VEH_SHIP:
+		case VEH_AIRCRAFT:
+			w = AllocateWindowDescFront(&_replace_ship_aircraft_vehicle_desc, vehicletype);
+			w->vscroll.cap  = 4;
+			w->resize.step_height = 24;
+			break;
+	}
+
+	w->caption_color = _local_player;
+	WP(w, replaceveh_d).sel_group = id_g;
+	w->vscroll2.cap = w->vscroll.cap;   // these two are always the same
 }
--- a/src/bridge_map.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/bridge_map.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,11 @@
 /* $Id$ */
 
-/** @file bridge_map.cpp */
+/** @file bridge_map.cpp Map accessor functions for bridges. */
 
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
+#include "bridge.h"
 #include "variables.h"
 
 
--- a/src/bridge_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/bridge_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file bridge_map.h */
+/** @file bridge_map.h Map accessor functions for bridges. */
 
 #ifndef BRIDGE_MAP_H
 #define BRIDGE_MAP_H
@@ -13,18 +13,34 @@
 #include "tile.h"
 
 
+/**
+ * Checks if this is a bridge, instead of a tunnel
+ * @param t The tile to analyze
+ * @pre IsTileType(t, MP_TUNNELBRIDGE)
+ * @return true if the structure is a bridge one
+ */
 static inline bool IsBridge(TileIndex t)
 {
 	assert(IsTileType(t, MP_TUNNELBRIDGE));
 	return HASBIT(_m[t].m5, 7);
 }
 
+/**
+ * checks if there is a bridge on this tile
+ * @param t The tile to analyze
+ * @return true if a bridge is present
+ */
 static inline bool IsBridgeTile(TileIndex t)
 {
 	return IsTileType(t, MP_TUNNELBRIDGE) && IsBridge(t);
 }
 
-
+/**
+ * checks for the possibility that a bridge may be on this tile
+ * These are in fact all the tile types on which a bridge can be found
+ * @param t The tile to analyze
+ * @return true if a bridge migh be present
+ */
 static inline bool MayHaveBridgeAbove(TileIndex t)
 {
 	return
@@ -36,7 +52,12 @@
 		IsTileType(t, MP_UNMOVABLE);
 }
 
-
+/**
+ * checks if a bridge is set above the ground of this tile
+ * @param t The tile to analyze
+ * @pre MayHaveBridgeAbove(t)
+ * @return true if a bridge is detected above
+ */
 static inline bool IsBridgeAbove(TileIndex t)
 {
 	assert(MayHaveBridgeAbove(t));
@@ -46,7 +67,8 @@
 
 /**
  * Determines the type of bridge on a tile
- * @param tile The tile to analyze
+ * @param t The tile to analyze
+ * @pre IsBridgeTile(t)
  * @return The bridge type
  */
 static inline uint GetBridgeType(TileIndex t)
@@ -58,7 +80,8 @@
 
 /**
  * Get the direction pointing onto the bridge
- * @param tile The tile to analyze
+ * @param t The tile to analyze
+ * @pre IsBridgeTile(t)
  * @return the above mentionned direction
  */
 static inline DiagDirection GetBridgeRampDirection(TileIndex t)
@@ -68,6 +91,12 @@
 }
 
 
+/**
+ * Get the axis of the bridge that goes over the tile. Not the axis or the ramp.
+ * @param t The tile to analyze
+ * @pre IsBridgeAbove(t)
+ * @return the above mentioned axis
+ */
 static inline Axis GetBridgeAxis(TileIndex t)
 {
 	assert(IsBridgeAbove(t));
@@ -75,6 +104,12 @@
 }
 
 
+/**
+ * Get the transport type of the bridge's ramp.
+ * @param t The ramp tile to analyze
+ * @pre IsBridgeTile(t)
+ * @return the transport type of the bridge
+ */
 static inline TransportType GetBridgeTransportType(TileIndex t)
 {
 	assert(IsBridgeTile(t));
@@ -82,6 +117,12 @@
 }
 
 
+/**
+ * Does the bridge ramp lie in a snow or desert area?
+ * @param t The ramp tile to analyze
+ * @pre IsBridgeTile(t)
+ * @return true if and only if in a snow or desert area
+ */
 static inline bool HasBridgeSnowOrDesert(TileIndex t)
 {
 	assert(IsBridgeTile(t));
@@ -89,6 +130,12 @@
 }
 
 
+/**
+ * Sets whether the bridge ramp lies in a snow or desert area.
+ * @param t              The ramp tile to set (un)make a snow/desert area
+ * @param snow_or_desert Make (true) or unmake the tile a snow/desert area
+ * @pre IsBridgeTile(t)
+ */
 static inline void SetBridgeSnowOrDesert(TileIndex t, bool snow_or_desert)
 {
 	assert(IsBridgeTile(t));
@@ -97,28 +144,43 @@
 
 /**
  * Finds the end of a bridge in the specified direction starting at a middle tile
+ * @param t the bridge tile to find the bridge ramp for
+ * @param d the direction to search in
  */
-TileIndex GetBridgeEnd(TileIndex, DiagDirection);
+TileIndex GetBridgeEnd(TileIndex t, DiagDirection d);
 
 /**
  * Finds the northern end of a bridge starting at a middle tile
+ * @param t the bridge tile to find the bridge ramp for
  */
 TileIndex GetNorthernBridgeEnd(TileIndex t);
 
 /**
  * Finds the southern end of a bridge starting at a middle tile
+ * @param t the bridge tile to find the bridge ramp for
  */
 TileIndex GetSouthernBridgeEnd(TileIndex t);
 
 
 /**
  * Starting at one bridge end finds the other bridge end
+ * @param t the bridge ramp tile to find the other bridge ramp for
  */
-TileIndex GetOtherBridgeEnd(TileIndex);
+TileIndex GetOtherBridgeEnd(TileIndex t);
 
+/**
+ * Get the height ('z') of a bridge in pixels.
+ * @param tile the bridge ramp tile to get the bridge height from
+ * @return the height of the bridge in pixels
+ */
 uint GetBridgeHeight(TileIndex tile);
-uint GetBridgeFoundation(Slope tileh, Axis axis);
 
+/**
+ * Remove the bridge over the given axis.
+ * @param t the tile to remove the bridge from
+ * @param a the axis of the bridge to remove
+ * @pre MayHaveBridgeAbove(t)
+ */
 static inline void ClearSingleBridgeMiddle(TileIndex t, Axis a)
 {
 	assert(MayHaveBridgeAbove(t));
@@ -126,38 +188,73 @@
 }
 
 
+/**
+ * Removes bridges from the given, that is bridges along the X and Y axis.
+ * @param t the tile to remove the bridge from
+ * @pre MayHaveBridgeAbove(t)
+ */
 static inline void ClearBridgeMiddle(TileIndex t)
 {
 	ClearSingleBridgeMiddle(t, AXIS_X);
 	ClearSingleBridgeMiddle(t, AXIS_Y);
 }
 
+/**
+ * Set that there is a bridge over the given axis.
+ * @param t the tile to add the bridge to
+ * @param a the axis of the bridge to add
+ * @pre MayHaveBridgeAbove(t)
+ */
 static inline void SetBridgeMiddle(TileIndex t, Axis a)
 {
 	assert(MayHaveBridgeAbove(t));
 	SETBIT(_m[t].m6, 6 + a);
 }
 
-
-static inline void MakeBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, TransportType tt)
+/**
+ * Generic part to make a bridge ramp for both roads and rails.
+ * @param t          the tile to make a bridge ramp
+ * @param o          the new owner of the bridge ramp
+ * @param bridgetype the type of bridge this bridge ramp belongs to
+ * @param d          the direction this ramp must be facing
+ * @param tt         the transport type of the bridge
+ * @param rt         the road or rail type
+ * @note this function should not be called directly.
+ */
+static inline void MakeBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, TransportType tt, uint rt)
 {
 	SetTileType(t, MP_TUNNELBRIDGE);
 	SetTileOwner(t, o);
 	_m[t].m2 = bridgetype << 4;
+	_m[t].m3 = rt;
 	_m[t].m4 = 0;
 	_m[t].m5 = 1 << 7 | tt << 2 | d;
 }
 
-static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d)
+/**
+ * Make a bridge ramp for roads.
+ * @param t          the tile to make a bridge ramp
+ * @param o          the new owner of the bridge ramp
+ * @param bridgetype the type of bridge this bridge ramp belongs to
+ * @param d          the direction this ramp must be facing
+ * @param r          the road type of the bridge
+ */
+static inline void MakeRoadBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, RoadTypes r)
 {
-	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD);
-	_m[t].m3 = 0;
+	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_ROAD, r);
 }
 
+/**
+ * Make a bridge ramp for rails.
+ * @param t          the tile to make a bridge ramp
+ * @param o          the new owner of the bridge ramp
+ * @param bridgetype the type of bridge this bridge ramp belongs to
+ * @param d          the direction this ramp must be facing
+ * @param r          the rail type of the bridge
+ */
 static inline void MakeRailBridgeRamp(TileIndex t, Owner o, uint bridgetype, DiagDirection d, RailType r)
 {
-	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL);
-	_m[t].m3 = r;
+	MakeBridgeRamp(t, o, bridgetype, d, TRANSPORT_RAIL, r);
 }
 
 
--- a/src/build_vehicle_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/build_vehicle_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -15,6 +15,7 @@
 #include "window.h"
 #include "gui.h"
 #include "vehicle.h"
+#include "articulated_vehicles.h"
 #include "gfx.h"
 #include "station.h"
 #include "command.h"
@@ -27,6 +28,8 @@
 #include "date.h"
 #include "strings.h"
 #include "cargotype.h"
+#include "group.h"
+#include "road_map.h"
 
 
 enum BuildVehicleWidgets {
@@ -237,6 +240,19 @@
 	return _internal_sort_order ? -r : r;
 }
 
+static int CDECL TrainEngineCapacitySorter(const void *a, const void *b)
+{
+	int va = RailVehInfo(*(const EngineID*)a)->capacity;
+	int vb = RailVehInfo(*(const EngineID*)b)->capacity;
+	int r = va - vb;
+
+	if (r == 0) {
+		/* Use EngineID to sort instead since we want consistent sorting */
+		return EngineNumberSorter(a, b);
+	}
+	return _internal_sort_order ? -r : r;
+}
+
 static int CDECL TrainEnginesThenWagonsSorter(const void *a, const void *b)
 {
 	EngineID va = *(const EngineID*)a;
@@ -251,6 +267,32 @@
 	return _internal_sort_order ? -r : r;
 }
 
+static int CDECL RoadVehEngineCapacitySorter(const void *a, const void *b)
+{
+	int va = RoadVehInfo(*(const EngineID*)a)->capacity;
+	int vb = RoadVehInfo(*(const EngineID*)b)->capacity;
+	int r = va - vb;
+
+	if (r == 0) {
+		/* Use EngineID to sort instead since we want consistent sorting */
+		return EngineNumberSorter(a, b);
+	}
+	return _internal_sort_order ? -r : r;
+}
+
+static int CDECL ShipEngineCapacitySorter(const void *a, const void *b)
+{
+	int va = ShipVehInfo(*(const EngineID*)a)->capacity;
+	int vb = ShipVehInfo(*(const EngineID*)b)->capacity;
+	int r = va - vb;
+
+	if (r == 0) {
+		/* Use EngineID to sort instead since we want consistent sorting */
+		return EngineNumberSorter(a, b);
+	}
+	return _internal_sort_order ? -r : r;
+}
+
 /* Aircraft sorting functions */
 
 static int CDECL AircraftEngineCostSorter(const void *a, const void *b)
@@ -290,18 +332,25 @@
 
 static int CDECL AircraftEngineCargoSorter(const void *a, const void *b)
 {
-	const int va = AircraftVehInfo(*(const EngineID*)a)->passenger_capacity;
-	const int vb = AircraftVehInfo(*(const EngineID*)b)->passenger_capacity;
-	const int r = va - vb;
+	int va = AircraftVehInfo(*(const EngineID*)a)->passenger_capacity;
+	int vb = AircraftVehInfo(*(const EngineID*)b)->passenger_capacity;
+	int r = va - vb;
 
 	if (r == 0) {
-		/* Use EngineID to sort instead since we want consistent sorting */
-		return EngineNumberSorter(a, b);
+		/* The planes has the same passenger capacity. Check mail capacity instead */
+		va = AircraftVehInfo(*(const EngineID*)a)->mail_capacity;
+		vb = AircraftVehInfo(*(const EngineID*)b)->mail_capacity;
+		r = va - vb;
+
+		if (r == 0) {
+			/* Use EngineID to sort instead since we want consistent sorting */
+			return EngineNumberSorter(a, b);
+		}
 	}
 	return _internal_sort_order ? -r : r;
 }
 
-static EngList_SortTypeFunction * const _sorter[][9] = {{
+static EngList_SortTypeFunction * const _sorter[][10] = {{
 	/* Trains */
 	&TrainEngineNumberSorter,
 	&TrainEngineCostSorter,
@@ -312,19 +361,22 @@
 	&TrainEngineRunningCostSorter,
 	&TrainEnginePowerVsRunningCostSorter,
 	&EngineReliabilitySorter,
-},{
+	&TrainEngineCapacitySorter,
+}, {
 	/* Road vehicles */
 	&EngineNumberSorter,
 	&EngineIntroDateSorter,
 	&EngineNameSorter,
 	&EngineReliabilitySorter,
-},{
+	&RoadVehEngineCapacitySorter,
+}, {
 	/* Ships */
 	&EngineNumberSorter,
 	&EngineIntroDateSorter,
 	&EngineNameSorter,
 	&EngineReliabilitySorter,
-},{
+	&ShipEngineCapacitySorter,
+}, {
 	/* Aircraft */
 	&EngineNumberSorter,
 	&AircraftEngineCostSorter,
@@ -336,7 +388,7 @@
 	&AircraftEngineCargoSorter,
 }};
 
-static const StringID _sort_listing[][10] = {{
+static const StringID _sort_listing[][11] = {{
 	/* Trains */
 	STR_ENGINE_SORT_ENGINE_ID,
 	STR_ENGINE_SORT_COST,
@@ -347,22 +399,25 @@
 	STR_ENGINE_SORT_RUNNING_COST,
 	STR_ENGINE_SORT_POWER_VS_RUNNING_COST,
 	STR_SORT_BY_RELIABILITY,
+	STR_ENGINE_SORT_CARGO_CAPACITY,
 	INVALID_STRING_ID
-},{
+}, {
 	/* Road vehicles */
 	STR_ENGINE_SORT_ENGINE_ID,
 	STR_ENGINE_SORT_INTRO_DATE,
 	STR_SORT_BY_DROPDOWN_NAME,
 	STR_SORT_BY_RELIABILITY,
+	STR_ENGINE_SORT_CARGO_CAPACITY,
 	INVALID_STRING_ID
-},{
+}, {
 	/* Ships */
 	STR_ENGINE_SORT_ENGINE_ID,
 	STR_ENGINE_SORT_INTRO_DATE,
 	STR_SORT_BY_DROPDOWN_NAME,
 	STR_SORT_BY_RELIABILITY,
+	STR_ENGINE_SORT_CARGO_CAPACITY,
 	INVALID_STRING_ID
-},{
+}, {
 	/* Aircraft */
 	STR_ENGINE_SORT_ENGINE_ID,
 	STR_ENGINE_SORT_COST,
@@ -379,21 +434,25 @@
 static int DrawRailWagonPurchaseInfo(int x, int y, EngineID engine_number, const RailVehicleInfo *rvi)
 {
 	/* Purchase cost */
-	SetDParam(0, (rvi->base_cost * _price.build_railwagon) >> 8);
+	SetDParam(0, (GetEngineProperty(engine_number, 0x17, rvi->base_cost) * _price.build_railwagon) >> 8);
 	DrawString(x, y, STR_PURCHASE_INFO_COST, 0);
 	y += 10;
 
 	/* Wagon weight - (including cargo) */
-	SetDParam(0, rvi->weight);
-	SetDParam(1, (GetCargo(rvi->cargo_type)->weight * rvi->capacity >> 4) + rvi->weight);
+	uint weight = GetEngineProperty(engine_number, 0x16, rvi->weight);
+	SetDParam(0, weight);
+	SetDParam(1, (GetCargo(rvi->cargo_type)->weight * GetEngineProperty(engine_number, 0x14, rvi->capacity) >> 4) + weight);
 	DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, 0);
 	y += 10;
 
 	/* Wagon speed limit, displayed if above zero */
-	if (rvi->max_speed > 0 && _patches.wagon_speed_limits) {
-		SetDParam(0, rvi->max_speed * 10 / 16);
-		DrawString(x,y, STR_PURCHASE_INFO_SPEED, 0);
-		y += 10;
+	if (_patches.wagon_speed_limits) {
+		uint max_speed = GetEngineProperty(engine_number, 0x09, rvi->max_speed);
+		if (max_speed > 0) {
+			SetDParam(0, max_speed * 10 / 16);
+			DrawString(x, y, STR_PURCHASE_INFO_SPEED, 0);
+			y += 10;
+		}
 	}
 	return y;
 }
@@ -402,36 +461,37 @@
 static int DrawRailEnginePurchaseInfo(int x, int y, EngineID engine_number, const RailVehicleInfo *rvi)
 {
 	int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
+	uint weight = GetEngineProperty(engine_number, 0x16, rvi->weight);
 
 	/* Purchase Cost - Engine weight */
-	SetDParam(0, rvi->base_cost * (_price.build_railvehicle >> 3) >> 5);
-	SetDParam(1, rvi->weight << multihead);
-	DrawString(x,y, STR_PURCHASE_INFO_COST_WEIGHT, 0);
+	SetDParam(0, GetEngineProperty(engine_number, 0x17, rvi->base_cost) * (_price.build_railvehicle >> 3) >> 5);
+	SetDParam(1, weight << multihead);
+	DrawString(x, y, STR_PURCHASE_INFO_COST_WEIGHT, 0);
 	y += 10;
 
 	/* Max speed - Engine power */
-	SetDParam(0, rvi->max_speed * 10 / 16);
-	SetDParam(1, rvi->power << multihead);
-	DrawString(x,y, STR_PURCHASE_INFO_SPEED_POWER, 0);
+	SetDParam(0, GetEngineProperty(engine_number, 0x09, rvi->max_speed) * 10 / 16);
+	SetDParam(1, GetEngineProperty(engine_number, 0x0B, rvi->power) << multihead);
+	DrawString(x, y, STR_PURCHASE_INFO_SPEED_POWER, 0);
 	y += 10;
 
 	/* Max tractive effort - not applicable if old acceleration or maglev */
 	if (_patches.realistic_acceleration && rvi->railtype != RAILTYPE_MAGLEV) {
-		SetDParam(0, ((rvi->weight << multihead) * 10 * rvi->tractive_effort) / 256);
+		SetDParam(0, ((weight << multihead) * 10 * GetEngineProperty(engine_number, 0x1F, rvi->tractive_effort)) / 256);
 		DrawString(x, y, STR_PURCHASE_INFO_MAX_TE, 0);
 		y += 10;
 	}
 
 	/* Running cost */
-	SetDParam(0, (rvi->running_cost_base * _price.running_rail[rvi->running_cost_class] >> 8) << multihead);
-	DrawString(x,y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
+	SetDParam(0, (GetEngineProperty(engine_number, 0x0D, rvi->running_cost_base) * _price.running_rail[rvi->running_cost_class] >> 8) << multihead);
+	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
 	y += 10;
 
 	/* Powered wagons power - Powered wagons extra weight */
 	if (rvi->pow_wag_power != 0) {
 		SetDParam(0, rvi->pow_wag_power);
 		SetDParam(1, rvi->pow_wag_weight);
-		DrawString(x,y, STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT, 0);
+		DrawString(x, y, STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT, 0);
 		y += 10;
 	};
 
@@ -444,7 +504,7 @@
 	bool refittable = (_engine_info[engine_number].refit_mask != 0);
 
 	/* Purchase cost - Max speed */
-	SetDParam(0, rvi->base_cost * (_price.roadveh_base>>3)>>5);
+	SetDParam(0, GetEngineProperty(engine_number, 0x11, rvi->base_cost) * (_price.roadveh_base >> 3) >> 5);
 	SetDParam(1, rvi->max_speed * 10 / 32);
 	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
 	y += 10;
@@ -456,7 +516,7 @@
 
 	/* Cargo type + capacity */
 	SetDParam(0, rvi->cargo_type);
-	SetDParam(1, rvi->capacity);
+	SetDParam(1, GetEngineProperty(engine_number, 0x0F, rvi->capacity));
 	SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
 	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
 	y += 10;
@@ -468,21 +528,21 @@
 static int DrawShipPurchaseInfo(int x, int y, EngineID engine_number, const ShipVehicleInfo *svi)
 {
 	/* Purchase cost - Max speed */
-	SetDParam(0, svi->base_cost * (_price.ship_base>>3)>>5);
-	SetDParam(1, svi->max_speed * 10 / 32);
-	DrawString(x,y, STR_PURCHASE_INFO_COST_SPEED, 0);
+	SetDParam(0, GetEngineProperty(engine_number, 0x0A, svi->base_cost) * (_price.ship_base >> 3) >> 5);
+	SetDParam(1, GetEngineProperty(engine_number, 0x0B, svi->max_speed) * 10 / 32);
+	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
 	y += 10;
 
 	/* Cargo type + capacity */
 	SetDParam(0, svi->cargo_type);
-	SetDParam(1, svi->capacity);
+	SetDParam(1, GetEngineProperty(engine_number, 0x0D, svi->capacity));
 	SetDParam(2, svi->refittable ? STR_9842_REFITTABLE : STR_EMPTY);
-	DrawString(x,y, STR_PURCHASE_INFO_CAPACITY, 0);
+	DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
 	y += 10;
 
 	/* Running cost */
-	SetDParam(0, svi->running_cost * _price.ship_running >> 8);
-	DrawString(x,y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
+	SetDParam(0, GetEngineProperty(engine_number, 0x0F, svi->running_cost) * _price.ship_running >> 8);
+	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
 	y += 10;
 
 	return y;
@@ -494,7 +554,7 @@
 	CargoID cargo;
 
 	/* Purchase cost - Max speed */
-	SetDParam(0, avi->base_cost * (_price.aircraft_base>>3)>>5);
+	SetDParam(0, GetEngineProperty(engine_number, 0x0B, avi->base_cost) * (_price.aircraft_base >> 3) >> 5);
 	SetDParam(1, avi->max_speed * 10 / 16);
 	DrawString(x, y, STR_PURCHASE_INFO_COST_SPEED, 0);
 	y += 10;
@@ -516,7 +576,7 @@
 	y += 10;
 
 	/* Running cost */
-	SetDParam(0, avi->running_cost * _price.aircraft_running >> 8);
+	SetDParam(0, GetEngineProperty(engine_number, 0x0E, avi->running_cost) * _price.aircraft_running >> 8);
 	DrawString(x, y, STR_PURCHASE_INFO_RUNNINGCOST, 0);
 	y += 10;
 
@@ -538,10 +598,12 @@
 	bool refitable = false;
 
 	switch (e->type) {
+		default: NOT_REACHED();
 		case VEH_TRAIN: {
 			const RailVehicleInfo *rvi = RailVehInfo(engine_number);
+			uint capacity = GetEngineProperty(engine_number, 0x14, rvi->capacity);
 
-			refitable = (EngInfo(engine_number)->refit_mask != 0) && (rvi->capacity > 0);
+			refitable = (EngInfo(engine_number)->refit_mask != 0) && (capacity > 0);
 
 			if (rvi->railveh_type == RAILVEH_WAGON) {
 				y = DrawRailWagonPurchaseInfo(x, y, engine_number, rvi);
@@ -557,10 +619,10 @@
 				int multihead = (rvi->railveh_type == RAILVEH_MULTIHEAD ? 1 : 0);
 
 				SetDParam(0, rvi->cargo_type);
-				SetDParam(1, (rvi->capacity * (CountArticulatedParts(engine_number) + 1)) << multihead);
+				SetDParam(1, (capacity * (CountArticulatedParts(engine_number) + 1)) << multihead);
 				SetDParam(2, refitable ? STR_9842_REFITTABLE : STR_EMPTY);
 			}
-			DrawString(x,y, STR_PURCHASE_INFO_CAPACITY, 0);
+			DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, 0);
 			y += 10;
 		}
 			break;
@@ -658,6 +720,7 @@
 
 	for (eid = ROAD_ENGINES_INDEX; eid < ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES; eid++) {
 		if (!IsEngineBuildable(eid, VEH_ROAD, _local_player)) continue;
+		if (!HASBIT(bv->filter.roadtypes, HASBIT(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD)) continue;
 		EngList_Add(&bv->eng_list, eid);
 
 		if (eid == bv->sel_engine) sel_id = eid;
@@ -714,6 +777,7 @@
 	buildvehicle_d *bv = &WP(w, buildvehicle_d);
 
 	switch (bv->vehicle_type) {
+		default: NOT_REACHED();
 		case VEH_TRAIN:
 			GenerateBuildTrainList(w);
 			return; // trains should not reach the last sorting
@@ -751,7 +815,7 @@
  * @param selected_id what engine to highlight as selected, if any
  * @param show_count Display the number of vehicles (used by autoreplace)
  */
-void DrawEngineList(byte type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count)
+void DrawEngineList(VehicleType type, int x, int y, const EngineList eng_list, uint16 min, uint16 max, EngineID selected_id, bool show_count, GroupID selected_group)
 {
 	byte step_size = GetVehicleListHeight(type);
 	byte x_offset = 0;
@@ -787,11 +851,12 @@
 
 	for (; min < max; min++, y += step_size) {
 		const EngineID engine = eng_list[min];
+		const uint num_engines = IsDefaultGroupID(selected_group) ? p->num_engines[engine] : GetGroup(selected_group)->num_engines[engine];
 
 		DrawString(x + x_offset, y, GetCustomEngineName(engine), engine == selected_id ? 0xC : 0x10);
-		DrawVehicleEngine(type, x, y + y_offset, engine, (show_count && p->num_engines[engine] == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_player));
+		DrawVehicleEngine(type, x, y + y_offset, engine, (show_count && num_engines == 0) ? PALETTE_CRASH : GetEnginePalette(engine, _local_player));
 		if (show_count) {
-			SetDParam(0, p->num_engines[engine]);
+			SetDParam(0, num_engines);
 			DrawStringRightAligned(213, y + (GetVehicleListHeight(type) == 14 ? 3 : 8), STR_TINY_BLACK, 0);
 		}
 	}
@@ -825,7 +890,7 @@
 	SetDParam(0, bv->filter.railtype + STR_881C_NEW_RAIL_VEHICLES); // This should only affect rail vehicles
 	DrawWindowWidgets(w);
 
-	DrawEngineList(bv->vehicle_type, 2, 27, bv->eng_list, w->vscroll.pos, max, bv->sel_engine, false);
+	DrawEngineList(bv->vehicle_type, 2, 27, bv->eng_list, w->vscroll.pos, max, bv->sel_engine, false, DEFAULT_GROUP);
 
 	if (bv->sel_engine != INVALID_ENGINE) {
 		const Widget *wi = &w->widget[BUILD_VEHICLE_WIDGET_PANEL];
@@ -866,6 +931,7 @@
 			EngineID sel_eng = bv->sel_engine;
 			if (sel_eng != INVALID_ENGINE) {
 				switch (bv->vehicle_type) {
+					default: NOT_REACHED();
 					case VEH_TRAIN:
 						DoCommandP(w->window_number, sel_eng, 0, (RailVehInfo(sel_eng)->railveh_type == RAILVEH_WAGON) ? CcBuildWagon : CcBuildLoco,
 								   CMD_BUILD_RAIL_VEHICLE | CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE));
@@ -891,6 +957,7 @@
 
 				bv->rename_engine = sel_eng;
 				switch (bv->vehicle_type) {
+					default: NOT_REACHED();
 					case VEH_TRAIN:    str = STR_886A_RENAME_TRAIN_VEHICLE_TYPE; break;
 					case VEH_ROAD:     str = STR_9036_RENAME_ROAD_VEHICLE_TYPE;  break;
 					case VEH_SHIP:     str = STR_9838_RENAME_SHIP_TYPE;          break;
@@ -934,6 +1001,7 @@
 				StringID str = STR_NULL;
 				_cmd_text = e->we.edittext.str;
 				switch (bv->vehicle_type) {
+					default: NOT_REACHED();
 					case VEH_TRAIN:    str = STR_886B_CAN_T_RENAME_TRAIN_VEHICLE; break;
 					case VEH_ROAD:     str = STR_9037_CAN_T_RENAME_ROAD_VEHICLE;  break;
 					case VEH_SHIP:     str = STR_9839_CAN_T_RENAME_SHIP_TYPE;     break;
@@ -971,7 +1039,7 @@
 	NewVehicleWndProc
 };
 
-void ShowBuildVehicleWindow(TileIndex tile, byte type)
+void ShowBuildVehicleWindow(TileIndex tile, VehicleType type)
 {
 	buildvehicle_d *bv;
 	Window *w;
@@ -1000,11 +1068,13 @@
 	bv->descending_sort_order = _last_sort_order[type];
 
 	switch (type) {
+		default: NOT_REACHED();
 		case VEH_TRAIN:
-			WP(w,buildvehicle_d).filter.railtype = (tile == 0) ? RAILTYPE_END : GetRailType(tile);
+			WP(w, buildvehicle_d).filter.railtype = (tile == 0) ? RAILTYPE_END : GetRailType(tile);
 			ResizeWindow(w, 0, 16);
 			break;
 		case VEH_ROAD:
+			WP(w, buildvehicle_d).filter.roadtypes = (tile == 0) ? ROADTYPES_ALL : GetRoadTypes(tile);
 			ResizeWindow(w, 0, 16);
 		case VEH_SHIP:
 			break;
--- a/src/cargotype.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/cargotype.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -33,6 +33,14 @@
 	for (CargoID i = 0; i < lengthof(_default_climate_cargo[l]); i++) {
 		CargoLabel cl = _default_climate_cargo[l][i];
 
+		/* Bzzt: check if cl is just an index into the cargo table */
+		if (cl < lengthof(_default_cargo)) {
+			/* Copy the indexed cargo */
+			_cargo[i] = _default_cargo[cl];
+			SETBIT(_cargo_mask, i);
+			continue;
+		}
+
 		/* Loop through each of the default cargo types to see if
 		 * the label matches */
 		for (uint j = 0; j < lengthof(_default_cargo); j++) {
@@ -71,3 +79,21 @@
 	/* No matching label was found, so it is invalid */
 	return CT_INVALID;
 }
+
+
+/** Find the CargoID of a 'bitnum' value.
+ * @param bitnum 'bitnum' to find.
+ * @return First CargoID with the given bitnum, or CT_INVALID if not found.
+ */
+CargoID GetCargoIDByBitnum(uint8 bitnum)
+{
+	if (bitnum == INVALID_CARGO) return CT_INVALID;
+
+	for (CargoID c = 0; c < lengthof(_cargo); c++) {
+		if (_cargo[c].bitnum == bitnum) return c;
+	}
+
+	/* No matching label was found, so it is invalid */
+	return CT_INVALID;
+}
+
--- a/src/cargotype.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/cargotype.h	Sat Jun 02 19:59:29 2007 +0000
@@ -58,6 +58,7 @@
 const CargoSpec *GetCargo(CargoID c);
 /* Get the cargo ID with the cargo label */
 CargoID GetCargoIDByLabel(CargoLabel cl);
+CargoID GetCargoIDByBitnum(uint8 bitnum);
 
 static inline bool IsCargoInClass(CargoID c, uint16 cc)
 {
--- a/src/clear_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/clear_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -79,7 +79,7 @@
 
 	if (count >= 625) return;
 
-	for (t = ts->tile_table; count != 0; count--,t++) {
+	for (t = ts->tile_table; count != 0; count--, t++) {
 		if (*t == tile) return;
 	}
 
@@ -141,7 +141,7 @@
 		}
 	}
 
-	ret = DoCommand(tile, 0,0, ts->flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
+	ret = DoCommand(tile, 0, 0, ts->flags & ~DC_EXEC, CMD_LANDSCAPE_CLEAR);
 
 	if (CmdFailed(ret)) {
 		_terraform_err_tile = tile;
@@ -215,8 +215,8 @@
 			tile += ToTileIndexDiff(*ttm);
 
 			r = TerraformGetHeightOfTile(ts, tile);
-			if (r != height && r-direction != height && r+direction != height) {
-				if (!TerraformTileHeight(ts, tile, r+direction))
+			if (r != height && r - direction != height && r + direction != height) {
+				if (!TerraformTileHeight(ts, tile, r + direction))
 					return false;
 			}
 		}
@@ -291,24 +291,24 @@
 		for (count = ts.tile_table_count; count != 0; count--, ti++) {
 			TileIndex tile = *ti;
 
-			if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) {
+			uint z_min = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 0));
+			uint z_max = z_min;
+			uint t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 0));
+			z_min = min(z_min, t);
+			z_max = max(z_max, t);
+			t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 1));
+			z_min = min(z_min, t);
+			z_max = max(z_max, t);
+			t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 1));
+			z_min = min(z_min, t);
+			z_max = max(z_max, t);
+
+			if (direction == 1 && MayHaveBridgeAbove(tile) && IsBridgeAbove(tile) &&
+					GetBridgeHeight(GetSouthernBridgeEnd(tile)) <= z_max * TILE_HEIGHT) {
 				return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
 			}
-
-			if (direction == -1) {
-				uint z, t;
-
-				z = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 0));
-				t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 0));
-				if (t <= z) z = t;
-				t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 1));
-				if (t <= z) z = t;
-				t = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 1));
-				if (t <= z) z = t;
-
-				if (IsTunnelInWay(tile, z * TILE_HEIGHT)) {
-					return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
-				}
+			if (direction == -1 && IsTunnelInWay(tile, z_min * TILE_HEIGHT)) {
+				return_cmd_error(STR_1002_EXCAVATION_WOULD_DAMAGE);
 			}
 		}
 	}
@@ -382,8 +382,8 @@
 	if (ey < sy) Swap(ey, sy);
 	tile = TileXY(sx, sy);
 
-	size_x = ex-sx+1;
-	size_y = ey-sy+1;
+	size_x = ex - sx + 1;
+	size_y = ey - sy + 1;
 
 	money = GetAvailableMoneyForCommand();
 	cost = 0;
@@ -764,7 +764,7 @@
 	/* not used */
 }
 
-static uint32 GetTileTrackStatus_Clear(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Clear(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	return 0;
 }
--- a/src/clear_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/clear_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file clear_map.h */
+/** @file clear_map.h Map accessors for 'clear' tiles */
 
 #ifndef CLEAR_MAP_H
 #define CLEAR_MAP_H
@@ -9,8 +9,8 @@
 #include "tile.h"
 #include "bridge_map.h"
 
-/* ground type, m5 bits 2...4
- * valid densities (bits 0...1) in comments after the enum
+/**
+ * Ground types. Valid densities in comments after the enum.
  */
 enum ClearGround {
 	CLEAR_GRASS  = 0, ///< 0-3
@@ -22,24 +22,48 @@
 };
 
 
+/**
+ * Get the type of clear tile.
+ * @param t the tile to get the clear ground type of
+ * @pre IsTileType(t, MP_CLEAR)
+ * @return the ground type
+ */
 static inline ClearGround GetClearGround(TileIndex t)
 {
 	assert(IsTileType(t, MP_CLEAR));
 	return (ClearGround)GB(_m[t].m5, 2, 3);
 }
 
+/**
+ * Set the type of clear tile.
+ * @param t  the tile to set the clear ground type of
+ * @param ct the ground type
+ * @pre IsTileType(t, MP_CLEAR)
+ */
 static inline bool IsClearGround(TileIndex t, ClearGround ct)
 {
 	return GetClearGround(t) == ct;
 }
 
 
+/**
+ * Get the density of a non-field clear tile.
+ * @param t the tile to get the density of
+ * @pre IsTileType(t, MP_CLEAR)
+ * @return the density
+ */
 static inline uint GetClearDensity(TileIndex t)
 {
 	assert(IsTileType(t, MP_CLEAR));
 	return GB(_m[t].m5, 0, 2);
 }
 
+/**
+ * Increment the density of a non-field clear tile.
+ * @param t the tile to increment the density of
+ * @param d the amount to increment the density with
+ * @pre IsTileType(t, MP_CLEAR)
+ */
 static inline void AddClearDensity(TileIndex t, int d)
 {
 	assert(IsTileType(t, MP_CLEAR)); // XXX incomplete
@@ -47,18 +71,36 @@
 }
 
 
+/**
+ * Get the counter used to advance to the next clear density/field type.
+ * @param t the tile to get the counter of
+ * @pre IsTileType(t, MP_CLEAR)
+ * @return the value of the counter
+ */
 static inline uint GetClearCounter(TileIndex t)
 {
 	assert(IsTileType(t, MP_CLEAR));
 	return GB(_m[t].m5, 5, 3);
 }
 
+/**
+ * Increments the counter used to advance to the next clear density/field type.
+ * @param t the tile to increment the counter of
+ * @param c the amount to increment the counter with
+ * @pre IsTileType(t, MP_CLEAR)
+ */
 static inline void AddClearCounter(TileIndex t, int c)
 {
 	assert(IsTileType(t, MP_CLEAR)); // XXX incomplete
 	_m[t].m5 += c << 5;
 }
 
+/**
+ * Sets the counter used to advance to the next clear density/field type.
+ * @param t the tile to set the counter of
+ * @param c the amount to set the counter to
+ * @pre IsTileType(t, MP_CLEAR)
+ */
 static inline void SetClearCounter(TileIndex t, uint c)
 {
 	assert(IsTileType(t, MP_CLEAR)); // XXX incomplete
@@ -66,7 +108,13 @@
 }
 
 
-/* Sets type and density in one go, also sets the counter to 0 */
+/**
+ * Sets ground type and density in one go, also sets the counter to 0
+ * @param t       the tile to set the ground type and density for
+ * @param type    the new ground type of the tile
+ * @param density the density of the ground tile
+ * @pre IsTileType(t, MP_CLEAR)
+ */
 static inline void SetClearGroundDensity(TileIndex t, ClearGround type, uint density)
 {
 	assert(IsTileType(t, MP_CLEAR)); // XXX incomplete
@@ -74,49 +122,99 @@
 }
 
 
+/**
+ * Get the field type (production stage) of the field
+ * @param t the field to get the type of
+ * @pre GetClearGround(t) == CLEAR_FIELDS
+ * @return the field type
+ */
 static inline uint GetFieldType(TileIndex t)
 {
 	assert(GetClearGround(t) == CLEAR_FIELDS);
 	return GB(_m[t].m3, 0, 4);
 }
 
+/**
+ * Set the field type (production stage) of the field
+ * @param t the field to get the type of
+ * @param f the field type
+ * @pre GetClearGround(t) == CLEAR_FIELDS
+ */
 static inline void SetFieldType(TileIndex t, uint f)
 {
 	assert(GetClearGround(t) == CLEAR_FIELDS); // XXX incomplete
 	SB(_m[t].m3, 0, 4, f);
 }
 
-static inline uint16 GetIndustryIndexOfField(TileIndex t)
+/**
+ * Get the industry (farm) that made the field
+ * @param t the field to get creating industry of
+ * @pre GetClearGround(t) == CLEAR_FIELDS
+ * @return the industry that made the field
+ */
+static inline IndustryID GetIndustryIndexOfField(TileIndex t)
 {
 	assert(GetClearGround(t) == CLEAR_FIELDS);
-	return _m[t].m2;
+	return(IndustryID) _m[t].m2;
 }
 
-static inline void SetIndustryIndexOfField(TileIndex t, uint16 i)
+/**
+ * Set the industry (farm) that made the field
+ * @param t the field to get creating industry of
+ * @param i the industry that made the field
+ * @pre GetClearGround(t) == CLEAR_FIELDS
+ */
+static inline void SetIndustryIndexOfField(TileIndex t, IndustryID i)
 {
 	assert(GetClearGround(t) == CLEAR_FIELDS);
 	_m[t].m2 = i;
 }
 
-/* Is used by tree tiles, too */
+
+/**
+ * Is there a fence at the south eastern border?
+ * @param t the tile to check for fences
+ * @pre IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)
+ * @return 0 if there is no fence, otherwise the fence type
+ */
 static inline uint GetFenceSE(TileIndex t)
 {
 	assert(IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES));
 	return GB(_m[t].m4, 2, 3);
 }
 
+/**
+ * Sets the type of fence (and whether there is one) for the south
+ * eastern border.
+ * @param t the tile to check for fences
+ * @param h 0 if there is no fence, otherwise the fence type
+ * @pre IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)
+ */
 static inline void SetFenceSE(TileIndex t, uint h)
 {
 	assert(IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)); // XXX incomplete
 	SB(_m[t].m4, 2, 3, h);
 }
 
+/**
+ * Is there a fence at the south western border?
+ * @param t the tile to check for fences
+ * @pre IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)
+ * @return 0 if there is no fence, otherwise the fence type
+ */
 static inline uint GetFenceSW(TileIndex t)
 {
 	assert(IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES));
 	return GB(_m[t].m4, 5, 3);
 }
 
+/**
+ * Sets the type of fence (and whether there is one) for the south
+ * western border.
+ * @param t the tile to check for fences
+ * @param h 0 if there is no fence, otherwise the fence type
+ * @pre IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)
+ */
 static inline void SetFenceSW(TileIndex t, uint h)
 {
 	assert(IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)); // XXX incomplete
@@ -124,6 +222,12 @@
 }
 
 
+/**
+ * Make a clear tile.
+ * @param t       the tile to make a clear tile
+ * @param g       the type of ground
+ * @param density the density of the grass/snow/desert etc
+ */
 static inline void MakeClear(TileIndex t, ClearGround g, uint density)
 {
 	/* If this is a non-bridgeable tile, clear the bridge bits while the rest
@@ -140,7 +244,13 @@
 }
 
 
-static inline void MakeField(TileIndex t, uint field_type, uint16 industry)
+/**
+ * Make a (farm) field tile.
+ * @param t          the tile to make a farm field
+ * @param field_type the 'growth' level of the field
+ * @param industry   the industry this tile belongs to
+ */
+static inline void MakeField(TileIndex t, uint field_type, IndustryID industry)
 {
 	SetTileType(t, MP_CLEAR);
 	SetTileOwner(t, OWNER_NONE);
--- a/src/command.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/command.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -6,6 +6,7 @@
 #include "openttd.h"
 #include "table/strings.h"
 #include "functions.h"
+#include "landscape.h"
 #include "map.h"
 #include "gui.h"
 #include "command.h"
@@ -167,6 +168,14 @@
 DEF_COMMAND(CmdDepotSellAllVehicles);
 DEF_COMMAND(CmdDepotMassAutoReplace);
 
+DEF_COMMAND(CmdCreateGroup);
+DEF_COMMAND(CmdRenameGroup);
+DEF_COMMAND(CmdDeleteGroup);
+DEF_COMMAND(CmdAddVehicleGroup);
+DEF_COMMAND(CmdAddSharedVehicleGroup);
+DEF_COMMAND(CmdRemoveAllVehiclesGroup);
+DEF_COMMAND(CmdSetGroupReplaceProtection);
+
 /* The master command table */
 static const Command _command_proc_table[] = {
 	{CmdBuildRailroadTrack,                  0}, /*   0 */
@@ -312,6 +321,13 @@
 	{CmdMassStartStopVehicle,                0}, /* 117 */
 	{CmdDepotSellAllVehicles,                0}, /* 118 */
 	{CmdDepotMassAutoReplace,                0}, /* 119 */
+	{CmdCreateGroup,                         0}, /* 120 */
+	{CmdDeleteGroup,                         0}, /* 121 */
+	{CmdRenameGroup,                         0}, /* 122 */
+	{CmdAddVehicleGroup,                     0}, /* 123 */
+	{CmdAddSharedVehicleGroup,               0}, /* 124 */
+	{CmdRemoveAllVehiclesGroup,              0}, /* 125 */
+	{CmdSetGroupReplaceProtection,           0}, /* 126 */
 };
 
 /* This function range-checks a cmd, and checks if the cmd is not NULL */
@@ -338,7 +354,7 @@
 	CommandProc *proc;
 
 	/* Do not even think about executing out-of-bounds tile-commands */
-	if (tile >= MapSize()) {
+	if (tile >= MapSize() || IsTileType(tile, MP_VOID)) {
 		_cmd_text = NULL;
 		return CMD_ERROR;
 	}
@@ -406,7 +422,7 @@
  * 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;
+	int32 res = 0, res2;
 	CommandProc *proc;
 	uint32 flags;
 	bool notest;
@@ -416,7 +432,7 @@
 	int y = TileY(tile) * TILE_SIZE;
 
 	/* Do not even think about executing out-of-bounds tile-commands */
-	if (tile >= MapSize()) {
+	if (tile >= MapSize() || IsTileType(tile, MP_VOID)) {
 		_cmd_text = NULL;
 		return false;
 	}
@@ -455,13 +471,17 @@
 	 * 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 */
+	 * fact will trigger an assertion failure. --pasky
+	 * CMD_CLONE_VEHICLE: Both building new vehicles and refitting them can be
+	 * influenced by newgrf callbacks, which makes it impossible to accurately
+	 * estimate the cost of cloning a vehicle. */
 	notest =
 		(cmd & 0xFF) == CMD_CLEAR_AREA ||
 		(cmd & 0xFF) == CMD_CONVERT_RAIL ||
 		(cmd & 0xFF) == CMD_LEVEL_LAND ||
 		(cmd & 0xFF) == CMD_REMOVE_ROAD ||
-		(cmd & 0xFF) == CMD_REMOVE_LONG_ROAD;
+		(cmd & 0xFF) == CMD_REMOVE_LONG_ROAD ||
+		(cmd & 0xFF) == CMD_CLONE_VEHICLE;
 
 	_docommand_recursive = 1;
 
@@ -543,7 +563,7 @@
 		if (res2 != 0) ShowCostOrIncomeAnimation(x, y, GetSlopeZ(x, y), res2);
 		if (_additional_cash_required) {
 			SetDParam(0, _additional_cash_required);
-			ShowErrorMessage(STR_0003_NOT_ENOUGH_CASH_REQUIRES, error_part1, x,y);
+			ShowErrorMessage(STR_0003_NOT_ENOUGH_CASH_REQUIRES, error_part1, x, y);
 			if (res2 == 0) goto callb_err;
 		}
 	}
@@ -557,7 +577,7 @@
 show_error:
 	/* show error message if the command fails? */
 	if (IsLocalPlayer() && error_part1 != 0) {
-		ShowErrorMessage(_error_message, error_part1, x,y);
+		ShowErrorMessage(_error_message, error_part1, x, y);
 	}
 
 callb_err:
--- a/src/command.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/command.h	Sat Jun 02 19:59:29 2007 +0000
@@ -143,6 +143,13 @@
 	CMD_MASS_START_STOP              = 117,
 	CMD_DEPOT_SELL_ALL_VEHICLES      = 118,
 	CMD_DEPOT_MASS_AUTOREPLACE       = 119,
+	CMD_CREATE_GROUP                 = 120,
+	CMD_DELETE_GROUP                 = 121,
+	CMD_RENAME_GROUP                 = 122,
+	CMD_ADD_VEHICLE_GROUP            = 123,
+	CMD_ADD_SHARED_VEHICLE_GROUP     = 124,
+	CMD_REMOVE_ALL_VEHICLES_GROUP    = 125,
+	CMD_SET_GROUP_REPLACE_PROTECTION = 126,
 };
 
 enum {
@@ -158,7 +165,7 @@
 	CMD_ERROR = ((int32)0x80000000),
 };
 
-#define CMD_MSG(x) ((x)<<16)
+#define CMD_MSG(x) ((x) << 16)
 
 enum {
 	CMD_AUTO                  = 0x0200,
--- a/src/console.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/console.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -411,7 +411,7 @@
 /**
  * Handle the printing of text entered into the console or redirected there
  * by any other means. Uses printf() style format, for more information look
- * at @IConsolePrint()
+ * at IConsolePrint()
  */
 void CDECL IConsolePrintF(uint16 color_code, const char *s, ...)
 {
@@ -428,7 +428,7 @@
 /**
  * It is possible to print debugging information to the console,
  * which is achieved by using this function. Can only be used by
- * @debug() in debug.c. You need at least a level 2 (developer) for debugging
+ * debug() in debug.cpp. You need at least a level 2 (developer) for debugging
  * messages to show up
  * @param dbg debugging category
  * @param string debugging message
@@ -489,7 +489,7 @@
 
 /**
  * General internal hooking code that is the same for both commands and variables
- * @param hooks @IConsoleHooks structure that will be set according to
+ * @param hooks IConsoleHooks structure that will be set according to
  * @param type type access trigger
  * @param proc function called when the hook criteria is met
  */
@@ -514,7 +514,7 @@
 /**
  * Handle any special hook triggers. If the hook type is met check if
  * there is a function associated with that and if so, execute it
- * @param hooks @IConsoleHooks structure that will be checked
+ * @param hooks IConsoleHooks structure that will be checked
  * @param type type of hook, trigger that needs to be activated
  * @return true on a successfull execution of the hook command or if there
  * is no hook/trigger present at all. False otherwise
@@ -767,8 +767,11 @@
 /**
  * Special function for adding string-type variables. They in addition
  * also need a 'size' value saying how long their string buffer is.
+ * @param name name of the variable that will be used
+ * @param addr memory location the variable will point to
  * @param size the length of the string buffer
- * For more information see @IConsoleVarRegister()
+ * @param help the help string shown for the variable
+ * For more information see IConsoleVarRegister()
  */
 void IConsoleVarStringRegister(const char *name, void *addr, uint32 size, const char *help)
 {
--- a/src/console_cmds.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/console_cmds.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -8,6 +8,7 @@
 #include "debug.h"
 #include "engine.h"
 #include "functions.h"
+#include "landscape.h"
 #include "saveload.h"
 #include "string.h"
 #include "variables.h"
@@ -141,8 +142,6 @@
 	FOR_ALL_VEHICLES(v) {
 		/* Code ripped from CmdStartStopTrain. Can't call it, because of
 		 * ownership problems, so we'll duplicate some code, for now */
-		if (v->type == VEH_TRAIN)
-			v->u.rail.days_since_order_progr = 0;
 		v->vehstatus |= VS_STOPPED;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
@@ -1233,13 +1232,16 @@
 
 		if (!p->is_active) continue;
 
+		const NetworkPlayerInfo *npi = &_network_player_info[p->index];
+
 		GetString(buffer, STR_00D1_DARK_BLUE + _player_colors[p->index], lastof(buffer));
-		IConsolePrintF(8, "#:%d(%s) Company Name: '%s'  Year Founded: %d  Money: %d  Loan: %d  Value: %" OTTD_PRINTF64 "d  (T:%d, R:%d, P:%d, S:%d)",
-			p->index + 1, buffer, _network_player_info[p->index].company_name, p->inaugurated_year, p->player_money, p->current_loan, CalculateCompanyValue(p),
-			/* trains      */ _network_player_info[p->index].num_vehicle[0],
-			/* lorry + bus */ _network_player_info[p->index].num_vehicle[1] + _network_player_info[p->index].num_vehicle[2],
-			/* planes      */ _network_player_info[p->index].num_vehicle[3],
-			/* ships       */ _network_player_info[p->index].num_vehicle[4]);
+		IConsolePrintF(8, "#:%d(%s) Company Name: '%s'  Year Founded: %d  Money: %d  Loan: %d  Value: %" OTTD_PRINTF64 "d  (T:%d, R:%d, P:%d, S:%d) %sprotected",
+			p->index + 1, buffer, npi->company_name, p->inaugurated_year, p->player_money, p->current_loan, CalculateCompanyValue(p),
+			/* trains      */ npi->num_vehicle[0],
+			/* lorry + bus */ npi->num_vehicle[1] + npi->num_vehicle[2],
+			/* planes      */ npi->num_vehicle[3],
+			/* ships       */ npi->num_vehicle[4],
+			/* protected   */ StrEmpty(npi->password) ? "un" : "");
 	}
 
 	return true;
@@ -1416,6 +1418,19 @@
 	return true;
 }
 
+DEF_CONSOLE_CMD(ConListPatches)
+{
+	if (argc == 0) {
+		IConsoleHelp("List patch options. Usage: 'list_patches'");
+		return true;
+	}
+
+	if (argc != 1) return false;
+
+	IConsoleListPatches();
+	return true;
+}
+
 DEF_CONSOLE_CMD(ConListDumpVariables)
 {
 	const IConsoleVar *var;
@@ -1497,6 +1512,7 @@
 	IConsoleCmdRegister("pwd",          ConPrintWorkingDirectory);
 	IConsoleCmdRegister("clear",        ConClearBuffer);
 	IConsoleCmdRegister("patch",        ConPatch);
+	IConsoleCmdRegister("list_patches", ConListPatches);
 
 	IConsoleAliasRegister("dir",      "ls");
 	IConsoleAliasRegister("del",      "rm %+");
--- a/src/dedicated.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/dedicated.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -63,6 +63,7 @@
 
 #else
 
+/** Empty helper function call for NOT(UNIX and not MORPHOS) systems */
 void DedicatedFork() {}
 
 #endif /* ENABLE_NETWORK */
--- a/src/depot.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/depot.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -4,8 +4,10 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "vehicle.h"
 #include "depot.h"
 #include "functions.h"
+#include "landscape.h"
 #include "tile.h"
 #include "map.h"
 #include "table/strings.h"
--- a/src/depot.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/depot.h	Sat Jun 02 19:59:29 2007 +0000
@@ -42,7 +42,7 @@
 	depot->xy = 0;
 }
 
-void ShowDepotWindow(TileIndex tile, byte type);
+void ShowDepotWindow(TileIndex tile, VehicleType type);
 
 #define FOR_ALL_DEPOTS_FROM(d, start) for (d = GetDepot(start); d != NULL; d = (d->index + 1U < GetDepotPoolSize()) ? GetDepot(d->index + 1U) : NULL) if (IsValidDepot(d))
 #define FOR_ALL_DEPOTS(d) FOR_ALL_DEPOTS_FROM(d, 0)
--- a/src/depot_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/depot_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -137,6 +137,7 @@
 		case VEH_ROAD:     CcCloneRoadVeh( true, tile, p1, p2); break;
 		case VEH_SHIP:     CcCloneShip(    true, tile, p1, p2); break;
 		case VEH_AIRCRAFT: CcCloneAircraft(true, tile, p1, p2); break;
+		default: NOT_REACHED();
 	}
 }
 
@@ -176,7 +177,7 @@
 
 	switch (v->type) {
 		case VEH_TRAIN:
-			DrawTrainImage(v, x + 21, sprite_y, w->widget[DEPOT_WIDGET_MATRIX].right - 32, w->hscroll.pos, WP(w,depot_d).sel);
+			DrawTrainImage(v, x + 21, sprite_y, w->hscroll.cap + 4, w->hscroll.pos, WP(w,depot_d).sel);
 
 			/* Number of wagons relative to a standard length wagon (rounded up) */
 			SetDParam(0, (v->u.rail.cached_total_length + 7) / 8);
@@ -487,10 +488,10 @@
 
 	if (v == NULL) return;
 
-	if (v->type == VEH_TRAIN && !IsFrontEngine(v)) {
+	if (v->HasFront() && !v->IsPrimaryVehicle()) {
 		v = GetFirstVehicleInChain(v);
 		/* Do nothing when clicking on a train in depot with no loc attached */
-		if (!IsFrontEngine(v)) return;
+		if (v->type == VEH_TRAIN && !IsFrontEngine(v)) return;
 	}
 
 	switch (v->type) {
@@ -535,9 +536,9 @@
 		case VEH_TRAIN:
 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_8800_TRAIN_DEPOT;
 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_TRAIN_TIP;
-			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_TRAIN_TIP;
+			w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_TRAIN_TIP;
 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE;
-			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP;
+			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP;
 			w->widget[DEPOT_WIDGET_MATRIX].tooltips   = STR_883F_TRAINS_CLICK_ON_TRAIN_FOR;
 
 			w->widget[DEPOT_WIDGET_BUILD].data        = STR_8815_NEW_VEHICLES;
@@ -559,9 +560,9 @@
 		case VEH_ROAD:
 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_9003_ROAD_VEHICLE_DEPOT;
 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_ROADVEH_TIP;
-			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_ROADVEH_TIP;
+			w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_ROADVEH_TIP;
 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_9024_DRAG_ROAD_VEHICLE_TO_HERE;
-			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP;
+			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP;
 			w->widget[DEPOT_WIDGET_MATRIX].tooltips   = STR_9022_VEHICLES_CLICK_ON_VEHICLE;
 
 			w->widget[DEPOT_WIDGET_BUILD].data        = STR_9004_NEW_VEHICLES;
@@ -583,9 +584,9 @@
 		case VEH_SHIP:
 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_9803_SHIP_DEPOT;
 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_SHIP_TIP;
-			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_SHIP_TIP;
+			w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_DEPOT_SHIP_TIP;
 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_9821_DRAG_SHIP_TO_HERE_TO_SELL;
-			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP;
+			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP;
 			w->widget[DEPOT_WIDGET_MATRIX].tooltips   = STR_981F_SHIPS_CLICK_ON_SHIP_FOR;
 
 			w->widget[DEPOT_WIDGET_BUILD].data        = STR_9804_NEW_SHIPS;
@@ -607,9 +608,9 @@
 		case VEH_AIRCRAFT:
 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_A002_AIRCRAFT_HANGAR;
 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_HANGAR_TIP;
-			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_HANGAR_TIP;
+			w->widget[DEPOT_WIDGET_START_ALL].tooltips= STR_MASS_START_HANGAR_TIP;
 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_A023_DRAG_AIRCRAFT_TO_HERE_TO;
-			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP;
+			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips = STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP;
 			w->widget[DEPOT_WIDGET_MATRIX].tooltips   = STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT;
 
 			w->widget[DEPOT_WIDGET_BUILD].data        = STR_A003_NEW_AIRCRAFT;
@@ -638,7 +639,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},
 /* VEH_ROAD */     {5, 5},
 /* VEH_SHIP */     {3, 3},
 /* VEH_AIRCRAFT */ {3, 4},
@@ -656,7 +657,7 @@
 	_block_sizes[VEH_ROAD][1] = GetVehicleListHeight(VEH_ROAD);
 }
 
-static void ResizeDefaultWindowSize(byte type)
+static void ResizeDefaultWindowSize(VehicleType type)
 {
 	EngineID engine;
 	uint max_width  = 0;
@@ -696,7 +697,7 @@
 	ResizeDefaultWindowSize(VEH_AIRCRAFT);
 }
 
-static void CreateDepotListWindow(Window *w, byte type)
+static void CreateDepotListWindow(Window *w, VehicleType type)
 {
 	WP(w, depot_d).type = type;
 	_backup_orders_tile = 0;
@@ -719,8 +720,9 @@
 				 _block_sizes[type][1] * w->vscroll.cap);
 
 	if (type == VEH_TRAIN) {
-		/* The train depot has a horizontal scroller so we should make room for it */
-		ResizeWindow(w, 0, 12);
+		/* Make space for the horizontal scrollbar vertically, and the unit
+		 * number, flag, and length counter horizontally. */
+		ResizeWindow(w, 36, 12);
 		/* substract the newly added space from the matrix since it was meant for the scrollbar */
 		w->widget[DEPOT_WIDGET_MATRIX].bottom -= 12;
 	}
@@ -973,7 +975,7 @@
  * @param tile The tile where the depot/hangar is located
  * @param type The type of vehicles in the depot
  */
-void ShowDepotWindow(TileIndex tile, byte type)
+void ShowDepotWindow(TileIndex tile, VehicleType type)
 {
 	Window *w;
 
--- a/src/direction.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/direction.h	Sat Jun 02 19:59:29 2007 +0000
@@ -24,7 +24,7 @@
 
 /** Define basic enum properties */
 template <> struct EnumPropsT<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {};
-typedef TinyEnumT<Direction> DirectionByte;
+typedef TinyEnumT<Direction> DirectionByte; //typedefing-enumification of Direction
 
 static inline Direction ReverseDir(Direction d)
 {
@@ -73,7 +73,7 @@
 
 /** Define basic enum properties */
 template <> struct EnumPropsT<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {};
-typedef TinyEnumT<DiagDirection> DiagDirectionByte;
+typedef TinyEnumT<DiagDirection> DiagDirectionByte; //typedefing-enumification of DiagDirection
 
 static inline DiagDirection ReverseDiagDir(DiagDirection d)
 {
@@ -137,7 +137,9 @@
 
 /**
  * Convert an axis and a flag for north/south into a DiagDirection
+ * @param xy axis to convert
  * @param ns north -> 0, south -> 1
+ * @return the desired DiagDirection
  */
 static inline DiagDirection XYNSToDiagDir(Axis xy, uint ns)
 {
--- a/src/disaster_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/disaster_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -19,6 +19,7 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
+#include "landscape.h"
 #include "industry_map.h"
 #include "station_map.h"
 #include "table/strings.h"
@@ -116,23 +117,18 @@
 	v->cur_image = img;
 }
 
-
 /** Initialize a disaster vehicle. These vehicles are of type VEH_DISASTER, are unclickable
  * and owned by nobody */
 static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, Direction direction, byte subtype)
 {
-	v->type = VEH_DISASTER;
+	v = new (v) DisasterVehicle();
 	v->x_pos = x;
 	v->y_pos = y;
 	v->z_pos = z;
 	v->tile = TileVirtXY(x, y);
 	v->direction = direction;
 	v->subtype = subtype;
-	v->x_offs = -1;
-	v->y_offs = -1;
-	v->sprite_width = 2;
-	v->sprite_height = 2;
-	v->z_height = 5;
+	v->UpdateDeltaXY(INVALID_DIR);
 	v->owner = OWNER_NONE;
 	v->vehstatus = VS_UNCLICKABLE;
 	v->u.disaster.image_override = 0;
@@ -233,7 +229,7 @@
 
 				SetDParam(0, GetStationIndex(tile));
 				AddNewsItem(STR_B000_ZEPPELIN_DISASTER_AT,
-					NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
+					NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
 					v->index,
 					0);
 			}
@@ -263,7 +259,7 @@
 
 	x = v->x_pos;
 	y = v->y_pos;
-	z = GetSlopeZ(x,y);
+	z = GetSlopeZ(x, y);
 	if (z < v->z_pos) z = v->z_pos - 1;
 	SetDisasterVehiclePos(v, x, y, z);
 
@@ -359,14 +355,14 @@
 		if (dist <= TILE_SIZE && z > u->z_pos) z--;
 		SetDisasterVehiclePos(v, gp.x, gp.y, z);
 
-		if (z <= u->z_pos && (u->vehstatus & VS_HIDDEN)==0) {
+		if (z <= u->z_pos && (u->vehstatus & VS_HIDDEN) == 0) {
 			v->age++;
 			if (u->u.road.crashed_ctr == 0) {
 				u->u.road.crashed_ctr++;
 				u->vehstatus |= VS_CRASHED;
 
 				AddNewsItem(STR_B001_ROAD_VEHICLE_DESTROYED,
-					NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
+					NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
 					u->index,
 					0);
 			}
@@ -441,7 +437,7 @@
 			DestructIndustry(i);
 
 			SetDParam(0, i->town->index);
-			AddNewsItem(STR_B002_OIL_REFINERY_EXPLOSION, NEWS_FLAGS(NM_THIN,NF_VIEWPORT|NF_TILE,NT_ACCIDENT,0), i->xy, 0);
+			AddNewsItem(STR_B002_OIL_REFINERY_EXPLOSION, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy, 0);
 			SndPlayTileFx(SND_12_EXPLOSION, i->xy);
 		}
 	} else if (v->current_order.dest == 0) {
@@ -460,7 +456,7 @@
 		ind = GetIndustryIndex(tile);
 		v->dest_tile = ind;
 
-		if (GetIndustry(ind)->type == IT_OIL_REFINERY) {
+		if (GetIndustrySpec(GetIndustry(ind)->type)->behaviour & INDUSTRYBEH_AIRPLANE_ATTACKS) {
 			v->current_order.dest = 1;
 			v->age = 0;
 		}
@@ -514,7 +510,7 @@
 			DestructIndustry(i);
 
 			SetDParam(0, i->town->index);
-			AddNewsItem(STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS, NEWS_FLAGS(NM_THIN,NF_VIEWPORT|NF_TILE,NT_ACCIDENT,0), i->xy, 0);
+			AddNewsItem(STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy, 0);
 			SndPlayTileFx(SND_12_EXPLOSION, i->xy);
 		}
 	} else if (v->current_order.dest == 0) {
@@ -533,7 +529,7 @@
 		ind = GetIndustryIndex(tile);
 		v->dest_tile = ind;
 
-		if (GetIndustry(ind)->type == IT_FACTORY) {
+		if (GetIndustrySpec(GetIndustry(ind)->type)->behaviour & INDUSTRYBEH_CHOPPER_ATTACKS) {
 			v->current_order.dest = 1;
 			v->age = 0;
 		}
@@ -600,7 +596,7 @@
 		t = ClosestTownFromTile(v->dest_tile, (uint)-1);
 		SetDParam(0, t->index);
 		AddNewsItem(STR_B004_UFO_LANDS_NEAR,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_ACCIDENT, 0),
+			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0),
 			v->tile,
 			0);
 
@@ -718,7 +714,7 @@
 
 	tile = v->tile + TileOffsByDiagDir(DirToDiagDir(v->direction));
 	if (IsValidTile(tile)) {
-		TrackdirBits r = (TrackdirBits)GetTileTrackStatus(tile, TRANSPORT_WATER);
+		TrackdirBits r = (TrackdirBits)GetTileTrackStatus(tile, TRANSPORT_WATER, 0);
 
 		if (TrackdirBitsToTrackBits(r) == TRACK_BIT_ALL && !CHANCE16(1, 90)) {
 			GetNewVehiclePosResult gp = GetNewVehiclePos(v);
@@ -829,7 +825,7 @@
 	found = NULL;
 
 	FOR_ALL_INDUSTRIES(i) {
-		if (i->type == IT_OIL_REFINERY &&
+		if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_AIRPLANE_ATTACKS) &&
 				(found == NULL || CHANCE16(1, 2))) {
 			found = i;
 		}
@@ -865,7 +861,7 @@
 	found = NULL;
 
 	FOR_ALL_INDUSTRIES(i) {
-		if (i->type == IT_FACTORY &&
+		if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CHOPPER_ATTACKS) &&
 				(found == NULL || CHANCE16(1, 2))) {
 			found = i;
 		}
@@ -951,7 +947,7 @@
 static void Disaster_Big_Submarine_Init()
 {
 	Vehicle *v = ForceAllocateSpecialVehicle();
-	int x,y;
+	int x, y;
 	Direction dir;
 	uint32 r;
 
@@ -983,10 +979,10 @@
 		const Industry *i;
 
 		FOR_ALL_INDUSTRIES(i) {
-			if (i->type == IT_COAL_MINE && --index < 0) {
+			if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CAN_SUBSIDENCE) && --index < 0) {
 				SetDParam(0, i->town->index);
 				AddNewsItem(STR_B005_COAL_MINE_SUBSIDENCE_LEAVES,
-					NEWS_FLAGS(NM_THIN,NF_VIEWPORT|NF_TILE,NT_ACCIDENT,0), i->xy + TileDiffXY(1, 1), 0);
+					NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy + TileDiffXY(1, 1), 0);
 
 				{
 					TileIndex tile = i->xy;
@@ -1065,3 +1061,12 @@
 {
 	ResetDisasterDelay();
 }
+
+void DisasterVehicle::UpdateDeltaXY(Direction direction)
+{
+	this->x_offs        = -1;
+	this->y_offs        = -1;
+	this->sprite_width  =  2;
+	this->sprite_height =  2;
+	this->z_height      =  5;
+}
--- a/src/dock_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/dock_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -38,7 +38,7 @@
 
 static void PlaceDocks_Dock(TileIndex tile)
 {
-	DoCommandP(tile, 0, 0, CcBuildDocks, CMD_BUILD_DOCK | CMD_AUTO | CMD_MSG(STR_9802_CAN_T_BUILD_DOCK_HERE));
+	DoCommandP(tile, _ctrl_pressed, 0, CcBuildDocks, CMD_BUILD_DOCK | CMD_AUTO | CMD_MSG(STR_9802_CAN_T_BUILD_DOCK_HERE));
 }
 
 static void PlaceDocks_Depot(TileIndex tile)
@@ -53,12 +53,12 @@
 
 static void PlaceDocks_DemolishArea(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_DemolishArea);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_DEMOLISH_AREA);
 }
 
 static void PlaceDocks_BuildCanal(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_OR_Y);
+	VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_CREATE_WATER);
 }
 
 static void PlaceDocks_BuildLock(TileIndex tile)
@@ -147,16 +147,20 @@
 		break;
 
 	case WE_PLACE_DRAG: {
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata);
+		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		return;
 	}
 
 	case WE_PLACE_MOUSEUP:
 		if (e->we.place.pt.x != -1) {
-			if ((e->we.place.userdata & 0xF) == VPM_X_AND_Y) { // dragged actions
-				GUIPlaceProcDragXY(e);
-			} else if (e->we.place.userdata == VPM_X_OR_Y) {
-				DoCommandP(e->we.place.tile, e->we.place.starttile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_CANALS));
+			switch (e->we.place.select_proc) {
+				case DDSP_DEMOLISH_AREA:
+					GUIPlaceProcDragXY(e);
+					break;
+				case DDSP_CREATE_WATER:
+					DoCommandP(e->we.place.tile, e->we.place.starttile, 0, CcBuildCanal, CMD_BUILD_CANAL | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_CANALS));
+					break;
+				default: break;
 			}
 		}
 		break;
@@ -165,10 +169,10 @@
 		RaiseWindowButtons(w);
 
 		w = FindWindowById(WC_BUILD_STATION, 0);
-		if (w != NULL) WP(w,def_d).close = true;
+		if (w != NULL) WP(w, def_d).close = true;
 
 		w = FindWindowById(WC_BUILD_DEPOT, 0);
-		if (w != NULL) WP(w,def_d).close = true;
+		if (w != NULL) WP(w, def_d).close = true;
 		break;
 
 	case WE_PLACE_PRESIZE: {
@@ -233,7 +237,7 @@
 	case WE_PAINT: {
 		int rad;
 
-		if (WP(w,def_d).close) return;
+		if (WP(w, def_d).close) return;
 		DrawWindowWidgets(w);
 
 		rad = (_patches.modified_catchment) ? CA_DOCK : 4;
@@ -260,7 +264,7 @@
 		break;
 
 	case WE_MOUSELOOP:
-		if (WP(w,def_d).close) {
+		if (WP(w, def_d).close) {
 			DeleteWindow(w);
 			return;
 		}
@@ -269,7 +273,7 @@
 		break;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
@@ -335,11 +339,11 @@
 	} break;
 
 	case WE_MOUSELOOP:
-		if (WP(w,def_d).close) DeleteWindow(w);
+		if (WP(w, def_d).close) DeleteWindow(w);
 		break;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
--- a/src/dummy_land.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/dummy_land.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -63,7 +63,7 @@
 	/* not used */
 }
 
-static uint32 GetTileTrackStatus_Dummy(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Dummy(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	return 0;
 }
--- a/src/economy.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/economy.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -6,6 +6,7 @@
 #include "openttd.h"
 #include "currency.h"
 #include "functions.h"
+#include "landscape.h"
 #include "strings.h" // XXX InjectDParam()
 #include "table/strings.h"
 #include "table/sprites.h"
@@ -37,6 +38,7 @@
 #include "date.h"
 #include "cargotype.h"
 #include "player_face.h"
+#include "group.h"
 
 /* Score info */
 const ScoreInfo _score_info[] = {
@@ -115,10 +117,7 @@
 
 		FOR_ALL_VEHICLES(v) {
 			if (v->owner != owner) continue;
-			if ((v->type == VEH_TRAIN && IsFrontEngine(v)) ||
-					 v->type == VEH_ROAD ||
-					(v->type == VEH_AIRCRAFT && IsNormalAircraft(v)) ||
-					 v->type == VEH_SHIP) {
+			if (IsPlayerBuildableVehicleType(v->type) && v->IsPrimaryVehicle()) {
 				num++;
 				if (v->age > 730) {
 					/* Find the vehicle with the lowest amount of profit */
@@ -254,6 +253,41 @@
 {
 	Town *t;
 	PlayerID old = _current_player;
+
+	assert(old_player != new_player);
+
+	{
+		Player *p;
+		uint i;
+
+		/* See if the old_player had shares in other companies */
+		_current_player = old_player;
+		FOR_ALL_PLAYERS(p) {
+			for (i = 0; i < 4; i++) {
+				if (p->share_owners[i] == old_player) {
+					/* Sell his shares */
+					int32 res = DoCommand(0, p->index, 0, DC_EXEC, CMD_SELL_SHARE_IN_COMPANY);
+					/* Because we are in a DoCommand, we can't just execute an other one and
+					 *  expect the money to be removed. We need to do it ourself! */
+					SubtractMoneyFromPlayer(res);
+				}
+			}
+		}
+
+		/* Sell all the shares that people have on this company */
+		p = GetPlayer(old_player);
+		for (i = 0; i < 4; i++) {
+			_current_player = p->share_owners[i];
+			if (_current_player != PLAYER_SPECTATOR) {
+				/* Sell the shares */
+				int32 res = DoCommand(0, old_player, 0, DC_EXEC, CMD_SELL_SHARE_IN_COMPANY);
+				/* Because we are in a DoCommand, we can't just execute an other one and
+				 *  expect the money to be removed. We need to do it ourself! */
+				SubtractMoneyFromPlayer(res);
+			}
+		}
+	}
+
 	_current_player = old_player;
 
 	/* Temporarily increase the player's money, to be sure that
@@ -323,12 +357,14 @@
 					DeleteVehicle(v);
 				} else {
 					v->owner = new_player;
+					v->group_id = DEFAULT_GROUP;
 					if (IsEngineCountable(v)) GetPlayer(new_player)->num_engines[v->engine_type]++;
 					switch (v->type) {
 						case VEH_TRAIN:    if (IsFrontEngine(v)) v->unitnumber = ++num_train; break;
 						case VEH_ROAD:     v->unitnumber = ++num_road; break;
 						case VEH_SHIP:     v->unitnumber = ++num_ship; break;
 						case VEH_AIRCRAFT: if (IsNormalAircraft(v)) v->unitnumber = ++num_aircraft; break;
+						default: NOT_REACHED();
 					}
 				}
 			}
@@ -346,25 +382,6 @@
 	/* Change color of existing windows */
 	if (new_player != PLAYER_SPECTATOR) ChangeWindowOwner(old_player, new_player);
 
-	{
-		Player *p;
-		uint i;
-
-		/* Check for shares */
-		FOR_ALL_PLAYERS(p) {
-			for (i = 0; i < 4; i++) {
-				/* 'Sell' the share if this player has any */
-				if (p->share_owners[i] == _current_player) {
-					p->share_owners[i] = PLAYER_SPECTATOR;
-				}
-			}
-		}
-		p = GetPlayer(_current_player);
-		/* Sell all the shares that people have on this company */
-		for (i = 0; i < 4; i++)
-			p->share_owners[i] = PLAYER_SPECTATOR;
-	}
-
 	_current_player = old;
 
 	MarkWholeScreenDirty();
@@ -939,6 +956,7 @@
 static void FindSubsidyCargoRoute(FoundRoute *fr)
 {
 	Industry *i;
+	const IndustrySpec *ind;
 	int trans, total;
 	CargoID cargo;
 
@@ -946,14 +964,15 @@
 
 	fr->from = i = GetRandomIndustry();
 	if (i == NULL) return;
+	ind = GetIndustrySpec(i->type);
 
 	/* Randomize cargo type */
-	if (Random()&1 && i->produced_cargo[1] != CT_INVALID) {
-		cargo = i->produced_cargo[1];
+	if (HASBIT(Random(), 0) && ind->produced_cargo[1] != CT_INVALID) {
+		cargo = ind->produced_cargo[1];
 		trans = i->pct_transported[1];
 		total = i->total_production[1];
 	} else {
-		cargo = i->produced_cargo[0];
+		cargo = ind->produced_cargo[0];
 		trans = i->pct_transported[0];
 		total = i->total_production[0];
 	}
@@ -980,13 +999,19 @@
 	} else {
 		/* The destination is an industry */
 		Industry *i2 = GetRandomIndustry();
+		if (i2 == NULL) {
+			return;
+		}
+
+		ind = GetIndustrySpec(i2->type);
 
 		/* The industry must accept the cargo */
-		if (i == i2 || i == NULL ||
-				(cargo != i2->accepts_cargo[0] &&
-				cargo != i2->accepts_cargo[1] &&
-				cargo != i2->accepts_cargo[2]))
+		if (i == i2 ||
+				(cargo != ind->accepts_cargo[0] &&
+				cargo != ind->accepts_cargo[1] &&
+				cargo != ind->accepts_cargo[2])) {
 			return;
+		}
 		fr->distance = DistanceManhattan(i->xy, i2->xy);
 		fr->to = i2;
 	}
@@ -1117,6 +1142,23 @@
 	const CargoSpec *cs = GetCargo(cargo_type);
 	byte f;
 
+	/* Use callback to calculate cargo profit, if available */
+	if (HASBIT(cs->callback_mask, CBM_CARGO_PROFIT_CALC)) {
+		uint32 var18 = min(dist, 0xFFFF) | (min(num_pieces, 0xFF) << 16) | (transit_days << 24);
+		uint16 callback = GetCargoCallback(CBID_CARGO_PROFIT_CALC, 0, var18, cs);
+		if (callback != CALLBACK_FAILED) {
+			int result = GB(callback, 0, 14);
+
+			/* Simulate a 15 bit signed value */
+			if (HASBIT(callback, 14)) result = 0x4000 - result;
+
+			/* "The result should be a signed multiplier that gets multiplied
+			 * by the amount of cargo moved and the price factor, then gets
+			 * divided by 8192." */
+			return result * num_pieces * _cargo_payment_rates[cargo_type] / 8192;
+		}
+	}
+
 	/* zero the distance if it's the bank and very short transport. */
 	if (_opt.landscape == LT_TEMPERATE && cs->label == 'VALU' && dist < 10)
 		dist = 0;
@@ -1143,34 +1185,48 @@
 
 static void DeliverGoodsToIndustry(TileIndex xy, CargoID cargo_type, int num_pieces)
 {
-	Industry* best = NULL;
-	Industry* ind;
-	uint u;
+	Industry *best = NULL;
+	Industry *ind;
+	const IndustrySpec *indspec;
+	uint best_dist;
+	uint accepted_cargo_index = 0;  ///< unlikely value, just for warning removing
 
 	/* 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;
+	best_dist = (_patches.station_spread + 8) * 2;
 	FOR_ALL_INDUSTRIES(ind) {
-		uint t;
+		indspec = GetIndustrySpec(ind->type);
+		uint i;
 
-		if (( cargo_type == ind->accepts_cargo[0] ||
-					cargo_type == ind->accepts_cargo[1] ||
-					cargo_type == ind->accepts_cargo[2]
-				) &&
-				ind->produced_cargo[0] != CT_INVALID &&
-				ind->produced_cargo[0] != cargo_type &&
-				(t = DistanceManhattan(ind->xy, xy)) < u) {
-			u = t;
+		if (indspec->produced_cargo[0] == CT_INVALID) continue;
+
+		for (i = 0; i < lengthof(indspec->accepts_cargo); i++) {
+			if (cargo_type == indspec->accepts_cargo[i] &&
+					(indspec->input_cargo_multiplier[i][0] != 0 || indspec->input_cargo_multiplier[i][1] != 0)) {
+				break;
+			}
+		}
+
+		/* Check if matching cargo has been found */
+		if (i == lengthof(indspec->accepts_cargo)) continue;
+
+		uint dist = DistanceManhattan(ind->xy, xy);
+
+		if (dist < best_dist) {
 			best = ind;
+			best_dist = dist;
+			accepted_cargo_index = i;
 		}
 	}
 
 	/* Found one? */
 	if (best != NULL) {
+		indspec = GetIndustrySpec(best->type);
 		best->was_cargo_delivered = true;
-		best->cargo_waiting[0] = min(best->cargo_waiting[0] + num_pieces, 0xFFFF);
+		best->cargo_waiting[0] = min(best->cargo_waiting[0] + (num_pieces * indspec->input_cargo_multiplier[accepted_cargo_index][0] / 256), 0xFFFF);
+		best->cargo_waiting[1] = min(best->cargo_waiting[1] + (num_pieces * indspec->input_cargo_multiplier[accepted_cargo_index][1] / 256), 0xFFFF);
 	}
 }
 
@@ -1289,215 +1345,222 @@
 	return profit;
 }
 
-/*
- * Returns true if Vehicle v should wait loading because other vehicle is
- * already loading the same cargo type
- * v = vehicle to load, u = GetFirstInChain(v)
+/**
+ * Performs the vehicle payment _and_ marks the vehicle to be unloaded.
+ * @param front_v the vehicle to be unloaded
  */
-static bool LoadWait(const Vehicle* v, const Vehicle* u)
+void VehiclePayment(Vehicle *front_v)
 {
-	const Vehicle *w;
-	const Vehicle *x;
-	bool has_any_cargo = false;
-
-	if (!(u->current_order.flags & OF_FULL_LOAD)) return false;
+	int result = 0;
 
-	for (w = u; w != NULL; w = w->next) {
-		if (w->cargo_count != 0) {
-			if (v->cargo_type == w->cargo_type &&
-					u->last_station_visited == w->cargo_source) {
-				return false;
+	int profit = 0;
+	int total_veh_profit = 0;         // accumulates the profit across the vehicle chain (used by trains)
+	int32 route_profit = 0;           // the grand total amount for the route. A-D of transfer chain A-B-C-D
+	int virtual_profit = 0;           // virtual profit of one vehicle element for feeder systems
+	int virtual_profit_total = 0;     // virtual profit for entire vehicle chain
+	int total_cargo_feeder_share = 0; // the feeder cash amount for the goods being loaded/unloaded in this load step
+
+	int all_vehicles_cargo_feeder_share = front_v->cargo_feeder_share; // used to hold transfer value of complete vehicle chain - used by trains
+
+	StationID last_visited = front_v->last_station_visited;
+	Station *st = GetStation(last_visited);
+
+	/* The owner of the train wants to be paid */
+	PlayerID old_player = _current_player;
+	_current_player = front_v->owner;
+
+	/* At this moment loading cannot be finished */
+	CLRBIT(front_v->vehicle_flags, VF_LOADING_FINISHED);
+
+	/* Start unloading in at the first possible moment */
+	front_v->load_unload_time_rem = 1;
+
+	for (Vehicle *v = front_v; v != NULL; v = v->next) {
+		/* No cargo to unload */
+		if (v->cargo_cap == 0 || v->cargo_count == 0) continue;
+
+		SETBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+		/* All cargo has already been paid for, no need to pay again */
+		if (v->cargo_count == v->cargo_paid_for) continue;
+
+		GoodsEntry *ge = &st->goods[v->cargo_type];
+
+		if (v->cargo_source != last_visited &&
+				HASBIT(ge->waiting_acceptance, 15) &&
+				(front_v->current_order.flags & OF_TRANSFER) == 0) {
+			/* Deliver goods to the station */
+			st->time_since_unload = 0;
+
+			/* handle end of route payment */
+			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;
+			route_profit             = profit;                                   // display amount paid for final route delivery, A-D of a chain A-B-C-D
+			total_veh_profit         = profit - all_vehicles_cargo_feeder_share; // whole vehicle is not payed for transfers picked up earlier
+			total_cargo_feeder_share = -all_vehicles_cargo_feeder_share;         // total of transfer fees in vehicle chain needs to be zero at end of unload
+
+			v->cargo_feeder_share = 0;   // clear transfer cost per vehicle
+			result |= 1;
+		} else if (front_v->current_order.flags & (OF_UNLOAD | OF_TRANSFER)) {
+			if ((front_v->current_order.flags & OF_TRANSFER) != 0) {
+				virtual_profit = GetTransportedGoodsIncome(
+					v->cargo_count - v->cargo_paid_for,
+					/* pay transfer vehicle for only the part of transfer it has done: ie. cargo_loaded_at_xy to here */
+					DistanceManhattan(v->cargo_loaded_at_xy, GetStation(last_visited)->xy),
+					v->cargo_days,
+					v->cargo_type);
+
+				front_v->profit_this_year += virtual_profit;
+				ge->feeder_profit         += v->cargo_feeder_share + virtual_profit; // transfer cargo transfer fees to station
+				total_cargo_feeder_share  -= v->cargo_feeder_share; // accumulate deduction of feeder shares
+				v->cargo_feeder_share      = 0;                     // clear transfer cost
+
+				/* keep total of cargo unloaded (pending) for accurate cargoshare calculation on load */
+				SB(ge->unload_pending, 0, 12, GB(ge->unload_pending, 0, 12) + v->cargo_count);
+
+				virtual_profit_total += virtual_profit;   // accumulate transfer profits for whole vehicle
+				v->cargo_paid_for = v->cargo_count;       // record how much of the cargo has been paid for to eliminate double counting
 			}
-			has_any_cargo = true;
+			result |= 2;
 		}
 	}
 
-	FOR_ALL_VEHICLES(x) {
-		if ((x->type != VEH_TRAIN || IsFrontEngine(x)) && // for all locs
-				u->last_station_visited == x->last_station_visited && // at the same station
-				!(x->vehstatus & (VS_STOPPED | VS_CRASHED)) && // not stopped or crashed
-				x->current_order.type == OT_LOADING && // loading
-				u != x) { // not itself
-			bool other_has_any_cargo = false;
-			bool has_space_for_same_type = false;
-			bool other_has_same_type = false;
+	/* Ensure a negative total is only applied to the vehicle if there is value to reduce. */
+	front_v->cargo_feeder_share = max(front_v->cargo_feeder_share + total_cargo_feeder_share, 0);
 
-			for (w = x; w != NULL; w = w->next) {
-				if (w->cargo_count < w->cargo_cap && v->cargo_type == w->cargo_type) {
-					has_space_for_same_type = true;
-				}
-
-				if (w->cargo_count != 0) {
-					if (v->cargo_type == w->cargo_type &&
-							u->last_station_visited == w->cargo_source) {
-						other_has_same_type = true;
-					}
-					other_has_any_cargo = true;
-				}
-			}
-
-			if (has_space_for_same_type) {
-				if (other_has_same_type) return true;
-				if (other_has_any_cargo && !has_any_cargo) return true;
-			}
-		}
+	if (virtual_profit_total > 0) {
+		ShowFeederIncomeAnimation(front_v->x_pos, front_v->y_pos, front_v->z_pos, virtual_profit_total);
 	}
 
-	return false;
+	if (route_profit != 0) {
+		front_v->profit_this_year += total_veh_profit;
+		SubtractMoneyFromPlayer(-route_profit);
+
+		if (IsLocalPlayer() && !PlayVehicleSound(front_v, VSE_LOAD_UNLOAD)) {
+			SndPlayVehicleFx(SND_14_CASHTILL, front_v);
+		}
+
+		ShowCostOrIncomeAnimation(front_v->x_pos, front_v->y_pos, front_v->z_pos, -total_veh_profit);
+	}
+
+	_current_player = old_player;
 }
 
-int LoadUnloadVehicle(Vehicle *v, bool just_arrived)
+/**
+ * Loads/unload the vehicle if possible.
+ * @param v the vehicle to be (un)loaded
+ * @param cargo_left the amount of each cargo type that is
+ *                   virtually left on the platform to be
+ *                   picked up by another vehicle when all
+ *                   previous vehicles have loaded.
+ */
+static void LoadUnloadVehicle(Vehicle *v, int *cargo_left)
 {
-	int profit = 0;
-	int total_veh_profit = 0;      // accumulates the profit across the vehicle chain (used by trains)
-	int32 route_profit = 0;        // the grand total amount for the route. A-D of transfer chain A-B-C-D
-	int virtual_profit = 0;        // virtual profit of one vehicle element for feeder systems
-	int virtual_profit_total = 0;  // virtual profit for entire vehicle chain
-	int total_cargo_feeder_share = 0;  // the feeder cash amount for the goods being loaded/unloaded in this load step
+	assert(v->current_order.type == OT_LOADING);
 
-	int unloading_time = 20;
+	/* We have not waited enough time till the next round of loading/unloading */
+	if (--v->load_unload_time_rem != 0) {
+		if (_patches.improved_load && HASBIT(v->current_order.flags, OFB_FULL_LOAD)) {
+			/* 'Reserve' this cargo for this vehicle, because we were first. */
+			for (; v != NULL; v = v->next) {
+				if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo_count;
+			}
+		}
+		return;
+	}
+
+	int unloading_time = 0;
 	Vehicle *u = v;
 	int result = 0;
-	int t;
-	uint count, cap;
-	PlayerID old_player;
-	bool completely_empty = true;
-	byte load_amount;
-	bool anything_loaded = false;
+	int cap;
 
-	assert(v->current_order.type == OT_LOADING);
+	bool completely_empty  = true;
+	bool anything_unloaded = false;
+	bool anything_loaded   = false;
+	uint32 cargo_not_full  = 0;
+	uint32 cargo_full      = 0;
+	int total_cargo_feeder_share = 0; // the feeder cash amount for the goods being loaded/unloaded in this load step
 
 	v->cur_speed = 0;
 
-	/* Loading can only have finished when all the cargo has been unloaded, and
-	 * there is nothing left to load. It's easier to clear this if the
-	 * conditions haven't been met than attempting to check them all before
-	 * enabling though. */
-	SETBIT(v->vehicle_flags, VF_LOADING_FINISHED);
-
-	old_player = _current_player;
-	_current_player = v->owner;
-
 	StationID last_visited = v->last_station_visited;
 	Station *st = GetStation(last_visited);
 
-	int all_vehicles_cargo_feeder_share = v->cargo_feeder_share; // used to hold transfer value of complete vehicle chain - used by trains
+	for (; v != NULL; v = v->next) {
+		if (v->cargo_cap == 0) continue;
 
-	for (; v != NULL; v = v->next) {
-		GoodsEntry* ge;
-		load_amount = EngInfo(v->engine_type)->load_amount;
+		byte load_amount = EngInfo(v->engine_type)->load_amount;
 		if (_patches.gradual_loading && HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_LOAD_AMOUNT)) {
 			uint16 cb_load_amount = GetVehicleCallback(CBID_VEHICLE_LOAD_AMOUNT, 0, 0, v->engine_type, v);
 			if (cb_load_amount != CALLBACK_FAILED) load_amount = cb_load_amount & 0xFF;
 		}
 
-		if (v->cargo_cap == 0) continue;
-
-		/* If the vehicle has just arrived, set it to unload. */
-		if (just_arrived) SETBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+		GoodsEntry *ge = &st->goods[v->cargo_type];
+		int count = GB(ge->waiting_acceptance, 0, 12);
 
-		ge = &st->goods[v->cargo_type];
-		count = GB(ge->waiting_acceptance, 0, 12);
-
-		/* unload? */
-		if (v->cargo_count != 0 && HASBIT(v->vehicle_flags, VF_CARGO_UNLOADING)) {
+		if (HASBIT(v->vehicle_flags, VF_CARGO_UNLOADING)) {
 			uint16 amount_unloaded = _patches.gradual_loading ? min(v->cargo_count, load_amount) : v->cargo_count;
 
-			CLRBIT(u->vehicle_flags, VF_LOADING_FINISHED);
-
 			if (v->cargo_source != last_visited && ge->waiting_acceptance & 0x8000 && !(u->current_order.flags & OF_TRANSFER)) {
-				/* deliver goods to the station */
-				st->time_since_unload = 0;
-
-				unloading_time += v->cargo_count; // TTDBUG: bug in original TTD
-
-				/* handle end of route payment */
-				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;
-					route_profit = profit;       // display amount paid for final route delivery, A-D of a chain A-B-C-D
-					total_veh_profit = profit - all_vehicles_cargo_feeder_share;  // whole vehicle is not payed for transfers picked up earlier
-					total_cargo_feeder_share = -all_vehicles_cargo_feeder_share;  // total of transfer fees in vehicle chain needs to be zero at end of unload
-					v->cargo_feeder_share = 0;   // clear transfer cost per vehicle
-				}
 				result |= 1;
-				v->cargo_count -= amount_unloaded;
-				v->cargo_paid_for -= min(amount_unloaded, v->cargo_paid_for);
-				if (_patches.gradual_loading) continue;
-
 			} else if (u->current_order.flags & (OF_UNLOAD | OF_TRANSFER)) {
-
-				/* unload goods and let it wait at the station */
-				st->time_since_unload = 0;
-
-				/* handle transfer */
-				if (just_arrived && (u->current_order.flags & OF_TRANSFER) && v->cargo_paid_for < v->cargo_count) {
-					virtual_profit = GetTransportedGoodsIncome(
-						v->cargo_count - v->cargo_paid_for,
-						/* pay transfer vehicle for only the part of transfer it has done: ie. cargo_loaded_at_xy to here */
-						DistanceManhattan(v->cargo_loaded_at_xy, GetStation(last_visited)->xy),
-						v->cargo_days,
-						v->cargo_type);
-
-					ge->feeder_profit += v->cargo_feeder_share;         // transfer cargo transfer fees to station
-					total_cargo_feeder_share -= v->cargo_feeder_share;  // accumulate deduction of feeder shares
-					v->cargo_feeder_share = 0;                          // clear transfer cost
-
-					/* keep total of cargo unloaded (pending) for accurate cargoshare calculation on load */
-					SB(ge->unload_pending, 0, 12, GB(ge->unload_pending, 0, 12) + v->cargo_count);
-
-					virtual_profit_total += virtual_profit;   // accumulate transfer profits for whole vehicle
-					v->cargo_paid_for = v->cargo_count;       // record how much of the cargo has been paid for to eliminate double counting
-				}
-
-				unloading_time += v->cargo_count;
-				t = GB(ge->waiting_acceptance, 0, 12);
-				if (t == 0) {
+				if (count == 0) {
 					/* No goods waiting at station */
-					ge->enroute_time = v->cargo_days;
-					ge->enroute_from = v->cargo_source;
+					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. */
 					if (v->cargo_days >= ge->enroute_time) ge->enroute_time = v->cargo_days;
 
 					if (last_visited != ge->enroute_from) {
-						ge->enroute_from = v->cargo_source;
+						ge->enroute_from    = v->cargo_source;
 						ge->enroute_from_xy = v->cargo_source_xy;
 					}
 				}
-				/* Update amount of waiting cargo */
-				SB(ge->waiting_acceptance, 0, 12, min(amount_unloaded + t, 0xFFF));
+				/* Update amount of waiting cargo. There is, however, no sense in
+				 * updating the count variable because this vehicle will not be
+				 * able to take the cargo. */
+				SB(ge->waiting_acceptance, 0, 12, min(amount_unloaded + count, 0xFFF));
 
 				/* if there is not enough to unload from pending, ensure it does not go -ve
 				 * else deduct amount actually unloaded from unload_pending */
 				SB(ge->unload_pending, 0, 12, max(GB(ge->unload_pending, 0, 12) - amount_unloaded, 0U));
 
-				if (u->current_order.flags & OF_TRANSFER) {
-					ge->feeder_profit += virtual_profit;
-					u->profit_this_year += virtual_profit;
-				}
 				result |= 2;
-				v->cargo_count -= amount_unloaded;
-				v->cargo_paid_for -= min(amount_unloaded, v->cargo_paid_for);
-				if (_patches.gradual_loading) continue;
+			} else {
+				/* The order changed while unloading (unset unload/transfer) or the
+				 * station does not accept goods anymore. */
+				CLRBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+				continue;
 			}
 
-			if (v->cargo_count != 0) completely_empty = false;
-		}
+			/* Deliver goods to the station */
+			st->time_since_unload = 0;
 
-		/* The vehicle must have been unloaded because it is either empty, or
-		 * the UNLOADING bit is already clear in v->vehicle_flags. */
-		CLRBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+			unloading_time += amount_unloaded;
+
+			v->cargo_count -= amount_unloaded;
+			v->cargo_paid_for -= min(amount_unloaded, v->cargo_paid_for);
+
+			anything_unloaded = true;
+			if (_patches.gradual_loading && v->cargo_count != 0) {
+				completely_empty = false;
+			} else {
+				/* We have finished unloading (cargo count == 0) */
+				CLRBIT(v->vehicle_flags, VF_CARGO_UNLOADING);
+			}
+
+			continue;
+		}
 
 		/* We cannot have paid for more cargo than there is on board. */
 		assert(v->cargo_paid_for <= v->cargo_count);
 
-		/* don't pick up goods that we unloaded */
+		/* Do not pick up goods that we unloaded */
 		if (u->current_order.flags & OF_UNLOAD) continue;
 
 		/* update stats */
-		ge->days_since_pickup = 0;
+		int t;
 		switch (u->type) {
 			case VEH_TRAIN: t = u->u.rail.cached_max_speed; break;
 			case VEH_ROAD:  t = u->max_speed / 2;           break;
@@ -1505,6 +1568,7 @@
 		}
 
 		/* if last speed is 0, we treat that as if no vehicle has ever visited the station. */
+		ge->days_since_pickup = 0;
 		ge->last_speed = min(t, 255);
 		ge->last_age = _cur_year - v->build_year;
 
@@ -1513,11 +1577,22 @@
 		if (count != 0 &&
 				(cap = v->cargo_cap - v->cargo_count) != 0) {
 
-			if (v->cargo_count == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO);
-
 			/* Skip loading this vehicle if another train/vehicle is already handling
 			 * the same cargo type at this station */
-			if (_patches.improved_load && (u->current_order.flags & OF_FULL_LOAD) && LoadWait(v,u)) continue;
+			if (_patches.improved_load && cargo_left[v->cargo_type] <= 0) {
+				SETBIT(cargo_not_full, v->cargo_type);
+				continue;
+			}
+
+			if (cap > count) cap = count;
+			if (_patches.gradual_loading) cap = min(cap, load_amount);
+			if (_patches.improved_load) {
+				/* Don't load stuff that is already 'reserved' for other vehicles */
+				cap = min(cargo_left[v->cargo_type], cap);
+				cargo_left[v->cargo_type] -= cap;
+			}
+
+			if (v->cargo_count == 0) TriggerVehicle(v, VEHICLE_TRIGGER_NEW_CARGO);
 
 			/* TODO: Regarding this, when we do gradual loading, we
 			 * should first unload all vehicles and then start
@@ -1529,10 +1604,6 @@
 			completely_empty = false;
 			anything_loaded = true;
 
-			if (cap > count) cap = count;
-			if (_patches.gradual_loading) cap = min(cap, load_amount);
-			if (cap < count) CLRBIT(u->vehicle_flags, VF_LOADING_FINISHED);
-
 			/* cargoshare is proportioned by the amount due to unload
 			 * Otherwise, with gradual loading, 100% of credits would be taken immediately,
 			 * even if the cargo volume represents a tiny percent of the whole.
@@ -1557,31 +1628,54 @@
 			result |= 2;
 			st->last_vehicle_type = v->type;
 		}
+
+		if (v->cargo_count == v->cargo_cap) {
+			SETBIT(cargo_full, v->cargo_type);
+		} else {
+			SETBIT(cargo_not_full, v->cargo_type);
+		}
+	}
+
+	/* We update these variables here, so gradual loading still fills
+	 * all wagons at the same time instead of using the same 'improved'
+	 * loading algorithm for the wagons (only fill wagon when there is
+	 * enough to fill the previous wagons) */
+	if (_patches.improved_load && HASBIT(u->current_order.flags, OFB_FULL_LOAD)) {
+		/* Update left cargo */
+		for (v = u; v != NULL; v = v->next) {
+			if (v->cargo_cap != 0) cargo_left[v->cargo_type] -= v->cargo_cap - v->cargo_count;
+		}
 	}
 
 	v = u;
 
-	/* Ensure a negative total is only applied to the vehicle if there is value to reduce. */
-	if (!((v->cargo_feeder_share == 0) && (total_cargo_feeder_share < 0)))
-		v->cargo_feeder_share += total_cargo_feeder_share;
+	v->cargo_feeder_share += total_cargo_feeder_share;
 
-	if (_patches.gradual_loading) {
-		/* The time it takes to load one 'slice' of cargo or passengers depends
-		 * on the vehicle type - the values here are those found in TTDPatch */
-		uint gradual_loading_wait_time[] = { 40, 20, 10, 20 };
+	if (anything_loaded || anything_unloaded) {
+		if (_patches.gradual_loading) {
+			/* The time it takes to load one 'slice' of cargo or passengers depends
+			* on the vehicle type - the values here are those found in TTDPatch */
+			const uint gradual_loading_wait_time[] = { 40, 20, 10, 20 };
 
-		unloading_time = gradual_loading_wait_time[v->type];
-		if (HASBIT(v->vehicle_flags, VF_LOADING_FINISHED)) {
-			if (anything_loaded) {
-				unloading_time += 20;
-			} else {
-				unloading_time = 20;
+			unloading_time = gradual_loading_wait_time[v->type];
+		}
+	} else {
+		bool finished_loading = true;
+		if (HASBIT(v->current_order.flags, OFB_FULL_LOAD)) {
+			if (_patches.full_load_any) {
+				/* if the aircraft carries passengers and is NOT full, then
+				 * continue loading, no matter how much mail is in */
+				if ((v->type == VEH_AIRCRAFT && IsCargoInClass(v->cargo_type, CC_PASSENGERS) && v->cargo_cap != v->cargo_count) ||
+						(cargo_not_full && (cargo_full & ~cargo_not_full) == 0)) { // There are stull non-full cargos
+					finished_loading = false;
+				}
+			} else if (cargo_not_full != 0) {
+				finished_loading = false;
 			}
 		}
-	}
+		unloading_time = 20;
 
-	if (virtual_profit_total > 0) {
-		ShowFeederIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, virtual_profit_total);
+		SB(v->vehicle_flags, VF_LOADING_FINISHED, 1, finished_loading);
 	}
 
 	if (v->type == VEH_TRAIN) {
@@ -1600,25 +1694,32 @@
 	}
 
 	if (result != 0) {
+		InvalidateWindow(v->GetVehicleListWindowClass(), v->owner);
 		InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
+
 		st->MarkTilesDirty();
+		v->MarkDirty();
 
 		if (result & 2) InvalidateWindow(WC_STATION_VIEW, last_visited);
-
-		if (route_profit != 0) {
-			v->profit_this_year += total_veh_profit;
-			SubtractMoneyFromPlayer(-route_profit);
+	}
+}
 
-			if (IsLocalPlayer() && !PlayVehicleSound(v, VSE_LOAD_UNLOAD)) {
-				SndPlayVehicleFx(SND_14_CASHTILL, v);
-			}
+/**
+ * Load/unload the vehicles in this station according to the order
+ * they entered.
+ * @param st the station to do the loading/unloading for
+ */
+void LoadUnloadStation(Station *st)
+{
+	int cargo_left[NUM_CARGO];
 
-			ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, -total_veh_profit);
-		}
+	for (uint i = 0; i < NUM_CARGO; i++) cargo_left[i] = GB(st->goods[i].waiting_acceptance, 0, 12);
+
+	std::list<Vehicle *>::iterator iter;
+	for (iter = st->loading_vehicles.begin(); iter != st->loading_vehicles.end(); ++iter) {
+		Vehicle *v = *iter;
+		if (!(v->vehstatus & (VS_STOPPED | VS_CRASHED))) LoadUnloadVehicle(v, cargo_left);
 	}
-
-	_current_player = old_player;
-	return result;
 }
 
 void PlayersMonthlyLoop()
@@ -1674,6 +1775,7 @@
 
 /** Acquire shares in an opposing company.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 player to buy the shares from
  * @param p2 unused
  */
@@ -1719,6 +1821,7 @@
 
 /** Sell shares in an opposing company.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 player to sell the shares from
  * @param p2 unused
  */
@@ -1754,18 +1857,23 @@
  * that company.
  * @todo currently this only works for AI players
  * @param tile unused
+ * @param flags type of operation
  * @param p1 player/company to buy up
  * @param p2 unused
  */
 int32 CmdBuyCompany(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Player *p;
+	PlayerID pid = (PlayerID)p1;
 
 	/* Disable takeovers in multiplayer games */
-	if (!IsValidPlayer((PlayerID)p1) || _networking) return CMD_ERROR;
+	if (!IsValidPlayer(pid) || _networking) return CMD_ERROR;
+
+	/* Do not allow players to take over themselves */
+	if (pid == _current_player) return CMD_ERROR;
 
 	SET_EXPENSES_TYPE(EXPENSES_OTHER);
-	p = GetPlayer((PlayerID)p1);
+	p = GetPlayer(pid);
 
 	if (!p->is_ai) return CMD_ERROR;
 
@@ -1785,8 +1893,9 @@
 /** Cargo payment rates */
 static void SaveLoad_CAPR()
 {
-	SlArray(&_cargo_payment_rates,      NUM_CARGO, SLE_INT32);
-	SlArray(&_cargo_payment_rates_frac, NUM_CARGO, SLE_UINT16);
+	uint num_cargo = CheckSavegameVersion(55) ? 12 : NUM_CARGO;
+	SlArray(&_cargo_payment_rates,      num_cargo, SLE_INT32);
+	SlArray(&_cargo_payment_rates_frac, num_cargo, SLE_UINT16);
 }
 
 static const SaveLoad _economy_desc[] = {
--- a/src/economy.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/economy.h	Sat Jun 02 19:59:29 2007 +0000
@@ -68,4 +68,7 @@
 int32 GetTransportedGoodsIncome(uint num_pieces, uint dist, byte transit_days, CargoID cargo_type);
 uint MoveGoodsToStation(TileIndex tile, int w, int h, CargoID type, uint amount);
 
+void VehiclePayment(Vehicle *front_v);
+void LoadUnloadStation(Station *st);
+
 #endif /* ECONOMY_H */
--- a/src/elrail.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/elrail.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -52,6 +52,7 @@
 #include "viewport.h"
 #include "functions.h" /* We should REALLY get rid of this goddamn file, as it is butt-ugly */
 #include "variables.h" /* ... same here */
+#include "landscape.h"
 #include "rail.h"
 #include "debug.h"
 #include "tunnel_map.h"
@@ -248,7 +249,7 @@
 			Track bridgetrack = GetBridgeAxis(ti->tile) == AXIS_X ? TRACK_X : TRACK_Y;
 			uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
 
-			if ((height <= TilePixelHeight(ti->tile) + TILE_HEIGHT) &&
+			if ((height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) &&
 					(i == PCPpositions[bridgetrack][0] || i == PCPpositions[bridgetrack][1])) {
 				SETBIT(OverridePCP, i);
 			}
@@ -269,7 +270,14 @@
 						continue; /* No neighbour, go looking for a better position */
 					}
 
-					AddSortableSpriteToDraw(pylons_normal[temp], PAL_NONE, x, y, 1, 1, 10,
+					SpriteID img = pylons_normal[temp];
+					SpriteID pal = PAL_NONE;
+					if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
+						SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+						pal = PALETTE_TO_TRANSPARENT;
+					}
+
+					AddSortableSpriteToDraw(img, pal, x, y, 1, 1, 10,
 							GetSlopeZ(ti->x + x_pcp_offsets[i], ti->y + y_pcp_offsets[i]));
 					break; /* We already have drawn a pylon, bail out */
 				}
@@ -278,10 +286,10 @@
 	}
 
 	/* Don't draw a wire under a low bridge */
-	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !(_display_opt & DO_TRANS_BUILDINGS)) {
+	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !HASBIT(_transparent_opt, TO_BUILDINGS)) {
 		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
 
-		if (height <= TilePixelHeight(ti->tile) + TILE_HEIGHT) return;
+		if (height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) return;
 	}
 
 	/* Drawing of pylons is finished, now draw the wires */
@@ -307,7 +315,14 @@
 			assert(!IsSteepSlope(tileh[TS_HOME]));
 			sss = &CatenarySpriteData[Wires[tileh_selector][t][PCPconfig]];
 
-			AddSortableSpriteToDraw( sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
+			SpriteID img = sss->image;
+			SpriteID pal = PAL_NONE;
+			if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
+				SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+				pal = PALETTE_TO_TRANSPARENT;
+			}
+
+			AddSortableSpriteToDraw(img, pal, ti->x + sss->x_offset, ti->y + sss->y_offset,
 				sss->x_size, sss->y_size, sss->z_size, GetSlopeZ(ti->x + min(sss->x_offset, TILE_SIZE - 1), ti->y + min(sss->y_offset, TILE_SIZE - 1)) + sss->z_offset);
 		}
 	}
@@ -339,7 +354,14 @@
 
 	height = GetBridgeHeight(end);
 
-	AddSortableSpriteToDraw( sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
+	SpriteID img = sss->image;
+	SpriteID pal = PAL_NONE;
+	if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
+		SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+		pal = PALETTE_TO_TRANSPARENT;
+	}
+
+	AddSortableSpriteToDraw(img, pal, ti->x + sss->x_offset, ti->y + sss->y_offset,
 		sss->x_size, sss->y_size, sss->z_size, height + sss->z_offset
 	);
 
@@ -347,18 +369,26 @@
 	/* every other tile needs a pylon on the northern end */
 	if (num % 2) {
 		if (axis == AXIS_X) {
-			AddSortableSpriteToDraw(pylons_bridge[0 + HASBIT(tlg, 0)], PAL_NONE, ti->x, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height);
+			img = pylons_bridge[0 + HASBIT(tlg, 0)];
+			if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+			AddSortableSpriteToDraw(img, pal, ti->x, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height);
 		} else {
-			AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y, 1, 1, 10, height);
+			img = pylons_bridge[2 + HASBIT(tlg, 1)];
+			if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+			AddSortableSpriteToDraw(img, pal, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y, 1, 1, 10, height);
 		}
 	}
 
 	/* need a pylon on the southern end of the bridge */
 	if (DistanceMax(ti->tile, start) == length) {
 		if (axis == AXIS_X) {
-			AddSortableSpriteToDraw(pylons_bridge[0 + HASBIT(tlg, 0)], PAL_NONE, ti->x + 16, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height);
+			img = pylons_bridge[0 + HASBIT(tlg, 0)];
+			if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+			AddSortableSpriteToDraw(img, pal, ti->x + 16, ti->y + 4 + 8 * HASBIT(tlg, 0), 1, 1, 10, height);
 		} else {
-			AddSortableSpriteToDraw(pylons_bridge[2 + HASBIT(tlg, 1)], PAL_NONE, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y + 16, 1, 1, 10, height);
+			img = pylons_bridge[2 + HASBIT(tlg, 1)];
+			if (HASBIT(_transparent_opt, TO_BUILDINGS)) SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+			AddSortableSpriteToDraw(img, pal, ti->x + 4 + 8 * HASBIT(tlg, 1), ti->y + 16, 1, 1, 10, height);
 		}
 	}
 }
@@ -379,8 +409,15 @@
 			if (IsRailDepot(ti->tile)) {
 				const SortableSpriteStruct *sss = &CatenarySpriteData_Depot[GetRailDepotDirection(ti->tile)];
 
+				SpriteID img = sss->image;
+				SpriteID pal = PAL_NONE;
+				if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
+					SETBIT(img, PALETTE_MODIFIER_TRANSPARENT);
+					pal = PALETTE_TO_TRANSPARENT;
+				}
+
 				AddSortableSpriteToDraw(
-					sss->image, PAL_NONE, ti->x + sss->x_offset, ti->y + sss->y_offset,
+					img, pal, ti->x + sss->x_offset, ti->y + sss->y_offset,
 					sss->x_size, sss->y_size, sss->z_size,
 					GetTileMaxZ(ti->tile) + sss->z_offset
 				);
--- a/src/endian_check.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/endian_check.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -12,6 +12,10 @@
 #include <stdio.h>
 #include <string.h>
 
+/** Main call of the endian_check program
+ * @param argc argument count
+ * @param argv arguments themselves
+ * @return exit code */
 int main (int argc, char *argv[]) {
 	unsigned char EndianTest[2] = { 1, 0 };
 	int force_BE = 0, force_LE = 0, force_PREPROCESSOR = 0;
--- a/src/engine.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/engine.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -20,6 +20,7 @@
 #include "newgrf_cargo.h"
 #include "date.h"
 #include "table/engines.h"
+#include "group.h"
 
 EngineInfo _engine_info[TOTAL_NUM_ENGINES];
 RailVehicleInfo _rail_vehicle_info[NUM_TRAIN_ENGINES];
@@ -70,6 +71,16 @@
 {
 	uint age = e->age;
 
+	/* Check for early retirement */
+	if (e->player_avail != 0 && !_patches.never_expire_vehicles) {
+		uint retire_early = EngInfo(e - _engines)->retire_early;
+		if (retire_early > 0 && age >= e->duration_phase_1 + e->duration_phase_2 - retire_early * 12) {
+			/* Early retirement is enabled and we're past the date... */
+			e->player_avail = 0;
+			AddRemoveEngineFromAutoreplaceAndBuildWindows(e->type);
+		}
+	}
+
 	if (age < e->duration_phase_1) {
 		uint start = e->reliability_start;
 		e->reliability = age * (e->reliability_max - start) / e->duration_phase_1 + start;
@@ -167,14 +178,16 @@
 static void AcceptEnginePreview(EngineID eid, PlayerID player)
 {
 	Engine *e = GetEngine(eid);
+	Player *p = GetPlayer(player);
 
 	SETBIT(e->player_avail, player);
 	if (e->type == VEH_TRAIN) {
 		const RailVehicleInfo *rvi = RailVehInfo(eid);
-		Player *p = GetPlayer(player);
 
 		assert(rvi->railtype < RAILTYPE_END);
 		SETBIT(p->avail_railtypes, rvi->railtype);
+	} else if (e->type == VEH_ROAD) {
+		SETBIT(p->avail_roadtypes, HASBIT(EngInfo(eid)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 	}
 
 	e->preview_player = INVALID_PLAYER;
@@ -249,6 +262,7 @@
 /** Accept an engine prototype. XXX - it is possible that the top-player
  * changes while you are waiting to accept the offer? Then it becomes invalid
  * @param tile unused
+ * @param flags operation to perfom
  * @param p1 engine-prototype offered
  * @param p2 unused
  */
@@ -318,6 +332,12 @@
 			if (p->is_active) SETBIT(p->avail_railtypes, railtype);
 		}
 	}
+	if ((index - NUM_TRAIN_ENGINES) < NUM_ROAD_ENGINES) {
+		/* maybe make another road type available */
+		FOR_ALL_PLAYERS(p) {
+			if (p->is_active) SETBIT(p->avail_roadtypes, HASBIT(EngInfo(index)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
+		}
+	}
 	AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL), 0, 0);
 }
 
@@ -350,6 +370,7 @@
 
 /** Rename an engine.
  * @param tile unused
+ * @param flags operation to perfom
  * @param p1 engine ID to rename
  * @param p2 unused
  */
@@ -399,9 +420,44 @@
 	/* check if it's available */
 	if (!HASBIT(e->player_avail, player)) return false;
 
+	if (type == VEH_TRAIN) {
+		/* Check if the rail type is available to this player */
+		const Player *p = GetPlayer(player);
+		if (!HASBIT(p->avail_railtypes, RailVehInfo(engine)->railtype)) return false;
+	}
+
 	return true;
 }
 
+/** Get the default cargo type for a certain engine type
+ * @param engine The ID to get the cargo for
+ * @return The cargo type. CT_INVALID means no cargo capacity
+ */
+CargoID GetEngineCargoType(EngineID engine)
+{
+	assert(IsEngineIndex(engine));
+
+	switch (GetEngine(engine)->type) {
+		case VEH_TRAIN:
+			if (RailVehInfo(engine)->capacity == 0) return CT_INVALID;
+			return RailVehInfo(engine)->cargo_type;
+
+		case VEH_ROAD:
+			if (RoadVehInfo(engine)->capacity == 0) return CT_INVALID;
+			return RoadVehInfo(engine)->cargo_type;
+
+		case VEH_SHIP:
+			if (ShipVehInfo(engine)->capacity == 0) return CT_INVALID;
+			return ShipVehInfo(engine)->cargo_type;
+
+		case VEH_AIRCRAFT:
+			/* all aircraft starts as passenger planes with cargo capacity */
+			return CT_PASSENGERS;
+
+		default: NOT_REACHED(); return CT_INVALID;
+	}
+}
+
 /************************************************************************
  * Engine Replacement stuff
  ************************************************************************/
@@ -434,6 +490,7 @@
 
 		er->to = INVALID_ENGINE;
 		er->next = NULL;
+		er->group_id = DEFAULT_GROUP;
 		return er;
 	}
 
@@ -446,12 +503,12 @@
 /**
  * Retrieves the EngineRenew that specifies the replacement of the given
  * engine type from the given renewlist */
-static EngineRenew *GetEngineReplacement(EngineRenewList erl, EngineID engine)
+static EngineRenew *GetEngineReplacement(EngineRenewList erl, EngineID engine, GroupID group)
 {
 	EngineRenew *er = (EngineRenew *)erl;
 
 	while (er) {
-		if (er->from == engine) return er;
+		if (er->from == engine && er->group_id == group) return er;
 		er = er->next;
 	}
 	return NULL;
@@ -470,18 +527,18 @@
 	*erl = NULL; // Empty list
 }
 
-EngineID EngineReplacement(EngineRenewList erl, EngineID engine)
+EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group)
 {
-	const EngineRenew *er = GetEngineReplacement(erl, engine);
+	const EngineRenew *er = GetEngineReplacement(erl, engine, group);
 	return er == NULL ? INVALID_ENGINE : er->to;
 }
 
-int32 AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, uint32 flags)
+int32 AddEngineReplacement(EngineRenewList *erl, EngineID old_engine, EngineID new_engine, GroupID group, uint32 flags)
 {
 	EngineRenew *er;
 
 	/* Check if the old vehicle is already in the list */
-	er = GetEngineReplacement(*erl, old_engine);
+	er = GetEngineReplacement(*erl, old_engine, group);
 	if (er != NULL) {
 		if (flags & DC_EXEC) er->to = new_engine;
 		return 0;
@@ -493,6 +550,7 @@
 	if (flags & DC_EXEC) {
 		er->from = old_engine;
 		er->to = new_engine;
+		er->group_id = group;
 
 		/* Insert before the first element */
 		er->next = (EngineRenew *)(*erl);
@@ -502,14 +560,14 @@
 	return 0;
 }
 
-int32 RemoveEngineReplacement(EngineRenewList *erl, EngineID engine, uint32 flags)
+int32 RemoveEngineReplacement(EngineRenewList *erl, EngineID engine, GroupID group, uint32 flags)
 {
 	EngineRenew *er = (EngineRenew *)(*erl);
 	EngineRenew *prev = NULL;
 
 	while (er)
 	{
-		if (er->from == engine) {
+		if (er->from == engine && er->group_id == group) {
 			if (flags & DC_EXEC) {
 				if (prev == NULL) { // First element
 					/* The second becomes the new first element */
@@ -530,11 +588,11 @@
 }
 
 static const SaveLoad _engine_renew_desc[] = {
-	SLE_VAR(EngineRenew, from, SLE_UINT16),
-	SLE_VAR(EngineRenew, to,   SLE_UINT16),
+	    SLE_VAR(EngineRenew, from,     SLE_UINT16),
+	    SLE_VAR(EngineRenew, to,       SLE_UINT16),
 
-	SLE_REF(EngineRenew, next, REF_ENGINE_RENEWS),
-
+	    SLE_REF(EngineRenew, next,     REF_ENGINE_RENEWS),
+	SLE_CONDVAR(EngineRenew, group_id, SLE_UINT16, 60, SL_MAX_VERSION),
 	SLE_END()
 };
 
@@ -560,6 +618,9 @@
 
 		er = GetEngineRenew(index);
 		SlObject(er, _engine_renew_desc);
+
+		/* Advanced vehicle lists got added */
+		if (CheckSavegameVersion(60)) er->group_id = DEFAULT_GROUP;
 	}
 }
 
--- a/src/engine.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/engine.h	Sat Jun 02 19:59:29 2007 +0000
@@ -16,6 +16,14 @@
 	RAILVEH_WAGON,       ///< simple wagon, not motorized
 };
 
+enum EngineClass {
+	EC_STEAM,
+	EC_DIESEL,
+	EC_ELECTRIC,
+	EC_MONORAIL,
+	EC_MAGLEV,
+};
+
 struct RailVehicleInfo {
 	byte image_index;
 	RailVehicleTypes railveh_type;
@@ -26,7 +34,7 @@
 	uint16 weight;
 	byte running_cost_base;
 	byte running_cost_class;
-	byte engclass;         ///< 0: steam, 1: diesel, 2: electric
+	EngineClass engclass;           ///< Class of engine for this vehicle
 	byte capacity;
 	CargoID cargo_type;
 	byte ai_rank;
@@ -90,13 +98,14 @@
 	Date base_intro;
 	Year lifelength;
 	Year base_life;
-	byte unk2;         ///< Carriages have the highest bit set in this one
+	byte unk2;         ///< flag for carriage(bit 7) and decay speed(bits0..6)
 	byte load_amount;
 	byte climates;
 	uint32 refit_mask;
 	byte refit_cost;
 	byte misc_flags;
 	byte callbackmask;
+	byte retire_early; ///< Number of years early to retire vehicle
 };
 
 struct Engine {
@@ -111,15 +120,15 @@
 	PlayerByte preview_player;
 	byte preview_wait;
 	byte player_avail;
-	byte type; ///< type, ie VEH_ROAD, VEH_TRAIN, etc. Same as in vehicle.h
+	VehicleType type; ///< type, ie VEH_ROAD, VEH_TRAIN, etc. Same as in vehicle.h
 };
 
 /**
  * EngineInfo.misc_flags is a bitmask, with the following values
  */
 enum {
-	EF_RAIL_TILTS = 0, ///< Rail vehicle tilts in curves (unsupported)
-	EF_ROAD_TRAM  = 0, ///< Road vehicle is a tram/light rail vehicle (unsup)
+	EF_RAIL_TILTS = 0, ///< Rail vehicle tilts in curves
+	EF_ROAD_TRAM  = 0, ///< Road vehicle is a tram/light rail vehicle
 	EF_USES_2CC   = 1, ///< Vehicle uses two company colours
 	EF_RAIL_IS_MU = 2, ///< Rail vehicle is a multiple-unit (DMU/EMU)
 };
@@ -153,6 +162,7 @@
 void DeleteCustomEngineNames();
 
 bool IsEngineBuildable(EngineID engine, byte type, PlayerID player);
+CargoID GetEngineCargoType(EngineID engine);
 
 enum {
 	NUM_NORMAL_RAIL_ENGINES = 54,
@@ -262,6 +272,7 @@
 	EngineID from;
 	EngineID to;
 	EngineRenew *next;
+	GroupID group_id;
 };
 
 /**
@@ -295,7 +306,7 @@
 
 /**
  * Remove all engine replacement settings for the player.
- * @param  er The renewlist for a given player.
+ * @param  erl The renewlist for a given player.
  * @return The new renewlist for the player.
  */
 void RemoveAllEngineReplacement(EngineRenewList* erl);
@@ -307,7 +318,7 @@
  * @return The engine type to replace with, or INVALID_ENGINE if no
  * replacement is in the list.
  */
-EngineID EngineReplacement(EngineRenewList erl, EngineID engine);
+EngineID EngineReplacement(EngineRenewList erl, EngineID engine, GroupID group);
 
 /**
  * Add an engine replacement to the given renewlist.
@@ -317,7 +328,7 @@
  * @param flags The calling command flags.
  * @return 0 on success, CMD_ERROR on failure.
  */
-int32 AddEngineReplacement(EngineRenewList* erl, EngineID old_engine, EngineID new_engine, uint32 flags);
+int32 AddEngineReplacement(EngineRenewList* erl, EngineID old_engine, EngineID new_engine, GroupID group, uint32 flags);
 
 /**
  * Remove an engine replacement from a given renewlist.
@@ -326,12 +337,12 @@
  * @param flags The calling command flags.
  * @return 0 on success, CMD_ERROR on failure.
  */
-int32 RemoveEngineReplacement(EngineRenewList* erl, EngineID engine, uint32 flags);
+int32 RemoveEngineReplacement(EngineRenewList* erl, EngineID engine, GroupID group, uint32 flags);
 
 /** When an engine is made buildable or is removed from being buildable, add/remove it from the build/autoreplace lists
  * @param type The type of engine
  */
-void AddRemoveEngineFromAutoreplaceAndBuildWindows(byte type);
+void AddRemoveEngineFromAutoreplaceAndBuildWindows(VehicleType type);
 
 /* Engine list manipulators - current implementation is only C wrapper of CBlobT<EngineID> class (helpers.cpp) */
 void EngList_Create(EngineList *el);            ///< Creates engine list
--- a/src/fileio.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/fileio.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -170,7 +170,7 @@
 	FioFreeHandle();
 #endif /* LIMITED_FDS */
 	f = FioFOpenFile(filename);
-	if (f == NULL) error("Cannot open file '%s%s'", _paths.data_dir, filename);
+	if (f == NULL) error("Cannot open file '%s'", filename);
 
 	FioCloseFile(slot); // if file was opened before, close it
 	_fio.handles[slot] = f;
@@ -206,12 +206,16 @@
 	FILE *f;
 	char buf[MAX_PATH];
 
-	snprintf(buf, lengthof(buf), "%s%s", _paths.data_dir, filename);
+	if (strrchr(filename, PATHSEPCHAR) == NULL) {
+		snprintf(buf, lengthof(buf), "%s%s", _paths.data_dir, filename);
+	} else {
+		ttd_strlcpy(buf, filename, lengthof(buf));
+	}
 
 	f = fopen(buf, "rb");
 #if !defined(WIN32)
 	if (f == NULL) {
-		strtolower(buf + strlen(_paths.data_dir) - 1);
+		strtolower(strrchr(buf, PATHSEPCHAR));
 		f = fopen(buf, "rb");
 
 #if defined SECOND_DATA_DIR
@@ -308,6 +312,8 @@
 #if defined(SECOND_DATA_DIR)
 	_paths.second_data_dir = MallocT<char>(MAX_PATH);
 	ttd_strlcpy(_paths.second_data_dir, SECOND_DATA_DIR, MAX_PATH);
+#else
+	_paths.second_data_dir = NULL;
 #endif
 
 #if defined(USE_HOMEDIR)
@@ -353,10 +359,10 @@
 {
 	DetermineBasePaths(exe);
 
-	_paths.save_dir      = str_fmt("%ssave", _paths.personal_dir);
-	_paths.autosave_dir  = str_fmt("%s" PATHSEP "autosave", _paths.save_dir);
-	_paths.scenario_dir  = str_fmt("%sscenario", _paths.personal_dir);
-	_paths.heightmap_dir = str_fmt("%s" PATHSEP "heightmap", _paths.scenario_dir);
+	_paths.save_dir      = str_fmt("%ssave" PATHSEP, _paths.personal_dir);
+	_paths.autosave_dir  = str_fmt("%s" PATHSEP "autosave" PATHSEP, _paths.save_dir);
+	_paths.scenario_dir  = str_fmt("%sscenario" PATHSEP, _paths.personal_dir);
+	_paths.heightmap_dir = str_fmt("%s" PATHSEP "heightmap" PATHSEP, _paths.scenario_dir);
 	_paths.gm_dir        = str_fmt("%sgm" PATHSEP, _paths.game_data_dir);
 	_paths.data_dir      = str_fmt("%sdata" PATHSEP, _paths.game_data_dir);
 #if defined(CUSTOM_LANG_DIR)
--- a/src/fios.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/fios.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -57,7 +57,7 @@
 /**
  * Compare two FiosItem's. Used with qsort when sorting the file list.
  * @param a A pointer to the first FiosItem to compare.
- * @param a A pointer to the second FiosItem to compare.
+ * @param b A pointer to the second FiosItem to compare.
  * @return -1, 0 or 1, depending on how the two items should be sorted.
  */
 int CDECL compare_FiosItems(const void *a, const void *b)
@@ -114,10 +114,12 @@
 
 	case FIOS_TYPE_PARENT:
 		/* Check for possible NULL ptr (not required for UNIXes, but AmigaOS-alikes) */
-		if ((s = strrchr(path, PATHSEPCHAR)) != NULL) {
-			s[1] = '\0'; // go up a directory
-			if (!FiosIsRoot(path)) s[0] = '\0';
+		s = strrchr(path, PATHSEPCHAR);
+		if (s != NULL && s != path) {
+			s[0] = '\0'; // Remove last path separator character, so we can go up one level.
 		}
+		s = strrchr(path, PATHSEPCHAR);
+		if (s != NULL) s[1] = '\0'; // go up a directory
 #if defined(__MORPHOS__) || defined(__AMIGAOS__)
 		/* On MorphOS or AmigaOS paths look like: "Volume:directory/subdirectory" */
 		else if ((s = strrchr(path, ':')) != NULL) s[1] = '\0';
@@ -125,14 +127,12 @@
 		break;
 
 	case FIOS_TYPE_DIR:
-		if (!FiosIsRoot(path)) strcat(path, PATHSEP);
 		strcat(path, item->name);
+		strcat(path, PATHSEP);
 		break;
 
 	case FIOS_TYPE_DIRECT:
-		sprintf(path, "%s" PATHSEP, item->name);
-		s = strrchr(path, PATHSEPCHAR);
-		if (s != NULL && s[1] == '\0') s[0] = '\0'; // strip trailing slash
+		sprintf(path, "%s", item->name);
 		break;
 
 	case FIOS_TYPE_FILE:
@@ -150,7 +150,7 @@
 			snprintf(str_buffr, lengthof(str_buffr), "%s:%s", path, item->name);
 		} else // XXX - only next line!
 #endif
-		snprintf(str_buffr, lengthof(str_buffr), "%s" PATHSEP "%s", path, item->name);
+		snprintf(str_buffr, lengthof(str_buffr), "%s%s", path, item->name);
 
 		return str_buffr;
 	}
@@ -200,9 +200,8 @@
 typedef byte fios_getlist_callback_proc(int mode, const char *filename, const char *ext, char *title);
 
 /** Create a list of the files in a directory, according to some arbitrary rule.
- *  @param num Will be filled with the amount of items.
  *  @param mode The mode we are in. Some modes don't allow 'parent'.
- *  @param callback The function that is called where you need to do the filtering.
+ *  @param callback_proc The function that is called where you need to do the filtering.
  *  @return Return the list of files. */
 static FiosItem *FiosGetFileList(int mode, fios_getlist_callback_proc *callback_proc)
 {
--- a/src/fontcache.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/fontcache.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -147,10 +147,10 @@
 
 
 folder_error:
+registry_no_font_found:
 #if defined(UNICODE)
-	free(font_path);
+	free(font_namep);
 #endif
-registry_no_font_found:
 	RegCloseKey(hKey);
 	return err;
 }
--- a/src/functions.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/functions.h	Sat Jun 02 19:59:29 2007 +0000
@@ -7,35 +7,8 @@
 
 #include "gfx.h"
 
-void DoClearSquare(TileIndex tile);
-void RunTileLoop();
-
-uint GetPartialZ(int x, int y, Slope corners);
-uint GetSlopeZ(int x, int y);
-uint32 GetTileTrackStatus(TileIndex tile, TransportType mode);
-void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac);
-void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player);
-void AnimateTile(TileIndex tile);
-void ClickTile(TileIndex tile);
-void GetTileDesc(TileIndex tile, TileDesc *td);
 void UpdateTownMaxPass(Town *t);
 
-bool IsValidTile(TileIndex tile);
-
-static inline Point RemapCoords(int x, int y, int z)
-{
-	Point pt;
-	pt.x = (y - x) * 2;
-	pt.y = y + x - z;
-	return pt;
-}
-
-static inline Point RemapCoords2(int x, int y)
-{
-	return RemapCoords(x, y, GetSlopeZ(x, y));
-}
-
-
 /* clear_land.cpp */
 void DrawHillyLandTile(const TileInfo *ti);
 void DrawClearLandTile(const TileInfo *ti, byte set);
@@ -57,7 +30,6 @@
 /* standard */
 void ShowInfo(const char *str);
 void CDECL ShowInfoF(const char *str, ...);
-void NORETURN CDECL error(const char *str, ...);
 
 /* openttd.cpp */
 
@@ -159,10 +131,10 @@
 
 void ResetObjectToPlace();
 
-bool ScrollWindowTo(int x, int y, Window * w);
+bool ScrollWindowTo(int x, int y, Window * w, bool instant = false);
 
-bool ScrollMainWindowToTile(TileIndex tile);
-bool ScrollMainWindowTo(int x, int y);
+bool ScrollMainWindowToTile(TileIndex tile, bool instant = false);
+bool ScrollMainWindowTo(int x, int y, bool instant = false);
 void DrawSprite(SpriteID img, SpriteID pal, int x, int y);
 bool EnsureNoVehicle(TileIndex tile);
 bool EnsureNoVehicleOnGround(TileIndex tile);
@@ -170,8 +142,6 @@
 void ShowCostOrIncomeAnimation(int x, int y, int z, int32 cost);
 void ShowFeederIncomeAnimation(int x, int y, int z, int32 cost);
 
-void DrawFoundation(TileInfo *ti, uint f);
-
 bool CheckIfAuthorityAllows(TileIndex tile);
 Town *ClosestTownFromTile(TileIndex tile, uint threshold);
 void ChangeTownRating(Town *t, int add, int max);
@@ -179,7 +149,6 @@
 uint GetTownRadiusGroup(const Town* t, TileIndex tile);
 int FindFirstBit(uint32 x);
 void ShowHighscoreTable(int difficulty, int8 rank);
-TileIndex AdjustTileCoordRandomly(TileIndex a, byte rng);
 
 void AfterLoadTown();
 void UpdatePatches();
--- a/src/genworld.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/genworld.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -5,10 +5,12 @@
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
+#include "landscape.h"
 #include "player.h"
 #include "table/sprites.h"
 #include "variables.h"
 #include "thread.h"
+#include "command.h"
 #include "genworld.h"
 #include "gfx.h"
 #include "gfxinit.h"
@@ -19,7 +21,6 @@
 #include "heightmap.h"
 #include "date.h"
 
-void GenerateLandscape(byte mode);
 void GenerateClearTile();
 void GenerateIndustries();
 void GenerateUnmovables();
@@ -32,8 +33,6 @@
 
 void InitializeGame(int mode, uint size_x, uint size_y);
 
-void ConvertGroundTilesIntoWaterTiles();
-
 /* Please only use this variable in genworld.h and genworld.c and
  *  nowhere else. For speed improvements we need it to be global, but
  *  in no way the meaning of it is to use it anywhere else besides
@@ -155,6 +154,8 @@
 
 	if (_network_dedicated) DEBUG(net, 0, "Map generated, starting game");
 
+	if (_patches.pause_on_newgame && _game_mode == GM_NORMAL) DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
+
 	return NULL;
 }
 
@@ -289,6 +290,6 @@
 
 	/* Centre the view on the map */
 	if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) {
-		ScrollMainWindowToTile(TileXY(MapSizeX() / 2, MapSizeY() / 2));
+		ScrollMainWindowToTile(TileXY(MapSizeX() / 2, MapSizeY() / 2), true);
 	}
 }
--- a/src/genworld_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/genworld_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -199,7 +199,7 @@
 	}
 }
 
-static void HeightmapScaledTooMuchCallback(Window *w, bool confirmed)
+static void LandscapeGenerationCallback(Window *w, bool confirmed)
 {
 	if (confirmed) StartGeneratingLandscape((glwp_modes)w->window_number);
 }
@@ -213,8 +213,8 @@
 	static const StringID tree_placer[] = {STR_CONFIG_PATCHES_TREE_PLACER_NONE, STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL, STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED, INVALID_STRING_ID};
 	static const StringID rotation[]    = {STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE, STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE, INVALID_STRING_ID};
 	static const StringID landscape[]   = {STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL, STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS, INVALID_STRING_ID};
-	static const StringID num_towns[]   = {STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
-	static const StringID num_inds[]    = {STR_26816_NONE, STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
+	static const StringID num_towns[]   = {STR_NUM_VERY_LOW, STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
+	static const StringID num_inds[]    = {STR_26816_NONE, STR_NUM_VERY_LOW, STR_6816_LOW, STR_6817_NORMAL, STR_6818_HIGH, INVALID_STRING_ID};
 
 	/* Data used for the generate seed edit box */
 	static querystr_d _genseed_query;
@@ -354,14 +354,26 @@
 			SetWindowDirty(w);
 			break;
 		case GLAND_GENERATE_BUTTON: // Generate
-			if (mode == GLWP_HEIGHTMAP && (
-					_heightmap_x * 2 < (1U << _patches_newgame.map_x) || _heightmap_x / 2 > (1U << _patches_newgame.map_x) ||
-					_heightmap_y * 2 < (1U << _patches_newgame.map_y) || _heightmap_y / 2 > (1U << _patches_newgame.map_y))) {
+
+			UpdatePatches();
+
+			if (_patches.town_layout == TL_NO_ROADS) {
+				ShowQuery(
+					STR_TOWN_LAYOUT_WARNING_CAPTION,
+					STR_TOWN_LAYOUT_WARNING_MESSAGE,
+					w,
+					LandscapeGenerationCallback);
+			} else if (mode == GLWP_HEIGHTMAP &&
+					(_heightmap_x * 2 < (1U << _patches_newgame.map_x) ||
+					_heightmap_x / 2 > (1U << _patches_newgame.map_x) ||
+					_heightmap_y * 2 < (1U << _patches_newgame.map_y) ||
+					_heightmap_y / 2 > (1U << _patches_newgame.map_y))) {
 				ShowQuery(
 					STR_HEIGHTMAP_SCALE_WARNING_CAPTION,
 					STR_HEIGHTMAP_SCALE_WARNING_MESSAGE,
 					w,
-					HeightmapScaledTooMuchCallback);
+					LandscapeGenerationCallback);
+
 			} else {
 				StartGeneratingLandscape(mode);
 			}
@@ -545,6 +557,10 @@
 
 void StartScenarioEditor()
 {
+	if (_patches_newgame.town_layout == TL_NO_ROADS) {
+		_patches_newgame.town_layout = TL_ORIGINAL;
+	}
+
 	StartGeneratingLandscape(GLWP_SCENARIO);
 }
 
@@ -899,7 +915,7 @@
 
 /**
  * Set the total of a stage of the world generation.
- * @param class the current class we are in.
+ * @param cls the current class we are in.
  * @param total Set the total expected items for this class.
  *
  * Warning: this function isn't clever. Don't go from class 4 to 3. Go upwards, always.
@@ -914,7 +930,7 @@
 
 /**
  * Increases the current stage of the world generation with one.
- * @param class the current class we are in.
+ * @param cls the current class we are in.
  *
  * Warning: this function isn't clever. Don't go from class 4 to 3. Go upwards, always.
  *  Also, progress works if total is zero, total works if progress is zero.
--- a/src/gfx.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/gfx.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -18,6 +18,7 @@
 #include "fontcache.h"
 #include "genworld.h"
 #include "debug.h"
+#include "zoom.hpp"
 
 #ifdef _DEBUG
 bool _dbg_screen_rect;
@@ -64,12 +65,12 @@
 
 void memcpy_pitch(void *dst, void *src, int w, int h, int srcpitch, int dstpitch)
 {
-	byte *dstp = (byte*)dst;
-	byte *srcp = (byte*)src;
+	Pixel *dstp = (Pixel *)dst;
+	Pixel *srcp = (Pixel *)src;
 
 	assert(h >= 0);
 	for (; h != 0; --h) {
-		memcpy(dstp, srcp, w);
+		memcpy(dstp, srcp, w * sizeof(Pixel));
 		dstp += dstpitch;
 		srcp += srcpitch;
 	}
@@ -110,7 +111,7 @@
 		}
 
 		for (ht = height; ht > 0; --ht) {
-			memcpy(dst, src, width);
+			memcpy(dst, src, width * sizeof(Pixel));
 			src -= p;
 			dst -= p;
 		}
@@ -136,7 +137,7 @@
 		/* the y-displacement may be 0 therefore we have to use memmove,
 		 * because source and destination may overlap */
 		for (ht = height; ht > 0; --ht) {
-			memmove(dst, src, width);
+			memmove(dst, src, width * sizeof(Pixel));
 			src += p;
 			dst += p;
 		}
@@ -153,7 +154,7 @@
 	const int otop = top;
 	const int oleft = left;
 
-	if (dpi->zoom != 0) return;
+	if (dpi->zoom != ZOOM_LVL_NORMAL) return;
 	if (left > right || top > bottom) return;
 	if (right < dpi->left || left >= dpi->left + dpi->width) return;
 	if (bottom < dpi->top || top >= dpi->top + dpi->height) return;
@@ -175,7 +176,7 @@
 	if (!HASBIT(color, PALETTE_MODIFIER_GREYOUT)) {
 		if (!HASBIT(color, USE_COLORTABLE)) {
 			do {
-				memset(dst, color, right);
+				memset(dst, color, right * sizeof(Pixel));
 				dst += dpi->pitch;
 			} while (--bottom);
 		} else {
@@ -201,7 +202,7 @@
 static void GfxSetPixel(int x, int y, int color)
 {
 	const DrawPixelInfo* dpi = _cur_dpi;
-	if ((x-=dpi->left) < 0 || x>=dpi->width || (y-=dpi->top)<0 || y>=dpi->height)
+	if ((x -= dpi->left) < 0 || x >= dpi->width || (y -= dpi->top)<0 || y >= dpi->height)
 		return;
 	dpi->dst_ptr[y * dpi->pitch + x] = color;
 }
@@ -275,7 +276,7 @@
 
 /** Truncate a given string to a maximum width if neccessary.
  * If the string is truncated, add three dots ('...') to show this.
- * @param *dest string that is checked and possibly truncated
+ * @param *str string that is checked and possibly truncated
  * @param maxw maximum width in pixels of the string
  * @return new width of (truncated) string */
 static int TruncateString(char *str, int maxw)
@@ -413,11 +414,11 @@
 /** 'Correct' a string to a maximum length. Longer strings will be cut into
  * additional lines at whitespace characters if possible. The string parameter
  * is modified with terminating characters mid-string which are the
- * placeholders for the newlines.<br/>
+ * placeholders for the newlines.
  * The string WILL be truncated if there was no whitespace for the current
  * line's maximum width.
  *
- * @note To know if the the terminating '\0' is the string end or just a
+ * @note To know if the terminating '\0' is the string end or just a
  * newline, the returned 'num' value should be consulted. The num'th '\0',
  * starting with index 0 is the real string end.
  *
@@ -461,7 +462,7 @@
 				switch (c) {
 					case '\0': return num + (size << 16); break;
 					case SCC_SETX:  str++; break;
-					case SCC_SETXY: str +=2; break;
+					case SCC_SETXY: str += 2; break;
 					case SCC_TINYFONT: size = FS_SMALL; break;
 					case SCC_BIGFONT:  size = FS_LARGE; break;
 					case '\n': goto end_of_inner_loop;
@@ -487,7 +488,7 @@
  * @param x Centre the string around this pixel width
  * @param y Draw the string at this pixel height (first line's bottom)
  * @param str String to draw
- * @param max Maximum width the string can have before it is wrapped */
+ * @param maxw Maximum width the string can have before it is wrapped */
 void DrawStringMultiCenter(int x, int y, StringID str, int maxw)
 {
 	char buffer[512];
@@ -509,7 +510,7 @@
 
 	for (;;) {
 		w = GetStringBoundingBox(src).width;
-		DoDrawString(src, x - (w>>1), y, 0xFE);
+		DoDrawString(src, x - (w >> 1), y, 0xFE);
 		_cur_fontsize = _last_fontsize;
 
 		for (;;) {
@@ -524,7 +525,7 @@
 			} else if (c == SCC_SETX) {
 				src++;
 			} else if (c == SCC_SETXY) {
-				src+=2;
+				src += 2;
 			}
 		}
 	}
@@ -574,7 +575,7 @@
 			} else if (c == SCC_SETX) {
 				src++;
 			} else if (c == SCC_SETXY) {
-				src+=2;
+				src += 2;
 			}
 		}
 	}
@@ -626,7 +627,7 @@
 /** Draw a string at the given coordinates with the given colour
  * @param string the string to draw
  * @param x offset from left side of the screen, if negative offset from the right side
- * @param x offset from top side of the screen, if negative offset from the bottom
+ * @param y offset from top side of the screen, if negative offset from the bottom
  * @param real_color colour of the string, see _string_colormap in
  * table/palettes.h or docs/ottd-colourtext-palette.png
  * @return the x-coordinates where the drawing has finished. If nothing is drawn
@@ -643,7 +644,7 @@
 
 	if (color != 0xFE) {
 		if (x >= dpi->left + dpi->width ||
-				x + _screen.width*2 <= dpi->left ||
+				x + _screen.width * 2 <= dpi->left ||
 				y >= dpi->top + dpi->height ||
 				y + _screen.height <= dpi->top)
 					return x;
@@ -652,10 +653,11 @@
 switch_color:;
 			if (real_color & IS_PALETTE_COLOR) {
 				_string_colorremap[1] = color;
-				_string_colorremap[2] = 215;
+				_string_colorremap[2] = _use_dos_palette ? 1 : 215;
 			} else {
-				_string_colorremap[1] = _string_colormap[color].text;
-				_string_colorremap[2] = _string_colormap[color].shadow;
+				uint palette = _use_dos_palette ? 1 : 0;
+				_string_colorremap[1] = _string_colormap[palette][color].text;
+				_string_colorremap[2] = _string_colormap[palette][color].shadow;
 			}
 			_color_remap_ptr = _string_colorremap;
 		}
@@ -736,142 +738,7 @@
 	int pitch;
 };
 
-static void GfxBlitTileZoomIn(BlitterParams *bp)
-{
-	const byte *src_o = bp->sprite;
-	const byte *src;
-	int num, skip;
-	byte done;
-	Pixel *dst;
-	const byte *ctab;
-
-	src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
-	switch (bp->mode) {
-		case BM_COLOUR_REMAP:
-			do {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src = src_o + 2;
-					src_o += num + 2;
-
-					dst = bp->dst;
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip;
-					} else {
-						src -= skip;
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-
-					ctab = _color_remap_ptr;
-
-					for (; num >= 4; num -=4) {
-						dst[3] = ctab[src[3]];
-						dst[2] = ctab[src[2]];
-						dst[1] = ctab[src[1]];
-						dst[0] = ctab[src[0]];
-						dst += 4;
-						src += 4;
-					}
-					for (; num != 0; num--) *dst++ = ctab[*src++];
-				} while (!(done & 0x80));
-
-				bp->dst += bp->pitch;
-			} while (--bp->height != 0);
-			break;
-
-		case BM_TRANSPARENT:
-			do {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src_o += num + 2;
-
-					dst = bp->dst;
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip;
-					} else {
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-
-					ctab = _color_remap_ptr;
-					for (; num != 0; num--) {
-						*dst = ctab[*dst];
-						dst++;
-					}
-				} while (!(done & 0x80));
-
-				bp->dst += bp->pitch;
-			} while (--bp->height != 0);
-			break;
-
-		default:
-			do {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src = src_o + 2;
-					src_o += num + 2;
-
-					dst = bp->dst;
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip;
-					} else {
-						src -= skip;
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-#if defined(_WIN32)
-					if (num & 1) *dst++ = *src++;
-					if (num & 2) { *(uint16*)dst = *(uint16*)src; dst += 2; src += 2; }
-					if (num >>= 2) {
-						do {
-							*(uint32*)dst = *(uint32*)src;
-							dst += 4;
-							src += 4;
-						} while (--num != 0);
-					}
-#else
-					memcpy(dst, src, num);
-#endif
-				} while (!(done & 0x80));
-
-				bp->dst += bp->pitch;
-			} while (--bp->height != 0);
-			break;
-	}
-}
-
-static void GfxBlitZoomInUncomp(BlitterParams *bp)
+static void GfxBlitZoomUncomp(BlitterParams *bp, ZoomLevel zoom)
 {
 	const byte *src = bp->sprite;
 	Pixel *dst = bp->dst;
@@ -882,62 +749,48 @@
 	assert(height > 0);
 	assert(width > 0);
 
+	height = UnScaleByZoom(height, zoom);
+
 	switch (bp->mode) {
 		case BM_COLOUR_REMAP: {
 			const byte *ctab = _color_remap_ptr;
 
-			do {
-				for (i = 0; i != width; i++) {
-					byte b = ctab[src[i]];
+			for (; height != 0; height--) {
+				for (i = 0; i != UnScaleByZoom(width, zoom); i++) {
+					byte b = ctab[src[ScaleByZoom(i, zoom)]];
 
 					if (b != 0) dst[i] = b;
 				}
-				src += bp->width_org;
+				src += ScaleByZoom(bp->width_org, zoom);
 				dst += bp->pitch;
-			} while (--height != 0);
+			}
 			break;
 		}
 
 		case BM_TRANSPARENT: {
 			const byte *ctab = _color_remap_ptr;
 
-			do {
-				for (i = 0; i != width; i++)
-					if (src[i] != 0) dst[i] = ctab[dst[i]];
-				src += bp->width_org;
+			for (; height != 0; height--) {
+				for (i = 0; i != UnScaleByZoom(width, zoom); i++)
+					if (src[ScaleByZoom(i, zoom)] != 0) dst[i] = ctab[dst[i]];
+				src += ScaleByZoom(bp->width_org, zoom);
 				dst += bp->pitch;
-			} while (--height != 0);
+			}
 			break;
 		}
 
 		default:
-			do {
-				int n = width;
-
-				for (; n >= 4; n -= 4) {
-					if (src[0] != 0) dst[0] = src[0];
-					if (src[1] != 0) dst[1] = src[1];
-					if (src[2] != 0) dst[2] = src[2];
-					if (src[3] != 0) dst[3] = src[3];
-
-					dst += 4;
-					src += 4;
-				}
-
-				for (; n != 0; n--) {
-					if (src[0] != 0) dst[0] = src[0];
-					src++;
-					dst++;
-				}
-
-				src += bp->width_org - width;
-				dst += bp->pitch - width;
-			} while (--height != 0);
+			for (; height != 0; height--) {
+				for (i = 0; i != UnScaleByZoom(width, zoom); i++)
+					if (src[ScaleByZoom(i, zoom)] != 0) dst[i] = src[ScaleByZoom(i, zoom)];
+				src += ScaleByZoom(bp->width_org, zoom);
+				dst += bp->pitch;
+			}
 			break;
 	}
 }
 
-static void GfxBlitTileZoomMedium(BlitterParams *bp)
+static void GfxBlitTileZoom(BlitterParams *bp, ZoomLevel zoom)
 {
 	const byte *src_o = bp->sprite;
 	const byte *src;
@@ -947,484 +800,111 @@
 	const byte *ctab;
 
 	src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
-	switch (bp->mode) {
-		case BM_COLOUR_REMAP:
-			do {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src = src_o + 2;
-					src_o += num + 2;
-
-					dst = bp->dst;
 
-					if (skip & 1) {
-						skip++;
-						src++;
-						if (--num == 0) continue;
-					}
+	for (;;) {
+		do {
+			done = src_o[0];
+			num = done & 0x7F;
+			skip = src_o[1];
+			src = src_o + 2;
+			src_o += num + 2;
 
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip >> 1;
-					} else {
-						src -= skip;
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
+			dst = bp->dst;
 
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
+			if (zoom >= ZOOM_LVL_OUT_2X && (skip & 1)) {
+				skip += 1;
+				src += 1;
+				num -= 1;
+				if (num <= 0) continue;
+			}
 
+			if (zoom >= ZOOM_LVL_OUT_4X && (skip & 2)) {
+				skip += 2;
+				src += 2;
+				num -= 2;
+				if (num <= 0) continue;
+			}
+
+			if (zoom >= ZOOM_LVL_OUT_8X && (skip & 4)) {
+				skip += 4;
+				src += 4;
+				num -= 4;
+				if (num <= 0) continue;
+			}
+
+			if (zoom >= ZOOM_LVL_OUT_16X && (skip & 8)) {
+				skip += 8;
+				src += 8;
+				num -= 8;
+				if (num <= 0) continue;
+			}
+
+			if ( (skip -= bp->start_x) > 0) {
+				dst += UnScaleByZoom(skip, zoom);
+			} else {
+				src -= skip;
+				num += skip;
+				if (num <= 0) continue;
+				skip = 0;
+			}
+
+			skip = skip + num - bp->width;
+			if (skip > 0) {
+				num -= skip;
+				if (num <= 0) continue;
+			}
+
+			num = UnScaleByZoom(num + ScaleByZoom(1, zoom) - 1, zoom);
+
+			switch (bp->mode) {
+				case BM_COLOUR_REMAP:
 					ctab = _color_remap_ptr;
-					num = (num + 1) >> 1;
 					for (; num != 0; num--) {
 							*dst = ctab[*src];
 							dst++;
-							src += 2;
+							src += ScaleByZoom(1, zoom);
 					}
-				} while (!(done & 0x80));
-				bp->dst += bp->pitch;
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-			} while (--bp->height != 0);
-			break;
-
-		case BM_TRANSPARENT:
-			do {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src_o += num + 2;
+					break;
 
-					dst = bp->dst;
-
-					if (skip & 1) {
-						skip++;
-						if (--num == 0) continue;
-					}
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip >> 1;
-					} else {
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-
+				case BM_TRANSPARENT:
 					ctab = _color_remap_ptr;
-					num = (num + 1) >> 1;
 					for (; num != 0; num--) {
 							*dst = ctab[*dst];
 							dst++;
 					}
-				} while (!(done & 0x80));
-				bp->dst += bp->pitch;
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-			} while (--bp->height != 0);
-			break;
-
-		default:
-			do {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src = src_o + 2;
-					src_o += num + 2;
-
-					dst = bp->dst;
+					break;
 
-					if (skip & 1) {
-						skip++;
-						src++;
-						if (--num == 0) continue;
-					}
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip >> 1;
-					} else {
-						src -= skip;
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-
-					num = (num + 1) >> 1;
-
+				default:
 					for (; num != 0; num--) {
 							*dst = *src;
 							dst++;
-							src += 2;
+							src += ScaleByZoom(1, zoom);
 					}
-
-				} while (!(done & 0x80));
-
-				bp->dst += bp->pitch;
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-			} while (--bp->height != 0);
-			break;
-	}
-}
-
-static void GfxBlitZoomMediumUncomp(BlitterParams *bp)
-{
-	const byte *src = bp->sprite;
-	Pixel *dst = bp->dst;
-	int height = bp->height;
-	int width = bp->width;
-	int i;
-
-	assert(height > 0);
-	assert(width > 0);
-
-	switch (bp->mode) {
-		case BM_COLOUR_REMAP: {
-			const byte *ctab = _color_remap_ptr;
+					break;
+			}
 
-			for (height >>= 1; height != 0; height--) {
-				for (i = 0; i != width >> 1; i++) {
-					byte b = ctab[src[i * 2]];
-
-					if (b != 0) dst[i] = b;
-				}
-				src += bp->width_org * 2;
-				dst += bp->pitch;
-			}
-			break;
-		}
-
-		case BM_TRANSPARENT: {
-			const byte *ctab = _color_remap_ptr;
 
-			for (height >>= 1; height != 0; height--) {
-				for (i = 0; i != width >> 1; i++)
-					if (src[i * 2] != 0) dst[i] = ctab[dst[i]];
-				src += bp->width_org * 2;
-				dst += bp->pitch;
-			}
-			break;
+		} while (!(done & 0x80));
+
+		bp->dst += bp->pitch;
+		if (--bp->height == 0) return;
+
+		for (int i = 0; i < ScaleByZoom(1, zoom) - 1; i++) {
+			do {
+				done = src_o[0];
+				src_o += (done & 0x7F) + 2;
+			} while (!(done & 0x80));
+			if (--bp->height == 0) return;
 		}
-
-		default:
-			for (height >>= 1; height != 0; height--) {
-				for (i = 0; i != width >> 1; i++)
-					if (src[i * 2] != 0) dst[i] = src[i * 2];
-				src += bp->width_org * 2;
-				dst += bp->pitch;
-			}
-			break;
 	}
 }
 
-static void GfxBlitTileZoomOut(BlitterParams *bp)
-{
-	const byte *src_o = bp->sprite;
-	const byte *src;
-	int num, skip;
-	byte done;
-	Pixel *dst;
-	const byte *ctab;
-
-	src_o += ReadLE16Aligned(src_o + bp->start_y * 2);
-	switch (bp->mode) {
-		case BM_COLOUR_REMAP:
-			for (;;) {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src = src_o + 2;
-					src_o += num + 2;
-
-					dst = bp->dst;
-
-					if (skip & 1) {
-						skip++;
-						src++;
-						if (--num == 0) continue;
-					}
-
-					if (skip & 2) {
-						skip += 2;
-						src += 2;
-						num -= 2;
-						if (num <= 0) continue;
-					}
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip >> 2;
-					} else {
-						src -= skip;
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-
-					ctab = _color_remap_ptr;
-					num = (num + 3) >> 2;
-					for (; num != 0; num--) {
-							*dst = ctab[*src];
-							dst++;
-							src += 4;
-					}
-				} while (!(done & 0x80));
-				bp->dst += bp->pitch;
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-			}
-			break;
-
-		case BM_TRANSPARENT:
-			for (;;) {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src_o += num + 2;
-
-					dst = bp->dst;
-
-					if (skip & 1) {
-						skip++;
-						if (--num == 0) continue;
-					}
-
-					if (skip & 2) {
-						skip += 2;
-						num -= 2;
-						if (num <= 0) continue;
-					}
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip >> 2;
-					} else {
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-
-					ctab = _color_remap_ptr;
-					num = (num + 3) >> 2;
-					for (; num != 0; num--) {
-							*dst = ctab[*dst];
-							dst++;
-					}
-
-				} while (!(done & 0x80));
-				bp->dst += bp->pitch;
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-			}
-			break;
-
-		default:
-			for (;;) {
-				do {
-					done = src_o[0];
-					num = done & 0x7F;
-					skip = src_o[1];
-					src = src_o + 2;
-					src_o += num + 2;
-
-					dst = bp->dst;
-
-					if (skip & 1) {
-						skip++;
-						src++;
-						if (--num == 0) continue;
-					}
-
-					if (skip & 2) {
-						skip += 2;
-						src += 2;
-						num -= 2;
-						if (num <= 0) continue;
-					}
-
-					if ( (skip -= bp->start_x) > 0) {
-						dst += skip >> 2;
-					} else {
-						src -= skip;
-						num += skip;
-						if (num <= 0) continue;
-						skip = 0;
-					}
-
-					skip = skip + num - bp->width;
-					if (skip > 0) {
-						num -= skip;
-						if (num <= 0) continue;
-					}
-
-					num = (num + 3) >> 2;
-
-					for (; num != 0; num--) {
-							*dst = *src;
-							dst++;
-							src += 4;
-					}
-				} while (!(done & 0x80));
-
-				bp->dst += bp->pitch;
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-
-				do {
-					done = src_o[0];
-					src_o += (done & 0x7F) + 2;
-				} while (!(done & 0x80));
-				if (--bp->height == 0) return;
-			}
-			break;
-	}
-}
-
-static void GfxBlitZoomOutUncomp(BlitterParams *bp)
-{
-	const byte *src = bp->sprite;
-	Pixel *dst = bp->dst;
-	int height = bp->height;
-	int width = bp->width;
-	int i;
-
-	assert(height > 0);
-	assert(width > 0);
-
-	switch (bp->mode) {
-		case BM_COLOUR_REMAP: {
-			const byte *ctab = _color_remap_ptr;
-
-			for (height >>= 2; height != 0; height--) {
-				for (i = 0; i != width >> 2; i++) {
-					byte b = ctab[src[i * 4]];
-
-					if (b != 0) dst[i] = b;
-				}
-				src += bp->width_org * 4;
-				dst += bp->pitch;
-			}
-			break;
-		}
-
-		case BM_TRANSPARENT: {
-			const byte *ctab = _color_remap_ptr;
-
-			for (height >>= 2; height != 0; height--) {
-				for (i = 0; i != width >> 2; i++)
-					if (src[i * 4] != 0) dst[i] = ctab[dst[i]];
-				src += bp->width_org * 4;
-				dst += bp->pitch;
-			}
-			break;
-		}
-
-		default:
-			for (height >>= 2; height != 0; height--) {
-				for (i = 0; i != width >> 2; i++)
-					if (src[i * 4] != 0) dst[i] = src[i * 4];
-				src += bp->width_org * 4;
-				dst += bp->pitch;
-			}
-			break;
-	}
-}
-
-
 static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode)
 {
 	const DrawPixelInfo *dpi = _cur_dpi;
 	int start_x, start_y;
 	BlitterParams bp;
-	int zoom_mask = ~((1 << dpi->zoom) - 1);
+	int zoom_mask = ~(ScaleByZoom(1, dpi->zoom) - 1);
 
 	/* decode sprite header */
 	x += sprite->x_offs;
@@ -1443,7 +923,7 @@
 		/* tile blit */
 		start_y = 0;
 
-		if (dpi->zoom > 0) {
+		if (dpi->zoom > ZOOM_LVL_NORMAL) {
 			start_y += bp.height & ~zoom_mask;
 			bp.height &= zoom_mask;
 			if (bp.height == 0) return;
@@ -1456,7 +936,7 @@
 			start_y -= y;
 			y = 0;
 		} else {
-			bp.dst += bp.pitch * (y >> dpi->zoom);
+			bp.dst += bp.pitch * UnScaleByZoom(y, dpi->zoom);
 		}
 		bp.start_y = start_y;
 
@@ -1474,19 +954,14 @@
 			x = 0;
 		}
 		bp.start_x = start_x;
-		bp.dst += x >> dpi->zoom;
+		bp.dst += UnScaleByZoom(x, dpi->zoom);
 
 		if ( (x = x + bp.width - dpi->width) > 0) {
 			bp.width -= x;
 			if (bp.width <= 0) return;
 		}
 
-		switch (dpi->zoom) {
-			default: NOT_REACHED();
-			case 0: GfxBlitTileZoomIn(&bp);     break;
-			case 1: GfxBlitTileZoomMedium(&bp); break;
-			case 2: GfxBlitTileZoomOut(&bp);    break;
-		}
+		GfxBlitTileZoom(&bp, dpi->zoom);
 	} else {
 		bp.sprite += bp.width * (bp.height & ~zoom_mask);
 		bp.height &= zoom_mask;
@@ -1500,7 +975,7 @@
 			bp.sprite -= bp.width * y;
 			y = 0;
 		} else {
-			bp.dst += bp.pitch * (y >> dpi->zoom);
+			bp.dst += bp.pitch * UnScaleByZoom(y, dpi->zoom);
 		}
 
 		if (bp.height > dpi->height - y) {
@@ -1516,19 +991,14 @@
 			bp.sprite -= x;
 			x = 0;
 		}
-		bp.dst += x >> dpi->zoom;
+		bp.dst += UnScaleByZoom(x, dpi->zoom);
 
 		if (bp.width > dpi->width - x) {
 			bp.width = dpi->width - x;
 			if (bp.width <= 0) return;
 		}
 
-		switch (dpi->zoom) {
-			default: NOT_REACHED();
-			case 0: GfxBlitZoomInUncomp(&bp);     break;
-			case 1: GfxBlitZoomMediumUncomp(&bp); break;
-			case 2: GfxBlitZoomOutUncomp(&bp);    break;
-		}
+		GfxBlitZoomUncomp(&bp, dpi->zoom);
 	}
 }
 
@@ -1945,7 +1415,7 @@
 {
 	const DrawPixelInfo *o = _cur_dpi;
 
-	n->zoom = 0;
+	n->zoom = ZOOM_LVL_NORMAL;
 
 	assert(width > 0);
 	assert(height > 0);
--- a/src/gfx.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/gfx.h	Sat Jun 02 19:59:29 2007 +0000
@@ -6,6 +6,7 @@
 #define GFX_H
 
 #include "openttd.h"
+#include "zoom.hpp"
 
 enum WindowKeyCodes {
 	WKC_SHIFT = 0x8000,
@@ -72,7 +73,7 @@
 
 	/* backquote is the key left of "1"
 	 * we only store this key here, no matter what character is really mapped to it
-	 * on a particular keyboard. (US keyboard: ` and ~ ; German keyboard: ^ and °) */
+	 * on a particular keyboard. (US keyboard: ` and ~ ; German keyboard: ^ and °) */
 	WKC_BACKQUOTE   = 45,
 	WKC_PAUSE       = 46,
 
@@ -136,7 +137,7 @@
 	Pixel *dst_ptr;
 	int left, top, width, height;
 	int pitch;
-	uint16 zoom;
+	ZoomLevel zoom;
 };
 
 struct Colour {
@@ -243,7 +244,6 @@
 /* window.cpp */
 void DrawOverlappedWindowForAll(int left, int top, int right, int bottom);
 
-void SetMouseCursor(CursorID cursor);
 void SetMouseCursor(SpriteID sprite, SpriteID pal);
 void SetAnimatedMouseCursor(const AnimCursor *table);
 void CursorTick();
--- a/src/gfxinit.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/gfxinit.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -208,7 +208,7 @@
 /* Medium font */
 	   2,   92, ///< ' ' till 'z'
 	SKIP,   36,
-	 160,  160, ///< Move ¾ to the correct position
+	 160,  160, ///< Move Ÿ to the correct position
 	  98,   98, ///< Up arrow
 	 131,  133,
 	SKIP,    1, ///< skip currency sign
@@ -233,7 +233,7 @@
 /* Small font */
 	 226,  316, ///< ' ' till 'z'
 	SKIP,   36,
-	 384,  384, ///< Move ¾ to the correct position
+	 384,  384, ///< Move Ÿ to the correct position
 	 322,  322, ///< Up arrow
 	 355,  357,
 	SKIP,    1, ///< skip currency sign
@@ -255,7 +255,7 @@
 /* Big font */
 	 450,  540, ///< ' ' till 'z'
 	SKIP,   36,
-	 608,  608, ///< Move ¾ to the correct position
+	 608,  608, ///< Move Ÿ to the correct position
 	SKIP,    1,
 	 579,  581,
 	SKIP,    1,
@@ -294,47 +294,47 @@
 	582, 582,  ///<  euro symbol large size
 	358, 358,  ///<  euro symbol tiny
 	SPR_CURSOR_CANAL, SPR_IMG_FASTFORWARD, // more icons
-	648, 648, ///<  nordic char: æ
-	616, 616, ///<  nordic char: Æ
-	666, 666, ///<  nordic char: ø
-	634, 634, ///<  nordic char: Ø
+	648, 648, ///<  nordic char: æ
+	616, 616, ///<  nordic char: Æ
+	666, 666, ///<  nordic char: ø
+	634, 634, ///<  nordic char: Ø
 	SPR_PIN_UP, SPR_CURSOR_CLONE_TRAIN, // more icons
-	382, 383, ///<  ¼ ½ tiny
-	158, 159, ///<  ¼ ½ medium
-	606, 607, ///<  ¼ ½ large
-	360, 360, ///<  ¦ tiny
-	362, 362, ///<  ¨ tiny
-	136, 136, ///<  ¦ medium
-	138, 138, ///<  ¨ medium
-	584, 584, ///<  ¦ large
-	586, 586, ///<  ¨ large
-	626, 626, ///<  Ð large
-	658, 658, ///<  ð large
-	374, 374, ///<  ´ tiny
-	378, 378, ///<  ¸ tiny
-	150, 150, ///<  ´ medium
-	154, 154, ///<  ¸ medium
-	598, 598, ///<  ´ large
-	602, 602, ///<  ¸ large
-	640, 640, ///<  Þ large
-	672, 672, ///<  þ large
-	380, 380, ///<  º tiny
-	156, 156, ///<  º medium
-	604, 604, ///<  º large
+	382, 383, ///<  Å’ Å“ tiny
+	158, 159, ///<  Å’ Å“ medium
+	606, 607, ///<  Å’ Å“ large
+	360, 360, ///<  Å  tiny
+	362, 362, ///<  Å¡ tiny
+	136, 136, ///<  Å  medium
+	138, 138, ///<  Å¡ medium
+	584, 584, ///<  Å  large
+	586, 586, ///<  Å¡ large
+	626, 626, ///<  Ã large
+	658, 658, ///<  ð large
+	374, 374, ///<  Ž tiny
+	378, 378, ///<  ž tiny
+	150, 150, ///<  Ž medium
+	154, 154, ///<  ž medium
+	598, 598, ///<  Ž large
+	602, 602, ///<  ž large
+	640, 640, ///<  Þ large
+	672, 672, ///<  þ large
+	380, 380, ///<  º tiny
+	156, 156, ///<  º medium
+	604, 604, ///<  º large
 	317, 320, ///<  { | } ~ tiny
 	 93,  96, ///<  { | } ~ medium
 	541, 544, ///<  { | } ~ large
 	SPR_HOUSE_ICON, SPR_HOUSE_ICON,
-	585, 585, ///<  § large
-	587, 587, ///<  © large
-	592, 592, ///<  ® large
-	594, 597, ///<  ° ± ² ³ large
-	633, 633, ///<  × large
-	665, 665, ///<  ÷ large
+	585, 585, ///<  § large
+	587, 587, ///<  © large
+	592, 592, ///<  ® large
+	594, 597, ///<  ° ± ² ³ large
+	633, 633, ///<  × large
+	665, 665, ///<  ÷ large
 	SPR_SELL_TRAIN, SPR_SHARED_ORDERS_ICON,
-	377, 377, ///<  · small
-	153, 153, ///<  · medium
-	601, 601, ///<  · large
+	377, 377, ///<  · small
+	153, 153, ///<  · medium
+	601, 601, ///<  · large
 	SPR_WARNING_SIGN, SPR_WARNING_SIGN,
 	END
 };
@@ -393,6 +393,18 @@
 	assert(load_index == SPR_ROADSTOP_BASE);
 	load_index += LoadGrfFile("roadstops.grf", load_index, i++);
 
+	assert(load_index == SPR_GROUP_BASE);
+	load_index += LoadGrfFile("group.grf", load_index, i++);
+
+	assert(load_index == SPR_TRAMWAY_BASE);
+	load_index += LoadGrfFile("tramtrkw.grf", load_index, i++);
+
+	assert(load_index == SPR_ONEWAY_BASE);
+	load_index += LoadGrfFile("oneway.grf", load_index, i++);
+
+	assert(load_index == SPR_FLAGS_BASE);
+	load_index += LoadGrfFile("flags.grf", load_index, i++);
+
 	/* Initialize the unicode to sprite mapping table */
 	InitializeUnicodeGlyphMap();
 
--- a/src/graph_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/graph_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -26,7 +26,7 @@
 /************************/
 
 enum {
-	GRAPH_MAX_DATASETS = 16,
+	GRAPH_MAX_DATASETS = 32,
 	GRAPH_AXIS_LABEL_COLOUR = 16,
 	GRAPH_AXIS_LINE_COLOUR  = 215,
 
@@ -222,7 +222,7 @@
 					y = gw->top + x_axis_offset - (x_axis_offset * datapoint) / highest_value;
 
 					/* Draw the point. */
-					GfxFillRect(x-1, y-1, x+1, y+1, color);
+					GfxFillRect(x - 1, y - 1, x + 1, y + 1, color);
 
 					/* Draw the line connected to the previous point. */
 					if (prev_x != INVALID_DATAPOINT_POS) GfxDrawLine(prev_x, prev_y, x, y, color);
@@ -268,7 +268,7 @@
 			FOR_ALL_PLAYERS(p) {
 				if (!p->is_active) continue;
 
-				DrawPlayerIcon(p->index, 4, 18+p->index*12);
+				DrawPlayerIcon(p->index, 4, 18 + p->index * 12);
 
 				SetDParam(0, p->name_1);
 				SetDParam(1, p->name_2);
@@ -330,7 +330,7 @@
 	const Player* p;
 	uint excluded_players = _legend_excluded_players;
 	byte nums;
-	int mo,yr;
+	int mo, yr;
 
 	/* Exclude the players which aren't valid */
 	FOR_ALL_PLAYERS(p) {
@@ -908,7 +908,7 @@
 
 void ShowCompanyLeagueTable()
 {
-	AllocateWindowDescFront(&_company_league_desc,0);
+	AllocateWindowDescFront(&_company_league_desc, 0);
 }
 
 /*****************************/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/group.h	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,97 @@
+/* $Id$ */
+
+/** @file group.h */
+
+#ifndef GROUP_H
+#define GROUP_H
+
+#include "oldpool.h"
+
+enum {
+	DEFAULT_GROUP = 0xFFFE,
+	INVALID_GROUP = 0xFFFF,
+};
+
+struct Group {
+	StringID string_id;                     ///< Group Name
+
+	uint16 num_vehicle;                     ///< Number of vehicles wich belong to the group
+	PlayerID owner;                         ///< Group Owner
+	GroupID index;                          ///< Array index
+	VehicleTypeByte vehicle_type;           ///< Vehicle type of the group
+
+	bool replace_protection;                ///< If set to true, the global autoreplace have no effect on the group
+	uint16 num_engines[TOTAL_NUM_ENGINES];  ///< Caches the number of engines of each type the player owns (no need to save this)
+};
+
+DECLARE_OLD_POOL(Group, Group, 5, 2047)
+
+
+static inline bool IsValidGroup(const Group *g)
+{
+	return g->string_id != STR_NULL;
+}
+
+static inline void DestroyGroup(Group *g)
+{
+	DeleteName(g->string_id);
+}
+
+static inline void DeleteGroup(Group *g)
+{
+	DestroyGroup(g);
+	g->string_id = STR_NULL;
+}
+
+static inline bool IsValidGroupID(GroupID index)
+{
+	return index < GetGroupPoolSize() && IsValidGroup(GetGroup(index));
+}
+
+static inline bool IsDefaultGroupID(GroupID index)
+{
+	return (index == DEFAULT_GROUP);
+}
+
+static inline StringID GetGroupName(GroupID index)
+{
+	if (!IsValidGroupID(index)) return STR_NULL;
+
+	return GetGroup(index)->string_id;
+}
+
+
+#define FOR_ALL_GROUPS_FROM(g, start) for (g = GetGroup(start); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) if (IsValidGroup(g))
+#define FOR_ALL_GROUPS(g) FOR_ALL_GROUPS_FROM(g, 0)
+
+/**
+ * Get the current size of the GroupPool
+ */
+static inline uint GetGroupArraySize(void)
+{
+	const Group *g;
+	uint num = 0;
+
+	FOR_ALL_GROUPS(g) num++;
+
+	return num;
+}
+
+static inline void IncreaseGroupNumVehicle(GroupID id_g)
+{
+	if (IsValidGroupID(id_g)) GetGroup(id_g)->num_vehicle++;
+}
+
+static inline void DecreaseGroupNumVehicle(GroupID id_g)
+{
+	if (IsValidGroupID(id_g)) GetGroup(id_g)->num_vehicle--;
+}
+
+
+void InitializeGroup();
+void SetTrainGroupID(Vehicle *v, GroupID grp);
+void UpdateTrainGroupID(Vehicle *v);
+void RemoveVehicleFromGroup(const Vehicle *v);
+void RemoveAllGroupsForPlayer(const Player *p);
+
+#endif /* GROUP_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/group_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,444 @@
+/* $Id$ */
+
+/** @file group_cmd.cpp Handling of the engine groups */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "functions.h"
+#include "player.h"
+#include "table/strings.h"
+#include "command.h"
+#include "vehicle.h"
+#include "saveload.h"
+#include "debug.h"
+#include "group.h"
+#include "train.h"
+#include "aircraft.h"
+#include "string.h"
+#include "window.h"
+#include "vehicle_gui.h"
+
+/**
+ * Update the num engines of a groupID. Decrease the old one and increase the new one
+ * @note called in SetTrainGroupID and UpdateTrainGroupID
+ * @param i     EngineID we have to update
+ * @param old_g index of the old group
+ * @param new_g index of the new group
+ */
+static inline void UpdateNumEngineGroup(EngineID i, GroupID old_g, GroupID new_g)
+{
+	if (old_g != new_g) {
+		/* Decrease the num engines of EngineID i of the old group if it's not the default one */
+		if (!IsDefaultGroupID(old_g) && IsValidGroupID(old_g)) GetGroup(old_g)->num_engines[i]--;
+
+		/* Increase the num engines of EngineID i of the new group if it's not the new one */
+		if (!IsDefaultGroupID(new_g) && IsValidGroupID(new_g)) GetGroup(new_g)->num_engines[i]++;
+	}
+}
+
+
+/**
+ * Called if a new block is added to the group-pool
+ */
+static void GroupPoolNewBlock(uint start_item)
+{
+	/* 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 (Group *g = GetGroup(start_item); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) g->index = start_item++;
+}
+
+DEFINE_OLD_POOL(Group, Group, GroupPoolNewBlock, NULL)
+
+static Group *AllocateGroup(void)
+{
+	/* 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 (Group *g = GetGroup(0); g != NULL; g = (g->index + 1U < GetGroupPoolSize()) ? GetGroup(g->index + 1) : NULL) {
+		if (!IsValidGroup(g)) {
+			const GroupID index = g->index;
+
+			memset(g, 0, sizeof(*g));
+			g->index = index;
+
+			return g;
+		}
+	}
+
+	/* Check if we can add a block to the pool */
+	return (AddBlockToPool(&_Group_pool)) ? AllocateGroup() : NULL;
+}
+
+void InitializeGroup(void)
+{
+	CleanPool(&_Group_pool);
+	AddBlockToPool(&_Group_pool);
+}
+
+
+static WindowClass GetWCForVT(VehicleType vt)
+{
+	switch (vt) {
+		default:
+		case VEH_TRAIN:    return WC_TRAINS_LIST;
+		case VEH_ROAD:     return WC_ROADVEH_LIST;
+		case VEH_SHIP:     return WC_SHIPS_LIST;
+		case VEH_AIRCRAFT: return WC_AIRCRAFT_LIST;
+	}
+}
+
+
+/**
+ * Add a vehicle to a group
+ * @param tile unused
+ * @param p1   vehicle type
+ * @param p2   unused
+ */
+int32 CmdCreateGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	VehicleType vt = (VehicleType)p1;
+	if (!IsPlayerBuildableVehicleType(vt)) return CMD_ERROR;
+
+	Group *g = AllocateGroup();
+	if (g == NULL) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		g->owner = _current_player;
+		g->string_id = STR_SV_GROUP_NAME;
+		g->replace_protection = false;
+		g->vehicle_type = vt;
+
+		InvalidateWindowData(GetWCForVT(vt), (vt << 11) | VLW_GROUP_LIST | _current_player);
+	}
+
+	return 0;
+}
+
+
+/**
+ * Add a vehicle to a group
+ * @param tile unused
+ * @param p1   index of array group
+ *      - p1 bit 0-15 : GroupID
+ * @param p2   unused
+ */
+int32 CmdDeleteGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	if (!IsValidGroupID(p1)) return CMD_ERROR;
+
+	Group *g = GetGroup(p1);
+	if (g->owner != _current_player) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		Vehicle *v;
+
+		/* Add all vehicles belong to the group to the default group */
+		FOR_ALL_VEHICLES(v) {
+			if (v->group_id == g->index && v->type == g->vehicle_type) v->group_id = DEFAULT_GROUP;
+		}
+
+		/* If we set an autoreplace for the group we delete, remove it. */
+		if (_current_player < MAX_PLAYERS) {
+			Player *p;
+			EngineRenew *er;
+
+			p = GetPlayer(_current_player);
+			FOR_ALL_ENGINE_RENEWS(er) {
+				if (er->group_id == g->index) RemoveEngineReplacementForPlayer(p, er->from, g->index, flags);
+			}
+		}
+
+		VehicleType vt = g->vehicle_type;
+
+		/* Delete the Replace Vehicle Windows */
+		DeleteWindowById(WC_REPLACE_VEHICLE, g->vehicle_type);
+		DeleteGroup(g);
+
+		InvalidateWindowData(GetWCForVT(vt), (vt << 11) | VLW_GROUP_LIST | _current_player);
+	}
+
+	return 0;
+}
+
+
+/**
+ * Rename a group
+ * @param tile unused
+ * @param p1   index of array group
+ *   - p1 bit 0-15 : GroupID
+ * @param p2   unused
+ */
+int32 CmdRenameGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	if (!IsValidGroupID(p1) || StrEmpty(_cmd_text)) return CMD_ERROR;
+
+	Group *g = GetGroup(p1);
+	if (g->owner != _current_player) return CMD_ERROR;
+
+	/* Create the name */
+	StringID str = AllocateName(_cmd_text, 0);
+	if (str == STR_NULL) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		/* Delete the old name */
+		DeleteName(g->string_id);
+		/* Assign the new one */
+		g->string_id = str;
+
+		InvalidateWindowData(GetWCForVT(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_player);
+	}
+
+	return 0;
+}
+
+
+/**
+ * Add a vehicle to a group
+ * @param tile unused
+ * @param p1   index of array group
+ *   - p1 bit 0-15 : GroupID
+ * @param p2   vehicle to add to a group
+ *   - p2 bit 0-15 : VehicleID
+ */
+int32 CmdAddVehicleGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	GroupID new_g = p1;
+
+	if (!IsValidVehicleID(p2) || (!IsValidGroupID(new_g) && !IsDefaultGroupID(new_g))) return CMD_ERROR;
+
+	if (IsValidGroupID(new_g)) {
+		Group *g = GetGroup(new_g);
+		if (g->owner != _current_player) return CMD_ERROR;
+	}
+
+	Vehicle *v = GetVehicle(p2);
+	if (v->owner != _current_player || !v->IsPrimaryVehicle()) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		DecreaseGroupNumVehicle(v->group_id);
+		IncreaseGroupNumVehicle(new_g);
+
+		switch (v->type) {
+			default: NOT_REACHED();
+			case VEH_TRAIN:
+				SetTrainGroupID(v, new_g);
+				break;
+			case VEH_ROAD:
+			case VEH_SHIP:
+			case VEH_AIRCRAFT:
+				if (IsEngineCountable(v)) UpdateNumEngineGroup(v->engine_type, v->group_id, new_g);
+				v->group_id = new_g;
+				break;
+		}
+
+		/* Update the Replace Vehicle Windows */
+		InvalidateWindow(WC_REPLACE_VEHICLE, v->type);
+		InvalidateWindowData(GetWCForVT(v->type), (v->type << 11) | VLW_GROUP_LIST | _current_player);
+	}
+
+	return 0;
+}
+
+/**
+ * Add all shared vehicles of all vehicles from a group
+ * @param tile unused
+ * @param p1   index of group array
+ *  - p1 bit 0-15 : GroupID
+ * @param p2   type of vehicles
+ */
+int32 CmdAddSharedVehicleGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	VehicleType type = (VehicleType)p2;
+	if (!IsValidGroupID(p1) || !IsPlayerBuildableVehicleType(type)) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		Vehicle *v;
+		VehicleType type = (VehicleType)p2;
+		GroupID id_g = p1;
+
+		/* Find the first front engine which belong to the group id_g
+		 * then add all shared vehicles of this front engine to the group id_g */
+		FOR_ALL_VEHICLES(v) {
+			if (v->type == type && v->IsPrimaryVehicle()) {
+				if (v->group_id != id_g) continue;
+
+				/* For each shared vehicles add it to the group */
+				for (Vehicle *v2 = GetFirstVehicleFromSharedList(v); v2 != NULL; v2 = v2->next_shared) {
+					if (v2->group_id != id_g) CmdAddVehicleGroup(tile, flags, id_g, v2->index);
+				}
+			}
+		}
+
+		InvalidateWindowData(GetWCForVT(type), (type << 11) | VLW_GROUP_LIST | _current_player);
+	}
+
+	return 0;
+}
+
+
+/**
+ * Remove all vehicles from a group
+ * @param tile unused
+ * @param p1   index of group array
+ * - p1 bit 0-15 : GroupID
+ * @param p2   type of vehicles
+ */
+int32 CmdRemoveAllVehiclesGroup(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	VehicleType type = (VehicleType)p2;
+	if (!IsValidGroupID(p1) || !IsPlayerBuildableVehicleType(type)) return CMD_ERROR;
+
+	Group *g = GetGroup(p1);
+	if (g->owner != _current_player) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		GroupID old_g = p1;
+		Vehicle *v;
+
+		/* Find each Vehicle that belongs to the group old_g and add it to the default group */
+		FOR_ALL_VEHICLES(v) {
+			if (v->type == type && v->IsPrimaryVehicle()) {
+				if (v->group_id != old_g) continue;
+
+				/* Add The Vehicle to the default group */
+				CmdAddVehicleGroup(tile, flags, DEFAULT_GROUP, v->index);
+			}
+		}
+
+		InvalidateWindowData(GetWCForVT(type), (type << 11) | VLW_GROUP_LIST | _current_player);
+	}
+
+	return 0;
+}
+
+
+/**
+ * (Un)set global replace protection from a group
+ * @param tile unused
+ * @param p1   index of group array
+ * - p1 bit 0-15 : GroupID
+ * @param p2
+ * - p2 bit 0    : 1 to set or 0 to clear protection.
+ */
+int32 CmdSetGroupReplaceProtection(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
+{
+	if (!IsValidGroupID(p1)) return CMD_ERROR;
+
+	Group *g = GetGroup(p1);
+	if (g->owner != _current_player) return CMD_ERROR;
+
+	if (flags & DC_EXEC) {
+		g->replace_protection = HASBIT(p2, 0);
+
+		InvalidateWindowData(GetWCForVT(g->vehicle_type), (g->vehicle_type << 11) | VLW_GROUP_LIST | _current_player);
+	}
+
+	return 0;
+}
+
+/**
+ * Decrease the num_vehicle variable before delete an front engine from a group
+ * @note Called in CmdSellRailWagon and DeleteLasWagon,
+ * @param v     FrontEngine of the train we want to remove.
+ */
+void RemoveVehicleFromGroup(const Vehicle *v)
+{
+	if (!IsValidVehicle(v) || !(v->HasFront() && v->IsPrimaryVehicle())) return;
+
+	if (!IsDefaultGroupID(v->group_id)) DecreaseGroupNumVehicle(v->group_id);
+}
+
+
+/**
+ * Affect the groupID of a train to new_g.
+ * @note called in CmdAddVehicleGroup and CmdMoveRailVehicle
+ * @param v     First vehicle of the chain.
+ * @param new_g index of array group
+ */
+void SetTrainGroupID(Vehicle *v, GroupID new_g)
+{
+	if (!IsValidGroupID(new_g) && !IsDefaultGroupID(new_g)) return;
+
+	assert(IsValidVehicle(v) && v->type == VEH_TRAIN && IsFrontEngine(v));
+
+	for (Vehicle *u = v; u != NULL; u = u->next) {
+		if (IsEngineCountable(u)) UpdateNumEngineGroup(u->engine_type, u->group_id, new_g);
+
+		u->group_id = new_g;
+	}
+
+	/* Update the Replace Vehicle Windows */
+	InvalidateWindow(WC_REPLACE_VEHICLE, VEH_TRAIN);
+}
+
+
+/**
+ * Recalculates the groupID of a train. Should be called each time a vehicle is added
+ * to/removed from the chain,.
+ * @note this needs to be called too for 'wagon chains' (in the depot, without an engine)
+ * @note Called in CmdBuildRailVehicle, CmdBuildRailWagon, CmdMoveRailVehicle, CmdSellRailWagon
+ * @param v First vehicle of the chain.
+ */
+void UpdateTrainGroupID(Vehicle *v)
+{
+	assert(IsValidVehicle(v) && v->type == VEH_TRAIN && (IsFrontEngine(v) || IsFreeWagon(v)));
+
+	GroupID new_g = IsFrontEngine(v) ? v->group_id : (GroupID)DEFAULT_GROUP;
+	for (Vehicle *u = v; u != NULL; u = u->next) {
+		if (IsEngineCountable(u)) UpdateNumEngineGroup(u->engine_type, u->group_id, new_g);
+
+		u->group_id = new_g;
+	}
+
+	/* Update the Replace Vehicle Windows */
+	InvalidateWindow(WC_REPLACE_VEHICLE, VEH_TRAIN);
+}
+
+
+void RemoveAllGroupsForPlayer(const Player *p)
+{
+	Group *g;
+
+	FOR_ALL_GROUPS(g) {
+		if (p->index == g->owner) DeleteGroup(g);
+	}
+}
+
+
+static const SaveLoad _group_desc[] = {
+  SLE_VAR(Group, string_id,          SLE_UINT16),
+  SLE_VAR(Group, num_vehicle,        SLE_UINT16),
+  SLE_VAR(Group, owner,              SLE_UINT8),
+  SLE_VAR(Group, vehicle_type,       SLE_UINT8),
+  SLE_VAR(Group, replace_protection, SLE_BOOL),
+  SLE_END()
+};
+
+
+static void Save_GROUP(void)
+{
+	Group *g;
+
+	FOR_ALL_GROUPS(g) {
+		SlSetArrayIndex(g->index);
+		SlObject(g, _group_desc);
+	}
+}
+
+
+static void Load_GROUP(void)
+{
+	int index;
+
+	while ((index = SlIterateArray()) != -1) {
+		if (!AddBlockIfNeeded(&_Group_pool, index)) {
+			error("Groups: failed loading savegame: too many groups");
+		}
+
+		Group *g = GetGroup(index);
+		SlObject(g, _group_desc);
+	}
+}
+
+extern const ChunkHandler _group_chunk_handlers[] = {
+	{ 'GRPS', Save_GROUP, Load_GROUP, CH_ARRAY | CH_LAST},
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/group_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,801 @@
+/* $Id$ */
+
+/** @file group_gui.cpp */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "functions.h"
+#include "table/strings.h"
+#include "table/sprites.h"
+#include "window.h"
+#include "gui.h"
+#include "gfx.h"
+#include "vehicle.h"
+#include "command.h"
+#include "engine.h"
+#include "vehicle_gui.h"
+#include "depot.h"
+#include "train.h"
+#include "date.h"
+#include "group.h"
+#include "helpers.hpp"
+#include "viewport.h"
+#include "strings.h"
+#include "debug.h"
+
+
+struct Sorting {
+	Listing aircraft;
+	Listing roadveh;
+	Listing ship;
+	Listing train;
+};
+
+static Sorting _sorting;
+
+
+static void BuildGroupList(grouplist_d* gl, PlayerID owner, VehicleType vehicle_type)
+{
+	const Group** list;
+	const Group *g;
+	uint n = 0;
+
+	if (!(gl->l.flags & VL_REBUILD)) return;
+
+	list = MallocT<const Group*>(GetGroupArraySize());
+	if (list == NULL) {
+		error("Could not allocate memory for the group-sorting-list");
+	}
+
+	FOR_ALL_GROUPS(g) {
+		if (g->owner == owner && g->vehicle_type == vehicle_type) list[n++] = g;
+	}
+
+	free((void*)gl->sort_list);
+	gl->sort_list = MallocT<const Group *>(n);
+	if (n != 0 && gl->sort_list == NULL) {
+		error("Could not allocate memory for the group-sorting-list");
+	}
+	gl->l.list_length = n;
+
+	for (uint i = 0; i < n; ++i) gl->sort_list[i] = list[i];
+	free((void*)list);
+
+	gl->l.flags &= ~VL_REBUILD;
+	gl->l.flags |= VL_RESORT;
+}
+
+
+static int CDECL GroupNameSorter(const void *a, const void *b)
+{
+	static const Group *last_group[2] = { NULL, NULL };
+	static char         last_name[2][64] = { "", "" };
+
+	const Group *ga = *(const Group**)a;
+	const Group *gb = *(const Group**)b;
+	int r;
+
+	if (ga != last_group[0]) {
+		last_group[0] = ga;
+		SetDParam(0, ga->index);
+		GetString(last_name[0], ga->string_id, lastof(last_name[0]));
+	}
+
+	if (gb != last_group[1]) {
+		last_group[1] = gb;
+		SetDParam(0, gb->index);
+		GetString(last_name[1], gb->string_id, lastof(last_name[1]));
+	}
+
+	r = strcmp(last_name[0], last_name[1]); // sort by name
+
+	if (r == 0) return ga->index - gb->index;
+
+	return r;
+}
+
+
+static void SortGroupList(grouplist_d *gl)
+{
+	if (!(gl->l.flags & VL_RESORT)) return;
+
+	qsort((void*)gl->sort_list, gl->l.list_length, sizeof(gl->sort_list[0]), GroupNameSorter);
+
+	gl->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
+	gl->l.flags &= ~VL_RESORT;
+}
+
+
+enum GroupListWidgets {
+	GRP_WIDGET_CLOSEBOX = 0,
+	GRP_WIDGET_CAPTION,
+	GRP_WIDGET_STICKY,
+	GRP_WIDGET_EMPTY_TOP_LEFT,
+	GRP_WIDGET_ALL_VEHICLES,
+	GRP_WIDGET_LIST_GROUP,
+	GRP_WIDGET_LIST_GROUP_SCROLLBAR,
+	GRP_WIDGET_SORT_BY_ORDER,
+	GRP_WIDGET_SORT_BY_TEXT,
+	GRP_WIDGET_SORT_BY_DROPDOWN,
+	GRP_WIDGET_EMPTY_TOP_RIGHT,
+	GRP_WIDGET_LIST_VEHICLE,
+	GRP_WIDGET_LIST_VEHICLE_SCROLLBAR,
+	GRP_WIDGET_CREATE_GROUP,
+	GRP_WIDGET_DELETE_GROUP,
+	GRP_WIDGET_RENAME_GROUP,
+	GRP_WIDGET_EMPTY1,
+	GRP_WIDGET_REPLACE_PROTECTION,
+	GRP_WIDGET_EMPTY2,
+	GRP_WIDGET_AVAILABLE_VEHICLES,
+	GRP_WIDGET_MANAGE_VEHICLES,
+	GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN,
+	GRP_WIDGET_STOP_ALL,
+	GRP_WIDGET_START_ALL,
+	GRP_WIDGET_EMPTY_BOTTOM_RIGHT,
+	GRP_WIDGET_RESIZE,
+};
+
+
+static const Widget _group_widgets[] = {
+{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,             STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION,  RESIZE_RIGHT,    14,    11,   513,     0,    13, 0x0,                  STR_018C_WINDOW_TITLE_DRAG_THIS},
+{  WWT_STICKYBOX,     RESIZE_LR,    14,   514,   525,     0,    13, 0x0,                  STR_STICKY_BUTTON},
+{      WWT_PANEL,   RESIZE_NONE,    14,     0,   200,    14,    25, 0x0,                  STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,     0,   200,    26,    39, 0x0,                  STR_NULL},
+{     WWT_MATRIX, RESIZE_BOTTOM,    14,     0,   188,    39,   220, 0x701,                STR_GROUPS_CLICK_ON_GROUP_FOR_TIP},
+{  WWT_SCROLLBAR, RESIZE_BOTTOM,    14,   189,   200,    26,   220, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,   201,   281,    14,    25, STR_SORT_BY,          STR_SORT_ORDER_TIP},
+{      WWT_PANEL,   RESIZE_NONE,    14,   282,   435,    14,    25, 0x0,                  STR_SORT_CRITERIA_TIP},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,   436,   447,    14,    25, STR_0225,             STR_SORT_CRITERIA_TIP},
+{      WWT_PANEL,  RESIZE_RIGHT,    14,   448,   525,    14,    25, 0x0,                  STR_NULL},
+{     WWT_MATRIX,     RESIZE_RB,    14,   201,   513,    26,   233, 0x701,                STR_NULL},
+{ WWT_SCROLL2BAR,    RESIZE_LRB,    14,   514,   525,    26,   233, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,     0,    23,   221,   245, 0x0,                  STR_GROUP_CREATE_TIP},
+{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,    24,    47,   221,   245, 0x0,                  STR_GROUP_DELETE_TIP},
+{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,    48,    71,   221,   245, 0x0,                  STR_GROUP_RENAME_TIP},
+{      WWT_PANEL,     RESIZE_TB,    14,    72,   164,   221,   245, 0x0,                  STR_NULL},
+{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,   165,   188,   221,   245, 0x0,                  STR_GROUP_REPLACE_PROTECTION_TIP},
+{      WWT_PANEL,     RESIZE_TB,    14,   189,   200,   221,   245, 0x0,                  STR_NULL},
+{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,   201,   306,   234,   245, 0x0,                  STR_AVAILABLE_ENGINES_TIP},
+{    WWT_TEXTBTN,     RESIZE_TB,    14,   307,   411,   234,   245, STR_MANAGE_LIST,      STR_MANAGE_LIST_TIP},
+{    WWT_TEXTBTN,     RESIZE_TB,    14,   412,   423,   234,   245, STR_0225,             STR_MANAGE_LIST_TIP},
+{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,   424,   435,   234,   245, SPR_FLAG_VEH_STOPPED, STR_MASS_STOP_LIST_TIP},
+{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,   436,   447,   234,   245, SPR_FLAG_VEH_RUNNING, STR_MASS_START_LIST_TIP},
+{      WWT_PANEL,    RESIZE_RTB,    14,   448,   513,   234,   245, 0x0,                  STR_NULL},
+{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   514,   525,   234,   245, 0x0,                  STR_RESIZE_BUTTON},
+{   WIDGETS_END},
+};
+
+
+static void CreateVehicleGroupWindow(Window *w)
+{
+	const PlayerID owner = (PlayerID)GB(w->window_number, 0, 8);
+	groupveh_d *gv = &WP(w, groupveh_d);
+	grouplist_d *gl = &WP(w, groupveh_d).gl;
+
+	w->caption_color = owner;
+	w->hscroll.cap = 10 * 29;
+	w->resize.step_width = 1;
+
+	switch (gv->vehicle_type) {
+		default: NOT_REACHED();
+		case VEH_TRAIN:
+		case VEH_ROAD:
+			w->vscroll.cap = 14;
+			w->vscroll2.cap = 8;
+			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_SMALL;
+			break;
+		case VEH_SHIP:
+		case VEH_AIRCRAFT:
+			w->vscroll.cap = 10;
+			w->vscroll2.cap = 4;
+			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_BIG2;
+			break;
+	}
+
+	w->widget[GRP_WIDGET_LIST_GROUP].data = (w->vscroll.cap << 8) + 1;
+	w->widget[GRP_WIDGET_LIST_VEHICLE].data = (w->vscroll2.cap << 8) + 1;
+
+	switch (gv->vehicle_type) {
+		default: NOT_REACHED(); break;
+		case VEH_TRAIN:    gv->_sorting = &_sorting.train;    break;
+		case VEH_ROAD:     gv->_sorting = &_sorting.roadveh;  break;
+		case VEH_SHIP:     gv->_sorting = &_sorting.ship;     break;
+		case VEH_AIRCRAFT: gv->_sorting = &_sorting.aircraft; break;
+	}
+
+	gv->sort_list = NULL;
+	gv->vehicle_type = (VehicleType)GB(w->window_number, 11, 5);
+	gv->l.sort_type = gv->_sorting->criteria;
+	gv->l.flags = VL_REBUILD | (gv->_sorting->order ? VL_DESC : VL_NONE);
+	gv->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;	// Set up resort timer
+
+	gl->sort_list = NULL;
+	gl->l.flags = VL_REBUILD | VL_NONE;
+	gl->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;	// Set up resort timer
+
+	gv->group_sel = DEFAULT_GROUP;
+
+	switch (gv->vehicle_type) {
+		case VEH_TRAIN:
+			w->widget[GRP_WIDGET_LIST_VEHICLE].tooltips = STR_883D_TRAINS_CLICK_ON_TRAIN_FOR;
+			w->widget[GRP_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_TRAINS;
+
+			w->widget[GRP_WIDGET_CREATE_GROUP].data = SPR_GROUP_CREATE_TRAIN;
+			w->widget[GRP_WIDGET_RENAME_GROUP].data = SPR_GROUP_RENAME_TRAIN;
+			w->widget[GRP_WIDGET_DELETE_GROUP].data = SPR_GROUP_DELETE_TRAIN;
+			break;
+
+		case VEH_ROAD:
+			w->widget[GRP_WIDGET_LIST_VEHICLE].tooltips = STR_901A_ROAD_VEHICLES_CLICK_ON;
+			w->widget[GRP_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_ROAD_VEHICLES;
+
+			w->widget[GRP_WIDGET_CREATE_GROUP].data = SPR_GROUP_CREATE_ROADVEH;
+			w->widget[GRP_WIDGET_RENAME_GROUP].data = SPR_GROUP_RENAME_ROADVEH;
+			w->widget[GRP_WIDGET_DELETE_GROUP].data = SPR_GROUP_DELETE_ROADVEH;
+			break;
+
+		case VEH_SHIP:
+			w->widget[GRP_WIDGET_LIST_VEHICLE].tooltips = STR_9823_SHIPS_CLICK_ON_SHIP_FOR;
+			w->widget[GRP_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_SHIPS;
+
+			w->widget[GRP_WIDGET_CREATE_GROUP].data = SPR_GROUP_CREATE_SHIP;
+			w->widget[GRP_WIDGET_RENAME_GROUP].data = SPR_GROUP_RENAME_SHIP;
+			w->widget[GRP_WIDGET_DELETE_GROUP].data = SPR_GROUP_DELETE_SHIP;
+			break;
+
+		case VEH_AIRCRAFT:
+			w->widget[GRP_WIDGET_LIST_VEHICLE].tooltips = STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT;
+			w->widget[GRP_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_AIRCRAFT;
+
+			w->widget[GRP_WIDGET_CREATE_GROUP].data = SPR_GROUP_CREATE_AIRCRAFT;
+			w->widget[GRP_WIDGET_RENAME_GROUP].data = SPR_GROUP_RENAME_AIRCRAFT;
+			w->widget[GRP_WIDGET_DELETE_GROUP].data = SPR_GROUP_DELETE_AIRCRAFT;
+			break;
+
+		default: NOT_REACHED();
+	}
+}
+
+/**
+ * Update/redraw the group action dropdown
+ * @param w   the window the dropdown belongs to
+ * @param gid the currently selected group in the window
+ */
+static void UpdateGroupActionDropdown(Window *w, GroupID gid, bool refresh = true)
+{
+	if (refresh && !IsWindowWidgetLowered(w, GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN)) return;
+
+	static StringID action_str[] = {
+		STR_REPLACE_VEHICLES,
+		STR_SEND_FOR_SERVICING,
+		STR_SEND_TRAIN_TO_DEPOT,
+		STR_NULL,
+		STR_NULL,
+		INVALID_STRING_ID
+	};
+
+	action_str[3] = IsDefaultGroupID(gid) ? INVALID_STRING_ID : STR_GROUP_ADD_SHARED_VEHICLE;
+	action_str[4] = IsDefaultGroupID(gid) ? INVALID_STRING_ID : STR_GROUP_REMOVE_ALL_VEHICLES;
+
+	ShowDropDownMenu(w, action_str, 0, GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN, 0, 0);
+}
+
+/**
+ * bitmask for w->window_number
+ * 0-7   PlayerID (owner)
+ * 11-15 vehicle type
+ **/
+static void GroupWndProc(Window *w, WindowEvent *e)
+{
+	const PlayerID owner = (PlayerID)GB(w->window_number, 0, 8);
+	const Player *p = GetPlayer(owner);
+	groupveh_d *gv = &WP(w, groupveh_d);
+	grouplist_d *gl = &WP(w, groupveh_d).gl;
+
+	gv->vehicle_type = (VehicleType)GB(w->window_number, 11, 5);
+
+	switch(e->event) {
+		case WE_INVALIDATE_DATA:
+			gv->l.flags |= VL_REBUILD;
+			gl->l.flags |= VL_REBUILD;
+			UpdateGroupActionDropdown(w, gv->group_sel);
+			SetWindowDirty(w);
+			break;
+
+		case WE_CREATE:
+			CreateVehicleGroupWindow(w);
+			break;
+
+		case WE_PAINT: {
+			int x = 203;
+			int y2 = PLY_WND_PRC__OFFSET_TOP_WIDGET;
+			int y1 = PLY_WND_PRC__OFFSET_TOP_WIDGET + 2;
+			int max;
+			int i;
+
+			/* If we select the default group, gv->list will contain all vehicles of the player
+			 * else gv->list will contain all vehicles which belong to the selected group */
+			BuildVehicleList(gv, owner, gv->group_sel, IsDefaultGroupID(gv->group_sel) ? VLW_STANDARD : VLW_GROUP_LIST);
+			SortVehicleList(gv);
+
+
+			BuildGroupList(gl, owner, gv->vehicle_type);
+			SortGroupList(gl);
+
+			SetVScrollCount(w, gl->l.list_length);
+			SetVScroll2Count(w, gv->l.list_length);
+
+			/* Disable all lists management button when the list is empty */
+			SetWindowWidgetsDisabledState(w, gv->l.list_length == 0,
+					GRP_WIDGET_STOP_ALL,
+					GRP_WIDGET_START_ALL,
+					GRP_WIDGET_MANAGE_VEHICLES,
+					GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN,
+					WIDGET_LIST_END);
+
+			/* Disable the group specific function when we select the default group */
+			SetWindowWidgetsDisabledState(w, IsDefaultGroupID(gv->group_sel),
+					GRP_WIDGET_DELETE_GROUP,
+					GRP_WIDGET_RENAME_GROUP,
+					GRP_WIDGET_REPLACE_PROTECTION,
+					WIDGET_LIST_END);
+
+			/* If selected_group == DEFAULT_GROUP, draw the standard caption
+			   We list all vehicles */
+			if (IsDefaultGroupID(gv->group_sel)) {
+				SetDParam(0, p->name_1);
+				SetDParam(1, p->name_2);
+				SetDParam(2, gv->l.list_length);
+
+				switch (gv->vehicle_type) {
+					case VEH_TRAIN:
+						w->widget[GRP_WIDGET_CAPTION].data = STR_881B_TRAINS;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = SPR_GROUP_REPLACE_OFF_TRAIN;
+						break;
+					case VEH_ROAD:
+						w->widget[GRP_WIDGET_CAPTION].data = STR_9001_ROAD_VEHICLES;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = SPR_GROUP_REPLACE_OFF_ROADVEH;
+						break;
+					case VEH_SHIP:
+						w->widget[GRP_WIDGET_CAPTION].data = STR_9805_SHIPS;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = SPR_GROUP_REPLACE_OFF_SHIP;
+						break;
+					case VEH_AIRCRAFT:
+						w->widget[GRP_WIDGET_CAPTION].data =  STR_A009_AIRCRAFT;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = SPR_GROUP_REPLACE_OFF_AIRCRAFT;
+						break;
+					default: NOT_REACHED(); break;
+				}
+			} else {
+				const Group *g = GetGroup(gv->group_sel);
+
+				SetDParam(0, g->index);
+				SetDParam(1, g->num_vehicle);
+
+				switch (gv->vehicle_type) {
+					case VEH_TRAIN:
+						w->widget[GRP_WIDGET_CAPTION].data = STR_GROUP_TRAINS_CAPTION;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = (g->replace_protection) ? SPR_GROUP_REPLACE_ON_TRAIN : SPR_GROUP_REPLACE_OFF_TRAIN;
+						break;
+					case VEH_ROAD:
+						w->widget[GRP_WIDGET_CAPTION].data = STR_GROUP_ROADVEH_CAPTION;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = (g->replace_protection) ? SPR_GROUP_REPLACE_ON_ROADVEH : SPR_GROUP_REPLACE_OFF_ROADVEH;
+						break;
+					case VEH_SHIP:
+						w->widget[GRP_WIDGET_CAPTION].data = STR_GROUP_SHIPS_CAPTION;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = (g->replace_protection) ? SPR_GROUP_REPLACE_ON_SHIP : SPR_GROUP_REPLACE_OFF_SHIP;
+						break;
+					case VEH_AIRCRAFT:
+						w->widget[GRP_WIDGET_CAPTION].data = STR_GROUP_AIRCRAFTS_CAPTION;
+						w->widget[GRP_WIDGET_REPLACE_PROTECTION].data = (g->replace_protection) ? SPR_GROUP_REPLACE_ON_AIRCRAFT : SPR_GROUP_REPLACE_OFF_AIRCRAFT;
+						break;
+					default: NOT_REACHED(); break;
+				}
+			}
+
+
+			DrawWindowWidgets(w);
+
+			/* Draw Matrix Group
+			 * The selected group is drawn in white */
+			StringID str;
+
+			switch (gv->vehicle_type) {
+				case VEH_TRAIN:    str = STR_GROUP_ALL_TRAINS;    break;
+				case VEH_ROAD:     str = STR_GROUP_ALL_ROADS;     break;
+				case VEH_SHIP:     str = STR_GROUP_ALL_SHIPS;     break;
+				case VEH_AIRCRAFT: str = STR_GROUP_ALL_AIRCRAFTS; break;
+				default: NOT_REACHED(); break;
+			}
+			DrawString(10, y1, str, IsDefaultGroupID(gv->group_sel) ? 12 : 16);
+
+			max = min(w->vscroll.pos + w->vscroll.cap, gl->l.list_length);
+			for (i = w->vscroll.pos ; i < max ; ++i) {
+				const Group *g = gl->sort_list[i];
+
+				assert(g->owner == owner);
+
+				y1 += PLY_WND_PRC__SIZE_OF_ROW_TINY;
+
+				/* draw the selected group in white, else we draw it in black */
+				SetDParam(0, g->index);
+				DrawString(10, y1, STR_SV_GROUP_NAME, (gv->group_sel == g->index) ? 12 : 16);
+
+				/* draw the number of vehicles of the group */
+				SetDParam(0, g->num_vehicle);
+				DrawStringRightAligned(187, y1 + 1, STR_GROUP_TINY_NUM, (gv->group_sel == g->index) ? 12 : 16);
+			}
+
+			/* Draw Matrix Vehicle according to the vehicle list built before */
+			DrawString(285, 15, _vehicle_sort_listing[gv->l.sort_type], 0x10);
+			DoDrawString(gv->l.flags & VL_DESC ? DOWNARROW : UPARROW, 269, 15, 0x10);
+
+			max = min(w->vscroll2.pos + w->vscroll2.cap, gv->l.list_length);
+			for (i = w->vscroll2.pos ; i < max ; ++i) {
+				const Vehicle* v = gv->sort_list[i];
+				StringID str;
+
+				assert(v->type == gv->vehicle_type && v->owner == owner);
+
+				DrawVehicleImage(v, x + 19, y2 + 6, w->hscroll.cap, 0, gv->vehicle_sel);
+				DrawVehicleProfitButton(v, x, y2 + 13);
+
+				if (IsVehicleInDepot(v)) {
+					str = STR_021F;
+				} else {
+					str = v->age > v->max_age - 366 ? STR_00E3 : STR_00E2;
+				}
+				SetDParam(0, v->unitnumber);
+				DrawString(x, y2 + 2, str, 0);
+
+				if (w->resize.step_height == PLY_WND_PRC__SIZE_OF_ROW_BIG2) DrawSmallOrderList(v, x + 138, y2);
+
+				if (v->profit_this_year < 0) {
+					str = v->profit_last_year < 0 ?
+							STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR :
+							STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR;
+				} else {
+					str = v->profit_last_year < 0 ?
+							STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR :
+							STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR;
+				}
+
+				SetDParam(0, v->profit_this_year);
+				SetDParam(1, v->profit_last_year);
+				DrawString(x + 19, y2 + w->resize.step_height - 8, str, 0);
+
+				if (IsValidGroupID(v->group_id)) {
+					SetDParam(0, v->group_id);
+					DrawString(x + 19, y2, STR_GROUP_TINY_NAME, 16);
+				}
+
+				y2 += w->resize.step_height;
+			}
+
+			break;
+		}
+
+		case WE_CLICK:
+			switch(e->we.click.widget) {
+				case GRP_WIDGET_SORT_BY_ORDER: // Flip sorting method ascending/descending
+					gv->l.flags ^= VL_DESC;
+					gv->l.flags |= VL_RESORT;
+
+					gv->_sorting->order = !!(gv->l.flags & VL_DESC);
+					SetWindowDirty(w);
+					break;
+
+				case GRP_WIDGET_SORT_BY_TEXT:
+				case GRP_WIDGET_SORT_BY_DROPDOWN: // Select sorting criteria dropdown menu
+					ShowDropDownMenu(w, _vehicle_sort_listing, gv->l.sort_type,  GRP_WIDGET_SORT_BY_DROPDOWN, 0, 0);
+					return;
+
+				case GRP_WIDGET_ALL_VEHICLES: // All vehicles button
+					if (!IsDefaultGroupID(gv->group_sel)) {
+						gv->group_sel = DEFAULT_GROUP;
+						gv->l.flags |= VL_REBUILD;
+						UpdateGroupActionDropdown(w, gv->group_sel);
+						SetWindowDirty(w);
+					}
+					break;
+
+				case GRP_WIDGET_LIST_GROUP: { // Matrix Group
+					uint16 id_g = (e->we.click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET - 13) / PLY_WND_PRC__SIZE_OF_ROW_TINY;
+
+					if (id_g >= w->vscroll.cap) return;
+
+					id_g += w->vscroll.pos;
+
+					if (id_g >= gl->l.list_length) return;
+
+					gv->group_sel = gl->sort_list[id_g]->index;;
+
+					gv->l.flags |= VL_REBUILD;
+					UpdateGroupActionDropdown(w, gv->group_sel);
+					SetWindowDirty(w);
+					break;
+				}
+
+				case GRP_WIDGET_LIST_VEHICLE: { // Matrix Vehicle
+					uint32 id_v = (e->we.click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / (int)w->resize.step_height;
+					const Vehicle *v;
+
+					if (id_v >= w->vscroll2.cap) return; // click out of bounds
+
+					id_v += w->vscroll2.pos;
+
+					if (id_v >= gv->l.list_length) return; // click out of list bound
+
+					v = gv->sort_list[id_v];
+
+					gv->vehicle_sel = v->index;
+
+					if (IsValidVehicle(v)) {
+						CursorID image;
+
+						switch (gv->vehicle_type) {
+							case VEH_TRAIN:    image = GetTrainImage(v, DIR_W);    break;
+							case VEH_ROAD:     image = GetRoadVehImage(v, DIR_W);  break;
+							case VEH_SHIP:     image = GetShipImage(v, DIR_W);     break;
+							case VEH_AIRCRAFT: image = GetAircraftImage(v, DIR_W); break;
+							default: NOT_REACHED(); break;
+						}
+
+						SetObjectToPlaceWnd(image, GetVehiclePalette(v), 4, w);
+					}
+
+					SetWindowDirty(w);
+					break;
+				}
+
+				case GRP_WIDGET_CREATE_GROUP: // Create a new group
+					DoCommandP(0, gv->vehicle_type, 0, NULL, CMD_CREATE_GROUP | CMD_MSG(STR_GROUP_CAN_T_CREATE));
+					break;
+
+				case GRP_WIDGET_DELETE_GROUP: { // Delete the selected group
+					GroupID group = gv->group_sel;
+					gv->group_sel = DEFAULT_GROUP;
+
+					DoCommandP(0, group, 0, NULL, CMD_DELETE_GROUP | CMD_MSG(STR_GROUP_CAN_T_DELETE));
+					break;
+				}
+
+				case GRP_WIDGET_RENAME_GROUP: { // Rename the selected roup
+					assert(!IsDefaultGroupID(gv->group_sel));
+
+					const Group *g = GetGroup(gv->group_sel);
+
+					SetDParam(0, g->index);
+					ShowQueryString(g->string_id, STR_GROUP_RENAME_CAPTION, 31, 150, w, CS_ALPHANUMERAL);
+				}	break;
+
+
+				case GRP_WIDGET_AVAILABLE_VEHICLES:
+					ShowBuildVehicleWindow(0, gv->vehicle_type);
+					break;
+
+				case GRP_WIDGET_MANAGE_VEHICLES:
+				case GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN:  {
+					UpdateGroupActionDropdown(w, gv->group_sel, false);
+					break;
+				}
+
+
+				case GRP_WIDGET_START_ALL:
+				case GRP_WIDGET_STOP_ALL: { // Start/stop all vehicles of the list
+					DoCommandP(0, gv->group_sel, ((IsDefaultGroupID(gv->group_sel) ? VLW_STANDARD : VLW_GROUP_LIST) & VLW_MASK)
+														| (1 << 6)
+														| (e->we.click.widget == GRP_WIDGET_START_ALL ? (1 << 5) : 0)
+														| gv->vehicle_type, NULL, CMD_MASS_START_STOP);
+
+					break;
+				}
+
+				case GRP_WIDGET_REPLACE_PROTECTION:
+					if (!IsDefaultGroupID(gv->group_sel)) {
+						const Group *g = GetGroup(gv->group_sel);
+
+						DoCommandP(0, gv->group_sel, !g->replace_protection, NULL, CMD_SET_GROUP_REPLACE_PROTECTION);
+					}
+					break;
+			}
+
+			break;
+
+		case WE_DRAGDROP: {
+			switch (e->we.click.widget) {
+				case GRP_WIDGET_ALL_VEHICLES: // All trains
+					DoCommandP(0, DEFAULT_GROUP, gv->vehicle_sel, NULL, CMD_ADD_VEHICLE_GROUP | CMD_MSG(STR_GROUP_CAN_T_ADD_VEHICLE));
+
+					gv->vehicle_sel = INVALID_VEHICLE;
+
+					SetWindowDirty(w);
+
+					break;
+
+				case GRP_WIDGET_LIST_GROUP: { // Maxtrix group
+					uint16 id_g = (e->we.click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET - 13) / PLY_WND_PRC__SIZE_OF_ROW_TINY;
+					const VehicleID vindex = gv->vehicle_sel;
+
+					gv->vehicle_sel = INVALID_VEHICLE;
+
+					SetWindowDirty(w);
+
+					if (id_g >= w->vscroll.cap) return;
+
+					id_g += w->vscroll.pos;
+
+					if (id_g >= gl->l.list_length) return;
+
+					DoCommandP(0, gl->sort_list[id_g]->index, vindex, NULL, CMD_ADD_VEHICLE_GROUP | CMD_MSG(STR_GROUP_CAN_T_ADD_VEHICLE));
+
+					break;
+				}
+
+				case GRP_WIDGET_LIST_VEHICLE: { // Maxtrix vehicle
+					uint32 id_v = (e->we.click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / (int)w->resize.step_height;
+					const Vehicle *v;
+					const VehicleID vindex = gv->vehicle_sel;
+
+					gv->vehicle_sel = INVALID_VEHICLE;
+
+					SetWindowDirty(w);
+
+					if (id_v >= w->vscroll2.cap) return; // click out of bounds
+
+					id_v += w->vscroll2.pos;
+
+					if (id_v >= gv->l.list_length) return; // click out of list bound
+
+					v = gv->sort_list[id_v];
+
+					if (vindex == v->index) {
+						switch (gv->vehicle_type) {
+							default: NOT_REACHED(); break;
+							case VEH_TRAIN:    ShowTrainViewWindow(v);    break;
+							case VEH_ROAD:     ShowRoadVehViewWindow(v);  break;
+							case VEH_SHIP:     ShowShipViewWindow(v);     break;
+							case VEH_AIRCRAFT: ShowAircraftViewWindow(v); break;
+						}
+					}
+
+					break;
+				}
+			}
+			break;
+		}
+
+		case WE_ON_EDIT_TEXT:
+			if (!StrEmpty(e->we.edittext.str)) {
+				_cmd_text = e->we.edittext.str;
+
+				DoCommandP(0, gv->group_sel, 0, NULL, CMD_RENAME_GROUP | CMD_MSG(STR_GROUP_CAN_T_RENAME));
+			}
+			break;
+
+		case WE_RESIZE:
+			w->hscroll.cap += e->we.sizing.diff.x;
+			w->vscroll.cap += e->we.sizing.diff.y / PLY_WND_PRC__SIZE_OF_ROW_TINY;
+			w->vscroll2.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
+
+			w->widget[GRP_WIDGET_LIST_GROUP].data = (w->vscroll.cap << 8) + 1;
+			w->widget[GRP_WIDGET_LIST_VEHICLE].data = (w->vscroll2.cap << 8) + 1;
+			break;
+
+
+		case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
+			switch (e->we.dropdown.button) {
+				case GRP_WIDGET_SORT_BY_DROPDOWN:
+					if (gv->l.sort_type != e->we.dropdown.index) {
+						gv->l.flags |= VL_RESORT;
+						gv->l.sort_type = e->we.dropdown.index;
+						gv->_sorting->criteria = gv->l.sort_type;
+					}
+					break;
+
+				case GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN:
+					assert(gv->l.list_length != 0);
+
+					switch (e->we.dropdown.index) {
+						case 0: // Replace window
+							ShowReplaceGroupVehicleWindow(gv->group_sel, gv->vehicle_type);
+							break;
+						case 1: // Send for servicing
+							DoCommandP(0, gv->group_sel, ((IsDefaultGroupID(gv->group_sel) ? VLW_STANDARD : VLW_GROUP_LIST) & VLW_MASK)
+										| DEPOT_MASS_SEND
+										| DEPOT_SERVICE, NULL, GetCmdSendToDepot(gv->vehicle_type));
+							break;
+						case 2: // Send to Depots
+							DoCommandP(0, gv->group_sel, ((IsDefaultGroupID(gv->group_sel) ? VLW_STANDARD : VLW_GROUP_LIST) & VLW_MASK)
+										| DEPOT_MASS_SEND, NULL, GetCmdSendToDepot(gv->vehicle_type));
+							break;
+						case 3: // Add shared Vehicles
+							assert(!IsDefaultGroupID(gv->group_sel));
+
+							DoCommandP(0, gv->group_sel, gv->vehicle_type, NULL, CMD_ADD_SHARED_VEHICLE_GROUP | CMD_MSG(STR_GROUP_CAN_T_ADD_SHARED_VEHICLE));
+							break;
+						case 4: // Remove all Vehicles from the selected group
+							assert(!IsDefaultGroupID(gv->group_sel));
+
+							DoCommandP(0, gv->group_sel, gv->vehicle_type, NULL, CMD_REMOVE_ALL_VEHICLES_GROUP | CMD_MSG(STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES));
+							break;
+						default: NOT_REACHED();
+					}
+					break;
+
+				default: NOT_REACHED();
+			}
+
+			SetWindowDirty(w);
+			break;
+
+
+		case WE_DESTROY:
+			free((void*)gv->sort_list);
+			free((void*)gl->sort_list);
+			break;
+
+
+		case WE_TICK: // resort the lists every 20 seconds orso (10 days)
+			if (--gv->l.resort_timer == 0) {
+				gv->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
+				gv->l.flags |= VL_RESORT;
+				SetWindowDirty(w);
+			}
+			if (--gl->l.resort_timer == 0) {
+				gl->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;
+				gl->l.flags |= VL_RESORT;
+				SetWindowDirty(w);
+			}
+			break;
+		}
+}
+
+
+static const WindowDesc _group_desc = {
+	WDP_AUTO, WDP_AUTO, 526, 246,
+	WC_TRAINS_LIST, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
+	_group_widgets,
+	GroupWndProc
+};
+
+void ShowPlayerGroup(PlayerID player, VehicleType vehicle_type)
+{
+	WindowClass wc;
+
+	switch (vehicle_type) {
+		default: NOT_REACHED();
+		case VEH_TRAIN:    wc = WC_TRAINS_LIST;   break;
+		case VEH_ROAD:     wc = WC_ROADVEH_LIST;  break;
+		case VEH_SHIP:     wc = WC_SHIPS_LIST;    break;
+		case VEH_AIRCRAFT: wc = WC_AIRCRAFT_LIST; break;
+	}
+
+	WindowNumber num = (vehicle_type << 11) | VLW_GROUP_LIST | player;
+	DeleteWindowById(wc, num);
+	Window *w = AllocateWindowDescFront(&_group_desc, num);
+	if (w == NULL) return;
+
+	w->window_class = wc;
+
+	switch (vehicle_type) {
+		default: NOT_REACHED();
+		case VEH_ROAD:
+			ResizeWindow(w, -66,   0);
+			/* FALL THROUGH */
+		case VEH_TRAIN:
+			w->resize.height = w->height - (PLY_WND_PRC__SIZE_OF_ROW_SMALL * 4); // Minimum of 4 vehicles
+			break;
+
+		case VEH_SHIP:
+		case VEH_AIRCRAFT:
+			ResizeWindow(w, -66, -52);
+			w->resize.height = w->height;  // Minimum of 4 vehicles
+			break;
+	}
+
+	/* Set the minimum window size to the current window size */
+	w->resize.width = w->width;
+}
--- a/src/gui.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/gui.h	Sat Jun 02 19:59:29 2007 +0000
@@ -46,7 +46,7 @@
 void ShowOrdersWindow(const Vehicle *v);
 
 /* road_gui.cpp */
-void ShowBuildRoadToolbar();
+void ShowBuildRoadToolbar(RoadType roadtype);
 void ShowBuildRoadScenToolbar();
 void ShowRoadVehViewWindow(const Vehicle *v);
 
@@ -68,13 +68,29 @@
 void PlaceProc_LevelLand(TileIndex tile);
 bool GUIPlaceProcDragXY(const WindowEvent *e);
 
-enum { // max 32 - 4 = 28 types
-	GUI_PlaceProc_DemolishArea    = 0 << 4,
-	GUI_PlaceProc_LevelArea       = 1 << 4,
-	GUI_PlaceProc_DesertArea      = 2 << 4,
-	GUI_PlaceProc_WaterArea       = 3 << 4,
-	GUI_PlaceProc_ConvertRailArea = 4 << 4,
-	GUI_PlaceProc_RockyArea       = 5 << 4,
+/** Drag and drop selection process, or, what to do with an area of land when
+ * you've selected it. */
+enum {
+	DDSP_DEMOLISH_AREA,
+	DDSP_LEVEL_AREA,
+	DDSP_CREATE_DESERT,
+	DDSP_CREATE_ROCKS,
+	DDSP_CREATE_WATER,
+	DDSP_PLANT_TREES,
+	DDSP_BUILD_BRIDGE,
+
+	/* Rail specific actions */
+	DDSP_PLACE_RAIL_NE,
+	DDSP_PLACE_RAIL_NW,
+	DDSP_PLACE_AUTORAIL,
+	DDSP_BUILD_SIGNALS,
+	DDSP_BUILD_STATION,
+	DDSP_REMOVE_STATION,
+	DDSP_CONVERT_RAIL,
+
+	/* Road specific actions */
+	DDSP_PLACE_ROAD_NE,
+	DDSP_PLACE_ROAD_NW,
 };
 
 /* misc_gui.cpp */
@@ -138,4 +154,6 @@
 /* vehicle_gui.cpp */
 void InitializeGUI();
 
+void ShowPlayerGroup(PlayerID player, VehicleType veh);
+
 #endif /* GUI_H */
--- a/src/heightmap.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/heightmap.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -275,6 +275,13 @@
 	return true;
 }
 
+/**
+ * Converts a given grayscale map to something that fits in OTTD map system
+ * and create a map of that data.
+ * @param img_width  the with of the image in pixels/tiles
+ * @param img_height the height of the image in pixels/tiles
+ * @param map        the input map
+ */
 static void GrayscaleToMapHeights(uint img_width, uint img_height, byte *map)
 {
 	/* Defines the detail of the aspect ratio (to avoid doubles) */
--- a/src/helpers.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/helpers.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -44,7 +44,7 @@
 
 /** Add new item at the end of Engine List
  * @param el list o which to add an engine
- * @param eif engine to add to the list
+ * @param eid engine to add to the list
  */
 void EngList_Add(EngineList *el, EngineID eid)
 {
@@ -81,7 +81,7 @@
  * @param el list to be sorted
  * @param compare function for evaluation of the quicksort
  * @param begin start of sorting
- * @param count of items to be sorted
+ * @param num_items count of items to be sorted
  */
 void EngList_SortPartial(EngineList *el, EngList_SortTypeFunction compare, uint begin, uint num_items)
 {
--- a/src/industry.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/industry.h	Sat Jun 02 19:59:29 2007 +0000
@@ -6,13 +6,25 @@
 #define INDUSTRY_H
 
 #include "oldpool.h"
+#include "helpers.hpp"
 
 typedef byte IndustryGfx;
 typedef uint8 IndustryType;
 
 enum {
-	INVALID_INDUSTRY = 0xFFFF,
-	INDUTILE_NOANIM = 0xFF,        ///< flag to mark industry tiles as having no animation
+	INVALID_INDUSTRY       = 0xFFFF,
+	NEW_INDUSTRYOFFSET     = 37,                         ///< original number of industries
+	NUM_INDUSTRYTYPES      = 37,                         ///< total number of industries, new and old
+	INDUSTRYTILE_NOANIM    = 0xFF,                       ///< flag to mark industry tiles as having no animation
+	NEW_INDUSTRYTILEOFFSET = 175,                        ///< original number of tiles
+	INVALID_INDUSTRYTYPE   = NUM_INDUSTRYTYPES,          ///< one above amount is considered invalid
+	NUM_INDUSTRYTILES      = NEW_INDUSTRYTILEOFFSET,     ///< total number of industry tiles, new and old
+	INVALID_INDUSTRYTILE   = NUM_INDUSTRYTILES,          ///< one above amount is considered invalid
+};
+
+enum {
+	CLEAN_RANDOMSOUNDS,    ///< Free the dynamically allocated sounds table
+	CLEAN_TILELSAYOUT,     ///< Free the dynamically allocated tile layout structure
 };
 
 enum IndustryLifeType {
@@ -21,6 +33,42 @@
 	INDUSTRYLIFE_CLOSABLE,         ///< Industry can only close (no production change)
 };
 
+/* Procedures that can be run to check whether an industry may
+ * build at location the given to the procedure */
+enum CheckProc {
+	CHECK_NOTHING    = 0,
+	CHECK_FOREST     = 1,
+	CHECK_REFINERY   = 2,
+	CHECK_FARM       = 3,
+	CHECK_PLANTATION = 4,
+	CHECK_WATER      = 5,
+	CHECK_LUMBERMILL = 6,
+	CHECK_BUBBLEGEN  = 7,
+	CHECK_OIL_RIG    = 8,
+	CHECK_END,
+};
+
+enum IndustyBehaviour {
+	INDUSTRYBEH_NONE                  =      0,
+	INDUSTRYBEH_PLANT_FIELDS          = 1 << 0,  ///< periodically plants fileds around itself (temp and artic farms)
+	INDUSTRYBEH_CUT_TREES             = 1 << 1,  ///< cuts trees and produce first output cargo from them (lumber mill)
+	INDUSTRYBEH_BUILT_ONWATER         = 1 << 2,  ///< is built on water (oil rig)
+	INDUSTRYBEH_TOWN1200_MORE         = 1 << 3,  ///< can only be built in towns larger then 1200 inhabitants (temperate bank)
+	INDUSTRYBEH_ONLY_INTOWN           = 1 << 4,  ///< can only be built in towns (arctic/tropic banks, water tower)
+	INDUSTRYBEH_ONLY_NEARTOWN         = 1 << 5,  ///< is always built near towns (toy shop)
+	INDUSTRYBEH_PLANT_ON_BUILT        = 1 << 6,  ///< Fields are planted around when built (all farms)
+	INDUSTRYBEH_DONT_INCR_PROD        = 1 << 7,  ///< do not increase production (oil wells)
+	INDUSTRYBEH_BEFORE_1950           = 1 << 8,  ///< can only be built before 1950 (oil wells)
+	INDUSTRYBEH_AFTER_1960            = 1 << 9,  ///< can only be built after 1960 (oil rigs)
+	INDUSTRYBEH_AI_AIRSHIP_ROUTES     = 1 << 10, ///< ai will attempt to establish air/ship routes to this industry (oil rig)
+	INDUSTRYBEH_AIRPLANE_ATTACKS      = 1 << 11, ///< can be exploded by a military airplane (oil refinery)
+	INDUSTRYBEH_CHOPPER_ATTACKS       = 1 << 12, ///< can be exploded by a military helicopter (factory)
+	INDUSTRYBEH_CAN_SUBSIDENCE        = 1 << 13, ///< can cause a subsidence (coal mine, shaft that collapses)
+};
+
+
+DECLARE_ENUM_AS_BIT_SET(IndustyBehaviour);
+
 /**
  * Defines the internal data of a functionnal industry
  */
@@ -29,10 +77,8 @@
 	byte width;
 	byte height;
 	const Town* town;               ///< Nearest town
-	CargoID produced_cargo[2];      ///< 2 production cargo slots
 	uint16 cargo_waiting[2];        ///< amount of cargo produced per cargo
 	byte production_rate[2];        ///< production rate for each cargo
-	CargoID accepts_cargo[3];       ///< 3 input cargo slots
 	byte prod_level;                ///< general production level
 	uint16 last_mo_production[2];   ///< stats of last month production per cargo
 	uint16 last_mo_transported[2];  ///< stats of last month transport per cargo
@@ -41,7 +87,7 @@
 	uint16 total_transported[2];    ///< total units transported per cargo
 	uint16 counter;                 ///< used for animation and/or production (if available cargo)
 
-	byte type;                      ///< type of industry. see IT_COAL_MINE and others
+	IndustryType type;              ///< type of industry. see IT_COAL_MINE and others
 	OwnerByte owner;                ///< owner of the industry.  Which SHOULD always be (imho) OWNER_NONE
 	byte random_color;              ///< randomized colour of the industry, for display purpose
 	Year last_prod_year;            ///< last year of production
@@ -55,13 +101,22 @@
 	IndustryGfx gfx;
 };
 
+/** Data related to the handling of grf files.  Common to both industry and industry tile */
+struct GRFFileProps {
+	uint8 subst_id;
+	uint16 local_id;                      ///< id defined by the grf file for this industry
+	struct SpriteGroup *spritegroup;      ///< pointer to the different sprites of the industry
+	const struct GRFFile *grffile;        ///< grf file that introduced this house
+	uint8 override;                       ///< id of the entity been replaced by
+};
+
 /**
  * Defines the data structure for constructing industry.
  */
 struct IndustrySpec {
 	const IndustryTileTable *const *table;///< List of the tiles composing the industry
 	byte num_table;                       ///< Number of elements in the table
-	byte cost_multiplier;                 ///< Base cost multiplier*/
+	byte cost_multiplier;                 ///< Base cost multiplier. Watch out for this one, << 5  VS << 8
 	IndustryType conflicting[3];          ///< Industries this industry cannot be close to
 	byte check_proc;                      ///< Index to a procedure to check for conflicting circumstances
 	CargoID produced_cargo[2];
@@ -69,13 +124,25 @@
 	byte minimal_cargo;                   ///< minimum amount of cargo transported to the stations
 	                                      ///< If the waiting cargo is less than this number, no cargo is moved to it
 	CargoID accepts_cargo[3];             ///< 3 accepted cargos
+	uint16 input_cargo_multiplier[3][2];  ///< Input cargo multipliers (multiply amount of incoming cargo for the produced cargos)
 	IndustryLifeType life_type;           ///< This is also known as Industry production flag, in newgrf specs
 	byte climate_availability;            ///< Bitmask, giving landscape enums as bit position
+	IndustyBehaviour behaviour;           ///< How this industry will behave, and how others entities can use it
+	byte map_colour;                      ///< colour used for the small map
 	StringID name;                        ///< Displayed name of the industry
 	StringID new_industry_text;           ///< Message appearing when the industry is built
 	StringID closure_text;                ///< Message appearing when the industry closes
 	StringID production_up_text;          ///< Message appearing when the industry's production is increasing
 	StringID production_down_text;        ///< Message appearing when the industry's production is decreasing
+	byte appear_ingame[NUM_LANDSCAPE];    ///< Probability of appearance in game
+	byte appear_creation[NUM_LANDSCAPE];  ///< Probability of appearance during map creation
+	uint8 number_of_sounds;               ///< Number of sounds available in the sounds array
+	const uint8 *random_sounds;           ///< array of random sounds.
+	/* Newgrf data */
+	uint16 callback_flags;                ///< Flags telling which grf callback is set
+	uint8 cleanup_flag;                   ///< flags indicating which data should be freed upon cleaning up
+	bool enabled;                         ///< entity still avaible (by default true).newgrf can disable it, though
+	struct GRFFileProps grf_prop;         ///< properties related the the grf file
 };
 
 /**
@@ -83,15 +150,30 @@
  */
 struct IndustryTileSpec {
 	CargoID accepts_cargo[3];             ///< Cargo accepted by this tile
+	uint8 acceptance[3];                  ///< Level of aceptance per cargo type
 	Slope slopes_refused;                 ///< slope pattern on which this tile cannot be built
 	byte anim_production;                 ///< Animation frame to start when goods are produced
 	byte anim_next;                       ///< Next frame in an animation
 	bool anim_state;                      ///< When true, the tile has to be drawn using the animation
-                                         ///< state instead of the construction state
+	                                      ///< state instead of the construction state
+	/* Newgrf data */
+	uint8 callback_flags;                 ///< Flags telling which grf callback is set
+	bool enabled;                         ///< entity still avaible (by default true).newgrf can disable it, though
+	struct GRFFileProps grf_prop;
 };
 
-const IndustrySpec *GetIndustrySpec(IndustryType thistype);    ///< Array of industries default data
-const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx);  ///< Array of industry tiles default data
+/* industry_cmd.cpp*/
+const IndustrySpec *GetIndustrySpec(IndustryType thistype);    ///< Array of industries data
+const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx);  ///< Array of industry tiles data
+void ResetIndustries();
+void PlantRandomFarmField(const Industry *i);
+
+/* writable arrays of specs */
+extern IndustrySpec _industry_specs[NUM_INDUSTRYTYPES];
+extern IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES];
+
+/* smallmap_gui.cpp */
+void BuildIndustriesLegend();
 
 DECLARE_OLD_POOL(Industry, Industry, 3, 8000)
 
@@ -170,10 +252,6 @@
 VARDEF const Industry** _industry_sort;
 VARDEF bool _industry_sort_dirty;
 
-
-void DeleteIndustry(Industry *is);
-void PlantRandomFarmField(const Industry *i);
-
 enum {
 	IT_COAL_MINE           =   0,
 	IT_POWER_STATION       =   1,
--- a/src/industry_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/industry_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -37,6 +37,28 @@
 static byte _industry_sound_ctr;
 static TileIndex _industry_sound_tile;
 
+IndustrySpec _industry_specs[NUM_INDUSTRYTYPES];
+IndustryTileSpec _industry_tile_specs[NUM_INDUSTRYTILES];
+
+/** This function initialize the spec arrays of both
+ * industry and industry tiles.
+ * It adjusts the enabling of the industry too, based on climate availability.
+ * This will allow for clearer testings */
+void ResetIndustries()
+{
+	memset(&_industry_specs, 0, sizeof(_industry_specs));
+	memcpy(&_industry_specs, &_origin_industry_specs, sizeof(_origin_industry_specs));
+
+	/* once performed, enable only the current climate industries */
+	for (IndustryType i = 0; i < NUM_INDUSTRYTYPES; i++) {
+		_industry_specs[i].enabled = HASBIT(_origin_industry_specs[i].climate_availability, _opt.landscape);
+	}
+
+
+	memset(&_industry_tile_specs, 0, sizeof(_industry_tile_specs));
+	memcpy(&_industry_tile_specs, &_origin_industry_tile_specs, sizeof(_origin_industry_tile_specs));
+}
+
 /**
  * Called if a new block is added to the industry-pool
  */
@@ -55,26 +77,16 @@
  * Retrieve the type for this industry.  Although it is accessed by a tile,
  * it will return the general type of industry, and not the sprite index
  * as would do GetIndustryGfx.
- * The same information can be accessed by looking at Industry->type
  * @param tile that is queried
  * @pre IsTileType(tile, MP_INDUSTRY)
  * @return general type for this industry, as defined in industry.h
  **/
 IndustryType GetIndustryType(TileIndex tile)
 {
-	IndustryGfx this_type = GetIndustryGfx(tile);
-	IndustryType iloop;
-
 	assert(IsTileType(tile, MP_INDUSTRY));
 
-	for (iloop = IT_COAL_MINE; iloop < IT_END; iloop += 1) {
-		if (IS_BYTE_INSIDE(this_type, industry_gfx_Solver[iloop].MinGfx,
-				industry_gfx_Solver[iloop].MaxGfx+1)) {
-			return iloop;
-		}
-	}
-
-	return IT_INVALID;  //we have not found equivalent, whatever the reason
+	const Industry *ind = GetIndustryByTile(tile);
+	return IsValidIndustry(ind) ? ind->type : (IndustryType)IT_INVALID;
 }
 
 /**
@@ -82,12 +94,12 @@
  * This will ensure at once : proper access and
  * not allowing modifications of it.
  * @param thistype of industry (which is the index in _industry_specs)
- * @pre thistype < IT_END
+ * @pre thistype < NUM_INDUSTRYTYPES
  * @return a pointer to the corresponding industry spec
  **/
 const IndustrySpec *GetIndustrySpec(IndustryType thistype)
 {
-	assert(thistype < IT_END);
+	assert(thistype < NUM_INDUSTRYTYPES);
 	return &_industry_specs[thistype];
 }
 
@@ -96,12 +108,12 @@
  * This will ensure at once : proper access and
  * not allowing modifications of it.
  * @param gfx of industrytile (which is the index in _industry_specs)
- * @pre gfx < NUM_INDUSTRY_GFXES
+ * @pre gfx < INVALID_INDUSTRYTILE
  * @return a pointer to the corresponding industrytile spec
  **/
 const IndustryTileSpec *GetIndustryTileSpec(IndustryGfx gfx)
 {
-	assert(gfx < NUM_INDUSTRY_GFXES);
+	assert(gfx < INVALID_INDUSTRYTILE);
 	return &_industry_tile_specs[gfx];
 }
 
@@ -117,7 +129,7 @@
 		}
 	END_TILE_LOOP(tile_cur, i->width, i->height, i->xy);
 
-	if (i->type == IT_FARM || i->type == IT_FARM_2) {
+	if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_FIELDS) {
 		/* Remove the farmland and convert it to regular tiles over time. */
 		BEGIN_TILE_LOOP(tile_cur, 42, 42, i->xy - TileDiffXY(21, 21)) {
 			tile_cur = TILE_MASK(tile_cur);
@@ -137,8 +149,7 @@
 
 static void IndustryDrawSugarMine(const TileInfo *ti)
 {
-	const DrawIndustrySpec1Struct *d;
-	uint32 image;
+	const DrawIndustryAnimationStruct *d;
 
 	if (!IsIndustryCompleted(ti->tile)) return;
 
@@ -146,23 +157,23 @@
 
 	AddChildSpriteScreen(SPR_IT_SUGAR_MINE_SIEVE + d->image_1, PAL_NONE, d->x, 0);
 
-	image = d->image_2;
-	if (image != 0) AddChildSpriteScreen(SPR_IT_SUGAR_MINE_CLOUDS + image - 1, PAL_NONE, 8, 41);
+	if (d->image_2 != 0) {
+		AddChildSpriteScreen(SPR_IT_SUGAR_MINE_CLOUDS + d->image_2 - 1, PAL_NONE, 8, 41);
+	}
 
-	image = d->image_3;
-	if (image != 0) {
-		AddChildSpriteScreen(SPR_IT_SUGAR_MINE_PILE + image - 1, PAL_NONE,
-			_drawtile_proc1_x[image - 1], _drawtile_proc1_y[image - 1]);
+	if (d->image_3 != 0) {
+		AddChildSpriteScreen(SPR_IT_SUGAR_MINE_PILE + d->image_3 - 1, PAL_NONE,
+			_drawtile_proc1[d->image_3 - 1].x, _drawtile_proc1[d->image_3 - 1].y);
 	}
 }
 
 static void IndustryDrawToffeeQuarry(const TileInfo *ti)
 {
-	int x = 0;
+	uint8 x = 0;
 
 	if (IsIndustryCompleted(ti->tile)) {
-		x = _industry_anim_offs[GetIndustryAnimationState(ti->tile)];
-		if ( (byte)x == 0xFF)
+		x = _industry_anim_offs_toffee[GetIndustryAnimationState(ti->tile)];
+		if (x == 0xFF)
 			x = 0;
 	}
 
@@ -173,7 +184,7 @@
 static void IndustryDrawBubbleGenerator( const TileInfo *ti)
 {
 	if (IsIndustryCompleted(ti->tile)) {
-		AddChildSpriteScreen(SPR_IT_BUBBLE_GENERATOR_BUBBLE, PAL_NONE, 5, _industry_anim_offs_2[GetIndustryAnimationState(ti->tile)]);
+		AddChildSpriteScreen(SPR_IT_BUBBLE_GENERATOR_BUBBLE, PAL_NONE, 5, _industry_anim_offs_bubbles[GetIndustryAnimationState(ti->tile)]);
 	} else {
 		AddChildSpriteScreen(SPR_IT_BUBBLE_GENERATOR_SPRING, PAL_NONE, 3, 67);
 	}
@@ -181,12 +192,12 @@
 
 static void IndustryDrawToyFactory(const TileInfo *ti)
 {
-	const DrawIndustrySpec4Struct *d;
+	const DrawIndustryAnimationStruct *d;
 
-	d = &_industry_anim_offs_3[GetIndustryAnimationState(ti->tile)];
+	d = &_industry_anim_offs_toys[GetIndustryAnimationState(ti->tile)];
 
 	if (d->image_1 != 0xFF) {
-		AddChildSpriteScreen(SPR_IT_TOY_FACTORY_CLAY, PAL_NONE, 50 - d->image_1 * 2, 96 + d->image_1);
+		AddChildSpriteScreen(SPR_IT_TOY_FACTORY_CLAY, PAL_NONE, d->x, 96 + d->image_1);
 	}
 
 	if (d->image_2 != 0xFF) {
@@ -200,13 +211,13 @@
 static void IndustryDrawCoalPlantSparks(const TileInfo *ti)
 {
 	if (IsIndustryCompleted(ti->tile)) {
-		uint image = GetIndustryAnimationState(ti->tile);
+		uint8 image = GetIndustryAnimationState(ti->tile);
 
 		if (image != 0 && image < 7) {
 			AddChildSpriteScreen(image + SPR_IT_POWER_PLANT_TRANSFORMERS,
 				PAL_NONE,
-				_coal_plant_sparks_x[image - 1],
-				_coal_plant_sparks_y[image - 1]
+				_coal_plant_sparks[image - 1].x,
+				_coal_plant_sparks[image - 1].y
 			);
 		}
 	}
@@ -259,7 +270,7 @@
 	/* Add industry on top of the ground? */
 	image = dits->building.sprite;
 	if (image != 0) {
-		if (_display_opt & DO_TRANS_BUILDINGS) {
+		if (HASBIT(_transparent_opt, TO_INDUSTRIES)) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
 		} else {
@@ -274,7 +285,7 @@
 			dits->dz,
 			z);
 
-		if (_display_opt & DO_TRANS_BUILDINGS) return;
+		if (HASBIT(_transparent_opt, TO_INDUSTRIES)) return;
 	}
 
 	{
@@ -298,14 +309,10 @@
 	const IndustryTileSpec *itspec = GetIndustryTileSpec(GetIndustryGfx(tile));
 	CargoID a;
 
-	a = itspec->accepts_cargo[0];
-	if (a != CT_INVALID) ac[a] = (a == CT_PASSENGERS) ? 1 : 8;
-
-	a = itspec->accepts_cargo[1];
-	if (a != CT_INVALID) ac[a] = 8;
-
-	a = itspec->accepts_cargo[2];
-	if (a != CT_INVALID) ac[a] = 8;
+	for (byte i = 0; i < lengthof(itspec->accepts_cargo); i++) {
+		a = itspec->accepts_cargo[i];
+		if (a != CT_INVALID) ac[a] = itspec->acceptance[i];
+	}
 }
 
 static void GetTileDesc_Industry(TileIndex tile, TileDesc *td)
@@ -323,6 +330,7 @@
 static int32 ClearTile_Industry(TileIndex tile, byte flags)
 {
 	Industry *i = GetIndustryByTile(tile);
+	const IndustrySpec *indspec = GetIndustrySpec(i->type);
 
 	/* water can destroy industries
 	 * in editor you can bulldoze industries
@@ -331,8 +339,8 @@
 	 */
 	if ((_current_player != OWNER_WATER && _game_mode != GM_EDITOR &&
 			!_cheats.magic_bulldozer.value) ||
-			(_current_player == OWNER_WATER && i->type == IT_OIL_RIG)) {
-		SetDParam(0, GetIndustrySpec(i->type)->name);
+			(_current_player == OWNER_WATER && (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER))) {
+		SetDParam(0, indspec->name);
 		return_cmd_error(STR_4800_IN_THE_WAY);
 	}
 
@@ -355,12 +363,12 @@
 
 		i->last_mo_production[0] += cw;
 
-		am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[0], cw);
+		am = MoveGoodsToStation(i->xy, i->width, i->height, indspec->produced_cargo[0], cw);
 		i->last_mo_transported[0] += am;
 		if (am != 0) {
 			uint newgfx = GetIndustryTileSpec(GetIndustryGfx(tile))->anim_production;
 
-			if (newgfx != INDUTILE_NOANIM) {
+			if (newgfx != INDUSTRYTILE_NOANIM) {
 				ResetIndustryConstructionStage(tile);
 				SetIndustryCompleted(tile, true);
 				SetIndustryGfx(tile, newgfx);
@@ -377,7 +385,7 @@
 
 		i->last_mo_production[1] += cw;
 
-		am = MoveGoodsToStation(i->xy, i->width, i->height, i->produced_cargo[1], cw);
+		am = MoveGoodsToStation(i->xy, i->width, i->height, indspec->produced_cargo[1], cw);
 		i->last_mo_transported[1] += am;
 	}
 }
@@ -411,7 +419,7 @@
 		if ((_tick_counter & 3) == 0) {
 			m = GetIndustryAnimationState(tile);
 
-			if (_industry_anim_offs[m] == 0xFF) {
+			if (_industry_anim_offs_toffee[m] == 0xFF) {
 				SndPlayTileFx(SND_30_CARTOON_SOUND, tile);
 			}
 
@@ -457,23 +465,22 @@
 		if ((_tick_counter & 1) == 0) {
 			m = GetIndustryAnimationState(tile) + 1;
 
-			if (m == 1) {
-				SndPlayTileFx(SND_2C_MACHINERY, tile);
-			} else if (m == 23) {
-				SndPlayTileFx(SND_2B_COMEDY_HIT, tile);
-			} else if (m == 28) {
-				SndPlayTileFx(SND_2A_EXTRACT_AND_POP, tile);
+			switch (m) {
+				case  1: SndPlayTileFx(SND_2C_MACHINERY, tile); break;
+				case 23: SndPlayTileFx(SND_2B_COMEDY_HIT, tile); break;
+				case 28: SndPlayTileFx(SND_2A_EXTRACT_AND_POP, tile); break;
+				default:
+					if (m >= 50) {
+						int n = GetIndustryAnimationLoop(tile) + 1;
+						m = 0;
+						if (n >= 8) {
+							n = 0;
+							DeleteAnimatedTile(tile);
+						}
+						SetIndustryAnimationLoop(tile, n);
+					}
 			}
 
-			if (m >= 50) {
-				int n = GetIndustryAnimationLoop(tile) + 1;
-				m = 0;
-				if (n >= 8) {
-					n = 0;
-					DeleteAnimatedTile(tile);
-				}
-				SetIndustryAnimationLoop(tile, n);
-			}
 			SetIndustryAnimationState(tile, m);
 			MarkTileDirtyByTile(tile);
 		}
@@ -496,7 +503,7 @@
 	case GFX_OILWELL_ANIMATED_2:
 	case GFX_OILWELL_ANIMATED_3:
 		if ((_tick_counter & 7) == 0) {
-			bool b = CHANCE16(1,7);
+			bool b = CHANCE16(1, 7);
 			IndustryGfx gfx = GetIndustryGfx(tile);
 
 			m = GetIndustryAnimationState(tile) + 1;
@@ -647,7 +654,7 @@
 	TransportIndustryGoods(tile);
 
 	newgfx = GetIndustryTileSpec(GetIndustryGfx(tile))->anim_next;
-	if (newgfx != INDUTILE_NOANIM) {
+	if (newgfx != INDUSTRYTILE_NOANIM) {
 		ResetIndustryConstructionStage(tile);
 		SetIndustryGfx(tile, newgfx);
 		MarkTileDirtyByTile(tile);
@@ -705,7 +712,7 @@
 		break;
 
 	case GFX_POWERPLANT_SPARKS:
-		if (CHANCE16(1,3)) {
+		if (CHANCE16(1, 3)) {
 			SndPlayTileFx(SND_0C_ELECTRIC_SPARK, tile);
 			AddAnimatedTile(tile);
 		}
@@ -746,14 +753,14 @@
 	ShowIndustryViewWindow(GetIndustryIndex(tile));
 }
 
-static uint32 GetTileTrackStatus_Industry(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Industry(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	return 0;
 }
 
 static void GetProducedCargo_Industry(TileIndex tile, CargoID *b)
 {
-	const Industry *i = GetIndustryByTile(tile);
+	const IndustrySpec *i = GetIndustrySpec(GetIndustryByTile(tile)->type);
 
 	b[0] = i->produced_cargo[0];
 	b[1] = i->produced_cargo[1];
@@ -916,57 +923,17 @@
 		i->cargo_waiting[0] = min(0xffff, i->cargo_waiting[0] + 45); ///< Found a tree, add according value to waiting cargo
 }
 
-static const byte _industry_sounds[37][2] = {
-	{0},
-	{0},
-	{1, SND_28_SAWMILL},
-	{0},
-	{0},
-	{0},
-	{1, SND_03_FACTORY_WHISTLE},
-	{1, SND_03_FACTORY_WHISTLE},
-	{0},
-	{3, SND_24_SHEEP},
-	{0},
-	{0},
-	{0},
-	{0},
-	{1, SND_28_SAWMILL},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{1, SND_03_FACTORY_WHISTLE},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{0},
-	{1, SND_33_PLASTIC_MINE},
-	{0},
-	{0},
-	{0},
-	{0},
-};
-
-
 static void ProduceIndustryGoods(Industry *i)
 {
 	uint32 r;
 	uint num;
+	const IndustrySpec *indsp = GetIndustrySpec(i->type);
 
 	/* play a sound? */
 	if ((i->counter & 0x3F) == 0) {
-		if (CHANCE16R(1,14,r) && (num=_industry_sounds[i->type][0]) != 0) {
+		if (CHANCE16R(1, 14, r) && (num = indsp->number_of_sounds) != 0) {
 			SndPlayTileFx(
-				(SoundFx)(_industry_sounds[i->type][1] + (((r >> 16) * num) >> 16)),
+				(SoundFx)(indsp->random_sounds[((r >> 16) * num) >> 16]),
 				i->xy);
 		}
 	}
@@ -975,12 +942,13 @@
 
 	/* produce some cargo */
 	if ((i->counter & 0xFF) == 0) {
+		IndustyBehaviour indbehav = indsp->behaviour;
 		i->cargo_waiting[0] = min(0xffff, i->cargo_waiting[0] + i->production_rate[0]);
 		i->cargo_waiting[1] = min(0xffff, i->cargo_waiting[1] + i->production_rate[1]);
 
-		if (i->type == IT_FARM || i->type == IT_FARM_2) {
+		if (indbehav & INDUSTRYBEH_PLANT_FIELDS) {
 			MaybePlantFarmField(i);
-		} else if (i->type == IT_LUMBER_MILL && (i->counter & 0x1FF) == 0) {
+		} else if ((indbehav & INDUSTRYBEH_CUT_TREES) && (i->counter & 0x1FF) == 0) {
 			ChopLumberMillTrees(i);
 		}
 	}
@@ -1156,8 +1124,12 @@
 			}
 		} else {
 			if (!EnsureNoVehicle(cur_tile)) return false;
+			IndustyBehaviour ind_behav = GetIndustrySpec(type)->behaviour;
 
-			if (type == IT_OIL_RIG)  {
+			if (ind_behav & INDUSTRYBEH_BUILT_ONWATER) {
+				/* As soon as the tile is not water, bail out.
+				 * But that does not mean the search is over.  You have
+				 * to make sure every tile of the industry will be only water*/
 				if (!IsClearWaterTile(cur_tile)) return false;
 			} else {
 				Slope tileh;
@@ -1186,27 +1158,19 @@
 					}
 				}
 
-				if (type == IT_BANK_TEMP) {
+				if (ind_behav & INDUSTRYBEH_ONLY_INTOWN) {
 					if (!IsTileType(cur_tile, MP_HOUSE)) {
 						_error_message = STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS;
 						return false;
 					}
-				} else if (type == IT_BANK_TROPIC_ARCTIC) {
-					if (!IsTileType(cur_tile, MP_HOUSE)) {
-						_error_message = STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS;
-						return false;
+				} else {
+					if (ind_behav & INDUSTRYBEH_ONLY_NEARTOWN) {
+						if (!IsTileType(cur_tile, MP_HOUSE)) goto do_clear;
+					} else {
+do_clear:
+						if (CmdFailed(DoCommand(cur_tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR)))
+							return false;
 					}
-				} else if (type == IT_TOY_SHOP) {
-					if (!IsTileType(cur_tile, MP_HOUSE)) goto do_clear;
-				} else if (type == IT_WATER_TOWER) {
-					if (!IsTileType(cur_tile, MP_HOUSE)) {
-						_error_message = STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS;
-						return false;
-					}
-				} else {
-do_clear:
-					if (CmdFailed(DoCommand(cur_tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR)))
-						return false;
 				}
 			}
 		}
@@ -1217,12 +1181,12 @@
 
 static bool CheckIfIndustryIsAllowed(TileIndex tile, int type, const Town *t)
 {
-	if (type == IT_BANK_TEMP && t->population < 1200) {
+	if ((GetIndustrySpec(type)->behaviour & INDUSTRYBEH_TOWN1200_MORE) && t->population < 1200) {
 		_error_message = STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS;
 		return false;
 	}
 
-	if (type == IT_TOY_SHOP && DistanceMax(t->xy, tile) > 9) {
+	if ((GetIndustrySpec(type)->behaviour & INDUSTRYBEH_ONLY_NEARTOWN) && DistanceMax(t->xy, tile) > 9) {
 		_error_message = STR_0239_SITE_UNSUITABLE;
 		return false;
 	}
@@ -1337,7 +1301,7 @@
 		/* check if an industry that accepts the same goods is nearby */
 		if (DistanceMax(tile, i->xy) <= 14 &&
 				indspec->accepts_cargo[0] != CT_INVALID &&
-				indspec->accepts_cargo[0] == i->accepts_cargo[0] && (
+				indspec->accepts_cargo[0] == indspec->accepts_cargo[0] && (
 					_game_mode != GM_EDITOR ||
 					!_patches.same_industry_close ||
 					!_patches.multiple_industry_per_town
@@ -1388,11 +1352,6 @@
 	i->width = i->height = 0;
 	i->type = type;
 
-	i->produced_cargo[0] = indspec->produced_cargo[0];
-	i->produced_cargo[1] = indspec->produced_cargo[1];
-	i->accepts_cargo[0] = indspec->accepts_cargo[0];
-	i->accepts_cargo[1] = indspec->accepts_cargo[1];
-	i->accepts_cargo[2] = indspec->accepts_cargo[2];
 	i->production_rate[0] = indspec->production_rate[0];
 	i->production_rate[1] = indspec->production_rate[1];
 
@@ -1450,7 +1409,7 @@
 	i->width++;
 	i->height++;
 
-	if (i->type == IT_FARM || i->type == IT_FARM_2) {
+	if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_ON_BUILT) {
 		for (j = 0; j != 50; j++) PlantRandomFarmField(i);
 	}
 	_industry_sort_dirty = true;
@@ -1511,7 +1470,9 @@
 	indspec = GetIndustrySpec(p1);
 
 	/* Check if the to-be built/founded industry is available for this climate. */
-	if (!HASBIT(indspec->climate_availability, _opt_ptr->landscape)) return CMD_ERROR;
+	if (!indspec->enabled) {
+		return CMD_ERROR;
+	}
 
 	/* If the patch for raw-material industries is not on, you cannot build raw-material industries.
 	 * Raw material industries are industries that do not accept cargo (at least for now)
@@ -1520,7 +1481,7 @@
 			indspec->accepts_cargo[0] == CT_INVALID &&
 			indspec->accepts_cargo[1] == CT_INVALID &&
 			indspec->accepts_cargo[2] == CT_INVALID &&
-			p1 != IT_LUMBER_MILL) {
+			!(indspec->behaviour & INDUSTRYBEH_CUT_TREES)) {
 		return CMD_ERROR;
 	}
 
@@ -1545,24 +1506,26 @@
 	return CreateNewIndustryHelper(tile, type, DC_EXEC, indspec, it);
 }
 
-static const byte _numof_industry_table[4][12] = {
+static const byte _numof_industry_table[5][12] = {
 	/* difficulty settings for number of industries */
 	{0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0},   //none
+	{0, 1, 1, 1, 1, 1, 1, 1,  1,  1,  1},   //very low
 	{0, 1, 1, 1, 2, 2, 3, 3,  4,  4,  5},   //low
 	{0, 1, 2, 3, 4, 5, 6, 7,  8,  9, 10},   //normal
 	{0, 2, 3, 4, 6, 7, 8, 9, 10, 10, 10},   //high
 };
 
+/** This function is the one who really do the creation work
+ * of random industries during game creation
+ * @param type IndustryType of the desired industry
+ * @param amount of industries that need to be built */
 static void PlaceInitialIndustry(IndustryType type, int amount)
 {
 	int num = _numof_industry_table[_opt.diff.number_industries][amount];
+	const IndustrySpec *ind_spc = GetIndustrySpec(type);
 
-	if (type == IT_OIL_REFINERY || type == IT_OIL_RIG) {
-		/* These are always placed next to the coastline, so we scale by the perimeter instead. */
-		num = ScaleByMapSize1D(num);
-	} else {
-		num = ScaleByMapSize(num);
-	}
+	/* These are always placed next to the coastline, so we scale by the perimeter instead. */
+	num = (ind_spc->check_proc == CHECK_REFINERY || ind_spc->check_proc == CHECK_OIL_RIG) ? ScaleByMapSize1D(num) : ScaleByMapSize(num);
 
 	if (_opt.diff.number_industries != 0) {
 		PlayerID old_player = _current_player;
@@ -1583,31 +1546,48 @@
 	}
 }
 
+/** This function will create ramdon industries during game creation.
+ * It will scale the amount of industries by map size as well as difficulty level */
 void GenerateIndustries()
 {
-	const byte *b;
 	uint i = 0;
+	uint8 chance;
+	IndustryType it;
+	const IndustrySpec *ind_spc;
 
 	/* Find the total amount of industries */
-	b = _industry_create_table[_opt.landscape];
-	do {
-		int num = _numof_industry_table[_opt.diff.number_industries][b[0]];
+	for (it = IT_COAL_MINE; it < NUM_INDUSTRYTYPES; it++) {
 
-		if (b[1] == IT_OIL_REFINERY || b[1] == IT_OIL_RIG) {
-			/* These are always placed next to the coastline, so we scale by the perimeter instead. */
-			num = ScaleByMapSize1D(num);
-		} else {
-			num = ScaleByMapSize(num);
+		ind_spc = GetIndustrySpec(it);
+		if (ind_spc->enabled) {
+			chance = ind_spc->appear_creation[_opt.landscape];
+			if (chance > 0) {
+				/* once the chance of appearance is determind, it have to be scaled by
+				 * the difficulty level. The "chance" in question is more an index into
+				 * the _numof_industry_table,in fact */
+				int num = _numof_industry_table[_opt.diff.number_industries][chance];
+
+				/* These are always placed next to the coastline, so we scale by the perimeter instead. */
+				num = (ind_spc->check_proc == CHECK_REFINERY || ind_spc->check_proc == CHECK_OIL_RIG) ? ScaleByMapSize1D(num) : ScaleByMapSize(num);
+				i += num;
+			}
 		}
+	}
 
-		i += num;
-	} while ( (b+=2)[0] != 0);
 	SetGeneratingWorldProgress(GWP_INDUSTRY, i);
 
-	b = _industry_create_table[_opt.landscape];
-	do {
-		PlaceInitialIndustry(b[1], b[0]);
-	} while ( (b+=2)[0] != 0);
+	for (it = IT_COAL_MINE; it < NUM_INDUSTRYTYPES; it++) {
+		/* Once the number of industries has been determined, let's really create them.
+		 * The test for chance allows us to try create industries that are available only
+		 * for this landscape.
+		 * @todo :  Do we really have to pass chance as un-scaled value, since we've already
+		 *          processed that scaling above? No, don't think so.  Will find a way. */
+		ind_spc = GetIndustrySpec(it);
+		if (ind_spc->enabled) {
+			chance = ind_spc->appear_creation[_opt.landscape];
+			if (chance > 0) PlaceInitialIndustry(it, chance);
+		}
+	};
 }
 
 /* Change industry production or do closure */
@@ -1627,7 +1607,7 @@
 			break;
 
 		default: /* INDUSTRY_PRODUCTION */
-			for (j = 0; j < 2 && i->produced_cargo[j] != CT_INVALID; j++){
+			for (j = 0; j < 2 && indspec->produced_cargo[j] != CT_INVALID; j++){
 				uint32 r = Random();
 				int old_prod, new_prod, percent;
 				int mag;
@@ -1653,11 +1633,11 @@
 				mag = abs(percent);
 				if (mag >= 10) {
 					SetDParam(2, mag);
-					SetDParam(0, GetCargo(i->produced_cargo[j])->name);
+					SetDParam(0, GetCargo(indspec->produced_cargo[j])->name);
 					SetDParam(1, i->index);
 					AddNewsItem(
 						percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
-						NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_ECONOMY, 0),
+						NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ECONOMY, 0),
 						i->xy + TileDiffXY(1, 1), 0
 					);
 				}
@@ -1671,7 +1651,7 @@
 		SetDParam(0, i->index);
 		AddNewsItem(
 			indspec->closure_text,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_OPENCLOSE, 0),
+			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0),
 			i->xy + TileDiffXY(1, 1), 0
 		);
 	}
@@ -1681,39 +1661,28 @@
 static void UpdateIndustryStatistics(Industry *i)
 {
 	byte pct;
+	bool refresh = false;
+	const IndustrySpec *indsp = GetIndustrySpec(i->type);
 
-	if (i->produced_cargo[0] != CT_INVALID) {
-		pct = 0;
-		if (i->last_mo_production[0] != 0) {
-			i->last_prod_year = _cur_year;
-			pct = min(i->last_mo_transported[0] * 256 / i->last_mo_production[0],255);
+	for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) {
+		if (indsp->produced_cargo[j] != CT_INVALID) {
+			pct = 0;
+			if (i->last_mo_production[j] != 0) {
+				i->last_prod_year = _cur_year;
+				pct = min(i->last_mo_transported[j] * 256 / i->last_mo_production[j], 255);
+			}
+			i->pct_transported[j] = pct;
+
+			i->total_production[j] = i->last_mo_production[j];
+			i->last_mo_production[j] = 0;
+
+			i->total_transported[j] = i->last_mo_transported[j];
+			i->last_mo_transported[j] = 0;
+			refresh = true;
 		}
-		i->pct_transported[0] = pct;
-
-		i->total_production[0] = i->last_mo_production[0];
-		i->last_mo_production[0] = 0;
-
-		i->total_transported[0] = i->last_mo_transported[0];
-		i->last_mo_transported[0] = 0;
 	}
 
-	if (i->produced_cargo[1] != CT_INVALID) {
-		pct = 0;
-		if (i->last_mo_production[1] != 0) {
-			i->last_prod_year = _cur_year;
-			pct = min(i->last_mo_transported[1] * 256 / i->last_mo_production[1],255);
-		}
-		i->pct_transported[1] = pct;
-
-		i->total_production[1] = i->last_mo_production[1];
-		i->last_mo_production[1] = 0;
-
-		i->total_transported[1] = i->last_mo_transported[1];
-		i->last_mo_transported[1] = 0;
-	}
-
-
-	if (i->produced_cargo[0] != CT_INVALID || i->produced_cargo[1] != CT_INVALID)
+	if (refresh)
 		InvalidateWindow(WC_INDUSTRY_VIEW, i->index);
 
 	if (i->prod_level == 0) {
@@ -1723,34 +1692,61 @@
 	}
 }
 
-static const byte _new_industry_rand[4][32] = {
-	{12, 12, 12, 12, 12, 12, 12,  0,  0,  6,  6,  9,  9,  3,  3,  3, 18, 18,  4,  4,  2,  2,  5,  5,  5,  5,  5,  5,  1,  1,  8,  8},
-	{16, 16, 16,  0,  0,  0,  9,  9,  9,  9, 13, 13,  3,  3,  3,  3, 15, 15, 15,  4,  4, 11, 11, 11, 11, 11, 14, 14,  1,  1,  7,  7},
-	{21, 21, 21, 24, 22, 22, 22, 22, 23, 23, 16, 16, 16,  4,  4, 19, 19, 19, 13, 13, 20, 20, 20, 11, 11, 11, 17, 17, 17, 10, 10, 10},
-	{30, 30, 30, 36, 36, 31, 31, 31, 27, 27, 27, 28, 28, 28, 26, 26, 26, 34, 34, 34, 35, 35, 35, 29, 29, 29, 32, 32, 32, 33, 33, 33},
+/** Simple helper that will collect data for the generation of industries */
+struct ProbabilityHelper {
+	uint16 prob;      ///< probability
+	IndustryType ind; ///< industry id correcponding
 };
 
-static void MaybeNewIndustry(uint32 r)
+/**
+ * Try to create a random industry, during gameplay
+ */
+static void MaybeNewIndustry(void)
 {
-	int type =_new_industry_rand[_opt.landscape][GB(r, 16, 5)];
-	int j;
-	Industry *i;
-	const IndustrySpec *ind_spc = GetIndustrySpec(type);;
+	Industry *ind;               //will receive the industry's creation pointer
+	IndustryType rndtype, j;     // Loop controlers
+	const IndustrySpec *ind_spc;
+	uint num = 0;
+	ProbabilityHelper cumulative_probs[NUM_INDUSTRYTYPES]; // probability collector
+	uint16 probability_max = 0;
 
-	if (type == IT_OIL_WELL && _cur_year > 1950) return;
-	if (type == IT_OIL_RIG  && _cur_year < 1960) return;
+	/* Generate a list of all possible industries that can be built. */
+	for (j = 0; j < NUM_INDUSTRYTYPES; j++) {
+		byte chance = GetIndustrySpec(j)->appear_ingame[_opt.landscape];
 
-	j = 2000;
+		/* if appearing chance for this landscape is above 0, this industry can be chosen */
+		if (chance != 0) {
+			probability_max += chance;
+			/* adds the result for this industry */
+			cumulative_probs[num].ind = j;
+			cumulative_probs[num++].prob = probability_max;
+		}
+	}
+
+	/* Find a random type, with maximum being what has been evaluate above*/
+	rndtype = RandomRange(probability_max);
+	for (j = 0; j < NUM_INDUSTRYTYPES; j++) {
+		/* and choose the index of the industry that matches as close as possible this random type */
+		if (cumulative_probs[j].prob >= rndtype) break;
+	}
+
+	ind_spc = GetIndustrySpec(cumulative_probs[j].ind);
+	/*  Check if it is allowed */
+	if ((ind_spc->behaviour & INDUSTRYBEH_BEFORE_1950) && _cur_year > 1950) return;
+	if ((ind_spc->behaviour & INDUSTRYBEH_AFTER_1960) && _cur_year < 1960) return;
+
+	/* try to create 2000 times this industry */
+	num = 2000;
 	for (;;) {
-		i = CreateNewIndustry(RandomTile(), type);
-		if (i != NULL) break;
-		if (--j == 0) return;
+		ind = CreateNewIndustry(RandomTile(), cumulative_probs[j].ind);
+		if (ind != NULL) break;
+		if (--num == 0) return;
 	}
 
 	SetDParam(0, ind_spc->name);
-	SetDParam(1, i->town->index);
+	SetDParam(1, ind->town->index);
 	AddNewsItem(ind_spc->new_industry_text,
-		NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, NT_OPENCLOSE, 0), i->xy, 0);
+		NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
 }
 
 static void ChangeIndustryProduction(Industry *i)
@@ -1766,12 +1762,12 @@
 
 		case INDUSTRYLIFE_PRODUCTION:
 			/* decrease or increase */
-			if (type == IT_OIL_WELL && _opt.landscape == LT_TEMPERATE)
+			if ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _opt.landscape == LT_TEMPERATE)
 				only_decrease = true;
 
-			if (only_decrease || CHANCE16(1,3)) {
+			if (only_decrease || CHANCE16(1, 3)) {
 				/* If you transport > 60%, 66% chance we increase, else 33% chance we increase */
-				if (!only_decrease && (i->pct_transported[0] > 153) != CHANCE16(1,3)) {
+				if (!only_decrease && (i->pct_transported[0] > 153) != CHANCE16(1, 3)) {
 					/* Increase production */
 					if (i->prod_level != 0x80) {
 						byte b;
@@ -1808,7 +1804,7 @@
 
 		case INDUSTRYLIFE_CLOSABLE:
 			/* maybe close */
-			if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1,2)) {
+			if ( (byte)(_cur_year - i->last_prod_year) >= 5 && CHANCE16(1, 2)) {
 				i->prod_level = 0;
 				str = indspec->closure_text;
 			}
@@ -1817,7 +1813,7 @@
 
 	if (str != STR_NULL) {
 		SetDParam(0, i->index);
-		AddNewsItem(str, NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_TILE, str == indspec->closure_text ? NT_OPENCLOSE : NT_ECONOMY, 0), i->xy + TileDiffXY(1, 1), 0);
+		AddNewsItem(str, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, str == indspec->closure_text ? NT_OPENCLOSE : NT_ECONOMY, 0), i->xy + TileDiffXY(1, 1), 0);
 	}
 }
 
@@ -1833,7 +1829,7 @@
 
 	/* 3% chance that we start a new industry */
 	if (CHANCE16(3, 100)) {
-		MaybeNewIndustry(Random());
+		MaybeNewIndustry();
 	} else if (!_patches.smooth_economy) {
 		i = GetRandomIndustry();
 		if (i != NULL) ChangeIndustryProduction(i);
@@ -1879,10 +1875,10 @@
 	    SLE_VAR(Industry, width,               SLE_UINT8),
 	    SLE_VAR(Industry, height,              SLE_UINT8),
 	    SLE_REF(Industry, town,                REF_TOWN),
-	    SLE_ARR(Industry, produced_cargo,      SLE_UINT8,  2),
+	SLE_CONDNULL( 2, 2, 60),       ///< used to be industry's produced_cargo
 	    SLE_ARR(Industry, cargo_waiting,       SLE_UINT16, 2),
 	    SLE_ARR(Industry, production_rate,     SLE_UINT8,  2),
-	    SLE_ARR(Industry, accepts_cargo,       SLE_UINT8,  3),
+	SLE_CONDNULL( 3, 2, 60),       ///< used to be industry's accepts_cargo
 	    SLE_VAR(Industry, prod_level,          SLE_UINT8),
 	    SLE_ARR(Industry, last_mo_production,  SLE_UINT16, 2),
 	    SLE_ARR(Industry, last_mo_transported, SLE_UINT16, 2),
--- a/src/industry_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/industry_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -37,7 +37,7 @@
 	case WE_PAINT:
 		DrawWindowWidgets(w);
 		if (_thd.place_mode == 1 && _thd.window_class == WC_BUILD_INDUSTRY) {
-			int ind_type = _build_industry_types[_opt_ptr->landscape][WP(w,def_d).data_1];
+			int ind_type = _build_industry_types[_opt_ptr->landscape][WP(w, def_d).data_1];
 
 			SetDParam(0, (_price.build_industry >> 5) * GetIndustrySpec(ind_type)->cost_multiplier);
 			DrawStringCentered(85, w->height - 21, STR_482F_COST, 0);
@@ -48,12 +48,12 @@
 		int wid = e->we.click.widget;
 		if (wid >= 3) {
 			if (HandlePlacePushButton(w, wid, SPR_CURSOR_INDUSTRY, 1, NULL))
-				WP(w,def_d).data_1 = wid - 3;
+				WP(w, def_d).data_1 = wid - 3;
 		}
 	} break;
 
 	case WE_PLACE_OBJ:
-		if (DoCommandP(e->we.place.tile, _build_industry_types[_opt_ptr->landscape][WP(w,def_d).data_1], 0, NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY)))
+		if (DoCommandP(e->we.place.tile, _build_industry_types[_opt_ptr->landscape][WP(w, def_d).data_1], 0, NULL, CMD_BUILD_INDUSTRY | CMD_MSG(STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY)))
 			ResetObjectToPlace();
 		break;
 
@@ -274,7 +274,7 @@
 void ShowBuildIndustryWindow()
 {
 	if (!IsValidPlayer(_current_player)) return;
-	AllocateWindowDescFront(_industry_window_desc[_patches.build_rawmaterial_ind][_opt_ptr->landscape],0);
+	AllocateWindowDescFront(_industry_window_desc[_patches.build_rawmaterial_ind][_opt_ptr->landscape], 0);
 }
 
 static inline bool isProductionMinimum(const Industry *i, int pt) {
@@ -287,8 +287,9 @@
 
 static inline bool IsProductionAlterable(const Industry *i)
 {
+	const IndustrySpec *ind = GetIndustrySpec(i->type);
 	return ((_game_mode == GM_EDITOR || _cheats.setup_prod.value) &&
-		     (i->accepts_cargo[0] == CT_INVALID || i->accepts_cargo[0] == CT_VALUABLES));
+			(ind->accepts_cargo[0] == CT_INVALID || ind->accepts_cargo[0] == CT_VALUABLES));
 }
 
 static void IndustryViewWndProc(Window *w, WindowEvent *e)
@@ -300,48 +301,49 @@
 	switch (e->event) {
 	case WE_PAINT: {
 		const Industry *i = GetIndustry(w->window_number);
+		const IndustrySpec *ind = GetIndustrySpec(i->type);
 
 		SetDParam(0, w->window_number);
 		DrawWindowWidgets(w);
 
-		if (i->accepts_cargo[0] != CT_INVALID) {
+		if (ind->accepts_cargo[0] != CT_INVALID) {
 			StringID str;
 
-			SetDParam(0, GetCargo(i->accepts_cargo[0])->name);
+			SetDParam(0, GetCargo(ind->accepts_cargo[0])->name);
 			str = STR_4827_REQUIRES;
-			if (i->accepts_cargo[1] != CT_INVALID) {
-				SetDParam(1, GetCargo(i->accepts_cargo[1])->name);
+			if (ind->accepts_cargo[1] != CT_INVALID) {
+				SetDParam(1, GetCargo(ind->accepts_cargo[1])->name);
 				str = STR_4828_REQUIRES;
-				if (i->accepts_cargo[2] != CT_INVALID) {
-					SetDParam(2, GetCargo(i->accepts_cargo[2])->name);
+				if (ind->accepts_cargo[2] != CT_INVALID) {
+					SetDParam(2, GetCargo(ind->accepts_cargo[2])->name);
 					str = STR_4829_REQUIRES;
 				}
 			}
 			DrawString(2, 107, str, 0);
 		}
 
-		if (i->produced_cargo[0] != CT_INVALID) {
+		if (ind->produced_cargo[0] != CT_INVALID) {
 			DrawString(2, 117, STR_482A_PRODUCTION_LAST_MONTH, 0);
 
-			SetDParam(0, i->produced_cargo[0]);
+			SetDParam(0, ind->produced_cargo[0]);
 			SetDParam(1, i->total_production[0]);
 
 			SetDParam(2, i->pct_transported[0] * 100 >> 8);
 			DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), 127, STR_482B_TRANSPORTED, 0);
 			/* Let's put out those buttons.. */
 			if (IsProductionAlterable(i)) {
-				DrawArrowButtons(5, 127, 3, (WP(w,vp2_d).data_2 == 1) ? WP(w,vp2_d).data_3 : 0,
+				DrawArrowButtons(5, 127, 3, (WP(w, vp2_d).data_2 == 1) ? WP(w, vp2_d).data_3 : 0,
 						!isProductionMinimum(i, 0), !isProductionMaximum(i, 0));
 			}
 
-			if (i->produced_cargo[1] != CT_INVALID) {
-				SetDParam(0, i->produced_cargo[1]);
+			if (ind->produced_cargo[1] != CT_INVALID) {
+				SetDParam(0, ind->produced_cargo[1]);
 				SetDParam(1, i->total_production[1]);
 				SetDParam(2, i->pct_transported[1] * 100 >> 8);
 				DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), 137, STR_482B_TRANSPORTED, 0);
 				/* Let's put out those buttons.. */
 				if (IsProductionAlterable(i)) {
-					DrawArrowButtons(5, 137, 3, (WP(w,vp2_d).data_2 == 2) ? WP(w,vp2_d).data_3 : 0,
+					DrawArrowButtons(5, 137, 3, (WP(w, vp2_d).data_2 == 2) ? WP(w, vp2_d).data_3 : 0,
 						!isProductionMinimum(i, 1), !isProductionMaximum(i, 1));
 				}
 			}
@@ -365,7 +367,8 @@
 
 			x = e->we.click.pt.x;
 			line = (e->we.click.pt.y - 127) / 10;
-			if (e->we.click.pt.y >= 127 && IS_INT_INSIDE(line, 0, 2) && i->produced_cargo[line] != CT_INVALID) {
+			if (e->we.click.pt.y >= 127 && IS_INT_INSIDE(line, 0, 2) &&
+					GetIndustrySpec(i->type)->produced_cargo[line] != CT_INVALID) {
 				if (IS_INT_INSIDE(x, 5, 25) ) {
 					/* Clicked buttons, decrease or increase production */
 					if (x < 15) {
@@ -379,11 +382,11 @@
 					UpdateIndustryProduction(i);
 					SetWindowDirty(w);
 					w->flags4 |= 5 << WF_TIMEOUT_SHL;
-					WP(w,vp2_d).data_2 = line+1;
-					WP(w,vp2_d).data_3 = (x < 15 ? 1 : 2);
+					WP(w, vp2_d).data_2 = line + 1;
+					WP(w, vp2_d).data_3 = (x < 15 ? 1 : 2);
 				} else if (IS_INT_INSIDE(x, 34, 160)) {
 					/* clicked the text */
-					WP(w,vp2_d).data_1 = line;
+					WP(w, vp2_d).data_1 = line;
 					SetDParam(0, i->production_rate[line] * 8);
 					ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_CONFIG_GAME_PRODUCTION, 10, 100, w, CS_ALPHANUMERAL);
 				}
@@ -392,20 +395,20 @@
 		case 6:
 			i = GetIndustry(w->window_number);
 			ScrollMainWindowToTile(i->xy + TileDiffXY(1, 1));
-		}	break;
+		} break;
 
 		}
 		break;
 	case WE_TIMEOUT:
-		WP(w,vp2_d).data_2 = 0;
-		WP(w,vp2_d).data_3 = 0;
+		WP(w, vp2_d).data_2 = 0;
+		WP(w, vp2_d).data_3 = 0;
 		SetWindowDirty(w);
 		break;
 
 	case WE_ON_EDIT_TEXT:
 		if (e->we.edittext.str[0] != '\0') {
 			Industry* i = GetIndustry(w->window_number);
-			int line = WP(w,vp2_d).data_1;
+			int line = WP(w, vp2_d).data_1;
 
 			i->production_rate[line] = clampu(atoi(e->we.edittext.str), 0, 255);
 			UpdateIndustryProduction(i);
@@ -416,11 +419,13 @@
 
 static void UpdateIndustryProduction(Industry *i)
 {
-	if (i->produced_cargo[0] != CT_INVALID)
-		i->total_production[0] = 8 * i->production_rate[0];
+	const IndustrySpec *ind = GetIndustrySpec(i->type);
 
-	if (i->produced_cargo[1] != CT_INVALID)
-		i->total_production[1] = 8 * i->production_rate[1];
+	for (byte j = 0; j < lengthof(ind->produced_cargo); j++) {
+		if (ind->produced_cargo[j] != CT_INVALID) {
+			i->total_production[j] = 8 * i->production_rate[j];
+		}
+	}
 }
 
 static const Widget _industry_view_widgets[] = {
@@ -449,10 +454,10 @@
 
 	if (w != NULL) {
 		w->flags4 |= WF_DISABLE_VP_SCROLL;
-		WP(w,vp2_d).data_1 = 0;
-		WP(w,vp2_d).data_2 = 0;
-		WP(w,vp2_d).data_3 = 0;
-		AssignWindowViewport(w, 3, 17, 0xFE, 0x56, GetIndustry(w->window_number)->xy + TileDiffXY(1, 1), 1);
+		WP(w, vp2_d).data_1 = 0;
+		WP(w, vp2_d).data_2 = 0;
+		WP(w, vp2_d).data_3 = 0;
+		AssignWindowViewport(w, 3, 17, 0xFE, 0x56, GetIndustry(w->window_number)->xy + TileDiffXY(1, 1), ZOOM_LVL_INDUSTRY);
 	}
 }
 
@@ -482,6 +487,8 @@
 {
 	const Industry* i = *(const Industry**)a;
 	const Industry* j = *(const Industry**)b;
+	const IndustrySpec *ind_i = GetIndustrySpec(i->type);
+	const IndustrySpec *ind_j = GetIndustrySpec(j->type);
 	int r;
 
 	switch (_industry_sort_order >> 1) {
@@ -495,10 +502,10 @@
 			break;
 
 		case 2: /* Sort by Production */
-			if (i->produced_cargo[0] == CT_INVALID) {
-				r = (j->produced_cargo[0] == CT_INVALID ? 0 : -1);
+			if (ind_i->produced_cargo[0] == CT_INVALID) {
+				r = (ind_j->produced_cargo[0] == CT_INVALID ? 0 : -1);
 			} else {
-				if (j->produced_cargo[0] == CT_INVALID) {
+				if (ind_j->produced_cargo[0] == CT_INVALID) {
 					r = 1;
 				} else {
 					r =
@@ -509,23 +516,23 @@
 			break;
 
 		case 3: /* Sort by transported fraction */
-			if (i->produced_cargo[0] == CT_INVALID) {
-				r = (j->produced_cargo[0] == CT_INVALID ? 0 : -1);
+			if (ind_i->produced_cargo[0] == CT_INVALID) {
+				r = (ind_j->produced_cargo[0] == CT_INVALID ? 0 : -1);
 			} else {
-				if (j->produced_cargo[0] == CT_INVALID) {
+				if (ind_j->produced_cargo[0] == CT_INVALID) {
 					r = 1;
 				} else {
 					int pi;
 					int pj;
 
 					pi = i->pct_transported[0] * 100 >> 8;
-					if (i->produced_cargo[1] != CT_INVALID) {
+					if (ind_i->produced_cargo[1] != CT_INVALID) {
 						int p = i->pct_transported[1] * 100 >> 8;
 						if (p < pi) pi = p;
 					}
 
 					pj = j->pct_transported[0] * 100 >> 8;
-					if (j->produced_cargo[1] != CT_INVALID) {
+					if (ind_j->produced_cargo[1] != CT_INVALID) {
 						int p = j->pct_transported[1] * 100 >> 8;
 						if (p < pj) pj = p;
 					}
@@ -599,31 +606,32 @@
 		SetVScrollCount(w, _num_industry_sort);
 
 		DrawWindowWidgets(w);
-		DoDrawString(_industry_sort_order & 1 ? DOWNARROW : UPARROW, _indicator_positions[_industry_sort_order>>1], 15, 0x10);
+		DoDrawString(_industry_sort_order & 1 ? DOWNARROW : UPARROW, _indicator_positions[_industry_sort_order >> 1], 15, 0x10);
 
 		p = w->vscroll.pos;
 		n = 0;
 
 		while (p < _num_industry_sort) {
 			const Industry* i = _industry_sort[p];
+			const IndustrySpec *ind = GetIndustrySpec(i->type);
 
 			SetDParam(0, i->index);
-			if (i->produced_cargo[0] != CT_INVALID) {
-				SetDParam(1, i->produced_cargo[0]);
+			if (ind->produced_cargo[0] != CT_INVALID) {
+				SetDParam(1, ind->produced_cargo[0]);
 				SetDParam(2, i->total_production[0]);
 
-				if (i->produced_cargo[1] != CT_INVALID) {
-					SetDParam(3, i->produced_cargo[1]);
+				if (ind->produced_cargo[1] != CT_INVALID) {
+					SetDParam(3, ind->produced_cargo[1]);
 					SetDParam(4, i->total_production[1]);
 					SetDParam(5, i->pct_transported[0] * 100 >> 8);
 					SetDParam(6, i->pct_transported[1] * 100 >> 8);
-					DrawString(4, 28+n*10, STR_INDUSTRYDIR_ITEM_TWO, 0);
+					DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM_TWO, 0);
 				} else {
 					SetDParam(3, i->pct_transported[0] * 100 >> 8);
-					DrawString(4, 28+n*10, STR_INDUSTRYDIR_ITEM, 0);
+					DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM, 0);
 				}
 			} else {
-				DrawString(4, 28+n*10, STR_INDUSTRYDIR_ITEM_NOPROD, 0);
+				DrawString(4, 28 + n * 10, STR_INDUSTRYDIR_ITEM_NOPROD, 0);
 			}
 			p++;
 			if (++n == w->vscroll.cap) break;
@@ -633,25 +641,25 @@
 	case WE_CLICK:
 		switch (e->we.click.widget) {
 		case 3: {
-			_industry_sort_order = _industry_sort_order==0 ? 1 : 0;
+			_industry_sort_order = _industry_sort_order == 0 ? 1 : 0;
 			_industry_sort_dirty = true;
 			SetWindowDirty(w);
 		} break;
 
 		case 4: {
-			_industry_sort_order = _industry_sort_order==2 ? 3 : 2;
+			_industry_sort_order = _industry_sort_order == 2 ? 3 : 2;
 			_industry_sort_dirty = true;
 			SetWindowDirty(w);
 		} break;
 
 		case 5: {
-			_industry_sort_order = _industry_sort_order==4 ? 5 : 4;
+			_industry_sort_order = _industry_sort_order == 4 ? 5 : 4;
 			_industry_sort_dirty = true;
 			SetWindowDirty(w);
 		} break;
 
 		case 6: {
-			_industry_sort_order = _industry_sort_order==6 ? 7 : 6;
+			_industry_sort_order = _industry_sort_order == 6 ? 7 : 6;
 			_industry_sort_dirty = true;
 			SetWindowDirty(w);
 		} break;
--- a/src/industry_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/industry_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -48,20 +48,37 @@
 	GFX_BUBBLE_CATCHER                 = 162,
 	GFX_TOFFEE_QUARY                   = 165,
 	GFX_SUGAR_MINE_SIEVE               = 174,
-	NUM_INDUSTRY_GFXES                 = 175,
 };
 
+/**
+ * Get the industry ID of the given tile
+ * @param t the tile to get the industry ID from
+ * @pre IsTileType(t, MP_INDUSTRY)
+ * @return the industry ID
+ */
 static inline IndustryID GetIndustryIndex(TileIndex t)
 {
 	assert(IsTileType(t, MP_INDUSTRY));
 	return _m[t].m2;
 }
 
+/**
+ * Get the industry of the given tile
+ * @param t the tile to get the industry from
+ * @pre IsTileType(t, MP_INDUSTRY)
+ * @return the industry
+ */
 static inline Industry* GetIndustryByTile(TileIndex t)
 {
 	return GetIndustry(GetIndustryIndex(t));
 }
 
+/**
+ * Is this industry tile fully built?
+ * @param t the tile to analyze
+ * @pre IsTileType(t, MP_INDUSTRY)
+ * @return true if and only if the industry tile is fully built
+ */
 static inline bool IsIndustryCompleted(TileIndex t)
 {
 	assert(IsTileType(t, MP_INDUSTRY));
@@ -106,18 +123,36 @@
 	SB(_m[tile].m1, 0, 2, value);
 }
 
+/**
+ * Get the industry graphics ID for the given industry tile
+ * @param t the tile to get the gfx for
+ * @pre IsTileType(t, MP_INDUSTRY)
+ * @return the gfx ID
+ */
 static inline IndustryGfx GetIndustryGfx(TileIndex t)
 {
 	assert(IsTileType(t, MP_INDUSTRY));
 	return _m[t].m5;
 }
 
+/**
+ * Set the industry graphics ID for the given industry tile
+ * @param t   the tile to set the gfx for
+ * @pre IsTileType(t, MP_INDUSTRY)
+ * @param gfx the graphics ID
+ */
 static inline void SetIndustryGfx(TileIndex t, IndustryGfx gfx)
 {
 	assert(IsTileType(t, MP_INDUSTRY));
 	_m[t].m5 = gfx;
 }
 
+/**
+ * Make the given tile an industry tile
+ * @param t     the tile to make an industry tile
+ * @param index the industry this tile belongs to
+ * @param gfx   the graphics to use for the tile
+ */
 static inline void MakeIndustry(TileIndex t, IndustryID index, IndustryGfx gfx)
 {
 	SetTileType(t, MP_INDUSTRY);
@@ -157,7 +192,6 @@
  * as well as the completion bit.
  * In fact, it is the same as restarting construction frmo ground up
  * @param tile the tile to query
- * @param generating_world whether generating a world or not
  * @pre IsTileType(tile, MP_INDUSTRY)
  */
 static inline void ResetIndustryConstructionStage(TileIndex tile)
@@ -166,50 +200,6 @@
 	_m[tile].m1 = 0;
 }
 
-struct IndustryTypeSolver {
-	IndustryGfx MinGfx;
-	IndustryGfx MaxGfx;
-};
-
-static const IndustryTypeSolver industry_gfx_Solver [IT_END] = {
-	{  0,   6}, ///< IT_COAL_MINE
-	{  7,  10}, ///< IT_POWER_STATION,
-	{ 11,  15}, ///< IT_SAWMILL,
-	{ 16,  17}, ///< IT_FOREST,
-	{ 18,  23}, ///< IT_OIL_REFINERY,
-	{ 24,  28}, ///< IT_OIL_RIG,
-	{ 29,  31}, ///< IT_OIL_WELL,
-	{ 32,  38}, ///< IT_FARM,
-	{ 39,  42}, ///< IT_FACTORY,
-	{ 43,  46}, ///< IT_PRINTING_WORKS,
-	{ 47,  51}, ///< IT_COPPER_MINE,
-	{ 52,  57}, ///< IT_STEEL_MILL,
-	{ 58,  59}, ///< IT_BANK_TEMP,
-	{ 60,  63}, ///< IT_FOOD_PROCESS,
-	{ 64,  71}, ///< IT_PAPER_MILL,
-	{ 72,  88}, ///< IT_GOLD_MINE,
-	{ 89,  90}, ///< IT_BANK_TROPIC_ARCTIC,
-	{ 91,  99}, ///< IT_DIAMOND_MINE,
-	{100, 115}, ///< IT_IRON_MINE,
-	{116, 116}, ///< IT_FRUIT_PLANTATION,
-	{117, 117}, ///< IT_RUBBER_PLANTATION,
-	{118, 119}, ///< IT_WATER_SUPPLY,
-	{120, 120}, ///< IT_WATER_TOWER,
-	{121, 124}, ///< IT_FACTORY_2,
-	{125, 128}, ///< IT_LUMBER_MILL,
-	{129, 130}, ///< IT_COTTON_CANDY,
-	{131, 134}, ///< IT_CANDY_FACTORY or sweet factory
-	{135, 136}, ///< IT_BATTERY_FARM,
-	{137, 137}, ///< IT_COLA_WELLS,
-	{138, 141}, ///< IT_TOY_SHOP,
-	{142, 147}, ///< IT_TOY_FACTORY,
-	{148, 155}, ///< IT_PLASTIC_FOUNTAINS,
-	{156, 159}, ///< IT_FIZZY_DRINK_FACTORY,
-	{160, 163}, ///< IT_BUBBLE_GENERATOR,
-	{164, 166}, ///< IT_TOFFEE_QUARRY,
-	{167, 174}  ///< IT_SUGAR_MINE,
-};
-
 /**
  * Get the animation loop number
  * @param tile the tile to get the animation loop number of
@@ -247,7 +237,7 @@
 /**
  * Set the animation state
  * @param tile the tile to set the animation state of
- * @param count the new animation state
+ * @param state the new animation state
  * @pre IsTileType(tile, MP_INDUSTRY)
  */
 static inline void SetIndustryAnimationState(TileIndex tile, byte state)
--- a/src/intro_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/intro_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -64,6 +64,10 @@
 		break;
 
 	case WE_CLICK:
+		/* Do not create a network server when you (just) have closed one of the game
+		 * creation/load windows for the network server. */
+		if (2 <= e->we.click.widget && e->we.click.widget <= 6) _is_network_server = false;
+
 		switch (e->we.click.widget) {
 		case 2: ShowGenerateLandscape(); break;
 		case 3: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
--- a/src/landscape.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/landscape.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -76,13 +76,13 @@
 		break;
 
 	case SLOPE_S:
-		y^=0xF;
+		y ^= 0xF;
 		if ( (x - y) >= 0)
 			z = (x - y) >> 1;
 		break;
 
 	case SLOPE_SW:
-		z = (x>>1) + 1;
+		z = (x >> 1) + 1;
 		break;
 
 	case SLOPE_E:
@@ -97,12 +97,12 @@
 		break;
 
 	case SLOPE_SE:
-		z = (y>>1) + 1;
+		z = (y >> 1) + 1;
 		break;
 
 	case SLOPE_WSE:
 		z = 8;
-		y^=0xF;
+		y ^= 0xF;
 		if (x - y < 0)
 			z += (x - y) >> 1;
 		break;
@@ -114,7 +114,7 @@
 		break;
 
 	case SLOPE_NW:
-		z = (y^0xF)>>1;
+		z = (y ^ 0xF) >> 1;
 		break;
 
 	case SLOPE_NWS:
@@ -124,7 +124,7 @@
 		break;
 
 	case SLOPE_NE:
-		z = (x^0xF)>>1;
+		z = (x ^ 0xF) >> 1;
 		break;
 
 	case SLOPE_ENW:
@@ -141,19 +141,19 @@
 		break;
 
 	case SLOPE_STEEP_S:
-		z = 1 + ((x+y)>>1);
+		z = 1 + ((x + y) >> 1);
 		break;
 
 	case SLOPE_STEEP_W:
-		z = 1 + ((x+(y^0xF))>>1);
+		z = 1 + ((x + (y ^ 0xF)) >> 1);
 		break;
 
 	case SLOPE_STEEP_N:
-		z = 1 + (((x^0xF)+(y^0xF))>>1);
+		z = 1 + (((x ^ 0xF) + (y ^ 0xF)) >> 1);
 		break;
 
 	case SLOPE_STEEP_E:
-		z = 1 + (((x^0xF)+(y^0xF))>>1);
+		z = 1 + (((x ^ 0xF) + (y ^ 0xF)) >> 1);
 		break;
 
 		default: break;
@@ -274,9 +274,9 @@
 	MarkTileDirtyByTile(tile);
 }
 
-uint32 GetTileTrackStatus(TileIndex tile, TransportType mode)
+uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode)
 {
-	return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode);
+	return _tile_type_procs[GetTileType(tile)]->get_tile_track_status_proc(tile, mode, sub_mode);
 }
 
 void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player)
@@ -385,8 +385,8 @@
 	int32 cost, ret, money;
 	int ex;
 	int ey;
-	int sx,sy;
-	int x,y;
+	int sx, sy;
+	int x, y;
 	bool success = false;
 
 	if (p1 >= MapSize()) return CMD_ERROR;
@@ -435,7 +435,7 @@
 
 #define TILELOOP_BITS 4
 #define TILELOOP_SIZE (1 << TILELOOP_BITS)
-#define TILELOOP_ASSERTMASK ((TILELOOP_SIZE-1) + ((TILELOOP_SIZE-1) << MapLogX()))
+#define TILELOOP_ASSERTMASK ((TILELOOP_SIZE - 1) + ((TILELOOP_SIZE - 1) << MapLogX()))
 #define TILELOOP_CHKMASK (((1 << (MapLogX() - TILELOOP_BITS))-1) << TILELOOP_BITS)
 
 void RunTileLoop()
--- a/src/landscape.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/landscape.h	Sat Jun 02 19:59:29 2007 +0000
@@ -2,6 +2,9 @@
 
 /** @file landscape.h */
 
+#ifndef LANDSCAPE_H
+#define LANDSCAPE_H
+
 enum {
 	SNOW_LINE_MONTHS = 12,
 	SNOW_LINE_DAYS   = 32,
@@ -17,3 +20,42 @@
 byte GetSnowLine(void);
 byte HighestSnowLine(void);
 void ClearSnowLine(void);
+
+bool IsValidTile(TileIndex tile);
+
+uint GetPartialZ(int x, int y, Slope corners);
+uint GetSlopeZ(int x, int y);
+
+static inline Point RemapCoords(int x, int y, int z)
+{
+	Point pt;
+	pt.x = (y - x) * 2;
+	pt.y = y + x - z;
+	return pt;
+}
+
+static inline Point RemapCoords2(int x, int y)
+{
+	return RemapCoords(x, y, GetSlopeZ(x, y));
+}
+
+void DrawFoundation(TileInfo *ti, uint f);
+
+void DoClearSquare(TileIndex tile);
+void RunTileLoop();
+
+uint32 GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode);
+void GetAcceptedCargo(TileIndex tile, AcceptedCargo ac);
+void ChangeTileOwner(TileIndex tile, PlayerID old_player, PlayerID new_player);
+void AnimateTile(TileIndex tile);
+void ClickTile(TileIndex tile);
+void GetTileDesc(TileIndex tile, TileDesc *td);
+
+void InitializeLandscape();
+void GenerateLandscape(byte mode);
+
+void ConvertGroundTilesIntoWaterTiles();
+
+TileIndex AdjustTileCoordRandomly(TileIndex a, byte rng);
+
+#endif /* LANDSCAPE_H */
--- a/src/lang/american.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/american.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode en_US
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Off edge of map
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Small
 STR_02A2_MEDIUM                                                 :{BLACK}Medium
 STR_02A3_LARGE                                                  :{BLACK}Large
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}City
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Select town size
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Town size:
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Map of world
 STR_EXTRA_VIEW_PORT                                             :Extra viewport
 STR_SIGN_LIST                                                   :Sign list
+STR_TRANSPARENCY_OPTIONS                                        :Transparency options
 STR_02DF_TOWN_DIRECTORY                                         :Town directory
 STR_TOWN_POPULATION                                             :{BLACK}World population: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Viewport {COMMA}
@@ -1044,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Allow drive-through road stops on town owned roads: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Allow building adjacent stations: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Always allow small airports: {ORANGE}{STRING}
 
@@ -1084,6 +1089,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Service helicopters at helipads automatically: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Link landscape toolbar to rail/road/water/airport toolbars: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Reverse scroll direction: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Smooth viewport scrolling: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Show a measurement tooltip when using various build-tools: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Show company liveries: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :None
@@ -1095,6 +1101,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scroll map
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Off
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Map scrollwheel speed: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatically pause when starting a new game: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Use the advanced vehicle list: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max trains per player: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max road vehicles per player: {ORANGE}{STRING}
@@ -1128,12 +1136,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Allow buying shares from other companies
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}When dragging place signals every: {ORANGE}{STRING} tile(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatically build semaphores before: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}The town layout "no more roads" isn't valid in the scenario editor
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Select town-road layout: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :no more roads
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :default
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :better roads
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 grid
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 grid
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position of main toolbar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Left
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centre
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Right
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Window snap radius: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Window snap radius: {ORANGE}disabled
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Town growth speed: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :None
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Slow
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Fast
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Very fast
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportion of towns that will grow twice as fast: {ORANGE}1 in {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportion of towns that will grow twice as fast: {ORANGE}None
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Initial city size multiplier: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construction
@@ -1564,6 +1590,13 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Railroad track with pre-signals
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Railroad track with exit-signals
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Railroad track with combo-signals
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Railway track with normal and pre-signals
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Railway track with normal and exit-signals
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Railway track with normal and combo-signals
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Railway track with pre- and exit-signals
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Railway track with pre- and combo-signals
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Railway track with exit- and combo-signals
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Must remove railway station first
 
 
 
@@ -1571,22 +1604,39 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Must remove road first
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Road works in progress
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Road Construction
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Tramway Construction
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Select Road Bridge
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... one way roads can't have junctions
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Can't build road here...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Can't build tramway here...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Can't remove road from here...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Can't remove tramway from here...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Road Depot Orientation
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Tram Depot Orientation
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Can't build road vehicle depot here...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Can't build tram vehicle depot here...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Can't build bus station...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Can't build truck station...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Can't build passenger tram station...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Can't build freight tram station...
 STR_180A_ROAD_CONSTRUCTION                                      :Road construction
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Tramway construction
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Build road section
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Build tramway section
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Build road vehicle depot (for building and servicing vehicles)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Build tram vehicle depot (for building and servicing trams)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Build bus station
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Build truck loading bay
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Build passenger tram station
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Build freight tram station
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Build road bridge
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Build tramway bridge
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Build road tunnel
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Build tramway tunnel
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Toggle build/remove for road construction
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Toggle build/remove for tramway construction
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Select road vehicle depot orientation
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Select tram vehicle depot orientation
 STR_1814_ROAD                                                   :Road
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Road with streetlights
 STR_1816_TREE_LINED_ROAD                                        :Tree-lined road
@@ -1594,6 +1644,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Road/rail grade crossing
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Can't remove bus station...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Can't remove truck station...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Can't remove passenger tram station...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Can't remove freight tram station...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Towns
@@ -1758,8 +1810,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} now accepts {STRING} and {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Bus Station Orientation
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Truck Station Orient.
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Passenger Tram Orientation
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Freight Tram Orientation
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Must demolish bus station first
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Must demolish truck station first
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Must demolish passenger tram station first
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Must demolish freight tram station first
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Station{P "" s}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- None -
@@ -1771,6 +1827,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Select length of railroad station
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Select bus station orientation
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Select truck loading bay orientation
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Select passenger tram station orientation
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Select freight tram station orientation
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Center main view on station location
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Show station ratings
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Change name of station
@@ -1991,6 +2049,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Heliport
 STR_SV_STNAME_FOREST                                            :{STRING} Forest
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2086,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :None
+STR_NUM_VERY_LOW                                                :Very low
 STR_6816_LOW                                                    :Low
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :High
@@ -2218,6 +2279,8 @@
 STR_LIVERY_HELICOPTER                                           :Helicopter
 STR_LIVERY_SMALL_PLANE                                          :Small Airplane
 STR_LIVERY_LARGE_PLANE                                          :Large Airplane
+STR_LIVERY_PASSENGER_TRAM                                       :Passenger Tram
+STR_LIVERY_FREIGHT_TRAM                                         :Freight Tram
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Show general color schemes
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Show train color schemes
@@ -2691,6 +2754,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Name road vehicle
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Citizens celebrate . . .{}First bus arrives at {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Citizens celebrate . . .{}First truck arrives at {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Citizens celebrate . . .{}First passenger tram arrives at {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Citizens celebrate . . .{}First freight tram arrives at {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Road Vehicle Crash!{}Driver dies in fireball after collision with train
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Road Vehicle Crash!{}{COMMA} die in fireball after collision with train
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Can't make vehicle turn around...
@@ -2975,6 +3040,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}You are about to sell all the vehicles in the depot. Are you sure?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Wrong depot type
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Sell all trains in the depot
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Sell all road vehicles in the depot
@@ -3012,7 +3078,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Make autoreplace keep the length of a train the same by removing cars (starting at the front), if replacing the engine would make the train longer.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Replacing: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTAL FEATURE {}Switch between engine and car replacement windows.{}Car replacement will only be done if the new car can be refitted into carrying the same type of cargo as the old one. This is checked for each car when the actual replacement takes place.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Engine is not buildable
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehicle is not available
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehicle is not available
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Ship is not available
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aircraft is not available
 
 STR_ENGINES                                                     :Engines
 STR_WAGONS                                                      :Cars
@@ -3088,6 +3157,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Change starting year
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Scale warning
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Resizing source map too much is not recommended. Continue with the generation?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Town layout warning
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}The town layout "no more roads" is not recommended. Continue with the generation?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Heightmap name:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Size: {ORANGE}{NUM} x {NUM}
@@ -3149,3 +3220,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transfer Credits: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...this is a town owned road
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...road facing in the wrong direction
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Transparency Options
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Toggle transparency for station signs
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Toggle transparency for trees
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Toggle transparency for houses
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Toggle transparency for industries
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Toggle transparency for buildables like stations, depots, waypoints and catenary
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Toggle transparency for bridges
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Toggle transparency for structures like lighthouses and antennas, maybe in future for eyecandy
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Group {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :All trains
+STR_GROUP_ALL_ROADS                                             :All road vehicles
+STR_GROUP_ALL_SHIPS                                             :All ships
+STR_GROUP_ALL_AIRCRAFTS                                         :All aircraft
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Add shared vehicles
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Remove all vehicles
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Train{P "" s}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Road Vehicle{P "" s}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Ship{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aircraft
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Rename a group
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Replace Vehicles of "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Can't create group...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Can't delete this group...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Can't rename group...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Can't remove all vehicles from this group...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Can't add the vehicle to this group...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Can't add shared vehicles to group...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Groups - Click on a group to list all of its vehicles
+STR_GROUP_CREATE_TIP                                            :{BLACK}Click to create a group
+STR_GROUP_DELETE_TIP                                            :{BLACK}Delete the selected group
+STR_GROUP_RENAME_TIP                                            :{BLACK}Rename the selected group
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Click to protect this group from global autoreplace
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Profit this year: {GREEN}{CURRENCY} {BLACK}(last year: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit this year: {RED}{CURRENCY} {BLACK}(last year: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit this year: {GREEN}{CURRENCY} {BLACK}(last year: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Profit this year: {RED}{CURRENCY} {BLACK}(last year: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/brazilian_portuguese.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/brazilian_portuguese.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -5,6 +5,8 @@
 ##case m f
 ##gender m f
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Fora do mapa
@@ -729,6 +731,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Colocar farol
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Colocar transmissor
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Define área desértica.{} Pressione e segure CTRL para removê-la
+STR_CREATE_LAKE                                                 :{BLACK}Define área com água.{} Faz um canal, a menos se CTRL for pressionado ao nível do mar, neste caso inundará ao redor
 STR_0290_DELETE                                                 :{BLACK}Remover
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Remover esta cidade completamente
 STR_0292_SAVE_SCENARIO                                          :Salvar cenário
@@ -752,6 +755,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Pequena
 STR_02A2_MEDIUM                                                 :{BLACK}Média
 STR_02A3_LARGE                                                  :{BLACK}Grande
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Cidade
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Selecionar tamanho da cidade
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Tamanho da cidade:
 
@@ -803,6 +807,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mapa mundi
 STR_EXTRA_VIEW_PORT                                             :Visualizador extra
 STR_SIGN_LIST                                                   :Lista de placas
+STR_TRANSPARENCY_OPTIONS                                        :Opções de Transparência
 STR_02DF_TOWN_DIRECTORY                                         :Lista de cidades
 STR_TOWN_POPULATION                                             :{BLACK}População mundial: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Visualizador {COMMA}
@@ -1045,6 +1050,7 @@
 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}Permitir estações drive-through em ruas locais: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permitir sempre aeroportos pequenos: {ORANGE}{STRING}
 
@@ -1096,6 +1102,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scroll map
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Desligado
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Velocidade do scrollwheel do mapa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pausar automaticamente ao inicar um novo jogo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Usar a lista avançada de veículos: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Máximo de trens por jogador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Máximo de automóveis por jogador: {ORANGE}{STRING}
@@ -1129,12 +1137,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permite comprar ações de outras companhias
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ao arrastar colocar sinais a cada: {ORANGE}{STRING} quadrado(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automaticamente constroi semáforos anteriores: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}O layout de cidade "sem mais estradas" não é válido no editor
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Selecione o layout das estradas {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :sem mais estradas
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :padrão
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :melhores estradas
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :grade 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :grade 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posição da barra de ferramentas principal: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Esquerda
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centro
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Direita
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Raio de atração de janelas: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Raio de atração de janelas: {ORANGE}desativado
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Velocidade de crescimento de cidade: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Nenhum
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Devagar
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rápido
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Muito rápido
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporção de cidades que irão crescer duas vezes mais rápido: {ORANGE}1 em {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporção de cidades que irão crescer duas vezes mais rápido: {ORANGE}Nenhum
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicador do tamanho inicial da cidade: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construção
@@ -1565,6 +1591,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Ferrovia com pré-sinais
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Ferrovia com sinais de saída
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Ferrovia com sinais combinados
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Remova a estação de trem antes
 
 
 
@@ -1572,22 +1599,38 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Precisa remover a rodovia primeiro
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Recapeamento rodoviário em progresso
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Construir rodovias
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Construção de Bonde
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Selecionar Ponte Rodoviária
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Impossível construir rodovia aqui...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Impossível construir bonde aqui...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Impossível remover rodovia daqui...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Impossível remover bonde daqui...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Orientação da Garagem
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Orientação do Depósito
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Impossível construir garagem aqui...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Impossível construir depósito 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 estação de caminhão
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Impossível construir estação de bonde...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Impossível construir estação de bonde
 STR_180A_ROAD_CONSTRUCTION                                      :Construir rodovias
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Construção de Bonde
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construir trecho rodoviário
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construir linha de bonde
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construir garagem (para construção e manutenção de automóveis)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construir depósito de bonde (para construção e manutenção de bondes)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Construir estação de ônibus
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Construir carga de caminhões
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Constuir estação de bonde para passageiros
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Constuir estação de bonde para carga
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Construir ponte rodoviária
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Construir ponte de bonde
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construir túnel rodoviário
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Construir túnel de bonde
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Alternar construir/remover para contrução rodoviária
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Alternar construir/remover linhas de bonde e sinais
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Selecionar a orientação da garagem
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Selecionar a orientação do depósito de bonde
 STR_1814_ROAD                                                   :Rodovia
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Rodovia iluminada
 STR_1816_TREE_LINED_ROAD                                        :Rodovia arborizada
@@ -1595,6 +1638,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Passagem de nível
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Impossível remover estação de ônibus
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Impossível remover parada de caminhões
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Impossível remover estação de bonde...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Impossível remover estação de bonde...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Cidades
@@ -1761,8 +1806,12 @@
 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 estação de caminhão
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Orientação da Estação de Bonde
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Orientação da Estação de Bonde
 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 estação de caminhão
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Precisa demolir estação de bonde primeiro
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Precisa demolir estação de bonde primeiro
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Estações
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Nenhuma -
@@ -1774,6 +1823,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Selecionar o tamanho da estação ferroviária
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Selecionar orientação do estação de ônibus
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Selecionar orientação da área de carga
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Selecionar orientação da estação de bonde
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Selecionar orientação da estação de bonde
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centralizar visualização no local estação
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Exibir avaliações da estação
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Alterar o nome da estação
@@ -1994,6 +2045,8 @@
 STR_SV_STNAME_HELIPORT                                          :Heliporto de {STRING}
 STR_SV_STNAME_FOREST                                            :Floresta de {STRING}
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2029,6 +2082,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Nenhum
+STR_NUM_VERY_LOW                                                :Muito baixo
 STR_6816_LOW                                                    :Baixo
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Alto
@@ -2221,6 +2275,8 @@
 STR_LIVERY_HELICOPTER                                           :Helicóptero
 STR_LIVERY_SMALL_PLANE                                          :Aeronave Pequena
 STR_LIVERY_LARGE_PLANE                                          :Aeronave Grande
+STR_LIVERY_PASSENGER_TRAM                                       :Bonde de Passageiros
+STR_LIVERY_FREIGHT_TRAM                                         :Bonde de Carga
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Exibir esquemas de cor gerais
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Exibir esquemas de cor de trens
@@ -2694,6 +2750,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Renomear automóvel
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cidadãos celebram . . .{}Primeiro ônibus chega a {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cidadãos celebram . . .{}Primeiro caminhão chega a {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Cidadãos celebram . . .{}Primeiro bonde de passageiros chega a {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Cidadãos celebram . . .{}Primeiro bonde de carga chega a {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Acidente Rodoviário!{} Condutor morre numa explosão após a colisão com um trem
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Acidente Rodoviário!{} {COMMA} mortos numa explosão após a colisão com um trem
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Impossível fazer o veículo dar a volta...
@@ -2978,6 +3036,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Você está prestes a vender todos os automóveis da garagem. Você tem certeza?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Tipo de depósito errado
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Vender todos os trens no depósito
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Vender todos os automóveis na garagem
@@ -3015,7 +3074,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Faz autosubstituição manter o tamanho do trem removendo vagões (começando pela frente), se ao substituir a locomotiva o trem ficar maior.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Substituindo: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTAL {}Troca entre substituir máquinas e substituir vagões.{} Só haverá a substituição se puder haver o reacondicionamento para carregar o mesmo tipo de carga. Essa checagem ocorre para cada vagão enquanto a substituição ocorre.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}A locomotiva não pode ser construída
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Trem não disponível
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Automóvel não disponível
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Embarcação não disponível
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aeronave não disponível
 
 STR_ENGINES                                                     :Motores
 STR_WAGONS                                                      :Vagões
@@ -3091,6 +3153,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Mudar data de início
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Aviso de Escala
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Alterar muito o tamanho do mapa original não é recomendado. Continuar com a geração?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Aviso do layout da cidade
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}O Layout "sem mais estradas" não é recomendado. Continuar com a geração?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nome do mapa em relevo:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Tamanho: {ORANGE}{NUM} x {NUM}
@@ -3152,3 +3216,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transferir Dinheiro: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...é uma rua local
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...rua na direção errada
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opções de Transparência
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Alternar transparência para sinais de estação
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Alternar transparência para árvores
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Alternar transparência para casas
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Alternar transparência para indústrias
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Alternar transparência para construções como estações, depósitos, pontos de controle e eletrificação da ferrovia
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Alternar transparência para pontes
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Alternar transparência para estruturas como faróis e antenas, talvez no futuro para efeitos visuais
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Agrupar {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Todos os trens
+STR_GROUP_ALL_ROADS                                             :Todos os automóveis
+STR_GROUP_ALL_SHIPS                                             :Todos os navios
+STR_GROUP_ALL_AIRCRAFTS                                         :Todas as aeronaves
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Adicionar veículos compartilhados
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Remover todos os veículos
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Trem{P "" s}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Automóvel{P "" s}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Navio{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aeronave
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Renomear um grupo
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Substituir Veículos de "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Impossível criar grupo...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Impossível remover grupo...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Impossível renomear grupo...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Impossível remover todos os veículos desse grupo...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Impossível adicionar veículo a esse grupo
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Impossível adicionar veículos compartilhados a esse grupo...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Grupos - Clique em um grupo para listar seus veículos
+STR_GROUP_CREATE_TIP                                            :{BLACK}Clique para criar um grupo
+STR_GROUP_DELETE_TIP                                            :{BLACK}Remove o grupo selecionado
+STR_GROUP_RENAME_TIP                                            :{BLACK}Renomeia o grupo selecionado
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Clique para excluir esse grupo da substituição automática
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Lucros do ano: {GREEN}{CURRENCY} {BLACK}(ano passado: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Lucros do ano: {RED}{CURRENCY} {BLACK}(ano passado: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Lucros do ano {GREEN}{CURRENCY} {BLACK}(ano passado: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Lucros do ano: {RED}{CURRENCY} {BLACK}(ano passado {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/bulgarian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/bulgarian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -5,6 +5,8 @@
 ##case accusative dative vocative nominative instrumental locative genitive
 ##gender мъжки женÑки Ñреден
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Извън картата
@@ -753,6 +755,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Малък
 STR_02A2_MEDIUM                                                 :{BLACK}Среден
 STR_02A3_LARGE                                                  :{BLACK}ГолÑм
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Град
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Избери големина на града
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Големина на града:
 
@@ -804,6 +807,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Карта на Ñвета
 STR_EXTRA_VIEW_PORT                                             :Допълнителна камера
 STR_SIGN_LIST                                                   :СпиÑък Ñ Ñ‚Ð°Ð±ÐµÐ»Ð¸
+STR_TRANSPARENCY_OPTIONS                                        :Опций на прозрачноÑÑ‚
 STR_02DF_TOWN_DIRECTORY                                         :СпиÑък ÑÑŠÑ Ñелищата
 STR_TOWN_POPULATION                                             :{BLACK}Световна популациÑ: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Камера {COMMA}
@@ -1097,6 +1101,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Разгледай картата
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Изклучен
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Scrollwheel ÑкороÑÑ‚ на картата: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Ðвтоматична пауза Ñтартирайки нова игра: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Използваи напредналиат ÑпиÑък на превозни ÑредÑтва: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}МакÑ. влакове на играч: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}МакÑ. брой коли на играч: {ORANGE}{STRING}
@@ -1130,12 +1136,30 @@
 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_TOWN_LAYOUT_INVALID                          :{WHITE}Грацкиа план "нÑма повече пътища" е невалиден в Ñценарий редакторат
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Избери грацки пътформат: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :нÑма повече пътища
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :default
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :по-добри пътища
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2х2 мрежа
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3х3 мрежа
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð° лента за инÑтрументи: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :ЛÑво
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Център
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :ДÑÑно
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Прилепване на прозорците: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Прилепване на прозорците: {ORANGE}изключено
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}СкороÑÑ‚ на разтеж на града: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ðикаква
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Бавна
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Ðормална
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Бърза
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Много бърза
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}СъразмерноÑÑ‚ на градове който ще пораÑнат двойно по-бързо: {ORANGE}1 в {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}СъразмерноÑÑ‚ на градове който ще пораÑнат двойно по-бързо: {ORANGE}Ðито един
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Множител за големината на града: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}ИнтерфейÑ
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Строене
@@ -1993,6 +2017,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Хелипорт
 STR_SV_STNAME_FOREST                                            :{STRING} Дървета
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2028,6 +2054,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ðиколко
+STR_NUM_VERY_LOW                                                :Много ниÑко
 STR_6816_LOW                                                    :малко
 STR_6817_NORMAL                                                 :нормално
 STR_6818_HIGH                                                   :много
@@ -3014,7 +3041,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Ðвтоматичната замÑна ще запази дължината на влака като премахне вагони (започвайки от предните), ако замÑната довежда до по-дълъг влак.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}ЗамÑна: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} ЕКСПЕРИМЕÐТÐЛÐРВЪЗМОЖÐОСТ {}Превключване между замÑна на локомотиви и вагони.{}ЗамÑната на вагони ще бъде направена Ñамо ако Ð½Ð¾Ð²Ð¸Ñ Ñ‚Ð¸Ð¿ вагони може да Ñе преуÑтрои да превозва ÑÑŠÑ‰Ð¸Ñ Ñ‚Ð¸Ð¿ товар като Ñтарите. Това Ñе проверÑва за вÑеки вагон когато замÑната Ñе Ñлучва.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Ð”Ð²Ð¸Ð³Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ е Ñтроим
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Превозното ÑредÑтво не е на разположение
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Превозното ÑредÑтво не е на разположение
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Корабът не е на разположение
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Самолетът не е на разположение
 
 STR_ENGINES                                                     :Двигатели
 STR_WAGONS                                                      :Вагони
@@ -3090,6 +3120,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}ПромÑна началната година
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Мащаб предупреждение
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Прекаленото оразмерÑване не е препорачително. Продължаване Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñта?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Грацки план предупреждение
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Грацкиа план "нÑма повече пътища" не е препоръчан. Продължи ÑÑŠÑ Ñъздаването?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Име на виÑочинна карта:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Размер: {ORANGE}{NUM} x {NUM}
@@ -3151,3 +3183,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Сума за премеÑтване: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...този път принадлежи на градът
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...пътÑÑ‚ е наÑочен в погрешната поÑока
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Опций на прозрачноÑÑ‚
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Използвай прозрачноÑÑ‚ за знаци на гара
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Използвай прозрачноÑÑ‚ за дървета
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Използвай прозрачноÑÑ‚ за къщи
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Използвай прозрачноÑÑ‚ за промишленоÑÑ‚
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Използвай прозрачноÑÑ‚ за Ñгради като гари, депа, пътни точки и виÑÑщи жици
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Използвай прозрачноÑÑ‚ за моÑтове
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Използвай прозрачноÑÑ‚ за Ñгради като фарове и антени, може би в бъдеще за украÑи
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Група {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Ð’Ñички влакове
+STR_GROUP_ALL_ROADS                                             :Ð’Ñички пътни превозни ÑредÑтва
+STR_GROUP_ALL_SHIPS                                             :Ð’Ñички кораби
+STR_GROUP_ALL_AIRCRAFTS                                         :Ð’Ñички Ñамолети
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Добави Ñподелени превозни ÑредÑтва
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Премахни вÑички превозни ÑредÑва
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Влак{P "" s}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Пътно Превозно СредÑтво{P "" s}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Кораб{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Самолет
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Преименовай група
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Замени Превозни ÑредÑтва на "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Групата неможе да бъде Ñъздадена...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Тази група неможе да бъде изтрита...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Групата неможе да бъде преименована...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Ð’Ñички превозни ÑредÑтва немогат да бъдат премахнати от тази група...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Превозното ÑредÑтво неможе да Ñе добави към тази група...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Поделени превозни ÑредÑва немогат да бъдат добавени към групата...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Групи - Щракни на група за да видиш ÑпиÑък на вÑички превозни ÑредÑтва от тази група
+STR_GROUP_CREATE_TIP                                            :{BLACK}Щракни да Ñъздадеш група
+STR_GROUP_DELETE_TIP                                            :{BLACK}Изтрий избраната група
+STR_GROUP_RENAME_TIP                                            :{BLACK}Преименувай избраната група
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Щракни да защитиш тази група от глобална автоматична замÑна
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Печалба тази година: {GREEN}{CURRENCY} {BLACK}(предишната година: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Печалба тази година: {RED}{CURRENCY} {BLACK}(предишната година: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Печалба тази година: {GREEN}{CURRENCY} {BLACK}(предишната година: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Печалба тази година: {RED}{CURRENCY} {BLACK}(предишната година: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/catalan.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/catalan.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode ca_ES
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Fora del marc del mapa
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Petit
 STR_02A2_MEDIUM                                                 :{BLACK}Mitjà
 STR_02A3_LARGE                                                  :{BLACK}Gran
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Ciutat
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Selecciona mida de població
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Mida de població:
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mapa del món
 STR_EXTRA_VIEW_PORT                                             :Vista extra
 STR_SIGN_LIST                                                   :Llista de senyals
+STR_TRANSPARENCY_OPTIONS                                        :Opcions de transparència
 STR_02DF_TOWN_DIRECTORY                                         :Directori de Poblacions
 STR_TOWN_POPULATION                                             :{BLACK}Població mundial: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Vista {COMMA}
@@ -989,10 +993,10 @@
 STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}Tren {COMMA} té una ordre buida
 STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Tren {COMMA} té ordres duplicades
 STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Tren {COMMA} té una estació incorrecta en les ordres
-STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Vehicle Rodat {COMMA} té massa poques ordres a la planificació
-STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}Vehicle Rodat {COMMA} té una ordre buida
-STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}Vehicle Rodat {COMMA} té ordres duplicades
-STR_ROADVEHICLE_HAS_INVALID_ENTRY                               :{WHITE}Vehicle Rodat {COMMA} té una estació incorrecta en les ordres
+STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Vehicle {COMMA} té massa poques ordres a la planificació
+STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}Vehicle {COMMA} té una ordre buida
+STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}Vehicle {COMMA} té ordres duplicades
+STR_ROADVEHICLE_HAS_INVALID_ENTRY                               :{WHITE}Vehicle {COMMA} té una estació incorrecta en les ordres
 STR_SHIP_HAS_TOO_FEW_ORDERS                                     :{WHITE}Vaixell {COMMA} té massa poques ordres a la planificació
 STR_SHIP_HAS_VOID_ORDER                                         :{WHITE}Vaixell {COMMA} té una ordre buida
 STR_SHIP_HAS_DUPLICATE_ENTRY                                    :{WHITE}Vaixell {COMMA} té ordres duplicades
@@ -1044,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nova cerca de rutes global (NPF, anul·la NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplicador de pes per contenidor per simular trens pesats: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permet situar parades en carreteres que són propietat del poble: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permetre construir estacions annexes: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permet sempre aeroports petits: {ORANGE}{STRING}
 
@@ -1084,6 +1089,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Manteniment dels helicopters als heliports automàticament: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Enllaça la barra d'eines del paisatge a les barres d'eines de vies/carreteres/aigua/aeroports {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}En desplaçar la pantalla amb el ratolí mou la vista en la direcció contrària: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Desplaçament suau de la vista: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Mostra un cartell de mesura quan estiguis utilitzant vàries eines de construcció: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Mostra la decoració de la companyia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Cap
@@ -1095,6 +1101,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Moure mapa
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Off
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Velocitat del mapa amb la rodeta del ratolí: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Posa en pausa automàticament en començar un joc nou: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Utilitza la llista de vehicles avançada: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max trens per jugador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max automòbils per jugador: {ORANGE}{STRING}
@@ -1128,12 +1136,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permet comprar participacions d'altres empreses
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Arrossegant, sitúa senyals cada: {ORANGE}{STRING} quadre(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Construir semàfors automàticament abans de: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}El format de poble "no més carreteres" no és vàlid a l'editor d'escenaris
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Selecciona el format poble-carretera: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :sense més carreteres
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :predeterminat
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :millors carreteres
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :graella 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :graella 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posició de la barra d'eines principal: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Esquerra
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centre
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Dreta
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Radi de snap de finestra: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Radi de snap de finestra: {ORANGE}desactivat
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Velocitat de creixement de les ciutats: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Cap
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Lenta
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Ràpida
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Molt ràpida
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporció de ciutats que creixeran el doble de ràpid: {ORANGE}1 de cada {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporció de ciutats que creixeran el doble de ràpid: {ORANGE}Cap
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicador de mida de ciutat inicial: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interficie
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construcció
@@ -1564,6 +1590,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Via de tren amb pre-senyals
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Via de tren amb senyals de sortida
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Via de tren amb senyals combinades
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Primer has de treure la via de l'estació
 
 
 
@@ -1571,22 +1598,39 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}S'ha de treure la carretera primer
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Obres en progrés
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Construcció de Carreteres
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Construcció de via de tramvia
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Selecciona un Pont per Carretera
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... les carreteres de sentit únic no poden tenir encreuaments
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Aquí no es pot construir una carretera...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}No puc construir la via de tramvia aquí...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Aquí no es pot treure una carretera...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}No puc treure la via de tramvia d'aquí...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Cotxeres
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Orientació de les cotxeres de tramvies
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Aquí no es pot construir una cotxera...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Aquí no puc construir les cotxeres de tramvies...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}No es pot construir una parada d'autobús...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}No es pot construir estació de mercaderies...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}No puc construir l'estació de tramvies de passatgers
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}No puc construir l'estació de tramvies de càrrega
 STR_180A_ROAD_CONSTRUCTION                                      :Construcció de Carreteres
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Construcció de vies de tramvia
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construeix una secció de carretera
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construeix secció de via de tramvia
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construeix una cotxera (per construir i mantenir vehicles)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construeix cotxeres de tramvies (per construir i revisar tramvies)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Constueix una parada d'autobús
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Construeix un moll de càrrega
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Construeix una estació de tramvies de passatgers
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Construeix una estació de tramvies de mercaderies
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Construeix un pont per carretera
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Construeix pont per tramvies
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construeix un túnel per carretera
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Construeix túnel per tramvies
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Intercanvia funció construeix/treu per la construcció de carreteres
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Canvia construeix/treu de la construcció de vies de tramvia
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Selecciona la orientació de les Cotxeres
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Selecciona l'orientació de les cotxeres de tramvies
 STR_1814_ROAD                                                   :Carretera
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Carretera amb fanals
 STR_1816_TREE_LINED_ROAD                                        :Carretera de tres carrils
@@ -1594,6 +1638,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Pas a nivell
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}No es pot treure l'estació d'autobusos...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}No es pot treure l'estació de camions...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}No puc treure l'estació de tramvies de passatgers
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}No puc treure l'estació de tramvies de mercaderies
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Poblacions
@@ -1758,8 +1804,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} ara accepta {STRING} i {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Parada d'autobús
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Estació de Mercaderies
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Orientació estació passatgers
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Orientació estació mercaderies
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Primer has d'enderrocar la parada d'autobús
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Primer has d'enderrocar l'estació de mercaderies
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Primer has de demolir l'estació de tramvies de passatgers
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Primer has de demolir l'estació de tramvies de mercaderies
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Estacions/Parades
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Cap -
@@ -1771,6 +1821,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Selecciona la mida de les andanes de l'estació de tren
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Selecciona l'orientació de la parada d'autobús
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Selecciona l'orientació del moll de càrrega de camions
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Selecciona l'orientació de l'estació de tramvies de passatgers
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Selecciona l'orientació de l'estació de tramvies de mercaderies
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centra la pantalla principal al lloc de l'estació
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Mostra els ratis de l'estació
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Canvia el nom de l'estació
@@ -1953,7 +2005,7 @@
 STR_SV_EMPTY                                                    :
 STR_SV_UNNAMED                                                  :Sense Nom
 STR_SV_TRAIN_NAME                                               :Tren {COMMA}
-STR_SV_ROADVEH_NAME                                             :Vehicle Rodat {COMMA}
+STR_SV_ROADVEH_NAME                                             :Vehicle {COMMA}
 STR_SV_SHIP_NAME                                                :Vaixell {COMMA}
 STR_SV_AIRCRAFT_NAME                                            :Aeronau {COMMA}
 
@@ -1991,6 +2043,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Heliport
 STR_SV_STNAME_FOREST                                            :{STRING} Bosc
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2080,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Cap
+STR_NUM_VERY_LOW                                                :Molt baix
 STR_6816_LOW                                                    :Baix
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Alt
@@ -2086,12 +2141,12 @@
 STR_7011_CONSTRUCTION                                           :{GOLD}Construcció
 STR_7012_NEW_VEHICLES                                           :{GOLD}Nous Vehicles
 STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Desp. de Circ. de Trens
-STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Desp. de Circ. de Vehicles Rodats
+STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Desp. de Circ. de Vehicles
 STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Desp. de Circ. d'Aeronaus
 STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Desp. de Circ. de Vaixells
 STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Manteniment de Propietats
 STR_7018_TRAIN_INCOME                                           :{GOLD}Ingressos de Tren
-STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Ingressos de Vehicles Rodats
+STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Ingressos de Vehicles
 STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Ingressos d'Aeronaus
 STR_701B_SHIP_INCOME                                            :{GOLD}Ingressos de Vaixells
 STR_701C_LOAN_INTEREST                                          :{GOLD}Interessos del Prèstec
@@ -2218,6 +2273,8 @@
 STR_LIVERY_HELICOPTER                                           :Helicòpter
 STR_LIVERY_SMALL_PLANE                                          :Avió petit
 STR_LIVERY_LARGE_PLANE                                          :Avió gran
+STR_LIVERY_PASSENGER_TRAM                                       :Tramvia de passatgers
+STR_LIVERY_FREIGHT_TRAM                                         :Tramvia de càrrega
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Mostra esquemes de colors generals
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Mostra els esquemes de colors dels trens
@@ -2646,11 +2703,11 @@
 
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Automòbil en camí
-STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Vehicles Rodats
+STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Vehicles
 STR_9002                                                        :{WHITE}{VEHICLE}
-STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}{TOWN} Cotxera de Vehicles Rodats
+STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}{TOWN} Cotxera de Vehicles
 STR_9004_NEW_VEHICLES                                           :{BLACK}Nous Vehicles
-STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}Nous Vehicles Rodats
+STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}Nous Vehicles
 STR_9007_BUILD_VEHICLE                                          :{BLACK}Construeix Vehicle
 STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}No es pot construir l'automòbil...
 STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (Detalls)
@@ -2663,7 +2720,7 @@
 STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...s'ha de parar dins d'una cotxera
 STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}No pots vendre l'automòbil...
 STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}No es pot parar/arrencar l'automòbil...
-STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Vehicle Rodat {COMMA} esperant en cotxera
+STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Vehicle {COMMA} esperant en cotxera
 STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Cap a la cotxera de {TOWN}.
 STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Cap a la cotxera de {TOWN}, a {VELOCITY}
 STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Revisió a la cotxera de {TOWN}
@@ -2682,7 +2739,7 @@
 STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Construeix un nou automòbil
 STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Arrossega el vehicle fins aquí per vendre'l
 STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Centra la pantalla principal en la situació de la cotxera
-STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Llista de selecció de Vehicles Rodats - clica en un vehicle per informació
+STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Llista de selecció de Vehicles - clica en un vehicle per informació
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Construeix l'automòbil seleccionat
 STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Cost: {CURRENCY}{}Velocitat: {VELOCITY}{}Cost de circulació: {CURRENCY}/any{}Capacitat: {CARGO}
 
@@ -2691,8 +2748,10 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Anomena automòbil
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Celebració popular . . .{}Primer autobús arriba a {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Celebració popular . . .{}Primer camió arriba a {STATION}!
-STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Accident de Vehicle Rodat!{}El conductor mor en una bola de foc després de la colisió amb un tren
-STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Accident de Vehicle Rodat!{}{COMMA} moren en una bola de foc després d'una colisió amb un tren
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Els ciutadans celebren . . .{}El primer tramvia de passatgers arriba a {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Els ciutadans celebren . . .{}El primer tramvia de mercaderies arriba a {STATION}!
+STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Accident de Vehicle!{}El conductor mor en una bola de foc després de la colisió amb un tren
+STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Accident de Vehicle!{}{COMMA} moren en una bola de foc després d'una colisió amb un tren
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}No es pot fer que el vehicle torni...
 STR_ONLY_TURN_SINGLE_UNIT                                       :{WHITE}No es poden girar vehicles que estan formats per múltiples unitats
 STR_9034_RENAME                                                 :{BLACK}Reanomena
@@ -2975,6 +3034,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Estàs a punt de vendre tots els vehicles de la cotxera. N'estàs segur?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Tipus de cotxera incorrecta
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Vendre tots els trens de la cotxera
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Vendre tots els vehicles de la cotxera
@@ -2984,7 +3044,7 @@
 STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Treure una llista de tots els trens amb aquesta cotxera en les seves ordres
 STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Treure una llista de tots els vehicles amb aquesta cotxera en les seves ordres
 STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Treure una llista de tots els vaixells amb aquesta drassana en les seves ordres
-STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Treu una llista de tots els avions amb algun hangar en aquest aeroport en les seves ordres
+STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Treu una llista de tots les aeronaus amb algun hangar en aquest aeroport en les seves ordres
 
 STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Autosubstitueix tots els trens de la cotxera
 STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Autosubstitueix tots els vehicles de la cotxera
@@ -3012,7 +3072,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Fer que la sustitució automàtica mantingui la llargària del tren eliminant vagons (començant pel front), si substituint la màquina el tren es fa més llarg
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Sustituint: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} CARACTERÃSTICA EXPERIMENTAL {}Alterna entre finestres de sustitució de vagons i de motors{}La sustitució del vagó només tindrà lloc si el nou vagó pot ser remodelat per admetre el mateix tipus de càrrega que el vell. Això es comprova per a cada vagó quan el reemplaçament es produeix.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}El motor no es pot construir
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}El tren no està disponible
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}El vehicle no està disponible
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}El vaixell no està disponible
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}L'avió no està disponible
 
 STR_ENGINES                                                     :Motors
 STR_WAGONS                                                      :Vagons
@@ -3088,6 +3151,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Canviar l'any inicial
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Alerta d'escala
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}No es recomana redimensionar massa el mapa d'origen. Vols continuar amb la generació?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Alerta de format de poble
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}El format de poble "no més carreteres" no està recomanat. Continuar amb la generació?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nom del mapa d'alçades:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Mida: {ORANGE}{NUM} x {NUM}
@@ -3149,3 +3214,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transferir Crèdits: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...aquesta carretera es propietat del poble
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...sentit de la carretera en la direcció incorrecta
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opcions de transparència
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Activa/Desactiva transparència dels rètols d'estació
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Activa/Desactiva transparència dels arbres
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Activa/Desactiva transparència de les cases
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Activa/Desactiva transparència de les indústries
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Activa/Desactiva transparència dels edificis com ara estacions, cotxeres, punts de trobada i catenàries
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Activa/Desactiva transparència dels ponts
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Activa/Desactiva transparència de les estructures com ara fars i antenes
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Grup {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Tots els trens
+STR_GROUP_ALL_ROADS                                             :Tots els vehicles
+STR_GROUP_ALL_SHIPS                                             :Tots els vaixells
+STR_GROUP_ALL_AIRCRAFTS                                         :Totes les aeronaus
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Afegeix vehicles compartits
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Treu tots els vehicles
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Tren{P "" s}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Vehicle{P "" s}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Vaixell{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aeronau
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Canvia de nom el grup
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Substitueix els Vehicles de "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}No puc crear el  grup...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}No puc eliminar aquest grup...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}No puc canviar el nom del grup...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}No puc eliminar tots els vehicles d'aquest grup...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}No puc afegir el vehicle a aquest grup...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}No puc afegir vehicles compartits al grup...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Grups - Clica en un grup per llistar tots els vehicles d'aquest grup
+STR_GROUP_CREATE_TIP                                            :{BLACK}Clica per crear un grup
+STR_GROUP_DELETE_TIP                                            :{BLACK}Elimina el grup seleccionat
+STR_GROUP_RENAME_TIP                                            :{BLACK}Canvia el nom del grup seleccionat
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Clica per protegir aquest grup de l'autosubstitueix global
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Benefici aquest any: {GREEN}{CURRENCY} {BLACK}(any passat: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Benefici aquest any: {RED}{CURRENCY} {BLACK}(any passat: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Benefici aquest any: {GREEN}{CURRENCY} {BLACK}(any passat: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Benefici aquest any: {RED}{CURRENCY} {BLACK}(any passat: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/czech.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/czech.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -5,6 +5,8 @@
 ##case nom gen dat acc voc loc ins big
 ##gender f m n
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Mimo okraj mapy
@@ -809,6 +811,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Malé
 STR_02A2_MEDIUM                                                 :{BLACK}Středni
 STR_02A3_LARGE                                                  :{BLACK}Velké
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Město
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Zvol velikost města:
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Velikost města:
 
@@ -860,6 +863,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mapa světa
 STR_EXTRA_VIEW_PORT                                             :Další pohled
 STR_SIGN_LIST                                                   :Seznam popisků
+STR_TRANSPARENCY_OPTIONS                                        :Nastavení průhlednosti
 STR_02DF_TOWN_DIRECTORY                                         :Seznam měst
 STR_TOWN_POPULATION                                             :{BLACK}Populace světa: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Pohled {COMMA}
@@ -1102,6 +1106,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nový globální algoritmus hledání cesty (NPF, nahradí NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Pro simulaci těžkých vlaků vynásobit hmotnost nákladu: {ORANGE}{STRING}x
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Povolit průjezdné zastávky na silnicích vlastněných obcemi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Povolit stavění přilehlých stanic: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Malá letiště se budou moci stále stavět: {ORANGE}{STRING}
 
@@ -1153,6 +1158,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :pohyb po mapÄ›
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :nic
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Rychlost skrolovacího koleÄka: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Zastavit automaticky hru pÅ™i zaÄínání nové hry: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Používat pokroÄilý seznam vozidel: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maximum vlaků na hráÄe: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maximum silniÄních vozidel na hráÄe: {ORANGE}{STRING}
@@ -1186,12 +1193,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Povolit kupování podílu z ostatních spoleÄností
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Při tažení umisťovat signály každých(é): {ORANGE}{STRING} dilků(y)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Semafory automaticky stavět do roku: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Vzor "žádné silnice" se neuplatňuje v editoru scénářů
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Vyber vzor městských silnic: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :žádné silnice
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :původní
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :lepší silnice
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :mřížka 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :mřížka 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Umístění hlavní lišty: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :vlevo
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :uprostřed
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :vpravo
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Okno se přichytí k druhému, když je blíž než: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Okno se přichytí k druhému, když je blíž než: {ORANGE}vypnuto
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Rychlost růstu měst: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :nulová
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :pomalá
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :normální
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :rychlá
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :velmi rychlá
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Podíl měst, které budou růst dvakrát tak rychle: {ORANGE}1 z {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Podíl měst, které budou růst dvakrát tak rychle: {ORANGE}žádné
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Násobitel původní velikosti města: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Ovládaní
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Výstavba
@@ -1622,6 +1647,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :ŽelezniÄní traÅ¥ s presignály
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :ŽelezniÄní traÅ¥ s výstupními signály
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :ŽelezniÄní traÅ¥ s kombinovanými signály
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Je nejprve nutno odstranit stanici
 
 
 
@@ -2049,6 +2075,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} heliport
 STR_SV_STNAME_FOREST                                            :{STRING} les
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2084,6 +2112,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :žádný
+STR_NUM_VERY_LOW                                                :velmi nízké
 STR_6816_LOW                                                    :nízké
 STR_6817_NORMAL                                                 :střední
 STR_6818_HIGH                                                   :vysoké
@@ -3076,7 +3105,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Funkce automatického vylepÅ¡ování vlaků může udržovat stejnou délku vlaku odstraňovaním vagonů (od zaÄátku vlaku), pokud by zmÄ›na maÅ¡iny vlak prodloužila.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Vyměňování: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTÃLNà VLASTNOST {}PÅ™epne mezi okny na výmÄ›nu lokomotiv a vagonů.{}Vagon se vymÄ›ní, jen když je nový vagon schopen vozit stejnou komoditu, jako ten starý. Toto se ověřuje pro každý vagon.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Stroj nelze postavit
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vozidlo není dostupné
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vůz není dostupné
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}LoÄ není dostupná
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Letadlo není dostupné
 
 STR_ENGINES                                                     :lokomotivy
 STR_WAGONS                                                      :vagony
@@ -3152,6 +3184,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}ZmÄ›nit poÄáteÄní rok
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Varování kvůli velikosti
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Tak velká zmena velikosti zdrojové mapy není doporuÄena. PokraÄovat s generováním?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Varování kvůli vzoru silnic
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Vzor "žádné silnice" není doporuÄen (nepostaví se ani domy). PokraÄovat ve vytváření mapy?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Jméno výškové mapy:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Velikost: {ORANGE}{NUM} x {NUM}
@@ -3213,3 +3247,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Podíl za převoz: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}... tato silnice je ve vlastnictví obce
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}... silnice je otoÄena jiným smÄ›rem
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Nastavení průhlednosti
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Změna průhlednosti jmen stanic
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Změna průhlednosti stromů
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Změna průhlednosti domů
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Změna průhlednosti továren
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Změna průhlednosti postavitelných objektů, jako stanic, kontrolních bodů a vedení
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Změna průhlednosti mostů
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}ZmÄ›na průhlednosti staveb jako majáků, vysílaÄů a doplňků (v budoucnosti)
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Skupina {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :VÅ¡echny vlaky
+STR_GROUP_ALL_ROADS                                             :VÅ¡echna silniÄní vozidla
+STR_GROUP_ALL_SHIPS                                             :VÅ¡echny lodÄ›
+STR_GROUP_ALL_AIRCRAFTS                                         :VÅ¡echna letadla
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Přidat sdílená vozidla
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Odstranit všechna vozidla
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} vlak{P "" y ů}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} silniÄní{P "" "" ch} vozid{P lo la el}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} lo{P Ä dÄ› dí}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} letad{P lo la el}
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Přejmenovat skupinu
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Vyměnit vozidla "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Nelze vytvořit skupinu...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Nelze vymazat skupinu...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Nelze přejmenovat skupinu...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Nelze odstranit všechna vozidla ze skupiny...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Nelze přidat vozidlo do skupiny...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Nelze přidat sdílená vozidla do skupiny...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Skupiny - Kliknutím na skupinu se zobrazí seznam vozidel ve skupině
+STR_GROUP_CREATE_TIP                                            :{BLACK}Kliknutím vytvoříš skupinu
+STR_GROUP_DELETE_TIP                                            :{BLACK}Vymazat vybranou skupinu
+STR_GROUP_RENAME_TIP                                            :{BLACK}Přejmenovat vybranou skupinu
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Kliknutím nebude na tuto skupinu mít vliv automatická výměna vozidel
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Letošní příjem: {GREEN}{CURRENCY} {BLACK}(minulý rok: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Letošní příjem: {RED}{CURRENCY} {BLACK}(minulý rok: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Letošní příjem: {GREEN}{CURRENCY} {BLACK}(minulý rok: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Letošní příjem: {RED}{CURRENCY} {BLACK}(minulý rok: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/danish.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/danish.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode da_DA
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Ude over kanten af kortet
@@ -385,7 +387,7 @@
 STR_SORT_BY_VALUE                                               :Værdi
 STR_SORT_BY_FACILITY                                            :Stationstype
 STR_SORT_BY_WAITING                                             :Værdi af ventende fragt
-STR_SORT_BY_RATING_MAX                                          :Fragtrangering
+STR_SORT_BY_RATING_MAX                                          :Fragtbedømmelse
 STR_ENGINE_SORT_ENGINE_ID                                       :Lokomotiv ID (klassisk)
 STR_ENGINE_SORT_COST                                            :Omkostning
 STR_ENGINE_SORT_POWER                                           :Drivmiddel
@@ -408,7 +410,7 @@
 STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :Send til værksted
 STR_SEND_SHIP_TO_DEPOT                                          :Send til skibsdok
 STR_SEND_AIRCRAFT_TO_HANGAR                                     :Send til hangar
-STR_SEND_FOR_SERVICING                                          :Send til service
+STR_SEND_FOR_SERVICING                                          :Send til eftersyn
 
 ############ range for months starts
 STR_0162_JAN                                                    :jan
@@ -458,11 +460,11 @@
 STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Vinduestitel - træk her for at flytte vinduet
 STR_STICKY_BUTTON                                               :{BLACK}Marker dette vindue som ulukkeligt af 'Luk ALLE vinduer' tasten
 STR_RESIZE_BUTTON                                               :{BLACK}Klik og træk for at ændre vinduets størrelse
-STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Klik her for at gå til det nuværende default gemme/hente bibliotek
+STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Klik her for at gå til det nuværende standard gemme/hente bibliotek
 STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Nedriv bygninger osv. på et stykke land
 STR_018E_LOWER_A_CORNER_OF_LAND                                 :{BLACK}Sænk et hjørne af landet
 STR_018F_RAISE_A_CORNER_OF_LAND                                 :{BLACK}Hæv et hjørne af landet
-STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Scroll bar - scroller listen op/ned
+STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Scrollbar - scroller listen op/ned
 STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}Scroll bar - flytter listen mod venstre/højre
 STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}Vis landskabskonturer på kortet
 STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}Vis køretøjer på kortet
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Lille
 STR_02A2_MEDIUM                                                 :{BLACK}Mellem
 STR_02A3_LARGE                                                  :{BLACK}Stor
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}By
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Vælg bystørrelse
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Bystørrelse:
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Kort over verden
 STR_EXTRA_VIEW_PORT                                             :Flere lokalitetsvinduer
 STR_SIGN_LIST                                                   :Liste over skilte
+STR_TRANSPARENCY_OPTIONS                                        :Gennemsigtighedsvalg
 STR_02DF_TOWN_DIRECTORY                                         :Byoversigt
 STR_TOWN_POPULATION                                             :{BLACK}Verdens befolkning: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Lokalitetsvinduer {COMMA}
@@ -987,15 +991,15 @@
 # DON'T ADD OR REMOVE LINES HERE
 STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Tog {COMMA} har for få ordrer i sin odreliste
 STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}Tog {COMMA} har en ugyldig ordre
-STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Tog {COMMA} har dobbelt ordrer
+STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Tog {COMMA} har dobbelte ordrer
 STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Tog {COMMA} har en ugyldig station i sin ordreliste
-STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Køretøj {COMMA} har for få ordrer i sin ruteplan
+STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Køretøj {COMMA} har for få ordrer i sin ordreliste
 STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}Køretøj {COMMA} har en ugyldig ordre
-STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}Køretøj {COMMA} har dobbelt ordrer
+STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}Køretøj {COMMA} har dobbelte ordrer
 STR_ROADVEHICLE_HAS_INVALID_ENTRY                               :{WHITE}Køretøj {COMMA} har en ugyldig station i sin ordreliste
 STR_SHIP_HAS_TOO_FEW_ORDERS                                     :{WHITE}Skib {COMMA} har for få ordrer i sin ordreliste
 STR_SHIP_HAS_VOID_ORDER                                         :{WHITE}Skib {COMMA} har en ugyldig ordre
-STR_SHIP_HAS_DUPLICATE_ENTRY                                    :{WHITE}Skib {COMMA} har dobbelt ordrer
+STR_SHIP_HAS_DUPLICATE_ENTRY                                    :{WHITE}Skib {COMMA} har dobbelte ordrer
 STR_SHIP_HAS_INVALID_ENTRY                                      :{WHITE}Skib {COMMA} har en ugyldig havn i sin ordreliste
 STR_AIRCRAFT_HAS_TOO_FEW_ORDERS                                 :{WHITE}Fly {COMMA} har for få ordrer i sin ordreliste
 STR_AIRCRAFT_HAS_VOID_ORDER                                     :{WHITE}Fly {COMMA} har en ugyldig ordre
@@ -1044,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny global ruteplanlægger (NPF, tilsidesætter NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Vægtfaktor for fragt for at simulere tunge tog: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillad gennemkørsels-stop på veje ejet af en by: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillad bygning af tilstødende stationer: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Tillad altid små lufthavne: {ORANGE}{STRING}
 
@@ -1095,6 +1100,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Rul kort
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Slået fra
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Rulleknap-hastighed på kort: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Sæt automatisk på pause når nyt spil startes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Brug avanceret køretøjsliste: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maks. antal tog per spiller: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maks. antal køretøjer per spiller: {ORANGE}{STRING}
@@ -1128,12 +1135,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Tillad at købe aktier i andre selskaber
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ved trækning placer signal hvert: {ORANGE}{STRING} felt
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Byg automatisk semaforer før: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Vejlayoutet "ikke flere veje" er ikke gyldigt i scenarieeditoren
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Vælg layout for veje i byer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :ikke flere veje
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :standard
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :bedre veje
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 gitter
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 gitter
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Placering af værktøjslinje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Venstre
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Center
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Højre
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Vinduernes sammenkoblings afstand: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Vinduernes sammenkoblings afstand: {ORANGE}slået fra
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Byvækst tempo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ingen
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Langsom
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Hurtig
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Meget hurtig
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Andel af byer der vil vokse dobbelt så hurtigt: {ORANGE}1 af {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Andel af byer der vil vokse dobbelt så hurtigt: {ORANGE}Ingen
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Startværdi for bystørrelsesfaktor: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Brugerflade
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruktion
@@ -1233,7 +1258,7 @@
 STR_DRAG_DROP                                                   :{BLACK}Træk & slip
 STR_STATION_DRAG_DROP                                           :{BLACK}Byg en station vha. træk & slip
 STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}Vælg hvilken stationstype, der skal vises
-STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Vælg hvilen stationstype du vil bygge
+STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Vælg hvilken stationstype du vil bygge
 
 STR_FAST_FORWARD                                                :{BLACK}Kør spillet hurtigere
 STR_MESSAGE_HISTORY                                             :{WHITE}Tidligere beskeder
@@ -1268,10 +1293,10 @@
 
 STR_INDUSTRY_TOO_CLOSE                                          :{WHITE}...for tæt på en anden industribygning
 
-STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Ombyg toget til at køre med en anden slags last
+STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Ombyg toget til at køre med en anden lasttype
 STR_RAIL_REFIT_VEHICLE                                          :{BLACK}Ombyg toget
-STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Vælg den slags last toget skal køre med
-STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Ombyg toget til at køre med den markerede slags last
+STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Vælg den lasttype toget skal køre med
+STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Ombyg toget til at køre med den markerede lasttype
 STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Kan ikke ombygge toget...
 STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Service intervaller er i procent: {ORANGE}{STRING}
 STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Skift produktion
@@ -1543,7 +1568,7 @@
 STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Kan ikke bygge jernbane her...
 STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Kan ikke fjerne jernbane herfra...
 STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Kan ikke fjerne signaler herfra...
-STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Retning for remise
+STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Retning af remise
 STR_1015_RAILROAD_CONSTRUCTION                                  :Jernbanekonstruktion
 STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Elektrisk jernbanekonstruktion
 STR_1016_MONORAIL_CONSTRUCTION                                  :Monorailkonstruktion
@@ -1561,32 +1586,56 @@
 STR_1023_RAILROAD_TRAIN_DEPOT                                   :Remise
 STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...området ejes af et andet selskab
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Jernbane med almindelige signaler
-STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Jernbane med indkørselssignaler
-STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Jernbane med udkørselssignaler
-STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Jernbane med kombinerede ind- og udkørselssignaler
+STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Jernbane med præ-signaler
+STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Jernbane med exit-signaler
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Jernbane med kombi-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Jernbanespor med normale og præ-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Jernbanespor med normale og exit-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Jernbanespor med normale og kombi-signaler
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Jernbanespor med præ- og exit-signaler
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Jernbanespor med præ- og kombi-signaler
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Jernbanespor med exit- og kombi-signaler
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Jernbanestation skal fjernes først
 
 
 
 ##id 0x1800
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Det er nødvendigt at fjerne vejen først
-STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Vejarbejde er i gang
+STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Vejarbejde i gang
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Vejkonstruktion
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Sporvejskonstruktion
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Vælg vejbro
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... ensrettede veje kan ikke have kryds
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Kan ikke bygge vej her...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Kan ikke bygge sporvej her...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Kan ikke fjerne vej herfra...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Kan ikke fjerne sporvej her...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Retning af værksted
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Retning af sporvognsremise
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Kan ikke bygge værksted her...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Kan ikke bygge sporvognsremise her...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Kan ikke bygge rutebilstation...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Kan ikke bygge fragtcentral...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Kan ikke bygge passager-sporvognsstation...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Kan ikke bygge fragt-sporvognsstation...
 STR_180A_ROAD_CONSTRUCTION                                      :Vejkonstruktion
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Sporvejskonstruktion
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Byg en sektion vej
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Byg sporvejssektion
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Byg værksted (til bygning og servicering af vejkøretøjer)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Byg sporvognsremise (til konstruktion og service af vogne)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Byg rutebilstation
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Byg fragtcentral
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Byg passager-sporvognsstation
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Byg fragt-sporvognsstation
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Byg bro
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Byg sporvejsbro
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Byg tunnel
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Byg sporvejstunnel
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Skift mellem bygning/fjernelse af veje
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Skift mellem bygning/fjernelse af sporveje
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Vælg retning for værksted
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Vælg retning af sporvognsremise
 STR_1814_ROAD                                                   :Vej
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Vej med gadelygter
 STR_1816_TREE_LINED_ROAD                                        :Vej med vejtræer
@@ -1594,6 +1643,8 @@
 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...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Kan ikke fjerne passager-sporvognsstation
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Kan ikke fjerne fragt-sporvognsstation
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Byer
@@ -1682,7 +1733,7 @@
 STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Byg en statue til ære for dit selskab.{} Pris: {CURRENCY}
 STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Betal for opførelse af forretningsbygninger i byen.{}  Pris: {CURRENCY}
 STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Køb et års eksklusive rettigheder til transport i byen. De lokale myndigheder vil kun tillade passagerer og last at bruge dine stationer.{} Prist: {CURRENCY}
-STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} Bestik de lokale myndigheder til at hæve din bedømmelse, med sandsynlighed for en stor straf hvis det bliver opdaget.{}  Pris: {CURRENCY}
+STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} Bestik de lokale myndigheder til at hæve din bedømmelse, med risiko for en stor straf hvis det bliver opdaget.{}  Pris: {CURRENCY}
 STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}Trafikkaos i byen {TOWN}!{}{}Vejfornyelse betalt af {COMPANY} forårsager 6 måneders kaos i trafikken!
 STR_2056                                                        :{TINYFONT}{WHITE}{TOWN}
 STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
@@ -1758,8 +1809,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} accepterer nu {STRING} og {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Retning af rutebilstation
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Retning af fragtcentral
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Retning af sporvognsstation
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Retning af sporvognsstation
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Det er nødvendigt at nedrive rutebilstationen først
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Det er nødvendigt at rive fragtcentralen ned først
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Passager-sporvognsstation skal fjernes først
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Fragt-sporvognsstation skal fjernes først
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Stationer
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Ingen -
@@ -1771,6 +1826,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Vælg længde af banegård
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Vælg retning af rutebilstation
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Vælg retning af fragtcentral
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Vælg retning af sporvognsstation
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Vælg retning af sporvognsstation
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centrer skærmen over stationens lokalitet
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Vis stationens bedømmelse
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Ændre stationens navn
@@ -1800,10 +1857,10 @@
 STR_STAT_CLASS_WAYP                                             :Kontrolsteder
 
 ##id 0x3800
-STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Skibsdok orientering
+STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Retning af skibsdok
 STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...skal bygges på vand
 STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Kan ikke bygge en skibsdok her...
-STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Vælg orientering af skibsdok
+STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Vælg retning af skibsdok
 STR_3804_WATER                                                  :Vand
 STR_3805_COAST_OR_RIVERBANK                                     :Kyst eller flodbred
 STR_3806_SHIP_DEPOT                                             :Skibsdok
@@ -1991,6 +2048,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Helikopterplads
 STR_SV_STNAME_FOREST                                            :{STRING} Skov
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2085,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ingen
+STR_NUM_VERY_LOW                                                :Meget lav
 STR_6816_LOW                                                    :Lav
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Høj
@@ -2126,7 +2186,7 @@
 STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Direktør)
 STR_7038_INAUGURATED                                            :{GOLD}Indviet: {WHITE}{NUM}
 STR_7039_VEHICLES                                               :{GOLD}Køretøjer:
-STR_TRAINS                                                      :{WHITE}{COMMA} tog
+STR_TRAINS                                                      :{WHITE}{COMMA} tog{P "" e}
 STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} køretøj{P "" er}
 STR_AIRCRAFT                                                    :{WHITE}{COMMA} fly
 STR_SHIPS                                                       :{WHITE}{COMMA} skib{P "" e}
@@ -2218,6 +2278,8 @@
 STR_LIVERY_HELICOPTER                                           :Helikopter
 STR_LIVERY_SMALL_PLANE                                          :Lille fly
 STR_LIVERY_LARGE_PLANE                                          :Stort fly
+STR_LIVERY_PASSENGER_TRAM                                       :Passager-sporvogn
+STR_LIVERY_FREIGHT_TRAM                                         :Fragt-sporvogn
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Vis generelle farveskemaer
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Vis farveskemaer for tog
@@ -2691,6 +2753,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Giv køretøjet et navn
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Indbyggerne fester . . .{}Første bus ankommer til {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Indbyggerne fester . . .{}Første lastbil ankommer til {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Indbyggerne fester . . .{}Første passager-sporvogn ankommer til {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Indbyggerne fester . . .{}Første fragt-sporvogn ankommer til {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Lastbil forulykket!{}Chauffør dør i flammerne efter sammenstød med tog
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Bus forulykket!{}{COMMA} dør i flammerne efter kollision med et tog
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Kan ikke få køretøjet til at vende...
@@ -2704,7 +2768,7 @@
 
 STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Ombyg vejkøretøj til at laste en anden type last
 STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Ombyg lastbil
-STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Ombyg vejkøretøjet til at laste den markede type last
+STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Ombyg vejkøretøjet til at laste den markerede type last
 STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Kan ikke ombygge vejkøretøj
 STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Vælg lasttype som lastbilen skal transportere
 
@@ -2965,7 +3029,7 @@
 STR_SCHEDULED_AIRCRAFT                                          :{WHITE}{STATION} - {COMMA} Fly
 STR_SCHEDULED_SHIPS                                             :{WHITE}{STATION} - {COMMA} Skib{P "" e}
 
-STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Vis alle tog, som har denne station i deres ruteplan
+STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Vis alle toge, som har denne station i deres ruteplan
 STR_SCHEDULED_ROAD_VEHICLES_TIP                                 :{BLACK}Vis alle køretøjer, som har denne station i deres ruteplan
 STR_SCHEDULED_AIRCRAFT_TIP                                      :{BLACK}Vis alle fly, som har denne lufthavn i deres ruteplan
 STR_SCHEDULED_SHIPS_TIP                                         :{BLACK}Vis alle skibe, som har denne station i deres ruteplan
@@ -2975,6 +3039,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Du er ved at sælge alle køretøjer i depotet. Er du sikker?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Forkert depottype
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Sælg alle toge i remisen
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Sælg alle køretøjer i værkstedet
@@ -3002,7 +3067,7 @@
 STR_NOT_REPLACING                                               :{BLACK}Udskifter ikke
 STR_NOT_REPLACING_VEHICLE_SELECTED                              :{BLACK}Intet køretøj valgt
 STR_REPLACE_HELP_LEFT_ARRAY                                     :{BLACK}Vælg en køretøjstype, som du ønsker udskiftet
-STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Vælg en køretøjstype, som du ønker at få i stedet for den type, du  har valgt i venste side
+STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Vælg en køretøjstype, som du ønker benyttet i stedet for den type, du  har valgt i venste side
 STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Tryk for at stoppe udskiftningen at den køretøjstype, som du har valgt til venstre
 STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Tryk for at begynde at udskifte køretøjstypen til venstre med køretøjstypen til højre
 STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Vælg den skinnetype, hvor du vil udskifte lokomotiver
@@ -3011,8 +3076,11 @@
 STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Fjern vogn: {ORANGE}{SKIP}{STRING}
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Få autoudskift til at bevare længden af tog ved at fjerne vogne (startende fra fronten), hvis autoudskiftningen gør toget længere.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Udskifter: {ORANGE}{SKIP}{SKIP}{STRING}
-STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EKSPERIMENTEL EGENSKAB {}Skift imellem lokomotiv- og vogn-udskiftningsvindue.{}Vognudskiftning vil kun finde sted hvis den nye vogn kan ændres til at transportere samme godstype some den gamle vogn. Dette bliver checket for hver vogn, når udskiftningen finder sted.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Køretøjet kan ikke bygges
+STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EKSPERIMENTEL EGENSKAB {}Skift imellem lokomotiv- og vogn-udskiftningsvindue.{}Vognudskiftning vil kun finde sted hvis den nye vogn kan ændres til at transportere samme godstype som den gamle vogn. Dette bliver checket for hver vogn, når udskiftningen finder sted.
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Tog er ikke tilgængeligt
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vejkøretøj er ikke tilgængeligt
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Skib er ikke tilgængeligt
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Fly er ikke tilgængelig
 
 STR_ENGINES                                                     :Lokomotiver
 STR_WAGONS                                                      :Vogne
@@ -3088,6 +3156,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Ændre startår
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skalerings advarsel
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}At ændre størrelsen på kildebilledet anbefales ikke. Fortsæt genereringen?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Vejlayout-advarsel
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Vejlayoutet "ikke flere veje" anbefales ikke. Fortsæt med at generere?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Højdekortets navn:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Størrelse: {ORANGE}{NUM} x {NUM}
@@ -3149,3 +3219,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Værdi af overført gods: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...denne vej er ejet af en by
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...vejen peger i den forkerte retning
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Gennemsigtighedsvalg
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Skift gennemsigtighed for stationsskilte
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Skift gennemsigtighed for træer
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Skift gennemsigtighed for huse
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Skift gennemsigtighed for industrier
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Skift gennemsigtighed for konstruktioner som stationer, værksteder, kontrolsteder og køreledninger
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Skift gennemsigtighed for broer
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Skift gennemsigtighed for strukturer som fyrtårne og antenner, og måske i fremtiden for øjeguf
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Gruppe {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Alle toge
+STR_GROUP_ALL_ROADS                                             :Alle vejkøretøjer
+STR_GROUP_ALL_SHIPS                                             :Alle skibe
+STR_GROUP_ALL_AIRCRAFTS                                         :Alle fly
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Tilføj delte køretøjer
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Fjern alle køretøjer
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Tog{P "" e}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Vejkøretøj{P "" er}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Skib{P "" e}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Fly
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Omdøb en gruppe
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Udskift køretøjer i "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Kan ikke oprette gruppe...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Kan ikke slette denne gruppe...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Kan ikke omdøbe gruppe...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kan ikke fjerne alle køretøjer fra denne gruppe...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kan ikke tilføje køretøjet til denne gruppe...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Kan ikke tilføje delte køretøjer til gruppe...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Grupper - klik på en gruppe for at vise alle køretøjer i gruppen
+STR_GROUP_CREATE_TIP                                            :{BLACK}Klik for at oprette en gruppe
+STR_GROUP_DELETE_TIP                                            :{BLACK}Slet den valgte gruppe
+STR_GROUP_RENAME_TIP                                            :{BLACK}Omdøb den valgte gruppe
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Klik for at beskytte denne gruppe mod global auto-udskiftning
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Afkast i indeværende år: {GREEN}{CURRENCY} {BLACK}(sidste år: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Afkast i indeværende år: {RED}{CURRENCY} {BLACK}(sidste år: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Afkast i indeværende år: {GREEN}{CURRENCY} {BLACK}(sidste år: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Afkast i indeværende år: {RED}{CURRENCY} {BLACK}(sidste år: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/dutch.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/dutch.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode nl_NL
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Buiten de kaart
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Klein
 STR_02A2_MEDIUM                                                 :{BLACK}Middel
 STR_02A3_LARGE                                                  :{BLACK}Groot
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Stad
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Kies stadsgrootte
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Stadsgrootte:
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Kaart
 STR_EXTRA_VIEW_PORT                                             :Extra kijkvenster
 STR_SIGN_LIST                                                   :Bordenlijst
+STR_TRANSPARENCY_OPTIONS                                        :Doorzichtigheidsopties
 STR_02DF_TOWN_DIRECTORY                                         :Stedenlijst
 STR_TOWN_POPULATION                                             :{BLACK}Wereldbevolking: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Kijkvenster {COMMA}
@@ -1044,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nieuwe globale routeplanner (NPF, voorkeur over NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Gewichtsverhouding voor vracht om zware treinen te simuleren: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Laat toe dat doorrij wegstops worden geplaatst op door stad beheerde wegen: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Bouwen van aangrenzende stations toestaan: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Altijd kleine vliegvelden toestaan: {ORANGE}{STRING}
 
@@ -1084,6 +1089,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Helikopters automatisch repareren op helipads: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Verbind de landschaptoolbar met de trein/weg/water/vliegveld toolbars: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Omgekeerde scrollrichting: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Vloeiend scrollen kijkvenster: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Toon dimensie informatie bij het gebruik van diverse bouw-tools: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Laat all bedrijfslogo's zien: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Niets
@@ -1095,6 +1101,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scroll kaart
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Uit
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Kaart muiswiel snelheid: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatisch pauzeren wanneer je een nieuw spel start: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Gebruik de geavanceerde voertuigenlijst: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maximaal aantal treinen per speler: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maximaal aantal wegvoertuigen per speler: {ORANGE}{STRING}
@@ -1128,12 +1136,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Sta het kopen van aandelen toe
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Bij slepen, plaats seinen elke: {ORANGE}{STRING} tegel(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Plaats automatisch semaphore seinen voor: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}De stadindeling "geen wegen" is niet geldig in de scenario editor
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Selecteer stedelijke wegindeling: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :geen wegen
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :standaard
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :betere wegen
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 raster
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 raster
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Positie van algemene toolbar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Links
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Midden
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Rechts
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Vaste plaats venster radius: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Vaste plaats venster radius: {ORANGE}uit
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Groeisnelheid steden: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Niet
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Langzaam
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normaal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Snel
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Heel snel
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Verhouding van steden die twee keer zo snel groeien: {ORANGE}1 in {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Verhouding van steden die twee keer zo snel groeien: {ORANGE}Niet
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Stad groei indicator: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Constructie
@@ -1564,6 +1590,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Spoor met voorseinen
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Spoor met uitgangseinen
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Spoor met combinatieseinen
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Treinstation moet eerst verwijderd worden
 
 
 
@@ -1571,22 +1598,38 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Moet weg eerst weghalen
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Er wordt aan de weg gewerkt
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Wegenbouw
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Bouw tramrails
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Kies brug
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Kan hier geen weg bouwen...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Kan geen tramrails bouwen hier...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Kan hier geen weg weghalen...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Kan de tramrails hier niet verwijderen...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Bouw wegvoertuigdepot
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Tram depot richting
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Kan hier geen vrachtwagendepot bouwen...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Kan geen tram voertuig depot bouwen hier...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Kan hier geen bushalte bouwen...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Kan hier geen laadstation bouwen...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Kan geen passagiers tram station bouwen...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Kan geen vracht tram station bouwen...
 STR_180A_ROAD_CONSTRUCTION                                      :Wegenbouw
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Tramrails constructie
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bouw weg
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bouw tramrails onderdeel
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bouw wegvoertuigdepot (om voertuigen te bouwen en te repareren)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Bouw tram voertuig depot (voor de bouw en onderhoud)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Bouw bushalte
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Bouw vrachtwagen laadhal
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Bouw passagiers tram station
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Bouw vracht tram station
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Bouw brug voor wegvoertuigen
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Bouw tramrails brug
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Bouw wegtunnel
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Bouw tramrails tunnel
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Schakel tussen bouwen en verwijderen voor wegbouw
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Schakelaar tussen bouwen/verwijderen van tramrails
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Selecteer richting van wegvoertuigdepot
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Selecteer tram voertuig depot richting
 STR_1814_ROAD                                                   :Weg
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Weg met straatlantaarns
 STR_1816_TREE_LINED_ROAD                                        :Weg met bomenrij
@@ -1594,6 +1637,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Gelijke weg/spoorweg kruising
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Kan busstation niet verwijderen...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Kan vrachtwagenstation niet verwijderen...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Kan passagiers tram station niet verwijderen...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Kan vracht tram station niet verwijderen...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Steden
@@ -1758,8 +1803,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} accepteert voortaan {STRING} en {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Bouw bushalte
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Bouw Vrachtwagenstation
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Passagiers tram richting
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Vracht tram richting
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Verwijder eerst bushalte
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Verwijder eerst vrachtwagenstation
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Verwijder eerst passagiers tram station
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Verwijder eerst vracht tram station
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Stations
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Geen -
@@ -1771,6 +1820,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Selecteer lengte van station
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Selecteer richting van bushalte
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Selecteer richting van vrachtwagenstation
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Selecteer passagiers tram station richting
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Selecteer vracht tram station richting
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centreer hoofdbeeld op lokatie van station
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Bekijk stationsreputaties
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Hernoem station
@@ -1991,6 +2042,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Helihaven
 STR_SV_STNAME_FOREST                                            :{STRING} Bossen
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2079,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Geen
+STR_NUM_VERY_LOW                                                :Erg laag
 STR_6816_LOW                                                    :Laag
 STR_6817_NORMAL                                                 :Normaal
 STR_6818_HIGH                                                   :Hoog
@@ -2218,6 +2272,8 @@
 STR_LIVERY_HELICOPTER                                           :Helikopter
 STR_LIVERY_SMALL_PLANE                                          :Klein Vliegtuig
 STR_LIVERY_LARGE_PLANE                                          :Groot Vliegtuig
+STR_LIVERY_PASSENGER_TRAM                                       :Passagiers tram
+STR_LIVERY_FREIGHT_TRAM                                         :Vracht tram
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Laat de algemene kleurschema's zien
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Laat trein kleurschema's zien
@@ -2691,6 +2747,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Benoem wegvoertuig
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Inwoners feesten...{}Eerste bus arriveert in {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Inwoners feesten...{}Eerste vrachtwagen arriveert in {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Infwoners feesten . . .{}Eerste passagiers tram arriveert in {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Inwoners feesten . . .{}Eerste vracht tram arriveert in {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Wegvoertuig gebotst!{}Bestuurder verongelukt door treinbotsing
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Wegvoertuig gebotst!{}{COMMA} verongelukt door treinbotsing
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Kan voertuig niet omdraaien...
@@ -2941,8 +2999,8 @@
 STR_NEWGRF_COMPATIBLE_LOADED                                    :{ORANGE}Bijbehorend bestand niet gevonden (compatibel GRF geladen)
 
 STR_NEWGRF_COMPATIBLE_LOAD_WARNING                              :{WHITE}Compatibele GRF(s) geladen voor ontbrekende bestanden
-STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}Ontbrekende GRF bestand(en) zijn uitgeschakeld
-STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}GRF bestand(en) om dit spel te kunnen laden ontbreken
+STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}Missend(e) GRF bestand(en) zijn uitgeschakeld
+STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}Er zijn missende GRF bestanden om het spel te laden
 
 STR_CURRENCY_WINDOW                                             :{WHITE}Aangepaste valuta
 STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}Wisselkoers: {ORANGE}{CURRENCY} = £ {COMMA}
@@ -2975,6 +3033,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Je staat op het punt alle voertuigen in het depot te verkopen. Weet je het zeker?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Verkeerd depot type
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Verkoop alle treinen in het depot
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Verkoop alle weg voertuigen in het depot
@@ -3012,7 +3071,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}De te vervangen trein behoudt zijn lengte door wagons weg te halen (startend aan de voorkant), als het vervangen de trein langer zou maken
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Aan het vervangen: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTEEL {}Wissel tussen motor- en wagonvervangvensters.{}Wagonvervanging wordt alleen uitgevoerd als de nieuwe wagon omgebouwd kan worden om hetzelfde ladingtype te dragen als de oude wagon. Dit wordt gecontroleerd voor elke wagon wanneer de daadwerkelijke vervanging plaats vindt.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Locomotief kan niet gebouwd worden
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Trein is niet beschikbaar
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Voertuig is niet beschikbaar
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Schip is niet beschikbaar
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Vliegtuig is niet beschikbaar
 
 STR_ENGINES                                                     :Motoren
 STR_WAGONS                                                      :Wagons
@@ -3065,7 +3127,7 @@
 
 ########### String for New Landscape Generator
 
-STR_GENERATE                                                    :{WHITE}Creeër
+STR_GENERATE                                                    :{WHITE}Maak aan
 STR_RANDOM                                                      :{BLACK}Willekeurig maken
 STR_RANDOM_HELP                                                 :{BLACK}Wijzig het willekeurige getal voor terrein creatie
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Wereld maken
@@ -3088,6 +3150,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Verander begin jaar
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Schaal waarschuwing
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Het aanpassen van de grootte van een bronkaar is niet aan te bevelen. Toch doorgaan?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Stadsindelingswaarschuwing
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}De stadsindeling "geen wegen" is niet aanbevolen. Doorgaan met aanmaken?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Hoogtekaart naam:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Grootte: {ORANGE}{NUM} x {NUM}
@@ -3101,14 +3165,14 @@
 STR_TREE_GENERATION                                             :{BLACK}Bos plaatsing
 STR_UNMOVABLE_GENERATION                                        :{BLACK}Onverplaatsbare generatie
 STR_CLEARING_TILES                                              :{BLACK}Ruig en
-STR_SETTINGUP_GAME                                              :{BLACK}Spel aan het instellen
+STR_SETTINGUP_GAME                                              :{BLACK}Spel aan het configureren
 STR_PREPARING_TILELOOP                                          :{BLACK}Bezig met vlakken
 STR_PREPARING_GAME                                              :{BLACK}Voorbereiden spel
 STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Deze aktie past de moeilijkheidsgraag aan naam custom
 STR_SE_FLAT_WORLD                                               :{WHITE}Vlak land
 STR_SE_FLAT_WORLD_TIP                                           :{BLACK}Genereer een platte kaart
 STR_SE_RANDOM_LAND                                              :{WHITE}Willekeurig land
-STR_SE_NEW_WORLD                                                :{BLACK}Creeër nieuw scenario
+STR_SE_NEW_WORLD                                                :{BLACK}Maak nieuw scenario aan
 STR_SE_CAPTION                                                  :{WHITE}Scenario type
 STR_FLAT_WORLD_HEIGHT_DOWN                                      :{BLACK}Maak de hoogte van plat land een lager
 STR_FLAT_WORLD_HEIGHT_UP                                        :{BLACK}Maak de hoogte van plat land een hoger
@@ -3149,3 +3213,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Geldoverdracht: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...deze weg is van een stad
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...weg is in de verkeerde richting
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Doorzichtigheidsopties
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Wissel doorzichtigheid voor stationsnamen
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Wissel doorzichtigheid voor bomen
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Wissel doorzichtigheid voor huizen
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Wissel doorzichtigheid voor industriën
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Wissel doorzichtigheid voor gebouwen zoals stations, depots, waypoints en bovenleiding
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Wissel doorzichtigheid voor bruggen
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Wissel doorzichtigheid voor structuren zoals vuurtoren en antennes, in de toekomst misschien voor eyecandy
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Groep {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Alle treinen
+STR_GROUP_ALL_ROADS                                             :Alle voertuigen
+STR_GROUP_ALL_SHIPS                                             :Alle schepen
+STR_GROUP_ALL_AIRCRAFTS                                         :Alle vliegtuigen
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Toevoegen gedeelde voertuigen
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Verwijder alle voertuigen
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Trein{P "" en}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Weg Voertuig{P "" en}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Schip{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Vliegtuig
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Hernoem een groep
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Vervang voertuigen van "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Kan groep niet maken...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Kan deze groep niet verwijderen...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Kan deze groep niet hernoemen...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kan niet alle voertuigen van deze groep verwijderen...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kan niet alle voertuigen aan deze groep toevoegen...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Kan niet alle gedeelde voertuigen aan deze groep toevoegen...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Groepen - Klik op een groep voor een lijst van alle voertuigen in deze groep
+STR_GROUP_CREATE_TIP                                            :{BLACK}Klik om een groep te maken
+STR_GROUP_DELETE_TIP                                            :{BLACK}Verwijder de geselecteerde groep
+STR_GROUP_RENAME_TIP                                            :{BLACK}Hernoem de geselecteerde groep
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Klik om deze groep te beschermen tegen globaal automatisch vervangen
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Winst dit jaar: {GREEN}{CURRENCY} {BLACK}(vorig jaar: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Winst dit jaar: {RED}{CURRENCY} {BLACK}(vorig jaar: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Winst dit jaar: {GREEN}{CURRENCY} {BLACK}(vorig jaar: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Winst dit jaar: {RED}{CURRENCY} {BLACK}(vorig jaar: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/english.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/english.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode en_GB
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Off edge of map
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Small
 STR_02A2_MEDIUM                                                 :{BLACK}Medium
 STR_02A3_LARGE                                                  :{BLACK}Large
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}City
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Select town size
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Town size:
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Map of world
 STR_EXTRA_VIEW_PORT                                             :Extra viewport
 STR_SIGN_LIST                                                   :Sign list
+STR_TRANSPARENCY_OPTIONS                                        :Transparency options
 STR_02DF_TOWN_DIRECTORY                                         :Town directory
 STR_TOWN_POPULATION                                             :{BLACK}World population: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Viewport {COMMA}
@@ -1044,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}New global pathfinding (NPF, overrides NTP): {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Weight multiplier for freight to simulate heavy trains: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Allow drive-through road stops on town owned roads: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Allow building adjacent stations: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Always allow small airports: {ORANGE}{STRING1}
 
@@ -1084,6 +1089,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Service helicopters at helipads automatically: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Link landscape toolbar to rail/road/water/airport toolbars: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Reverse scroll direction: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Smooth viewport scrolling: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Show a measurement tooltip when using various build-tools: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Show company liveries: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :None
@@ -1095,6 +1101,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scroll map
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Off
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Map scrollwheel speed: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatically pause when starting a new game: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Use the advanced vehicle list: {ORANGE}{STRING1}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max trains per player: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max road vehicles per player: {ORANGE}{STRING1}
@@ -1128,12 +1136,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Allow buying shares from other companies
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}When dragging, place signals every: {ORANGE}{STRING1} tile(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatically build semaphores before: {ORANGE}{STRING1}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}The town layout "no more roads" isn't valid in the scenario editor
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Select town-road layout: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :no more roads
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :default
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :better roads
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 grid
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 grid
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position of main toolbar: {ORANGE}{STRING1}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Left
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centre
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Right
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Window snap radius: {ORANGE}{STRING1} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Window snap radius: {ORANGE}disabled
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Town growth speed: {ORANGE}{STRING1}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :None
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Slow
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Fast
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Very fast
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportion of towns that will become cities: {ORANGE}1 in {STRING1}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportion of towns that will become cities: {ORANGE}None
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Initial city size multiplier: {ORANGE}{STRING1}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construction
@@ -1371,6 +1397,31 @@
 STR_NETWORK_LANG_ENGLISH                                        :English
 STR_NETWORK_LANG_GERMAN                                         :German
 STR_NETWORK_LANG_FRENCH                                         :French
+STR_NETWORK_LANG_BRAZILIAN                                      :Brazilian
+STR_NETWORK_LANG_BULGARIAN                                      :Bulgarian
+STR_NETWORK_LANG_CHINESE                                        :Chinese
+STR_NETWORK_LANG_CZECH                                          :Czech
+STR_NETWORK_LANG_DANISH                                         :Danish
+STR_NETWORK_LANG_DUTCH                                          :Dutch
+STR_NETWORK_LANG_ESPERANTO                                      :Esperanto
+STR_NETWORK_LANG_FINNISH                                        :Finnish
+STR_NETWORK_LANG_HUNGARIAN                                      :Hungarian
+STR_NETWORK_LANG_ICELANDIC                                      :Icelandic
+STR_NETWORK_LANG_ITALIAN                                        :Italian
+STR_NETWORK_LANG_JAPANESE                                       :Japanese
+STR_NETWORK_LANG_KOREAN                                         :Korean
+STR_NETWORK_LANG_LITHUANIAN                                     :Lithuanian
+STR_NETWORK_LANG_NORWEGIAN                                      :Norwegian
+STR_NETWORK_LANG_POLISH                                         :Polish
+STR_NETWORK_LANG_PORTUGUESE                                     :Portuguese
+STR_NETWORK_LANG_ROMANIAN                                       :Romanian
+STR_NETWORK_LANG_RUSSIAN                                        :Russian
+STR_NETWORK_LANG_SLOVAK                                         :Slovak
+STR_NETWORK_LANG_SLOVENIAN                                      :Slovenian
+STR_NETWORK_LANG_SPANISH                                        :Spanish
+STR_NETWORK_LANG_SWEDISH                                        :Swedish
+STR_NETWORK_LANG_TURKISH                                        :Turkish
+STR_NETWORK_LANG_UKRAINIAN                                      :Ukrainian
 ############ End of leave-in-this-order
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}Multiplayer game lobby
@@ -1564,6 +1615,13 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Railway track with pre-signals
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Railway track with exit-signals
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Railway track with combo-signals
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Railway track with normal and pre-signals
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Railway track with normal and exit-signals
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Railway track with normal and combo-signals
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Railway track with pre- and exit-signals
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Railway track with pre- and combo-signals
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Railway track with exit- and combo-signals
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Must remove railway station first
 
 
 
@@ -1571,22 +1629,39 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Must remove road first
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Road works in progress
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Road Construction
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Tramway Construction
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Select Road Bridge
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... one way roads can't have junctions
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Can't build road here...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Can't build tramway here...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Can't remove road from here...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Can't remove tramway from here...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Road Depot Orientation
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Tram Depot Orientation
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Can't build road vehicle depot here...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Can't build tram vehicle depot here...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Can't build bus station...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Can't build lorry station...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Can't build passenger tram station...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Can't build freight tram station...
 STR_180A_ROAD_CONSTRUCTION                                      :Road construction
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Tramway construction
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Build road section
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Build tramway section
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Build road vehicle depot (for building and servicing vehicles)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Build tram vehicle depot (for building and servicing vehicles)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Build bus station
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Build lorry loading bay
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Build passenger tram station
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Build freight tram station
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Build road bridge
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Build tramway bridge
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Build road tunnel
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Build tramway tunnel
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Toggle build/remove for road construction
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Toggle build/remove for tramway construction
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Select road vehicle depot orientation
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Select tram vehicle depot orientation
 STR_1814_ROAD                                                   :Road
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Road with streetlights
 STR_1816_TREE_LINED_ROAD                                        :Tree-lined road
@@ -1594,6 +1669,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Road/rail level crossing
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Can't remove bus station...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Can't remove lorry station...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Can't remove passenger tram station...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Can't remove freight tram station...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Towns
@@ -1757,9 +1834,13 @@
 STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} now accepts {STRING}
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} now accepts {STRING} and {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Bus Station Orientation
-STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Lorry Station Orient.
+STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Lorry Station Orientation
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Passenger Tram Orientation
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Freight Tram Orientation
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Must demolish bus station first
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Must demolish lorry station first
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Must demolish passenger tram station first
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Must demolish freight tram station first
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Station{P "" s}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- None -
@@ -1771,6 +1852,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Select length of railway station
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Select bus station orientation
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Select lorry loading bay orientation
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Select passenger tram station orientation
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Select freight tram station orientation
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centre main view on station location
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Show station ratings
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Change name of station
@@ -1991,6 +2074,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING1} Heliport
 STR_SV_STNAME_FOREST                                            :{STRING1} Forest
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2111,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :None
+STR_NUM_VERY_LOW                                                :Very low
 STR_6816_LOW                                                    :Low
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :High
@@ -2218,6 +2304,8 @@
 STR_LIVERY_HELICOPTER                                           :Helicopter
 STR_LIVERY_SMALL_PLANE                                          :Small Aeroplane
 STR_LIVERY_LARGE_PLANE                                          :Large Aeroplane
+STR_LIVERY_PASSENGER_TRAM                                       :Passenger Tram
+STR_LIVERY_FREIGHT_TRAM                                         :Freight Tram
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Show general colour schemes
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Show train colour schemes
@@ -2691,6 +2779,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Name road vehicle
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Citizens celebrate . . .{}First bus arrives at {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Citizens celebrate . . .{}First truck arrives at {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Citizens celebrate . . .{}First passenger tram arrives at {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Citizens celebrate . . .{}First freight tram arrives at {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Road Vehicle Crash!{}Driver dies in fireball after collision with train
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Road Vehicle Crash!{}{COMMA} die in fireball after collision with train
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Can't make vehicle turn around...
@@ -2975,6 +3065,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}You are about to sell all the vehicles in the depot. Are you sure?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Wrong depot type
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Sell all trains in the depot
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Sell all road vehicles in the depot
@@ -3012,7 +3103,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Make autoreplace keep the length of a train the same by removing wagons (starting at the front), if replacing the engine would make the train longer.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Replacing: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTAL FEATURE {}Switch between engine and wagon replacement windows.{}Wagon replacement will only be done if the new wagon can be refitted into carrying the same type of cargo as the old one. This is checked for each wagon when the actual replacement takes place.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Engine is not buildable
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehicle is not available
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehicle is not available
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Ship is not available
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aircraft is not available
 
 STR_ENGINES                                                     :Engines
 STR_WAGONS                                                      :Wagons
@@ -3088,6 +3182,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Change starting year
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Scale warning
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Resizing source map too much is not recommended. Continue with the generation?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Town layout warning
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}The town layout "no more roads" is not recommended. Continue with the generation?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Heightmap name:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Size: {ORANGE}{NUM} x {NUM}
@@ -3149,3 +3245,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transfer Credits: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...this is a town owned road
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...road facing in the wrong direction
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Transparency Options
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Toggle transparency for station signs
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Toggle transparency for trees
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Toggle transparency for houses
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Toggle transparency for industries
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Toggle transparency for buildables like stations, depots, waypoints and catenary
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Toggle transparency for bridges
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Toggle transparency for structures like lighthouses and antennas, maybe in future for eyecandy
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Group {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :All trains
+STR_GROUP_ALL_ROADS                                             :All road vehicles
+STR_GROUP_ALL_SHIPS                                             :All ships
+STR_GROUP_ALL_AIRCRAFTS                                         :All aircraft
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Add shared vehicles
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Remove all vehicles
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Train{P "" s}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Road Vehicle{P "" s}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Ship{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aircraft
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Rename a group
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Replace Vehicles of "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Can't create group...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Can't delete this group...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Can't rename group...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Can't remove all vehicles from this group...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Can't add the vehicle to this group...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Can't add shared vehicles to group...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Groups - Click on a group to list all vehicles of this group
+STR_GROUP_CREATE_TIP                                            :{BLACK}Click to create a group
+STR_GROUP_DELETE_TIP                                            :{BLACK}Delete the selected group
+STR_GROUP_RENAME_TIP                                            :{BLACK}Rename the selected group
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Click to protect this group from global autoreplace
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Profit this year: {GREEN}{CURRENCY} {BLACK}(last year: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit this year: {RED}{CURRENCY} {BLACK}(last year: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit this year: {GREEN}{CURRENCY} {BLACK}(last year: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Profit this year: {RED}{CURRENCY} {BLACK}(last year: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/esperanto.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/esperanto.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -752,6 +752,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Malgranda
 STR_02A2_MEDIUM                                                 :{BLACK}Mezgranda
 STR_02A3_LARGE                                                  :{BLACK}Granda
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Urbo
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Elektu urban grandecon
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Urba grandeco:
 
@@ -803,6 +804,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mondomapo
 STR_EXTRA_VIEW_PORT                                             :Plia videjo
 STR_SIGN_LIST                                                   :AfiÅa listo
+STR_TRANSPARENCY_OPTIONS                                        :Ebloj por travidebleco
 STR_02DF_TOWN_DIRECTORY                                         :Urbaro
 STR_TOWN_POPULATION                                             :{BLACK}Monda enloÄantaro: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Videjo {COMMA}
@@ -989,7 +991,7 @@
 STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Trajno {COMMA} havas maltro da ordenoj enplane
 STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}Trajno {COMMA} havas malplenan ordenon
 STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Trajno {COMMA} havas duoblajn ordenojn
-STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Trajnno {COMMA} havas nevalidan stacion en la ordenoj
+STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Trajno {COMMA} havas nevalidan stacion en la ordenoj
 STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Vojveturilo {COMMA} havas maltro da ordenoj enplane
 STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}Vojveturilo {COMMA} havas malplenan ordenon
 STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}Vojveturilo {COMMA} havas duoblajn ordenojn
@@ -1096,6 +1098,7 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Skroli mapon
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Malaktiva
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Mapskrolrada rapido: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}AÅ­tomate paÅ­zu startante novan ludon: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Trajna maksimumo por ĉiu ludanto: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Vojveturila maksimumo por ĉiu ludanto: {ORANGE}{STRING}
@@ -1129,12 +1132,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permesu aĉetadon de dividaĵoj en aliaj kompanioj
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Tirante metu signalojn je ĉiuj: {ORANGE}{STRING} kvadrado(j)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}AÅ­tomate konstruu semaforojn antaÅ­: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}La urbaspekto "sen pliaj vojoj" ne validas en la scenarkreilo
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Elektu urbvojan aspekton: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :sen pliaj vojoj
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :defaÅ­lte
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :pli bonaj vojoj
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :kvadrataro de 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :kvadrataro de 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Loko de ĉefa ilbreto: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Maldekstre
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centre
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Dekstre
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Fenestroliga distanco: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Fenestroliga distanco: {ORANGE}malaktiva
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Urba kreskorapideco: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ne
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Malrapide
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normale
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rapide
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Tre rapide
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Grandeco de urboj kiuj duoble rapide kreskas: {ORANGE}1 en {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Grandeco de urboj kiuj duoble rapide kreskas: {ORANGE}Ne
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Komenca urbgrandeca multobligo: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfaco
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruado
@@ -1390,7 +1411,7 @@
 STR_NETWORK_COMPANY_INFO                                        :{SILVER}KOMPANIAJ INFORMOJ
 
 STR_NETWORK_COMPANY_NAME                                        :{SILVER}Kompaninomo:  {WHITE}{STRING}
-STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}EnaÅ­guro:  {WHITE}{NUM}
+STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}InaÅ­guro:  {WHITE}{NUM}
 STR_NETWORK_VALUE                                               :{SILVER}Kompanivaloro:  {WHITE}{CURRENCY64}
 STR_NETWORK_CURRENT_BALANCE                                     :{SILVER}Nuna monstato:  {WHITE}{CURRENCY64}
 STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}Lastjara enspezo:  {WHITE}{CURRENCY64}
@@ -2027,6 +2048,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Neniu
+STR_NUM_VERY_LOW                                                :Tre malalte
 STR_6816_LOW                                                    :Malalte
 STR_6817_NORMAL                                                 :Normale
 STR_6818_HIGH                                                   :Alte
@@ -2125,7 +2147,7 @@
 STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Grandigu prunton
 STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Repagu pruntparton
 STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(ManaÄanto)
-STR_7038_INAUGURATED                                            :{GOLD}EnaÅ­guris: {WHITE}{NUM}
+STR_7038_INAUGURATED                                            :{GOLD}InaÅ­gurita: {WHITE}{NUM}
 STR_7039_VEHICLES                                               :{GOLD}Veturiloj:
 STR_TRAINS                                                      :{WHITE}{COMMA} trajno{P "" j}
 STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} vojveturilo{P "" j}
@@ -3013,7 +3035,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Ĉe aÅ­tomata anstataÅ­igo tenu saman longecon de la trajno per forigo de vagonoj (defronte), se per nova maÅino la trajno plilongiÄas
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}AnstataÅ­ante: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EKSPERIMENTA AÄ´O {}Åœaltu inter maÅina kaj vagona anstataÅ­igo.{}Vagona anstataÅ­igo nur okazos se la nova vagono povas transformiÄi por porti saman ÅarÄon kiel la malnova. Por ĉiu vagono tio kontroliÄos dum anstataÅ­ado.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}MaÅino ne kreeblas
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Trajno ne haveblas
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Veturilo ne haveblas
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Åœipo ne haveblas
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aviadilo ne haveblas
 
 STR_ENGINES                                                     :MaÅinoj
 STR_WAGONS                                                      :Vagonoj
@@ -3089,6 +3114,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}ÅœanÄu komencjaron
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skala averto
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Ne rekomendindas tro ÅanÄi la grandecon de la mapo. Ĉu daÅ­rigi la generadon?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Urbaspekta averto
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}La urbaspekto "sen pliaj vojoj" ne estas rekomendata. Ĉu plugeneri?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Mapa nomo:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Grandeco: {ORANGE}{NUM} x {NUM}
@@ -3150,3 +3177,14 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transigaj Kreditoj: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...ĉi tiun vojon posedas la urbo
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...vojo direktiÄas malÄuste
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Ebloj por travidebleco
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}(Ne)travideblu la staciaj afiÅoj
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}(Ne)travideblu la arboj
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}(Ne)travideblu la domoj
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}(Ne)travideblu la industrioj
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}(Ne)travideblu konstrueblaĵoj kiel stacidomoj, deponejoj, trairejoj kaj kondukdratoj
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}(Ne)travideblu la pontoj
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}(Ne)travideblu aĵoj kiel lumturoj kaj antenoj, kaj eble estonte vidÄuaĵoj
--- a/src/lang/estonian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/estonian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -691,6 +691,7 @@
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Konkurendi jaama saabus esimene veovahend
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Õnnetused / katastroofid
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Ettevõtte teave
+STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Ava / sulge tööstuseid
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Muutused majanduses
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Soovitused ja teated mängija veovahendite kohta
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Uued veovahendid
@@ -730,7 +731,7 @@
 STR_022E_LANDSCAPE_GENERATION                                   :{BLACK}Maastiku loomine
 STR_022F_TOWN_GENERATION                                        :{BLACK}Linnade loomine
 STR_0230_INDUSTRY_GENERATION                                    :{BLACK}Tööstuste loomine
-STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Teede ehitamine
+STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Teeehitus
 STR_0233_TOWN_GENERATION                                        :{WHITE}Linnade loomine
 STR_0234_NEW_TOWN                                               :{BLACK}Uus linn
 STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Ehita uus linn
@@ -791,12 +792,12 @@
 STR_026A_CONSTRUCT_FARM                                         :{BLACK}Raja farm
 STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}Ehita rauamaagikaevandus
 STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}Ehita naftapuuraugud
-STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Ehita pank (seda saab ehitada vaid linnadesse, mille rahvastikuarv ületab 1200)
+STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Ehita pank (saab ehitada vaid linnadesse, mille rahvastikuarv ületab 1200)
 STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Ehita paberitehas
 STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}Ehita toidutööstus
 STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}Ehita trükikoda
 STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Ehita kullakaevandus
-STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Ehita pank (seda saab vaid linnadesse ehitada)
+STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Ehita pank (saab vaid linnadesse ehitada)
 STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}Ehita saeveski (vihmametsade puhustamiseks ja puidu tootmiseks)
 STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Istuta puuviljaistandus
 STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Istuta kummipuuistandus
@@ -826,6 +827,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Ehita tuletorn
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Paigalda saatjamast
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Loo kõrbealad.{}Eemaldamiseks klõpsa hoides all CTRL nuppu
+STR_CREATE_LAKE                                                 :{BLACK}Määratle veealad.{}Ehita kanal. CTRL-klahvi all hoides ujutab ümbruskonna üle.
 STR_0290_DELETE                                                 :{BLACK}Kustuta
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Hävita see linn täielikult
 STR_0292_SAVE_SCENARIO                                          :Salvesta kaart
@@ -849,6 +851,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Väike
 STR_02A2_MEDIUM                                                 :{BLACK}Keskmine
 STR_02A3_LARGE                                                  :{BLACK}Suur
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Linn
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Vali linna suurus
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Linna suurus:
 
@@ -900,6 +903,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Maailmakaart
 STR_EXTRA_VIEW_PORT                                             :Lisa vaateaken
 STR_SIGN_LIST                                                   :Siltide nimekiri
+STR_TRANSPARENCY_OPTIONS                                        :Läbipaistvuse valikud
 STR_02DF_TOWN_DIRECTORY                                         :Linnade nimistu
 STR_TOWN_POPULATION                                             :{BLACK}Maailma rahvastik: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Vaateaken {COMMA}
@@ -1141,6 +1145,7 @@
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Luba suvalise kujuga jaamad: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Uus teeotsimise algoritm(NPF asendab NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Raskete rongide simuleerimiseks kasutatav raskuse korrutaja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Luba läbisõidupeatused linnateedel: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Luba väikesed lennujaamad kuni mängu lõpuni: {ORANGE}{STRING}
 
@@ -1192,6 +1197,7 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Keri kaarti
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Väljas
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Kaarti kerimisratta kiirus: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automaatne mängu peatamine uue mängu alustamisel: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maks. rongide arv mängija kohta: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Suurim maanteesõidukite arv mängija kohta: {ORANGE}{STRING}
@@ -1225,12 +1231,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Luba teiste ettevõtete aktsiate ostmine
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Venitades paigutatud signaaltulede tihedus: {ORANGE}{STRING} ühik(ut)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Ehita semaforid automaatselt enne: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Stsenaariumiredaktor ei tunnista "ilma teedeta" linnaplaneeringut
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Vali linnale teeplaan: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :ilma teedeta
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :tavalised
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :paremad teed
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 ruudustik
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 ruudustik
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Tööriistariba asukoht: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Vasakul
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Keskel
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Paremal
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Akna haaramise raadius: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Akna haaramise raadius: {ORANGE}välja lülitatud
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Linna suurenemise kiirus: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Pole
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Aeglane
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normaalne
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Kiire
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Väga Kiire
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Topeltkiirusel suurenevaid linnu: {ORANGE}1 iga {STRING} linna kohta
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Topeltkiirusel suurenevaid linnu: {ORANGE}puudub
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Algne linna suuruse kordaja: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Välimus
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Ehitamine
@@ -2123,6 +2147,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Pole
+STR_NUM_VERY_LOW                                                :Väga madal
 STR_6816_LOW                                                    :Madal
 STR_6817_NORMAL                                                 :Harilik
 STR_6818_HIGH                                                   :Kõrge
@@ -2494,7 +2519,7 @@
 STR_80A5_UHL_WATER_TANKER                                       :Uhl veeveok
 STR_80A6_BALOGH_WATER_TANKER                                    :Balogh veeveok
 STR_80A7_MPS_WATER_TANKER                                       :MPS veeveok
-STR_80A8_BALOGH_FRUIT_TRUCK                                     :Balogh veeveok
+STR_80A8_BALOGH_FRUIT_TRUCK                                     :Balogh puuviljaveok
 STR_80A9_UHL_FRUIT_TRUCK                                        :Uhl puuviljaveok
 STR_80AA_KELLING_FRUIT_TRUCK                                    :Kelling puuviljaveok
 STR_80AB_BALOGH_RUBBER_TRUCK                                    :Balogh kummiveok
@@ -2624,7 +2649,7 @@
 
 STR_UNKNOWN_DESTINATION                                         :tundmatu sihtpunkt
 STR_8812_EMPTY                                                  :{LTBLUE}Tühi
-STR_8813_FROM                                                   :{LTBLUE}{CARGO} {STATION}'st
+STR_8813_FROM                                                   :{LTBLUE}{CARGO} jaamast {STATION}
 STR_FROM_MULT                                                   :{LTBLUE}{CARGO} jaamast {STATION} (x{NUM})
 STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Rong {COMMA} ootab depoos
 STR_8815_NEW_VEHICLES                                           :{BLACK}Uus rong
@@ -3109,7 +3134,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Sunni automaatvahetus hoidma rongi pikkust samaks eemaldades vaguneid (alustades eestpoolt), kui vahetatav mootor muudaks rongi pikemaks.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Vahetamisel: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} TESTIMISEL! {}Vaheta aken mootori ja vaguni vahetamise aknate vahel.{}Vaguni vahetus tehakse ainult siis kui uus vagun suudetakse muuta kandmaks sama tüüpi kaupa kui vana vagun. See valitakse igale vagunile kui tegelik vahetus käib
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Vedurit ei saa ehitada
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Sõiduk pole saadaval
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Sõiduk pole saadaval
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Laev pole saadaval
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Lennuk pole saadaval
 
 STR_ENGINES                                                     :Vedurid
 STR_WAGONS                                                      :Vaguneid
@@ -3185,6 +3213,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Muuda algusaastat
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skaala hoiatus
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Kaardi suuruse muutmine pole soovitatav. Jätka?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Linnaplaneerimise hoiatus
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Linnaplaneeringut "ilma teedeta" ei ole soovitatav kasutada. Jätkata selle tekitamisega?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Kõrgusekaardi nimi:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Suurus: {ORANGE}{NUM} x {NUM}
@@ -3246,3 +3276,14 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Kanna Raha: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...see tee on omatud linna poolt
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...tee on vales suunas
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Läbipaistvusvalikud
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Vaheta jaamamärkide läbipaistvust
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Vaheta puude läbipaistvust
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Vaheta majade läbipaistvust
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Vaheta tööstusehitiste läbipaistvust
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Vaheta läbipaistvust ehitistel nagu: jaamad, depood, vahepunktid ja elektriliinid
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Vaheta sildade läbipaistvust
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Vaheta läbipaistvust objektidel, nagu: majakad, antennid ja võimalik, et tulevikus ka silmailu
--- a/src/lang/finnish.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/finnish.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -751,6 +751,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Pieni
 STR_02A2_MEDIUM                                                 :{BLACK}Keskisuuri
 STR_02A3_LARGE                                                  :{BLACK}Suuri
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Kaupunki
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Valitse kaupungin koko.
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Kaupungin koko:
 
@@ -802,6 +803,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Maailmankartta
 STR_EXTRA_VIEW_PORT                                             :Lisänäkymä
 STR_SIGN_LIST                                                   :Kylttilista
+STR_TRANSPARENCY_OPTIONS                                        :Läpinäkyvyysvalinnat
 STR_02DF_TOWN_DIRECTORY                                         :Kaupunkihakemisto
 STR_TOWN_POPULATION                                             :{BLACK}Maailman asukasluku: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Näkymä {COMMA}
@@ -1095,6 +1097,7 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Vieritä karttaa
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Pois
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Rullan nopeus: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Uusi peli alkaa pysäytettynä: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Junia/pelaaja: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Ajoneuvoja/pelaaja: {ORANGE}{STRING}
@@ -1128,12 +1131,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Salli osakkeiden ostaminen muista yhtiöistä
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Vedettäessä aseta opastimien väleiksi: {ORANGE}{STRING} ruutu(a)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Rakenna opasteet automaattisesti ennen: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Tiekaavaa "ei uusia teitä" ei voi käyttää editorissa
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Valitse tiekaava: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :ei uusia teitä
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :oletus
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :parempia teitä
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 ruudukko
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 ruudukko
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Päätyökalupalkin sijainti: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :vasen
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :keskellä
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :oikea
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Ikkunan kiinniottosäde: {ORANGE}{STRING} piks.
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Ikkunan kiinniottosäde: {ORANGE}pois päältä
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Kaupunkien kasvunopeus: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ei kasvua
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Hidas
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Tavallinen
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Nopea
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Erittäin nopea
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Kaksinkertaisella nopeudella kasvavien kaupunkien osuus: {ORANGE}1/{STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Kaksinkertaisella nopeudella kasvavien kaupunkien osuus: {ORANGE}0
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Kasvukerroin alussa: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Käyttöliittymä
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Rakentaminen
@@ -1894,8 +1915,8 @@
 STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY}: tuotanto vähenee 50{NBSP}%:lla.
 STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}{INDUSTRY}: hyönteisparvet aiheuttavat tuhoa!{}Tuotanto vähenee 50{NBSP}%:lla.
 STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...voidaan asettaa vain kartan reunoille.
-STR_INDUSTRY_PROD_GOUP                                          ::{BLACK}{BIGFONT}{1:INDUSTRY} tuottaa {0:STRING} {2:COMMA}{NBSP}% entistä enemmän!
-STR_INDUSTRY_PROD_GODOWN                                        ::{BLACK}{BIGFONT}{1:INDUSTRY} tuottaa {0:STRING} {2:COMMA}{NBSP}% entistä vähemmän!
+STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}{1:INDUSTRY} tuottaa {0:STRING} {2:COMMA}{NBSP}% entistä enemmän!
+STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}{1:INDUSTRY} tuottaa {0:STRING} {2:COMMA}{NBSP}% entistä vähemmän!
 
 ##id 0x5000
 STR_5000_TRAIN_IN_TUNNEL                                        :{WHITE}Juna on tunnelissa.
@@ -2026,6 +2047,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ei mitään
+STR_NUM_VERY_LOW                                                :Erittäin alhainen
 STR_6816_LOW                                                    :Matala
 STR_6817_NORMAL                                                 :Normaali
 STR_6818_HIGH                                                   :Korkea
@@ -2199,6 +2221,7 @@
 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                                              :Normaalit tunnusvärit
 STR_LIVERY_STEAM                                                :Höyryveturi
 STR_LIVERY_DIESEL                                               :Dieselveturi
 STR_LIVERY_ELECTRIC                                             :Sähköveturi
@@ -3011,7 +3034,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Automaattikorvaus pitäköön junan vakiopituisena poistamalla vaunuja (edestä) jos veturi pidentäisi junaa.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Korvataan: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} ERIKOIS OMINAISUUS {} Vaihda toiseen korvausikkunaan. {} Vaunu vaihdetaan ainoastaan jos uusi vaunu kuljettaa samaa rahtia. Tämä tarkistetaan, joka kerta kun vaunu korvataan.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Veturi ei ole rakennettavissa
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Juna tai vaunu ei ole saatavilla
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Ajoneuvo ei ole saatavilla
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Laiva ei ole saatavilla
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Lentokone ei ole saatavilla
 
 STR_ENGINES                                                     :Veturit
 STR_WAGONS                                                      :Vaunut
@@ -3087,6 +3113,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Vaihda aloitusvuosi
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Mittakaava-varoitus
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Lähdekartan koon liiallinen muuttaminen ei ole suositeltavaa. Haluatko jatkaa?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Varoitus tiekaavasta
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Tiekaavaa "ei uusia teitä" ei suositella. Jatketaanko?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Korkeuskartan nimi:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Koko: {ORANGE}{NUM} x {NUM}
@@ -3147,3 +3175,15 @@
 
 ########
 
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Siirrä rahaa: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...kaupunki omistaa tien
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...tie on väärin päin
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Läpinäkyvyysvalinnat
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Läpinäkyvät kyltit
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Läpinäkyvät puut
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Läpinäkyvät talot
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Läpinäkyvät tehtaat
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Läpinäkyvät asemat, varikot, rastit ja sähkölinjat
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Läpinäkyvät sillat
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Läpinäkyvät rakenteet kuten majakat ja antennit
--- a/src/lang/french.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/french.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -4,6 +4,8 @@
 ##plural 2
 ##gender m m2 f
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Hors limites
@@ -250,7 +252,7 @@
 STR_0119_TOFFEE_QUARRY                                          :{BLACK}{TINYFONT}Carrière de Caramel
 STR_011A_SUGAR_MINE                                             :{BLACK}{TINYFONT}Mine de Sucre
 STR_011B_RAILROAD_STATION                                       :{BLACK}{TINYFONT}Gare ferroviaire
-STR_011C_TRUCK_LOADING_BAY                                      :{BLACK}{TINYFONT}Zone de Chargement
+STR_011C_TRUCK_LOADING_BAY                                      :{BLACK}{TINYFONT}Aire de chargement
 STR_011D_BUS_STATION                                            :{BLACK}{TINYFONT}Arrêt d'autobus
 STR_011E_AIRPORT_HELIPORT                                       :{BLACK}{TINYFONT}Aéroport/Héliport
 STR_011F_DOCK                                                   :{BLACK}{TINYFONT}Port maritime
@@ -752,6 +754,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Petite
 STR_02A2_MEDIUM                                                 :{BLACK}Moyenne
 STR_02A3_LARGE                                                  :{BLACK}Grande
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Métropole
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Sélectionner la taille de la ville
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Taille:
 
@@ -803,6 +806,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Carte du monde
 STR_EXTRA_VIEW_PORT                                             :Vue supplémentaire
 STR_SIGN_LIST                                                   :Liste des panneaux
+STR_TRANSPARENCY_OPTIONS                                        :Options de transparence
 STR_02DF_TOWN_DIRECTORY                                         :Annuaire des villes
 STR_TOWN_POPULATION                                             :{BLACK}Population mondiale : {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Vue {COMMA}
@@ -1045,6 +1049,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nouvelle recherche de chemin global (NPF, écrase NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Multiplier le poid pour les trains fret (simule des trains lourds): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Autoriser les arrêts de bus sur les routes des municipalités: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Autoriser la construction de stations adjacentes: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Toujours permettre les petits aéroports: {ORANGE}{STRING}
 
@@ -1085,6 +1090,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Entretenir automatiquement les hélicoptères à l'héliport: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Relier la barre d'outils Paysage avec celle des rails/routes/eau et aéroport: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Inverser la direction lors du défilement avec la souris : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Défilement régulier de la vue: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Montrer une infobulle de mesure lors de l'utilisation de divers outils de construction: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Affichage des livrées de compagnie : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Aucune
@@ -1096,6 +1102,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Défilement de la carte
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Désactivé
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Vitesse de défilement avec molette: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pause automatique en début de nouvelle partie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Utiliser la liste de véhicules avancée: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Nombre de trains max. par joueur: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Nombre de véhicules routiers max. par joueur: {ORANGE}{STRING}
@@ -1129,12 +1137,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permettre d'acheter des actions d'autres compagnies
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Espacements des signaux en mode drag & drop : {ORANGE}{STRING} case(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Construire automatiquement des sémaphores avant: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Le schéma de ville "pas de routes" n'est pas autorisé dans l'éditeur de scénario
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Choisir un schéma de ville: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :pas de routes
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :défaut
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :meilleures routes
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :grille 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :grille 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position de la barre d'outils principale: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :À gauche
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centrée
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :À droite
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Rayon d'attraction des fenêtres : {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Rayon d'attraction des fenêtres : {ORANGE}inactif
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Vitesse de croissance des villes: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Aucune
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Lente
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normale
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rapide
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Très rapide
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportion des villes qui deviendront des métropoles: {ORANGE}1 sur {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportion des villes qui deviendront des métropoles: {ORANGE}Aucune
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicateur de taille de ville initial: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construction
@@ -1532,7 +1558,7 @@
 STR_1004_TOO_HIGH                                               :{WHITE}Trop élevé
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Aucuns rails convenables
 STR_1007_ALREADY_BUILT                                          :{WHITE}...déjà construit
-STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Doit d'abord enlever les rails
+STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Vous devez d'abord enlever les rails
 STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construction de voie ferrée
 STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construction de voie ferrée électrifiée
 STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construction de Monorail
@@ -1544,7 +1570,7 @@
 STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Impossible de construire des rails ici...
 STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Impossible de retirer les rails d'ici...
 STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Impossible de retirer les signaux d'ici...
-STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Orientation du Dépôt
+STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Orientation du dépôt
 STR_1015_RAILROAD_CONSTRUCTION                                  :Construction de voie ferrée
 STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Construction de voie ferrée électrifiée
 STR_1016_MONORAIL_CONSTRUCTION                                  :Construction de Monorail
@@ -1562,32 +1588,56 @@
 STR_1023_RAILROAD_TRAIN_DEPOT                                   :Dépôt ferroviaire
 STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...appartient à une autre compagnie
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Rails avec des signaux normaux
-STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Rails avec des pré-signaux
+STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Rails avec des signaux d'entrée
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Rails avec des signaux de sortie
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Rails avec des signaux combinés
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Rails avec des signaux normaux et d'entrée
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Rails avec des signaux normaux et de sortie
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Rails avec des signaux normaux et combinés
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Rails avec des signaux d'entrée et de sortie
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Rails avec des signaux d'entrée et combinés
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Rails avec des signaux de sortie et combinés
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Vous devez d'abord retirer la gare
 
 
 
 ##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Doit d'abord retirer la route
+STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Vous devez d'abord retirer la route
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Route en travaux
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Construction routière
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Construction de tramway
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Choisir Pont Routier
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... les routes à sens unique ne peuvent pas avoir de jonctions
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Impossible de construire la route ici...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Impossible de construire une section de tramway ici...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Impossible de retirer la route ici...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Impossible de retirer la section de tramway d'ici...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Orientation du dépôt
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Orientation du dépôt
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Impossible de construire un dépôt routier ici...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Impossible de construire un dépôt de tramway ici...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Impossible de construire un arrêt d'autobus...
-STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Impossible de construire une station de camions...
+STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Impossible de construire une aire de chargement...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Impossible de construire une station de tramway pour passagers...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Impossible de construire une station de tramway pour fret...
 STR_180A_ROAD_CONSTRUCTION                                      :Construction routière
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Construction de tramway
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construire une section de route
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construire une section de tramway
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construire un dépôt routier (pour construire et entretenir les véhicules routiers)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Construire un dépôt de tramway (pour la construction et l'entretien des véhicules)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Construire un arrêt d'autobus
-STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Construire une station de camions
+STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Construire une aire de chargement
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Construire une station de tramway pour passagers
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Construire une station de tramway pour fret
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Construire un pont routier
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Construire un pont
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construire un tunnel routier
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Construire un tunnel
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Basculer construire/détruire routes
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Basculer construire/retirer pour tramways
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Choisir orientation du dépôt routier
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Choisir l'orientation du dépôt de tramway
 STR_1814_ROAD                                                   :Route
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Route avec lampadaires
 STR_1816_TREE_LINED_ROAD                                        :Route avec lignée d'arbustres
@@ -1595,6 +1645,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Route/rail Croisement à niveau
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Impossible de supprimer la station de bus...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Impossible de supprimer la station de camions...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Impossible de retirer la station de tramway pour passagers...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Impossible de retirer la station de tramway pour fret...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Villes
@@ -1758,20 +1810,26 @@
 STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} accepte désormais: {STRING}
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} accepte désormais: {STRING} et {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Arrêt d'autobus
-STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Station de camions
-STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Détruire d'abord l'arrêt d'autobus
-STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Détruisez d'abord la station
-STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Station{P "" s}
+STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Aire de chargement
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Tramway pour passagers
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Tramway pour fret
+STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Vous devez d'abord détruire l'arrêt d'autobus
+STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Vous devez d'abord détruire l'aire de chargement
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Vous devez d'abord démolir la station de tramway pour passagers
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Vous devez d'abord démolir la station de tramway pour fret
+STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Station{P 2 "" s}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Aucun -
 STR_304B_SITE_UNSUITABLE                                        :{WHITE}...l'endroit ne convient pas
 STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Trop près d'un autre port
-STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Détruisez d'abord le port
+STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Vous devez d'abord détruire le port
 STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Choisir l'orientation de la gare ferroviaire
 STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Choix du nombre de voies
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Choisir la longueur de la gare
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Choisir l'orientation de l'arrêt d'autobus
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Choix de l'orientation de l'aire de chargement
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Choisir l'orientation de la station de tramway pour passagers
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Choisir l'orientation de la station de tramway pour fret
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centrer la vue sur la station
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Afficher la notation de la station
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Renommer la station
@@ -1801,7 +1859,7 @@
 STR_STAT_CLASS_WAYP                                             :Points de passage
 
 ##id 0x3800
-STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Orientation du dépot naval
+STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Orientation du dépôt
 STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...doit être construit sur l'eau
 STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Impossible de construire le dépôt naval ici...
 STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Choisir l'orientation du dépôt naval
@@ -1903,7 +1961,7 @@
 STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Véhicule dans le tunnel
 STR_5003_ANOTHER_TUNNEL_IN_THE_WAY                              :{WHITE}Autre tunnel présent
 STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Impossible de creuser pour faire déboucher le tunnel
-STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Vous devez démolir le tunnel avant
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Vous devez d'abord démolir le tunnel
 STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Vous devez d'abord démolir le pont
 STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Impossible de commencer et de terminer au même endroit
 STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Crevasse ou eau requise sous le pont
@@ -1992,6 +2050,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Héliport
 STR_SV_STNAME_FOREST                                            :{STRING} Forêt
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2027,6 +2087,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Aucune
+STR_NUM_VERY_LOW                                                :Très bas
 STR_6816_LOW                                                    :Bas
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Élevé
@@ -2219,6 +2280,8 @@
 STR_LIVERY_HELICOPTER                                           :Hélicoptère
 STR_LIVERY_SMALL_PLANE                                          :Petit porteur
 STR_LIVERY_LARGE_PLANE                                          :Gros porteur
+STR_LIVERY_PASSENGER_TRAM                                       :Tramway pour passagers
+STR_LIVERY_FREIGHT_TRAM                                         :Tramway pour fret
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Montrer les livrées générales
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Montrer les livrées de trains
@@ -2692,6 +2755,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Renommer le véhicule
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Les habitants célèbrent . . .{}Le premier bus arrive à {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Les habitants célèbrent . . .{}Le premier camion arrive à {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Les habitants célèbrent . . .{}Le premier tramway arrive à {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Les habitants célèbrent . . .{}Le premier tramway arrive à {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Accident routier!{}Un automobiliste meurt brûlé vif lors d'une collision avec un train
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Accident routier!{}{COMMA} mort{P "" s} lors d'une collision avec un train
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Impossible de faire faire demi-tour au véhicule...
@@ -2721,7 +2786,7 @@
 STR_CLONE_SHIP                                                  :{BLACK}Copier Navire
 STR_CLONE_SHIP_INFO                                             :{BLACK}Effectuer la copie d'un navire. Ctrl-clic partagera les ordres
 STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Effectuer la copie d'un navire. Cliquer ici puis sur un navire dans ou hors d'un dépôt. Ctrl-clic partagera les ordres
-STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Navire doit être arrêté au dépôt
+STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Le navire doit être arrêté au dépôt
 STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Impossible de vendre navire...
 STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Impossible de construire navire...
 STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Navire présent
@@ -2811,7 +2876,7 @@
 STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}L'aéronef est en vol
 STR_A019_CAPACITY                                               :{BLACK}Capacité: {LTBLUE}{CARGO}, {CARGO}
 STR_A01A_CAPACITY                                               :{BLACK}Capacité: {LTBLUE}{CARGO}
-STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}Aéronef doit être arrêté au hangar
+STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}L'aéronef doit être arrêté au hangar
 STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Impossible de vendre l'aéronef...
 STR_A01D_AIRPORT_CONSTRUCTION                                   :Construction d'aéroport
 STR_A01E_BUILD_AIRPORT                                          :{BLACK}Construire un aéroport
@@ -2976,6 +3041,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Vous êtes sur le point de vendre tous les véhicules du dépôt. Etes-vous sûr ?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Dépôt incompatible
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Vendre tous les trains du dépôt
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Vendre tous les véhicules routiers du dépôt
@@ -3013,7 +3079,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}L'autoremplacement conserve la même longueur du train en retirant des wagons (d'abord par la tête), si le remplacement fait en sorte que le train ne devienne plus long.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}En Remplacement: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} FONCTION EXPERIMENTALE {}Passer à la fenêtre de remplacement de locomotives/wagons.{}Le remplacement de wagon ne se fera que si le nouveau wagon peut être réaménagé pour le même type de cargaison que l'ancien. Ceci est vérifié pour chaque wagon lors du remplacement.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Ce véhicule ne peut pas être construit
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Véhicule non disponible
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Véhicule non disponible
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Navire non disponible
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aéronef non disponible
 
 STR_ENGINES                                                     :Locomotives
 STR_WAGONS                                                      :Wagons
@@ -3089,6 +3158,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Modifier l'année de départ
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Avertissement de redimensionnement
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Trop redimensionner la carte source n'est pas recommandé. Continuer la génération ?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Avertissement schéma de ville
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Le schéma de ville "pas de routes" n'est pas recommandé.  Voulez-vous poursuivre la génération?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nom de la carte d'altitude :
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Taille: {ORANGE}{NUM} x {NUM}
@@ -3150,3 +3221,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Crédits de transfert: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...cette route appartient à une ville
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...mauvaise orientation de la route
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Options de transparence
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Transparence des noms de station
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Transparence des arbres
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Transparence des maisons
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Transparence des industries
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Transparence des éléments constructibles tels que stations, dépôts, points de contrôle et caténaire
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Transparence des ponts
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Transparence des structures telles que phares et antennes
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Groupe {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Tous les trains
+STR_GROUP_ALL_ROADS                                             :Tous les véhicules routiers
+STR_GROUP_ALL_SHIPS                                             :Tous les navires
+STR_GROUP_ALL_AIRCRAFTS                                         :Tous les aéronefs
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Ajouter des véhicules partagés
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Retirer tous les véhicules
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Train{P "" s}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Véhicule{P "" s} routier{P "" s}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Navire{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aéronef{P "" s}
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Renommer un groupe
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Remplacer les véhicules de "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Impossible de créer le groupe...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Impossible de supprimer ce groupe...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Impossible de renommer le groupe...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Impossible de retirer tous les véhicules de ce groupe...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Impossible d'ajouter le véhicule à ce groupe...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Impossible d'ajouter les véhicules partagés à ce groupe...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Groupes - Cliquer sur un groupe pour lister tous les véhicules de ce groupe
+STR_GROUP_CREATE_TIP                                            :{BLACK}Cliquer pour créer un groupe
+STR_GROUP_DELETE_TIP                                            :{BLACK}Supprimer le groupe sélectionné
+STR_GROUP_RENAME_TIP                                            :{BLACK}Renommer le groupe sélectionné
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Cliquer pour protéger ce groupe contre l'auto-remplacement global
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Profit cette année: {GREEN}{CURRENCY} {BLACK}(an dernier: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit cette année: {RED}{CURRENCY} {BLACK}(an dernier: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit cette année: {GREEN}{CURRENCY} {BLACK}(an dernier: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Profit cette année: {RED}{CURRENCY} {BLACK}(an dernier: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/galician.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/galician.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -2550,6 +2550,7 @@
 STR_TRAIN_STOPPING_VEL                                          :{RED}Parando, {VELOCITY}
 STR_TRAIN_NO_POWER                                              :{RED}Sen enerxía
 
+
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Haí un vehículo de estrada no camiño
 STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Vehículos de Estrada
@@ -2803,6 +2804,7 @@
 STR_NEWGRF_GRF_ID                                               :{BLACK}GRF ID: {SILVER}{STRING}
 STR_NEWGRF_MD5SUM                                               :{BLACK}Suma MD5: {SILVER}{STRING}
 
+
 STR_NEWGRF_ADD                                                  :{BLACK}Engadir
 STR_NEWGRF_REMOVE                                               :{BLACK}Eliminar
 STR_NEWGRF_REMOVE_TIP                                           :{BLACK}Elimina-lo arquivo NewGRF seleccionado da lista
@@ -2815,6 +2817,7 @@
 
 STR_NEWGRF_DISABLED                                             :{RED}Desactivado
 
+
 STR_CURRENCY_WINDOW                                             :{WHITE}Moeda persoalizada
 STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}Taxa de cambio: {ORANGE}{CURRENCY} = £ {COMMA}
 STR_CURRENCY_SEPARATOR                                          :{LTBLUE}Separador:
@@ -2919,6 +2922,7 @@
 STR_RANDOM_SEED                                                 :{BLACK}Semilla Aleatoria:
 STR_RANDOM_SEED_HELP                                            :{BLACK}Pincha para introducir unha semilla
 STR_LAND_GENERATOR                                              :{BLACK}Xerador de terreo:
+STR_TREE_PLACER                                                 :{BLACK}Algoritmo para árbores:
 STR_TERRAIN_TYPE                                                :{BLACK}Tipo de terreo:
 STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}Nivel do mar:
 STR_SMOOTHNESS                                                  :{BLACK}Suavidade:
@@ -2939,7 +2943,9 @@
 STR_WORLD_GENERATION                                            :{BLACK}Xeración do mundo
 STR_SETTINGUP_GAME                                              :{BLACK}Configurando partida
 STR_PREPARING_GAME                                              :{BLACK}Preparando partida
+STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Esta acción cambiou o nivel de dificultade a Personalizado
 STR_SE_FLAT_WORLD                                               :{WHITE}Terreo Chan
+STR_SE_RANDOM_LAND                                              :{WHITE}Terreo aleatorio
 STR_SE_NEW_WORLD                                                :{BLACK}Crear novo escenario
 STR_SE_CAPTION                                                  :{WHITE}Tipo de escenario
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
@@ -2968,4 +2974,19 @@
 STR_MEASURE_LENGTH_HEIGHTDIFF                                   :{BLACK}Lonxitude: {NUM}{}Diferencia de altura: {NUM} m
 STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}Ãrea: {NUM} x {NUM}{}Diferencia de altura: {NUM} m
 
+############ Date formatting
+STR_DATE_TINY                                                   :{STRING}-{STRING}-{NUM}
+STR_DATE_SHORT                                                  :{STRING} {NUM}
+STR_DATE_LONG                                                   :{STRING} {STRING} {NUM}
+
 ########
+
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transferir Créditos: {LTBLUE}{CURRENCY}
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opcións de Transparencia
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Habilitar transparencia para as sinais das estacións
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Habilitar transparencia para árbores
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Habilitar transparencia para casas
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Habilitar transparencia para industrias
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Habilitar transparencia para construibles como estacións, depósitos, puntos de ruta e catenaria
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Habilitar transparencia para pontes
--- a/src/lang/german.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/german.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -752,6 +752,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Klein
 STR_02A2_MEDIUM                                                 :{BLACK}Mittel
 STR_02A3_LARGE                                                  :{BLACK}Groß
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Stadt
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Stadtgröße bestimmen
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Stadtgröße:
 
@@ -803,6 +804,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Weltkarte
 STR_EXTRA_VIEW_PORT                                             :Zusatzansicht
 STR_SIGN_LIST                                                   :Schilderliste
+STR_TRANSPARENCY_OPTIONS                                        :Transparenzeinstellungen
 STR_02DF_TOWN_DIRECTORY                                         :Städteverzeichnis
 STR_TOWN_POPULATION                                             :{BLACK}Weltbevölkerung: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Ansicht {COMMA}
@@ -1091,9 +1093,12 @@
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Eigene Firma
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Alle Firmen
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Bevorzuge Teamchat mit <ENTER>: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funktion des Scrollrads: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Karte vergrößern
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Kartenansicht verschieben
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Aus
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Scrollradgeschwindigkeit auf der Karte: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatische Pause bei Spielstart: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maximale Anzahl der Züge pro Spieler: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maximale Anzahl der Straßenfahrzeuge pro Spieler: {ORANGE}{STRING}
@@ -1127,12 +1132,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Erlaube Anteile an anderen Firmen zu kaufen
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Errichte Signale alle {ORANGE}{STRING} Felder beim Ziehen mit der Maus
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatischer Bau von Formsignalen bis: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Der Stadtaufbau "keine weiteren Straßen" ist im Szenarioeditor nicht möglich
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Wähle den Stadtstraßenaufbau: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :keine weiteren Straßen
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :Vorgabe
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :bessere Straßen
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 Gitter
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 Gitter
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position der Werkzeugleiste: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Links
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Mitte
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Rechts
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Fenster schnappen aneinander, wenn näher als: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Fenster schnappen aneinander, wenn näher als: {ORANGE}ausgeschaltet
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Stadtwachstumgeschwindigkeit: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Keins
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Langsam
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Schnell
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Sehr schnell
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Anteil der Städte die doppelt so schnell wachsen: {ORANGE}1 in {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Anteil der Städte die doppelt so schnell wachsen: {ORANGE}Keine
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Startmultiplikator der Stadtgröße: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Oberfläche
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruktion
@@ -1990,6 +2013,7 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Heliport
 STR_SV_STNAME_FOREST                                            :{STRING} Wald
 
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2025,6 +2049,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Keine
+STR_NUM_VERY_LOW                                                :Sehr niedrig
 STR_6816_LOW                                                    :Niedrig
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Hoch
@@ -2913,6 +2938,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Falscher Parameter für {STRING}: Parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} Muß vor {STRING} geladen werden.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} Muß nach {STRING} geladen werden.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :Die GRF Datei, die zur Ãœbersetzung erstellt wurde
 
 STR_NEWGRF_ADD                                                  :{BLACK}Hinzufügen
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Füge eine neue NewGRF Datei zu Liste hinzu
@@ -3010,7 +3036,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Zwinge das automatische Ersetzen die Länge eines Zuges beizubehalten, indem (vorne beginnend) Waggons entfernt werden, falls das Ersetzen der Lokomotive den Zug verlängern würde.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Ersetze: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTELLE FUNKTION {}Umschalter für Lok- oder Waggonersetzung{}Waggons werden nur ersetzt, wenn der neue Waggon den selben Warentyp transportieren kann wie der alte. Dies wird beim Ersetzen eines jeden Waggons einzeln geprüft.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Lokomotive ist nicht baubar
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Fahrzeug nicht verfügbar
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Fahrzeug nicht verfügbar
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Schiff nicht verfügbar
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Flugzeug nicht verfügbar
 
 STR_ENGINES                                                     :Loks
 STR_WAGONS                                                      :Waggons
@@ -3086,6 +3115,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Ändere Startjahr
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skalierungswarnung
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Zu starke Skalierung der Karte ist nicht empfohlen. Trotzdem Generierung fortsetzen?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Städtebauwarnung
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Der Stadtaufbau "keine weiteren Straßen" ist nicht empfohlen. Mit der Generierung fortfahren?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Reliefkartenname:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Größe: {ORANGE}{NUM} x {NUM}
@@ -3147,3 +3178,39 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Ãœberweise Geld: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...diese Straße ist in kommunaler Trägerschaft
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...Straße verläuft in die falsche Richtung
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Transparenzoptionen
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Verändere die Transparenz für Stationsschilder
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Verändere die Transparenz für Bäume
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Verändere die Transparenz für Häuser
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Verändere die Transparenz für Industrien
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Verändere die Transparenz für Gebäude wie Bahnhöfe, Depots, Wegpunkte und Oberleitung
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Verändere die Transparenz für Brücken
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Verändere die Transparenz für Bauten wie Leuchttürme und Antennen, evtl. in der Zukunft auch für Sehenswürdigkeiten
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Gruppe {COMMA}
+STR_GROUP_ALL_TRAINS                                            :Alle Züge
+STR_GROUP_ALL_ROADS                                             :Alle Straßenfahrzeuge
+STR_GROUP_ALL_SHIPS                                             :Alle Schiffe
+STR_GROUP_ALL_AIRCRAFTS                                         :Alle Flugzeuge
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Entferne alle Fahrzeuge
+
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Gruppe umbenennen
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Kann Gruppe nicht erstellen...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Kann diese Gruppe nicht löschen...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Kann Gruppe nicht umbenennen...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kann nicht alle Fahrzeuge dieser Gruppe entfernen...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kann das Fahrzeug nicht zu dieser Gruppe hinzufügen...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Gruppen - Klicke auf eine Gruppe für eine Liste aller Fahrzeuge der Gruppe
+STR_GROUP_CREATE_TIP                                            :{BLACK}Klicken um eine Gruppe zu erstellen
+STR_GROUP_DELETE_TIP                                            :{BLACK}Die ausgewählte Gruppe löschen
+STR_GROUP_RENAME_TIP                                            :{BLACK}Die ausgewählte Gruppe umbenennen
+
+
+########
--- a/src/lang/hungarian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/hungarian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -4,6 +4,8 @@
 ##plural 1
 ##case t ba
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Kilóg a térképről
@@ -817,6 +819,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Kicsi
 STR_02A2_MEDIUM                                                 :{BLACK}Közepes
 STR_02A3_LARGE                                                  :{BLACK}Nagy
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Város
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}A város méretének kiválasztása
 STR_02A5_TOWN_SIZE                                              :{YELLOW}A város mérete:
 
@@ -868,6 +871,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Világtérkép
 STR_EXTRA_VIEW_PORT                                             :Extra látkép
 STR_SIGN_LIST                                                   :Feliratok listája
+STR_TRANSPARENCY_OPTIONS                                        :Ãtlátszósági beállítások
 STR_02DF_TOWN_DIRECTORY                                         :Városlista
 STR_TOWN_POPULATION                                             :{BLACK}Világnépesség: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}{COMMA}. látkép
@@ -1110,6 +1114,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Új útvonalkereső (NPF, felülbírálja az NTP-t): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Tömegszorzó tehervonatoknak (szimulációs célból): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Ãthajtható állomások engedélyezése városi utakra: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Érintkező állomások építésének engedélyezése: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Mindig engedélyezze a kis repülőtereket: {ORANGE}{STRING}
 
@@ -1150,6 +1155,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Helikopterek automatikus javítása a helikopter-leszállókon: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Tájrendező eszköztár megnyitása a közúti/vasúti/vízi/légi eszköztárakkal: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Egeres mozgáskor a táj a másik irányba mozdul el: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Finomított nézőpont-görgetés: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Építési eszközök használata esetén területinformációk mutatása: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Cégek járműveinek mutatása: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Egyikét sem
@@ -1161,6 +1167,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Térkép mozgatás
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Ki
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Scrollgomb sebessége a térképen: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatikus pause-mode új játék esetén: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Továbbfejlesztett járműlista használata: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maximum vonat játékosonként: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maximum közúti jármű játékosonként: {ORANGE}{STRING}
@@ -1194,12 +1202,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Másik cégekből részvényt lehet vásárolni
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Amikor megragadom helyezzen lámpákat minden {ORANGE}{STRING}. mezőre
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatikusan szemafor épüljön eddig: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}A "nincs több út" városkinézeti séma a pályaszerkesztőben nem elérhető
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Válassz városi úthálózat-sémát: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :nincs több út
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :alapértelmezett
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :jobb utak
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2-es háló
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3-as háló
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}A fő eszközsor helye: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Balra
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Középen
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Jobbra
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Ablakigazítás kiterjedése: {ORANGE}{STRING} képpont
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Ablakigazítás kiterjedése: {ORANGE}letiltva
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Város növekedési sebesség: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Nincs
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Lassú
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normális
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Gyors
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Nagyon gyors
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Dupla gyorsan növekvő városok aránya: {ORANGE}{STRING} városból 1
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Dupla gyorsan növekvő városok aránya: {ORANGE}Nincsennek
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Kezdeti városméret-szorzó: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Megjelenítés
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Építkezés
@@ -1630,6 +1656,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Vasúti sin előrejelző szemaforral
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Vasúti sin kijáratjelző szemaforral
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Vasúti sin vegyes szemaforral
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Előbb a vasútállomást le kell rombolni
 
 
 
@@ -1637,22 +1664,37 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Előbb le kell rombolnod az utat
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Útkarbantartás folyamatban
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Útépítés
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Villamospálya építés
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Közúti híd építése
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Nem építhetsz ide utat...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Nem lehet villamossínt építeni itt...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Nem rombolhatod le innen az utat...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Nem lehet villamossínt eltávolítani innen...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Garázs helyzete
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Villamos-depó iránya
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Nem építhetsz ide garázst...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Nem lehet villamos-depót építeni ide...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Nem építhetsz ide buszmegállót...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Nem építhetsz ide teherautó-rakodóhelyet...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Nem lehet villamos utasvárót építeni...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Nem lehet tehervillamos-állomást építeni...
 STR_180A_ROAD_CONSTRUCTION                                      :Útépítés
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Villamospálya építés
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Út építése
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Garázs építése (járművek vételére és karbantartására)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Villamos-depó építése (járművek megépítésére és szervizelésére)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Buszmegálló építése
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Teherautó-rakodóhely építése
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Villamos utasváró építése
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Tehervillamos-állomás építése
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Közúti híd építése
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Villamos-híd építése
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Közúti alagút építése
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Villamos-alagút építése
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Építés/felszedés közötti váltás utaknál
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Építő/bontó üzemmód váltása a villamospályákhoz
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Válaszd ki a garázs helyzetét
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Válassz villamos-depó irányt
 STR_1814_ROAD                                                   :Út
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Út lámpákkal
 STR_1816_TREE_LINED_ROAD                                        :Fával szegélyezett út
@@ -1660,6 +1702,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Út/vasút kereszteződés
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Nem távolíthatod el ezt a buszmegállót...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Nem távolíthatod el ezt a teherautó megállót...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Nem lehet a villamos utasvárót eltávolítani...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Nem lehet a tehervillamos-állomást eltávolítani
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Városok
@@ -1824,8 +1868,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} most már elfogad {STRING} és {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Buszmegálló helyzete
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Rakodóhely helyzete
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Utasszállító villamos irány
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Teherszállító-villamos irány
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Előbb le kell rombolnod a buszmegállót
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Előbb le kell rombolnod a teherautó-rakodóhelyet
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Előbb le kell rombolni a villamos utasvárót
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Előbb le kell rombolni a tehervillamos-állomást
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} állomásai - {COMMA}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Nincs -
@@ -1837,6 +1885,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}A vasútállomás hossza
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Buszmegálló helyzetének kiválasztása
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Teherautó-rakodó helyzetének kiválasztása
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Válassz villamos utasváró irányt
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Válassz tehervillamos-állomás irányt
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}A fő nézetet az állomásra állítja
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Vélemény megmutatása az állomásról
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Az állomás nevének megváltoztatása
@@ -2094,6 +2144,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING}i helikopter-leszálló
 STR_SV_STNAME_FOREST                                            :{STRING}i erdőség
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2129,6 +2181,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Egyiksem
+STR_NUM_VERY_LOW                                                :Nagyon kevés
 STR_6816_LOW                                                    :Kevés
 STR_6817_NORMAL                                                 :Normál
 STR_6818_HIGH                                                   :Sok
@@ -2321,6 +2374,8 @@
 STR_LIVERY_HELICOPTER                                           :Helikopter
 STR_LIVERY_SMALL_PLANE                                          :Kis repülőgép
 STR_LIVERY_LARGE_PLANE                                          :Nagy repülőgép
+STR_LIVERY_PASSENGER_TRAM                                       :Utasszállító villamos
+STR_LIVERY_FREIGHT_TRAM                                         :Teherszállító villamos
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Ãltalános szinsémák mutatása
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Vonat szinsémák mutatása
@@ -2794,6 +2849,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Közúti jármű átnevezése
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Az emberek ünnepelnek . . .{}Megérkezett az első busz {STATION} állomásra!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Az emberek ünnepelnek . . .{}Megérkezett az első teherautó {STATION} állomásra!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}A lakosság ünnepel . . .{}Első utasszállító villamos megérkezett {STATION} állomásra!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}A lakosság ünnepel . . .{}Első teherszállító-villamos megérkezett {STATION} állomásra!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Közúti baleset!{}A vezető meghalt a vonattal való ütközéskor
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Közúti baleset!{}{COMMA} ember meghalt a vonattal való ütközéskor
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Nem fordíthatod vissza a járművet...
@@ -3078,6 +3135,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Biztosan eladod a depóban lévő összes járművet?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Rossz depó típus
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Összes depóbeli vonat eladása
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Összes depóbeli jármű eladása
@@ -3115,7 +3173,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Az automatikus cserénél a szerelvény hosszának a megtartása kocsik lekapcsolásával (előröl kezdve), ha a csere után a mozdony hosszabb lenne.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Lecserél: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} KISÉRLETI TULAJDONSÃG {}Váltás a mozdony és a vasúti-kocsi cserélÅ‘ ablak között.{}A vagonok cseréje csak akkor történik meg, ha az új vagon átalakítható ugyanolyan típusú teher szállítására. Ez minden vagoncserénél ellenÅ‘rzÅ‘dik.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}A mozdony így nem építhető meg
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}A jármű nem elérhető.
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}A jármű nem elérhető.
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}A hajó nem elérhető.
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}A repülő nem elérhető.
 
 STR_ENGINES                                                     :Mozdonyok
 STR_WAGONS                                                      :Vagonok
@@ -3191,6 +3252,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Kezdő év megváltoztatása
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Ãtméretezési figyelmeztetés
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}A forrás térkép túlságosan nagy mértékű átméretezése nem javasolt. Folytatod mégis?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Városkinézeti figyelmeztetés
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}A "nincs több út" városkinézeti séma ellenjavallott. Biztosan folytatod a generálást?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Magasságtérkép neve:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Méret: {ORANGE}{NUM} x {NUM}
@@ -3251,3 +3314,53 @@
 
 ########
 
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Szállítási díj: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...ez egy városi tulajdonú út
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...az út másik irányba vezet
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Ãtlátszósági beállítások
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Ãtkapcsolni az állomásjelzésekre
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Ãtkapcsolni a fákra
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Ãtkapcsolni az épületekre
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Ãtkapcsolni az ipari létesítményekre
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Ãtkapcsolni az építhetÅ‘ elemekre (állomások, depók, útipontok és felsÅ‘vezeték)
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Ãtkapcsolni a hidakra
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Ãtkapcsolni egyéb épületekre, mint világítótorony és antennák (esetleg egyéb jövÅ‘beni díszek)
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :{COMMA} csoport
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Összes vonat
+STR_GROUP_ALL_ROADS                                             :Összes közúti jármű
+STR_GROUP_ALL_SHIPS                                             :Összes hajó
+STR_GROUP_ALL_AIRCRAFTS                                         :Összes repülő
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Megosztott jármű hozzáadása
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Összes jármű eltávolítása
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} vonat
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} közúti jármű
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} hajó
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} repülő
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Csoport átnevezése
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}A(z) "{GROUP}" csoport járműveinek lecserélése
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Csoport létrehozás sikertelen...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Csoport törlése sikertelen...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Csoport átnevezése sikertelen...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Csoport járműveinek törlése sikertelen...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Jármű hozzáadása a csoporthoz sikertelen...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Megosztott jármű csoporthoz való hozzáadása sikertelen...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Csoportok - Kattints a csoport nevére a járművek listázásához
+STR_GROUP_CREATE_TIP                                            :{BLACK}Csoport létrehozásához kattints ide
+STR_GROUP_DELETE_TIP                                            :{BLACK}Kijelölt csoport törlése
+STR_GROUP_RENAME_TIP                                            :{BLACK}Kijelölt csoport átnevezése
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Csoport automata csere alóli mentességének beállításához kattints ide
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Idei profit: {GREEN}{CURRENCY} {BLACK}(tavalyi: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Idei profit: {RED}{CURRENCY} {BLACK}(tavalyi: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Idei profit: {GREEN}{CURRENCY} {BLACK}(tavalyi: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Idei profit: {RED}{CURRENCY} {BLACK}(tavalyi: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/icelandic.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/icelandic.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -2989,7 +2989,6 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Heldur lengd lestar með því að fjarlægja vagna (framan frá) ef útskipting dráttarvagna myndi lengja hana.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Skipti út: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} TILRAUNAEIGINLEIKI {}Skipta á milli útskiptiglugga dráttar- og flutningavagna.{}Útskipting vagna fer aðeins fram ef hægt er að breyta nýju vögnunum til að flytja sama farm og þeir gömlu. Það er kannað fyrir hvern vagn þegar útskipting á honum fer fram.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Ekki hægt að smíða dráttarvagn
 
 STR_ENGINES                                                     :Dráttarvagnar
 STR_WAGONS                                                      :Vagnar
--- a/src/lang/italian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/italian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -2,38 +2,41 @@
 ##ownname Italiano
 ##isocode it
 ##plural 0
+##case ms mp fs fp
 ##gender m f
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Fuori dal bordo della mappa
 STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}Troppo vicino al bordo della mappa
-STR_0003_NOT_ENOUGH_CASH_REQUIRES                               :{WHITE}Denaro insufficiente - richiesto {CURRENCY}
+STR_0003_NOT_ENOUGH_CASH_REQUIRES                               :{WHITE}Denaro insufficiente - servono {CURRENCY}
 STR_0004                                                        :{WHITE}{CURRENCY64}
 STR_0005                                                        :{RED}{CURRENCY64}
 STR_EMPTY                                                       :
-STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Richiesto terreno piano
+STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Richiesto terreno pianeggiante
 STR_0008_WAITING                                                :{BLACK}In attesa: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
 STR_000A_EN_ROUTE_FROM                                          :{WHITE}{CARGO}{YELLOW}  (in viaggio da
 STR_000B                                                        :{YELLOW}{STATION})
-STR_000C_ACCEPTS                                                :{BLACK}Accettati: {WHITE}
-STR_000D_ACCEPTS                                                :{BLACK}Accettati: {GOLD}
+STR_000C_ACCEPTS                                                :{BLACK}Accetta: {WHITE}
+STR_000D_ACCEPTS                                                :{BLACK}Accetta: {GOLD}
 STR_000E                                                        :
-STR_000F_PASSENGERS                                             :Passeggeri
-STR_0010_COAL                                                   :Carbone
-STR_0011_MAIL                                                   :Posta
-STR_0012_OIL                                                    :Petrolio
-STR_0013_LIVESTOCK                                              :Bestiame
-STR_0014_GOODS                                                  :Beni
-STR_0015_GRAIN                                                  :Grano
-STR_0016_WOOD                                                   :Legname
-STR_0017_IRON_ORE                                               :Minerali Ferrosi
-STR_0018_STEEL                                                  :Acciaio
-STR_0019_VALUABLES                                              :Valori
-STR_001A_COPPER_ORE                                             :Minerali di Rame
-STR_001B_MAIZE                                                  :Mais
-STR_001C_FRUIT                                                  :Frutta
+STR_000F_PASSENGERS                                             :{G=m}Passeggeri
+STR_0010_COAL                                                   :{G=m}Carbone
+STR_0011_MAIL                                                   :{G=f}Posta
+STR_0012_OIL                                                    :{G=m}Petrolio
+STR_0013_LIVESTOCK                                              :{G=m}Bestiame
+STR_0014_GOODS                                                  :{G=m}Beni
+STR_0015_GRAIN                                                  :{G=m}Grano
+STR_0016_WOOD                                                   :{G=m}Legname
+STR_0017_IRON_ORE                                               :{G=m}Ferro
+STR_0018_STEEL                                                  :{G=m}Acciaio
+STR_0019_VALUABLES                                              :{G=m}Valori
+STR_001A_COPPER_ORE                                             :{G=m}Rame
+STR_001B_MAIZE                                                  :{G=m}Mais
+STR_001C_FRUIT                                                  :{G=f}Frutta
 STR_001D_DIAMONDS                                               :{G=m}Diamanti
 STR_001E_FOOD                                                   :{G=m}Cibo
 STR_001F_PAPER                                                  :{G=f}Carta
@@ -45,14 +48,14 @@
 STR_0025_TOYS                                                   :{G=m}Giocattoli
 STR_0026_CANDY                                                  :{G=f}Caramelle
 STR_0027_COLA                                                   :{G=f}Cola
-STR_0028_COTTON_CANDY                                           :{G=m}Cotone Candito
-STR_0029_BUBBLES                                                :{G=f}Bolle
+STR_0028_COTTON_CANDY                                           :{G=m}Zucchero filato
+STR_0029_BUBBLES                                                :{G=f}Bollicine
 STR_002A_TOFFEE                                                 :{G=m}Toffee
 STR_002B_BATTERIES                                              :{G=f}Batterie
 STR_002C_PLASTIC                                                :{G=f}Plastica
-STR_002D_FIZZY_DRINKS                                           :{G=f}Bibite Frizzanti
+STR_002D_FIZZY_DRINKS                                           :{G=f}Bibite frizzanti
 STR_002E                                                        :
-STR_002F_PASSENGER                                              :{G=m}Passeggero
+STR_002F_PASSENGER                                              :{G=m}Passeggeri
 STR_0030_COAL                                                   :{G=m}Carbone
 STR_0031_MAIL                                                   :{G=f}Posta
 STR_0032_OIL                                                    :{G=m}Petrolio
@@ -60,10 +63,10 @@
 STR_0034_GOODS                                                  :{G=m}Beni
 STR_0035_GRAIN                                                  :{G=m}Grano
 STR_0036_WOOD                                                   :{G=m}Legname
-STR_0037_IRON_ORE                                               :{G=m}Minerale Ferroso
+STR_0037_IRON_ORE                                               :{G=m}Ferro
 STR_0038_STEEL                                                  :{G=m}Acciaio
 STR_0039_VALUABLES                                              :{G=m}Valori
-STR_003A_COPPER_ORE                                             :{G=m}Minerale di Rame
+STR_003A_COPPER_ORE                                             :{G=m}Rame
 STR_003B_MAIZE                                                  :{G=m}Mais
 STR_003C_FRUIT                                                  :{G=f}Frutta
 STR_003D_DIAMOND                                                :{G=m}Diamante
@@ -77,12 +80,12 @@
 STR_0045_TOY                                                    :{G=m}Giocattolo
 STR_0046_CANDY                                                  :{G=f}Caramella
 STR_0047_COLA                                                   :{G=f}Cola
-STR_0048_COTTON_CANDY                                           :{G=m}Cotone Candito
-STR_0049_BUBBLE                                                 :{G=f}Bolla
+STR_0048_COTTON_CANDY                                           :{G=m}Zucchero filato
+STR_0049_BUBBLE                                                 :{G=f}Bollicine
 STR_004A_TOFFEE                                                 :{G=m}Toffee
-STR_004B_BATTERY                                                :{G=f}Batteria
+STR_004B_BATTERY                                                :{G=f}Batterie
 STR_004C_PLASTIC                                                :{G=f}Plastica
-STR_004D_FIZZY_DRINK                                            :{G=f}Bevanda Frizzante
+STR_004D_FIZZY_DRINK                                            :{G=f}Bevande frizzanti
 STR_QUANTITY_NOTHING                                            :
 STR_QUANTITY_PASSENGERS                                         :{COMMA} passegger{P o i}
 STR_QUANTITY_COAL                                               :{WEIGHT} di carbone
@@ -92,63 +95,63 @@
 STR_QUANTITY_GOODS                                              :{COMMA} cass{P a e} di beni
 STR_QUANTITY_GRAIN                                              :{WEIGHT} di grano
 STR_QUANTITY_WOOD                                               :{WEIGHT} di legname
-STR_QUANTITY_IRON_ORE                                           :{WEIGHT} di mineral{P e i} ferros{P o i}
+STR_QUANTITY_IRON_ORE                                           :{WEIGHT} di ferro
 STR_QUANTITY_STEEL                                              :{WEIGHT} di acciaio
 STR_QUANTITY_VALUABLES                                          :{COMMA} bors{P a e} di valori
-STR_QUANTITY_COPPER_ORE                                         :{WEIGHT} di mineral{P e i} di rame
+STR_QUANTITY_COPPER_ORE                                         :{WEIGHT} di rame
 STR_QUANTITY_MAIZE                                              :{WEIGHT} di mais
 STR_QUANTITY_FRUIT                                              :{WEIGHT} di frutta
-STR_QUANTITY_DIAMONDS                                           :{COMMA} bors{P a e} di diamanti
+STR_QUANTITY_DIAMONDS                                           :{COMMA} sacc{P o hi} di diamanti
 STR_QUANTITY_FOOD                                               :{WEIGHT} di cibo
 STR_QUANTITY_PAPER                                              :{WEIGHT} di carta
-STR_QUANTITY_GOLD                                               :{COMMA} bors{P a e} d'oro
+STR_QUANTITY_GOLD                                               :{COMMA} sacc{P o hi} di oro
 STR_QUANTITY_WATER                                              :{VOLUME} di acqua
 STR_QUANTITY_WHEAT                                              :{WEIGHT} di frumento
 STR_QUANTITY_RUBBER                                             :{VOLUME} di gomma
 STR_QUANTITY_SUGAR                                              :{WEIGHT} di zucchero
 STR_QUANTITY_TOYS                                               :{COMMA} giocattol{P o i}
-STR_QUANTITY_SWEETS                                             :{COMMA} bust{P a e} di caramelle
-STR_QUANTITY_COLA                                               :{VOLUME} di cola
-STR_QUANTITY_CANDYFLOSS                                         :{WEIGHT} di cotone candito
-STR_QUANTITY_BUBBLES                                            :{COMMA} boll{P a e}
+STR_QUANTITY_SWEETS                                             :{COMMA} sacc{P o hi} di caramelle
+STR_QUANTITY_COLA                                               :{VOLUME} di Cola
+STR_QUANTITY_CANDYFLOSS                                         :{WEIGHT} di zucchero filato
+STR_QUANTITY_BUBBLES                                            :{COMMA} bollicin{P a e}
 STR_QUANTITY_TOFFEE                                             :{WEIGHT} di toffee
 STR_QUANTITY_BATTERIES                                          :{COMMA} batteri{P a e}
 STR_QUANTITY_PLASTIC                                            :{VOLUME} di plastica
-STR_QUANTITY_FIZZY_DRINKS                                       :{COMMA} bibite frizzanti
+STR_QUANTITY_FIZZY_DRINKS                                       :{COMMA} bibit{P a e} frizzant{P e i}
 STR_ABBREV_NOTHING                                              :
-STR_ABBREV_PASSENGERS                                           :{TINYFONT}PS
-STR_ABBREV_COAL                                                 :{TINYFONT}CL
-STR_ABBREV_MAIL                                                 :{TINYFONT}ML
-STR_ABBREV_OIL                                                  :{TINYFONT}OL
-STR_ABBREV_LIVESTOCK                                            :{TINYFONT}LV
-STR_ABBREV_GOODS                                                :{TINYFONT}GD
+STR_ABBREV_PASSENGERS                                           :{TINYFONT}PA
+STR_ABBREV_COAL                                                 :{TINYFONT}CA
+STR_ABBREV_MAIL                                                 :{TINYFONT}PT
+STR_ABBREV_OIL                                                  :{TINYFONT}PE
+STR_ABBREV_LIVESTOCK                                            :{TINYFONT}BE
+STR_ABBREV_GOODS                                                :{TINYFONT}BN
 STR_ABBREV_GRAIN                                                :{TINYFONT}GR
-STR_ABBREV_WOOD                                                 :{TINYFONT}WD
-STR_ABBREV_IRON_ORE                                             :{TINYFONT}OR
-STR_ABBREV_STEEL                                                :{TINYFONT}ST
-STR_ABBREV_VALUABLES                                            :{TINYFONT}VL
-STR_ABBREV_COPPER_ORE                                           :{TINYFONT}CO
-STR_ABBREV_MAIZE                                                :{TINYFONT}MZ
+STR_ABBREV_WOOD                                                 :{TINYFONT}LE
+STR_ABBREV_IRON_ORE                                             :{TINYFONT}FE
+STR_ABBREV_STEEL                                                :{TINYFONT}AC
+STR_ABBREV_VALUABLES                                            :{TINYFONT}VA
+STR_ABBREV_COPPER_ORE                                           :{TINYFONT}RM
+STR_ABBREV_MAIZE                                                :{TINYFONT}MA
 STR_ABBREV_FRUIT                                                :{TINYFONT}FT
 STR_ABBREV_DIAMONDS                                             :{TINYFONT}DM
-STR_ABBREV_FOOD                                                 :{TINYFONT}FD
-STR_ABBREV_PAPER                                                :{TINYFONT}PR
-STR_ABBREV_GOLD                                                 :{TINYFONT}GD
-STR_ABBREV_WATER                                                :{TINYFONT}WR
-STR_ABBREV_WHEAT                                                :{TINYFONT}WH
-STR_ABBREV_RUBBER                                               :{TINYFONT}RB
-STR_ABBREV_SUGAR                                                :{TINYFONT}SG
-STR_ABBREV_TOYS                                                 :{TINYFONT}TY
-STR_ABBREV_SWEETS                                               :{TINYFONT}SW
+STR_ABBREV_FOOD                                                 :{TINYFONT}CB
+STR_ABBREV_PAPER                                                :{TINYFONT}CT
+STR_ABBREV_GOLD                                                 :{TINYFONT}OR
+STR_ABBREV_WATER                                                :{TINYFONT}AQ
+STR_ABBREV_WHEAT                                                :{TINYFONT}FR
+STR_ABBREV_RUBBER                                               :{TINYFONT}GM
+STR_ABBREV_SUGAR                                                :{TINYFONT}ZU
+STR_ABBREV_TOYS                                                 :{TINYFONT}GI
+STR_ABBREV_SWEETS                                               :{TINYFONT}CM
 STR_ABBREV_COLA                                                 :{TINYFONT}CL
-STR_ABBREV_CANDYFLOSS                                           :{TINYFONT}CF
-STR_ABBREV_BUBBLES                                              :{TINYFONT}BU
+STR_ABBREV_CANDYFLOSS                                           :{TINYFONT}ZF
+STR_ABBREV_BUBBLES                                              :{TINYFONT}BO
 STR_ABBREV_TOFFEE                                               :{TINYFONT}TF
 STR_ABBREV_BATTERIES                                            :{TINYFONT}BA
 STR_ABBREV_PLASTIC                                              :{TINYFONT}PL
-STR_ABBREV_FIZZY_DRINKS                                         :{TINYFONT}FZ
+STR_ABBREV_FIZZY_DRINKS                                         :{TINYFONT}BF
 STR_ABBREV_NONE                                                 :{TINYFONT}NO
-STR_ABBREV_ALL                                                  :{TINYFONT}ALL
+STR_ABBREV_ALL                                                  :{TINYFONT}TUT
 STR_00AE                                                        :{WHITE}{DATE_SHORT}
 STR_00AF                                                        :{WHITE}{DATE_LONG}
 STR_00B0_MAP                                                    :{WHITE}Mappa - {STRING}
@@ -156,19 +159,19 @@
 STR_00B2_MESSAGE                                                :{YELLOW}Messaggio
 STR_00B3_MESSAGE_FROM                                           :{YELLOW}Messaggio da {STRING}
 STR_POPUP_CAUTION_CAPTION                                       :{WHITE}Attenzione!
-STR_00B4_CAN_T_DO_THIS                                          :{WHITE}Non puoi fare questo....
-STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Non puoi ripulire l'area....
-STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Copyright Originale{COPYRIGHT} 1995 Chris Sawyer, Tutti i diritti riservati
+STR_00B4_CAN_T_DO_THIS                                          :{WHITE}Non è possibile farlo....
+STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Impossibile ripulire l'area....
+STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Copyright originale {COPYRIGHT} 1995 Chris Sawyer, Tutti i diritti riservati
 STR_00B7_VERSION                                                :{BLACK}OpenTTD versione {REV}
 STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 Il team OpenTTD
-STR_TRANSLATED_BY                                               :{BLACK}  Traduttore/i - Sidew e altri, senza nome,  che mi hanno preceduto.
+STR_TRANSLATED_BY                                               :{BLACK}  Traduttori - Sidew, LorenzoDV e altri, senza nome, che ci hanno preceduti.
 
 STR_00C5                                                        :{BLACK}{CROSS}
 STR_00C6                                                        :{SILVER}{CROSS}
 STR_00C7_QUIT                                                   :{WHITE}Esci
 STR_00C8_YES                                                    :{BLACK}Sì
 STR_00C9_NO                                                     :{BLACK}No
-STR_00CA_ARE_YOU_SURE_YOU_WANT_TO                               :{YELLOW}Sei sicuro di voler uscire dal gioco e tornare a {STRING}?
+STR_00CA_ARE_YOU_SURE_YOU_WANT_TO                               :{YELLOW}Si è sicuri di voler abbandonare la partita e tornare a {STRING}?
 STR_00CB_1                                                      :{BLACK}1
 STR_00CC_2                                                      :{BLACK}2
 STR_00CD_3                                                      :{BLACK}3
@@ -186,16 +189,16 @@
 STR_00D9_BLUE                                                   :Blu
 STR_00DA_CREAM                                                  :Crema
 STR_00DB_MAUVE                                                  :Malva
-STR_00DC_PURPLE                                                 :Porpora
-STR_00DD_ORANGE                                                 :Arancione
+STR_00DC_PURPLE                                                 :Viola
+STR_00DD_ORANGE                                                 :Arancio
 STR_00DE_BROWN                                                  :Marrone
 STR_00DF_GREY                                                   :Grigio
 STR_00E0_WHITE                                                  :Bianco
 STR_00E1_TOO_MANY_VEHICLES_IN_GAME                              :{WHITE}Troppi veicoli nel gioco
 STR_00E2                                                        :{BLACK}{COMMA}
 STR_00E3                                                        :{RED}{COMMA}
-STR_00E4_LOCATION                                               :{BLACK}Locazione
-STR_00E5_CONTOURS                                               :Contorni
+STR_00E4_LOCATION                                               :{BLACK}Posizione
+STR_00E5_CONTOURS                                               :Territorio
 STR_00E6_VEHICLES                                               :Veicoli
 STR_00E7_INDUSTRIES                                             :Industrie
 STR_00E8_ROUTES                                                 :Percorsi
@@ -212,56 +215,56 @@
 STR_00F3_400M                                                   :{BLACK}{TINYFONT}400m
 STR_00F4_500M                                                   :{BLACK}{TINYFONT}500m
 STR_00F5_TRAINS                                                 :{BLACK}{TINYFONT}Treni
-STR_00F6_ROAD_VEHICLES                                          :{BLACK}{TINYFONT}Veicoli Stradali
+STR_00F6_ROAD_VEHICLES                                          :{BLACK}{TINYFONT}Automezzi
 STR_00F7_SHIPS                                                  :{BLACK}{TINYFONT}Navi
-STR_00F8_AIRCRAFT                                               :{BLACK}{TINYFONT}Aereo
+STR_00F8_AIRCRAFT                                               :{BLACK}{TINYFONT}Aeromobili
 STR_00F9_TRANSPORT_ROUTES                                       :{BLACK}{TINYFONT}Percorsi di trasporto
-STR_00FA_COAL_MINE                                              :{BLACK}{TINYFONT}Miniera di Carbone
-STR_00FB_POWER_STATION                                          :{BLACK}{TINYFONT}Centrale Elettrica
+STR_00FA_COAL_MINE                                              :{BLACK}{TINYFONT}Miniera di carbone
+STR_00FB_POWER_STATION                                          :{BLACK}{TINYFONT}Centrale elettrica
 STR_00FC_FOREST                                                 :{BLACK}{TINYFONT}Foresta
 STR_00FD_SAWMILL                                                :{BLACK}{TINYFONT}Segheria
 STR_00FE_OIL_REFINERY                                           :{BLACK}{TINYFONT}Raffineria
 STR_00FF_FARM                                                   :{BLACK}{TINYFONT}Fattoria
 STR_0100_FACTORY                                                :{BLACK}{TINYFONT}Fabbrica
-STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}Stamperia
-STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Pozzi Petroliferi
-STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Miniera di Ferro
+STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}Tipografia
+STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Pozzo petrolifero
+STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Miniera di ferro
 STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}Acciaieria
 STR_0105_BANK                                                   :{BLACK}{TINYFONT}Banca
 STR_0106_PAPER_MILL                                             :{BLACK}{TINYFONT}Cartiera
-STR_0107_GOLD_MINE                                              :{BLACK}{TINYFONT}Miniera d'Oro
-STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}Azienda Alimentare
-STR_0109_DIAMOND_MINE                                           :{BLACK}{TINYFONT}Miniera di Diamanti
-STR_010A_COPPER_ORE_MINE                                        :{BLACK}{TINYFONT}Miniera di Rame
-STR_010B_FRUIT_PLANTATION                                       :{BLACK}{TINYFONT}Piantagione di Frutta
-STR_010C_RUBBER_PLANTATION                                      :{BLACK}{TINYFONT}Piantagione di Gomma
-STR_010D_WATER_SUPPLY                                           :{BLACK}{TINYFONT}Falda Acquifera
-STR_010E_WATER_TOWER                                            :{BLACK}{TINYFONT}Cisterna d'Acqua
+STR_0107_GOLD_MINE                                              :{BLACK}{TINYFONT}Miniera d'oro
+STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}Azienda alimentare
+STR_0109_DIAMOND_MINE                                           :{BLACK}{TINYFONT}Miniera di diamanti
+STR_010A_COPPER_ORE_MINE                                        :{BLACK}{TINYFONT}Miniera di rame
+STR_010B_FRUIT_PLANTATION                                       :{BLACK}{TINYFONT}Piantagione di frutta
+STR_010C_RUBBER_PLANTATION                                      :{BLACK}{TINYFONT}Piantagione di gomma
+STR_010D_WATER_SUPPLY                                           :{BLACK}{TINYFONT}Falda acquifera
+STR_010E_WATER_TOWER                                            :{BLACK}{TINYFONT}Cisterna idrica
 STR_010F_LUMBER_MILL                                            :{BLACK}{TINYFONT}Falegnameria
-STR_0110_COTTON_CANDY_FOREST                                    :{BLACK}{TINYFONT}Foresta di Cotone Candito
-STR_0111_CANDY_FACTORY                                          :{BLACK}{TINYFONT}Fabbrica di Caramelle
-STR_0112_BATTERY_FARM                                           :{BLACK}{TINYFONT}Fattoria delle Batterie
-STR_0113_COLA_WELLS                                             :{BLACK}{TINYFONT}Pozzi di Cola
-STR_0114_TOY_SHOP                                               :{BLACK}{TINYFONT}Negozio di Giocattoli
-STR_0115_TOY_FACTORY                                            :{BLACK}{TINYFONT}Fabbrica di Giocattoli
-STR_0116_PLASTIC_FOUNTAINS                                      :{BLACK}{TINYFONT}Sorgenti di Plastica
-STR_0117_FIZZY_DRINK_FACTORY                                    :{BLACK}{TINYFONT}Fabbrica di Bevande Friz.
-STR_0118_BUBBLE_GENERATOR                                       :{BLACK}{TINYFONT}Generatore di Bolle
-STR_0119_TOFFEE_QUARRY                                          :{BLACK}{TINYFONT}Estrattore di Toffee
-STR_011A_SUGAR_MINE                                             :{BLACK}{TINYFONT}Miniera di Zucchero
-STR_011B_RAILROAD_STATION                                       :{BLACK}{TINYFONT}Stazione Ferroviaria
-STR_011C_TRUCK_LOADING_BAY                                      :{BLACK}{TINYFONT}Area di carico per Camion
-STR_011D_BUS_STATION                                            :{BLACK}{TINYFONT}Stazione Bus
+STR_0110_COTTON_CANDY_FOREST                                    :{BLACK}{TINYFONT}Foresta di zucchero filato
+STR_0111_CANDY_FACTORY                                          :{BLACK}{TINYFONT}Fabbrica di caramelle
+STR_0112_BATTERY_FARM                                           :{BLACK}{TINYFONT}Fattoria delle batterie
+STR_0113_COLA_WELLS                                             :{BLACK}{TINYFONT}Pozzo di Cola
+STR_0114_TOY_SHOP                                               :{BLACK}{TINYFONT}Negozio di giocattoli
+STR_0115_TOY_FACTORY                                            :{BLACK}{TINYFONT}Fabbrica di giocattoli
+STR_0116_PLASTIC_FOUNTAINS                                      :{BLACK}{TINYFONT}Sorgente di plastica
+STR_0117_FIZZY_DRINK_FACTORY                                    :{BLACK}{TINYFONT}Fabbrica di bibite friz.
+STR_0118_BUBBLE_GENERATOR                                       :{BLACK}{TINYFONT}Generatore di bollicine
+STR_0119_TOFFEE_QUARRY                                          :{BLACK}{TINYFONT}Cava di toffee
+STR_011A_SUGAR_MINE                                             :{BLACK}{TINYFONT}Miniera di zucchero
+STR_011B_RAILROAD_STATION                                       :{BLACK}{TINYFONT}Stazione ferroviaria
+STR_011C_TRUCK_LOADING_BAY                                      :{BLACK}{TINYFONT}Area di carico camion
+STR_011D_BUS_STATION                                            :{BLACK}{TINYFONT}Stazione autobus
 STR_011E_AIRPORT_HELIPORT                                       :{BLACK}{TINYFONT}Aeroporto/Eliporto
 STR_011F_DOCK                                                   :{BLACK}{TINYFONT}Molo
-STR_0120_ROUGH_LAND                                             :{BLACK}{TINYFONT}Terreno Accidentato
-STR_0121_GRASS_LAND                                             :{BLACK}{TINYFONT}Terreno Erboso
-STR_0122_BARE_LAND                                              :{BLACK}{TINYFONT}Terreno Spoglio
+STR_0120_ROUGH_LAND                                             :{BLACK}{TINYFONT}Terreno accidentato
+STR_0121_GRASS_LAND                                             :{BLACK}{TINYFONT}Terreno erboso
+STR_0122_BARE_LAND                                              :{BLACK}{TINYFONT}Terreno spoglio
 STR_0123_FIELDS                                                 :{BLACK}{TINYFONT}Campi
 STR_0124_TREES                                                  :{BLACK}{TINYFONT}Alberi
 STR_0125_ROCKS                                                  :{BLACK}{TINYFONT}Roccie
 STR_0126_WATER                                                  :{BLACK}{TINYFONT}Acqua
-STR_0127_NO_OWNER                                               :{BLACK}{TINYFONT}Senza Proprietario
+STR_0127_NO_OWNER                                               :{BLACK}{TINYFONT}Senza proprietario
 STR_0128_TOWNS                                                  :{BLACK}{TINYFONT}Città
 STR_0129_INDUSTRIES                                             :{BLACK}{TINYFONT}Industrie
 STR_012A_DESERT                                                 :{BLACK}{TINYFONT}Deserto
@@ -285,19 +288,19 @@
 
 STR_013B_OWNED_BY                                               :{WHITE}...posseduto da {STRING}
 STR_013C_CARGO                                                  :{BLACK}Carico
-STR_013D_INFORMATION                                            :{BLACK}Informazione
+STR_013D_INFORMATION                                            :{BLACK}Informazioni
 STR_013E_CAPACITIES                                             :{BLACK}Capienza
 STR_013E_TOTAL_CARGO                                            :{BLACK}Carico totale
 STR_013F_CAPACITY                                               :{BLACK}Capacità: {LTBLUE}{CARGO}
 STR_CAPACITY_MULT                                               :{BLACK}Capacità: {LTBLUE}{CARGO} (x{NUM})
-STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}Carico totale (capacità) di questo treno:
+STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}Capacità di carico totale di questo treno:
 STR_013F_TOTAL_CAPACITY                                         :{LTBLUE}- {CARGO} ({SHORTCARGO})
 STR_TOTAL_CAPACITY_MULT                                         :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
-STR_0140_NEW_GAME                                               :{BLACK}Nuovo Gioco
-STR_0141_LOAD_GAME                                              :{BLACK}Carica Gioco
+STR_0140_NEW_GAME                                               :{BLACK}Nuova partita
+STR_0141_LOAD_GAME                                              :{BLACK}Carica partita
 STR_SINGLE_PLAYER                                               :{BLACK}Giocatore singolo
-STR_MULTIPLAYER                                                 :{BLACK}Multiplayer
-STR_SCENARIO_EDITOR                                             :{BLACK}Editore di Scenari
+STR_MULTIPLAYER                                                 :{BLACK}Multigiocatore
+STR_SCENARIO_EDITOR                                             :{BLACK}Editor di scenari
 
 STR_64                                                          :64
 STR_128                                                         :128
@@ -305,7 +308,7 @@
 STR_512                                                         :512
 STR_1024                                                        :1024
 STR_2048                                                        :2048
-STR_MAPSIZE                                                     :{BLACK}Dimensioni mappa:
+STR_MAPSIZE                                                     :{BLACK}Dimensione mappa:
 STR_BY                                                          :{BLACK}*
 STR_0148_GAME_OPTIONS                                           :{BLACK}Opzioni di gioco
 
@@ -314,8 +317,8 @@
 STR_0152_TOWN_DIRECTORY                                         :Elenco città
 STR_0153_SUBSIDIES                                              :Sussidi
 
-STR_UNITS_IMPERIAL                                              :Imperiale
-STR_UNITS_METRIC                                                :Metrico
+STR_UNITS_IMPERIAL                                              :Imperiali
+STR_UNITS_METRIC                                                :Metriche
 STR_UNITS_SI                                                    :SI
 
 STR_UNITS_VELOCITY_IMPERIAL                                     :{COMMA} mph
@@ -343,18 +346,18 @@
 STR_UNITS_VOLUME_LONG_SI                                        :{COMMA} m³
 
 STR_UNITS_FORCE_IMPERIAL                                        :{COMMA}x10³ lbf
-STR_UNITS_FORCE_METRIC                                          :{COMMA} ton. forza
+STR_UNITS_FORCE_METRIC                                          :{COMMA} tonnellat{P a e} forza
 STR_UNITS_FORCE_SI                                              :{COMMA} kN
 
 ############ range for menu starts
 STR_0154_OPERATING_PROFIT_GRAPH                                 :Grafico profitto operativo
 STR_0155_INCOME_GRAPH                                           :Grafico incassi
-STR_0156_DELIVERED_CARGO_GRAPH                                  :Grafico merce consegnata
+STR_0156_DELIVERED_CARGO_GRAPH                                  :Grafico merci consegnate
 STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Grafico storico prestazioni
-STR_0158_COMPANY_VALUE_GRAPH                                    :Grafico valore società
-STR_0159_CARGO_PAYMENT_RATES                                    :Grafico % pagamento merce
+STR_0158_COMPANY_VALUE_GRAPH                                    :Grafico valore compagnie
+STR_0159_CARGO_PAYMENT_RATES                                    :Grafico tariffe merci
 STR_015A_COMPANY_LEAGUE_TABLE                                   :Classifica società
-STR_PERFORMANCE_DETAIL_MENU                                     :Dettagli prestazionali
+STR_PERFORMANCE_DETAIL_MENU                                     :Valutazione dettagliata prestazioni
 ############ range for menu ends
 
 STR_015B_OPENTTD                                                :{WHITE}Informazioni su OpenTTD
@@ -362,10 +365,10 @@
 STR_015D_LOAD_GAME                                              :Carica partita
 STR_015E_QUIT_GAME                                              :Abbandona partita
 STR_015F_QUIT                                                   :Esci
-STR_ABANDON_GAME_QUERY                                          :{YELLOW}Sei sicuro di voler abbandonare la partita in corso?
+STR_ABANDON_GAME_QUERY                                          :{YELLOW}Si è sicuri di voler abbandonare la partita in corso?
 STR_0161_QUIT_GAME                                              :{WHITE}Abbandona partita
-STR_SORT_ORDER_TIP                                              :{BLACK}Seleziona ordinamento (discendente/ascendente)
-STR_SORT_CRITERIA_TIP                                           :{BLACK}Seleziona il criterio d'ordinamento
+STR_SORT_ORDER_TIP                                              :{BLACK}Seleziona l'ordinamento (discendente/ascendente)
+STR_SORT_CRITERIA_TIP                                           :{BLACK}Seleziona il criterio di ordinamento
 STR_SORT_BY                                                     :{BLACK}Ordina per
 
 STR_SORT_BY_POPULATION                                          :{BLACK}Popolazione
@@ -380,36 +383,36 @@
 STR_SORT_BY_PROFIT_THIS_YEAR                                    :Profitto di quest'anno
 STR_SORT_BY_AGE                                                 :Età
 STR_SORT_BY_RELIABILITY                                         :Affidabilità
-STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :Tot. capacità per tipo di carico
+STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :Capacità per tipo di carico
 STR_SORT_BY_MAX_SPEED                                           :Velocità massima
 STR_SORT_BY_MODEL                                               :Modello
 STR_SORT_BY_VALUE                                               :Valore
 STR_SORT_BY_FACILITY                                            :Tipo di stazione
-STR_SORT_BY_WAITING                                             :Valore merce in attesa
-STR_SORT_BY_RATING_MAX                                          :Rating di merce
+STR_SORT_BY_WAITING                                             :Merci in attesa
+STR_SORT_BY_RATING_MAX                                          :Valutazione servizi
 STR_ENGINE_SORT_ENGINE_ID                                       :EngineID (ord. classico)
 STR_ENGINE_SORT_COST                                            :Costo
 STR_ENGINE_SORT_POWER                                           :Potenza
-STR_ENGINE_SORT_INTRO_DATE                                      :Data Introduzione
-STR_ENGINE_SORT_RUNNING_COST                                    :Costi di uso
-STR_ENGINE_SORT_POWER_VS_RUNNING_COST                           :Potenza/Costi di uso
-STR_ENGINE_SORT_CARGO_CAPACITY                                  :Capacità Cargo
+STR_ENGINE_SORT_INTRO_DATE                                      :Data introduzione
+STR_ENGINE_SORT_RUNNING_COST                                    :Costo d'esercizio
+STR_ENGINE_SORT_POWER_VS_RUNNING_COST                           :Potenza / Costo d'esercizio
+STR_ENGINE_SORT_CARGO_CAPACITY                                  :Capacità di carico
 STR_NO_WAITING_CARGO                                            :{BLACK}Non c'è nessun tipo di merce in attesa
 STR_SELECT_ALL_FACILITIES                                       :{BLACK}Seleziona tuti i fabbricati
 STR_SELECT_ALL_TYPES                                            :{BLACK}Seleziona tutti i tipi di merce (comprese le merci non in attesa)
-STR_AVAILABLE_TRAINS                                            :{BLACK}Treni Disponibili
-STR_AVAILABLE_ROAD_VEHICLES                                     :{BLACK}Veicoli Disponibili
-STR_AVAILABLE_SHIPS                                             :{BLACK}Navi Disponibili
-STR_AVAILABLE_AIRCRAFT                                          :{BLACK}Aerei Disponibili
-STR_AVAILABLE_ENGINES_TIP                                       :{BLACK}Mostra una lista di motrici disponibili per quel tipo di veicolo
-STR_MANAGE_LIST                                                 :{BLACK}Gestisci lista
-STR_MANAGE_LIST_TIP                                             :{BLACK}Manda istruzioni a tutti i veicoli in questa lista
-STR_REPLACE_VEHICLES                                            :Rimpiazza Veicoli
+STR_AVAILABLE_TRAINS                                            :{BLACK}Treni disponibili
+STR_AVAILABLE_ROAD_VEHICLES                                     :{BLACK}Automezzi disponibili
+STR_AVAILABLE_SHIPS                                             :{BLACK}Navi disponibili
+STR_AVAILABLE_AIRCRAFT                                          :{BLACK}Aeromobili disponibili
+STR_AVAILABLE_ENGINES_TIP                                       :{BLACK}Mostra un elenco di veicoli disponibili in questa categoria di mezzi di trasporto
+STR_MANAGE_LIST                                                 :{BLACK}Gestione veicoli
+STR_MANAGE_LIST_TIP                                             :{BLACK}Invia istruzioni a tutti i veicoli di questo elenco
+STR_REPLACE_VEHICLES                                            :Rimpiazza veicoli
 STR_SEND_TRAIN_TO_DEPOT                                         :Manda al deposito
 STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :Manda al deposito
 STR_SEND_SHIP_TO_DEPOT                                          :Manda al deposito
 STR_SEND_AIRCRAFT_TO_HANGAR                                     :Manda all'hangar
-STR_SEND_FOR_SERVICING                                          :Manda per manutenzione
+STR_SEND_FOR_SERVICING                                          :Manutenzione
 
 ############ range for months starts
 STR_0162_JAN                                                    :Gen
@@ -430,48 +433,48 @@
 STR_016F                                                        :{TINYFONT}{STRING}{} {STRING}{}{NUM}
 STR_0170                                                        :{TINYFONT}{STRING}-
 STR_0171_PAUSE_GAME                                             :{BLACK}Pausa
-STR_0172_SAVE_GAME_ABANDON_GAME                                 :{BLACK}Salva partita, abandona la partita, esci
-STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra elenco delle stazioni delle società
-STR_0174_DISPLAY_MAP                                            :{BLACK}Mostra mappa
-STR_0175_DISPLAY_MAP_TOWN_DIRECTORY                             :{BLACK}Mostra mappa, elenco città
-STR_0176_DISPLAY_TOWN_DIRECTORY                                 :{BLACK}Mostra elenco città
-STR_0177_DISPLAY_COMPANY_FINANCES                               :{BLACK}Mostra info finanziarie delle società
-STR_0178_DISPLAY_COMPANY_GENERAL                                :{BLACK}Mostra info generali sulle società
-STR_0179_DISPLAY_GRAPHS                                         :{BLACK}Mostra grafici
-STR_017A_DISPLAY_COMPANY_LEAGUE                                 :{BLACK}Mostra classifica della società
-STR_017B_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra elenco dei treni della società
-STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra elenco dei veicoli stradali della società
-STR_017D_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra elenco delle navi della società
-STR_017E_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra lista degli aerei della società
-STR_017F_ZOOM_THE_VIEW_IN                                       :{BLACK}Avvicina visuale
-STR_0180_ZOOM_THE_VIEW_OUT                                      :{BLACK}Allontana visuale
+STR_0172_SAVE_GAME_ABANDON_GAME                                 :{BLACK}Salva la partita, abandona la partita, esci
+STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra l'elenco delle stazioni di una compagnia
+STR_0174_DISPLAY_MAP                                            :{BLACK}Mostra la mappa
+STR_0175_DISPLAY_MAP_TOWN_DIRECTORY                             :{BLACK}Mostra la mappa, l'elenco delle città
+STR_0176_DISPLAY_TOWN_DIRECTORY                                 :{BLACK}Mostra l'elenco delle città
+STR_0177_DISPLAY_COMPANY_FINANCES                               :{BLACK}Mostra informazioni finanziare sulle compagnie
+STR_0178_DISPLAY_COMPANY_GENERAL                                :{BLACK}Mostra informazioni generali sulle compagnie
+STR_0179_DISPLAY_GRAPHS                                         :{BLACK}Mostra i grafici
+STR_017A_DISPLAY_COMPANY_LEAGUE                                 :{BLACK}Mostra la classifica delle compagnie
+STR_017B_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra l'elenco dei treni di una compagnia
+STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra l'elenco degli automezzi di una compagnia
+STR_017D_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra l'elenco delle navi di una compagnia
+STR_017E_DISPLAY_LIST_OF_COMPANY                                :{BLACK}Mostra l'elenco degli aeromobili di una compagnia
+STR_017F_ZOOM_THE_VIEW_IN                                       :{BLACK}Zooma la visuale in avanti
+STR_0180_ZOOM_THE_VIEW_OUT                                      :{BLACK}Zooma la visuale indietro
 STR_0181_BUILD_RAILROAD_TRACK                                   :{BLACK}Costruisci ferrovie
 STR_0182_BUILD_ROADS                                            :{BLACK}Costruisci strade
 STR_0183_BUILD_SHIP_DOCKS                                       :{BLACK}Costruisci moli
 STR_0184_BUILD_AIRPORTS                                         :{BLACK}Costruisci aeroporti
-STR_0185_PLANT_TREES_PLACE_SIGNS                                :{BLACK}Pianta alberi, posiziona cartelli ecc...
+STR_0185_PLANT_TREES_PLACE_SIGNS                                :{BLACK}Pianta alberi, posiziona cartelli etc.
 STR_0186_LAND_BLOCK_INFORMATION                                 :{BLACK}Informazioni area terreno
 STR_0187_OPTIONS                                                :{BLACK}Opzioni
 STR_0188                                                        :{BLACK}{SMALLUPARROW}
 STR_0189                                                        :{BLACK}{SMALLDOWNARROW}
-STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}Non puoi cambiare l'intervallo di manutenzione...
-STR_018B_CLOSE_WINDOW                                           :{BLACK}Chiudi finestra
-STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Nome finestra - trascinala per muovere la finestra
-STR_STICKY_BUTTON                                               :{BLACK} Marca questa finestra come inchiudibile con il tasto 'Chiudi TUTTE le finestre'
-STR_RESIZE_BUTTON                                               :{BLACK}Clicca e trascina per ridimensionare la finestra
-STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Clicca qui per saltare alla cartella salva/carica di default
-STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Demolisci edifici ecc... su una casella del terreno
+STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}Impossibile cambiare l'intervallo di manutenzione...
+STR_018B_CLOSE_WINDOW                                           :{BLACK}Chiude la finestra
+STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Titolo della finestra - trascinarlo per muovere la finestra
+STR_STICKY_BUTTON                                               :{BLACK}Marca questa finestra in modo che non venga chiusa quando si preme il tasto 'Chiudi tutte le finestre'
+STR_RESIZE_BUTTON                                               :{BLACK}Fare clic e trascinare per ridimensionare questa finestra
+STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Fare clic qui per spostarsi nella cartella di salvataggio predefinita
+STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Demolisce edifici etc. su un area di terra
 STR_018E_LOWER_A_CORNER_OF_LAND                                 :{BLACK}Abbassa un angolo del terreno
 STR_018F_RAISE_A_CORNER_OF_LAND                                 :{BLACK}Alza un angolo del terreno
-STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Barra di scorrimento - scorre la lista sù/giù
-STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}Barra di scorrimento - scorre la lista sinistra/destra
-STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}Mostra contorni dei terreni sulla mappa
-STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}Mostra veicoli sulla mappa
-STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}Mostra industrie sulla mappa
-STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Mostra percorsi di viaggio sulla mappa
-STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Mostra vegetazione sulla mappa
-STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Mostra proprietari dei terreni sulla mappa
-STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Visualizza nomi delle città sulla mappa (on/off)
+STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Barra di scorrimento - scorre l'elenco su/giù
+STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}Barra di scorrimento - scorre l'elenco a sinistra/destra
+STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}Mostra la conformazione del terreno sulla mappa
+STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}Mostra i veicoli sulla mappa
+STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}Mostra le industrie sulla mappa
+STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Mostra i percorsi di trasporto sulla mappa
+STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Mostra la vegetazione sulla mappa
+STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Mostra i proprietari dei terreni sulla mappa
+STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Attiva/disattiva la visualizzazione dei nomi delle città sulla mappa
 STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Profitto quest'anno: {CURRENCY} (anno scorso: {CURRENCY})
 
 ############ range for service numbers starts
@@ -479,16 +482,16 @@
 STR_AGE_RED                                                     :{RED}{COMMA} ann{P o i} ({COMMA})
 ############ range for service numbers ends
 
-STR_019C_ROAD_VEHICLE                                           :Veicolo stradale
-STR_019D_AIRCRAFT                                               :Aereo
+STR_019C_ROAD_VEHICLE                                           :Automezzo
+STR_019D_AIRCRAFT                                               :Aeromobile
 STR_019E_SHIP                                                   :Nave
 STR_019F_TRAIN                                                  :Treno
 STR_01A0_IS_GETTING_OLD                                         :{WHITE}{STRING} {COMMA} sta diventando vecchio
 STR_01A1_IS_GETTING_VERY_OLD                                    :{WHITE}{STRING} {COMMA} sta diventando molto vecchio
-STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} è troppo vecchio e necessita urgentemente di essere rimpiazzato
-STR_01A3_LAND_AREA_INFORMATION                                  :{WHITE}Info sull'area di terreno
-STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}Costo per ripulirlo: {LTBLUE}N/A
-STR_01A5_COST_TO_CLEAR                                          :{BLACK}Costo per ripulirlo: {LTBLUE}{CURRENCY}
+STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} sta diventando molto vecchio e necessita urgentemente di essere rimpiazzato
+STR_01A3_LAND_AREA_INFORMATION                                  :{WHITE}Informazioni sull'area di terreno
+STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}Costo di demolizione: {LTBLUE}N/A
+STR_01A5_COST_TO_CLEAR                                          :{BLACK}Costo di demolizione: {LTBLUE}{CURRENCY}
 STR_01A6_N_A                                                    :N/A
 STR_01A7_OWNER                                                  :{BLACK}Proprietario: {LTBLUE}{STRING}
 STR_01A8_LOCAL_AUTHORITY                                        :{BLACK}Autorità locale: {LTBLUE}{STRING}
@@ -537,21 +540,21 @@
 STR_01D1_8                                                      :({COMMA}/8 {STRING})
 STR_01D2_JAZZ_JUKEBOX                                           :{WHITE}Jazz Jukebox
 STR_01D3_SOUND_MUSIC                                            :Suoni/musica
-STR_01D4_SHOW_SOUND_MUSIC_WINDOW                                :{BLACK}Mostra finestra suoni/musica
+STR_01D4_SHOW_SOUND_MUSIC_WINDOW                                :{BLACK}Mostra la finestra suoni/musica
 STR_01D5_ALL                                                    :{TINYFONT}Tutte
-STR_01D6_OLD_STYLE                                              :{TINYFONT}Vecchio Stile
-STR_01D7_NEW_STYLE                                              :{TINYFONT}Nuovo Stile
-STR_01D8_EZY_STREET                                             :{TINYFONT}Ezy Street
-STR_01D9_CUSTOM_1                                               :{TINYFONT}Personaliz. 1
-STR_01DA_CUSTOM_2                                               :{TINYFONT}Personaliz. 2
-STR_01DB_MUSIC_VOLUME                                           :{BLACK}{TINYFONT}Volume Musica
-STR_01DC_EFFECTS_VOLUME                                         :{BLACK}{TINYFONT}Volume Effetti
+STR_01D6_OLD_STYLE                                              :{TINYFONT}Vecchio stile
+STR_01D7_NEW_STYLE                                              :{TINYFONT}Nuovo stile
+STR_01D8_EZY_STREET                                             :{TINYFONT}Ezy street
+STR_01D9_CUSTOM_1                                               :{TINYFONT}Personale 1
+STR_01DA_CUSTOM_2                                               :{TINYFONT}Personale 2
+STR_01DB_MUSIC_VOLUME                                           :{BLACK}{TINYFONT}Volume musica
+STR_01DC_EFFECTS_VOLUME                                         :{BLACK}{TINYFONT}Volume effetti
 STR_01DD_MIN_MAX                                                :{BLACK}{TINYFONT}MIN  '  '  ' '  '  '  MAX
-STR_01DE_SKIP_TO_PREVIOUS_TRACK                                 :{BLACK}Torna al brano precedente
-STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Passa al brano successivo
+STR_01DE_SKIP_TO_PREVIOUS_TRACK                                 :{BLACK}Salta al brano precedente
+STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Salta al brano successivo
 STR_01E0_STOP_PLAYING_MUSIC                                     :{BLACK}Ferma la musica
 STR_01E1_START_PLAYING_MUSIC                                    :{BLACK}Avvia la musica
-STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Trascina le barre scorrevoli per regolare il volume della musica e degli effetti
+STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Trascina i selettori per regolare il volume della musica e degli effetti sonori
 STR_01E3                                                        :{DKGREEN}{TINYFONT}--
 STR_01E4_0                                                      :{DKGREEN}{TINYFONT}0{COMMA}
 STR_01E5                                                        :{DKGREEN}{TINYFONT}{COMMA}
@@ -567,31 +570,31 @@
 STR_01EF_PROGRAM                                                :{TINYFONT}{BLACK}Programma - '{STRING}'
 STR_01F0_CLEAR                                                  :{TINYFONT}{BLACK}Elimina
 STR_01F1_SAVE                                                   :{TINYFONT}{BLACK}Salva
-STR_01F2_CURRENT_PROGRAM_OF_MUSIC                               :{BLACK}Attuale programma musicale
-STR_01F3_SELECT_ALL_TRACKS_PROGRAM                              :{BLACK}Seleziona progrmma 'Tutti i brani'
-STR_01F4_SELECT_OLD_STYLE_MUSIC                                 :{BLACK}Seleziona programma 'vecchio style'
-STR_01F5_SELECT_NEW_STYLE_MUSIC                                 :{BLACK}Seleziona programma 'nuovo style'
-STR_01F6_SELECT_CUSTOM_1_USER_DEFINED                           :{BLACK}Seleziona programma 'Personaliz. 1' (definito dall'utente)
-STR_01F7_SELECT_CUSTOM_2_USER_DEFINED                           :{BLACK}Seleziona programma 'Personaliz. 2' (definito dall'utente)
-STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}Elimina programmazioni attuali (solo personalizzato 1 o personalizzato 2)
-STR_01F9_SAVE_MUSIC_SETTINGS                                    :{BLACK}Salva le impostazioni musicali
-STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Clicca sul brano per aggiungerlo al programma corrente (solamente personallizzato 1 o personalizzato 2)
-STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Clicca sul brano per cancellarlo dal programma corrente (solamente personalizzato 1 o personalizzato 2)
-STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}Seleziona programmazione casuale on/off
-STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Mostra finestra 'selezione brani'
-STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Clicca sul servizio per vedere  l'industria/città
+STR_01F2_CURRENT_PROGRAM_OF_MUSIC                               :{BLACK}Programma musicale corrente
+STR_01F3_SELECT_ALL_TRACKS_PROGRAM                              :{BLACK}Seleziona il progrmma 'Tutti i brani'
+STR_01F4_SELECT_OLD_STYLE_MUSIC                                 :{BLACK}Seleziona il programma 'Musica vecchio stile'
+STR_01F5_SELECT_NEW_STYLE_MUSIC                                 :{BLACK}Seleziona il programma 'Musica nuovo stile'
+STR_01F6_SELECT_CUSTOM_1_USER_DEFINED                           :{BLACK}Seleziona il programma 'Personale 1' (definito dall'utente)
+STR_01F7_SELECT_CUSTOM_2_USER_DEFINED                           :{BLACK}Seleziona il programma 'Personale 2' (definito dall'utente)
+STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}Elimina il programma corrente (solo Personale1 e Personale2)
+STR_01F9_SAVE_MUSIC_SETTINGS                                    :{BLACK}Salva le impostazioni della musica
+STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Fare clic su un brano per aggiungerlo al programma corrente (solo Personale1 o Personale2)
+STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Fare clic su un brano per rimuoverlo dal programma corrente (solo Personale1 o Personale2)
+STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}Attiva/disattiva la riproduzione in ordine casuale
+STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Mostra la finestra di selezione dei brani musicali
+STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Fare clic su un servizio per centrare la visuale sull'industria o città
 STR_01FE_DIFFICULTY                                             :{BLACK}Difficoltà ({STRING})
 STR_01FF                                                        :{TINYFONT}{BLACK}{DATE_LONG}
-STR_0200_LAST_MESSAGE_NEWS_REPORT                               :Ultimo messaggio/rapporto
+STR_0200_LAST_MESSAGE_NEWS_REPORT                               :Ultimo messaggio/notizia
 STR_0201_MESSAGE_SETTINGS                                       :Impostazioni messaggi
 STR_MESSAGE_HISTORY_MENU                                        :Cronologia messaggi
-STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Mostra ultimo messaggio/rapporto, mostra impostazione messaggi
+STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}Mostra l'ultimo messaggio/notizia, mostra le opzioni dei messaggi
 STR_0204_MESSAGE_OPTIONS                                        :{WHITE}Opzioni messaggi
 STR_0205_MESSAGE_TYPES                                          :{BLACK}Tipi messaggi:
 STR_0206_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Arrivo del primo veicolo alle stazioni del giocatore
-STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Arrivo del primo veicolo alle stazioni della concorrenza
+STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Arrivo del primo veicolo alle stazioni di un avversario
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Incidenti / disastri
-STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informazioni sulla società
+STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informazioni sulla compagnia
 STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Apertura / chiusura delle industrie
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Cambiamenti economici
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Avvisi / informazioni sui veicoli del giocatore
@@ -599,11 +602,11 @@
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}Cambiamenti della merce accettata
 STR_020E_SUBSIDIES                                              :{YELLOW}Sussidi
 STR_020F_GENERAL_INFORMATION                                    :{YELLOW}Informazioni generali
-STR_MESSAGES_ALL                                                :{YELLOW}Impostazione per tutti i tipi di messaggio: Off / Summario / Completo
-STR_MESSAGE_SOUND                                               :{YELLOW}Esegui un suono per i messaggi sommarizzati
+STR_MESSAGES_ALL                                                :{YELLOW}Impostazione per tutti i tipi di messaggio
+STR_MESSAGE_SOUND                                               :{YELLOW}Riproduci un suono per le notizie ridotte a sommario
 STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...troppo lontano dalla destinazione precedente
-STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Le maggiori compagnie che hanno raggiunto il livello {NUM}{}({STRING})
-STR_TOP_COMPANIES_NETWORK_GAME                                  :{BIGFONT}{BLACK}Classifica società  del{NUM}
+STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}Le migliori compagnie che hanno raggiunto il {NUM}{}(Livello {STRING})
+STR_TOP_COMPANIES_NETWORK_GAME                                  :{BIGFONT}{BLACK}Classifica compagnie nel {NUM}
 STR_0212                                                        :{BIGFONT}{COMMA}.
 STR_0213_BUSINESSMAN                                            :Uomo d'affari
 STR_0214_ENTREPRENEUR                                           :Imprenditore
@@ -615,148 +618,149 @@
 STR_HIGHSCORE_NAME                                              :{BIGFONT}{PLAYERNAME}, {COMPANY}
 STR_HIGHSCORE_STATS                                             :{BIGFONT}'{STRING}'   ({COMMA})
 STR_021B_ACHIEVES_STATUS                                        :{BLACK}{BIGFONT}{COMPANY} raggiunge lo status di '{STRING}'!
-STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} di {COMPANY} raggiunge lo status di '{STRING}'!
+STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} della {COMPANY} raggiunge lo status di '{STRING}'!
 STR_021F                                                        :{BLUE}{COMMA}
 STR_0221_OPENTTD                                                :{YELLOW}OpenTTD
-STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Editor Scenario
-STR_0223_LAND_GENERATION                                        :{WHITE}Genera Terreno
+STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Editor di scenari
+STR_0223_LAND_GENERATION                                        :{WHITE}Generazione terreno
 STR_0224                                                        :{BLACK}{UPARROW}
 STR_0225                                                        :{BLACK}{DOWNARROW}
-STR_0228_INCREASE_SIZE_OF_LAND_AREA                             :{BLACK}Aumenta ampiezza del terreno da abbassare/alzare
-STR_0229_DECREASE_SIZE_OF_LAND_AREA                             :{BLACK}Decrementa ampiezza del terreno da abbassare/alzare
+STR_0228_INCREASE_SIZE_OF_LAND_AREA                             :{BLACK}Aumenta l'ampiezza del terreno da abbassare/alzare
+STR_0229_DECREASE_SIZE_OF_LAND_AREA                             :{BLACK}Riduce l'ampiezza del terreno da abbassare/alzare
 STR_022A_GENERATE_RANDOM_LAND                                   :{BLACK}Genera terreno casuale
 STR_022B_RESET_LANDSCAPE                                        :{BLACK}Azzerra paesaggio
 STR_022C_RESET_LANDSCAPE                                        :{WHITE}Azzerra Paesaggio
-STR_RESET_LANDSCAPE_TOOLTIP                                     :{BLACK}Togli tutte le proprietà dei giocatori dalla mappa
-STR_RESET_LANDSCAPE_CONFIRMATION_TEXT                           :{WHITE}Sei sicuro di togliere le proprietà dei giocatori?
+STR_RESET_LANDSCAPE_TOOLTIP                                     :{BLACK}Rimuove tutte le strutture di proprietà dei giocatori dalla mappa
+STR_RESET_LANDSCAPE_CONFIRMATION_TEXT                           :{WHITE}Si è sicuri di voler rimuovere tutte le proprietà dei giocatori?
 STR_022E_LANDSCAPE_GENERATION                                   :{BLACK}Generazione paesaggio
 STR_022F_TOWN_GENERATION                                        :{BLACK}Generazione città
 STR_0230_INDUSTRY_GENERATION                                    :{BLACK}Generazione industrie
-STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Costruzioni stradali
-STR_0233_TOWN_GENERATION                                        :{WHITE}Generazione Città
-STR_0234_NEW_TOWN                                               :{BLACK}Nuova Città
-STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Costruisci nuova città
-STR_0236_CAN_T_BUILD_TOWN_HERE                                  :{WHITE}Non puoi costruire una città qui...
+STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Costruzione strade
+STR_0233_TOWN_GENERATION                                        :{WHITE}Generazione città
+STR_0234_NEW_TOWN                                               :{BLACK}Nuova città
+STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Costruisce una nuova città
+STR_0236_CAN_T_BUILD_TOWN_HERE                                  :{WHITE}Impossibile costruire una città qui...
 STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}...troppo vicino al bordo della mappa
 STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN                              :{WHITE}...troppo vicino ad un'altra città
 STR_0239_SITE_UNSUITABLE                                        :{WHITE}...sito inadatto
 STR_023A_TOO_MANY_TOWNS                                         :{WHITE}...troppe città
-STR_CANNOT_GENERATE_TOWN                                        :{WHITE}Non puoi costruire nessuna città
-STR_NO_SPACE_FOR_TOWN                                           :{WHITE}...nella mappa non c'è altro spazio
-STR_023B_INCREASE_SIZE_OF_TOWN                                  :{BLACK}Incrementa dimensione della città
+STR_CANNOT_GENERATE_TOWN                                        :{WHITE}Impossibile costruire città
+STR_NO_SPACE_FOR_TOWN                                           :{WHITE}...non c'è altro spazio sulla mappa
+STR_023B_INCREASE_SIZE_OF_TOWN                                  :{BLACK}Aumenta la dimensione della città
 STR_023C_EXPAND                                                 :{BLACK}Espandi
-STR_023D_RANDOM_TOWN                                            :{BLACK}Città Casuale
-STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION                          :{BLACK}Costruisci città in un luogo casuale
-STR_023F_INDUSTRY_GENERATION                                    :{WHITE}Generazione Industrie
-STR_0240_COAL_MINE                                              :{BLACK}Miniera di Carbone
-STR_0241_POWER_STATION                                          :{BLACK}Centrale Elettrica
+STR_023D_RANDOM_TOWN                                            :{BLACK}Città casuale
+STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION                          :{BLACK}Costruisce una città in un luogo casuale
+STR_023F_INDUSTRY_GENERATION                                    :{WHITE}Generazione industrie
+STR_0240_COAL_MINE                                              :{BLACK}Miniera di carbone
+STR_0241_POWER_STATION                                          :{BLACK}Centrale elettrica
 STR_0242_SAWMILL                                                :{BLACK}Segheria
 STR_0243_FOREST                                                 :{BLACK}Foresta
 STR_0244_OIL_REFINERY                                           :{BLACK}Raffineria
-STR_0245_OIL_RIG                                                :{BLACK}Piattaforma Petrolifera
+STR_0245_OIL_RIG                                                :{BLACK}Piattaforma petrolifera
 STR_0246_FACTORY                                                :{BLACK}Fabbrica
 STR_0247_STEEL_MILL                                             :{BLACK}Acciaieria
 STR_0248_FARM                                                   :{BLACK}Fattoria
-STR_0249_IRON_ORE_MINE                                          :{BLACK}Miniera di Ferro
-STR_024A_OIL_WELLS                                              :{BLACK}Pozzi petroliferi
+STR_0249_IRON_ORE_MINE                                          :{BLACK}Miniera di ferro
+STR_024A_OIL_WELLS                                              :{BLACK}Pozzo petrolifero
 STR_024B_BANK                                                   :{BLACK}Banca
 STR_024C_PAPER_MILL                                             :{BLACK}Cartiera
-STR_024D_FOOD_PROCESSING_PLANT                                  :{BLACK}Azienda Alimentare
+STR_024D_FOOD_PROCESSING_PLANT                                  :{BLACK}Azienda alimentare
 STR_024E_PRINTING_WORKS                                         :{BLACK}Tipografia
-STR_024F_GOLD_MINE                                              :{BLACK}Miniera d'Oro
+STR_024F_GOLD_MINE                                              :{BLACK}Miniera d'oro
 STR_0250_LUMBER_MILL                                            :{BLACK}Falegnameria
-STR_0251_FRUIT_PLANTATION                                       :{BLACK}Piantagione di Frutta
-STR_0252_RUBBER_PLANTATION                                      :{BLACK}Piantagione di Gomma
-STR_0253_WATER_SUPPLY                                           :{BLACK}Falda Acquifera
-STR_0254_WATER_TOWER                                            :{BLACK}Cisterna d'Acqua
-STR_0255_DIAMOND_MINE                                           :{BLACK}Miniera di Diamanti
-STR_0256_COPPER_ORE_MINE                                        :{BLACK}Miniera di Rame
-STR_0257_COTTON_CANDY_FOREST                                    :{BLACK}Foresta di Cotone Candito
-STR_0258_CANDY_FACTORY                                          :{BLACK}Fabbrica Caramelle
+STR_0251_FRUIT_PLANTATION                                       :{BLACK}Piantagione di frutta
+STR_0252_RUBBER_PLANTATION                                      :{BLACK}Piantagione di gomma
+STR_0253_WATER_SUPPLY                                           :{BLACK}Falda acquifera
+STR_0254_WATER_TOWER                                            :{BLACK}Cisterna idrica
+STR_0255_DIAMOND_MINE                                           :{BLACK}Miniera di diamanti
+STR_0256_COPPER_ORE_MINE                                        :{BLACK}Miniera di rame
+STR_0257_COTTON_CANDY_FOREST                                    :{BLACK}Foresta di zucchero filato
+STR_0258_CANDY_FACTORY                                          :{BLACK}Fabbrica di caramelle
 STR_0259_BATTERY_FARM                                           :{BLACK}Fattoria delle batterie
-STR_025A_COLA_WELLS                                             :{BLACK}Pozzi di Cola
-STR_025B_TOY_SHOP                                               :{BLACK}Negozio di Giocattoli
-STR_025C_TOY_FACTORY                                            :{BLACK}Fabbrica di Giocattoli
-STR_025D_PLASTIC_FOUNTAINS                                      :{BLACK}Sorgenti di Plastica
-STR_025E_FIZZY_DRINK_FACTORY                                    :{BLACK}Fabbrica Bibite Frizzanti
-STR_025F_BUBBLE_GENERATOR                                       :{BLACK}Generatore di Bolle
-STR_0260_TOFFEE_QUARRY                                          :{BLACK}Estrattore di Toffee
-STR_0261_SUGAR_MINE                                             :{BLACK}Miniera di Zucchero
-STR_0262_CONSTRUCT_COAL_MINE                                    :{BLACK}Costruisci Miniera di Carbone
-STR_0263_CONSTRUCT_POWER_STATION                                :{BLACK}Costruisci Centrale Elettrica
-STR_0264_CONSTRUCT_SAWMILL                                      :{BLACK}Costruisci Segheria
-STR_0265_PLANT_FOREST                                           :{BLACK}Pianta Foresta
-STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}Costruisci Raffineria
-STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}Costruisci Piattaforma Petrolifera (può essere costruita soltanto vicino al bordo della mappa)
-STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}Costruisci Fabbrica
-STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Costruisci Acciaieria
-STR_026A_CONSTRUCT_FARM                                         :{BLACK}Costruisci Fattoria
-STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}Costruisci Miniera di Ferro
-STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}Costruisci Pozzi Petroliferi
-STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Costruisci Banca (può essere costruita solo in città con una popolazione maggiori di 1200)
-STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Costruisci Cartiera
-STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}Costruisci Azienda Alimentare
-STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}Costruisci Tipografia
-STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Costruisci Miniera d'Oro
-STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Costruisci Banca (può essere costruita solo nelle città)
-STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}Costruisci Falegnameria (per tagliare la foresta pluviale e produrre legna)
-STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Pianta Piantagione di Frutta
-STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Pianta Piantagione di Gomma
-STR_0276_CONSTRUCT_WATER_SUPPLY                                 :{BLACK}Costruisci Falda Acquifera
-STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}Costruisci Cisterna d'Acqua (può essere costruita solo nelle città)
-STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}Costruisci Miniera di Diamanti
-STR_0279_CONSTRUCT_COPPER_ORE_MINE                              :{BLACK}Costruisci Miniera di Rame
-STR_027A_PLANT_COTTON_CANDY_FOREST                              :{BLACK}Costruisci Foresta di Cotone Candito
-STR_027B_CONSTRUCT_CANDY_FACTORY                                :{BLACK}Costruisci Fabbrica di Caramelle
-STR_027C_CONSTRUCT_BATTERY_FARM                                 :{BLACK}Costruisci Fattoria delle Batterie
-STR_027D_CONSTRUCT_COLA_WELLS                                   :{BLACK}Costruisci Pozzi di Cola
-STR_027E_CONSTRUCT_TOY_SHOP                                     :{BLACK}Costruisci Negozio di Giocattoli
-STR_027F_CONSTRUCT_TOY_FACTORY                                  :{BLACK}Costruisci Fabbrica di Giocattoli
-STR_0280_CONSTRUCT_PLASTIC_FOUNTAINS                            :{BLACK}Costruisci Sorgenti di Plastica
-STR_0281_CONSTRUCT_FIZZY_DRINK_FACTORY                          :{BLACK}Costruisci Fabbrica Bibite Frizzanti
-STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}Costruisci Generatore di Bolle
-STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Costruisci Estrattore di Toffee
-STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Costruisci Miniera di Zucchero
-STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Non puoi costruire {STRING} qui...
-STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...devi prima costruire una città
-STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...ammessa solo una per città
+STR_025A_COLA_WELLS                                             :{BLACK}Pozzo di Cola
+STR_025B_TOY_SHOP                                               :{BLACK}Negozio di giocattoli
+STR_025C_TOY_FACTORY                                            :{BLACK}Fabbrica di giocattoli
+STR_025D_PLASTIC_FOUNTAINS                                      :{BLACK}Sorgente di Plastica
+STR_025E_FIZZY_DRINK_FACTORY                                    :{BLACK}Fabbrica di bibite frizzanti
+STR_025F_BUBBLE_GENERATOR                                       :{BLACK}Generatore di bollicine
+STR_0260_TOFFEE_QUARRY                                          :{BLACK}Cava di toffee
+STR_0261_SUGAR_MINE                                             :{BLACK}Miniera di zucchero
+STR_0262_CONSTRUCT_COAL_MINE                                    :{BLACK}Costruisce una Miniera di carbone
+STR_0263_CONSTRUCT_POWER_STATION                                :{BLACK}Costruisce una Centrale elettrica
+STR_0264_CONSTRUCT_SAWMILL                                      :{BLACK}Costruisce una Segheria
+STR_0265_PLANT_FOREST                                           :{BLACK}Pianta una Foresta
+STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}Costruisce una Raffineria
+STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}Costruisce una Piattaforma petrolifera (può essere costruita soltanto vicino ai bordi della mappa)
+STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}Costruisce una Fabbrica
+STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Costruisce un'Acciaieria
+STR_026A_CONSTRUCT_FARM                                         :{BLACK}Costruisce una Fattoria
+STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}Costruisce una Miniera di ferro
+STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}Costruisce un Pozzo petrolifero
+STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Costruisce una Banca (può essere costruita solo in città con una popolazione maggiore di 1200)
+STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Costruisce una Cartiera
+STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}Costruisce un'Azienda alimentare
+STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}Costruisce una Tipografia
+STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Costruisce una Miniera d'oro
+STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Costruisce una Banca (può essere costruita solo nelle città)
+STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}Costruisce una Falegnameria (per tagliare la foresta pluviale e produrre legna)
+STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Pianta una Piantagione di frutta
+STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Pianta una Piantagione di gomma
+STR_0276_CONSTRUCT_WATER_SUPPLY                                 :{BLACK}Costruisce una Falda acquifera
+STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}Costruisce una Cisterna idrica (può essere costruita solo nelle città)
+STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}Costruisce una Miniera di diamanti
+STR_0279_CONSTRUCT_COPPER_ORE_MINE                              :{BLACK}Costruisce una Miniera di rame
+STR_027A_PLANT_COTTON_CANDY_FOREST                              :{BLACK}Pianta una Foresta di zucchero filato
+STR_027B_CONSTRUCT_CANDY_FACTORY                                :{BLACK}Costruisce una Fabbrica di caramelle
+STR_027C_CONSTRUCT_BATTERY_FARM                                 :{BLACK}Costruisce una Fattoria delle batterie
+STR_027D_CONSTRUCT_COLA_WELLS                                   :{BLACK}Costruisce un Pozzo di Cola
+STR_027E_CONSTRUCT_TOY_SHOP                                     :{BLACK}Costruisce un Negozio di giocattoli
+STR_027F_CONSTRUCT_TOY_FACTORY                                  :{BLACK}Costruisce una Fabbrica di giocattoli
+STR_0280_CONSTRUCT_PLASTIC_FOUNTAINS                            :{BLACK}Costruisce una Sorgente di plastica
+STR_0281_CONSTRUCT_FIZZY_DRINK_FACTORY                          :{BLACK}Costruisce una Fabbrica di bibite frizzanti
+STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}Costruisce un Generatore di bollicine
+STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Costruisce una Cava di toffee
+STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Costruisce una Miniera di zucchero
+STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Impossibile costruire {STRING} qui...
+STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...bisogna prima costruire una città
+STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...ne è ammessa solo una per città
 STR_0288_PLANT_TREES                                            :{BLACK}Pianta alberi
 STR_0289_PLACE_SIGN                                             :{BLACK}Posiziona cartello
-STR_028A_RANDOM_TREES                                           :{BLACK}Alberi Casuali
+STR_028A_RANDOM_TREES                                           :{BLACK}Alberi casuali
 STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Pianta alberi casualmente nel paesaggio
 STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Piazza terreno roccioso nel paesaggio
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Piazza faro
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Piazza trasmettitore
-STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Definisce area desertica.{}Clicca premendo CTRL per rimuoverla
-STR_CREATE_LAKE                                                 :{BLACK}Definisci la zona d'acqua.{}Crei un canale, a meno che CTRL non venga premuto a livello del mare, allagando così i dintorni
+STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Definisce un'area desertica.{}Fare clic tenendo premuto CTRL per rimuoverla
+STR_CREATE_LAKE                                                 :{BLACK}Definisce una zona d'acqua.{}Costruisce un canale, a meno che non si tenga premuto CTRL mentre si fa clic al livello del mare, provocando l'allagamento dei dintorni
 STR_0290_DELETE                                                 :{BLACK}Elimina
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Elimina completamente questa città
 STR_0292_SAVE_SCENARIO                                          :Salva scenario
 STR_0293_LOAD_SCENARIO                                          :Carica scenario
-STR_LOAD_HEIGHTMAP                                              :Carica Heightmap
+STR_LOAD_HEIGHTMAP                                              :Carica heightmap
 STR_0294_QUIT_EDITOR                                            :Esci dall'editor
 STR_0295                                                        :
 STR_0296_QUIT                                                   :Esci
-STR_0297_SAVE_SCENARIO_LOAD_SCENARIO                            :{BLACK}Salva scenario, carica scenario, abbandona l'editore di scenari, esci
-STR_0298_LOAD_SCENARIO                                          :{WHITE}Carica Scenario
-STR_0299_SAVE_SCENARIO                                          :{WHITE}Salva Scenario
-STR_029A_PLAY_SCENARIO                                          :{BLACK}Gioca Scenario
-STR_PLAY_HEIGHTMAP                                              :{BLACK}Gioca Heightmap
-STR_PLAY_HEIGHTMAP_HINT                                         :{BLACK}Inizia un nuovo gioco usando la heightmap come terreno
-STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Sei sicuro di voler abbandonare questo scenario?
+STR_0297_SAVE_SCENARIO_LOAD_SCENARIO                            :{BLACK}Salva scenario, carica scenario, abbandona l'editor di scenari, esci
+STR_0298_LOAD_SCENARIO                                          :{WHITE}Carica scenario
+STR_0299_SAVE_SCENARIO                                          :{WHITE}Salva scenario
+STR_029A_PLAY_SCENARIO                                          :{BLACK}Gioca scenario
+STR_PLAY_HEIGHTMAP                                              :{BLACK}Gioca con heightmap
+STR_PLAY_HEIGHTMAP_HINT                                         :{BLACK}Inizia una nuova partita, utilizzando una heightmap per definire il terreno
+STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Si è sicuri di voler abbandonare questo scenario?
 STR_029C_QUIT_EDITOR                                            :{WHITE}Esci dall'editor
 STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...può essere costruita solo in città con una popolazione di almeno 1200
-STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Sposta la data d'inizio indietro di un'anno
-STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Sposta la data d'inizio avanti di un'anno
-STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...gli estremi del ponte devono stare entrambi sul terreno
+STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Sposta la data d'inizio indietro di 1 anno
+STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Sposta la data d'inizio avanti di 1 anno
+STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...gli estremi del ponte devono trovarsi entrambi sul terreno
 STR_02A1_SMALL                                                  :{BLACK}Piccola
 STR_02A2_MEDIUM                                                 :{BLACK}Media
 STR_02A3_LARGE                                                  :{BLACK}Grande
-STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Seleziona dimensione città
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Metropoli
+STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Seleziona la dimensione della città
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Dimensione città:
 
 STR_02B6                                                        :{STRING}  -  {STRING}
-STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Mostra ultimo messaggio o report
+STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Mostra l'ultimo messaggio o notizia
 STR_OFF                                                         :No
 STR_SUMMARY                                                     :Sommario
 STR_FULL                                                        :Completo
@@ -768,19 +772,19 @@
 STR_02BF_CUSTOM                                                 :Personalizzati
 STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Salva nomi personalizzati
 STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Selezione nomi veicoli
-STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Salva nomi personalizzati dei veicoli
+STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Salva i nomi personalizzati dei veicoli
 
 STR_CHECKMARK                                                   :{CHECKMARK}
 ############ range for menu starts
 STR_02C3_GAME_OPTIONS                                           :Opzioni gioco
 STR_02C5_DIFFICULTY_SETTINGS                                    :Impostazioni difficoltà
 STR_02C7_CONFIG_PATCHES                                         :Configura patch
-STR_NEWGRF_SETTINGS                                             :Impostazioni Newgrf
+STR_NEWGRF_SETTINGS                                             :Impostazioni NewGRF
 STR_GAMEOPTMENU_0A                                              :
 STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Mostra nomi città
 STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Mostra nomi stazioni
 STR_02CE_SIGNS_DISPLAYED                                        :{SETX 12}Mostra cartelli
-STR_WAYPOINTS_DISPLAYED2                                        :{SETX 12}Waypoints mostrati
+STR_WAYPOINTS_DISPLAYED2                                        :{SETX 12}Waypoint mostrati
 STR_02D0_FULL_ANIMATION                                         :{SETX 12}Animazione completa
 STR_02D2_FULL_DETAIL                                            :{SETX 12}Massimo dettaglio
 STR_02D4_TRANSPARENT_BUILDINGS                                  :{SETX 12}Edifici trasparenti
@@ -788,38 +792,39 @@
 ############ range ends here
 
 ############ range for menu starts
-STR_02D5_LAND_BLOCK_INFO                                        :Informazioni sull'area
+STR_02D5_LAND_BLOCK_INFO                                        :Informazioni sull'area di terreno
 STR_02D6                                                        :
-STR_CONSOLE_SETTING                                             :Linea di comando
+STR_CONSOLE_SETTING                                             :Apri/chiudi console
 STR_02D7_SCREENSHOT_CTRL_S                                      :Screenshot (Ctrl-S)
 STR_02D8_GIANT_SCREENSHOT_CTRL_G                                :Screenshot Gigante (Ctrl-G)
-STR_02D9_ABOUT_OPENTTD                                          :Info su 'OpenTTD'
+STR_02D9_ABOUT_OPENTTD                                          :Informazioni su 'OpenTTD'
 ############ range ends here
 
 STR_02DB_OFF                                                    :{BLACK}Off
 STR_02DA_ON                                                     :{BLACK}On
-STR_02DC_DISPLAY_SUBSIDIES                                      :{BLACK}Mostra sussidi
+STR_02DC_DISPLAY_SUBSIDIES                                      :{BLACK}Mostra i sussidi
 STR_02DD_SUBSIDIES                                              :Sussidi
 STR_02DE_MAP_OF_WORLD                                           :Mappa del mondo
 STR_EXTRA_VIEW_PORT                                             :Mini visuale extra
-STR_SIGN_LIST                                                   :Lista cartelli
+STR_SIGN_LIST                                                   :Elenco cartelli
+STR_TRANSPARENCY_OPTIONS                                        :Opzioni trasparenza
 STR_02DF_TOWN_DIRECTORY                                         :Elenco città
 STR_TOWN_POPULATION                                             :{BLACK}Popolazione mondiale: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Mini visuale {COMMA}
 STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}Copia nella mini visuale
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT                             :{BLACK}Copia la posizione dalla finestra principale alla mini visuale
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT                             :{BLACK}Copia la posizione della visuale principale in questa mini misuale
 STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW                                :{BLACK}Copia dalla mini visuale
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT                             :{BLACK}Copia la posizione dalla mini visuale alla finestra principale
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT                             :{BLACK}Copia la posizione di questa mini visuale nella visuale principale
 
 STR_02E0_CURRENCY_UNITS                                         :{BLACK}Valuta
 STR_02E1                                                        :{BLACK}{SKIP}{STRING}
-STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Selezione valuta
+STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Selezione della valuta
 STR_MEASURING_UNITS                                             :{BLACK}Unità di misura
 STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Selezione unità di misura
-STR_02E6_ROAD_VEHICLES                                          :{BLACK}Veicoli stradali
+STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Seleziona le unità di misura
+STR_02E6_ROAD_VEHICLES                                          :{BLACK}Automezzi
 STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Seleziona lato della strada sul quale devono guidare i veicoli stradali
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Seleziona il lato della strada sul quale devono guidare i veicoli
 STR_02E9_DRIVE_ON_LEFT                                          :Guida a sinistra
 STR_02EA_DRIVE_ON_RIGHT                                         :Guida a destra
 STR_02EB_TOWN_NAMES                                             :{BLACK}Nomi città
@@ -828,39 +833,39 @@
 
 STR_02F4_AUTOSAVE                                               :{BLACK}Salvataggi automatici
 STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Seleziona intervallo salvataggi automatici
+STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Seleziona l'intervallo fra i salvataggi automatici della partita
 STR_02F7_OFF                                                    :No
 STR_02F8_EVERY_3_MONTHS                                         :Ogni 3 mesi
 STR_02F9_EVERY_6_MONTHS                                         :Ogni 6 mesi
 STR_02FA_EVERY_12_MONTHS                                        :Ogni 12 mesi
-STR_02FB_START_A_NEW_GAME                                       :{BLACK}Inizia un nuovo gioco
-STR_02FC_LOAD_A_SAVED_GAME                                      :{BLACK}Carica un gioco salvato
+STR_02FB_START_A_NEW_GAME                                       :{BLACK}Inizia una nuova partita
+STR_02FC_LOAD_A_SAVED_GAME                                      :{BLACK}Carica una partita salvata
 STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Crea uno scenario personalizzato
-STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Seleziona giocatore singolo
-STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Seleziona un gioco multiplayer da 2-8 giocatori
-STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Mostra opzioni di gioco
-STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Mostra opzioni difficoltà
-STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}Inizia una partita con uno scenario personalizzato
+STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Seleziona una partita a giocatore singolo
+STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Seleziona una partita multigiocatore con 2-8 giocatori
+STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Mostra le opzioni di gioco
+STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Mostra le opzioni di difficoltà
+STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}Inizia una nuova partita, utilizzando uno scenario personalizzato
 STR_0304_QUIT                                                   :{BLACK}Esci
-STR_0305_QUIT_OPENTTD                                           :{BLACK}Esci 'OpenTTD'
+STR_0305_QUIT_OPENTTD                                           :{BLACK}Esci da 'OpenTTD'
 STR_0307_OPENTTD                                                :{WHITE}OpenTTD {REV}
 STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...può essere costruito solo in città
-STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Seleziona paesaggio 'temperato'
-STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Seleziona paesaggio 'sub-artico'
-STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Seleziona paesaggio 'sub-tropicale'
-STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Seleziona paesaggio 'Città dei giocattoli'
-STR_0312_FUND_CONSTRUCTION_OF_NEW                               :{BLACK}Finanzia la costruzione di nuove industrie
+STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Seleziona il paesaggio 'temperato'
+STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Seleziona il paesaggio 'sub-artico'
+STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Seleziona il paesaggio 'sub-tropicale'
+STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Seleziona il paesaggio 'città dei giocattoli'
+STR_0312_FUND_CONSTRUCTION_OF_NEW                               :{BLACK}Finanzia la costruzione di una nuova industria
 
 ############ range for menu starts
-STR_INDUSTRY_DIR                                                :Elenco Industrie
-STR_0313_FUND_NEW_INDUSTRY                                      :Finanzia nuove industrie
+STR_INDUSTRY_DIR                                                :Elenco industrie
+STR_0313_FUND_NEW_INDUSTRY                                      :Finanzia nuova industria
 ############ range ends here
 
-STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Finanzia nuove industrie
+STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Finanzia nuova industria
 STR_JUST_STRING                                                 :{STRING}
-STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...può essere costruito solo in città
-STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...può essere costruito solo nella foresta pluviale
-STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...può essere costruito solo in aree desertiche
+STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...può essere costruita solo in città
+STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...può essere costruita solo nella foresta pluviale
+STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...può essere costruita solo in aree desertiche
 STR_0319_PAUSED                                                 :{YELLOW}* *  IN PAUSA  *  *
 
 STR_031B_SCREENSHOT_SUCCESSFULLY                                :{WHITE}Screenshot salvato con successo come '{STRING}'
@@ -870,53 +875,53 @@
 STR_032F_AUTOSAVE                                               :{RED}SALVATAGGIO AUTOMATICO
 STR_SAVING_GAME                                                 :{RED}*  *  SALVATAGGIO PARTITA  *  *
 STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Salvataggio in corso,{}prego attenderne la fine!
-STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Seleziona il programma 'Ezy Street'
+STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Seleziona il programma 'Musica ezy street'
 
 STR_0335_6                                                      :{BLACK}6
 STR_0336_7                                                      :{BLACK}7
 
 ############ start of townname region
-STR_TOWNNAME_ORIGINAL_ENGLISH                                   :Inglese
-STR_TOWNNAME_FRENCH                                             :Francese
-STR_TOWNNAME_GERMAN                                             :Tedesco
-STR_TOWNNAME_ADDITIONAL_ENGLISH                                 :Inglese (Aggiuntivo)
-STR_TOWNNAME_LATIN_AMERICAN                                     :Latino-Americano
-STR_TOWNNAME_SILLY                                              :Stupidi
-STR_TOWNNAME_SWEDISH                                            :Svedese
-STR_TOWNNAME_DUTCH                                              :Olandese
-STR_TOWNNAME_FINNISH                                            :Finlandese
-STR_TOWNNAME_POLISH                                             :Polacco
-STR_TOWNNAME_SLOVAKISH                                          :Slovacco
-STR_TOWNNAME_NORWEGIAN                                          :Norvegese
-STR_TOWNNAME_HUNGARIAN                                          :Ungherese
+STR_TOWNNAME_ORIGINAL_ENGLISH                                   :Inglesi (originali)
+STR_TOWNNAME_FRENCH                                             :Francesi
+STR_TOWNNAME_GERMAN                                             :Tedeschi
+STR_TOWNNAME_ADDITIONAL_ENGLISH                                 :Inglesi (aggiuntivi)
+STR_TOWNNAME_LATIN_AMERICAN                                     :Latino-americani
+STR_TOWNNAME_SILLY                                              :Sciocchi
+STR_TOWNNAME_SWEDISH                                            :Svedesi
+STR_TOWNNAME_DUTCH                                              :Olandesi
+STR_TOWNNAME_FINNISH                                            :Finlandesi
+STR_TOWNNAME_POLISH                                             :Polacchi
+STR_TOWNNAME_SLOVAKISH                                          :Slovacchi
+STR_TOWNNAME_NORWEGIAN                                          :Norvegesi
+STR_TOWNNAME_HUNGARIAN                                          :Ungheresi
 STR_TOWNNAME_AUSTRIAN                                           :Austriaci
-STR_TOWNNAME_ROMANIAN                                           :Rumeno
-STR_TOWNNAME_CZECH                                              :Ceco
-STR_TOWNNAME_SWISS                                              :Svizzero
-STR_TOWNNAME_DANISH                                             :Danese
-STR_TOWNNAME_TURKISH                                            :Turco
-STR_TOWNNAME_ITALIAN                                            :Italiano
-STR_TOWNNAME_CATALAN                                            :Catalano
+STR_TOWNNAME_ROMANIAN                                           :Rumeni
+STR_TOWNNAME_CZECH                                              :Cechi
+STR_TOWNNAME_SWISS                                              :Svizzeri
+STR_TOWNNAME_DANISH                                             :Danesi
+STR_TOWNNAME_TURKISH                                            :Turchi
+STR_TOWNNAME_ITALIAN                                            :Italiani
+STR_TOWNNAME_CATALAN                                            :Catalani
 ############ end of townname region
 
 STR_CURR_GBP                                                    :Sterlina (£)
-STR_CURR_USD                                                    :Dollaro USA ($)
+STR_CURR_USD                                                    :Dollaro ($)
 STR_CURR_EUR                                                    :Euro (€)
 STR_CURR_YEN                                                    :Yen (Â¥)
-STR_CURR_ATS                                                    :Scellino Austriano (ATS)
+STR_CURR_ATS                                                    :Scellino Austriaco (ATS)
 STR_CURR_BEF                                                    :Franco Belga (BEF)
 STR_CURR_CHF                                                    :Franco Svizzero (CHF)
 STR_CURR_CZK                                                    :Corona Ceca (CZK)
 STR_CURR_DEM                                                    :Marco Tedesco (DEM)
 STR_CURR_DKK                                                    :Corona Danese (DKK)
-STR_CURR_ESP                                                    :Peseta Spagnola (ESP)
-STR_CURR_FIM                                                    :Marco Finlandese(FIM)
+STR_CURR_ESP                                                    :Peseta (ESP)
+STR_CURR_FIM                                                    :Marco Finlandese (FIM)
 STR_CURR_FRF                                                    :Franco Francese (FRF)
-STR_CURR_GRD                                                    :Drachma Greca (GRD)
+STR_CURR_GRD                                                    :Dracma Greca (GRD)
 STR_CURR_HUF                                                    :Forint Ungherese (HUF)
 STR_CURR_ISK                                                    :Corona Islandese (ISK)
 STR_CURR_ITL                                                    :Lira Italiana (ITL)
-STR_CURR_NLG                                                    :Fiorino olandese (NLG)
+STR_CURR_NLG                                                    :Fiorino Olandese (NLG)
 STR_CURR_NOK                                                    :Corona Norvegese (NOK)
 STR_CURR_PLN                                                    :Zloty Polacco (PLN)
 STR_CURR_ROL                                                    :Leu Rumeno (ROL)
@@ -927,25 +932,25 @@
 STR_CURR_SKK                                                    :Corona Slovacca (SKK)
 STR_CURR_BRR                                                    :Real Brasiliano (BRL)
 
-STR_CURR_CUSTOM                                                 :Personalizza...
+STR_CURR_CUSTOM                                                 :Personalizzata...
 
 STR_OPTIONS_LANG                                                :{BLACK}Lingua
 STR_OPTIONS_LANG_CBO                                            :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_LANG_TIP                                            :{BLACK}Seleziona la lingua da utilizzare
+STR_OPTIONS_LANG_TIP                                            :{BLACK}Seleziona la lingua da utilizzare per l'interfaccia
 
 STR_OPTIONS_FULLSCREEN                                          :{BLACK}Schermo intero
-STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Barra questa casella per giocare a OpenTTD a schermo intero
+STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Attiva questa casella per giocate a OpenTTD in modalità schermo intero
 
-STR_OPTIONS_RES                                                 :{BLACK}Risoluzione video
+STR_OPTIONS_RES                                                 :{BLACK}Risoluzione schermo
 STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_RES_TIP                                             :{BLACK}Seleziona la risoluzione video da utilizzare
+STR_OPTIONS_RES_TIP                                             :{BLACK}Seleziona la risoluzione dello schermo da utilizzare
 
 STR_OPTIONS_SCREENSHOT_FORMAT                                   :{BLACK}Formato screenshot
 STR_OPTIONS_SCREENSHOT_FORMAT_CBO                               :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_SCREENSHOT_FORMAT_TIP                               :{BLACK}Selezionare il formato da usare per le screenshot
+STR_OPTIONS_SCREENSHOT_FORMAT_TIP                               :{BLACK}Selezionare il formato da usare per gli screenshot
 
 STR_AUTOSAVE_1_MONTH                                            :Ogni mese
-STR_AUTOSAVE_FAILED                                             :{WHITE}Salvataggio automatico fallito.
+STR_AUTOSAVE_FAILED                                             :{WHITE}Salvataggio automatico fallito
 
 STR_MONTH_JAN                                                   :Gennaio
 STR_MONTH_FEB                                                   :Febbraio
@@ -960,8 +965,8 @@
 STR_MONTH_NOV                                                   :Novembre
 STR_MONTH_DEC                                                   :Dicembre
 
-STR_HEADING_FOR_STATION                                         :{LTBLUE}Direzione {STATION}
-STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}Direzione {STATION}, {VELOCITY}
+STR_HEADING_FOR_STATION                                         :{LTBLUE}Diretto a {STATION}
+STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}Diretto a {STATION}, {VELOCITY}
 STR_NO_ORDERS                                                   :{LTBLUE}Nessun ordine
 STR_NO_ORDERS_VEL                                               :{LTBLUE}Nessun ordine, {VELOCITY}
 
@@ -971,170 +976,192 @@
 STR_LITERS                                                      :litri
 STR_ITEMS                                                       :oggetti
 STR_CRATES                                                      :casse
-STR_RES_OTHER                                                   :altro
+STR_RES_OTHER                                                   :Altra
 STR_NOTHING                                                     :
 
 STR_SMALL_RIGHT_ARROW                                           :{TINYFONT}{RIGHTARROW}
 
-STR_CANT_SHARE_ORDER_LIST                                       :{WHITE}Non puoi condividere lista ordini...
-STR_CANT_COPY_ORDER_LIST                                        :{WHITE}Non puoi copiare la lista ordini...
-STR_END_OF_SHARED_ORDERS                                        :{SETX 10}- - Fine degli Ordini Condivisi - -
+STR_CANT_SHARE_ORDER_LIST                                       :{WHITE}Impossibile condividere la lista degli ordini...
+STR_CANT_COPY_ORDER_LIST                                        :{WHITE}Impossibile copiare la lista degli ordini...
+STR_END_OF_SHARED_ORDERS                                        :{SETX 10}- - Fine degli ordini condivisi - -
 
-STR_TRAIN_IS_LOST                                               :{WHITE}Il treno {COMMA} si è perso.
-STR_TRAIN_IS_UNPROFITABLE                                       :{WHITE}Il profitto del treno {COMMA} per l'anno scorso è stato {CURRENCY}
-STR_EURO_INTRODUCE                                              :{BLACK}{BIGFONT}Unione Monetaria Europea!{}{}E' stato introdotto l'Euro come unica moneta per qualsiasi transazione del tuo Paese!
+STR_TRAIN_IS_LOST                                               :{WHITE}Il Treno {COMMA} si è perso
+STR_TRAIN_IS_UNPROFITABLE                                       :{WHITE}Il profitto del Treno {COMMA} per l'anno scorso è stato {CURRENCY}
+STR_EURO_INTRODUCE                                              :{BLACK}{BIGFONT}Unione Monetaria Europea!{}{}È stato introdotto l'Euro come unica moneta per le transazioni quotidiane nel nostro Paese!
 
 # Start of order review system.
 # DON'T ADD OR REMOVE LINES HERE
-STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Il treno {COMMA} non ha sufficienti ordini pianificati
-STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}Il treno {COMMA} non ha alcun ordine
-STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Il treno {COMMA} ha alcuni ordini duplicati
-STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Il treno {COMMA} ha una stazione non valida negli ordini
-STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}Il veicolo {COMMA} non ha sufficienti ordini pianificati
-STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}Il veicolo {COMMA} non ha alcun ordine
-STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}Il veicolo {COMMA} ha alcuni ordini duplicati
-STR_ROADVEHICLE_HAS_INVALID_ENTRY                               :{WHITE}Il veicolo {COMMA} ha una stazione non valida negli ordini
-STR_SHIP_HAS_TOO_FEW_ORDERS                                     :{WHITE}La nave {COMMA} non ha sufficienti ordini pianificati
-STR_SHIP_HAS_VOID_ORDER                                         :{WHITE}La nave {COMMA} non ha alcun ordine
-STR_SHIP_HAS_DUPLICATE_ENTRY                                    :{WHITE}La nave {COMMA} ha alcuni ordini duplicati
-STR_SHIP_HAS_INVALID_ENTRY                                      :{WHITE}La nave {COMMA} ha un porto non valido negli ordini
-STR_AIRCRAFT_HAS_TOO_FEW_ORDERS                                 :{WHITE}L'aereo {COMMA} non ha abbastanza ordini pianificati
-STR_AIRCRAFT_HAS_VOID_ORDER                                     :{WHITE}L'aereo {COMMA} ha un ordine vuoto nella lista
-STR_AIRCRAFT_HAS_DUPLICATE_ENTRY                                :{WHITE}L'aereo {COMMA} ha alcuni ordini duplicati
-STR_AIRCRAFT_HAS_INVALID_ENTRY                                  :{WHITE}L'aereo {COMMA} ha un aeroporto non valido negli ordini
+STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Il Treno {COMMA} non ha abbastanza ordini pianificati
+STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}Il Treno {COMMA} ha un ordine vuoto
+STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}Il Treno {COMMA} ha alcuni ordini duplicati
+STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}Il Treno {COMMA} ha una stazione non valida nei suoi ordini
+STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS                              :{WHITE}L'Automezzo {COMMA} non ha abbastanza ordini pianificati
+STR_ROADVEHICLE_HAS_VOID_ORDER                                  :{WHITE}L'Automezzo {COMMA} ha un ordine vuoto
+STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY                             :{WHITE}L'Automezzo {COMMA} ha alcuni ordini duplicati
+STR_ROADVEHICLE_HAS_INVALID_ENTRY                               :{WHITE}L'Automezzo {COMMA} ha una stazione non valida nei suoi ordini
+STR_SHIP_HAS_TOO_FEW_ORDERS                                     :{WHITE}La Nave {COMMA} non ha abbastanza ordini pianificati
+STR_SHIP_HAS_VOID_ORDER                                         :{WHITE}La Nave {COMMA} ha un ordine vuoto
+STR_SHIP_HAS_DUPLICATE_ENTRY                                    :{WHITE}La Nave {COMMA} ha alcuni ordini duplicati
+STR_SHIP_HAS_INVALID_ENTRY                                      :{WHITE}La Nave {COMMA} ha un porto non valido nei suoi ordini
+STR_AIRCRAFT_HAS_TOO_FEW_ORDERS                                 :{WHITE}L'Aeromobile {COMMA} non ha abbastanza ordini pianificati
+STR_AIRCRAFT_HAS_VOID_ORDER                                     :{WHITE}L'Aeromobile {COMMA} ha un ordine vuoto
+STR_AIRCRAFT_HAS_DUPLICATE_ENTRY                                :{WHITE}L'Aeromobile {COMMA} ha alcuni ordini duplicati
+STR_AIRCRAFT_HAS_INVALID_ENTRY                                  :{WHITE}L'Aeromobile {COMMA} ha un aeroporto non valido nei suoi ordini
 # end of order system
 
-STR_TRAIN_AUTORENEW_FAILED                                      :{WHITE}Rinnovo automatico fallito per il treno {COMMA} (limite fondi)
-STR_ROADVEHICLE_AUTORENEW_FAILED                                :{WHITE}Rinnovo automatico fallito per il veicolo {COMMA} (limite fondi)
-STR_SHIP_AUTORENEW_FAILED                                       :{WHITE}Rinnovo automatico fallito per la nave {COMMA} (limite fondi)
-STR_AIRCRAFT_AUTORENEW_FAILED                                   :{WHITE}Rinnovo automatico fallito per l'aereo {COMMA} (limite fondi)
-STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT                            :{WHITE}Il treno {COMMA} dopo la sostituzione è diventato troppo lungo
+STR_TRAIN_AUTORENEW_FAILED                                      :{WHITE}Rinnovo automatico fallito per il Treno {COMMA} (limite denaro)
+STR_ROADVEHICLE_AUTORENEW_FAILED                                :{WHITE}Rinnovo automatico fallito per l'Automezzo {COMMA} (limite denaro)
+STR_SHIP_AUTORENEW_FAILED                                       :{WHITE}Rinnovo automatico fallito per la nave {COMMA} (limite denaro)
+STR_AIRCRAFT_AUTORENEW_FAILED                                   :{WHITE}Rinnovo automatico fallito per l'Aeromobile {COMMA} (limite denaro)
+STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT                            :{WHITE}Il Treno {COMMA} dopo la sostituzione è diventato troppo lungo
 
-STR_CONFIG_PATCHES                                              :{BLACK}Configura Patch
+STR_CONFIG_PATCHES                                              :{BLACK}Configura patch
 STR_CONFIG_PATCHES_TIP                                          :{BLACK}Configura le patch
-STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}Configura Patch
+STR_CONFIG_PATCHES_CAPTION                                      :{WHITE}Configura patch
 
 STR_CONFIG_PATCHES_OFF                                          :No
 STR_CONFIG_PATCHES_ON                                           :Si
 STR_CONFIG_PATCHES_VEHICLESPEED                                 :{LTBLUE}Mostra velocità veicoli sulla barra di stato: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES                                :{LTBLUE}Consenti la costruzione sui pendii e coste: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Permetti aree di carico/scarico più realistiche: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Permetti rimozione di strade, ponti, ecc. appartenuti alle città: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_CATCHMENT                                    :{LTBLUE}Consenti aree di copertura più realistiche: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_EXTRADYNAMITE                                :{LTBLUE}Consenti la rimozione di strade, ponti, etc. delle città: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS                                :{LTBLUE}Consenti la costruzione di treni molto lunghi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REALISTICACCEL                               :{LTBLUE}Abilita accelerazione realistica per i treni: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Vieta ai treni e navi di fare curve di 90°: {ORANGE}{STRING} {LTBLUE} (Richiede YAPF o NPF)
-STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Unisci stazioni ferroviarie quando sono vicine: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Lascia stazione quanto uno dei tipi di merce è a pieno carico: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Impedisci a treni e navi di curvare a 90°: {ORANGE}{STRING} {LTBLUE} (richiede NPF)
+STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Unisci le stazioni ferroviarie costruite una accanto all'altra: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Lascia stazione quando una qualsiasi merce è a pieno carico: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Usa l'algoritmo di caricamento migliorato: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}Carica i veicoli gradualmente: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}Inflazione: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Scarica le merci in una stazione solo se richieste: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LONGBRIDGES                                  :{LTBLUE}Consenti la costruzione di ponti molto lunghi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Consenti gli ordini 'vai al deposito': {ORANGE}{STRING}
-STR_CONFIG_PATCHES_BUILDXTRAIND                                 :{LTBLUE}Consenti la costruzione di industrie produttrici di materia prima: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Consenti la costruzione di più industrie simili per città: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Consenti la costruzione di industrie uguali anche se molto vicine: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Mostra sempre formato esteso della data nella barra di stato: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Mostra segnali sul lato guida: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Mostra finestra info finanziare alla fine di ogni anno: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}Gestisci funzione 'non-stop' come TTDPatch: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Accoda veicoli stradali quando l'area di carico è occupata: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Scorri orizzontalmente la visuale se il mouse è agli angoli: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Consenti corruzione autorità locale: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_GOTODEPOT                                    :{LTBLUE}Consenti gli ordini 'Vai al deposito': {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BUILDXTRAIND                                 :{LTBLUE}Consenti la costruzione di industrie primarie: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Consenti più industrie dello stesso tipo nella stessa città: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Consenti la costruzione di industrie uguali anche molto vicine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Mostra sempre la data lunga nella barra di stato: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Mostra i segnali sul lato di guida: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Mostra la finestra delle finanze alla fine dell'anno: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}Gestisci la funzione 'non-stop' come in TTDPatch: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Accodamento automezzi fuori da una stazione occupata: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSCROLL                                   :{LTBLUE}Scorri la visuale quando il mouse è su un bordo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_BRIBE                                        :{LTBLUE}Consenti la corruzione dell'autorità locale: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NONUNIFORM_STATIONS                          :{LTBLUE}Stazioni non uniformi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Nuovo pathfinding globale (NPF, sovrascrive NTP): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Moltiplicatore di peso per simulare treni pesanti: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Permetti fermate passanti sulle strade pubbliche: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Moltiplicatore di peso per simulare treni merci pesanti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Consenti fermate passanti sulle strade delle città: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Consenti la costruzione di stazioni adiacenti: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Consenti la costruzione di piccoli aeroporti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Consenti sempre la costruzione di piccoli aeroporti: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Avvisa se un treno si è perso: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Controlla gli ordini dei veicoli: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :disabilitato
-STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :si, ma escludi i veicoli fermi
-STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :per tutti i veicoli
+STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :No
+STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :Sì, ma escludi i veicoli fermi
+STR_CONFIG_PATCHES_ORDER_REVIEW_ON                              :Per tutti i veicoli
 STR_CONFIG_PATCHES_WARN_INCOME_LESS                             :{LTBLUE}Avvisa se i guadagni di un treno sono in negativo: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}I veicoli non invecchiano mai: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Rinnova un veicolo quando diventa datato
+STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}I veicoli non diventano mai obsoleti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Rinnova un veicolo quando diventa vecchio
 STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Rinnova un veicolo quando è {ORANGE}{STRING}{LTBLUE} mesi fuori età massima
-STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Rinnova solo se disponibile il fondo minimo di: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Durata visualizzazione messaggio di errore: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Mostra la popolazione di un paese nell'etichetta: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Alberi invisibili (se edifici trasparenti): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_MONEY                              :{LTBLUE}Rinnova solo se disponibile il fondo minimo di {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ERRMSG_DURATION                              :{LTBLUE}Durata dei messaggi d'errore: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}Mostra la popolazione di una città nell'etichetta del nome: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}Alberi invisibili (con edifici trasparenti attivati): {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generatore terreni: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Generatore terreno: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :Originale
 STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS                 :TerraGenesis
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Massima distanza dal bordo per le Raffinerie {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Altezza limite delle nevi perenni: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}Ruvidità del terreno (solo TerraGenesis) : {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Molto Morbido
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE                        :{LTBLUE}Max distanza delle raffinerie dal bordo della mappa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SNOWLINE_HEIGHT                              :{LTBLUE}Altezza delle nevi perenni: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}Irregolarità del terreno (solo TerraGenesis): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH             :Molto morbido
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_SMOOTH                  :Morbido
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH                   :Ruvido
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH              :Molto Ruvido
-STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}Algoritmo per il piazzamento di alberi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH                   :Accidentato
+STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH              :Molto accidentato
+STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}Algoritmo di piazzamento degli alberi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TREE_PLACER_NONE                             :Nessuno
 STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL                         :Originale
-STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED                         :Aggiornato
+STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED                         :Migliorato
 STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION                           :{LTBLUE}Rotazione heightmap: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE         :Antiorario
-STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE                 :Orario
-STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}La curva di livello della mappa di uno scenario piano ha : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE         :Antioraria
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE                 :Oraria
+STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}Altitudine delle mappe pianeggiante: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Dispersione max. stazione: {ORANGE}{STRING} {RED}Nota: Valore alto rallenta il gioco
-STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Manutenzione elicotteri direttamente all'eliporto: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}Max estensione stazioni: {ORANGE}{STRING} {RED}Nota: Valori alti rallentano il gioco
+STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Manutieni automaticamente gli elicotteri presso gli eliporti: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Apri strumenti terreno assieme a quelli di costruzione: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Scorri mappa nella direzione opposta a quella del mouse: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Inverti direzione di scorrimento della mappa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Scorrimento morbido delle visuali: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Mostra un tooltip di misura durante la costruzione: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Mostra le livree della società: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Nessuna
-STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Propria società
-STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Tutte le società
-STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Preferisce team chat con <ENTER>: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Propria compagnia
+STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Tutte le compagnie
+STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Chatta con la squadra premento INVIO: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funzione della rotellina: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zoom mappa
-STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scrolla mappa
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zoom della mappa
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scorri la mappa
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Off
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Velocità rotellina mappa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Metti in pausa all'inizio di una nuova partita: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Utilizza la lista veicoli avanzata: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max treni per giocatore: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max veicoli stradali per giocatore: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Max aeroplani per giocatore: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max automezzi per giocatore: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Max aeromobili per giocatore: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Max navi per giocatore: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Disabilita treni: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}Disabilita veicoli stradali: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Disabilita aerei: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Disabilita navi: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Disabilita treni dell'IA: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}Disabilita automezzi dell'IA: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT                           :{LTBLUE}Disabilita aeromobili dell'IA: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_BUILDS_SHIPS                              :{LTBLUE}Disabilita navi dell'IA: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}Abilita la nuova IA (alpha): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Permetti AI in multiplayer (sperimentale): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}Permetti le IA nelle partite multigiocatore (sperimentale): {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Intervallo di servizio predefinito per i treni: {ORANGE}{STRING} giorni/%
-STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Intervallo di servizio predefinito per i treni: {ORANGE}disabilitato
-STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Intervallo di servizio predefinito per i veicoli stradali: {ORANGE}{STRING} giorni
-STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Intervallo di servizio predefinito per i veicoli stradali: {ORANGE}disabilitato
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Intervallo di servizio predefinito per gli aerei: {ORANGE}{STRING} giorni
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Intervallo di servizio predefinito per gli aerei: {ORANGE}disabilitato
-STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Intervallo di servizio predefinito per le navi: {ORANGE}{STRING} giorni/%
-STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Intervallo di servizio predefinito per le navi: {ORANGE}disabilitato
-STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Disabilità servicing quando i guasti sono "nessuno": {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Abilita limite velocità vagoni: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_TRAINS                               :{LTBLUE}Intervallo manutenzione predefinito treni: {ORANGE}{STRING} giorni/%
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}Intervallo manutenzione predefinito treni: {ORANGE}Disabilitato
+STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}Intervallo manutenzione predefinito automezzi: {ORANGE}{STRING} giorni/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}Intervallo manutenzione predefinito automezzi: {ORANGE}Disabilitato
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}Intervallo manutenzione predefinito aeromobili: {ORANGE}{STRING} giorni/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}Intervallo manutenzione predefinito aeromobili: {ORANGE}Disabilitato
+STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}Intervallo manutenzione predefinito navi: {ORANGE}{STRING} giorni/%
+STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED                       :{LTBLUE}Intervallo manutenzione predefinito navi: {ORANGE}Disabilitato
+STR_CONFIG_PATCHES_NOSERVICE                                    :{LTBLUE}Disabilita manutenzione con i guasti veicoli disattivati: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WAGONSPEEDLIMITS                             :{LTBLUE}Abilita limiti di velocità dei vagoni: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_DISABLE_ELRAILS                              :{LTBLUE}Disabilita ferrovie elettrificate: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Notizie colorate appaiono dal: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Data di inizio: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Concludi il gioco il: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_COLORED_NEWS_YEAR                            :{LTBLUE}Giornali a colori dal: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STARTING_YEAR                                :{LTBLUE}Anno di inizio: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ENDING_YEAR                                  :{LTBLUE}Termina la partita nel: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SMOOTH_ECONOMY                               :{LTBLUE}Abilita economia fluida (cambiamenti piccoli e frequenti)
-STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permetti l'acquisto di azioni da altre compagnie
-STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Trascinando il cursore costruisci i semafori ogni: {ORANGE}{STRING} quadrato/i
-STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Costruisce automaticamente i semafori prima del: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permetti l'acquisto di azioni di altre compagnie
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Trascinando il cursore, piazza i segnali ogni: {ORANGE}{STRING} quadrato/i
+STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Costruisci automaticamente i semafori prima del: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}L'opzione "Nessuna nuova strada" non è valida nell'editor di scenari
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Disposizione delle strade cittadine: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :Nessuna nuova strada
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :Predefinita
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :Pianta migliorata
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :Griglia 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :Griglia 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posizione barra degli strumenti principale: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Sinistra
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centro
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Destra
-STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Raggio di snap delle finestre: {ORANGE}{STRING} px
-STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Raggio di snap delle finestre: {ORANGE}disabilitato
+STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Raggio di aggancio delle finestre: {ORANGE}{STRING} px
+STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Raggio di aggancio delle finestre: {ORANGE}Disabilitato
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Velocità di crescita delle città: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Nessuna
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Lenta
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normale
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Veloce
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Molto veloce
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Città che diventeranno metropoli: {ORANGE}1 su {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Città che diventeranno metropoli: {ORANGE}Nessuna
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Moltiplicatore iniziale dimensioni metropoli: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfaccia
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Costruzione
@@ -1147,38 +1174,38 @@
 STR_CONFIG_PATCHES_INT32                                        :{NUM}
 STR_CONFIG_PATCHES_CURRENCY                                     :{CURRENCY}
 
-STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Cambia valori impostazioni
-STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alcuni o tutti gli intervalli di servizio predefiniti sottostanti sono incompatibili con le impostazioni scelte! 5-90% e 30-800 giorni sono valori validi
+STR_CONFIG_PATCHES_QUERY_CAPT                                   :{WHITE}Cambia impostazione
+STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE                :{WHITE}Alcuni degli intervalli sottostanti sono incompatibili con l'impostazione scelta! Valori ammessi: 5-90% e 30-800 giorni
 STR_CONFIG_PATCHES_YAPF_SHIPS                                   :{LTBLUE}Usa YAPF per le navi: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Usa YAPF per i veicoli stradali: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_YAPF_ROAD                                    :{LTBLUE}Usa YAPF per gli automezzi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}Usa YAPF per i treni: {ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :Paesaggio 'temperato'
 STR_SUB_ARCTIC_LANDSCAPE                                        :Paesaggio 'sub-artico'
 STR_SUB_TROPICAL_LANDSCAPE                                      :Paesaggio 'sub-tropicale'
-STR_TOYLAND_LANDSCAPE                                           :Paesaggio 'Città dei Giocattoli'
+STR_TOYLAND_LANDSCAPE                                           :Paesaggio 'città dei giocattoli'
 
 STR_CHEATS                                                      :{WHITE}Trucchi
-STR_CHEATS_TIP                                                  :{BLACK}Le caselle indicano se hai già utilizzato questo trucco in passato
-STR_CHEATS_WARNING                                              :{BLACK}Attenzione! Stai per tradire i tuoi avversari. Ricordati che un così grande disonore verrà ricordato per l'eternità.
-STR_CHEAT_MONEY                                                 :{LTBLUE}Aumenta soldi di {CURRENCY64}
-STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}Gioca come giocatore: {ORANGE}{COMMA}
-STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Bulldozer magico (rimuove industrie e altri): {ORANGE}{STRING}
+STR_CHEATS_TIP                                                  :{BLACK}Le caselle indicano se un trucco è già stato usato una volta
+STR_CHEATS_WARNING                                              :{BLACK}Attenzione! Stai per tradire i tuoi avversari. Ricordati che un così grande disonore sarà ricordato per l'eternità.
+STR_CHEAT_MONEY                                                 :{LTBLUE}Aumenta denaro di {CURRENCY64}
+STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}Controlla il giocatore: {ORANGE}{COMMA}
+STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Bulldozer magico (rimuove industrie e oggetti inamovibili): {ORANGE}{STRING}
 STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}I tunnel possono incrociarsi tra loro: {ORANGE}{STRING}
 STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}Consenti costruzione in pausa: {ORANGE}{STRING}
 STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}I jet non si schiantano (frequententemente) nei piccoli aeroporti: {ORANGE} {STRING}
-STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}Cambia paesaggio: {ORANGE} {STRING}
+STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}Cambia tipo di paesaggio: {ORANGE} {STRING}
 STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}Cambia data: {ORANGE} {DATE_SHORT}
 STR_CHEAT_SETUP_PROD                                            :{LTBLUE}Permetti la modifica dei valori di produzione: {ORANGE}{STRING}
 
-STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Direzione {WAYPOINT}
-STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Direzione {WAYPOINT}, {VELOCITY}
+STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Diretto a {WAYPOINT}
+STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Diretto a {WAYPOINT}, {VELOCITY}
 
-STR_GO_TO_WAYPOINT                                              :Vai al {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT                                     :Procedi non-stop via {WAYPOINT}
+STR_GO_TO_WAYPOINT                                              :Procedi attraverso {WAYPOINT}
+STR_GO_NON_STOP_TO_WAYPOINT                                     :Procedi non-stop attraverso {WAYPOINT}
 
-STR_WAYPOINTNAME_CITY                                           :Waypoint {TOWN}
-STR_WAYPOINTNAME_CITY_SERIAL                                    :Waypoint {TOWN} #{COMMA}
+STR_WAYPOINTNAME_CITY                                           :Waypoint di {TOWN}
+STR_WAYPOINTNAME_CITY_SERIAL                                    :Waypoint di {TOWN} #{COMMA}
 STR_LANDINFO_WAYPOINT                                           :Waypoint
 
 STR_WAYPOINT                                                    :{WHITE}Waypoint
@@ -1187,54 +1214,54 @@
 STR_WAYPOINT_VIEWPORT                                           :{WHITE}{WAYPOINT}
 STR_WAYPOINT_VIEWPORT_TINY                                      :{TINYFONT}{WHITE}{WAYPOINT}
 STR_WAYPOINT_RAW                                                :{WAYPOINT}
-STR_EDIT_WAYPOINT_NAME                                          :{WHITE}Cambia il nome al waypoint
+STR_EDIT_WAYPOINT_NAME                                          :{WHITE}Rinomina il waypoint
 
-STR_CANT_CHANGE_WAYPOINT_NAME                                   :{WHITE}Non puoi cambiare il nome al waypoint...
-STR_CONVERT_RAIL_TO_WAYPOINT_TIP                                :{BLACK}Trasforma la ferrovia in un waypoint
-STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Non puoi costruire qui un waypoint ferroviario...
-STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Non puoi demolire un waypoint ferroviario qui...
+STR_CANT_CHANGE_WAYPOINT_NAME                                   :{WHITE}Impossibile rinominare il waypoint...
+STR_CONVERT_RAIL_TO_WAYPOINT_TIP                                :{BLACK}Trasforma la rotaia in un waypoint
+STR_CANT_BUILD_TRAIN_WAYPOINT                                   :{WHITE}Impossibile costruire qui un waypoint ferroviario...
+STR_CANT_REMOVE_TRAIN_WAYPOINT                                  :{WHITE}Impossibile rimuovere il waypoint ferroviario da qui...
 
 STR_BUILD_AUTORAIL_TIP                                          :{BLACK}Costruisci binario usando la modalità automatica
 
 STR_NO_TOWN_IN_SCENARIO                                         :{WHITE}...non ci sono città in questo scenario
 
-STR_GENERATE_RANDOM_LANDSCAPE                                   :{WHITE}Sei sicuro di voler creare un terreno casuale?
+STR_GENERATE_RANDOM_LANDSCAPE                                   :{WHITE}Si è sicuri di voler generare un paesaggio casuale?
 STR_MANY_RANDOM_TOWNS                                           :{BLACK}Alcune città casuali
-STR_RANDOM_TOWNS_TIP                                            :{BLACK}Copri la mappa con città costruite casualmente
+STR_RANDOM_TOWNS_TIP                                            :{BLACK}Copre la mappa con città posizionate casualmente
 STR_MANY_RANDOM_INDUSTRIES                                      :{BLACK}Alcune industrie casuali
-STR_RANDOM_INDUSTRIES_TIP                                       :{BLACK}Copri la mappa con industrie costruite casualmente
-STR_CAN_T_GENERATE_INDUSTRIES                                   :{WHITE}Non puoi generare le industrie...
+STR_RANDOM_INDUSTRIES_TIP                                       :{BLACK}Copre la mappa con industrie posizionate casualmente
+STR_CAN_T_GENERATE_INDUSTRIES                                   :{WHITE}Impossibile generare industrie...
 
-STR_LANDSCAPING_TOOLBAR_TIP                                     :{BLACK}Apri la barra 'Modellazione terreno' per alzare/abbassare il terreno, piantare alberi, ecc.
+STR_LANDSCAPING_TOOLBAR_TIP                                     :{BLACK}Apre la barra di modellazione del terreno per alzare/abbassare il terreno, piantare alberi, etc.
 STR_LANDSCAPING_TOOLBAR                                         :{WHITE}Modella terreno
 STR_LEVEL_LAND_TOOLTIP                                          :{BLACK}Livella terreno
 
 
 STR_TREES_RANDOM_TYPE                                           :{BLACK}Alberi casuali
-STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Pianta alberi di tipo casuale
+STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Pianta alberi di specie a caso
 
-STR_CANT_BUILD_CANALS                                           :{WHITE}Non puoi costruire qui un canale...
-STR_BUILD_CANALS_TIP                                            :{BLACK}Costruisci canali.
+STR_CANT_BUILD_CANALS                                           :{WHITE}Impossibile costruire qui il canale...
+STR_BUILD_CANALS_TIP                                            :{BLACK}Costruisce canali
 STR_LANDINFO_CANAL                                              :Canale
 
-STR_CANT_BUILD_LOCKS                                            :{WHITE}Non puoi costruire qui una chiusa...
-STR_BUILD_LOCKS_TIP                                             :{BLACK}Costruisci chiusa
-STR_LANDINFO_LOCK                                               :Chiusa
+STR_CANT_BUILD_LOCKS                                            :{WHITE}Impossibile costruire qui le chiuse...
+STR_BUILD_LOCKS_TIP                                             :{BLACK}Costruisci chiuse
+STR_LANDINFO_LOCK                                               :Chiuse
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...la boa è in uso!
 
 STR_LANDINFO_COORDS                                             :{BLACK}Coordinate: {LTBLUE}{NUM}x{NUM} ({STRING})
 
-STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Non puoi demolire una porzione di stazione...
-STR_CANT_CONVERT_RAIL                                           :{WHITE}Non puoi convertire il tipo di rotaie...
-STR_CONVERT_RAIL_TIP                                            :{BLACK}Converti/aggiorna il tipo di rotaie
+STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}Impossibile rimuovere parte della stazione...
+STR_CANT_CONVERT_RAIL                                           :{WHITE}Impossibile convertire il tipo di rotaie qui...
+STR_CONVERT_RAIL_TIP                                            :{BLACK}Converte/aggiorna il tipo di rotaie
 
-STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP                                :{BLACK}Trascina qui la locomotiva per vendere l'intero treno
+STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP                                :{BLACK}Trascinare qui la locomotiva di un treno per vendere l'intero treno
 
-STR_DRAG_DROP                                                   :{BLACK}Drag & Drop
-STR_STATION_DRAG_DROP                                           :{BLACK}Costruisci una stazione con il drag & drop
-STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}Seleziona un tipo di classe di stazione per mostrare
-STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Scegli il tipo di stazione da costruire
+STR_DRAG_DROP                                                   :{BLACK}Drag & drop
+STR_STATION_DRAG_DROP                                           :{BLACK}Costruisce una stazione con il drag & drop
+STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}Seleziona il tipo di stazioni da mostrare
+STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Seleziona il tipo di stazione da costruire
 
 STR_FAST_FORWARD                                                :{BLACK}Aumenta la velocità di gioco
 STR_MESSAGE_HISTORY                                             :{WHITE}Cronologia messaggi
@@ -1242,77 +1269,77 @@
 STR_MESSAGES_DISABLE_ALL                                        :{BLACK}Disabilita tutti
 STR_MESSAGES_ENABLE_ALL                                         :{BLACK}Abilita tutti
 
-STR_CONSTRUCT_COAL_MINE_TIP                                     :{BLACK}Costruisci Miniera di Carbone
-STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Pianta Foresta
-STR_CONSTRUCT_OIL_RIG_TIP                                       :{BLACK}Costruisci Piattaforma Petrolifera
-STR_CONSTRUCT_FARM_TIP                                          :{BLACK}Fonda Fattoria
-STR_CONSTRUCT_COPPER_ORE_MINE_TIP                               :{BLACK}Costruisci Miniera di Rame
-STR_CONSTRUCT_OIL_WELLS_TIP                                     :{BLACK}Costruisci Pozzo Petrolifero
-STR_CONSTRUCT_GOLD_MINE_TIP                                     :{BLACK}Costruisci Miniera d'Oro
-STR_CONSTRUCT_DIAMOND_MINE_TIP                                  :{BLACK}Costruisci Miniera di Diamanti
-STR_CONSTRUCT_IRON_ORE_MINE_TIP                                 :{BLACK}Costruisci Miniera di Ferro
-STR_CONSTRUCT_FRUIT_PLANTATION_TIP                              :{BLACK}Pianta Piantagione di Frutta
-STR_CONSTRUCT_RUBBER_PLANTATION_TIP                             :{BLACK}Pianta Piantagione di Gomma
-STR_CONSTRUCT_WATER_SUPPLY_TIP                                  :{BLACK}Fonda Sorgente di Acqua
-STR_CONSTRUCT_COTTON_CANDY_TIP                                  :{BLACK}Pianta Foresta di Cotton Candy
-STR_CONSTRUCT_BATTERY_FARM_TIP                                  :{BLACK}Finanzia Fabbrica di Batterie
-STR_CONSTRUCT_COLA_WELLS_TIP                                    :{BLACK}Pozzi di Cola
-STR_CONSTRUCT_PLASTIC_FOUNTAINS_TIP                             :{BLACK}Fonda Fontane di Plastica
-STR_CONSTRUCT_BUBBLE_GENERATOR_TIP                              :{BLACK}Costruisci Generatore di Bolle
-STR_CONSTRUCT_TOFFEE_QUARRY_TIP                                 :{BLACK}Fonda Toffee Quarry
-STR_CONSTRUCT_SUGAR_MINE_TIP                                    :{BLACK}Costruisci Raffineria di Zucchero
+STR_CONSTRUCT_COAL_MINE_TIP                                     :{BLACK}Costruisce una Miniera di carbone
+STR_CONSTRUCT_FOREST_TIP                                        :{BLACK}Pianta una Foresta
+STR_CONSTRUCT_OIL_RIG_TIP                                       :{BLACK}Costruisce una Piattaforma petrolifera
+STR_CONSTRUCT_FARM_TIP                                          :{BLACK}Finanzia una Fattoria
+STR_CONSTRUCT_COPPER_ORE_MINE_TIP                               :{BLACK}Costruisce una Miniera di rame
+STR_CONSTRUCT_OIL_WELLS_TIP                                     :{BLACK}Scava in cerca di Petrolio
+STR_CONSTRUCT_GOLD_MINE_TIP                                     :{BLACK}Costruisce una Miniera d'oro
+STR_CONSTRUCT_DIAMOND_MINE_TIP                                  :{BLACK}Costruisce una Miniera di diamanti
+STR_CONSTRUCT_IRON_ORE_MINE_TIP                                 :{BLACK}Costruisce una Miniera di ferro
+STR_CONSTRUCT_FRUIT_PLANTATION_TIP                              :{BLACK}Finanzia una Piantagione di frutta
+STR_CONSTRUCT_RUBBER_PLANTATION_TIP                             :{BLACK}Finanzia una Piantagione di gomma
+STR_CONSTRUCT_WATER_SUPPLY_TIP                                  :{BLACK}Finanzia la ricerca di una Falda acquifera
+STR_CONSTRUCT_COTTON_CANDY_TIP                                  :{BLACK}Pianta una Foresta di zucchero filato
+STR_CONSTRUCT_BATTERY_FARM_TIP                                  :{BLACK}Finanzia una Fattoria delle batterie
+STR_CONSTRUCT_COLA_WELLS_TIP                                    :{BLACK}Scava in cerca di Cola
+STR_CONSTRUCT_PLASTIC_FOUNTAINS_TIP                             :{BLACK}Finanzia una Sorgente di plastica
+STR_CONSTRUCT_BUBBLE_GENERATOR_TIP                              :{BLACK}Costruisce un Generatore di bollicine
+STR_CONSTRUCT_TOFFEE_QUARRY_TIP                                 :{BLACK}Finanzia una Cava di toffee
+STR_CONSTRUCT_SUGAR_MINE_TIP                                    :{BLACK}Costruisce una Miniera di zucchero
 
 STR_INDUSTRYDIR_CAPTION                                         :{WHITE}Industrie
 STR_INDUSTRYDIR_ITEM                                            :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}){YELLOW} ({COMMA}% trasportato)
-STR_INDUSTRYDIR_ITEM_TWO                                        :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}/{CARGO}){YELLOW} ({COMMA}%/{COMMA}% trasportate)
+STR_INDUSTRYDIR_ITEM_TWO                                        :{ORANGE}{INDUSTRY}{BLACK} ({CARGO}/{CARGO}){YELLOW} ({COMMA}%/{COMMA}% trasportato)
 STR_INDUSTRYDIR_ITEM_NOPROD                                     :{ORANGE}{INDUSTRY}
 
-STR_INDUSTRY_TOO_CLOSE                                          :{WHITE}...troppo vicina ad un'altra industria.
+STR_INDUSTRY_TOO_CLOSE                                          :{WHITE}...troppo vicina ad un'altra industria
 
-STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Riadatta il treno per trasportare un differente tipo di carico
+STR_RAIL_REFIT_VEHICLE_TO_CARRY                                 :{BLACK}Riadatta il treno per trasportare un carico differente
 STR_RAIL_REFIT_VEHICLE                                          :{BLACK}Riadatta treno
-STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Seleziona tipo di carico per il treno
+STR_RAIL_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Selezionare il tipo di carico da far trasportare al treno
 STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED                             :{BLACK}Riadatta il treno per trasportare il tipo di carico selezionato
 STR_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Impossibile riadattare il treno...
-STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Gli intervalli di servizio sono in percentuale: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Gli intervalli di manutenzione sono in percentuale: {ORANGE}{STRING}
 STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Cambia produzione
 
-TEMP_AI_IN_PROGRESS                                             :{WHITE}Benvenuto nella nuova IA, in sviluppo. Puoi aspettarti dei problemi. Quando succede, fai uno screenshot e invialo sul forum. Divertiti!
-TEMP_AI_ACTIVATED                                               :{WHITE}Attenzione: la nuova IA è ancora in alpha! Per ora solo i camion e i bus funzionano!
-TEMP_AI_MULTIPLAYER                                             :{WHITE}Attenzione: questa funzione è sperimentale. Siete pregati di segnalare i relativi probemi a: truelight@openttd.org.
+TEMP_AI_IN_PROGRESS                                             :{WHITE}Benvenuti nella nuova IA, in sviluppo. Se si incontrano dei problemi, fare uno screenshot e inviarlo sul forum.
+TEMP_AI_ACTIVATED                                               :{WHITE}Attenzione: la nuova IA è ancora in alpha! Attualmente funzionano solo camion e autobus!
+TEMP_AI_MULTIPLAYER                                             :{WHITE}Attenzione: l'implementazione è ancora sperimentale (utilizza la nuova IA). Segnalare qualsiasi problema a: truelight@openttd.org.
 
 ############ network gui strings
 
-STR_NETWORK_MULTIPLAYER                                         :{WHITE}Multiplayer
+STR_NETWORK_MULTIPLAYER                                         :{WHITE}Multigiocatore
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Nome giocatore:
-STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Questo è il nome con cui gli altri giocatori ti identificheranno
+STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Questo è il nome con cui si verrà identificati dagli altri giocatori
 STR_NETWORK_CONNECTION                                          :{BLACK}Connessione:
-STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Scegli tra un gioco internet e un gioco in LAN (Local Area Network)
+STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Sceglie fra una partita in Internet o in rete locale (LAN)
 
 STR_NETWORK_START_SERVER                                        :{BLACK}Avvia server
-STR_NETWORK_START_SERVER_TIP                                    :{BLACK}Avvia il tuo server
+STR_NETWORK_START_SERVER_TIP                                    :{BLACK}Avvia il proprio server
 
 STR_NETWORK_GAME_NAME                                           :{BLACK}Nome
-STR_NETWORK_GAME_NAME_TIP                                       :{BLACK}Nome del gioco
-STR_NETWORK_INFO_ICONS_TIP                                      :{BLACK}Lingua, versione server, ecc.
-STR_NETWORK_CLICK_GAME_TO_SELECT                                :{BLACK}Clicca su un nome della lista per selezionarlo
+STR_NETWORK_GAME_NAME_TIP                                       :{BLACK}Nome della partita
+STR_NETWORK_INFO_ICONS_TIP                                      :{BLACK}Lingua, versione del server, etc.
+STR_NETWORK_CLICK_GAME_TO_SELECT                                :{BLACK}Fare clic su una partita in elenco per selezionarla
 
 STR_NETWORK_FIND_SERVER                                         :{BLACK}Trova server
-STR_NETWORK_FIND_SERVER_TIP                                     :{BLACK}Cerca nella rete un server
+STR_NETWORK_FIND_SERVER_TIP                                     :{BLACK}Cerca un server sulla rete
 STR_NETWORK_ADD_SERVER                                          :{BLACK}Aggiungi server
-STR_NETWORK_ADD_SERVER_TIP                                      :{BLACK}Aggiungi un server alla lista che verrà sempre controllata per giochi attivi.
-STR_NETWORK_ENTER_IP                                            :{BLACK}Digita indirizzo IP del server
+STR_NETWORK_ADD_SERVER_TIP                                      :{BLACK}Aggiunge all'elenco un server che verrà sempre controllato in cerca di partite attive
+STR_NETWORK_ENTER_IP                                            :{BLACK}Digitare l'indirizzo del server
 
 STR_NETWORK_GENERAL_ONLINE                                      :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA}
-STR_NETWORK_CLIENTS_CAPTION                                     :{BLACK}Clients
-STR_NETWORK_CLIENTS_CAPTION_TIP                                 :{BLACK}Clients online / clients max{}Società online / società max
+STR_NETWORK_CLIENTS_CAPTION                                     :{BLACK}Client
+STR_NETWORK_CLIENTS_CAPTION_TIP                                 :{BLACK}Client online / client max{}Compagnie online / compagnie max
 STR_NETWORK_GAME_INFO                                           :{SILVER}INFORMAZIONI PARTITA
 STR_ORANGE                                                      :{ORANGE}{STRING}
-STR_NETWORK_CLIENTS                                             :{SILVER}Clients:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
+STR_NETWORK_CLIENTS                                             :{SILVER}Client:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
 STR_NETWORK_LANGUAGE                                            :{SILVER}Lingua:  {WHITE}{STRING}
-STR_NETWORK_TILESET                                             :{SILVER}Ambiente:  {WHITE}{STRING}
-STR_NETWORK_MAP_SIZE                                            :{SILVER}Dimens:  {WHITE}{COMMA}x{COMMA}
+STR_NETWORK_TILESET                                             :{SILVER}Paesaggio:  {WHITE}{STRING}
+STR_NETWORK_MAP_SIZE                                            :{SILVER}Dimensione mappa:  {WHITE}{COMMA}x{COMMA}
 STR_NETWORK_SERVER_VERSION                                      :{SILVER}Versione server:  {WHITE}{STRING}
 STR_NETWORK_SERVER_ADDRESS                                      :{SILVER}Indirizzo del server:  {WHITE}{STRING} : {NUM}
 STR_NETWORK_START_DATE                                          :{SILVER}Data di inizio:  {WHITE}{DATE_SHORT}
@@ -1321,26 +1348,26 @@
 STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}SERVER OFFLINE
 STR_NETWORK_SERVER_FULL                                         :{SILVER}SERVER PIENO
 STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}VERSIONE DIFFERENTE
-STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF DISALLINEATA
+STR_NETWORK_GRF_MISMATCH                                        :{SILVER}NEWGRF DIFFERENTI
 
-STR_NETWORK_JOIN_GAME                                           :{BLACK}Entra nel gioco
+STR_NETWORK_JOIN_GAME                                           :{BLACK}Entra nella partita
 
 
-STR_NETWORK_START_GAME_WINDOW                                   :{WHITE}Avvia nuovo gioco
+STR_NETWORK_START_GAME_WINDOW                                   :{WHITE}Avvia nuova partita multigiocatore
 
-STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nome gioco:
-STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Il nome della partita verrà visualizzato dagli altri giocatori nel menu di selezione del gioco
+STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}Nome partita:
+STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}Il nome della partita sarà mostrato dagli altri giocatori nel menu di selezione delle partite multigiocatore
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}Imposta password
-STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Proteggi il tuo gioco con una password se non vuoi che altre persone vi entrino
+STR_NETWORK_PASSWORD_TIP                                        :{BLACK}Protegge la partita con una password in modo che non sia accessibile pubblicamente
 STR_NETWORK_SELECT_MAP                                          :{BLACK}Seleziona una mappa:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}Con quale mappa vuoi giocare?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Massimo numero di clients:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Imposta il numero massimo di clients. Non tutti i slot devono essere riempiti
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}Max client:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}Imposta il numero massimo di client. Non tutti i posti dovranno essere occupati
 STR_NETWORK_COMBO1                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :LAN
 STR_NETWORK_INTERNET                                            :Internet
 STR_NETWORK_LAN_INTERNET                                        :LAN / Internet
-STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (avvisa)
+STR_NETWORK_INTERNET_ADVERTISE                                  :Internet (pubblicizza)
 STR_NETWORK_COMBO2                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_0_PLAYERS                                           :0 giocatori
 STR_NETWORK_1_PLAYERS                                           :1 giocatore
@@ -1353,19 +1380,19 @@
 STR_NETWORK_8_PLAYERS                                           :8 giocatori
 STR_NETWORK_9_PLAYERS                                           :9 giocatori
 STR_NETWORK_10_PLAYERS                                          :10 giocatori
-STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Massimo società :
-STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Limitare il server ad un certo numero di società
+STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}Max compagnie:
+STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}Limita il server a un certo numero di compagnie
 STR_NETWORK_COMBO3                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Massimo spettatori:
-STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Limitare il server ad un certo numero di spettatori
+STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}Max spettatori:
+STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}Limita il server a un certo numero di spettatori
 STR_NETWORK_COMBO4                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Lingua parlata:
-STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Gli altri giocatori sapranno quale lingua viene parlata sul server
+STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Fa spaere agli altri giocatori quale lingua è parlata sul server
 STR_NETWORK_COMBO5                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_NETWORK_START_GAME                                          :{BLACK}Avvia gioco
-STR_NETWORK_START_GAME_TIP                                      :{BLACK}Inizia una nuova partita in rete partendo da una mappa random o da uno scenario
-STR_NETWORK_LOAD_GAME                                           :{BLACK}Carica Gioco
-STR_NETWORK_LOAD_GAME_TIP                                       :{BLACK}Riprendi una partita salvata in precedenza (Assicurati di connetterti come il giocatore corretto)
+STR_NETWORK_START_GAME                                          :{BLACK}Avvia partita
+STR_NETWORK_START_GAME_TIP                                      :{BLACK}Inizia una nuova partita in rete con una mappa casuale o uno scenario
+STR_NETWORK_LOAD_GAME                                           :{BLACK}Carica partita
+STR_NETWORK_LOAD_GAME_TIP                                       :{BLACK}Riprende una partita multigiocatore salvata in precedenza (assicurarsi di connettersi come il giocatore corretto)
 
 ############ Leave those lines in this order!!
 STR_NETWORK_LANG_ANY                                            :Qualsiasi
@@ -1374,97 +1401,97 @@
 STR_NETWORK_LANG_FRENCH                                         :Francese
 ############ End of leave-in-this-order
 
-STR_NETWORK_GAME_LOBBY                                          :{WHITE}Stanza di gioco multiplayer
+STR_NETWORK_GAME_LOBBY                                          :{WHITE}Stanza principale partita multigiocatore
 
-STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}In procinto di entrare:   {ORANGE}{STRING}
-STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}Lista di tutte le società attualmente nel gioco. Puoi usare una di queste o fondarne una se c'è un posto libero
-STR_NETWORK_NEW_COMPANY                                         :{BLACK}Nuova società
-STR_NETWORK_NEW_COMPANY_TIP                                     :{BLACK}Apri una nuova società
+STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}Preparazione all'ingresso in:   {ORANGE}{STRING}
+STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}Elenco di tutte le compagnie attualmente nella partita. È possibile unirsi ad una di esse o fondarne una nuova se è disponibile un posto
+STR_NETWORK_NEW_COMPANY                                         :{BLACK}Nuova compagnia
+STR_NETWORK_NEW_COMPANY_TIP                                     :{BLACK}Crea una nuova compagnia
 STR_NETWORK_SPECTATE_GAME                                       :{BLACK}Assisti alla partita
-STR_NETWORK_SPECTATE_GAME_TIP                                   :{BLACK}Assisti al gioco come spettatore
-STR_NETWORK_JOIN_COMPANY                                        :{BLACK}Usa società
-STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}Aiuta a controllare questa società
-STR_NETWORK_REFRESH                                             :{BLACK}Ricarica server
-STR_NETWORK_REFRESH_TIP                                         :{BLACK}Ricarica informazioni del server
+STR_NETWORK_SPECTATE_GAME_TIP                                   :{BLACK}Osserva la partita come spettatore
+STR_NETWORK_JOIN_COMPANY                                        :{BLACK}Usa compagnia
+STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}Aiuta a controllare questa compagnia
+STR_NETWORK_REFRESH                                             :{BLACK}Aggiorna
+STR_NETWORK_REFRESH_TIP                                         :{BLACK}Aggiorna le informazioni sul server
 
 STR_NETWORK_COMPANY_INFO                                        :{SILVER}INFORMAZIONI COMPAGNIA
 
-STR_NETWORK_COMPANY_NAME                                        :{SILVER}Nome società:  {WHITE}{STRING}
+STR_NETWORK_COMPANY_NAME                                        :{SILVER}Nome compagnia:  {WHITE}{STRING}
 STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}Inaugurazione:  {WHITE}{NUM}
-STR_NETWORK_VALUE                                               :{SILVER}Valore società:  {WHITE}{CURRENCY64}
+STR_NETWORK_VALUE                                               :{SILVER}Valore compagnia:  {WHITE}{CURRENCY64}
 STR_NETWORK_CURRENT_BALANCE                                     :{SILVER}Bilancio corrente:  {WHITE}{CURRENCY64}
-STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}Entrate dell'ultimo anno:  {WHITE}{CURRENCY64}
+STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}Incassi anno scorso:  {WHITE}{CURRENCY64}
 STR_NETWORK_PERFORMANCE                                         :{SILVER}Prestazioni:  {WHITE}{NUM}
 
 STR_NETWORK_VEHICLES                                            :{SILVER}Veicoli:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
 STR_NETWORK_STATIONS                                            :{SILVER}Stazioni:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
 STR_NETWORK_PLAYERS                                             :{SILVER}Giocatori:  {WHITE}{STRING}
 
-STR_NETWORK_CONNECTING                                          :{WHITE}Connessione in corso...
+STR_NETWORK_CONNECTING                                          :{WHITE}Connessione...
 
 ############ Leave those lines in this order!!
 STR_NETWORK_CONNECTING_1                                        :{BLACK}(1/6) Connessione..
 STR_NETWORK_CONNECTING_2                                        :{BLACK}(2/6) Autorizzazione..
-STR_NETWORK_CONNECTING_3                                        :{BLACK}(3/6) Attendere prego..
-STR_NETWORK_CONNECTING_4                                        :{BLACK}(4/6) Download mappa..
-STR_NETWORK_CONNECTING_5                                        :{BLACK}(5/6) Caricamento dei dati..
+STR_NETWORK_CONNECTING_3                                        :{BLACK}(3/6) In attesa..
+STR_NETWORK_CONNECTING_4                                        :{BLACK}(4/6) Download della mappa..
+STR_NETWORK_CONNECTING_5                                        :{BLACK}(5/6) Elaborazione dei dati..
 STR_NETWORK_CONNECTING_6                                        :{BLACK}(6/6) Registrazione..
 
-STR_NETWORK_CONNECTING_SPECIAL_1                                :{BLACK}Ricezione informazioni gioco..
-STR_NETWORK_CONNECTING_SPECIAL_2                                :{BLACK}Ricezione informazioni società ..
+STR_NETWORK_CONNECTING_SPECIAL_1                                :{BLACK}Recupero informazioni partita..
+STR_NETWORK_CONNECTING_SPECIAL_2                                :{BLACK}Recupero informazioni compagnie..
 ############ End of leave-in-this-order
-STR_NETWORK_CONNECTING_WAITING                                  :{BLACK}{NUM} clients in attesa
+STR_NETWORK_CONNECTING_WAITING                                  :{BLACK}{NUM} client in attesa
 STR_NETWORK_CONNECTING_DOWNLOADING                              :{BLACK}{NUM} / {NUM} kbyte scaricati
 
-STR_NETWORK_DISCONNECT                                          :{BLACK}Disconnessione
+STR_NETWORK_DISCONNECT                                          :{BLACK}Disconnetti
 
-STR_NETWORK_GIVE_MONEY_CAPTION                                  :{WHITE}Inserisci l'ammontare di denaro che vuoi donare
-STR_NETWORK_NEED_GAME_PASSWORD_CAPTION                          :{WHITE}Server protetto. Inserisci la password
-STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION                       :{WHITE}Società protetta. Inserisci la password
-STR_NETWORK_CLIENT_LIST                                         :{WHITE}Lista dei clients
+STR_NETWORK_GIVE_MONEY_CAPTION                                  :{WHITE}Inserire la quantità di denaro da donare
+STR_NETWORK_NEED_GAME_PASSWORD_CAPTION                          :{WHITE}Server protetto. Inserire la password
+STR_NETWORK_NEED_COMPANY_PASSWORD_CAPTION                       :{WHITE}Compagnia protetta. Inserire la password
+STR_NETWORK_CLIENT_LIST                                         :{WHITE}Elenco dei client
 
 STR_NETWORK_ERR_NOTAVAILABLE                                    :{WHITE} Nessun dispositivo di rete trovato o compilato senza ENABLE_NETWORK
 STR_NETWORK_ERR_NOSERVER                                        :{WHITE} Impossibile trovare partite in rete
 STR_NETWORK_ERR_NOCONNECTION                                    :{WHITE} Il server non ha risposto alla richiesta
-STR_NETWORK_ERR_NEWGRF_MISMATCH                                 :{WHITE} Impossibile collegarsi causa file NewGRF non corrispondenti
-STR_NETWORK_ERR_DESYNC                                          :{WHITE} Sincronizzazione alla partita in rete fallita.
+STR_NETWORK_ERR_NEWGRF_MISMATCH                                 :{WHITE} Impossibile connettersi a causa di file NewGRF differenti
+STR_NETWORK_ERR_DESYNC                                          :{WHITE} Sincronizzazione alla partita in rete fallita
 STR_NETWORK_ERR_LOSTCONNECTION                                  :{WHITE} Connessione alla partita in rete persa.
-STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Impossibile caricare il savegame dal server.
-STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Impossibile inizializzare il server
+STR_NETWORK_ERR_SAVEGAMEERROR                                   :{WHITE} Impossibile caricare la partita salvata
+STR_NETWORK_ERR_SERVER_START                                    :{WHITE} Impossibile avviare il server
 STR_NETWORK_ERR_CLIENT_START                                    :{WHITE} Impossibile connettersi
-STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Connessione #{NUM} time-out.
+STR_NETWORK_ERR_TIMEOUT                                         :{WHITE} Tempo scaduto per la connessione #{NUM}
 STR_NETWORK_ERR_SERVER_ERROR                                    :{WHITE} Un errore di protocollo ha chiuso la connessione
-STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE} La revision del client non è la stessa di quella del server
-STR_NETWORK_ERR_WRONG_PASSWORD                                  :{WHITE} Password Errata
+STR_NETWORK_ERR_WRONG_REVISION                                  :{WHITE} La revisione di questo client non corrisponde a quella del server
+STR_NETWORK_ERR_WRONG_PASSWORD                                  :{WHITE} Password errata
 STR_NETWORK_ERR_SERVER_FULL                                     :{WHITE} Il server è pieno
 STR_NETWORK_ERR_SERVER_BANNED                                   :{WHITE} Sei stato bannato da questo server
-STR_NETWORK_ERR_KICKED                                          :{WHITE} Sei stato espulso dal gioco
+STR_NETWORK_ERR_KICKED                                          :{WHITE} Sei stato espulso dalla partita
 STR_NETWORK_ERR_CHEATER                                         :{WHITE} I trucchi non sono ammessi su questo server
 
 STR_NETWORK_ERR_LEFT                                            :ha lasciato il gioco
 ############ Leave those lines in this order!!
 STR_NETWORK_ERR_CLIENT_GENERAL                                  :errore generale
 STR_NETWORK_ERR_CLIENT_DESYNC                                   :errore di sincronizzazione
-STR_NETWORK_ERR_CLIENT_SAVEGAME                                 :Impossibile caricare la mappa
-STR_NETWORK_ERR_CLIENT_CONNECTION_LOST                          :Connessione perduta
+STR_NETWORK_ERR_CLIENT_SAVEGAME                                 :impossibile caricare la mappa
+STR_NETWORK_ERR_CLIENT_CONNECTION_LOST                          :connessione perduta
 STR_NETWORK_ERR_CLIENT_PROTOCOL_ERROR                           :errore di protocollo
-STR_NETWORK_ERR_CLIENT_NEWGRF_MISMATCH                          :File NewGRF non corrispondenti
-STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED                           :Non Autorizzato
-STR_NETWORK_ERR_CLIENT_NOT_EXPECTED                             :ricevuto uno strano pacchetto
+STR_NETWORK_ERR_CLIENT_NEWGRF_MISMATCH                          :file NewGRF non corrispondenti
+STR_NETWORK_ERR_CLIENT_NOT_AUTHORIZED                           :non autorizzato
+STR_NETWORK_ERR_CLIENT_NOT_EXPECTED                             :ricevuto un pacchetto inatteso
 STR_NETWORK_ERR_CLIENT_WRONG_REVISION                           :revisione differente
 STR_NETWORK_ERR_CLIENT_NAME_IN_USE                              :nome già in uso
-STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD                           :game-password errata
-STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH                          :player-id errato in DoCommand
-STR_NETWORK_ERR_CLIENT_KICKED                                   :Espulso dal server
+STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD                           :password errata
+STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH                          :id giocatore errato in DoCommand
+STR_NETWORK_ERR_CLIENT_KICKED                                   :espulso dal server
 STR_NETWORK_ERR_CLIENT_CHEATER                                  :ha provato a usare un trucco
 STR_NETWORK_ERR_CLIENT_SERVER_FULL                              :server pieno
 ############ End of leave-in-this-order
-STR_NETWORK_CLIENT_JOINED                                       :è entrato nel gioco
-STR_NETWORK_GIVE_MONEY                                          :ha donato alla tua società del denaro ({CURRENCY})
+STR_NETWORK_CLIENT_JOINED                                       :è entrato nella partita
+STR_NETWORK_GIVE_MONEY                                          :ha donato alla tua compagnia del denaro ({CURRENCY})
 STR_NETWORK_GAVE_MONEY_AWAY                                     :hai donato a {STRING} del denaro ({CURRENCY})
-STR_NETWORK_CHAT_COMPANY_CAPTION                                :[Team] :
-STR_NETWORK_CHAT_COMPANY                                        :[Gruppo] {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_TO_COMPANY                                     :[Gruppo] A {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_COMPANY_CAPTION                                :[Squadra] :
+STR_NETWORK_CHAT_COMPANY                                        :[Squadra] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_TO_COMPANY                                     :[Squadra] A {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[Privato] :
 STR_NETWORK_CHAT_CLIENT                                         :[Privato] {STRING}: {GRAY}{STRING}
 STR_NETWORK_CHAT_TO_CLIENT                                      :[Privato] A {STRING}: {GRAY}{STRING}
@@ -1478,7 +1505,7 @@
 STR_NETWORK_CLIENT                                              :Client
 STR_NETWORK_SPECTATORS                                          :Spettatori
 
-STR_NETWORK_CLIENTLIST_NONE                                     :(niente)
+STR_NETWORK_CLIENTLIST_NONE                                     :(nessuno)
 STR_NETWORK_CLIENTLIST_KICK                                     :Espelli
 STR_NETWORK_CLIENTLIST_GIVE_MONEY                               :Dona denaro
 STR_NETWORK_CLIENTLIST_SPEAK_TO_ALL                             :Parla a tutti
@@ -1491,31 +1518,31 @@
 ############ end network gui strings
 
 
-STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}X della mappa: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}Y della mappa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}Dimensione X della mappa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}Dimensione Y della mappa: {ORANGE}{STRING}
 
 
 ##### PNG-MAP-Loader
 
-STR_PNGMAP_ERROR                                                :{WHITE}Non posso caricare il terreno dal  PNG...
+STR_PNGMAP_ERROR                                                :{WHITE}Impossibile caricare il terreno il terreno dal file PNG...
 STR_PNGMAP_ERR_FILE_NOT_FOUND                                   :{WHITE}...file non trovato.
-STR_PNGMAP_ERR_IMAGE_TYPE                                       :{WHITE}...non posso convertire il tipo di immagine. Richiede immagine PNG 8 o 24-bit.
-STR_PNGMAP_ERR_MISC                                             :{WHITE}...qualcosa è andato male. Spiacente. (probabilimente il file è corrotto)
+STR_PNGMAP_ERR_IMAGE_TYPE                                       :{WHITE}...impossibile convertire il tipo di immagine. È richiesta un'immagine PNG a 8 o 24 bit.
+STR_PNGMAP_ERR_MISC                                             :{WHITE}...qualcosa non ha funzionato (probabilimente il file è corrotto)
 
-STR_BMPMAP_ERROR                                                :{WHITE}Non posso caricare il terreno da  BMP...
-STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...non posso convertire il tipo di immagine.
+STR_BMPMAP_ERROR                                                :{WHITE}Impossibile caricare il terreno dalla bitmap...
+STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...impossibile convertire il tipo di immagine
 
 ##id 0x0800
 STR_0800_COST                                                   :{TINYFONT}{RED}Costo: {CURRENCY}
 STR_0801_COST                                                   :{RED}Costo: {CURRENCY}
 STR_0802_INCOME                                                 :{TINYFONT}{GREEN}Incasso: {CURRENCY}
 STR_0803_INCOME                                                 :{GREEN}Incasso: {CURRENCY}
-STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}Trasferisci: {CURRENCY}
-STR_FEEDER                                                      :{YELLOW}Trasferisci: {CURRENCY}
-STR_0805_ESTIMATED_COST                                         :{WHITE}Costo Stimato: {CURRENCY}
-STR_0807_ESTIMATED_INCOME                                       :{WHITE}Incasso Stimato: {CURRENCY}
-STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}Non puoi alzare il terreno qui...
-STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Non puoi abbassare il terreno qui...
+STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}Trasferiti: {CURRENCY}
+STR_FEEDER                                                      :{YELLOW}Trasferiti: {CURRENCY}
+STR_0805_ESTIMATED_COST                                         :{WHITE}Costo stimato: {CURRENCY}
+STR_0807_ESTIMATED_INCOME                                       :{WHITE}Incasso stimato: {CURRENCY}
+STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}Impossibile alzare il terreno qui...
+STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Impossibile abbassare il terreno qui...
 STR_080A_ROCKS                                                  :Roccie
 STR_080B_ROUGH_LAND                                             :Terreno accidentato
 STR_080C_BARE_LAND                                              :Terreno spoglio
@@ -1525,76 +1552,102 @@
 STR_0810_DESERT                                                 :Deserto
 
 ##id 0x1000
-STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION                         :{WHITE}Terreno inclinato nella direzione errata
+STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION                         :{WHITE}Terreno inclinato nella direzione sbagliata
 STR_1001_IMPOSSIBLE_TRACK_COMBINATION                           :{WHITE}Combinazione di binari impossibile
 STR_1002_EXCAVATION_WOULD_DAMAGE                                :{WHITE}Gli scavi danneggerebbero la galleria
 STR_1003_ALREADY_AT_SEA_LEVEL                                   :{WHITE}Già al livello del mare
 STR_1004_TOO_HIGH                                               :{WHITE}Troppo alto
 STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Tipo di binari non adatti
 STR_1007_ALREADY_BUILT                                          :{WHITE}...già costruito
-STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Devi demolire prima i binari
-STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Costruzione Ferrovie
-STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Costruzione Ferrovie Elettrificate
-STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Costruzione Monorotaia
-STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}Costruzione Maglev
-STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Seleziona Ponte Ferroviario
-STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Non puoi costruire qui il deposito...
-STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Non puoi costruire qui la stazione ferroviaria...
-STR_1010_CAN_T_BUILD_SIGNALS_HERE                               :{WHITE}Non puoi piazzare qui i segnali...
-STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Non puoi costruire qui i binari...
-STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Non puoi demolire da qui i binari...
-STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Non puoi rimuovere da qui i segnali...
-STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Orientamento Deposito
+STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Bisogna demolire i binari prima
+STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Costruzione ferrovie
+STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Costruzione ferrovie elettrificate
+STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Costruzione monorotaia
+STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}Costruzione maglev
+STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Seleziona ponte ferroviario
+STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Impossibile costruire il deposito qui...
+STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Impossibile costruire la stazione qui...
+STR_1010_CAN_T_BUILD_SIGNALS_HERE                               :{WHITE}Impossibile costruire i segnali qui...
+STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Impossibile costruire i binari qui...
+STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Impossibile rimuovere i binari da qui...
+STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Impossibile rimuovere i segnali da qui...
+STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Orientamento deposito
 STR_1015_RAILROAD_CONSTRUCTION                                  :Costruzione ferrovie
 STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Costruzione ferrovie elettrificate
 STR_1016_MONORAIL_CONSTRUCTION                                  :Costruzione monorotaia
 STR_1017_MAGLEV_CONSTRUCTION                                    :Costruzione maglev
-STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Costruisci binari
-STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Costruisci deposito treni (per costruzione e manutenzione)
-STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Costruisci stazione ferroviaria
-STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Costruisci segnale ferroviario
-STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Costruisci ponte ferroviario
-STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Costruisci tunnel ferroviario
-STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Seleziona costruisci/demolisci per binari e segnali
-STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Selezione ponte - clicca sul ponte selezionato per costruirlo
-STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO                       :{BLACK}Seleziona orientamento deposito ferroviario
+STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Costruisce i binari
+STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Costruisce un deposito ferroviario (per costruire e manutenere i treni)
+STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Costruisce una stazione ferroviaria
+STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Costruisce i segnali ferroviari
+STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Costruisce un ponte ferroviario
+STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Costruisce un tunnel ferroviario
+STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Seleziona fra costruzione/rimozione di binari e segnali
+STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Selezione ponte - fare clic sul ponte desiderato per costruirlo
+STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO                       :{BLACK}Seleziona l'orientamento del deposito ferroviario
 STR_1021_RAILROAD_TRACK                                         :Binari
 STR_1023_RAILROAD_TRAIN_DEPOT                                   :Deposito ferroviario
-STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...area di proprietà di un altra società
-STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Binario ferroviario con segnali normali
-STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Binario ferroviario con presegnali
-STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Binario ferroviario con segnali di uscita
-STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Binario ferroviario con segnali combinati
+STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...l'area appartiene a un'altra compagnia
+STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Ferrovia con segnali normali
+STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Ferrovia con pre-segnali
+STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Ferrovia con segnali di uscita
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Ferrovia con segnali combinati
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Ferrovia con segnali normali e pre-segnali
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Ferrovia con segnali normali e di uscita
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Ferrovia con segnali normali e combinati
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Ferrovia con pre-segnali e segnali di uscita
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Ferrovia con pre-segnali e segnali combinati
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Ferrovia con segnali di uscita e combinati
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Bisogna rimuovere la stazione prima
 
 
 
 ##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Devi demolire prima la strada
-STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Lavori stradali in progresso
-STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Costruzione Strade
-STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Seleziona Ponte Stradale
-STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Non puoi costruire qui la strada...
-STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Non puoi demolire da qui la strada...
-STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Orientamento Deposito
-STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Non puoi costruire qui il deposito stradale...
-STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Non puoi costruire qui la fermata bus...
-STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Non puoi costruire qui la stazione di carico...
+STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Bisogna rimuovere la strada prima
+STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Lavori stradali in corso
+STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Costruzione strade
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Costruzione tranvie
+STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Seleziona ponte stradale
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}...le strade a senso unico non possono avere raccordi
+STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Impossibile costruire la strada qui...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Impossibile costruire la tranvia qui...
+STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Impossibile rimuovere la strada da qui...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Impossibile rimuovere la tranvia da qui...
+STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Orientamento deposito
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Orientamento deposito
+STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Impossibile costruire il deposito qui...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Impossibile costruire il deposito qui...
+STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Impossibile costruire la stazione degli autobus qui...
+STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Impossibile costruire la stazione dei camion qui...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Impossibile costruire la stazione tram passeggeri...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Impossibile costruire la stazione tram merci...
 STR_180A_ROAD_CONSTRUCTION                                      :Costruzione strade
-STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Costruisci sezione stradale
-STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Costruisci deposito veicoli stradali (per costruzione e manutenzione)
-STR_180D_BUILD_BUS_STATION                                      :{BLACK}Costruisci fermata bus
-STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Costruisci stazione di carico
-STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Costruisci ponte stradale
-STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Costruisci tunnel stradale
-STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Seleziona costruisci/demolisci per le costruzioni stradali
-STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Seleziona orientamento deposito veicoli stradali
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Costruzione tranvie
+STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Costruisce una sezione di strada
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Costruisce una sezione di tranvia
+STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Costruisce un deposito automezzi (per costruire e manutenere i veicoli)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Costruisce un deposito tranviario (per costruire e manutenere i veicoli)
+STR_180D_BUILD_BUS_STATION                                      :{BLACK}Costruisce una stazione degli autobus
+STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Costruisce un'area di carico per camion
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Costruisce una stazione tram passeggeri
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Costruisce una stazione tram merci
+STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Costruisce un ponte stradale
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Costruisce un ponte tranviario
+STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Costruisce un tunnel stradale
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Costruisce un tunnel tranviario
+STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Seleziona fra costruzione/rimozione di strade
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Seleziona fra costruzione/rimozione di tranvie
+STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Seleziona l'orientamento del deposito automezzi
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Seleziona l'orientamento del deposito tranviario
 STR_1814_ROAD                                                   :Strada
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Strada con lampioni
 STR_1816_TREE_LINED_ROAD                                        :Strada alberata
-STR_1817_ROAD_VEHICLE_DEPOT                                     :Deposito veicoli
+STR_1817_ROAD_VEHICLE_DEPOT                                     :Deposito automezzi
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Passaggio a livello
-STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Non posso togliere la fermata bus...
-STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Non posso togliere la stazione camion...
+STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Impossibile rimuovere la stazione degli autobus...
+STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Impossibile rimuovere l'area di carico per camion...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Impossibile rimuovere la stazione tram passeggeri...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Impossibile rimuovere la stazione tram merci...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Città
@@ -1603,99 +1656,99 @@
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{STRING}
-STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}E' necessario demolire prima l'edificio
+STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}L'edificio deve essere demolito prima
 STR_2005                                                        :{WHITE}{TOWN}
 STR_2006_POPULATION                                             :{BLACK}Popolazione: {ORANGE}{COMMA}{BLACK}  Case: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Rinomina città
-STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Non puoi rinominare la città...
-STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}L'autorità locale di {TOWN} non ti autorizza a farlo
-STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Elenco città - clicca sul nome per centrare la visuale sulla città
-STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centra la visuale sulla città
-STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Cambia nome alla città
-STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}Passeggeri il mese scorso: {ORANGE}{COMMA}{BLACK}  massimo: {ORANGE}{COMMA}
-STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}Posta il mese scorso: {ORANGE}{COMMA}{BLACK}  massimo: {ORANGE}{COMMA}
-STR_200F_TALL_OFFICE_BLOCK                                      :Blocco di uffici alto
-STR_2010_OFFICE_BLOCK                                           :Blocco di uffici
-STR_2011_SMALL_BLOCK_OF_FLATS                                   :Piccolo blocco di appartamenti
+STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Impossibile rinominare la città...
+STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}L'autorità locale di {TOWN} non lo autorizza
+STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Nomi delle città - fare clic su un nome per centrare la visuale sulla città
+STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centra la visuale principale sulla posizione della città
+STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Cambia il nome della città
+STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}Passeggeri il mese scorso: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
+STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}Posta il mese scorso: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
+STR_200F_TALL_OFFICE_BLOCK                                      :Grattacielo di uffici
+STR_2010_OFFICE_BLOCK                                           :Palazzo di uffici
+STR_2011_SMALL_BLOCK_OF_FLATS                                   :Piccolo condominio
 STR_2012_CHURCH                                                 :Chiesa
-STR_2013_LARGE_OFFICE_BLOCK                                     :Blocco di uffici grande
+STR_2013_LARGE_OFFICE_BLOCK                                     :Grande palazzo di uffici
 STR_2014_TOWN_HOUSES                                            :Case
 STR_2015_HOTEL                                                  :Albergo
 STR_2016_STATUE                                                 :Statua
 STR_2017_FOUNTAIN                                               :Fontana
 STR_2018_PARK                                                   :Parco
-STR_2019_OFFICE_BLOCK                                           :Blocco di uffici
+STR_2019_OFFICE_BLOCK                                           :Palazzo di uffici
 STR_201A_SHOPS_AND_OFFICES                                      :Negozi e uffici
 STR_201B_MODERN_OFFICE_BUILDING                                 :Palazzo di uffici moderno
 STR_201C_WAREHOUSE                                              :Magazzino
-STR_201D_OFFICE_BLOCK                                           :Blocco di uffici
+STR_201D_OFFICE_BLOCK                                           :Palazzo di uffici
 STR_201E_STADIUM                                                :Stadio
 STR_201F_OLD_HOUSES                                             :Case vecchie
 STR_2020_LOCAL_AUTHORITY                                        :{BLACK}Autorità locale
 STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}Mostra informazioni sull'autorità locale
 STR_2022_LOCAL_AUTHORITY                                        :{WHITE}Autorità locale di {TOWN}
-STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Valutazione servizi di trasporto delle società:
+STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Valutazione delle compagnie di trasporto:
 STR_2024                                                        :{YELLOW}{COMPANY}{PLAYERNAME}: {ORANGE}{STRING}
 STR_2025_SUBSIDIES                                              :{WHITE}Sussidi
-STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Sussidi offerti per il servizio:
+STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Sussidi offerti per la realizzazione di servizi:
 STR_2027_FROM_TO                                                :{ORANGE}{STRING} da {STRING} a {STRING}
 STR_2028_BY                                                     :{YELLOW} (entro {DATE_SHORT})
 STR_202A_NONE                                                   :{ORANGE}Nessuno
-STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Servizi già sussidiati:
+STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Servizi già sovvenzionati:
 STR_202C_FROM_TO                                                :{ORANGE}{STRING} da {STATION} a {STATION}{YELLOW} ({COMPANY}
 STR_202D_UNTIL                                                  :{YELLOW}, fino al {DATE_SHORT})
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Offerta di sussidio scaduta:{}{}{STRING} da {STRING} a {STRING} non sarà più sovvenzionato.
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Sussidio terminato:{}{}servizio di {STRING} da {STATION} a {STATION} non è più sovvenzionato.
-STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Offerta di sussidio:{}{}Primo servizio di {STRING} da {STRING} a {STRING} riceverà un'anno di sussidio dall'autorità locale!
-STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato da {COMPANY}!{}{}servizio di {STRING} da {STATION} a {STATION} verrà pagato il 50% in più per il prossimo anno!
-STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato da {COMPANY}!{}{}servizio di {STRING} da {STATION} a {STATION} verrà pagato il doppio per il prossimo anno!
-STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato da {COMPANY}!{}{}servizio di {STRING} da {STATION} a {STATION} verrà pagato il triplo per il prossimo anno!
-STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato da {COMPANY}!{}{}servizio di {STRING} da {STATION} a {STATION} verrà pagato il quadruplo per il prossimo anno!
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Offerta di sussidio scaduta:{}{}Il trasporto di {STRING} da {STRING} a {STRING} non darà più diritto a sovvenzioni.
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Sussidio terminato:{}{}Il trasporto di {STRING} da {STATION} a {STATION} non è più sovvenzionato.
+STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Offerta di sussidio:{}{}Il primo servizio di {STRING} da {STRING} a {STRING} riceverà un'anno di sovvenzioni dall'autorità locale!
+STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato alla {COMPANY}!{}{}Il trasporto di {STRING} da {STATION} a {STATION} verrà pagato il 50% in più per il prossimo anno!
+STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato alla {COMPANY}!{}{}Il trasporto di {STRING} da {STATION} a {STATION} verrà pagato il doppio per il prossimo anno!
+STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato alla {COMPANY}!{}{}Il trasporto di {STRING} da {STATION} a {STATION} verrà pagato il triplo per il prossimo anno!
+STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Sussidio aggiudicato alla {COMPANY}!{}{}Il trasporto di {STRING} da {STATION} a {STATION} verrà pagato il quadruplo per il prossimo anno!
 STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}L'autorita locale di {TOWN} rifiuta la costruzione di un altro aeroporto nella città
 STR_2036_COTTAGES                                               :Cottage
 STR_2037_HOUSES                                                 :Case
 STR_2038_FLATS                                                  :Appartamenti
-STR_2039_TALL_OFFICE_BLOCK                                      :Blocco di uffici alto
+STR_2039_TALL_OFFICE_BLOCK                                      :Grattacielo di uffici
 STR_203A_SHOPS_AND_OFFICES                                      :Negozi e uffici
 STR_203B_SHOPS_AND_OFFICES                                      :Negozi e uffici
 STR_203C_THEATER                                                :Teatro
 STR_203D_STADIUM                                                :Stadio
-STR_203E_OFFICES                                                :Offici
+STR_203E_OFFICES                                                :Uffici
 STR_203F_HOUSES                                                 :Case
 STR_2040_CINEMA                                                 :Cinema
 STR_2041_SHOPPING_MALL                                          :Centro commerciale
-STR_2042_DO_IT                                                  :{BLACK}Fallo!
-STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Lista azioni eseguibili in questa città - clicca sopra per i dettagli
-STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}Trascina l'azione evidenziata nella lista sovrastante
+STR_2042_DO_IT                                                  :{BLACK}Fallo
+STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Elenco delle azioni eseguibili in questa città - fare clic su una di esse per maggiori dettagli
+STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}Esegue l'azione selezionata nell'elenco sovrastante
 STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}Azioni disponibili:
 STR_2046_SMALL_ADVERTISING_CAMPAIGN                             :Piccola campagna pubblicitaria
 STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :Campagna pubblicitaria media
 STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :Grande campagna pubblicitaria
-STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :Finanzia ricostruzione delle strade locali
-STR_204A_BUILD_STATUE_OF_COMPANY                                :Costruisci statua del proprietario della società
+STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :Finanzia ricostruzione delle strade
+STR_204A_BUILD_STATUE_OF_COMPANY                                :Costruisci statua del proprietario della compagnia
 STR_204B_FUND_NEW_BUILDINGS                                     :Finanzia nuove costruzioni
 STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :Compra l'esclusiva sui trasporti
 STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY                              :Corrompi l'autorità locale
-STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inizia una piccola campagnia pubblicitaria per attirare più gente e merci ai tuoi servizi di trasporto.{}  Costo: {CURRENCY}
-STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Inizia una media campagnia pubblicitaria per attirare più gente e merci ai tuoi servizi di trasporto.{}  Costo: {CURRENCY}
-STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inizia una grande campagnia pubblicitaria per attirare più gente e cargo ai tuoi servizi di trasporto.{}  Costo: {CURRENCY}
+STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inizia una piccola campagnia pubblicitaria, per attirare più passeggeri e merci ai servizi di trasporto della compagnia.{}  Costo: {CURRENCY}
+STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Inizia una campagnia pubblicitaria moderata, per attirare più passeggeri e merci ai servizi di trasporto della compagnia.{}  Costo: {CURRENCY}
+STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Inizia una grande campagnia pubblicitaria locale, per attirare più passeggeri e merci ai servizi di trasporto della compagnia.{}  Costo: {CURRENCY}
 STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} Finanzia la ricostruzione della rete stradale cittadina. Causa un cosiderabile disagio al traffico stradale per 6 mesi.{}  Costo: {CURRENCY}
-STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Costruisci una statua in onore della tua società.{} Costo: {CURRENCY}
-STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Finanzia la costruzione di nuove strutture commerciali nella città.{}  Costo: {CURRENCY}
-STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Compra un anno di esclusiva sui trasporti nella città. Compra 1 anno di esclusiva sui diritti di trasporto in città. L'autorità cittadina autorizzerà passeggeri e merci a usare solo le tue stazioni.{} Costo: {CURRENCY}
-STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} Corrompi l'autorità locale per incrementare la tua valutazione con il rischio di una severa multa se scoperto.{}  Costo: {CURRENCY}
-STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}Traffico nel caos a {TOWN}!{}{}La ricostruzione stradale finanziata da {COMPANY} porterà 6 mesi di disagio agli automobilisti!
+STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Costruisce una statua in onore della compagnia.{} Costo: {CURRENCY}
+STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Finanzia la costruzione di nuovi edifici commerciali nella città.{}  Costo: {CURRENCY}
+STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Compra un 1 di diritti di trasporto esclusivi in città. L'autorità cittadina permetterà a passeggeri e merci di usare solo le stazioni della compagnia.{} Costo: {CURRENCY}
+STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} Corrompi l'autorità locale per autmentare la tua valutazione, con il rischio di una severa multa se scoperto.{}  Costo: {CURRENCY}
+STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}Traffico nel caos a {TOWN}!{}{}La ricostruzione delle strade finanziata dalla {COMPANY} porterà 6 mesi di disagio agli automobilisti!
 STR_2056                                                        :{TINYFONT}{WHITE}{TOWN}
 STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
 STR_2058_UNDER_CONSTRUCTION                                     :{STRING} (in costruzione)
 STR_2059_IGLOO                                                  :Igloo
-STR_205A_TEPEES                                                 :Tepees
+STR_205A_TEPEES                                                 :Tepee
 STR_205B_TEAPOT_HOUSE                                           :Casa-teiera
 STR_205C_PIGGY_BANK                                             :Banca-porcellino
 
 STR_INDUSTRY                                                    :{INDUSTRY}
 STR_TOWN                                                        :{TOWN}
-STR_INDUSTRY_FORMAT                                             :{TOWN} {STRING}
+STR_INDUSTRY_FORMAT                                             :{1:STRING} di {0:TOWN}
 STR_STATION                                                     :{STATION}
 
 ##id 0x2800
@@ -1705,41 +1758,41 @@
 STR_2802_TREES                                                  :{WHITE}Alberi
 STR_2803_TREE_ALREADY_HERE                                      :{WHITE}...albero già qui
 STR_2804_SITE_UNSUITABLE                                        :{WHITE}...sito inadatto
-STR_2805_CAN_T_PLANT_TREE_HERE                                  :{WHITE}Non puoi piantarequi l'albero...
+STR_2805_CAN_T_PLANT_TREE_HERE                                  :{WHITE}Impossibile piantare l'albero qui...
 STR_2806                                                        :{WHITE}{STRING}
 STR_2808_TOO_MANY_SIGNS                                         :{WHITE}...troppi cartelli
-STR_2809_CAN_T_PLACE_SIGN_HERE                                  :{WHITE}Non puoi piazzare qui il cartello...
+STR_2809_CAN_T_PLACE_SIGN_HERE                                  :{WHITE}Impossibile piazzare il cartello qui...
 STR_280A_SIGN                                                   :Cartello
 STR_280B_EDIT_SIGN_TEXT                                         :{WHITE}Modifica testo del cartello
-STR_280C_CAN_T_CHANGE_SIGN_NAME                                 :{WHITE}Non puoi modificare il testo del cartello...
+STR_280C_CAN_T_CHANGE_SIGN_NAME                                 :{WHITE}Impossibile modificare il testo del cartello...
 STR_280D_SELECT_TREE_TYPE_TO_PLANT                              :{BLACK}Seleziona il tipo di albero da piantare
 STR_280E_TREES                                                  :Alberi
 STR_280F_RAINFOREST                                             :Foresta pluviale
 STR_2810_CACTUS_PLANTS                                          :Cactus
 
 ##id 0x3000
-STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Selezione Stazione Ferroviaria
-STR_3001_AIRPORT_SELECTION                                      :{WHITE}Selezione Aeroporto
+STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Selezione stazione
+STR_3001_AIRPORT_SELECTION                                      :{WHITE}Selezione aeroporto
 STR_3002_ORIENTATION                                            :{BLACK}Orientamento
-STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}Numero binari
-STR_3004_PLATFORM_LENGTH                                        :{BLACK}Lunghezza
-STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD                          :{WHITE}Troppo vicino a un'altra stazione
-STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING                         :{WHITE}Unisci stazione esistente/area di carico
+STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}Numero di binari
+STR_3004_PLATFORM_LENGTH                                        :{BLACK}Lunghezza banchina
+STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD                          :{WHITE}Troppo vicino a un'altra stazione ferroviaria
+STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING                         :{WHITE}Farebbe parte di due o più stazioni/aree di carico
 STR_3007_TOO_MANY_STATIONS_LOADING                              :{WHITE}Troppe stazioni/aree di carico in questa città
 STR_3008_TOO_MANY_STATIONS_LOADING                              :{WHITE}Troppe stazioni/aree di carico
-STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Troppe fermate dell'autobus
-STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Troppe stazioni merci
+STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Troppe stazioni degli autobus
+STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Troppe aree di carico per camion
 STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Troppo vicino ad un'altra stazione/area di carico
 STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
-STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Devi demolire prima la stazione ferroviaria
+STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Bisogna demolire la stazione ferroviaria prima
 STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT                           :{WHITE}Troppo vicino ad un altro aeroporto
-STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}Devi demolire prima l'aeroporto
+STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}Bisogna demolire l'aeroporto prima
 
 STR_3030_RENAME_STATION_LOADING                                 :Rinomina stazione/area di carico
-STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Non puoi rinominare stazione...
+STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Impossibile rinominare la stazione...
 STR_3032_RATINGS                                                :{BLACK}Valutazione
 STR_3033_ACCEPTS                                                :{BLACK}Accetta
-STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}Valutazione del servizio trasporti locale
+STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}Valutazione del servizio trasporti locale:
 
 ############ range for rating starts
 STR_3035_APPALLING                                              :Terribile
@@ -1754,29 +1807,35 @@
 
 STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
 STR_303E_NO_LONGER_ACCEPTS                                      :{WHITE}{STATION} non accetta più {STRING}
-STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} non accetta più {STRING} o {STRING}
+STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} non accetta più {STRING} né {STRING}
 STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} adesso accetta {STRING}
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} adesso accetta {STRING} e {STRING}
-STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Orientamento Fermata Bus
-STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Orient. Area Carico Camion
-STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Devi demolire prima la fermata bus
-STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Devi demolire prima l'area carico
-STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Stazion{P e i}
+STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Orientamento stazione
+STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Orient. area carico
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Orient. stazione tram passeggeri
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Orient. stazione tram merci
+STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Bisogna demolire la stazione degli autobus prima
+STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Bisogna demolire l'area di carico per camion prima
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Bisogna demolire la stazione tram passeggeri prima
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Bisogna demolire la stazione tram merci prima
+STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} stazion{P 2 e i}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
-STR_304A_NONE                                                   :{YELLOW}- Nulla -
+STR_304A_NONE                                                   :{YELLOW}- Nessuna -
 STR_304B_SITE_UNSUITABLE                                        :{WHITE}...sito inadatto
-STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Troppo vicino a un'altro molo
-STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Devi demolire il molo prima
-STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Seleziona orientamento della stazione ferroviaria
-STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Seleziona numero di binari della stazione
-STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Seleziona lunghezza della stazione
-STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Seleziona orientamento stazione bus
-STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Seleziona orientamento stazione camion
-STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centra visuale sulla stazione
-STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Mostra valutazione servizio
+STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Troppo vicino ad un altro molo
+STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Bisogna demolire il molo prima
+STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Seleziona l'orientamento della stazione ferroviaria
+STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Seleziona il numero di binari della stazione ferroviaria
+STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Seleziona la lunghezza della stazione ferroviaria
+STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Seleziona l'orientamento della stazione degli autobus
+STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Seleziona l'orientamento dell'area di carico per camion
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Seleziona l'orientamento della stazione tram passeggeri
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Seleziona l'orientamento della stazione tram merci
+STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centra la visuale principale sulla posizione della stazione
+STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Mostra la valutazione della stazione
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Cambia il nome della stazione
 STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO                            :{BLACK}Mostra la lista delle merci accettate
-STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Nomi stazioni - clicca sul nome per centrare la visuale sulla stazione
+STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Nomi delle stazioni - fare clic su un nome per centrare la visuale principale sulla stazione
 STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT                            :{BLACK}Seleziona dimensione/tipo di aeroporto
 STR_305C_0                                                      :{STATION} {STATIONFEATURES}
 STR_STATION_SIGN_TINY                                           :{TINYFONT}{STATION}
@@ -1784,14 +1843,14 @@
 STR_305F_AIRCRAFT_HANGAR                                        :Hangar
 STR_3060_AIRPORT                                                :Aeroporto
 STR_3061_TRUCK_LOADING_AREA                                     :Area di carico per camion
-STR_3062_BUS_STATION                                            :Fermata bus
+STR_3062_BUS_STATION                                            :Stazione degli autobus
 STR_3063_SHIP_DOCK                                              :Molo
 STR_3064_HIGHLIGHT_COVERAGE_AREA                                :{BLACK}Evidenzia l'area di copertura del sito proposto
 STR_3065_DON_T_HIGHLIGHT_COVERAGE                               :{BLACK}Non evidenziare  l'area di copertura del sito proposto
 STR_3066_COVERAGE_AREA_HIGHLIGHT                                :{BLACK}Evidenzia area coperta
 STR_3068_DOCK                                                   :{WHITE}Molo
 STR_3069_BUOY                                                   :Boa
-STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...boa in mezzo
+STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...boa di mezzo
 STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...stazione troppo estesa
 STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...stazioni non uniformi disabilitate
 STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Tenere premuto CTRL per scegliere più di un oggetto
@@ -1801,14 +1860,14 @@
 STR_STAT_CLASS_WAYP                                             :Waypoint
 
 ##id 0x3800
-STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Orientamento Deposito Navale
+STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Orientamento deposito navale
 STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...deve essere costruito sull'acqua
-STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Non puoi costruire deposito navale qui...
-STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Seleziona orientamento del deposito navale
+STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Impossibile costruire il deposito navale qui...
+STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Seleziona l'orientamento del deposito navale
 STR_3804_WATER                                                  :Acqua
 STR_3805_COAST_OR_RIVERBANK                                     :Costa
 STR_3806_SHIP_DEPOT                                             :Deposito navale
-STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...non puoi costruire sull'acqua
+STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...impossibile costruire sull'acqua
 
 ##id 0x4000
 STR_4000_SAVE_GAME                                              :{WHITE}Salva partita
@@ -1816,60 +1875,60 @@
 STR_4002_SAVE                                                   :{BLACK}Salva
 STR_4003_DELETE                                                 :{BLACK}Elimina
 STR_4004                                                        :{COMPANY}, {DATE_LONG}
-STR_4005_BYTES_FREE                                             :{BLACK}{COMMA} megabyte liberi
-STR_4006_UNABLE_TO_READ_DRIVE                                   :{BLACK}Impossibile leggere dal disco
+STR_4005_BYTES_FREE                                             :{BLACK}{COMMA} megabyte liber{P o i}
+STR_4006_UNABLE_TO_READ_DRIVE                                   :{BLACK}Impossibile leggere dall'unità
 STR_4007_GAME_SAVE_FAILED                                       :{WHITE}Salvataggio fallito
 STR_4008_UNABLE_TO_DELETE_FILE                                  :{WHITE}Impossibile eliminare il file
 STR_4009_GAME_LOAD_FAILED                                       :{WHITE}Caricamento fallito
-STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Elenco unità disco, cartelle e file giochi salvati
-STR_400B_CURRENTLY_SELECTED_NAME                                :{BLACK}Nome corrente scelto per il salvataggio
-STR_400C_DELETE_THE_CURRENTLY_SELECTED                          :{BLACK}Elimina il gioco salvato selezionato
-STR_400D_SAVE_THE_CURRENT_GAME_USING                            :{BLACK}salva il gioco corrente usando il nome selezionato
-STR_400E_SELECT_NEW_GAME_TYPE                                   :{WHITE}Selezione il tipo di gioco
-STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Seleziona scenario (verde), Partita pre-impostata (blu),Scenario casuale
+STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Elenco delle unità, delle cartelle e dei file delle partite salvate
+STR_400B_CURRENTLY_SELECTED_NAME                                :{BLACK}Nome del salvataggio selezionato
+STR_400C_DELETE_THE_CURRENTLY_SELECTED                          :{BLACK}Elimina il salvataggio selezionato
+STR_400D_SAVE_THE_CURRENT_GAME_USING                            :{BLACK}Salva la partita corrente, usando il nome scelto
+STR_400E_SELECT_NEW_GAME_TYPE                                   :{WHITE}Seleziona tipo partita
+STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Seleziona uno scenario (verde), una partita pre-impostata (blu), o una nuova partita casuale
 STR_4010_GENERATE_RANDOM_NEW_GAME                               :Crea partita casuale
-STR_4011_LOAD_HEIGHTMAP                                         :{WHITE}Carica Heightmap
+STR_4011_LOAD_HEIGHTMAP                                         :{WHITE}Carica heightmap
 
 ##id 0x4800
-STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} in mezzo
+STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} di mezzo
 STR_4801                                                        :{WHITE}{INDUSTRY}
-STR_4802_COAL_MINE                                              :Miniera di Carbone
-STR_4803_POWER_STATION                                          :Centrale Elettrica
-STR_4804_SAWMILL                                                :Segheria
-STR_4805_FOREST                                                 :Foresta
-STR_4806_OIL_REFINERY                                           :Raffineria
-STR_4807_OIL_RIG                                                :Piattaforma Petrolifera
-STR_4808_FACTORY                                                :Fabbrica
-STR_4809_PRINTING_WORKS                                         :Tipografia
-STR_480A_STEEL_MILL                                             :Acciaieria
-STR_480B_FARM                                                   :Fattoria
-STR_480C_COPPER_ORE_MINE                                        :Miniera di Rame
-STR_480D_OIL_WELLS                                              :Pozzi Petroliferi
-STR_480E_BANK                                                   :Banca
-STR_480F_FOOD_PROCESSING_PLANT                                  :Azienda Alimentare
-STR_4810_PAPER_MILL                                             :Cartiera
-STR_4811_GOLD_MINE                                              :Miniera d'Oro
-STR_4812_BANK                                                   :Banca
-STR_4813_DIAMOND_MINE                                           :Miniera di Diamanti
-STR_4814_IRON_ORE_MINE                                          :Miniera di Ferro
-STR_4815_FRUIT_PLANTATION                                       :Piantagione di Frutta
-STR_4816_RUBBER_PLANTATION                                      :Piantagione di Gomma
-STR_4817_WATER_SUPPLY                                           :Falda Acquifera
-STR_4818_WATER_TOWER                                            :Cisterna d'Acqua
-STR_4819_FACTORY                                                :Fabbrica
-STR_481A_FARM                                                   :Fattoria
-STR_481B_LUMBER_MILL                                            :Falegnameria
-STR_481C_COTTON_CANDY_FOREST                                    :Foresta Cotone Candito
-STR_481D_CANDY_FACTORY                                          :Fabbrica Caramelle
-STR_481E_BATTERY_FARM                                           :Fattoria delle Batterie
-STR_481F_COLA_WELLS                                             :Pozzi di Cola
-STR_4820_TOY_SHOP                                               :Negozio di Giocattoli
-STR_4821_TOY_FACTORY                                            :Fabbrica di Giocattoli
-STR_4822_PLASTIC_FOUNTAINS                                      :Sorgenti di Plastica
-STR_4823_FIZZY_DRINK_FACTORY                                    :Fabbrica Bevande Frizzanti
-STR_4824_BUBBLE_GENERATOR                                       :Generatore di Bolle
-STR_4825_TOFFEE_QUARRY                                          :Estrattore di Toffee
-STR_4826_SUGAR_MINE                                             :Miniera di Zucchero
+STR_4802_COAL_MINE                                              :{G=f}Miniera di carbone
+STR_4803_POWER_STATION                                          :{G=f}Centrale elettrica
+STR_4804_SAWMILL                                                :{G=f}Segheria
+STR_4805_FOREST                                                 :{G=f}Foresta
+STR_4806_OIL_REFINERY                                           :{G=f}Raffineria
+STR_4807_OIL_RIG                                                :{G=f}Piattaforma petrolifera
+STR_4808_FACTORY                                                :{G=f}Fabbrica
+STR_4809_PRINTING_WORKS                                         :{G=f}Tipografia
+STR_480A_STEEL_MILL                                             :{G=f}Acciaieria
+STR_480B_FARM                                                   :{G=f}Fattoria
+STR_480C_COPPER_ORE_MINE                                        :{G=f}Miniera di rame
+STR_480D_OIL_WELLS                                              :{G=m}Pozzo petrolifero
+STR_480E_BANK                                                   :{G=f}Banca
+STR_480F_FOOD_PROCESSING_PLANT                                  :{G=f}Azienda alimentare
+STR_4810_PAPER_MILL                                             :{G=f}Cartiera
+STR_4811_GOLD_MINE                                              :{G=f}Miniera d'oro
+STR_4812_BANK                                                   :{G=f}Banca
+STR_4813_DIAMOND_MINE                                           :{G=f}Miniera di diamanti
+STR_4814_IRON_ORE_MINE                                          :{G=f}Miniera di ferro
+STR_4815_FRUIT_PLANTATION                                       :{G=f}Piantagione di frutta
+STR_4816_RUBBER_PLANTATION                                      :{G=f}Piantagione di gomma
+STR_4817_WATER_SUPPLY                                           :{G=f}Falda acquifera
+STR_4818_WATER_TOWER                                            :{G=f}Cisterna idrica
+STR_4819_FACTORY                                                :{G=f}Fabbrica
+STR_481A_FARM                                                   :{G=f}Fattoria
+STR_481B_LUMBER_MILL                                            :{G=f}Falegnameria
+STR_481C_COTTON_CANDY_FOREST                                    :{G=f}Foresta di zucchero filato
+STR_481D_CANDY_FACTORY                                          :{G=f}Fabbrica di caramelle
+STR_481E_BATTERY_FARM                                           :{G=f}Fattoria delle batterie
+STR_481F_COLA_WELLS                                             :{G=m}Pozzo di Cola
+STR_4820_TOY_SHOP                                               :{G=m}Negozio di giocattoli
+STR_4821_TOY_FACTORY                                            :{G=f}Fabbrica di giocattoli
+STR_4822_PLASTIC_FOUNTAINS                                      :{G=f}Sorgente di plastica
+STR_4823_FIZZY_DRINK_FACTORY                                    :{G=f}Fabbrica di bibite frizzanti
+STR_4824_BUBBLE_GENERATOR                                       :{G=m}Generatore di bollicine
+STR_4825_TOFFEE_QUARRY                                          :{G=f}Cava di toffee
+STR_4826_SUGAR_MINE                                             :{G=f}Miniera di zucchero
 
 ############ range for requires starts
 STR_4827_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}
@@ -1877,59 +1936,59 @@
 STR_4829_REQUIRES                                               :{BLACK}Richiede: {YELLOW}{STRING}, {STRING}, {STRING}
 ############ range for requires ends
 
-STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produzione ultimo mese:
+STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Produzione il mese scorso:
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% trasportato)
-STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centra visuale sull'industria
-STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nuova {STRING} in costruzione vicino a {TOWN}!
-STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nuova {STRING} è stata piantata vicino a {TOWN}!
+STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centra la visuale principale sulla posizione dell'industria
+STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Nuov{G o a} {STRING} in costruzione vicino a {TOWN}!
+STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Nuov{G o a} {STRING} piantat{G o a} vicino a {TOWN}!
 STR_482F_COST                                                   :{BLACK}Costo: {YELLOW}{CURRENCY}
-STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Non puoi costruire qui questo tipo di industria...
-STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...la foresta può essere piantata solo in una zona innevata
+STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Impossibile costruire questo tipo di industria qui...
+STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...una foresta può essere piantata solo in una zona innevata
 STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} annuncia imminente chiusura!!
 STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Per problemi di rifornimenti {INDUSTRY} annuncia imminente chiusura!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}La mancanza di alberi vicini costringe {INDUSTRY} ad imminente chiusura!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}La mancanza di alberi vicini costringe la {INDUSTRY} ad imminente chiusura!
 STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} incrementa la produzione!
-STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Nuovo giacimento di carbone trovato a {INDUSTRY}!{}Produzione destinata a radoppiare!
-STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Nuovo giacimento di petrolio trovato a {INDUSTRY}!{}Produzione destinata a radoppiare!
-STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Metodi di coltivazione migliorati a {INDUSTRY} produzione destinata a radoppiare!
-STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} produzione scesa del 50%
-STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Invasione d'insetti causa devastazione a {INDUSTRY}!{}Produzione scesa del 50%
-STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...può essere posizionata solo vicino al bordo della mappa
+STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Trovato nuovo giacimento di carbone alla {INDUSTRY}!{}Atteso un raddoppiamento della produzione!
+STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Trovato nuovo giacimento di petrolio al {INDUSTRY}!{}Atteso un raddoppiamento della produzione!
+STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Grazie a metodi di coltivazione migliorati alla {INDUSTRY} è atteso un raddoppiamento della produzione!
+STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}La produzione a {INDUSTRY} scende del 50%
+STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Infestazione di insetti devasta la {INDUSTRY}!{}Produzione scesa del 50%
+STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...può essere posizionata solo vicino ai bordi della mappa
 STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}La produzione di {STRING} a {INDUSTRY} è aumentata del {COMMA}%!
 STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}La produzione di {STRING} a {INDUSTRY} è diminuita del {COMMA}%!
 
 ##id 0x5000
 STR_5000_TRAIN_IN_TUNNEL                                        :{WHITE}Treno nel tunnel
-STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Veicolo nel tunnel
-STR_5003_ANOTHER_TUNNEL_IN_THE_WAY                              :{WHITE}Altro tunnel in mezzo
-STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Impossibile scavare l'uscita del tunnel
-STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Devi demolire prima il tunnel
-STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Devi demolire prima il ponte
-STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Non si può partire e finire nello stesso punto
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Sotto i ponti è richiesto terreno piano o acqua
+STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Automezzo nel tunnel
+STR_5003_ANOTHER_TUNNEL_IN_THE_WAY                              :{WHITE}Altro tunnel di mezzo
+STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Impossibile scavare il terreno all'altra estremità del tunnel
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Bisogna demolire il tunnel prima
+STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Bisogna demolire il ponte prima
+STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Impossibile partire e finire nello stesso punto
+STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Sotto un ponte è richiesto terreno livellato o acqua
 STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Inizio e fine devono essere allineati
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Sito inadatto per l'entrata del tunnel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
 STR_500E_SUSPENSION_STEEL                                       :Sospeso, Acciaio
-STR_500F_GIRDER_STEEL                                           :A travi, Acciaio
+STR_500F_GIRDER_STEEL                                           :A travatura, Acciaio
 STR_5010_CANTILEVER_STEEL                                       :A mensola, Acciaio
 STR_5011_SUSPENSION_CONCRETE                                    :Sospeso, Cemento
 STR_5012_WOODEN                                                 :Legno
 STR_5013_CONCRETE                                               :Cemento
 STR_5014_TUBULAR_STEEL                                          :Tubolare, Acciaio
 STR_BRIDGE_TUBULAR_SILICON                                      :Tubolare, Silicio
-STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Non puoi costruire qui il ponte...
-STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Non puoi costruire qui il tunnel...
+STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Impossibile costruire il ponte qui...
+STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Impossibile costruire il tunnel qui...
 STR_5017_RAILROAD_TUNNEL                                        :Tunnel ferroviario
 STR_5018_ROAD_TUNNEL                                            :Tunnel stradale
 STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE                           :Ponte ferroviario sospeso in acciaio
-STR_501C_STEEL_GIRDER_RAIL_BRIDGE                               :Ponte ferroviario a travi in acciaio
-STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE                           :Ponte ferroviario a mensole in acciaio
+STR_501C_STEEL_GIRDER_RAIL_BRIDGE                               :Ponte ferroviario a travatura in acciaio
+STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE                           :Ponte ferroviario a mensola in acciaio
 STR_501E_REINFORCED_CONCRETE_SUSPENSION                         :Ponte ferroviario sospeso in cemento armato
 STR_501F_WOODEN_RAIL_BRIDGE                                     :Ponte ferroviario in legno
 STR_5020_CONCRETE_RAIL_BRIDGE                                   :Ponte ferroviario in cemento
 STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE                           :Ponte stradale sopeso in acciaio
-STR_5022_STEEL_GIRDER_ROAD_BRIDGE                               :Ponte stradale a travi in acciaio
+STR_5022_STEEL_GIRDER_ROAD_BRIDGE                               :Ponte stradale a travutara in acciaio
 STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE                           :Ponte stradale a mensola in acciaio
 STR_5024_REINFORCED_CONCRETE_SUSPENSION                         :Ponte stradale sospeso in cemento armato
 STR_5025_WOODEN_ROAD_BRIDGE                                     :Ponte stradale in legno
@@ -1938,13 +1997,13 @@
 STR_5028_TUBULAR_ROAD_BRIDGE                                    :Ponte stradale tubolare
 
 ##id 0x5800
-STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Oggetto in mezzo
+STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Oggetto di mezzo
 STR_5801_TRANSMITTER                                            :Trasmettitore
 STR_5802_LIGHTHOUSE                                             :Faro
-STR_5803_COMPANY_HEADQUARTERS                                   :Sede della società
-STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...Sede principale della società in mezzo
-STR_5805_COMPANY_OWNED_LAND                                     :Terreno posseduto dalla società
-STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Non puoi acquistare questo terreno...
+STR_5803_COMPANY_HEADQUARTERS                                   :Sede della compagnia
+STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...sede della compagnia di mezzo
+STR_5805_COMPANY_OWNED_LAND                                     :Terreno posseduto dalla compagnia
+STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Impossibile acquistare quest'area di terreno...
 STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...lo possiedi già!
 
 
@@ -1954,9 +2013,9 @@
 STR_SV_EMPTY                                                    :
 STR_SV_UNNAMED                                                  :Senza nome
 STR_SV_TRAIN_NAME                                               :Treno {COMMA}
-STR_SV_ROADVEH_NAME                                             :Veicolo Stradale {COMMA}
+STR_SV_ROADVEH_NAME                                             :Automezzo {COMMA}
 STR_SV_SHIP_NAME                                                :Nave {COMMA}
-STR_SV_AIRCRAFT_NAME                                            :Aereo {COMMA}
+STR_SV_AIRCRAFT_NAME                                            :Aeromobile {COMMA}
 
 STR_SV_STNAME                                                   :{STRING}
 STR_SV_STNAME_NORTH                                             :{STRING} Nord
@@ -1967,14 +2026,14 @@
 STR_SV_STNAME_TRANSFER                                          :{STRING} Interscambio
 STR_SV_STNAME_HALT                                              :{STRING} Fermata
 STR_SV_STNAME_VALLEY                                            :{STRING} Valle
-STR_SV_STNAME_HEIGHTS                                           :{STRING} Altura
+STR_SV_STNAME_HEIGHTS                                           :Alture di {STRING}
 STR_SV_STNAME_WOODS                                             :{STRING} Bosco
 STR_SV_STNAME_LAKESIDE                                          :{STRING} Lago
 STR_SV_STNAME_EXCHANGE                                          :{STRING} Scambio
-STR_SV_STNAME_AIRPORT                                           :{STRING} Aeroporto
-STR_SV_STNAME_OILFIELD                                          :{STRING} Campo Petrolifero
+STR_SV_STNAME_AIRPORT                                           :Aeroporto di {STRING}
+STR_SV_STNAME_OILFIELD                                          :Pozzi di {STRING}
 STR_SV_STNAME_MINES                                             :{STRING} Miniere
-STR_SV_STNAME_DOCKS                                             :{STRING} Molo
+STR_SV_STNAME_DOCKS                                             :Porto di {STRING}
 STR_SV_STNAME_BUOY_1                                            :{STRING} Boa 1
 STR_SV_STNAME_BUOY_2                                            :{STRING} Boa 2
 STR_SV_STNAME_BUOY_3                                            :{STRING} Boa 3
@@ -1984,14 +2043,16 @@
 STR_SV_STNAME_BUOY_7                                            :{STRING} Boa 7
 STR_SV_STNAME_BUOY_8                                            :{STRING} Boa 8
 STR_SV_STNAME_BUOY_9                                            :{STRING} Boa 9
-STR_SV_STNAME_ANNEXE                                            :{STRING} Annesso
-STR_SV_STNAME_SIDINGS                                           :{STRING} Tronchino
-STR_SV_STNAME_BRANCH                                            :{STRING} Ramo
+STR_SV_STNAME_ANNEXE                                            :{STRING} Distaccata
+STR_SV_STNAME_SIDINGS                                           :{STRING} Raccordo
+STR_SV_STNAME_BRANCH                                            :{STRING} Ramificata
 STR_SV_STNAME_UPPER                                             :Alta {STRING}
 STR_SV_STNAME_LOWER                                             :Bassa {STRING}
-STR_SV_STNAME_HELIPORT                                          :{STRING} Eliporto
+STR_SV_STNAME_HELIPORT                                          :Eliporto di {STRING}
 STR_SV_STNAME_FOREST                                            :{STRING} Foresta
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2006,27 +2067,28 @@
 ############ range for difficulty levels ends
 
 ############ range for difficulty settings starts
-STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Numero max di avversari: {ORANGE}{COMMA}
+STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Numero massimo di avversari: {ORANGE}{COMMA}
 STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Partenza avversari: {ORANGE}{STRING}
-STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Num. di città: {ORANGE}{STRING}
-STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Num. di industrie: {ORANGE}{STRING}
-STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Prestito iniziale massimo: {ORANGE}{CURRENCY}
+STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Numero di città: {ORANGE}{STRING}
+STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Numero di industrie: {ORANGE}{STRING}
+STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Prestito massimo iniziale: {ORANGE}{CURRENCY}
 STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Tasso d'interesse iniziale: {ORANGE}{COMMA}%
-STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Costi di uso dei veicoli: {ORANGE}{STRING}
+STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Costi d'esercizio dei veicoli: {ORANGE}{STRING.mp}
 STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Velocità di costruzione degli avversari: {ORANGE}{STRING}
-STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Intelligenza degli avversari: {ORANGE}{STRING}
+STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Intelligenza degli avversari: {ORANGE}{STRING.fs}
 STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}Guasti dei veicoli: {ORANGE}{STRING}
 STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}Moltiplicatore sussidi: {ORANGE}{STRING}
-STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Costi di costruzione: {ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Costi di costruzione: {ORANGE}{STRING.mp}
 STR_6811_TERRAIN_TYPE                                           :{LTBLUE}Tipo di terreno: {ORANGE}{STRING}
-STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Quantità mare/laghi: {ORANGE}{STRING}
+STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Quantità di mare/laghi: {ORANGE}{STRING.fs}
 STR_6813_ECONOMY                                                :{LTBLUE}Economia: {ORANGE}{STRING}
 STR_6814_TRAIN_REVERSING                                        :{LTBLUE}Inversione treni: {ORANGE}{STRING}
 STR_6815_DISASTERS                                              :{LTBLUE}Disastri: {ORANGE}{STRING}
-STR_16816_CITY_APPROVAL                                         :{LTBLUE}Atteggiamento delle città alle modifiche: {ORANGE}{STRING}
+STR_16816_CITY_APPROVAL                                         :{LTBLUE}Atteggiamento della città in merito alle modifiche: {ORANGE}{STRING}
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Nessuno
+STR_NUM_VERY_LOW                                                :Molto basso
 STR_6816_LOW                                                    :Basso
 STR_6817_NORMAL                                                 :Normale
 STR_6818_HIGH                                                   :Alto
@@ -2042,9 +2104,9 @@
 STR_6821_MEDIUM                                                 :Medio
 STR_6822_HIGH                                                   :Alto
 STR_6823_NONE                                                   :Nessuno
-STR_6824_REDUCED                                                :Ridotto
-STR_6825_NORMAL                                                 :Normale
-STR_6826_X1_5                                                   :x1.5
+STR_6824_REDUCED                                                :Ridotti
+STR_6825_NORMAL                                                 :Normali
+STR_6826_X1_5                                                   :x1,5
 STR_6827_X2                                                     :x2
 STR_6828_X3                                                     :x3
 STR_6829_X4                                                     :x4
@@ -2054,7 +2116,7 @@
 STR_682D_MOUNTAINOUS                                            :Montagnoso
 STR_682E_STEADY                                                 :Stabile
 STR_682F_FLUCTUATING                                            :Fluttuante
-STR_6830_IMMEDIATE                                              :Immediato
+STR_6830_IMMEDIATE                                              :Immediata
 STR_6831_3_MONTHS_AFTER_PLAYER                                  :3 mesi dopo il giocatore
 STR_6832_6_MONTHS_AFTER_PLAYER                                  :6 mesi dopo il giocatore
 STR_6833_9_MONTHS_AFTER_PLAYER                                  :9 mesi dopo il giocatore
@@ -2070,164 +2132,166 @@
 ##id 0x7000
 STR_7000                                                        :
 STR_7001                                                        :{WHITE}{COMPANY} {BLACK}{PLAYERNAME}
-STR_7002_PLAYER                                                 :(Giocatore {COMMA})
-STR_7004_NEW_FACE                                               :{BLACK}Nuova Faccia
-STR_7005_COLOR_SCHEME                                           :{BLACK}Colore Società
-STR_7006_COLOR_SCHEME                                           :{GOLD}Colore Società:
-STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}Nuovo Schema Colore
-STR_7008_COMPANY_NAME                                           :{BLACK}Nome Società
-STR_7009_PRESIDENT_NAME                                         :{BLACK}Nome Presidente
-STR_700A_COMPANY_NAME                                           :Nome della società
+STR_7002_PLAYER                                                 : (Giocatore {COMMA})
+STR_7004_NEW_FACE                                               :{BLACK}Nuova faccia
+STR_7005_COLOR_SCHEME                                           :{BLACK}Colori compagnia
+STR_7006_COLOR_SCHEME                                           :{GOLD}Schema colori:
+STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}Nuovo schema colori
+STR_7008_COMPANY_NAME                                           :{BLACK}Nome compagnia
+STR_7009_PRESIDENT_NAME                                         :{BLACK}Nome presidente
+STR_700A_COMPANY_NAME                                           :Nome della compagnia
 STR_700B_PRESIDENT_S_NAME                                       :Nome del presidente
-STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Non puoi cambiare il nome della società...
-STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Non puoi cambiare il nome del presidente...
-STR_700E_FINANCES                                               :{WHITE}{COMPANY} Finanze {BLACK}{PLAYERNAME}
-STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Spese/Ricavi
+STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Impossibile cambiare il nome della compagnia...
+STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Impossibile cambiare il nome del presidente...
+STR_700E_FINANCES                                               :{WHITE}Finanze della {COMPANY} {BLACK}{PLAYERNAME}
+STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Spese/ricavi
 STR_7010                                                        :{WHITE}{NUM}
 STR_7011_CONSTRUCTION                                           :{GOLD}Costruzioni
-STR_7012_NEW_VEHICLES                                           :{GOLD}Nuovi Veicoli
-STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Costi Uso Treni
-STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Costi Uso Veicoli
-STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Costi Uso Aerei
-STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Costi Uso Navi
-STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Manutenzione Proprietà
-STR_7018_TRAIN_INCOME                                           :{GOLD}Ricavi Treni
-STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Ricavi Veicoli
-STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Ricavi Aerei
-STR_701B_SHIP_INCOME                                            :{GOLD}Ricavi Navi
-STR_701C_LOAN_INTEREST                                          :{GOLD}Interessi sul Prestito
+STR_7012_NEW_VEHICLES                                           :{GOLD}Nuovi veicoli
+STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Costi d'esercizio treni
+STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Costi d'esercizio automezzi
+STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Costi d'esercizio aeromobili
+STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Costi d'esercizio navi
+STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Manutenzione proprietà
+STR_7018_TRAIN_INCOME                                           :{GOLD}Ricavi treni
+STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Ricavi automezzi
+STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Ricavi aeromobili
+STR_701B_SHIP_INCOME                                            :{GOLD}Ricavi navi
+STR_701C_LOAN_INTEREST                                          :{GOLD}Interessi sul prestito
 STR_701D_OTHER                                                  :{GOLD}Altro
 STR_701E                                                        :{BLACK}-{CURRENCY64}
 STR_701F                                                        :{BLACK}+{CURRENCY64}
 STR_7020_TOTAL                                                  :{WHITE}Totale:
 STR_7021                                                        :{COMPANY}{PLAYERNAME}
-STR_7022_INCOME_GRAPH                                           :{WHITE}Grafico Incassi
+STR_7022_INCOME_GRAPH                                           :{WHITE}Grafico incassi
 STR_CURRCOMPACT                                                 :{CURRCOMPACT64}
 STR_7024                                                        :{COMMA}
-STR_7025_OPERATING_PROFIT_GRAPH                                 :{WHITE}Grafico Profitti Operativi
-STR_7026_BANK_BALANCE                                           :{WHITE}Bilancio Bancario
+STR_7025_OPERATING_PROFIT_GRAPH                                 :{WHITE}Grafico profitto operativo
+STR_7026_BANK_BALANCE                                           :{WHITE}Bilancio bancario
 STR_7027_LOAN                                                   :{WHITE}Prestito
-STR_MAX_LOAN                                                    :{WHITE}Prestito Massimo:  {BLACK}{CURRENCY64}
+STR_MAX_LOAN                                                    :{WHITE}Prestito massimo:  {BLACK}{CURRENCY64}
 STR_7028                                                        :{BLACK}{CURRENCY64}
-STR_7029_BORROW                                                 :{BLACK}Richiedi {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
+STR_7029_BORROW                                                 :{BLACK}Chiedi in prestito {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
 STR_702A_REPAY                                                  :{BLACK}Ripaga {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
 STR_702B_MAXIMUM_PERMITTED_LOAN                                 :{WHITE}...il prestito massimo concesso è di {CURRENCY}
-STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Non puoi chiedere altro denaro...
+STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Impossibile chiedere in prestito altro denaro...
 STR_702D_LOAN_ALREADY_REPAYED                                   :{WHITE}...debito già estinto
 STR_702E_REQUIRED                                               :{WHITE}...{CURRENCY} richiesti
-STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Non puoi ripagare il debito...
-STR_INSUFFICIENT_FUNDS                                          :{WHITE}Non è possibile donare denaro, è in prestito dalla banca
+STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Impossibile ripagare il prestito...
+STR_INSUFFICIENT_FUNDS                                          :{WHITE}Impossibile donare denaro prestato dalla banca...
 STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Seleziona una nuova faccia per il presidente
-STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Cambia colore dei veicoli della società
+STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Cambia la livrea dei veicoli della compagnia
 STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Cambia il nome del presidente
 STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Cambia il nome della compagnia
-STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Fare clic per selezionare il nuovo colore
-STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Aumenta dimensioni del debito
-STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Ripaga parte del debito
-STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(President)
-STR_7038_INAUGURATED                                            :{GOLD}Inaugurata: {WHITE}{NUM}
+STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Fare clic sullo schema di colori desiderato
+STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Aumenta l'ammontare del prestito
+STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Ripaga parte del prestito
+STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Presidente)
+STR_7038_INAUGURATED                                            :{GOLD}Inaugurata nel: {WHITE}{NUM}
 STR_7039_VEHICLES                                               :{GOLD}Veicoli:
 STR_TRAINS                                                      :{WHITE}{COMMA} tren{P o i}
-STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} veicol{P o i} stradal{P e i}
-STR_AIRCRAFT                                                    :{WHITE}{COMMA} aere{P o i}
+STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} automezz{P o i}
+STR_AIRCRAFT                                                    :{WHITE}{COMMA} aeromobil{P e i}
 STR_SHIPS                                                       :{WHITE}{COMMA} nav{P e i}
 STR_7042_NONE                                                   :{WHITE}Nessuno
-STR_7043_FACE_SELECTION                                         :{WHITE}Seleziona Faccia
+STR_7043_FACE_SELECTION                                         :{WHITE}Seleziona faccia
 STR_7044_MALE                                                   :{BLACK}Maschio
 STR_7045_FEMALE                                                 :{BLACK}Femmina
-STR_7046_NEW_FACE                                               :{BLACK}Nuova Faccia
-STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Annulla selezione Faccia
-STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Accetta nuova Faccia
-STR_7049_SELECT_MALE_FACES                                      :{BLACK}Seleziona volti maschili
-STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Seleziona volti femminili
-STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Genera faccia a caso
-STR_704C_KEY                                                    :{BLACK}Valori
-STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Mostra valori nel grafico
-STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}Valori società nel grafico
-STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Clicca qui per mostrare i valori della società nel grafico on/off
-STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Unità di merce trasportata
-STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Valutazione prestazioni società (Massima valutazione=1000)
-STR_7052_COMPANY_VALUES                                         :{WHITE}Valore della società
-STR_7053_COMPANY_LEAGUE_TABLE                                   :{WHITE}Classifica società
+STR_7046_NEW_FACE                                               :{BLACK}Nuova faccia
+STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Annulla la selezione della nuova faccia
+STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Accetta la selezione della nuova faccia
+STR_7049_SELECT_MALE_FACES                                      :{BLACK}Seleziona fra volti maschili
+STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Seleziona fra volti femminili
+STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Genera una nuova faccia a caso
+STR_704C_KEY                                                    :{BLACK}Legenda
+STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Mostra la legenda del grafico
+STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}Legenda grafico compagnie
+STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Fare clic per attivare/disattivare la visualizzazione di una compagnia sul grafico
+STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Unità di merce consegnate
+STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Valutazione prestazioni compagnie (massima valutazione=1000)
+STR_7052_COMPANY_VALUES                                         :{WHITE}Valore delle compagnie
+STR_7053_COMPANY_LEAGUE_TABLE                                   :{WHITE}Classifica compagnie
 STR_7054                                                        :{WHITE}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{PLAYERNAME} '{STRING}'
 STR_7055                                                        :{YELLOW}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{PLAYERNAME}  '{STRING}'
-STR_7056_TRANSPORT_COMPANY_IN_TROUBLE                           :{BLACK}{BIGFONT}Società di trasporti in difficolta!
-STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} verrà venduta o dichiarerà bancarotta a meno che le prestazioni non miglioreranno presto!
+STR_7056_TRANSPORT_COMPANY_IN_TROUBLE                           :{BLACK}{BIGFONT}Compagnia di trasporti in difficolta!
+STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}La {COMPANY} verrà venduta o dichiarerà bancarotta a meno che le prestazioni non migliorino presto!
 STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(Presidente)
-STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Fusione tra società di trasporti
-STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} è stata venduta a {COMPANY} per {CURRENCY}!
-STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Stiamo cercando una società di trasporti per vendere la nostra società.{}{} Vorrebbe acquistare {COMPANY} per {CURRENCY}?
+STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Fusione tra compagnie di trasporti!
+STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}La {COMPANY} è stata venduta alla {COMPANY} per {CURRENCY}!
+STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Stiamo cercando una compagnia di trasporti disposta a rilevare la nostra società.{}{} Vorrebbe acquistare la {COMPANY} per {CURRENCY}?
 STR_705C_BANKRUPT                                               :{BLACK}{BIGFONT}Bancarotta!
-STR_705D_HAS_BEEN_CLOSED_DOWN_BY                                :{BLACK}{BIGFONT}{COMPANY} è stata chiusa dai creditori e tutti i suoi beni venduti!
-STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED                         :{BLACK}{BIGFONT}Lanciata nuova società di trasporti!
-STR_705F_STARTS_CONSTRUCTION_NEAR                               :{BLACK}{BIGFONT}{COMPANY} inizia a costruire vicino a {TOWN}!
-STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Non puoi comprare la società...
-STR_7061_CARGO_PAYMENT_RATES                                    :{WHITE}Percentuale Pagamento Merci
+STR_705D_HAS_BEEN_CLOSED_DOWN_BY                                :{BLACK}{BIGFONT}La {COMPANY} è stata chiusa dai creditori e tutti i suoi beni sono stati venduti!
+STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED                         :{BLACK}{BIGFONT}Nuova compagnia di trasporti!
+STR_705F_STARTS_CONSTRUCTION_NEAR                               :{BLACK}{BIGFONT}La {COMPANY} inizia a costruire vicino a {TOWN}!
+STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Impossibile comprare la compagnia...
+STR_7061_CARGO_PAYMENT_RATES                                    :{WHITE}Tariffe di pagamento merci
 STR_7062_DAYS_IN_TRANSIT                                        :{BLACK}{TINYFONT}Giorni di viaggio
-STR_7063_PAYMENT_FOR_DELIVERING                                 :{BLACK}{TINYFONT}Pagamento per la consegna di dieci unità (o 10,000 litri) di merce alla distanza di 20 quadrati
-STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}Seleziona grafico tipo di merce on/off
+STR_7063_PAYMENT_FOR_DELIVERING                                 :{BLACK}{TINYFONT}Pagamento per la consegna di 10 unità (o 10.000 litri) di merce alla distanza di 20 riquadri
+STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}Attiva/disattiva il grafico per il tipo di merce
 STR_7065                                                        :{BLACK}{TINYFONT}{STRING}
 STR_7066_ENGINEER                                               :Ingegnere
 STR_7067_TRAFFIC_MANAGER                                        :Direttore del traffico
-STR_7068_TRANSPORT_COORDINATOR                                  :Coordinatore dei Trasporti
-STR_7069_ROUTE_SUPERVISOR                                       :Supervisore dei Percorsi
+STR_7068_TRANSPORT_COORDINATOR                                  :Coordinatore dei trasporti
+STR_7069_ROUTE_SUPERVISOR                                       :Supervisore dei percorsi
 STR_706A_DIRECTOR                                               :Direttore
-STR_706B_CHIEF_EXECUTIVE                                        :Amministratore Delegato
+STR_706B_CHIEF_EXECUTIVE                                        :Amministratore delegato
 STR_706C_CHAIRMAN                                               :Chairman
 STR_706D_PRESIDENT                                              :Presidente
 STR_706E_TYCOON                                                 :Magnate
-STR_706F_BUILD_HQ                                               :{BLACK}Costr. Sede
-STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Costruisci/Guarda la sede della società
-STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Sposta la sede della compagnia pagando 1% del valore societario
-STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Non puoi costruire la sede della compagnia...
-STR_7072_VIEW_HQ                                                :{BLACK}Guarda Sede
-STR_RELOCATE_HQ                                                 :{BLACK}Sposta Sede
+STR_706F_BUILD_HQ                                               :{BLACK}Costr. sede
+STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Costruisce la sede della compagnia / visualizza la sede della compagnia
+STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Ricostruisce la sede della compagnia in un altro luogo pagando l'1% del valore della compagnia
+STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Impossibile costruire la sede della compagnia...
+STR_7072_VIEW_HQ                                                :{BLACK}Vedi sede
+STR_RELOCATE_HQ                                                 :{BLACK}Sposta sede
 STR_COMPANY_PASSWORD                                            :{BLACK}Password
-STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protegge la tuo compagnia con una password per impedire accessi non autorizzati.
-STR_SET_COMPANY_PASSWORD                                        :Imposta password della società
-STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recessione Mondiale!{}{}Gli esperti finanziari temono la peggior crisi economica!
-STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recessione Finita!{}{}Rialzo negli scambi dà fiducia alle industrie per un rafforzamento economico!
+STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protegge la compagnia con una password per impedire ad utenti non autorizzati di accedervi.
+STR_SET_COMPANY_PASSWORD                                        :Imposta password compagnia
+STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recessione mondiale!{}{}Il crollo dell'economia porta gli analisti finanziari a temere il peggio!
+STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recessione finita!{}{}La ripresa del commercio da fiducia alle industrie e rafforza l'economia!
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Seleziona dimensione grande/piccola della finestra
-STR_7076_COMPANY_VALUE                                          :{GOLD}Valore società: {WHITE}{CURRENCY64}
+STR_7076_COMPANY_VALUE                                          :{GOLD}Valore compagnia: {WHITE}{CURRENCY64}
 STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Compra il 25% delle azioni
 STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Vendi il 25% delle azioni
-STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Compra il 25% delle azioni della società
-STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Vendi il 25% delle azioni della società
-STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Non puoi comprare il 25% delle azioni della società...
-STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Non puoi vendere il 25% delle azioni della società...
-STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% posseduto da {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% posseduto da {COMPANY}{}   {COMMA}% posseduto da {COMPANY})
-STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} è stata rilevata da {COMPANY}!
+STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Compra il 25% delle azioni di questa compagnia
+STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Vende il 25% delle azioni di questa compagnia
+STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Impossibile comprare il 25% delle azioni...
+STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Impossibile vendere il 25% delle azioni...
+STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% posseduto dalla {COMPANY})
+STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% posseduto dalla {COMPANY}{}   {COMMA}% posseduto dalla {COMPANY})
+STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}La {COMPANY} è stata rilevata dalla {COMPANY}!
 STR_7080_PROTECTED                                              :{WHITE}Questa compagnia non è abbastanza vecchia per scambiare azioni...
 
-STR_LIVERY_DEFAULT                                              :Livrea Standard
-STR_LIVERY_STEAM                                                :Locomotiva a Vapore
-STR_LIVERY_DIESEL                                               :Locomotiva Diesel
-STR_LIVERY_ELECTRIC                                             :Locomotore Elettrico
-STR_LIVERY_MONORAIL                                             :Monorotaia
-STR_LIVERY_MAGLEV                                               :Maglev
+STR_LIVERY_DEFAULT                                              :Livrea standard
+STR_LIVERY_STEAM                                                :Locomotiva a vapore
+STR_LIVERY_DIESEL                                               :Locomotiva diesel
+STR_LIVERY_ELECTRIC                                             :Locomotiva elettrica
+STR_LIVERY_MONORAIL                                             :Locomotiva monorotaia
+STR_LIVERY_MAGLEV                                               :Locomotiva maglev
 STR_LIVERY_DMU                                                  :DMU
 STR_LIVERY_EMU                                                  :EMU
-STR_LIVERY_PASSENGER_WAGON_STEAM                                :Carrozza Passeggeri (Vapore)
-STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Carrozza Passeggeri (Diesel)
-STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Carrozza Passeggeri (Elettrico)
-STR_LIVERY_FREIGHT_WAGON                                        :Vagone Merci
+STR_LIVERY_PASSENGER_WAGON_STEAM                                :Carrozza passeggeri (V)
+STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Carrozza passeggeri (D)
+STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Carrozza passeggeri (E)
+STR_LIVERY_FREIGHT_WAGON                                        :Vagone merci
 STR_LIVERY_BUS                                                  :Autobus
-STR_LIVERY_TRUCK                                                :Autocarro
+STR_LIVERY_TRUCK                                                :Camion
 STR_LIVERY_PASSENGER_SHIP                                       :Traghetto
-STR_LIVERY_FREIGHT_SHIP                                         :Nave Mercantile
+STR_LIVERY_FREIGHT_SHIP                                         :Mercantile
 STR_LIVERY_HELICOPTER                                           :Elicottero
-STR_LIVERY_SMALL_PLANE                                          :Aeroplano (S)
-STR_LIVERY_LARGE_PLANE                                          :Aeroplano (L)
+STR_LIVERY_SMALL_PLANE                                          :Aeroplano piccolo
+STR_LIVERY_LARGE_PLANE                                          :Aeroplano grande
+STR_LIVERY_PASSENGER_TRAM                                       :Tram passeggeri
+STR_LIVERY_FREIGHT_TRAM                                         :Tram merci
 
-STR_LIVERY_GENERAL_TIP                                          :{BLACK}Mostra schemi colore generale
-STR_LIVERY_TRAIN_TIP                                            :{BLACK}Mostra schemi colore treni
-STR_LIVERY_ROADVEH_TIP                                          :{BLACK}Mostra schemi colore veicoli
-STR_LIVERY_SHIP_TIP                                             :{BLACK}Mostra schemi colore navi
-STR_LIVERY_AIRCRAFT_TIP                                         :{BLACK}Mostra schemi colore aerei
-STR_LIVERY_PRIMARY_TIP                                          :{BLACK}Scegli il colore primario per lo schema selezionato
-STR_LIVERY_SECONDARY_TIP                                        :{BLACK}Scegli il colore secondario per lo schema selezionato
-STR_LIVERY_PANEL_TIP                                            :{BLACK}Scegli uno schema colori per cambiare, o schemi multipli con CTRL + click. Clicca sul box per attivare/disattivare lo schema
+STR_LIVERY_GENERAL_TIP                                          :{BLACK}Mostra gli schemi di colorazione generali
+STR_LIVERY_TRAIN_TIP                                            :{BLACK}Mostra gli schemi di colorazione dei treni
+STR_LIVERY_ROADVEH_TIP                                          :{BLACK}Mostra gli schemi di colorazione degli automezzi
+STR_LIVERY_SHIP_TIP                                             :{BLACK}Mostra gli schemi di colorazione delle navi
+STR_LIVERY_AIRCRAFT_TIP                                         :{BLACK}Mostra gli schemi di colorazione degli aeromobili
+STR_LIVERY_PRIMARY_TIP                                          :{BLACK}Sceglie il colore primario per lo schema selezionato
+STR_LIVERY_SECONDARY_TIP                                        :{BLACK}Sceglie il colore secondario per lo schema selezionato
+STR_LIVERY_PANEL_TIP                                            :{BLACK}Selezionare uno schema colori da cambiare, o schemi multipli con CTRL+clic. Fare clic sulla casella per attivare/disattivare uno schema
 
 ##id 0x8000
 STR_8000_KIRBY_PAUL_TANK_STEAM                                  :Kirby Paul Tank (Vapore)
@@ -2241,7 +2305,7 @@
 STR_8008_CHANEY_JUBILEE_STEAM                                   :Chaney 'Jubilee' (Vapore)
 STR_8009_GINZU_A4_STEAM                                         :Ginzu 'A4' (Vapore)
 STR_800A_SH_8P_STEAM                                            :SH '8P' (Vapore)
-STR_800B_MANLEY_MOREL_DMU_DIESEL                                :Manley-Morel DMU (Diesel)
+STR_800B_MANLEY_MOREL_DMU_DIESEL                                :DMU Manley-Morel (Diesel)
 STR_800C_DASH_DIESEL                                            :'Dash' (Diesel)
 STR_800D_SH_HENDRY_25_DIESEL                                    :SH/Hendry '25' (Diesel)
 STR_800E_UU_37_DIESEL                                           :UU '37' (Diesel)
@@ -2257,183 +2321,183 @@
 STR_8018_SH_40_ELECTRIC                                         :SH '40' (Elettrica)
 STR_8019_T_I_M_ELECTRIC                                         :'T.I.M.' (Elettrica)
 STR_801A_ASIASTAR_ELECTRIC                                      :'AsiaStar' (Elettrica)
-STR_801B_PASSENGER_CAR                                          :Carrozza Passeggeri
-STR_801C_MAIL_VAN                                               :Vagone Postale
-STR_801D_COAL_CAR                                               :Vagone Carbone
-STR_801E_OIL_TANKER                                             :Vagone Cisterna
-STR_801F_LIVESTOCK_VAN                                          :Vagone Bestiame
-STR_8020_GOODS_VAN                                              :Vagone Beni
-STR_8021_GRAIN_HOPPER                                           :Vagone Grano
-STR_8022_WOOD_TRUCK                                             :Vagone Legname
-STR_8023_IRON_ORE_HOPPER                                        :Vagone Ferro
-STR_8024_STEEL_TRUCK                                            :Vagone Acciaio
-STR_8025_ARMORED_VAN                                            :Vagone Blindato
-STR_8026_FOOD_VAN                                               :Vagone Alimentari
-STR_8027_PAPER_TRUCK                                            :Vagone Carta
-STR_8028_COPPER_ORE_HOPPER                                      :Vagone Rame
-STR_8029_WATER_TANKER                                           :Vagone Cisterna Acqua
-STR_802A_FRUIT_TRUCK                                            :Vagone Frutta
-STR_802B_RUBBER_TRUCK                                           :Vagone Gomma
-STR_802C_SUGAR_TRUCK                                            :Vagone Zucchero
-STR_802D_COTTON_CANDY_HOPPER                                    :Vagone Cotone Cand.
-STR_802E_TOFFEE_HOPPER                                          :Vagone Toffee
-STR_802F_BUBBLE_VAN                                             :Vagone Bolle
-STR_8030_COLA_TANKER                                            :Vagone Cisterna Cola
-STR_8031_CANDY_VAN                                              :Vagone Dolciumi
-STR_8032_TOY_VAN                                                :Vagone Giocattoli
-STR_8033_BATTERY_TRUCK                                          :Vagone Batterie
-STR_8034_FIZZY_DRINK_TRUCK                                      :Vagone Bibite Friz.
-STR_8035_PLASTIC_TRUCK                                          :Vagone Plastica
+STR_801B_PASSENGER_CAR                                          :Carrozza passeggeri
+STR_801C_MAIL_VAN                                               :Vagone postale
+STR_801D_COAL_CAR                                               :Carrello carbone
+STR_801E_OIL_TANKER                                             :Vagone cisterna petrolio
+STR_801F_LIVESTOCK_VAN                                          :Vagone bestiame
+STR_8020_GOODS_VAN                                              :Vagone beni
+STR_8021_GRAIN_HOPPER                                           :Tramoggia per grano
+STR_8022_WOOD_TRUCK                                             :Carrello legname
+STR_8023_IRON_ORE_HOPPER                                        :Tramoggia per ferro
+STR_8024_STEEL_TRUCK                                            :Carrello acciaio
+STR_8025_ARMORED_VAN                                            :Vagone blindato
+STR_8026_FOOD_VAN                                               :Vagone alimentari
+STR_8027_PAPER_TRUCK                                            :Carrello carta
+STR_8028_COPPER_ORE_HOPPER                                      :Tramoggia per rame
+STR_8029_WATER_TANKER                                           :Vagone cisterna acqua
+STR_802A_FRUIT_TRUCK                                            :Carrello frutta
+STR_802B_RUBBER_TRUCK                                           :Carrello gomma
+STR_802C_SUGAR_TRUCK                                            :Carrello zucchero
+STR_802D_COTTON_CANDY_HOPPER                                    :Tramoggia per zucchero filato
+STR_802E_TOFFEE_HOPPER                                          :Tramoggia per toffee
+STR_802F_BUBBLE_VAN                                             :Vagone bollicine
+STR_8030_COLA_TANKER                                            :Vagone cisterna Cola
+STR_8031_CANDY_VAN                                              :Vagone caramelle
+STR_8032_TOY_VAN                                                :Vagone giocattoli
+STR_8033_BATTERY_TRUCK                                          :Carrello batterie
+STR_8034_FIZZY_DRINK_TRUCK                                      :Carrello bibite frizzanti
+STR_8035_PLASTIC_TRUCK                                          :Carrello plastica
 STR_8036_X2001_ELECTRIC                                         :'X2001' (Elettrica)
 STR_8037_MILLENNIUM_Z1_ELECTRIC                                 :'Millennium Z1' (Elettrica)
 STR_8038_WIZZOWOW_Z99                                           :Wizzowow Z99
-STR_8039_PASSENGER_CAR                                          :Carrozza Passeggeri
-STR_803A_MAIL_VAN                                               :Vagone Postale
-STR_803B_COAL_CAR                                               :Vagone Carbone
-STR_803C_OIL_TANKER                                             :Vagone Cisterna
-STR_803D_LIVESTOCK_VAN                                          :Vagone Bestiame
-STR_803E_GOODS_VAN                                              :Vagone Beni
-STR_803F_GRAIN_HOPPER                                           :Vagone Grano
-STR_8040_WOOD_TRUCK                                             :Vagone Legname
-STR_8041_IRON_ORE_HOPPER                                        :Vagone Ferro
-STR_8042_STEEL_TRUCK                                            :Vagone Acciaio
-STR_8043_ARMORED_VAN                                            :Vagone Blindato
-STR_8044_FOOD_VAN                                               :Vagone Alimentari
-STR_8045_PAPER_TRUCK                                            :Vagone Carta
-STR_8046_COPPER_ORE_HOPPER                                      :Vagone Rame
-STR_8047_WATER_TANKER                                           :Vagone Cisterna Acqua
-STR_8048_FRUIT_TRUCK                                            :Vagone Frutta
-STR_8049_RUBBER_TRUCK                                           :Vagone Gomma
-STR_804A_SUGAR_TRUCK                                            :Vagone Zucchero
-STR_804B_COTTON_CANDY_HOPPER                                    :Vagone Cotone Cand.
-STR_804C_TOFFEE_HOPPER                                          :Vagone Toffee
-STR_804D_BUBBLE_VAN                                             :Vagone Bolle
-STR_804E_COLA_TANKER                                            :Vagone Cisterna Cola
-STR_804F_CANDY_VAN                                              :Vagone Dolciumi
-STR_8050_TOY_VAN                                                :Vagone Giocattoli
-STR_8051_BATTERY_TRUCK                                          :Vagone Batterie
-STR_8052_FIZZY_DRINK_TRUCK                                      :Vagone Bibite Friz.
-STR_8053_PLASTIC_TRUCK                                          :Vagone Plastica
+STR_8039_PASSENGER_CAR                                          :Carrozza passeggeri
+STR_803A_MAIL_VAN                                               :Vagone postale
+STR_803B_COAL_CAR                                               :Carrello carbone
+STR_803C_OIL_TANKER                                             :Vagone cisterna petrolio
+STR_803D_LIVESTOCK_VAN                                          :Vagone bestiame
+STR_803E_GOODS_VAN                                              :Vagone beni
+STR_803F_GRAIN_HOPPER                                           :Tramoggia per grano
+STR_8040_WOOD_TRUCK                                             :Carrello legname
+STR_8041_IRON_ORE_HOPPER                                        :Tramoggia per ferro
+STR_8042_STEEL_TRUCK                                            :Carrello acciaio
+STR_8043_ARMORED_VAN                                            :Vagone blindato
+STR_8044_FOOD_VAN                                               :Vagone alimentari
+STR_8045_PAPER_TRUCK                                            :Carrello carta
+STR_8046_COPPER_ORE_HOPPER                                      :Tramoggia per rame
+STR_8047_WATER_TANKER                                           :Vagone cisterna acqua
+STR_8048_FRUIT_TRUCK                                            :Carrello frutta
+STR_8049_RUBBER_TRUCK                                           :Carrello gomma
+STR_804A_SUGAR_TRUCK                                            :Carrello zucchero
+STR_804B_COTTON_CANDY_HOPPER                                    :Tramoggia per zucchero filato
+STR_804C_TOFFEE_HOPPER                                          :Tramoggia per toffee
+STR_804D_BUBBLE_VAN                                             :Vagone bollicine
+STR_804E_COLA_TANKER                                            :Vagone cisterna Cola
+STR_804F_CANDY_VAN                                              :Vagone caramelle
+STR_8050_TOY_VAN                                                :Vagone giocattoli
+STR_8051_BATTERY_TRUCK                                          :Carrello batterie
+STR_8052_FIZZY_DRINK_TRUCK                                      :Carrello bibite frizzanti
+STR_8053_PLASTIC_TRUCK                                          :Carrello plastica
 STR_8054_LEV1_LEVIATHAN_ELECTRIC                                :Lev1 'Leviathan' (Elettrica)
 STR_8055_LEV2_CYCLOPS_ELECTRIC                                  :Lev2 'Cyclops' (Elettrica)
 STR_8056_LEV3_PEGASUS_ELECTRIC                                  :Lev3 'Pegasus' (Elettrica)
 STR_8057_LEV4_CHIMAERA_ELECTRIC                                 :Lev4 'Chimaera' (Elettrica)
 STR_8058_WIZZOWOW_ROCKETEER                                     :Wizzowow Rocketeer
-STR_8059_PASSENGER_CAR                                          :Carrozza Passeggeri
-STR_805A_MAIL_VAN                                               :Vagone Postale
-STR_805B_COAL_CAR                                               :Vagone Carbone
-STR_805C_OIL_TANKER                                             :Vagone Cisterna
-STR_805D_LIVESTOCK_VAN                                          :Vagone Bestiame
-STR_805E_GOODS_VAN                                              :Vagone Beni
-STR_805F_GRAIN_HOPPER                                           :Vagone Grano
-STR_8060_WOOD_TRUCK                                             :Vagone Legname
-STR_8061_IRON_ORE_HOPPER                                        :Vagone Ferro
-STR_8062_STEEL_TRUCK                                            :Vagone Acciaio
-STR_8063_ARMORED_VAN                                            :Vagone Blindato
-STR_8064_FOOD_VAN                                               :Vagone Alimentari
-STR_8065_PAPER_TRUCK                                            :Vagone Carta
-STR_8066_COPPER_ORE_HOPPER                                      :Vagone Rame
-STR_8067_WATER_TANKER                                           :Vagone Cisterna Acqua
-STR_8068_FRUIT_TRUCK                                            :Vagone Frutta
-STR_8069_RUBBER_TRUCK                                           :Vagone Gomma
-STR_806A_SUGAR_TRUCK                                            :Vagone Zucchero
-STR_806B_COTTON_CANDY_HOPPER                                    :Vagone Cotone Cand.
-STR_806C_TOFFEE_HOPPER                                          :Vagone Toffee
-STR_806D_BUBBLE_VAN                                             :Vagone Bolle
-STR_806E_COLA_TANKER                                            :Vagone Cisterna Cola
-STR_806F_CANDY_VAN                                              :Vagone Dolciumi
-STR_8070_TOY_VAN                                                :Vagone Giocattoli
-STR_8071_BATTERY_TRUCK                                          :Vagone Batterie
-STR_8072_FIZZY_DRINK_TRUCK                                      :Vagone Bibite Friz.
-STR_8073_PLASTIC_TRUCK                                          :Vagone Plastica
+STR_8059_PASSENGER_CAR                                          :Carrozza passeggeri
+STR_805A_MAIL_VAN                                               :Vagone postale
+STR_805B_COAL_CAR                                               :Carrello carbone
+STR_805C_OIL_TANKER                                             :Vagone cisterna petrolio
+STR_805D_LIVESTOCK_VAN                                          :Vagone bestiame
+STR_805E_GOODS_VAN                                              :Vagone beni
+STR_805F_GRAIN_HOPPER                                           :Tramoggia per grano
+STR_8060_WOOD_TRUCK                                             :Carrello legname
+STR_8061_IRON_ORE_HOPPER                                        :Tramoggia per ferro
+STR_8062_STEEL_TRUCK                                            :Carrello acciaio
+STR_8063_ARMORED_VAN                                            :Vagone blindato
+STR_8064_FOOD_VAN                                               :Vagone alimentari
+STR_8065_PAPER_TRUCK                                            :Carrello carta
+STR_8066_COPPER_ORE_HOPPER                                      :Tramoggia per rame
+STR_8067_WATER_TANKER                                           :Vagone cisterna acqua
+STR_8068_FRUIT_TRUCK                                            :Carrello frutta
+STR_8069_RUBBER_TRUCK                                           :Carrello gomma
+STR_806A_SUGAR_TRUCK                                            :Carrello zucchero
+STR_806B_COTTON_CANDY_HOPPER                                    :Tramoggia per zucchero filato
+STR_806C_TOFFEE_HOPPER                                          :Tramoggia per toffee
+STR_806D_BUBBLE_VAN                                             :Vagone bollicine
+STR_806E_COLA_TANKER                                            :Vagone cisterna Cola
+STR_806F_CANDY_VAN                                              :Vagone caramelle
+STR_8070_TOY_VAN                                                :Vagone giocattoli
+STR_8071_BATTERY_TRUCK                                          :Carrello batterie
+STR_8072_FIZZY_DRINK_TRUCK                                      :Carrello bibite frizzanti
+STR_8073_PLASTIC_TRUCK                                          :Carrello plastica
 STR_8074_MPS_REGAL_BUS                                          :Bus MPS Regal
 STR_8075_HEREFORD_LEOPARD_BUS                                   :Bus Hereford Leopard
 STR_8076_FOSTER_BUS                                             :Bus Foster
-STR_8077_FOSTER_MKII_SUPERBUS                                   :Foster MkII Superbus
+STR_8077_FOSTER_MKII_SUPERBUS                                   :Superbus Foster MkII
 STR_8078_PLODDYPHUT_MKI_BUS                                     :Bus Ploddyphut MkI
 STR_8079_PLODDYPHUT_MKII_BUS                                    :Bus Ploddyphut MkII
 STR_807A_PLODDYPHUT_MKIII_BUS                                   :Bus Ploddyphut MkIII
-STR_807B_BALOGH_COAL_TRUCK                                      :Camion Carbone Balogh
-STR_807C_UHL_COAL_TRUCK                                         :Camion Carbone Uhl
-STR_807D_DW_COAL_TRUCK                                          :Camion Carbone DW
-STR_807E_MPS_MAIL_TRUCK                                         :Furgone Postale MPS
-STR_807F_REYNARD_MAIL_TRUCK                                     :Furgone Postale Reynard
-STR_8080_PERRY_MAIL_TRUCK                                       :Furgone Postale Perry
-STR_8081_MIGHTYMOVER_MAIL_TRUCK                                 :Furg. Postale MightyMover
-STR_8082_POWERNAUGHT_MAIL_TRUCK                                 :Furg. Postale Powernaught
-STR_8083_WIZZOWOW_MAIL_TRUCK                                    :Furgone Postale Wizzowow
+STR_807B_BALOGH_COAL_TRUCK                                      :Autocarro carbone Balogh
+STR_807C_UHL_COAL_TRUCK                                         :Autocarro carbone Uhl
+STR_807D_DW_COAL_TRUCK                                          :Autocarro carbone DW
+STR_807E_MPS_MAIL_TRUCK                                         :Furgone postale MPS
+STR_807F_REYNARD_MAIL_TRUCK                                     :Furgone postale Reynard
+STR_8080_PERRY_MAIL_TRUCK                                       :Furgone postale Perry
+STR_8081_MIGHTYMOVER_MAIL_TRUCK                                 :Furgone postale MightyMover
+STR_8082_POWERNAUGHT_MAIL_TRUCK                                 :Furgone postale Powernaught
+STR_8083_WIZZOWOW_MAIL_TRUCK                                    :Furgone postale Wizzowow
 STR_8084_WITCOMBE_OIL_TANKER                                    :Autocisterna Witcombe
 STR_8085_FOSTER_OIL_TANKER                                      :Autocisterna Foster
 STR_8086_PERRY_OIL_TANKER                                       :Autocisterna Perry
-STR_8087_TALBOTT_LIVESTOCK_VAN                                  :Furgone Bestiame Talbott
-STR_8088_UHL_LIVESTOCK_VAN                                      :Furgone Bestiame Uhl
-STR_8089_FOSTER_LIVESTOCK_VAN                                   :Furgone Bestiame Foster
-STR_808A_BALOGH_GOODS_TRUCK                                     :Camion Beni Balogh
-STR_808B_CRAIGHEAD_GOODS_TRUCK                                  :Camion Beni Craighead
-STR_808C_GOSS_GOODS_TRUCK                                       :Camion Beni Goss
-STR_808D_HEREFORD_GRAIN_TRUCK                                   :Camion Grano Hereford
-STR_808E_THOMAS_GRAIN_TRUCK                                     :Camion Grano Thomas
-STR_808F_GOSS_GRAIN_TRUCK                                       :Camion Grano Goss
-STR_8090_WITCOMBE_WOOD_TRUCK                                    :Camion Legname Witcombe
-STR_8091_FOSTER_WOOD_TRUCK                                      :Camion Legname Foster
-STR_8092_MORELAND_WOOD_TRUCK                                    :Camion Legname Moreland
-STR_8093_MPS_IRON_ORE_TRUCK                                     :Camion Ferro MPS
-STR_8094_UHL_IRON_ORE_TRUCK                                     :Camion Ferro Uhl
-STR_8095_CHIPPY_IRON_ORE_TRUCK                                  :Camion Ferro Chippy
-STR_8096_BALOGH_STEEL_TRUCK                                     :Camion Acciaio Balogh
-STR_8097_UHL_STEEL_TRUCK                                        :Camion Acciaio Uhl
-STR_8098_KELLING_STEEL_TRUCK                                    :Camion Acciaio Kelling
+STR_8087_TALBOTT_LIVESTOCK_VAN                                  :Carro bestiame Talbott
+STR_8088_UHL_LIVESTOCK_VAN                                      :Carro bestiame Uhl
+STR_8089_FOSTER_LIVESTOCK_VAN                                   :Carro bestiame Foster
+STR_808A_BALOGH_GOODS_TRUCK                                     :Camion beni Balogh
+STR_808B_CRAIGHEAD_GOODS_TRUCK                                  :Camion beni Craighead
+STR_808C_GOSS_GOODS_TRUCK                                       :Camion beni Goss
+STR_808D_HEREFORD_GRAIN_TRUCK                                   :Autocarro grano Hereford
+STR_808E_THOMAS_GRAIN_TRUCK                                     :Autocarro grano Thomas
+STR_808F_GOSS_GRAIN_TRUCK                                       :Autocarro grano Goss
+STR_8090_WITCOMBE_WOOD_TRUCK                                    :Autocarro legname Witcombe
+STR_8091_FOSTER_WOOD_TRUCK                                      :Autocarro legname Foster
+STR_8092_MORELAND_WOOD_TRUCK                                    :Autocarro legname Moreland
+STR_8093_MPS_IRON_ORE_TRUCK                                     :Autocarro ferro MPS
+STR_8094_UHL_IRON_ORE_TRUCK                                     :Autocarro ferro Uhl
+STR_8095_CHIPPY_IRON_ORE_TRUCK                                  :Autocarro ferro Chippy
+STR_8096_BALOGH_STEEL_TRUCK                                     :Autocarro acciaio Balogh
+STR_8097_UHL_STEEL_TRUCK                                        :Autocarro acciaio Uhl
+STR_8098_KELLING_STEEL_TRUCK                                    :Autocarro acciaio Kelling
 STR_8099_BALOGH_ARMORED_TRUCK                                   :Autoblindo Balogh
 STR_809A_UHL_ARMORED_TRUCK                                      :Autoblindo Uhl
 STR_809B_FOSTER_ARMORED_TRUCK                                   :Autoblindo Foster
-STR_809C_FOSTER_FOOD_VAN                                        :Furg. Alimentari Foster
-STR_809D_PERRY_FOOD_VAN                                         :Furg. Alimentari Perry
-STR_809E_CHIPPY_FOOD_VAN                                        :Furg. Alimentari Chippy
-STR_809F_UHL_PAPER_TRUCK                                        :Camion Carta Uhl
-STR_80A0_BALOGH_PAPER_TRUCK                                     :Camion Carta Balogh
-STR_80A1_MPS_PAPER_TRUCK                                        :Camion Carta MPS
-STR_80A2_MPS_COPPER_ORE_TRUCK                                   :Camion Rame MPS
-STR_80A3_UHL_COPPER_ORE_TRUCK                                   :Camion Rame Uhl
-STR_80A4_GOSS_COPPER_ORE_TRUCK                                  :Camion Rame Goss
+STR_809C_FOSTER_FOOD_VAN                                        :Furgone alimentari Foster
+STR_809D_PERRY_FOOD_VAN                                         :Furgone alimentari Perry
+STR_809E_CHIPPY_FOOD_VAN                                        :Furgone alimentari Chippy
+STR_809F_UHL_PAPER_TRUCK                                        :Autocarro carta Uhl
+STR_80A0_BALOGH_PAPER_TRUCK                                     :Autocarro carta Balogh
+STR_80A1_MPS_PAPER_TRUCK                                        :Autocarro carta MPS
+STR_80A2_MPS_COPPER_ORE_TRUCK                                   :Autocarro rame MPS
+STR_80A3_UHL_COPPER_ORE_TRUCK                                   :Autocarro rame Uhl
+STR_80A4_GOSS_COPPER_ORE_TRUCK                                  :Autocarro rame Goss
 STR_80A5_UHL_WATER_TANKER                                       :Autobotte Uhl
 STR_80A6_BALOGH_WATER_TANKER                                    :Autobotte Balogh
 STR_80A7_MPS_WATER_TANKER                                       :Autobotte MPS
-STR_80A8_BALOGH_FRUIT_TRUCK                                     :Camion Frutta Balogh
-STR_80A9_UHL_FRUIT_TRUCK                                        :Camion Frutta Uhl
-STR_80AA_KELLING_FRUIT_TRUCK                                    :Camion Frutta Kelling
-STR_80AB_BALOGH_RUBBER_TRUCK                                    :Camion Gomma Balogh
-STR_80AC_UHL_RUBBER_TRUCK                                       :Camion Gomma Uhl
-STR_80AD_RMT_RUBBER_TRUCK                                       :Camion Gomma RMT
-STR_80AE_MIGHTYMOVER_SUGAR_TRUCK                                :Camion Zucchero MightyMover
-STR_80AF_POWERNAUGHT_SUGAR_TRUCK                                :Camion Zucchero Powernaught
-STR_80B0_WIZZOWOW_SUGAR_TRUCK                                   :Camion Zucchero Wizzowow
-STR_80B1_MIGHTYMOVER_COLA_TRUCK                                 :Autobotte-Cola MightyMover
-STR_80B2_POWERNAUGHT_COLA_TRUCK                                 :Autobotte-Cola Powernaught
-STR_80B3_WIZZOWOW_COLA_TRUCK                                    :Autobotte-Cola Wizzowow
-STR_80B4_MIGHTYMOVER_COTTON_CANDY                               :Camion Cotone Can. MightyMover
-STR_80B5_POWERNAUGHT_COTTON_CANDY                               :Camion Cotone Can. Powernaught
-STR_80B6_WIZZOWOW_COTTON_CANDY_TRUCK                            :Camion Cotone Can. Wizzowow
-STR_80B7_MIGHTYMOVER_TOFFEE_TRUCK                               :Camion Toffee MightyMover
-STR_80B8_POWERNAUGHT_TOFFEE_TRUCK                               :Camion Toffee Powernaught
-STR_80B9_WIZZOWOW_TOFFEE_TRUCK                                  :Camion Toffee Wizzowow
-STR_80BA_MIGHTYMOVER_TOY_VAN                                    :Furgone Giocattoli MightyMover
-STR_80BB_POWERNAUGHT_TOY_VAN                                    :Furgone Giocattoli Powernaught
-STR_80BC_WIZZOWOW_TOY_VAN                                       :Furgone Giocattoli Wizzowow
-STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :Camion Dolci MightyMover
-STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Camion Dolci Powernaught
-STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Camion Dolci Wizzowow
-STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :Camion Batterie MightyMover
-STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Camion Batterie Powernaught
-STR_80C2_WIZZOWOW_BATTERY_TRUCK                                 :Camion Batterie Wizzowow
-STR_80C3_MIGHTYMOVER_FIZZY_DRINK                                :Camion Bibite Friz.MightyMover
-STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :camion Bibite Friz.Powernaught
-STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK                             :Camion Bibite Friz.Wizzowow
-STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK                              :Camion Plastica MightyMover
-STR_80C7_POWERNAUGHT_PLASTIC_TRUCK                              :Camion Plastica Powernaught
-STR_80C8_WIZZOWOW_PLASTIC_TRUCK                                 :Camion Plastica Wizzowow
-STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :Camion Bolle MightyMover
-STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Camion Bolle Powernaught
-STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Camion Bolle Wizzowow
+STR_80A8_BALOGH_FRUIT_TRUCK                                     :Autocarro frutta Balogh
+STR_80A9_UHL_FRUIT_TRUCK                                        :Autocarro frutta Uhl
+STR_80AA_KELLING_FRUIT_TRUCK                                    :Autocarro frutta Kelling
+STR_80AB_BALOGH_RUBBER_TRUCK                                    :Autocarro gomma Balogh
+STR_80AC_UHL_RUBBER_TRUCK                                       :Autocarro gomma Uhl
+STR_80AD_RMT_RUBBER_TRUCK                                       :Autocarro gomma RMT
+STR_80AE_MIGHTYMOVER_SUGAR_TRUCK                                :Autocarro zucchero MightyMover
+STR_80AF_POWERNAUGHT_SUGAR_TRUCK                                :Autocarro zucchero Powernaught
+STR_80B0_WIZZOWOW_SUGAR_TRUCK                                   :Autocarro zucchero Wizzowow
+STR_80B1_MIGHTYMOVER_COLA_TRUCK                                 :Autobotte per Cola MightyMover
+STR_80B2_POWERNAUGHT_COLA_TRUCK                                 :Autobotte per Cola Powernaught
+STR_80B3_WIZZOWOW_COLA_TRUCK                                    :Autobotte per Cola Wizzowow
+STR_80B4_MIGHTYMOVER_COTTON_CANDY                               :Autocarro zucch. filato MightyMover
+STR_80B5_POWERNAUGHT_COTTON_CANDY                               :Autocarro zucch. filato Powernaught
+STR_80B6_WIZZOWOW_COTTON_CANDY_TRUCK                            :Autocarro zucch. filato Wizzowow
+STR_80B7_MIGHTYMOVER_TOFFEE_TRUCK                               :Autocarro toffee MightyMover
+STR_80B8_POWERNAUGHT_TOFFEE_TRUCK                               :Autocarro toffee Powernaught
+STR_80B9_WIZZOWOW_TOFFEE_TRUCK                                  :Autocarro toffee Wizzowow
+STR_80BA_MIGHTYMOVER_TOY_VAN                                    :Furgone giocattoli MightyMover
+STR_80BB_POWERNAUGHT_TOY_VAN                                    :Furgone giocattoli Powernaught
+STR_80BC_WIZZOWOW_TOY_VAN                                       :Furgone giocattoli Wizzowow
+STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :Autocarro caramelle MightyMover
+STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Autocarro caramelle Powernaught
+STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Autocarro caramelle Wizzowow
+STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :Carro batterie MightyMover
+STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Carro batterie Powernaught
+STR_80C2_WIZZOWOW_BATTERY_TRUCK                                 :Carro batterie Wizzowow
+STR_80C3_MIGHTYMOVER_FIZZY_DRINK                                :Autocarro bibite frizz. MightyMover
+STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :Autocarro bibite frizz. Powernaught
+STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK                             :Autocarro bibite frizz. Wizzowow
+STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK                              :Autocarro plastica MightyMover
+STR_80C7_POWERNAUGHT_PLASTIC_TRUCK                              :Autocarro plastica Powernaught
+STR_80C8_WIZZOWOW_PLASTIC_TRUCK                                 :Autocarro plastica Wizzowow
+STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :Autocarro bollicine MightyMover
+STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Autocarro bollicine Powernaught
+STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Autocarro bollicine Wizzowow
 STR_80CC_MPS_OIL_TANKER                                         :Petroliera MPS
 STR_80CD_CS_INC_OIL_TANKER                                      :Petroliera CS-Inc.
 STR_80CE_MPS_PASSENGER_FERRY                                    :Traghetto MPS
@@ -2441,10 +2505,10 @@
 STR_80D0_BAKEWELL_300_HOVERCRAFT                                :Hovercraft Bakewell 300
 STR_80D1_CHUGGER_CHUG_PASSENGER                                 :Traghetto Chugger-Chug
 STR_80D2_SHIVERSHAKE_PASSENGER_FERRY                            :Traghetto Shivershake
-STR_80D3_YATE_CARGO_SHIP                                        :Nave Mercantile Yate
-STR_80D4_BAKEWELL_CARGO_SHIP                                    :Nave Mercantile Bakewell
-STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Nave Mercantile Mightymover
-STR_80D6_POWERNAUT_CARGO_SHIP                                   :Name Mercantile Powernaut
+STR_80D3_YATE_CARGO_SHIP                                        :Mercantile Yate
+STR_80D4_BAKEWELL_CARGO_SHIP                                    :Mercantile Bakewell
+STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Mercantile Mightymover
+STR_80D6_POWERNAUT_CARGO_SHIP                                   :Mercantile Powernaut
 STR_80D7_SAMPSON_U52                                            :Sampson U52
 STR_80D8_COLEMAN_COUNT                                          :Coleman Count
 STR_80D9_FFP_DART                                               :FFP Dart
@@ -2486,20 +2550,20 @@
 STR_80FD_TRICARIO_HELICOPTER                                    :Elicottero Tricario
 STR_80FE_GURU_X2_HELICOPTER                                     :Elicottero Guru X2
 STR_80FF_POWERNAUT_HELICOPTER                                   :Elicottero Powernaut
-STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Messaggio dal costruttore del veicolo
-STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Abbiamo appena progettato un nuovo {STRING} - Le interessa un'anno di esclusiva sull'uso del veicolo? Così possiamo vedere come va prima di renderlo disponibile al mercato?
-STR_8102_RAILROAD_LOCOMOTIVE                                    :locomotiva
-STR_8103_ROAD_VEHICLE                                           :veicolo stradale
-STR_8104_AIRCRAFT                                               :aereo
-STR_8105_SHIP                                                   :nave
-STR_8106_MONORAIL_LOCOMOTIVE                                    :motrice monorotaia
-STR_8107_MAGLEV_LOCOMOTIVE                                      :motrice maglev
+STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Messaggio da un costruttore di veicoli
+STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Abbiamo appena progettato un{G "" a} nuov{G o a} {STRING} - È interessato ad un anno di uso esclusivo di questo veicolo, in modo da permetterci di valutarne le prestazioni prima di renderlo disponibile sul mercato?
+STR_8102_RAILROAD_LOCOMOTIVE                                    :{G=f}locomotiva
+STR_8103_ROAD_VEHICLE                                           :{G=m}automezzo
+STR_8104_AIRCRAFT                                               :{G=m}aeromobile
+STR_8105_SHIP                                                   :{G=f}nave
+STR_8106_MONORAIL_LOCOMOTIVE                                    :{G=f}motrice monorotaia
+STR_8107_MAGLEV_LOCOMOTIVE                                      :{G=f}motrice maglev
 
 ##id 0x8800
-STR_8800_TRAIN_DEPOT                                            :{WHITE}{TOWN} Deposito Treni
-STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Primo treno arrivato a {STATION}!
-STR_8802_DETAILS                                                :{WHITE}{STRING} (Details)
-STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Treno in mezzo
+STR_8800_TRAIN_DEPOT                                            :{WHITE}Deposito ferroviario di {TOWN}
+STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Il primo treno arriva a {STATION}!
+STR_8802_DETAILS                                                :{WHITE}{STRING} (Dettagli)
+STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Treno di mezzo
 STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8806_GO_TO                                                  :Vai a {STATION}
@@ -2514,358 +2578,360 @@
 STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Vai non-stop a {STATION} (Trasferisci e parti vuoto)
 STR_8810_GO_NON_STOP_TO_LOAD                                    :Vai non-stop a {STATION} (Carica)
 STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Vai non-stop a {STATION} (Trasferisci e aspetta carico completo)
-STR_GO_TO_TRAIN_DEPOT                                           :Vai a {TOWN} Deposito Treni
-STR_SERVICE_AT_TRAIN_DEPOT                                      :Manutenzione a {TOWN} Deposito Ferroviario
-STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Vai non-stop a {TOWN} Deposito Ferroviario
-STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Manutenzione non-stop a {TOWN} Deposito Ferroviario
+STR_GO_TO_TRAIN_DEPOT                                           :Vai al Deposito ferroviario di {TOWN}
+STR_SERVICE_AT_TRAIN_DEPOT                                      :Manutenzione al Deposito di {TOWN}
+STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Vai non-stop al Deposito ferroviario di {TOWN}
+STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Manutenzione non-stop al Deposito di {TOWN}
 
-STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Direzione per {TOWN} Deposito Treni
-STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Direzione per {TOWN} Deposito Treni, {VELOCITY}
-STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Servizio a {TOWN} Deposito Treni
-STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL                         :{LTBLUE}Servizio a {TOWN} Deposito Treni, {VELOCITY}
+STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Diretto al Deposito di {TOWN}
+STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Diretto al Deposito di {TOWN}, {VELOCITY}
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE                             :{LTBLUE}Manutenzione al Deposito di {TOWN}
+STR_HEADING_FOR_TRAIN_DEPOT_SERVICE_VEL                         :{LTBLUE}Manutenzione al Deposito di {TOWN}, {VELOCITY}
 
-STR_INVALID_ORDER                                               :{RED} (Ordine non Valido)
+STR_INVALID_ORDER                                               :{RED} (Ordine non valido)
 
 STR_UNKNOWN_DESTINATION                                         :destinazione sconosciuta
 STR_8812_EMPTY                                                  :{LTBLUE}Vuoto
 STR_8813_FROM                                                   :{LTBLUE}{CARGO} da {STATION}
 STR_FROM_MULT                                                   :{LTBLUE}{CARGO} da {STATION} (x{NUM})
-STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Treno {COMMA} sta aspettando nel deposito
-STR_8815_NEW_VEHICLES                                           :{BLACK}Nuovi Veicoli
+STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Il Treno {COMMA} sta aspettando nel deposito
+STR_8815_NEW_VEHICLES                                           :{BLACK}Nuovi veicoli
 STR_8816                                                        :{BLACK}-
 STR_8819_TRAIN_TOO_LONG                                         :{WHITE}Treno troppo lungo
-STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Un treno può essere modificato solo quando è fermo nel deposito
-STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Tren{P o i}
+STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Un treno può essere modificato solo quando è fermo in un deposito
+STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} tren{P 2 o i}
 
-STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Nuovo Veicolo Ferroviario
-STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Nuovi Veicoli Ferroviari Elettrici
-STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nuovo  Veicolo Monorotaia
-STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Nuovo Veicolo Maglev
-STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Veicoli Ferroviari
+STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Nuovi veicoli ferroviari
+STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Nuovi veicoli ferroviari elettrici
+STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Nuovi veicoli monorotaia
+STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Nuovi veicoli maglev
+STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Veicoli ferroviari
 
-STR_881F_BUILD_VEHICLE                                          :{BLACK}Costruisci Veicolo
-STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Clona Veicolo
-STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Costruisce una copia del veicolo stradale. Premere contemporaneamente Control per condividere gli ordini
-STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Costruisce una copia di un veicolo stradale. Cliccare su questo pulsante e poi sul veicolo stradale (dentro o fuori dal deposito) da copiare. Premere contemporaneamente Control per condividere gli ordini
-STR_CLONE_TRAIN                                                 :{BLACK}Clona Treno
-STR_CLONE_TRAIN_INFO                                            :{BLACK}Costruisce una copia del treno, vagoni inclusi. Premere contemporaneamente Control per condividere gli ordini
-STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Costruisce una copia di un treno, vagoni inclusi. Cliccare su questo pulsante e poi sul treno (dentro o fuori dal deposito) da copiare. Premere contemporaneamente Control per condividere gli ordini
+STR_881F_BUILD_VEHICLE                                          :{BLACK}Costruisci veicolo
+STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Clona automezzo
+STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Costruisce una copia dell'automezzo. Tenere premuto CTRL per condividere gli ordini
+STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Costruisce una copia di un automezzo. Fare clic su questo pulsante e quindi su un automezzo dentro o fuori dal deposito. Tenere premuto CTRL per condividere gli ordini
+STR_CLONE_TRAIN                                                 :{BLACK}Clona treno
+STR_CLONE_TRAIN_INFO                                            :{BLACK}Costruisce una copia del treno, inclusi tutti i vagoni. Tenere premuto CTRL per condividere gli ordini.
+STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Costruisce una copia di un treno, inclusi tutti i vagoni. Fare clic su questo pulsante e quindi su un treno dentro o fuori dal deposito. Tenere premuto CTRL per condividere gli ordini
 STR_8820_RENAME                                                 :{BLACK}Rinomina
 STR_8823_SKIP                                                   :{BLACK}Salta
 STR_8824_DELETE                                                 :{BLACK}Elimina
-STR_8825_NON_STOP                                               :{BLACK}Non-Stop
+STR_8825_NON_STOP                                               :{BLACK}Non-stop
 STR_8826_GO_TO                                                  :{BLACK}Vai a
 STR_8827_FULL_LOAD                                              :{BLACK}Carica
 STR_8828_UNLOAD                                                 :{BLACK}Scarica
-STR_REFIT                                                       :{BLACK}Modifica
-STR_REFIT_TIP                                                   :{BLACK}Scegli iltipo di merce da modificare in questo ordine. CTRL+click per togliere l'istruzione di modifica
-STR_REFIT_ORDER                                                 :(Modifica a {STRING})
+STR_REFIT                                                       :{BLACK}Riadatta
+STR_REFIT_TIP                                                   :{BLACK}Selezionare il tipo di carico per il quale riadattare in questo ordine.  Premere CTRL+clic per rimuovere l'istruzione di riadattamento
+STR_REFIT_ORDER                                                 :(Riadatta per {STRING})
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordini)
-STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fine degli Ordini - -
+STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fine degli ordini - -
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
-STR_SERVICE                                                     :{BLACK}Manutenzione
-STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Non puoi costruire veicolo ferroviario...
-STR_882C_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costr. nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
+STR_SERVICE                                                     :{BLACK}Manutieni
+STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Impossibile costruire il veicolo ferroviario...
+STR_882C_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costruito nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
 STR_882D_VALUE                                                  :{LTBLUE}{STRING}{BLACK}   Valore: {LTBLUE}{CURRENCY}
 STR_882E                                                        :{WHITE}{VEHICLE}
-STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Carica / Scarica
-STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Il treno deve essere fermato nel deposito
-STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Non puoi mandare treno al deposito...
+STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Caricamento / Scaricamento
+STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Il treno deve essere fermo in un deposito
+STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Impossibile mandare il treno al deposito...
 STR_8831_NO_MORE_SPACE_FOR_ORDERS                               :{WHITE}Spazio per gli ordini terminato
 STR_8832_TOO_MANY_ORDERS                                        :{WHITE}Troppi ordini
-STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Non puoi inserire nuovo ordine...
-STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Non puoi cancellare questo ordine...
-STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Non puoi modificare questo ordine...
-STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Non puoi spostare il veicolo...
-STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}La locomotiva di coda seguirà sempre quella di testa
+STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Impossibile inserire un nuovo ordine...
+STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Impossibile cancellare questo ordine...
+STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Impossibile modificare questo ordine...
+STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Impossibile spostare il veicolo...
+STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}La locomotiva di coda segue sempre quella di testa
 STR_8838_N_A                                                    :N/A{SKIP}
-STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Non puoi vendere veicolo ferroviario...
-STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Non riesce a trovare il deposito locale
-STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Non puoi far fermare/ripartire il treno...
-STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Intervallo Manut.: {LTBLUE}{COMMA}giorni{BLACK}   Ultima Manut.: {LTBLUE}{DATE_LONG}
-STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Intervallo Manutenz.: {LTBLUE}{COMMA}%{BLACK}   Ultima Manut.: {LTBLUE}{DATE_LONG}
-STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treni - fai clic sul treno per le informazioni
-STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Costruisci nuovi treni (Necessario deposito)
-STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treni - fai clic sul treno per le informazioni, trascina i veicoli per aggiungerli/rimuoverli dal treno
-STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Costruisci nuovo veicolo ferroviario
-STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Trascina veicolo qui per venderlo
-STR_8842_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centra visuale sul deposito ferroviario
-STR_8843_TRAIN_VEHICLE_SELECTION                                :{BLACK}Lista treni - fai clic sul veicolo per le informazioni
-STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN                            :{BLACK}Costruisci veicolo ferroviario evidenziato
-STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Rinomina tipo di veicolo
-STR_8846_CURRENT_TRAIN_ACTION_CLICK                             :{BLACK}Azione corrente del treno - Clicca qui per fermarlo/farlo partire
-STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Mostra ordini del treno
-STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centra visuale sul treno
-STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Manda treno al deposito
+STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Impossibile vendere il veicolo ferroviario...
+STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Impossibile determinare il tragitto verso il deposito più vicino
+STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Impossibile fermare/avviare il treno...
+STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Manutenzione ogni: {LTBLUE}{COMMA} giorni{BLACK}   Ultima volta: {LTBLUE}{DATE_LONG}
+STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Intervallo manutenzione: {LTBLUE}{COMMA}%{BLACK}   Ultima il: {LTBLUE}{DATE_LONG}
+STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treni - fare clic su un treno per informazioni
+STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Costruisce nuovi treni (è necessario un deposito ferroviario)
+STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Treni - fare clic su un treno per informazioni, trascinare i veicoli per aggiungerli/rimuoverli dal treno
+STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Costruisce un nuovo veicolo ferroviario
+STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Trascianre qui un veicolo ferroviario per venderlo
+STR_8842_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centra la visuale principale sulla posizione del deposito ferroviario
+STR_8843_TRAIN_VEHICLE_SELECTION                                :{BLACK}Elenco di selezione dei veicoli ferroviari - fare clic su un veicolo per informazioni
+STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN                            :{BLACK}Costruisce il veicolo ferroviario selezionato
+STR_8845_RENAME_TRAIN_VEHICLE_TYPE                              :{BLACK}Rinomina il tipo di veicolo ferroviario
+STR_8846_CURRENT_TRAIN_ACTION_CLICK                             :{BLACK}Azione corrente del treno - fare clic qui per fermarlo/avviarlo
+STR_8847_SHOW_TRAIN_S_ORDERS                                    :{BLACK}Mostra gli ordini del treno
+STR_8848_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centra la visuale principale sulla posizione del treno
+STR_8849_SEND_TRAIN_TO_DEPOT                                    :{BLACK}Manda il treno al deposito e CTRL+clic per eseguire solo una manutenzione
 STR_884A_FORCE_TRAIN_TO_PROCEED                                 :{BLACK}Forza il treno a proseguire senza aspettare il segnale di via libera
-STR_884B_REVERSE_DIRECTION_OF_TRAIN                             :{BLACK}Inverti direzione del treno
-STR_884C_SHOW_TRAIN_DETAILS                                     :{BLACK}Mostra dettagli del treno
-STR_884D_INCREASE_SERVICING_INTERVAL                            :{BLACK}Aumenta intervallo di manutenzione
-STR_884E_DECREASE_SERVICING_INTERVAL                            :{BLACK}Riduci intervallo di manutenzione
-STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED                          :{BLACK}Mostra dettagli del carico trasportato
-STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES                         :{BLACK}Mostra dettagli di ogni veicolo
-STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Mostra capienza di ogni veicolo
-STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Mostra la capacità massima del treno per tipo di carico
-STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Lista ordini - fai clic sull'ordine per evidenziarlo
+STR_884B_REVERSE_DIRECTION_OF_TRAIN                             :{BLACK}Inverte la direzione del treno
+STR_884C_SHOW_TRAIN_DETAILS                                     :{BLACK}Mostra i dettagli sul treno
+STR_884D_INCREASE_SERVICING_INTERVAL                            :{BLACK}Aumenta l'intervallo di manutenzione
+STR_884E_DECREASE_SERVICING_INTERVAL                            :{BLACK}Riduce l'intervallo di manutenzione
+STR_884F_SHOW_DETAILS_OF_CARGO_CARRIED                          :{BLACK}Mostra i dettagli sul carico trasportato
+STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES                         :{BLACK}Mostra i dettagli sui veicoli che compongono il treno
+STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Mostra la capienza di ogni veicolo
+STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Mostra la capacità totale del treno, suddivisa per tipo di carico
+STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Lista degli ordini - fare clic su un ordine per selezionarlo e CTRL+clic per portarsi sulla stazione corrispondente
 STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}Salta l'ordine corrente e inizia il successivo
-STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Elimina l'ordine evidenziato
-STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fai diventare l'ordine evidenziato 'non-stop'
-STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Aggiungi un nuovo ordine prima di quello evidenziato o aggiungilo alla fine della lista
-STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fai diventare l'ordine evidenziato 'forza il veicolo ad attendere il carico completo'
-STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fai diventare l'ordine evidenziato 'forza il veicolo a scaricare'
-STR_SERVICE_HINT                                                :{BLACK}Ignora l'ordine finché non sia necessaria la manutenzione
-STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Costo: {CURRENCY} Peso: {WEIGHT_S}{}Velocità: {VELOCITY}  Potenza: {POWER}{}Consumi: {CURRENCY}/anno{}Capienza: {CARGO}
-STR_885C_BROKEN_DOWN                                            :{RED}Guasto!
-STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Consumi: {LTBLUE}{CURRENCY}/anno
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}Peso: {LTBLUE}{WEIGHT_S}  {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Velocità Max: {LTBLUE}{VELOCITY}
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}Peso: {LTBLUE}{WEIGHT_S} {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Vel. Max: {LTBLUE}{VELOCITY} {BLACK}Sforzo Trazione Max.: {LTBLUE}{FORCE}
+STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Elimina l'ordine selezionato
+STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fa diventare l'ordine selezionato 'non-stop'
+STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Inserisce un nuovo ordine prima di quello selezionato, o lo aggiunge alla fine della lista
+STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fa in modo che l'ordine selezionato forzi il veicolo ad aspettare il carico completo
+STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fa in modo che l'ordine selezionato forzi il veicolo a scaricare
+STR_SERVICE_HINT                                                :{BLACK}Ingnora quest'ordine a meno che non sia necessaria una manutenzione
+STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Costo: {CURRENCY} Peso: {WEIGHT_S}{}Velocità: {VELOCITY}  Potenza: {POWER}{}Costo d'esercizio: {CURRENCY}/anno{}Capacità: {CARGO}
+STR_885C_BROKEN_DOWN                                            :{RED}Guasto
+STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Costo d'esercizio: {LTBLUE}{CURRENCY}/anno
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}Peso: {LTBLUE}{WEIGHT_S}  {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Velocità max: {LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}Peso: {LTBLUE}{WEIGHT_S} {BLACK}Potenza: {LTBLUE}{POWER}{BLACK} Velocità max: {LTBLUE}{VELOCITY} {BLACK}Trazione max: {LTBLUE}{FORCE}
 STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profitto quest'anno: {LTBLUE}{CURRENCY}  (anno scorso: {CURRENCY})
 STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}Affidabilità: {LTBLUE}{COMMA}%  {BLACK}Guasti dall'ultima manutenzione: {LTBLUE}{COMMA}
-STR_8861_STOPPED                                                :{RED}Fermato
-STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Non puoi fargli passare i segnali al rischio di...
+STR_8861_STOPPED                                                :{RED}Fermo
+STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}Impossibile far passare al treno un segnale di pericolo...
 STR_8863_CRASHED                                                :{RED}Distrutto!
 
-STR_8865_NAME_TRAIN                                             :{WHITE}Nome Treno
-STR_8866_CAN_T_NAME_TRAIN                                       :{WHITE}Non puoi rinominare il treno...
-STR_8867_NAME_TRAIN                                             :{BLACK}Nome Treno
-STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Treno schiantato!{}{COMMA} morti in una palla di fuoco dopo la collisione
-STR_8869_CAN_T_REVERSE_DIRECTION                                :{WHITE}Non puoi invertire la direzione del treno...
-STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Rinomina il tipo di veicolo
-STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Non puoi rinominare tipo di veicolo...
-STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fai diventare l'ordine evidenziato 'forza il veicolo a trasferire il carico'
+STR_8865_NAME_TRAIN                                             :{WHITE}Nome del treno
+STR_8866_CAN_T_NAME_TRAIN                                       :{WHITE}Impossibile rinominare il treno...
+STR_8867_NAME_TRAIN                                             :{BLACK}Rinomina il treno
+STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Incidente ferroviario!{}In {COMMA} muoiono nell'incendio seguito alla collisione
+STR_8869_CAN_T_REVERSE_DIRECTION                                :{WHITE}Impossibile invertire la direzione del treno...
+STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Rinomina tipo di veicolo ferroviario
+STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Impossibile rinominare il tipo di veicolo ferroviario...
+STR_886D_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Fa in modo che l'ordine selezionato forzi il veicolo a trasferire il carico
 STR_886F_TRANSFER                                               :{BLACK}Trasferisci
 
 STR_TRAIN_STOPPING                                              :{RED}In frenata
 STR_TRAIN_STOPPING_VEL                                          :{RED}In frenata, {VELOCITY}
-STR_INCOMPATIBLE_RAIL_TYPES                                     :Tipo binario incompatibile
-STR_TRAIN_NO_POWER                                              :{RED}Nessuna potenza
-STR_TRAIN_START_NO_CATENARY                                     :Questo tratto manca la catenaria, per questo il treno non può partire
+STR_INCOMPATIBLE_RAIL_TYPES                                     :Tipi di rotaia non compatibili
+STR_TRAIN_NO_POWER                                              :{RED}Alimentazione mancante
+STR_TRAIN_START_NO_CATENARY                                     :In questo binario manca la catenaria, quindi il treno non può essere avviato
 
-STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Nuovo {STRING} è disponibile!
+STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Nuov{G o a} {STRING} disponibile!
 STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{STRING}
-STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nuovo {STRING} è disponibile! -  {STRING}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Nuov{G o a} {STRING} disponibile! -  {STRING}
 
 ##id 0x9000
-STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Veicolo in mezzo
-STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Veicol{P o i} stradal{P e i}
+STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Automezzo di mezzo
+STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} automezz{P 2 o i}
 STR_9002                                                        :{WHITE}{VEHICLE}
-STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}{TOWN} Deposito Veicoli Stradali
-STR_9004_NEW_VEHICLES                                           :{BLACK}Nuovi Veicoli
-STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}Nuovi Veicoli Stradali
-STR_9007_BUILD_VEHICLE                                          :{BLACK}Costruisci Veicolo
-STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Non puoi costruire veicolo stradale...
+STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}Deposito automezzi di {TOWN}
+STR_9004_NEW_VEHICLES                                           :{BLACK}Nuovi veicoli
+STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}Nuovi automezzi
+STR_9007_BUILD_VEHICLE                                          :{BLACK}Costruisci veicolo
+STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Impossibile costruire l'automezzo...
 STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (Dettagli)
-STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Consumi: {LTBLUE}{CURRENCY}/anno
-STR_900E_MAX_SPEED                                              :{BLACK}Velocità Max: {LTBLUE}{VELOCITY}
+STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Costo d'esercizio: {LTBLUE}{CURRENCY}/anno
+STR_900E_MAX_SPEED                                              :{BLACK}Velocità max: {LTBLUE}{VELOCITY}
 STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profitto quest'anno: {LTBLUE}{CURRENCY}  (anno scorso: {CURRENCY})
 STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Affidabilità: {LTBLUE}{COMMA}%  {BLACK}Guasti dall'ultima manutenzione: {LTBLUE}{COMMA}
-STR_9011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costr. nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
-STR_9012_CAPACITY                                               :{BLACK}Capienza: {LTBLUE}{CARGO}
-STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...deve essere fermato nel deposito veicoli
-STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Non puoi vendere veicolo stradale
-STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Non puoi far fermare/avviare veicolo stradale...
-STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}Veicolo stradale {COMMA} sta aspettando nel deposito
-STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Direzione per {TOWN} Deposito Veicoli
-STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Direzione per {TOWN} Deposito Veicoli, {VELOCITY}
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Servizio a {TOWN} Deposito Veicoli
-STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Servizio a {TOWN} Deposito Veicoli, {VELOCITY}
-STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Non puoi mandare il veicolo al deposito...
-STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Non riesce a trovare il deposito locale
-STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}Veicoli stradali - clicca sul veicolo per le informazioni
-STR_901B_BUILD_NEW_ROAD_VEHICLES                                :{BLACK}Costruisci nuovi veicoli stradali (richiesto deposito veicoli stradali)
-STR_901C_CURRENT_VEHICLE_ACTION                                 :{BLACK}Azione corrente del veicolo - fai clic qui per far fermare/ripartire il veicolo
-STR_901D_SHOW_VEHICLE_S_ORDERS                                  :{BLACK}Mostra ordini del veicolo
-STR_901E_CENTER_MAIN_VIEW_ON_VEHICLE                            :{BLACK}Centra visuale sul veicolo
-STR_901F_SEND_VEHICLE_TO_DEPOT                                  :{BLACK}Manda veicolo al deposito
-STR_9020_FORCE_VEHICLE_TO_TURN_AROUND                           :{BLACK}Fai girare il veicolo
-STR_9021_SHOW_ROAD_VEHICLE_DETAILS                              :{BLACK}Mostra dettagli del veicolo
-STR_9022_VEHICLES_CLICK_ON_VEHICLE                              :{BLACK}Veicoli - fai clic sul veicolo per le informazioni
-STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Costruisci nuovo veicolo stradale
-STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Trascina veicolo stradale qui per venderlo
-STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Centra visuale sul deposito veicoli
-STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Lista veicoli - fai clic sul veicolo per le informazioni
-STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Costruisci veicolo stradale evidenziato
-STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Costo: {CURRENCY}{}Velocità: {VELOCITY}{}Consumi: {CURRENCY}/anno{}Capienza: {CARGO}
+STR_9011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costruito nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
+STR_9012_CAPACITY                                               :{BLACK}Capacità: {LTBLUE}{CARGO}
+STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...deve essere fermo nel deposito automezzi
+STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}Impossibile vendere l'automezzo...
+STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}Impossibile fermare/avviare l'automezzo...
+STR_9016_ROAD_VEHICLE_IS_WAITING                                :{WHITE}L'Automezzo {COMMA} sta aspettando nel deposito
+STR_HEADING_FOR_ROAD_DEPOT                                      :{ORANGE}Diretto al Deposito di {TOWN}
+STR_HEADING_FOR_ROAD_DEPOT_VEL                                  :{ORANGE}Diretto al Deposito di {TOWN}, {VELOCITY}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE                              :{LTBLUE}Manutenzione al Deposito di {TOWN}
+STR_HEADING_FOR_ROAD_DEPOT_SERVICE_VEL                          :{LTBLUE}Manutenzione al Deposito di {TOWN}, {VELOCITY}
+STR_9018_CAN_T_SEND_VEHICLE_TO_DEPOT                            :{WHITE}Impossibile mandare l'automezzo al deposito...
+STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Impossibile trovare il deposito più vicino
+STR_901A_ROAD_VEHICLES_CLICK_ON                                 :{BLACK}Automezzi - fare clic su un veicolo per informazioni
+STR_901B_BUILD_NEW_ROAD_VEHICLES                                :{BLACK}Costruisce nuovi automezzi (è richiesto un deposito automezzi)
+STR_901C_CURRENT_VEHICLE_ACTION                                 :{BLACK}Azione corrente del veicolo - fare clic qui per fermarlo/avviarlo
+STR_901D_SHOW_VEHICLE_S_ORDERS                                  :{BLACK}Mostra gli ordini del veicolo
+STR_901E_CENTER_MAIN_VIEW_ON_VEHICLE                            :{BLACK}Centra la visuale principale sulla posizione dell'automezzo
+STR_901F_SEND_VEHICLE_TO_DEPOT                                  :{BLACK}Manda l'automezzo al deposito e CTRL+clic per eseguire solo una manutenzione
+STR_9020_FORCE_VEHICLE_TO_TURN_AROUND                           :{BLACK}Fa fare un'inversione al veicolo
+STR_9021_SHOW_ROAD_VEHICLE_DETAILS                              :{BLACK}Mostra i dettagli sull'automezzo
+STR_9022_VEHICLES_CLICK_ON_VEHICLE                              :{BLACK}Veicoli - fare clic su un veicolo per informazioni
+STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}Costruisce un nuovo automezzo
+STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Trascinare qui un automezzo per venderlo
+STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Centra la visuale principale sulla posizione del deposito automezzi
+STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}Elenco selezione automezzi - fare clic su un veicolo per informazioni
+STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}Costruisce l'automezzo selezionato
+STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Costo: {CURRENCY}{}Velocità: {VELOCITY}{}Costo d'esercizio: {CURRENCY}/anno{}Capacità: {CARGO}
 
-STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}Nome veicolo stradale
-STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Non puoi rinominare veicolo stradale...
-STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Nome veicolo stradale
-STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Primo bus arrivato a {STATION}!
-STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano. . .{}Primo camion arrivato a {STATION}!
-STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Veicolo distrutto!{}Il conducente muore in una palla di fuoco dopo la collisione
-STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Veicolo distrutto!{}{COMMA} morti in una palla di fuoco dopo la collisione col treno
-STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Non puoi far girare il veicolo...
-STR_ONLY_TURN_SINGLE_UNIT                                       :{WHITE}Non posso invertire veicoli composti da unità multiple
+STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}Rinomina l'automezzo
+STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Impossibile rinominare l'automezzo...
+STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Rinomina l'automezzo
+STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Il primo autobus arriva a {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Il primo camion arriva a {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Il primo tram passeggeri arriva a {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Il primo tram merci arriva a {STATION}!
+STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Incidente stradale!{}Il conducente muore nell'incendio seguito alla collisione con un treno
+STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Incidente stradale!{}In {COMMA} muoiono nell'incendio seguito alla collisione con un treno
+STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Impossibile far girare il veicolo...
+STR_ONLY_TURN_SINGLE_UNIT                                       :{WHITE}Impossibile invertire i veicoli composti da più unità
 STR_9034_RENAME                                                 :{BLACK}Rinomina
-STR_9035_RENAME_ROAD_VEHICLE_TYPE                               :{BLACK}Rinomina tipo di veicolo stradale
-STR_9036_RENAME_ROAD_VEHICLE_TYPE                               :{WHITE}Rinomina tipo di veicolo stradale
-STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Non puoi rinominare tipo di veicolo stradale...
-STR_9038_GO_TO_ROADVEH_DEPOT                                    :Vai a {TOWN} Deposito Veicoli Stradali
-STR_SERVICE_AT_ROADVEH_DEPOT                                    :Manutenzione a {TOWN} Deposito Stradale
+STR_9035_RENAME_ROAD_VEHICLE_TYPE                               :{BLACK}Rinomina il tipo di automezzo
+STR_9036_RENAME_ROAD_VEHICLE_TYPE                               :{WHITE}Rinomina tipo automezzo
+STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Impossibile rinominare il tipo di automezzo...
+STR_9038_GO_TO_ROADVEH_DEPOT                                    :Vai al Deposito automezzi di {TOWN}
+STR_SERVICE_AT_ROADVEH_DEPOT                                    :Manutenzione al Deposito di {TOWN}
 
-STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Riadatta il veicolo stradale per trasportare un tipo di merce differente
-STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Riadatta il veicolo stradale
-STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Riadatta il veicolo stradale tper trasportare il tipo di merce selezionato
-STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Non posso riadattare il veicolo...
-STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Scegli il tipo di merce da caricare sul veicolo stradale
+STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Riadatta l'automezzo per trasportare un tipo di carico differente
+STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Riadatta l'automezzo
+STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Riadatta l'automezzo per trasportare il tipo di carico selezionato
+STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Impossibile riadattare l'automezzo...
+STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Selezionare il tipo di carico da far trasportare all'automezzo
 
 ##id 0x9800
 STR_9800_DOCK_CONSTRUCTION                                      :Costruzione moli
 STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Costruzione moli
-STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Non puoi costruire molo qui...
-STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} Deposito Navale
-STR_9804_NEW_SHIPS                                              :{BLACK}Nuove Navi
-STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} Nav{P e i}
-STR_9808_NEW_SHIPS                                              :{WHITE}Nuove Navi
-STR_9809_BUILD_SHIP                                             :{BLACK}Costruisci Nave
-STR_CLONE_SHIP                                                  :{BLACK}Clona Nave
-STR_CLONE_SHIP_INFO                                             :{BLACK}Costruisce una copia della nave. Premere contemporaneamente Control per condividere gli ordini
-STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Costruisce una copia di una nave. Cliccare su questo pulsante e poi sulla nave (dentro o fuori dal deposito) da copiare. Premere contemporaneamente Control per condividere gli ordini
+STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Impossibile costruire il molo qui...
+STR_9803_SHIP_DEPOT                                             :{WHITE}Deposito navale di {TOWN}
+STR_9804_NEW_SHIPS                                              :{BLACK}Nuove navi
+STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} nav{P 2 e i}
+STR_9808_NEW_SHIPS                                              :{WHITE}Nuove navi
+STR_9809_BUILD_SHIP                                             :{BLACK}Costruisci nave
+STR_CLONE_SHIP                                                  :{BLACK}Clona nave
+STR_CLONE_SHIP_INFO                                             :{BLACK}Costruisce una copia della nave. Tenere premuto CTRL per condividere gli ordini
+STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Costruisce una copia di una nave. Fare clic su questo pulsante e quindi su una nave dentro o fuori dal deposito. Tenere premuto CTRL per condividere gli ordini
 STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}La nave deve essere ferma nel deposito
-STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Non puoi vendere la nave...
-STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Non puoi costruire nave...
-STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Nave in mezzo
+STR_980C_CAN_T_SELL_SHIP                                        :{WHITE}Impossibile vendere la nave...
+STR_980D_CAN_T_BUILD_SHIP                                       :{WHITE}Impossibile costruire la nave...
+STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Nave di mezzo
 STR_980F                                                        :{WHITE}{VEHICLE}
 STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Dettagli)
-STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Consumi: {LTBLUE}{CURRENCY}/anno
-STR_9813_MAX_SPEED                                              :{BLACK}Velocità Max: {LTBLUE}{VELOCITY}
+STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Costo d'esercizio: {LTBLUE}{CURRENCY}/anno
+STR_9813_MAX_SPEED                                              :{BLACK}Velocità max: {LTBLUE}{VELOCITY}
 STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profitto quest'anno: {LTBLUE}{CURRENCY}  (anno scorso: {CURRENCY})
 STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}Affidabilità: {LTBLUE}{COMMA}%  {BLACK}Guasti dall'ultima manutenzione: {LTBLUE}{COMMA}
-STR_9816_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costr. nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
-STR_9817_CAPACITY                                               :{BLACK}Capienza: {LTBLUE}{CARGO}
-STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Non puoi far fermare/ripartire la nave...
-STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Non puoi mandare nave al deposito...
-STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Non riesce a trovare il deposito locale
-STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Direzione per {TOWN} Deposito Navale
-STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Direzione per {TOWN} Deposito Navale, {VELOCITY}
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Servizio a {TOWN} Deposito Navale
-STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Servizio a {TOWN} Deposito Navale, {VELOCITY}
-STR_981C_SHIP_IS_WAITING_IN_DEPOT                               :{WHITE}Nave {COMMA} sta aspettano nel deposito
-STR_981D_BUILD_SHIP_DOCK                                        :{BLACK}Costruisci molo
-STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING                          :{BLACK}Costruisci deposito navale (per costruzione e manutenzione)
-STR_981F_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Navi - fai clic sulla nave per le informazioni
-STR_9820_BUILD_NEW_SHIP                                         :{BLACK}Costruisci una nuova nave
-STR_9821_DRAG_SHIP_TO_HERE_TO_SELL                              :{BLACK}Trascina qui una nave per venderla
-STR_9822_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Centra la visuale sul deposito
-STR_9823_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Navi - fai clic sulla nave per le informazioni
-STR_9824_BUILD_NEW_SHIPS_REQUIRES                               :{BLACK}Costruisci nuove navi (richiede un deposito navale)
-STR_9825_SHIP_SELECTION_LIST_CLICK                              :{BLACK}Lista navi - fai clic sulla nave per le informazioni
-STR_9826_BUILD_THE_HIGHLIGHTED_SHIP                             :{BLACK}Costruisci la nave evidenziata
-STR_9827_CURRENT_SHIP_ACTION_CLICK                              :{BLACK}Azione della nave corrente - fai clic qui per farla fermare/ripartire
+STR_9816_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costruito nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
+STR_9817_CAPACITY                                               :{BLACK}Capacità: {LTBLUE}{CARGO}
+STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}Impossibile fermare/avviare la nave...
+STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}Impossibile mandare la nave al deposito...
+STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}Impossibile trovare il deposito più vicino
+STR_HEADING_FOR_SHIP_DEPOT                                      :{ORANGE}Diretto al Deposito di {TOWN}
+STR_HEADING_FOR_SHIP_DEPOT_VEL                                  :{ORANGE}Diretto al Deposito di {TOWN}, {VELOCITY}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE                              :{LTBLUE}Manutenzione al Deposito di {TOWN}
+STR_HEADING_FOR_SHIP_DEPOT_SERVICE_VEL                          :{LTBLUE}Manutenzione al Deposito di {TOWN}, {VELOCITY}
+STR_981C_SHIP_IS_WAITING_IN_DEPOT                               :{WHITE}La Nave {COMMA} sta aspettano nel deposito
+STR_981D_BUILD_SHIP_DOCK                                        :{BLACK}Costruisce un molo per le navi
+STR_981E_BUILD_SHIP_DEPOT_FOR_BUILDING                          :{BLACK}Costruisce un deposito navale (per costruire e manutenere le navi)
+STR_981F_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Navi - fare clic su una nave per informazioni
+STR_9820_BUILD_NEW_SHIP                                         :{BLACK}Costruisce una nuova nave
+STR_9821_DRAG_SHIP_TO_HERE_TO_SELL                              :{BLACK}Trascinare qui una nave per venderla
+STR_9822_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Centra la visuale principale sulla posizione del deposito navale
+STR_9823_SHIPS_CLICK_ON_SHIP_FOR                                :{BLACK}Navi - fare clic su una nave per informazioni
+STR_9824_BUILD_NEW_SHIPS_REQUIRES                               :{BLACK}Costruisce nuove navi (è richiesto un deposito navale)
+STR_9825_SHIP_SELECTION_LIST_CLICK                              :{BLACK}Elenco selezione navi - fare clic su una nave per informazioni
+STR_9826_BUILD_THE_HIGHLIGHTED_SHIP                             :{BLACK}Costruisce la nave selezionata
+STR_9827_CURRENT_SHIP_ACTION_CLICK                              :{BLACK}Azione corrente della nave - fare clic qui per fermarla/avviarla
 STR_9828_SHOW_SHIP_S_ORDERS                                     :{BLACK}Mostra gli ordini della nave
-STR_9829_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Centra la visuale sulla nave
-STR_982A_SEND_SHIP_TO_DEPOT                                     :{BLACK}Manda la nave al deposito
-STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}Mostra dettagli sulla nave
-STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Costo: {CURRENCY} Velocità Max: {VELOCITY}{}Capienza: {CARGO}{}Consumi: {CURRENCY}/anno
-STR_982F_NAME_SHIP                                              :{BLACK}Nome Nave
+STR_9829_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Centra la visuale principale sulla posizione della nave
+STR_982A_SEND_SHIP_TO_DEPOT                                     :{BLACK}Manda la nave al deposito e CTRL+clic per eseguire solo una manutenzione
+STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}Mostra i dettagli sulla nave
+STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Costo: {CURRENCY} Velocità max: {VELOCITY}{}Capacità: {CARGO}{}Costo d'esercizio: {CURRENCY}/anno
+STR_982F_NAME_SHIP                                              :{BLACK}Rinomina la nave
 
-STR_9831_NAME_SHIP                                              :{WHITE}Nome Nave
-STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}Non puoi rinominare il nome della nave...
-STR_9833_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Prima nave arrivata a {STATION}!
-STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}Posiziona boa, può essere usata come way point.
-STR_9835_CAN_T_POSITION_BUOY_HERE                               :{WHITE}Non puoi posizionare una boa qui...
+STR_9831_NAME_SHIP                                              :{WHITE}Rinomina nave
+STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}Impossibile rinominare la nave...
+STR_9833_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}La prima nave attracca a {STATION}!
+STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}Posiziona una boa che può essere usata come waypoint
+STR_9835_CAN_T_POSITION_BUOY_HERE                               :{WHITE}Impossibile posizionare una boa qui...
 STR_9836_RENAME                                                 :{BLACK}Rinomina
 STR_9837_RENAME_SHIP_TYPE                                       :{BLACK}Rinomina il tipo di nave
-STR_9838_RENAME_SHIP_TYPE                                       :{WHITE}Rinomina il tipo di nave
-STR_9839_CAN_T_RENAME_SHIP_TYPE                                 :{WHITE}Non puoi rinominare il tipo di nave...
-STR_983A_REFIT_CARGO_SHIP_TO_CARRY                              :{BLACK}Converti la nave per caricare un tipo di merce diversa
-STR_983B_REFIT                                                  :{WHITE}{VEHICLE} (Converti)
-STR_983C_REFIT_SHIP                                             :{BLACK}Converti nave
-STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Seleziona tipo di merce da caricare
-STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}Converti la nave per trasportare il tipo di merce evidenziata
-STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Seleziona il tipo di merce da caricare:
-STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuova Capienza: {GOLD}{CARGO}{}{BLACK}Costo conversione: {GOLD}{CURRENCY}
-STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Non puoi convertire la nave...
-STR_9842_REFITTABLE                                             :(convertibile)
-STR_GO_TO_SHIP_DEPOT                                            :Vai a {TOWN} Deposito Navale
-SERVICE_AT_SHIP_DEPOT                                           :Manutenzione a {TOWN} Deposito Navale
+STR_9838_RENAME_SHIP_TYPE                                       :{WHITE}Rinomina tipo di nave
+STR_9839_CAN_T_RENAME_SHIP_TYPE                                 :{WHITE}Impossibile rinominare il tipo di nave...
+STR_983A_REFIT_CARGO_SHIP_TO_CARRY                              :{BLACK}Riadatta il mercantile per permettere il trasporto di un tipo di carico differente
+STR_983B_REFIT                                                  :{WHITE}{VEHICLE} (Riadatta)
+STR_983C_REFIT_SHIP                                             :{BLACK}Riadatta nave
+STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Seleziona il tipo di carico da far trasportare alla nave
+STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}Riadatta la nave per permettere il trasporto del tipo di carico selezionato
+STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Selezionare il tipo di carico da trasportare:
+STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuova capacità: {GOLD}{CARGO}{}{BLACK}Costo riadattamento: {GOLD}{CURRENCY}
+STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Impossibile riadattare la nave...
+STR_9842_REFITTABLE                                             :(riadattabile)
+STR_GO_TO_SHIP_DEPOT                                            :Vai al Deposito navale di {TOWN}
+SERVICE_AT_SHIP_DEPOT                                           :Manutenzione al Deposito navale di {TOWN}
 
 ##id 0xA000
 STR_A000_AIRPORTS                                               :{WHITE}Aeroporti
-STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Non puoi costruire un aeroporto qui...
-STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} Hangar
-STR_A003_NEW_AIRCRAFT                                           :{BLACK}Nuovo Aereo
-STR_CLONE_AIRCRAFT                                              :{BLACK}Clona Aereo
-STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Costruisce una copia dell'aereo. Premere contemporaneamente Control per condividere gli ordini
-STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Costruisce una copia di un aereo. Cliccare su questo pulsante e poi sull'aereo (dentro o fuori dal deposito) da copiare. Premere contemporaneamente Control per condividere gli ordini
-STR_A005_NEW_AIRCRAFT                                           :{WHITE}Nuovo Aereo
-STR_A006_BUILD_AIRCRAFT                                         :{BLACK}Costruisci Aereo
-STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Non puoi costruire l'aereo
-STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} Aereo
+STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Impossibile costruire un aeroporto qui...
+STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}Hangar di {STATION}
+STR_A003_NEW_AIRCRAFT                                           :{BLACK}Nuovo aeromobile
+STR_CLONE_AIRCRAFT                                              :{BLACK}Clona aeromobile
+STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Costruisce una copia dell'aeromobile. Tenere premuto CTRL per condividere gli ordini
+STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}Costruisce una copia di un aeromobile. Fare clic su questo pusalnte e quindi su un aeromobile dentro o fuori dall'hangar. Tenere premuto CTRL per convidivere gli ordini.
+STR_A005_NEW_AIRCRAFT                                           :{WHITE}Nuovo aeromobile
+STR_A006_BUILD_AIRCRAFT                                         :{BLACK}Costruisci aeromobile
+STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Impossibile costruire l'aeromobile...
+STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} aeromobil{P 2 e i}
 STR_A00A                                                        :{WHITE}{VEHICLE}
 STR_A00B_ORDERS                                                 :{WHITE}{VEHICLE} (Ordini)
 STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (Dettagli)
-STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Consumi: {LTBLUE}{CURRENCY}/anno
-STR_A00E_MAX_SPEED                                              :{BLACK}Velocità Max: {LTBLUE}{VELOCITY}
+STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}Età: {LTBLUE}{STRING}{BLACK}   Costo d'esercizio: {LTBLUE}{CURRENCY}/anno
+STR_A00E_MAX_SPEED                                              :{BLACK}Velocità max: {LTBLUE}{VELOCITY}
 STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Profitto quest'anno: {LTBLUE}{CURRENCY}  (anno scorso: {CURRENCY})
 STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}Affidabilità: {LTBLUE}{COMMA}%  {BLACK}Guasti dall'ultima manutenzione: {LTBLUE}{COMMA}
-STR_A011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costr. nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
-STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Non puoi mandare l'aereo nell'hangar...
-STR_HEADING_FOR_HANGAR                                          :{ORANGE}Direzione per {STATION} Hangar
-STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Direzione per {STATION} Hangar, {VELOCITY}
-STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Servizio a {STATION} Hangar
-STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Servizio a {STATION} Hangar, {VELOCITY}
-STR_A014_AIRCRAFT_IS_WAITING_IN                                 :{WHITE}Aereo {COMMA} sta aspettano nell'hangar
-STR_A015_AIRCRAFT_IN_THE_WAY                                    :{WHITE}Aereo in mezzo
-STR_A016_CAN_T_STOP_START_AIRCRAFT                              :{WHITE}Non puoi far fermare/ripartire l'aereo...
-STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}Aereo in volo
-STR_A019_CAPACITY                                               :{BLACK}Capienza: {LTBLUE}{CARGO}, {CARGO}
-STR_A01A_CAPACITY                                               :{BLACK}Capienza: {LTBLUE}{CARGO}
-STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}Dev'essere fermo nell'hangar
-STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Non puoi vendere l'aereo...
-STR_A01D_AIRPORT_CONSTRUCTION                                   :Costruzioni aeroporto
-STR_A01E_BUILD_AIRPORT                                          :{BLACK}Costruisci aeroporto
-STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Aereo - fai clic sull'aereo per le informazioni
-STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Costruisci un nuovo aereo (richiesto aeroporto con hangar)
-STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Aereo - clicca sull'aereo per le informazioni
-STR_A022_BUILD_NEW_AIRCRAFT                                     :{BLACK}Costruisci un nuovo aereo
-STR_A023_DRAG_AIRCRAFT_TO_HERE_TO                               :{BLACK}Trascina qui l'aereo per venderlo
-STR_A024_CENTER_MAIN_VIEW_ON_HANGAR                             :{BLACK}Centra visuale sull'hangar
-STR_A025_AIRCRAFT_SELECTION_LIST                                :{BLACK}Lista aerei - fai clic sull'aereo per le informazioni
-STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT                         :{BLACK}Costruisci l'aereo evidenziato
-STR_A027_CURRENT_AIRCRAFT_ACTION                                :{BLACK}Azione corrente dell'aereo - fai clic qui per far fermare/ripartire l'aereo
-STR_A028_SHOW_AIRCRAFT_S_ORDERS                                 :{BLACK}Mostra ordini dell'aereo
-STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT                           :{BLACK}Centra visuale sull'aereo
-STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}Manda l'aereo all'hangar
-STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}Mostra dettagli dell'aereo
-STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Costo: {CURRENCY} Velocità Max: {VELOCITY}{}Capienza: {COMMA} passeggeri, {COMMA} sacchi postali{}Consumi: {CURRENCY}/anno
+STR_A011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Costruito nel: {LTBLUE}{NUM}{BLACK} Valore: {LTBLUE}{CURRENCY}
+STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}Impossibile mandare l'aeromobile all'hangar...
+STR_HEADING_FOR_HANGAR                                          :{ORANGE}Diretto all'Hangar di {STATION}
+STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}Diretto all'Hangar di {STATION}, {VELOCITY}
+STR_HEADING_FOR_HANGAR_SERVICE                                  :{LTBLUE}Manutenzione all'Hangar di {STATION}
+STR_HEADING_FOR_HANGAR_SERVICE_VEL                              :{LTBLUE}Manutenzione all'Hangar di {STATION}, {VELOCITY}
+STR_A014_AIRCRAFT_IS_WAITING_IN                                 :{WHITE}L'Aeromobile {COMMA} sta aspettano nell'hangar
+STR_A015_AIRCRAFT_IN_THE_WAY                                    :{WHITE}Aeromobile di mezzo
+STR_A016_CAN_T_STOP_START_AIRCRAFT                              :{WHITE}Impossibile fermare/avviare l'aeromobile...
+STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}L'aeromobile è in volo
+STR_A019_CAPACITY                                               :{BLACK}Capacità: {LTBLUE}{CARGO}, {CARGO}
+STR_A01A_CAPACITY                                               :{BLACK}Capacità: {LTBLUE}{CARGO}
+STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}L'aeromobile deve essere fermo nell'hangar
+STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Impossibile vendere l'aeromobile...
+STR_A01D_AIRPORT_CONSTRUCTION                                   :Costruzione aeroporto
+STR_A01E_BUILD_AIRPORT                                          :{BLACK}Costruisce un aeroporto
+STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Aeromobili - fare clic su un aeromobile per informazioni
+STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Costruisce un nuovo aeromobile (è richiesto un aeroporto con hangar)
+STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Aereomobili - fare clic su un aeromobile per informazioni
+STR_A022_BUILD_NEW_AIRCRAFT                                     :{BLACK}Costruisce un nuovo aeromobile
+STR_A023_DRAG_AIRCRAFT_TO_HERE_TO                               :{BLACK}Trascianre qui un aeromobile per venderlo
+STR_A024_CENTER_MAIN_VIEW_ON_HANGAR                             :{BLACK}Centra la visuale principale sulla posizione dell'hangar
+STR_A025_AIRCRAFT_SELECTION_LIST                                :{BLACK}Elenco selezione aeromobili - fare clic su un aeromobile per informazioni
+STR_A026_BUILD_THE_HIGHLIGHTED_AIRCRAFT                         :{BLACK}Costruisce l'aeromobile selezionato
+STR_A027_CURRENT_AIRCRAFT_ACTION                                :{BLACK}Azione corrente dell'aeromobile - fare clic qui per fermare/avviare l'aeromobile
+STR_A028_SHOW_AIRCRAFT_S_ORDERS                                 :{BLACK}Mostra gli ordini dell'aeromobile
+STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT                           :{BLACK}Centra la visuale principale sulla posizione dell'aeromobile
+STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}Manda l'aeromobile all'hangar e CTRL+clic esegue solo una manutenzione
+STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}Mostra i dettagli sull'aeromobile
+STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Costo: {CURRENCY} Velocità max: {VELOCITY}{}Capacità: {COMMA} passeggeri, {COMMA} sacchi postali{}Costo d'esercizio: {CURRENCY}/anno
 
-STR_A030_NAME_AIRCRAFT                                          :{WHITE}Nome aereo
-STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}Non puoi rinominare l'aereo...
-STR_A032_NAME_AIRCRAFT                                          :{BLACK}Nome aereo
-STR_A033_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Primo aereo atterrato a {STATION}!
-STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Aereo Schiantato!{}{COMMA} morti in una palla di fuoco a {STATION}
-STR_PLANE_CRASH_OUT_OF_FUEL                                     :{BLACK}{BIGFONT}Incidente aereo!{}L'aereo ha esaurito il carburante, {COMMA} morti in una palla di fuoco!
+STR_A030_NAME_AIRCRAFT                                          :{WHITE}Rinomina aeromobile
+STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}Impossibile rinominare l'aeromobile...
+STR_A032_NAME_AIRCRAFT                                          :{BLACK}Rinomina l'aeromobile
+STR_A033_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}I cittadini festeggiano . . .{}Il primo aereo atterra a {STATION}!
+STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Aeroplano precipitato!{}In {COMMA} muoiono nel fuoco a {STATION}
+STR_PLANE_CRASH_OUT_OF_FUEL                                     :{BLACK}{BIGFONT}Incidente aereo!{}L'aereo ha esaurito il carburante. In {COMMA} muoiono fra le fiamme!
 STR_A036                                                        :{TINYFONT}{BLACK}{STATION}
 STR_A037_RENAME                                                 :{BLACK}Rinomina
-STR_A038_RENAME_AIRCRAFT_TYPE                                   :{BLACK}Rinomina il tipo di aereo
-STR_A039_RENAME_AIRCRAFT_TYPE                                   :{WHITE}Rinomina il tipo di aereo
-STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE                             :{WHITE}Non puoi rinominare il tipo di aereo...
-STR_A03B_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Converti l'aereo per trasportare un tipo di merce diversa
-STR_A03C_REFIT                                                  :{WHITE}{VEHICLE} (Converti)
-STR_A03D_REFIT_AIRCRAFT                                         :{BLACK}Converti l'aereo
-STR_A03E_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Seleziona il tipo di merce da caricare
-STR_A03F_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Converti l'aereo per trasportare il tipo di merce evidenziata
-STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Seleziona il tipo di merce da caricare:
-STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuova capacità: {GOLD}{STRING}{}{BLACK}Costo conversione: {GOLD}{CURRENCY}
-STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}Non puoi convertire l'aereo...
-STR_GO_TO_AIRPORT_HANGAR                                        :Vai a {STATION} Hangar
-SERVICE_AT_AIRPORT_HANGAR                                       :Manutenzione a {STATION} Hangar
+STR_A038_RENAME_AIRCRAFT_TYPE                                   :{BLACK}Rinomina il tipo di aeromobile
+STR_A039_RENAME_AIRCRAFT_TYPE                                   :{WHITE}Rinomina tipo di aeromobile
+STR_A03A_CAN_T_RENAME_AIRCRAFT_TYPE                             :{WHITE}Impossibile rinominare il tipo di aeromobile...
+STR_A03B_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Riadatta l'aeromobile per trasportare un tipo di carico differente
+STR_A03C_REFIT                                                  :{WHITE}{VEHICLE} (Riadatta)
+STR_A03D_REFIT_AIRCRAFT                                         :{BLACK}Riadatta aeromobile
+STR_A03E_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Seleziona il tipo di carico da far trasportare all'aeromobile
+STR_A03F_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}Riadatta l'aeromobile per permettere il trasporto del tipo di carico selezionato
+STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Seleziona il tipo di carico da trasportare:
+STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Nuova capacità: {GOLD}{STRING}{}{BLACK}Costo riadattamento: {GOLD}{CURRENCY}
+STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}Impossibile riadattare l'aeromobile...
+STR_GO_TO_AIRPORT_HANGAR                                        :Vai all'Hangar di {STATION}
+SERVICE_AT_AIRPORT_HANGAR                                       :Manutenzione all'Hangar di {STATION}
 
 ##id 0xB000
 STR_B000_ZEPPELIN_DISASTER_AT                                   :{BLACK}{BIGFONT}Disastro Zeppelin a {STATION}!
-STR_B001_ROAD_VEHICLE_DESTROYED                                 :{BLACK}{BIGFONT}Veicolo distrutto in una collisione con un 'UFO'
+STR_B001_ROAD_VEHICLE_DESTROYED                                 :{BLACK}{BIGFONT}Automezzo distrutto in una collisione con un 'UFO'!
 STR_B002_OIL_REFINERY_EXPLOSION                                 :{BLACK}{BIGFONT}Esplosione in una raffineria vicino a {TOWN}!
 STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS                        :{BLACK}{BIGFONT}Fabbrica distrutta in circostanze sospette vicino a {TOWN}!
-STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}'UFO' atterra vicino a {TOWN}!
-STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Cedimento in una miniera di carbone lascia tracce di distruzione vicino a {TOWN}!
-STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}Alluvione!{}{COMMA} distrutto o disperso a seguito di una mortale alluvione!
+STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}Un 'UFO' atterra vicino a {TOWN}!
+STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Cedimento in una miniera di carbone lascia una scia di distruzione vicino a {TOWN}!
+STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}Alluvione!{}Almeno {COMMA} dispersi, presunti morti, in una imponente alluvione!
 
-STR_BRIBE_FAILED                                                :{WHITE}Il tentativo di corruzione è stato
+STR_BRIBE_FAILED                                                :{WHITE}Il tuo tentativo di corruzione è stato
 STR_BRIBE_FAILED_2                                              :{WHITE}scoperto dalla Guardia di Finanzia.
-STR_BUILD_DATE                                                  :{BLACK}Realizzato il: {LTBLUE}{DATE_LONG}
+STR_BUILD_DATE                                                  :{BLACK}Costruito il: {LTBLUE}{DATE_LONG}
 
-STR_PERFORMANCE_DETAIL                                          :{WHITE}Dettagli valutazione delle prestazioni
+STR_PERFORMANCE_DETAIL                                          :{WHITE}Valutazione dettagliata prestazioni
 STR_PERFORMANCE_DETAIL_KEY                                      :{BLACK}Dettagli
 STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY                          :{BLACK}({CURRCOMPACT}/{CURRCOMPACT})
 STR_PERFORMANCE_DETAIL_AMOUNT_INT                               :{BLACK}({COMMA}/{COMMA})
@@ -2874,84 +2940,84 @@
 ############ Those following lines need to be in this order!!
 STR_PERFORMANCE_DETAIL_VEHICLES                                 :{BLACK}Veicoli:
 STR_PERFORMANCE_DETAIL_STATIONS                                 :{BLACK}Stazioni:
-STR_PERFORMANCE_DETAIL_MIN_PROFIT                               :{BLACK}Profitto Min.:
-STR_PERFORMANCE_DETAIL_MIN_INCOME                               :{BLACK}Incasso Min.:
-STR_PERFORMANCE_DETAIL_MAX_INCOME                               :{BLACK}Incasso Max.:
-STR_PERFORMANCE_DETAIL_DELIVERED                                :{BLACK}Trasportati:
-STR_PERFORMANCE_DETAIL_CARGO                                    :{BLACK}Merce:
+STR_PERFORMANCE_DETAIL_MIN_PROFIT                               :{BLACK}Profitto min:
+STR_PERFORMANCE_DETAIL_MIN_INCOME                               :{BLACK}Incasso min:
+STR_PERFORMANCE_DETAIL_MAX_INCOME                               :{BLACK}Incasso max:
+STR_PERFORMANCE_DETAIL_DELIVERED                                :{BLACK}Consegnato:
+STR_PERFORMANCE_DETAIL_CARGO                                    :{BLACK}Merci:
 STR_PERFORMANCE_DETAIL_MONEY                                    :{BLACK}Denaro:
 STR_PERFORMANCE_DETAIL_LOAN                                     :{BLACK}Prestito:
 STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}Totale:
 ############ End of order list
-STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}Numero di veicoli. Include Veicoli Stradali, Treni, Navi e Aerei.
-STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Numero di blocchi stazione. Ogni parte di una stazione (e.g. stazione ferroviaria, fermata dell'autobus, aeroporti) viene contata, anche se insieme formano un'unica stazione.
-STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP                           :{BLACK}Profitto del veicolo con l'incasso minore (tra tutti i veicoli più vecchi di 2 anni)
-STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP                           :{BLACK}Ammontare di denaro guadagnato nel mese con il minimo profitto degli ultimi 12 quarti
-STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP                           :{BLACK}Ammontare di denaro guadagnato nel mese con il massimo profitto degli ultimi 12 quarti
-STR_PERFORMANCE_DETAIL_DELIVERED_TIP                            :{BLACK}Unità di merce trasportata nell'ultimo quarto.
-STR_PERFORMANCE_DETAIL_CARGO_TIP                                :{BLACK}Tipi di merci trasportate nell'ultimo quarto.
-STR_PERFORMANCE_DETAIL_MONEY_TIP                                :{BLACK}Ammontare di denaro in tasca
-STR_PERFORMANCE_DETAIL_LOAN_TIP                                 :{BLACK}Hai preso un prestito troppo elevato?
-STR_PERFORMANCE_DETAIL_TOTAL_TIP                                :{BLACK}Totale dei punti rispetto ad un massimo di punti possibili
+STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}Numero di veicoli; include automezzi, treni, navi e aeromobili
+STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}Numero di blocchi stazione. Sono contate tutte le parti di una stazione (es. stazione ferroviaria, stazione autobus, aeroporto), anche se connesse insieme a formare un'unica stazione
+STR_PERFORMANCE_DETAIL_MIN_PROFIT_TIP                           :{BLACK}Profitto del veicolo con l'incasso minore (fra tutti i veicoli più vecchi di 2 anni)
+STR_PERFORMANCE_DETAIL_MIN_INCOME_TIP                           :{BLACK}Ammontare di denaro guadagnato nel mese con il minimo profitto degli ultimi 12 trimestri
+STR_PERFORMANCE_DETAIL_MAX_INCOME_TIP                           :{BLACK}Ammontare di denaro guadagnato nel mese con il massimo profitto degli ultimi 12 trimestri
+STR_PERFORMANCE_DETAIL_DELIVERED_TIP                            :{BLACK}Unità di merce consegnate negli ultimi quattro trimestri
+STR_PERFORMANCE_DETAIL_CARGO_TIP                                :{BLACK}Tipi di merci consegnati nell'ultimo trimestre
+STR_PERFORMANCE_DETAIL_MONEY_TIP                                :{BLACK}Ammontare di denaro di questa compagnia in banca
+STR_PERFORMANCE_DETAIL_LOAN_TIP                                 :{BLACK}L'ammontare di denaro che questa compagnia ha preso in prestito
+STR_PERFORMANCE_DETAIL_TOTAL_TIP                                :{BLACK}Punteggio totale rispetto al massimo realizzabile
 
 STR_NEWGRF_SETTINGS_BUTTON                                      :{BLACK}Impostazioni NewGRF
-STR_NEWGRF_SETTINGS_CAPTION                                     :{WHITE}Impostazioni newgrf
+STR_NEWGRF_SETTINGS_CAPTION                                     :{WHITE}Impostazioni NewGRF
 STR_NEWGRF_APPLY_CHANGES                                        :{BLACK}Applica cambiamenti
 STR_NEWGRF_SET_PARAMETERS                                       :{BLACK}Imposta parametri
-STR_NEWGRF_TIP                                                  :{BLACK}Una lista di tutti i Newgrf che hai installato. Cliccane uno per cambiarne le impostazioni
-STR_NEWGRF_NO_FILES_INSTALLED                                   :{BLACK}Non ci sono attualmente file newgrf installati! Fare riferimento al manuale per installarne di nuovi
+STR_NEWGRF_TIP                                                  :{BLACK}Elenco di tutti i pacchetti NewGRF installati. Fare clic su uno di essi per cambiarne le impostazioni
+STR_NEWGRF_NO_FILES_INSTALLED                                   :{BLACK}Attualmente non ci sono file NewGRF installati! Fare riferimento al manuale per istruzioni sull'installazione di grafica aggiuntiva
 STR_NEWGRF_FILENAME                                             :{BLACK}Nome file: {SILVER}{STRING}
 STR_NEWGRF_GRF_ID                                               :{BLACK}GRF ID: {SILVER}{STRING}
-STR_NEWGRF_MD5SUM                                               :{BLACK}MD5sum: {SILVER}{STRING}
-STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Stai per fare cambiamenti a una partita in corso; questa cosa può crashare OpenTTD.{}Sei assolutamente sicuro di farlo?
+STR_NEWGRF_MD5SUM                                               :{BLACK}Somma MD5: {SILVER}{STRING}
+STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Si stanno per apportare cambiamenti a una partita in corso: questo potrebbe causare un crash di OpenTTD.{}Si è assolutamente sicuri?
 
 STR_NEWGRF_ERROR_MSG_INFO                                       :{SILVER}{STRING}
 STR_NEWGRF_ERROR_MSG_WARNING                                    :{RED}Attenzione: {SILVER}{STRING}
 STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}Errore: {SILVER}{STRING}
-STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}Errore Fatale: {SILVER}{STRING}
-STR_NEWGRF_ERROR_VERSION_NUMBER                                 :{STRING} può non funzionare con la versione di TTDPatch riportata da OpenTTD.
+STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}Errore fatale: {SILVER}{STRING}
+STR_NEWGRF_ERROR_VERSION_NUMBER                                 :{STRING} non funziona con la versione di TTDPatch riferita da OpenTTD.
 STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} è per la versione {STRING} di TTD.
 STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} è progettato per essere usato con {STRING}
-STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Parametri invalidi per {STRING}: parametri {STRING} ({NUM})
+STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Parametro non valido per {STRING}: parametro {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} deve essere caricato prima di {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} deve essere caricato dopo {STRING}.
-STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :il file GRF se questo era progettato per essere tradotto
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :il file GRF che era progettato per tradurre
 
 STR_NEWGRF_ADD                                                  :{BLACK}Aggiungi
-STR_NEWGRF_ADD_TIP                                              :{BLACK}Aggiungi un file NewGRF alla lista
-STR_NEWGRF_REMOVE                                               :{BLACK}Togli
-STR_NEWGRF_REMOVE_TIP                                           :{BLACK}Togli il file NewGRF selezionato dalla lista
+STR_NEWGRF_ADD_TIP                                              :{BLACK}Aggiunge un file NewGRF all'elenco
+STR_NEWGRF_REMOVE                                               :{BLACK}Rimuovi
+STR_NEWGRF_REMOVE_TIP                                           :{BLACK}Rimuove il file NewGRF selezionato dall'elenco
 STR_NEWGRF_MOVEUP                                               :{BLACK}Sposta su
-STR_NEWGRF_MOVEUP_TIP                                           :{BLACK}Sposta su il file NewGRF selezionato nella  lista
+STR_NEWGRF_MOVEUP_TIP                                           :{BLACK}Sposta su il file NewGRF selezionato nell'elenco
 STR_NEWGRF_MOVEDOWN                                             :{BLACK}Sposta giù
-STR_NEWGRF_MOVEDOWN_TIP                                         :{BLACK}Sposta giù il file NewGRF selezionato nella lista
-STR_NEWGRF_FILE_TIP                                             :{BLACK}Una lista dei file NewGRF installati. Clicca un file per cambiare i parametri
+STR_NEWGRF_MOVEDOWN_TIP                                         :{BLACK}Sposta giù il file NewGRF selezionato nell'elenco
+STR_NEWGRF_FILE_TIP                                             :{BLACK}Elenco dei file NewGRF installati. Fare clic su un file per cambiarne i parametri
 STR_NEWGRF_PARAMETER                                            :{BLACK}Parametri: {SILVER}{STRING}
-STR_NEWGRF_PARAMETER_QUERY                                      :{BLACK}Immetti i parametri NewGRF
+STR_NEWGRF_PARAMETER_QUERY                                      :{BLACK}Inserire i parametri NewGRF
 STR_NEWGRF_NO_INFO                                              :{BLACK}Informazioni non disponibili
 
 STR_NEWGRF_ADD_CAPTION                                          :{WHITE}File NewGRF disponibili
 STR_NEWGRF_ADD_FILE                                             :{BLACK}Aggiungi alla selezione
-STR_NEWGRF_ADD_FILE_TIP                                         :{BLACK}Aggiungi il file NewGRF selezionato nella vostra configurazione
+STR_NEWGRF_ADD_FILE_TIP                                         :{BLACK}Aggiunge il file NewGRF selezionato alla configurazione
 STR_NEWGRF_RESCAN_FILES                                         :{BLACK}Aggiorna file
 STR_NEWGRF_RESCAN_FILES_TIP                                     :{BLACK}Aggiorna la lista dei file NewGRF disponibili
-STR_NEWGRF_DUPLICATE_GRFID                                      :{WHITE}Non posso aggiungere un altro file: GRF ID esistente
+STR_NEWGRF_DUPLICATE_GRFID                                      :{WHITE}Impossibile aggiungere il file: GRF ID duplicato
 
-STR_NEWGRF_NOT_FOUND                                            :{RED}File simile non trovato
+STR_NEWGRF_NOT_FOUND                                            :{RED}File corrispondente non trovato
 STR_NEWGRF_DISABLED                                             :{RED}Disabilitato
-STR_NEWGRF_COMPATIBLE_LOADED                                    :{ORANGE}File corrispondente non trovato (file GRF compatibile caricato)
+STR_NEWGRF_COMPATIBLE_LOADED                                    :{ORANGE}File corrispondente non trovato (caricato file GRF compatibile)
 
-STR_NEWGRF_COMPATIBLE_LOAD_WARNING                              :{WHITE}File GRF compatibili caricati per i file mancanti
-STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}File GRF mancanti sono stati disabilitati
-STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}File GRF mancanti per poter caricare il gioco
+STR_NEWGRF_COMPATIBLE_LOAD_WARNING                              :{WHITE}File GRF compatibili caricati al posto dei file mancanti
+STR_NEWGRF_DISABLED_WARNING                                     :{WHITE}I file GRF mancanti sono stati disabilitati
+STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}Mancano file GRF necessari per caricare la partita
 
 STR_CURRENCY_WINDOW                                             :{WHITE}Valuta personalizzata
 STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}Cambio: {ORANGE}{CURRENCY} = £ {COMMA}
 STR_CURRENCY_SEPARATOR                                          :{LTBLUE}Separatore:
 STR_CURRENCY_PREFIX                                             :{LTBLUE}Prefisso:
 STR_CURRENCY_SUFFIX                                             :{LTBLUE}Suffisso:
-STR_CURRENCY_SWITCH_TO_EURO                                     :{LTBLUE}Passa agli Euro: {ORANGE}{NUM}
-STR_CURRENCY_SWITCH_TO_EURO_NEVER                               :{LTBLUE}Passa agli Euro: {ORANGE}mai
+STR_CURRENCY_SWITCH_TO_EURO                                     :{LTBLUE}Passa all'Euro: {ORANGE}{NUM}
+STR_CURRENCY_SWITCH_TO_EURO_NEVER                               :{LTBLUE}Passa all'Euro: {ORANGE}Mai
 STR_CURRENCY_PREVIEW                                            :{LTBLUE}Anteprima: {ORANGE}{CURRENCY}
 STR_CURRENCY_CHANGE_PARAMETER                                   :{BLACK}Cambia i parametri della valuta personalizzata
 
@@ -2961,87 +3027,91 @@
 STR_PLANE                                                       :{BLACK}{PLANE}
 STR_SHIP                                                        :{BLACK}{SHIP}
 
-STR_SCHEDULED_TRAINS                                            :{WHITE}{STATION} - {COMMA} Treni
-STR_SCHEDULED_ROAD_VEHICLES                                     :{WHITE}{STATION} - {COMMA} Veicoli
-STR_SCHEDULED_AIRCRAFT                                          :{WHITE}{STATION} - {COMMA} Aerei
-STR_SCHEDULED_SHIPS                                             :{WHITE}{STATION} - {COMMA} Navi
+STR_SCHEDULED_TRAINS                                            :{WHITE}{STATION} - {COMMA} tren{P 2 o i}
+STR_SCHEDULED_ROAD_VEHICLES                                     :{WHITE}{STATION} - {COMMA} automezz{P 2 o i}
+STR_SCHEDULED_AIRCRAFT                                          :{WHITE}{STATION} - {COMMA} aeromobil{P 2 e i}
+STR_SCHEDULED_SHIPS                                             :{WHITE}{STATION} - {COMMA} nav{P 2 e i}
 
-STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Mostra tutti i treni che hanno questa stazione tra gli ordini
-STR_SCHEDULED_ROAD_VEHICLES_TIP                                 :{BLACK}Mostra tutti i veicoli che hanno questa stazione tra gli ordini
-STR_SCHEDULED_AIRCRAFT_TIP                                      :{BLACK}Mostra tutti gli aerei che hanno questa stazione tra gli ordini
-STR_SCHEDULED_SHIPS_TIP                                         :{BLACK}Mostra tutte le navi che hanno questo porto tra gli ordini
+STR_SCHEDULED_TRAINS_TIP                                        :{BLACK}Mostra tutti i treni che hanno questa stazione pianificata
+STR_SCHEDULED_ROAD_VEHICLES_TIP                                 :{BLACK}Mostra tutti gli automezzi che hanno questa stazione pianificata
+STR_SCHEDULED_AIRCRAFT_TIP                                      :{BLACK}Mostra tutti gli aeromobili che hanno questa stazione pianificata
+STR_SCHEDULED_SHIPS_TIP                                         :{BLACK}Mostra tutte le navi che hanno questa stazione pianificata
 
-STR_VEH_WITH_SHARED_ORDERS_LIST                                 :{WHITE}Ordini comuni di {COMMA} Veicol{P o i}
-STR_VEH_WITH_SHARED_ORDERS_LIST_TIP                             :{BLACK}Mostra tutti i veicoli con la stessa lista ordini
+STR_VEH_WITH_SHARED_ORDERS_LIST                                 :{WHITE}Ordini condivisi da {COMMA} veicol{P o i}
+STR_VEH_WITH_SHARED_ORDERS_LIST_TIP                             :{BLACK}Mostra tutti i veicoli che condividono questa lista ordini
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Stai per vendere tutti i veicoli nel deposito. Sei sicuro?
-
-STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Vendi tutti i treni nel deposito
-STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Vendi tutti i veicoli nel deposito
-STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP                              :{BLACK}Vendi tute le navi nel deposito
-STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP                          :{BLACK}Vendi tutti gli aerei nell'hangar
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Tipo di deposito errato
 
-STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Lista tutti i treni che hanno questo deposito negli ordini
-STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Lista tutti i veicoli stradali che hanno questo deposito negli ordini
-STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Lista tutte le navi che hanno questo deposito negli ordini
-STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Lista tutti gli aerei che usano gli hangar di questo aeroporto negli ordini
+STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Vende tutti i treni nel deposito
+STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Vende tutti gli automezzi nel deposito
+STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP                              :{BLACK}Vende tute le navi nel deposito
+STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP                          :{BLACK}Vende tutti gli aeromobili nell'hangar
 
-STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Sostituisci automaticamente tutti i treni nel deposito
-STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Sostituisci automaticamente tutti i veicoli nel deposito
-STR_DEPOT_AUTOREPLACE_SHIP_TIP                                  :{BLACK}Sostituisci automaticamente tutte le navi nel deposito
-STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}Sostituisci automaticamente tutti gli aerei nell'hangar
+STR_DEPOT_VEHICLE_ORDER_LIST_TRAIN_TIP                          :{BLACK}Elenca tutti i treni che hanno questo deposito nei loro ordini
+STR_DEPOT_VEHICLE_ORDER_LIST_ROADVEH_TIP                        :{BLACK}Elenca tutti gli automezzi che hanno questo deposito nei loro ordini
+STR_DEPOT_VEHICLE_ORDER_LIST_SHIP_TIP                           :{BLACK}Elenca tutte le navi che hanno questo deposito nei loro ordini
+STR_DEPOT_VEHICLE_ORDER_LIST_AIRCRAFT_TIP                       :{BLACK}Elenca tutti gli aeromobili che hanno un hangar di questo aeroporto nei loro ordini
 
-STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} Tren{P o i}
-STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} Veicol{P o i} stradal{P e i}
-STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} Nav{P e i}
-STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} Aere{P o i}
+STR_DEPOT_AUTOREPLACE_TRAIN_TIP                                 :{BLACK}Rimpiazza automaticamente tutti i treni nel deposito
+STR_DEPOT_AUTOREPLACE_ROADVEH_TIP                               :{BLACK}Rimpiazza automaticamente gli automezzi nel deposito
+STR_DEPOT_AUTOREPLACE_SHIP_TIP                                  :{BLACK}Rimpiazza automaticamente tutte le navi nel deposito
+STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}Rimpiazza automaticamente tutti gli aeromobili nell'hangar
+
+STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA} tren{P 2 o i}
+STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA} automezz{P 2 o i}
+STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} nav{P 2 e i}
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} aeromobil{P 2 e i}
 
 STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}Rimpiazza {STRING}
-STR_REPLACE_VEHICLES_START                                      :{BLACK}Inizia Rimpiazzo Veicoli
-STR_REPLACE_VEHICLES_STOP                                       :{BLACK}Finisci Rimpiazzo Veicoli
+STR_REPLACE_VEHICLES_START                                      :{BLACK}Inizia rimpiazzamento
+STR_REPLACE_VEHICLES_STOP                                       :{BLACK}Interrompi rimpiazzamento
 STR_NOT_REPLACING                                               :{BLACK}Nessun rimpiazzo
 STR_NOT_REPLACING_VEHICLE_SELECTED                              :{BLACK}Nessun veicolo selezionato
-STR_REPLACE_HELP_LEFT_ARRAY                                     :{BLACK}Seleziona il tipo di locomotiva da rimpiazzare
-STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Seleziona quale locomotiva usare al posto di quella selezionata a sinistra
-STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Premi per fermare il rimpiazzo delle locomotive del tipo selezionato a sinistra
-STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Premi per iniziare il rimpiazzo delle locomotive del tipo selezionato a sinistra con quello selezionato a destra
-STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Seleziona il tipo di binario per la quale vuoi rimpiazzare le locomotive
-STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Mostra con quale locomotore verrà rimpiazzato il tipo selezionato a sinistra, se disponibile
-STR_REPLACE_HELP                                                :{BLACK}Permette di rimpiazzare un locomotore con uno di un altro tipo, quando i treni con quel locomotore entrano in un deposito
+STR_REPLACE_HELP_LEFT_ARRAY                                     :{BLACK}Selezionare il tipo di locomotiva da rimpiazzare
+STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Selezionare il nuovo modello di locomotiva che si desidera usare al posto di quello selezionato a sinistra
+STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Premere per interrompere il rimpiazzamento del modello di locomotiva selezionato a sinistra
+STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Premere per iniziare il rimpiazzamento del modello di locomotiva selezionato a sinistra con quello selezionato a destra
+STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Selezionare il tipo di rotaia per la quale si desidera rimpiazzare le locomotive
+STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Mostra con quale locomotiva sarà rimpiazzato il modello eventualmente selezionato a sinistra
+STR_REPLACE_HELP                                                :{BLACK}Questa funzione permette di rimpiazzare un tipo di locomotiva con un altro, quando treni che usano il vecchio tipo entrano in un deposito
 STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Rimozione vagoni: {ORANGE}{SKIP}{STRING}
-STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}La autosostituzione mantiene la lunghezza del treno togliendo vagoni (iniziando dalla testa), se la sostituzione della locomotiva lo farebbe piu lungo.
-STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Sostituzione: {ORANGE}{SKIP}{SKIP}{STRING}
-STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} FEATURE SPERIMENTALE {}Scambia tra loro le finestre di sostituizione locomotive e vagoni. {}La sostituizione del vagone avverrà solo se il nuovo vagone può essere convertito nello stesso tipo di merce del  vecchio vagone. Questo controllo viene fatto per ogni vagone sostituito.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Non puoi costruire la locomotiva
+STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Fa sì che il rimpiazzamento automatico mantenga costante la lunghezza dei treni rimuovendo vagoni (iniziando dalla testa) nel caso in cui la sostituzione della locomotiva rendesse il treno più lungo
+STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Rimpiazza: {ORANGE}{SKIP}{SKIP}{STRING}
+STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} FUNZIONALITÀ SPERIMENTALE {}Scambia tra loro le finestre di rimpiazzamento delle locomotive e dei vagoni. {}Il rimpiazzamento del vagone avverrà solo se il nuovo vagone può essere riadattato per il trasporto dello stesso tipo di carico di quello vecchio. Questo controllo viene eseguito per ogni vagone al momento della sostituzione.
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Il veicolo non è disponibile
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}L'automezzo non è disponibile
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}La nave non è disponibile
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}L'aeromobile non è disponibile
 
 STR_ENGINES                                                     :Locomotive
 STR_WAGONS                                                      :Vagoni
 
-STR_MASS_STOP_DEPOT_TRAIN_TIP                                   :{BLACK}Clicca per fermare tutti i treni dentro il deposito
-STR_MASS_STOP_DEPOT_ROADVEH_TIP                                 :{BLACK}Clicca per fermare tutti i veicoli stradali dentro il deposito
-STR_MASS_STOP_DEPOT_SHIP_TIP                                    :{BLACK}Clicca per fermare tutte le navi dentro il deposito
-STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Clicca per fermare tutti gli aerei dentro l'hangar
+STR_MASS_STOP_DEPOT_TRAIN_TIP                                   :{BLACK}Fare clic per fermare tutti i treni nel deposito
+STR_MASS_STOP_DEPOT_ROADVEH_TIP                                 :{BLACK}Fare clic per fermare tutti gli automezzi nel deposito
+STR_MASS_STOP_DEPOT_SHIP_TIP                                    :{BLACK}Fare clic per fermare tutte le navi nel deposito
+STR_MASS_STOP_HANGAR_TIP                                        :{BLACK}Fare clic per fermare tutti gli aeromobili nell'hangar
 
-STR_MASS_START_DEPOT_TRAIN_TIP                                  :{BLACK}Clicca per avviare tutti i treni dentro il deposito
-STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Clicca per avviare tutti i veicoli stradali dentro il deposito
-STR_MASS_START_DEPOT_SHIP_TIP                                   :{BLACK}Clicca per avviare tutte le navi dentro il deposito
-STR_MASS_START_HANGAR_TIP                                       :{BLACK}Clicca per avviare tutti gli aerei dentro l'hangar
+STR_MASS_START_DEPOT_TRAIN_TIP                                  :{BLACK}Fare clic per avviare tutti i treni nel deposito
+STR_MASS_START_DEPOT_ROADVEH_TIP                                :{BLACK}Fare clic per avviare tutti gli automezzi nel deposito
+STR_MASS_START_DEPOT_SHIP_TIP                                   :{BLACK}Fare clic per avviare tutte le navi nel deposito
+STR_MASS_START_HANGAR_TIP                                       :{BLACK}Fare clic per avviare tutti gli aeromobili nell'hangar
 
-STR_MASS_STOP_LIST_TIP                                          :{BLACK}Clicca per fermare tutti i veicoli nella lista
-STR_MASS_START_LIST_TIP                                         :{BLACK}Clicca per far partire i veicoli nella lista
+STR_MASS_STOP_LIST_TIP                                          :{BLACK}Fare clic per fermare tutti i veicoli nell'elenco
+STR_MASS_START_LIST_TIP                                         :{BLACK}Fare clic per avviare tutti i veicoli nell'elenco
 
 STR_SHORT_DATE                                                  :{WHITE}{DATE_TINY}
-STR_SIGN_LIST_CAPTION                                           :{WHITE}Lista dei Cartelli - {COMMA} Cartell{P o i}
+STR_SIGN_LIST_CAPTION                                           :{WHITE}Elenco cartelli - {COMMA} cartell{P o i}
 
-STR_ORDER_REFIT_FAILED                                          :{WHITE}Ordine fermato  per modifica fallita {STRING} {COMMA}
+STR_ORDER_REFIT_FAILED                                          :{WHITE}{STRING} {COMMA} fermato causa riadattamento fallito
 
 ############ Lists rail types
 
-STR_RAIL_VEHICLES                                               :Veicoli Ferroviari
-STR_ELRAIL_VEHICLES                                             :Veicoli Ferrovie Elettrificate
-STR_MONORAIL_VEHICLES                                           :Veicoli Monorotaia
-STR_MAGLEV_VEHICLES                                             :Veicoli Maglev
+STR_RAIL_VEHICLES                                               :Veicoli ferroviari
+STR_ELRAIL_VEHICLES                                             :Veicoli ferroviari elettrici
+STR_MONORAIL_VEHICLES                                           :Veicoli monorotaia
+STR_MAGLEV_VEHICLES                                             :Veicoli maglev
 
 ############ End of list of rail types
 
@@ -3050,71 +3120,73 @@
 STR_PURCHASE_INFO_COST_WEIGHT                                   :{BLACK}Costo: {GOLD}{CURRENCY}{BLACK} Peso: {GOLD}{WEIGHT_S}
 STR_PURCHASE_INFO_SPEED_POWER                                   :{BLACK}Velocità: {GOLD}{VELOCITY}{BLACK}   Potenza: {GOLD}{POWER}
 STR_PURCHASE_INFO_SPEED                                         :{BLACK}Velocità: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}Costi d'esercizio: {GOLD}{CURRENCY}/anno
-STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}Capienza: {GOLD}{CARGO} {STRING}
+STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}Costo d'esercizio: {GOLD}{CURRENCY}/anno
+STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}Capacità: {GOLD}{CARGO} {STRING}
 STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}Progettato nel: {GOLD}{NUM}{BLACK} Vita: {GOLD}{COMMA} anni
-STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}Max. Affidabilità: {GOLD}{COMMA}%
+STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}Affidabilità massima: {GOLD}{COMMA}%
 STR_PURCHASE_INFO_COST                                          :{BLACK}Costo: {GOLD}{CURRENCY}
 STR_PURCHASE_INFO_WEIGHT_CWEIGHT                                :{BLACK}Peso: {GOLD}{WEIGHT_S}  ({WEIGHT_S})
 STR_PURCHASE_INFO_COST_SPEED                                    :{BLACK}Costo: {GOLD}{CURRENCY}{BLACK} Velocità: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}Capienza: {GOLD}{COMMA} passeggeri, {COMMA} sacchi postali
-STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK}Potenza Vagone: {GOLD}+{POWER}{BLACK} Peso: {GOLD}+{WEIGHT_S}
-STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}Modificabile a: {GOLD}
-STR_PURCHASE_INFO_ALL_TYPES                                     :Tutti i tipi di merci
-STR_PURCHASE_INFO_ALL_BUT                                       :Tutti meno {GOLD}
-STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}Sforzo Trazione Max: {GOLD}{FORCE}
+STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}Capacità: {GOLD}{COMMA} passeggeri, {COMMA} sacchi postali
+STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK}Vagoni alimentati: {GOLD}+{POWER}{BLACK} Peso: {GOLD}+{WEIGHT_S}
+STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}Riadattabile per: {GOLD}
+STR_PURCHASE_INFO_ALL_TYPES                                     :Tutti i tipi di carico
+STR_PURCHASE_INFO_ALL_BUT                                       :Tutto tranne {GOLD}
+STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}Trazione massima: {GOLD}{FORCE}
 
 ########### String for New Landscape Generator
 
 STR_GENERATE                                                    :{WHITE}Genera
-STR_RANDOM                                                      :{BLACK}Randomizza
-STR_RANDOM_HELP                                                 :{BLACK}Cambia il seme casuale usato per la generazione del terreno.
+STR_RANDOM                                                      :{BLACK}Scegli a caso
+STR_RANDOM_HELP                                                 :{BLACK}Cambia il seme casuale usato per la generazione del terreno
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Generazione mondo
-STR_RANDOM_SEED                                                 :{BLACK}Seme Casuale:
-STR_RANDOM_SEED_HELP                                            :{BLACK}Clicca per inserire un seme casuale
-STR_LAND_GENERATOR                                              :{BLACK}Generatore terreno:
+STR_RANDOM_SEED                                                 :{BLACK}Seme casuale:
+STR_RANDOM_SEED_HELP                                            :{BLACK}Fare clic per introdurre un seme casuale
+STR_LAND_GENERATOR                                              :{BLACK}Generatore:
 STR_TREE_PLACER                                                 :{BLACK}Algoritmo alberi:
-STR_HEIGHTMAP_ROTATION                                          :{BLACK}Rotazione Heightmap:
-STR_TERRAIN_TYPE                                                :{BLACK}Tipo terreno:
-STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}Livello mare:
+STR_HEIGHTMAP_ROTATION                                          :{BLACK}Rotazione heightmap:
+STR_TERRAIN_TYPE                                                :{BLACK}Tipo di terreno:
+STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}Livello del mare:
 STR_SMOOTHNESS                                                  :{BLACK}Levigatezza:
-STR_SNOW_LINE_HEIGHT                                            :{BLACK}Altezza nevi perenni:
+STR_SNOW_LINE_HEIGHT                                            :{BLACK}Altezza nevi:
 STR_DATE                                                        :{BLACK}Data:
-STR_NUMBER_OF_TOWNS                                             :{BLACK}Num. di città:
-STR_NUMBER_OF_INDUSTRIES                                        :{BLACK}Num. di industrie:
+STR_NUMBER_OF_TOWNS                                             :{BLACK}Numero città:
+STR_NUMBER_OF_INDUSTRIES                                        :{BLACK}Numero industrie:
 STR_GENERATE_DATE                                               :{BLACK}{DATE_LONG}
-STR_SNOW_LINE_UP                                                :{BLACK}Sposta su di uno l'altezza delle nevi perenni
-STR_SNOW_LINE_DOWN                                              :{BLACK}Sposta giù di uno l'altezza delle nevi perenni
+STR_SNOW_LINE_UP                                                :{BLACK}Sposta in su di uno l'altezza delle nevi perenni
+STR_SNOW_LINE_DOWN                                              :{BLACK}Sposta in giù di uno l'altezza delle nevi perenni
 STR_SNOW_LINE_QUERY_CAPT                                        :{WHITE}Cambia l'altezza delle nevi perenni
-STR_START_DATE_QUERY_CAPT                                       :{WHITE}Cambia l'anno di partenza
+STR_START_DATE_QUERY_CAPT                                       :{WHITE}Cambia l'anno di inizio
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Avviso scala
-STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Ridimensionare di molto la mappa sorgente non è consigliabile. Continuo con la generazione?
+STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Ridimensionare di molto l'heightmap sorgente non è consigliabile. Continuare con la generazione?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Avviso sulla disposizione delle strade
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}L'opzione "Nessuna nuova strada" non è raccomandata. Proseguire con la generazione?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
-STR_HEIGHTMAP_NAME                                              :{BLACK}Nome Heightmap:
+STR_HEIGHTMAP_NAME                                              :{BLACK}Nome heightmap:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Dim.: {ORANGE}{NUM} x {NUM}
-STR_GENERATION_WORLD                                            :{WHITE}Generazione del mondo..
-STR_GENERATION_ABORT                                            :{BLACK}Abortisci
-STR_GENERATION_ABORT_CAPTION                                    :{WHITE}Abortisci Generazione Mondo
-STR_GENERATION_ABORT_MESSAGE                                    :{YELLOW}Vuoi veramente abortire la generazione?
-STR_PROGRESS                                                    :{WHITE}{NUM}% completo
+STR_GENERATION_WORLD                                            :{WHITE}Generazione del mondo...
+STR_GENERATION_ABORT                                            :{BLACK}Interrompi
+STR_GENERATION_ABORT_CAPTION                                    :{WHITE}Interromi generazione mondo
+STR_GENERATION_ABORT_MESSAGE                                    :{YELLOW}Si è sicuri di voler interrompere la generazione?
+STR_PROGRESS                                                    :{WHITE}{NUM}% completato
 STR_GENERATION_PROGRESS                                         :{BLACK}{NUM} / {NUM}
 STR_WORLD_GENERATION                                            :{BLACK}Generazione mondo
 STR_TREE_GENERATION                                             :{BLACK}Generazione alberi
-STR_UNMOVABLE_GENERATION                                        :{BLACK}Generazione oggetti non spostabili
-STR_CLEARING_TILES                                              :{BLACK}Generazione aree brulle e rocciose
-STR_SETTINGUP_GAME                                              :{BLACK}Settaggio del gioco
-STR_PREPARING_TILELOOP                                          :{BLACK}Loop generazione tile del terreno
-STR_PREPARING_GAME                                              :{BLACK}Preparazione del gioco
-STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Questa azione cambia il livello di difficolta a custom
-STR_SE_FLAT_WORLD                                               :{WHITE}Terreno piatto
-STR_SE_FLAT_WORLD_TIP                                           :{BLACK}Genera un terreno piatto
-STR_SE_RANDOM_LAND                                              :{WHITE}Terreno casuale
+STR_UNMOVABLE_GENERATION                                        :{BLACK}Generazione oggetti inamovibili
+STR_CLEARING_TILES                                              :{BLACK}Generazione di aree brulle e rocciose
+STR_SETTINGUP_GAME                                              :{BLACK}Impostazione partita
+STR_PREPARING_TILELOOP                                          :{BLACK}Ciclo generazione riquadri del terreno
+STR_PREPARING_GAME                                              :{BLACK}Preparazione della partita
+STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Questa azione ha cambiato il livello di difficolta in 'Personalizzata'
+STR_SE_FLAT_WORLD                                               :{WHITE}Pianeggiante
+STR_SE_FLAT_WORLD_TIP                                           :{BLACK}Genera un terreno pianeggiante
+STR_SE_RANDOM_LAND                                              :{WHITE}Casuale
 STR_SE_NEW_WORLD                                                :{BLACK}Crea nuovo scenario
-STR_SE_CAPTION                                                  :{WHITE}Tipo Scenario
-STR_FLAT_WORLD_HEIGHT_DOWN                                      :{BLACK}Sposta giù di uno l'altezza del terreno
-STR_FLAT_WORLD_HEIGHT_UP                                        :{BLACK}Sposta su di uno l'altezza del terreno
-STR_FLAT_WORLD_HEIGHT_QUERY_CAPT                                :{WHITE}Cambia l'altezza del terreno
-STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Altezza del terreno:
+STR_SE_CAPTION                                                  :{WHITE}Tipo di scenario
+STR_FLAT_WORLD_HEIGHT_DOWN                                      :{BLACK}Sposta in giù di uno l'altezza del terreno pianeggiante
+STR_FLAT_WORLD_HEIGHT_UP                                        :{BLACK}Sposta in su di uno l'altezza del terreno pianeggiante
+STR_FLAT_WORLD_HEIGHT_QUERY_CAPT                                :{WHITE}Cambia l'altezza del terreno pianeggiante
+STR_FLAT_WORLD_HEIGHT                                           :{BLACK}Altezza terreno pianeggiante:
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}Centra la minimappa sulla posizione corrente
@@ -3132,7 +3204,7 @@
 
 STR_SMALL_AIRPORTS                                              :{BLACK}Aeroporti piccoli
 STR_LARGE_AIRPORTS                                              :{BLACK}Aeroporti grandi
-STR_HUB_AIRPORTS                                                :{BLACK}Aeroporti Hub
+STR_HUB_AIRPORTS                                                :{BLACK}Hub aeroportuali
 STR_HELIPORTS                                                   :{BLACK}Eliporti
 
 ############ Tooltip measurment
@@ -3149,4 +3221,53 @@
 
 ########
 
-STR_FEEDER_CARGO_VALUE                                          :{BLACK}Crediti Trasferiti: {LTBLUE}{CURRENCY}
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Crediti di trasferimento: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...questa è una strada di proprietà della città
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...strada rivolta nella direzione sbagliata
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opzioni trasparenza
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Attiva/disattiva la trasparenza dei nomi delle stazioni
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Attiva/disattiva la trasparenza degli alberi
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Attiva/disattiva la trasparenza degli edifici
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Attiva/disattiva la trasparenza delle industrie
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Attiva/disattiva la trasparenza delle strutture edificabili come stazioni, depositi, waypoint e catenarie
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Attiva/disattiva la trasparenza dei ponti
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Attiva/disattiva la trasparenza di strutture come fari, antenne e altri futuri oggetti decorativi
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Gruppo {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Tutti i treni
+STR_GROUP_ALL_ROADS                                             :Tutti gli automezzi
+STR_GROUP_ALL_SHIPS                                             :Tutte le navi
+STR_GROUP_ALL_AIRCRAFTS                                         :Tutti gli aeromobili
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Aggiungi veicoli condivisi
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Rimuovi tutti i veicoli
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} tren{P o i}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} automezz{P o i}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} nav{P e i}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} aeromobil{P e i}
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Rinomina un gruppo
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Rimpiazza i veicoli del {GROUP}
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Impossibile creare il gruppo...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Impossibile eliminare il gruppo...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Impossibile rinominare il gruppo...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Impossibile rimuovere tutti i veicoli del gruppo...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Impossibile aggiungere il veicolo al gruppo...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Impossibile aggiungere veicoli condivisi al gruppo...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Gruppi - Fare clic su un gruppo per elencare tutti i suoi veicoli
+STR_GROUP_CREATE_TIP                                            :{BLACK}Fare clic per creare un gruppo
+STR_GROUP_DELETE_TIP                                            :{BLACK}Elimina il gruppo selezionato
+STR_GROUP_RENAME_TIP                                            :{BLACK}Rinomina il gruppo selezionato
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Fare clic per proteggere questo gruppo dal rimpiazzo automatico
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Profitto quest'anno: {GREEN}{CURRENCY} {BLACK}(anno scorso: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Profitto quest'anno: {RED}{CURRENCY} {BLACK}(anno scorso: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Profitto quest'anno: {GREEN}{CURRENCY} {BLACK}(anno scorso: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Profitto quest'anno: {RED}{CURRENCY} {BLACK}(anno scorso: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/japanese.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/japanese.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode ja_JP
 ##plural 1
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}地図ã®ç«¯ã‚’越ãˆã¦ã„ã¾ã™
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}æ‘
 STR_02A2_MEDIUM                                                 :{BLACK}町
 STR_02A3_LARGE                                                  :{BLACK}市
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}市町æ‘
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}町ã®ã‚µã‚¤ã‚ºã‚’é¸æŠžã—ã¾ã™
 STR_02A5_TOWN_SIZE                                              :{YELLOW}町ã®ã‚µã‚¤ã‚ºï¼š
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :世界ã®åœ°å›³
 STR_EXTRA_VIEW_PORT                                             :特別ビューア
 STR_SIGN_LIST                                                   :標示ã®ãƒªã‚¹ãƒˆ
+STR_TRANSPARENCY_OPTIONS                                        :åŠé€æ˜Žè¨­å®š
 STR_02DF_TOWN_DIRECTORY                                         :市町æ‘ã®ãƒªã‚¹ãƒˆ
 STR_TOWN_POPULATION                                             :{BLACK}世界人å£ï¼š{COMMA}人
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}ビューア {COMMA}
@@ -1044,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}新型グローãƒãƒ«ãƒ‘スファインダー(NPF):{ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}é‡ã„列車ã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ãŸã‚ã®é‡é‡ä¹—æ•°ã®è¨­å®šï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}町有é“路上ã«é€šéŽç‚¹ã®å»ºè¨­ã‚’許容:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}隣接ã—ãŸé§…ã®å»ºè¨­ã‚’許容:{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}常ã«å°åž‹ç©ºæ¸¯ã®å»ºè¨­ã‚’許容:{ORANGE}{STRING}
 
@@ -1095,6 +1100,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :地図をスクロール
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :切
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}地図ã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«é€Ÿåº¦ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}æ–°è¦ã‚²ãƒ¼ãƒ ã‚’開始ã—ãŸã¨ãã«è‡ªå‹•çš„ã«ãƒãƒ¼ã‚ºï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}詳細ã®è»Šä¸¡ãƒªã‚¹ãƒˆã‚’使用:{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}一人ã®ãƒ—レヤーã®åˆ—車数上é™ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}一人ã®ãƒ—レヤーã®é“路車両数上é™ï¼š{ORANGE}{STRING}
@@ -1128,12 +1135,30 @@
 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_TOWN_LAYOUT_INVALID                          :{WHITE}シナリオエディタを使用時ã«ã€ã€Œé“路網を拡大ã›ãšã€ã¨ã„ã†é“路網ãŒé¸æŠžã§ãã¾ã›ã‚“
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}é“路網ã®é¸æŠžï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :é“路網を拡大ã›ãš
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :デフォルト
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :改善ã®é“路網
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :æ ¼å­çŠ¶ï¼ˆ2x2)
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :æ ¼å­çŠ¶ï¼ˆ3x3)
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}主ã®ãƒ„ールãƒãƒ¼ã®ä½ç½®ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :å·¦
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :中ä½
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :å³
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}ウィンドウスナップ範囲:{ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}ウィンドウスナップ範囲:{ORANGE}切
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}市町æ‘ã®å±•é–‹ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :ãªã—
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :é…ã„
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :普通
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :æ—©ã„
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :特ã«æ—©ã„
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}市ã«å±•é–‹ã™ã‚‹ç”ºã®å‰²åˆï¼š{ORANGE}{STRING}ã®ï¼‘
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}市ã«å±•é–‹ã™ã‚‹ç”ºã®å‰²åˆï¼š{ORANGE}ãªã—
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}åˆæœŸã®å¸‚町æ‘ã®ã‚µã‚¤ã‚ºã®ä¹—数:{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}インターフェース
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}建設
@@ -1564,6 +1589,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :å‰ä½ä¿¡å·ã®ã‚ã‚‹ç·šè·¯
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :後ä½ä¿¡å·ã®ã‚ã‚‹ç·šè·¯
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :çµ±åˆä¿¡å·ã®ã‚ã‚‹ç·šè·¯
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}å…ˆã«é§…を破壊ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
 
 
 
@@ -1583,10 +1609,15 @@
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}(ãƒã‚¹ã€ãƒˆãƒ©ãƒƒã‚¯ã®å»ºè¨­ã€æ•´å‚™ã®ãŸã‚ã®ï¼‰è»Šåº«ã‚’建設ã—ã¾ã™
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}ãƒã‚¹åœã‚’建設ã—ã¾ã™
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}è·å½¹æ‰€ã‚’建設ã—ã¾ã™
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}乗客用路é¢é›»è»Šé§…を建設
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}貨物用路é¢é›»è»Šé§…を建設
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}é“è·¯ã®ç«¯ã‚’建設ã—ã¾ã™
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}è·¯é¢é›»è»Šç”¨æ©‹ã‚’建設
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}é“è·¯ã®ãƒˆãƒ³ãƒãƒ«ã‚’建設ã—ã¾ã™
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}è·¯é¢é›»è»Šç”¨ãƒˆãƒ³ãƒãƒ«ã‚’建設
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}é“è·¯ã®å»ºè¨­ï¼ç ´å£Šã‚’切り替ãˆã¾ã™
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}車庫ã®é…ç½®ã®é¸æŠž
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}è·¯é¢é›»è»Šåº«ã®é…置をé¸æŠž
 STR_1814_ROAD                                                   :é“è·¯
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :街路照明ã®ã‚ã‚‹é“è·¯
 STR_1816_TREE_LINED_ROAD                                        :並木é“
@@ -1594,6 +1625,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :è¸åˆ‡
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}ãƒã‚¹åœãŒç ´å£Šã§ãã¾ã›ã‚“...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}è·å½¹æ‰€ãŒç ´å£Šã§ãã¾ã›ã‚“...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}乗客用路é¢é›»è»Šé§…ãŒç ´å£Šã§ãã¾ã›ã‚“...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}貨物用路é¢é›»è»Šé§…ãŒç ´å£Šã§ãã¾ã›ã‚“...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}市町æ‘
@@ -1758,8 +1791,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION}ã¯ä»Šå¾Œ{STRING}ã¨{STRING}ãŒå—入れã¾ã™
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}ãƒã‚¹åœã®é…ç½®
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}è·å½¹æ‰€ã®é…ç½®
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}乗客用路é¢é›»è»Šé§…ã®é…ç½®
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}貨物用路é¢é›»è»Šé§…ã®é…ç½®
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}å…ˆã«ãƒã‚¹åœã‚’破壊ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}å…ˆã«ãƒã‚¹åœã‚’破壊ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}å…ˆã«ä¹—客用路é¢é›»è»Šé§…を破壊ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}å…ˆã«è²¨ç‰©ç”¨è·¯é¢é›»è»Šé§…を破壊ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA}è»’ã®é§…
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- ãªã— -
@@ -1771,6 +1808,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}駅ã®ãƒ›ãƒ¼ãƒ ã®é•·ã•ã‚’é¸æŠžã—ã¾ã™
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}ãƒã‚¹åœã®é…置をé¸æŠžã—ã¾ã™
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}è·å½¹æ‰€ã®é…置をé¸æŠžã—ã¾ã™
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}乗客用路é¢é›»è»Šé§…ã®é…置をé¸æŠž
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}貨物用路é¢é›»è»Šé§…ã®é…置をé¸æŠž
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}主ã®ç”»é¢ã‚’駅ã®å ´æ‰€ã«ç§»å‹•ã—ã¾ã™
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}駅ã®è©•ä¾¡ã‚’表示ã—ã¾ã™
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}駅åを変更ã—ã¾ã™
@@ -1991,6 +2030,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING}ヘリãƒãƒ¼ãƒˆ
 STR_SV_STNAME_FOREST                                            :{STRING}森林
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2067,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :ãªã—
+STR_NUM_VERY_LOW                                                :特ã«ä½Žã„
 STR_6816_LOW                                                    :低ã„
 STR_6817_NORMAL                                                 :通常
 STR_6818_HIGH                                                   :高ã„
@@ -2128,8 +2170,8 @@
 STR_7039_VEHICLES                                               :{GOLD}車両数:
 STR_TRAINS                                                      :{WHITE}列車{COMMA}本
 STR_ROAD_VEHICLES                                               :{WHITE}é“路車両{COMMA}両
-STR_AIRCRAFT                                                    :{WHITE}{COMMA}å°ã®é£›è¡Œæ©Ÿ
-STR_SHIPS                                                       :{WHITE}{COMMA}éš»ã®èˆ¹èˆ¶
+STR_AIRCRAFT                                                    :{WHITE}飛行機{COMMA}å°
+STR_SHIPS                                                       :{WHITE}船舶{COMMA}隻
 STR_7042_NONE                                                   :{WHITE}ãªã—
 STR_7043_FACE_SELECTION                                         :{WHITE}é¡”ã®é¸æŠž
 STR_7044_MALE                                                   :{BLACK}男性
@@ -2218,6 +2260,8 @@
 STR_LIVERY_HELICOPTER                                           :ヘリコプター
 STR_LIVERY_SMALL_PLANE                                          :å°åž‹é£›è¡Œæ©Ÿ
 STR_LIVERY_LARGE_PLANE                                          :大型飛行機
+STR_LIVERY_PASSENGER_TRAM                                       :乗客用路é¢é›»è»Š
+STR_LIVERY_FREIGHT_TRAM                                         :貨物用路é¢é›»è»Š
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}一般ã®ã‚«ãƒ©ãƒ¼ã‚¹ã‚­ãƒ¼ãƒ ã‚’表示ã—ã¾ã™
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}列車ã®ã‚«ãƒ©ãƒ¼ã‚¹ã‚­ãƒ¼ãƒ ã‚’表示ã—ã¾ã™
@@ -2691,6 +2735,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}é“路車両をå付ã‘ã‚‹
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}町民ã®ç¥è³€ï¼{}åˆãƒã‚¹ãŒ{STATION}ãƒã‚¹åœã«åˆ°ç€ï¼
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}町民ã®ç¥è³€ï¼{}åˆãƒˆãƒ©ãƒƒã‚¯ãŒ{STATION}è·å½¹æ‰€ã«åˆ°ç€ï¼
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}町民ã®ç¥è³€{}åˆä¹—客用路é¢é›»è»ŠãŒ{STATION}駅ã«åˆ°ç€ï¼
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}町民ã®ç¥è³€{}åˆè²¨ç‰©ç”¨è·¯é¢é›»è»ŠãŒ{STATION}駅ã«åˆ°ç€ï¼
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}交通事故ï¼{}列車ã«è¡çªã€é‹è»¢è€…ãŒæ­»äº¡
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}交通事故ï¼{}列車ã«è¡çªã€{COMMA}人ãŒæ­»äº¡
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}車両ãŒé€†è»¢ã•ã›ã‚‰ã‚Œã¾ã›ã‚“...
@@ -2714,7 +2760,7 @@
 STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}ã“ã“ã«åŸ é ­ãŒå»ºè¨­ã§ãã¾ã›ã‚“...
 STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN}造船所
 STR_9804_NEW_SHIPS                                              :{BLACK}æ–°è¦èˆ¹èˆ¶
-STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA}éš»ã®èˆ¹èˆ¶
+STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - 船舶{COMMA}隻
 STR_9808_NEW_SHIPS                                              :{WHITE}æ–°è¦èˆ¹èˆ¶
 STR_9809_BUILD_SHIP                                             :{BLACK}船舶を購入
 STR_CLONE_SHIP                                                  :{BLACK}船舶をクローン
@@ -2790,7 +2836,7 @@
 STR_A005_NEW_AIRCRAFT                                           :{WHITE}æ–°è¦é£›è¡Œæ©Ÿ
 STR_A006_BUILD_AIRCRAFT                                         :{BLACK}飛行機を購入
 STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}飛行機ãŒè³¼å…¥ã§ãã¾ã›ã‚“...
-STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA}å°ã®é£›è¡Œæ©Ÿ
+STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - 飛行機{COMMA}å°
 STR_A00A                                                        :{WHITE}{VEHICLE}
 STR_A00B_ORDERS                                                 :{WHITE}{VEHICLE}(指令)
 STR_A00C_DETAILS                                                :{WHITE}{VEHICLE}(詳細)
@@ -2914,6 +2960,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :{STRING}ã®ãƒ‘ラメータãŒä¸æ­£ï¼šãƒ‘ラメータ {STRING}({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{1:STRING}を読ã¿è¾¼ã‚€å‰ã€{0:STRING}を読ã¿è¾¼ã¾ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING}ã¯{STRING}ã®èª­ã¿è¾¼ã¿å¾Œã®ã¿ã«èª­ã¿è¾¼ã‚ã¾ã™ã€‚
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :訳ã—ã«ãƒ‡ã‚¶ã‚¤ãƒ³ã•ã‚ŒãŸGRFファイル
 
 STR_NEWGRF_ADD                                                  :{BLACK}追加
 STR_NEWGRF_ADD_TIP                                              :{BLACK}NewGRFファイルをリストã«è¿½åŠ ã—ã¾ã™
@@ -2974,6 +3021,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}車庫ï¼æ ¼ç´åº«ï¼é€ èˆ¹æ‰€å†…ã®ã™ã¹ã¦ã®è»Šä¸¡ã‚’販売ã—ã¾ã™ã€‚続ã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :電車庫ã®ç¨®é¡žãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}電車庫内ã®ã™ã¹ã¦ã®åˆ—車を販売ã—ã¾ã™
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}車庫内ã®ã™ã¹ã¦ã®é“路車両を販売ã—ã¾ã™
@@ -2990,10 +3038,10 @@
 STR_DEPOT_AUTOREPLACE_SHIP_TIP                                  :{BLACK}造船所内ã®ã™ã¹ã¦ã®èˆ¹èˆ¶ã‚’自動的ã«äº¤æ›ã—ã¾ã™
 STR_DEPOT_AUTOREPLACE_AIRCRAFT_TIP                              :{BLACK}æ ¼ç´åº«å†…ã®ã™ã¹ã¦ã®é£›è¡Œæ©Ÿã‚’自動的ã«äº¤æ›ã—ã¾ã™
 
-STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - {COMMA}本ã®åˆ—車
-STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - {COMMA}両ã®é“路車両
-STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA}éš»ã®èˆ¹èˆ¶
-STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA}å°ã®é£›è¡Œæ©Ÿ
+STR_VEHICLE_LIST_TRAIN_DEPOT                                    :{BLACK}{STRING} - 列車{COMMA}本
+STR_VEHICLE_LIST_ROADVEH_DEPOT                                  :{BLACK}{STRING} - é“路車両{COMMA}両
+STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - 船舶{COMMA}隻
+STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - 飛行機{COMMA}å°
 
 STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}{STRING}を交æ›
 STR_REPLACE_VEHICLES_START                                      :{BLACK}車両ã®äº¤æ›ã‚’開始
@@ -3011,7 +3059,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}自動交æ›ã«ã‚ˆã£ã¦åˆ—車ã®é•·ã•ãŒé•·ããªã‚‹å ´åˆã¯ã€åˆ—車ã®é•·ã•ã‚’ä¿å®ˆã™ã‚‹ã«ã¯å®¢è»Šï¼è²¨è»Šã‚’å–り除ãã“ã¨ãŒã§ãã¾ã™ã€‚列車ã®å…ˆé ­ã‹ã‚‰é–‹å§‹ã—ã¾ã™ã€‚
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}交æ›ï¼š{ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK}実験的機能{}機関車ï¼è²¨è»Šã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚{}貨車交æ›ã¯æ–°è²¨è»ŠãŒæ—§è²¨è»Šã¨åŒæ§˜ã®è²¨ç‰©ç¨®é¡žã«å†è£…å‚™ã§ãã‚‹ã¨ãã®ã¿ã«è¡Œã„ã¾ã™ã€‚自動交æ›ä¸­ã«å„貨車を検査ã—ã¾ã™ã€‚
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}機関車ãŒè³¼å…¥ã§ãã¾ã›ã‚“
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}車を買ãˆã¾ã›ã‚“
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}車を買ãˆã¾ã›ã‚“
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}船を買ãˆã¾ã›ã‚“
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}飛行機を買ãˆã¾ã›ã‚“
 
 STR_ENGINES                                                     :機関車
 STR_WAGONS                                                      :貨車
@@ -3087,6 +3138,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}始ã‚る年を変ãˆã¾ã™
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}リサイズ警告
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}ソース地図をリサイズã—ã™ãŽã‚‹ã“ã¨ã¯ãŠå‹§ã‚ã—ã¾ã›ã‚“。地形作æˆã‚’続ã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}é“路網ã®è­¦å‘Š
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}「é“路網を拡大ã›ãšã€ã¨ã„ã†é“路網をãŠã™ã™ã‚ã—ã¾ã›ã‚“。続ã‘ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}ãƒã‚¤ãƒˆãƒžãƒƒãƒ—å:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}サイズ:{ORANGE}{NUM} x {NUM}
@@ -3147,3 +3200,53 @@
 
 ########
 
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}振り替ãˆã‚¯ãƒ¬ã‚¸ãƒƒãƒˆ: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...ã“ã‚Œã¯ç”ºã®é“ã§ã™ã€‚
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...é“ã®æ–¹å‘ã¯é•ã„ã§ã™ã€‚
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}åŠé€æ˜Žè¨­å®š
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK} 駅ã®ã‚µã‚¤ãƒ³ã«ã¯åŠé€æ˜Žã‚’スイッãƒ
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}木ã®é€æ˜Žæ€§ã‚’å…¥ï¼åˆ‡
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}市町æ‘ã®å»ºç‰©ã®é€æ˜Žæ€§ã‚’å…¥ï¼åˆ‡
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}工業ã®é€æ˜Žæ€§ã‚’å…¥ï¼åˆ‡
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}交通社所有ã®å»ºç‰©ãªã©ã®é€æ˜Žæ€§ã‚’å…¥ï¼åˆ‡
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}æ©‹ã®é€æ˜Žæ€§ã‚’å…¥ï¼åˆ‡
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}ç¯å°ã€é€ä¿¡æ©Ÿãªã©ã®é€æ˜Žæ€§ã‚’å…¥ï¼åˆ‡
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :グループ {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :ã™ã¹ã¦ã®åˆ—車
+STR_GROUP_ALL_ROADS                                             :ã™ã¹ã¦ã®é“路車両
+STR_GROUP_ALL_SHIPS                                             :ã™ã¹ã¦ã®èˆ¹èˆ¶
+STR_GROUP_ALL_AIRCRAFTS                                         :ã™ã¹ã¦ã®é£›è¡Œæ©Ÿ
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :共有車両を追加
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :ã™ã¹ã¦ã®è»Šä¸¡ã‚’å–り除ã
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - 列車{COMMA}本
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - é“路車両{COMMA}両
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - 船舶{COMMA}隻
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - 飛行機{COMMA}å°
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}グループåを変更
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}"{GROUP}"内ã®è»Šä¸¡ã‚’交æ›
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}グループãŒä½œæˆã§ãã¾ã›ã‚“...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}グループãŒå‰Šé™¤ã§ãã¾ã›ã‚“...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}グループåãŒå¤‰æ›´ã§ãã¾ã›ã‚“...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}グループ内ã®ã™ã¹ã¦ã®è»Šä¸¡ãŒå–り除ã‘ã¾ã›ã‚“...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}ã“ã®è»Šä¸¡ãŒã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«è¿½åŠ ã§ãã¾ã›ã‚“...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}グループã«å…±æœ‰è»Šä¸¡ãŒè¿½åŠ ã§ãã¾ã›ã‚“...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}グループ - グループをクリックã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—内ã®ã™ã¹ã¦ã®è»Šä¸¡ã®ãƒªã‚¹ãƒˆãŒè¡¨ç¤ºã—ã¾ã™
+STR_GROUP_CREATE_TIP                                            :{BLACK}クリックã—ã¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™
+STR_GROUP_DELETE_TIP                                            :{BLACK}é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—を削除ã—ã¾ã™
+STR_GROUP_RENAME_TIP                                            :{BLACK}é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®å称を変更ã—ã¾ã™
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—内ã®è»Šä¸¡ã‚’自動交æ›ã—ã¾ã›ã‚“
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}今年ã®åŽç›Šï¼š{GREEN}{CURRENCY} {BLACK}(昨年:{GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}今年ã®åŽç›Šï¼š{RED}{CURRENCY} {BLACK}(昨年:{GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}今年ã®åŽç›Šï¼š{GREEN}{CURRENCY} {BLACK}(昨年:{RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}今年ã®åŽç›Šï¼š{RED}{CURRENCY} {BLACK}(昨年:{RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/korean.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/korean.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -4,6 +4,8 @@
 ##plural 1
 ##gender a b
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}맵 가장ìžë¦¬ì—ì„œ 너무 멉니다!
@@ -752,6 +754,7 @@
 STR_02A1_SMALL                                                  :{BLACK}소형
 STR_02A2_MEDIUM                                                 :{BLACK}중형
 STR_02A3_LARGE                                                  :{BLACK}대형
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}ë„ì‹œ
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}ë„ì‹œ í¬ê¸° ì„ íƒ
 STR_02A5_TOWN_SIZE                                              :{YELLOW}ë„ì‹œ í¬ê¸°:
 
@@ -803,6 +806,7 @@
 STR_02DE_MAP_OF_WORLD                                           :ì „ì²´ ì§€ë„ ë³´ê¸°
 STR_EXTRA_VIEW_PORT                                             :추가 ë·°í¬ì¸íŠ¸
 STR_SIGN_LIST                                                   :íŒ»ë§ ëª©ë¡
+STR_TRANSPARENCY_OPTIONS                                        :투명 옵션
 STR_02DF_TOWN_DIRECTORY                                         :ë„ì‹œ 목ë¡
 STR_TOWN_POPULATION                                             :{BLACK}세계 ì¸êµ¬: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}ë·°í¬ì¸íŠ¸ {COMMA}
@@ -1045,6 +1049,7 @@
 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_ADJACENT_STATIONS                            :{LTBLUE}정거장 ê·¼ì²˜ì— ê±´ë¬¼ 짓기 허용: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}소형 ê³µí•­ì˜ ê±´ì„¤ì„ í—ˆìš© : {ORANGE}{STRING}
 
@@ -1085,6 +1090,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}헬리콥터를 발착장ì—ì„œ ìžë™ìœ¼ë¡œ ì ê²€ : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}ì² ë„/ë„ë¡œ/항만/공항 íˆ´ë°”ì— ì§€í˜• ì •ë³´ ë§í¬ : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}스í¬ë¡¤ ë°©í–¥ 뒤집기 : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}부드러운 ë·°í¬ì¸íŠ¸ 스í¬ë¡¤: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}다양한 건설ë„구를 ì‚¬ìš©ì‹œì— ê±°ë¦¬ì¸¡ì • íˆ´íŒ í‘œì‹œ : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}회사 ì¡°í•©ì› í‘œì‹œ : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :ì—†ìŒ
@@ -1096,6 +1102,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :맵 스í¬ë¡¤
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :ë„기
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}맵 스í¬ë¡¤ ì†ë„: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}새로운 게임 시작할 ë•Œ ìžë™ìœ¼ë¡œ ì¼ì‹œì •ì§€: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}ì§„ë³´ëœ ì°¨ëŸ‰ ëª©ë¡ ì‚¬ìš©: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}최대 열차 수: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}최대 ìžë™ì°¨ 수: {ORANGE}{STRING}
@@ -1129,12 +1137,30 @@
 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_TOWN_LAYOUT_INVALID                          :{WHITE}ë„시설계 "ë„로건설 안함"ì€ ì‹œë‚˜ë¦¬ì˜¤ ì—디터ì—ì„œ 유효하지 않습니다
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}ë„ì‹œë„ë¡œ 설계: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :ë„로건설 안함
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :기본값
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :ê°œì„ ëœ ë„ë¡œ
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 칸
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 칸
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}ì£¼ë©”ë‰´ì˜ ìœ„ì¹˜ : {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :왼쪽
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :가운ë°
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :오른쪽
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}윈ë„ìš° ìžë™ ê²°í•©(ê°€ê¹Œì´ ì˜®ê¸°ë©´ ìžì„처럼 붙는 기능) : {ORANGE}{STRING} 픽셀
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}윈ë„ìš° ìžë™ ê²°í•© : {ORANGE}사용불가
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}ë§ˆì„ ì„±ìž¥ ì†ë„: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :ì—†ìŒ
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :ëŠë¦¼
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :보통
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :빠름
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :매우 빠름
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}2ë°° 빠르게 성장하는 마ì„ì˜ ë¹„ìœ¨: {ORANGE}1 대 {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}2ë°° 빠르게 성장하는 마ì„ì˜ ë¹„ìœ¨: {ORANGE}ì—†ìŒ
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}ì´ˆê¸°ì˜ ë„ì‹œ í¬ê¸° 배수: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}ì¸í„°íŽ˜ì´ìŠ¤
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}건설
@@ -1565,6 +1591,13 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :PRE ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :출구 ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :ê²°í•© ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :ì¼ë°˜ 신호등과 PREì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :ì¼ë°˜ 신호등과 ì¶œêµ¬ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :ì¼ë°˜ 신호등과 ê²°í•©ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :PRE 신호등과 ì¶œêµ¬ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :PRE 신호등과 ê²°í•©ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :출구 신호등과 ê²°í•©ì‹ í˜¸ë“±ì´ ì„¤ì¹˜ëœ ì² ë„
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}먼저 기차 ì •ê±°ìž¥ì„ ì œê±°í•´ì•¼ 합니다
 
 
 
@@ -1572,22 +1605,39 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}ë„로를 먼저 제거하십시오
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}ë„ë¡œ ìž‘ì—…ì´ ì§„í–‰ì¤‘ìž…ë‹ˆë‹¤
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}ë„ë¡œ 건설
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}전찻길 건설
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}êµëŸ‰ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... ì¼ë°©í†µí–‰ ë„로는 êµì°¨ë¡œë¥¼ 만들 수 없습니다
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}ë„로를 건설할 수 없습니다...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}ì—¬ê¸°ì— ì „ì°»ê¸¸ì„ ê±´ì„¤í•  수 없습니다...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}ë„로를 제거할 수 없습니다...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}ì´ê³³ì˜ ì „ì°»ê¸¸ì„ ì œê±°í•  수 없습니다...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}차고 방향
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}차량기지 방향
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}ì—¬ê¸°ì— ì°¨ê³ ë¥¼ ì§€ì„ ìˆ˜ 없습니다...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}ì—¬ê¸°ì— ì°¨ëŸ‰ê¸°ì§€ë¥¼ 건설할 수 없습니다...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}버스 ì •ë¥˜ìž¥ì„ ì§€ì„ ìˆ˜ 없습니다...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}트럭 ì í•˜ìž¥ì„ ì§€ì„ ìˆ˜ 없습니다...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}ì—¬ê¸°ì— ìŠ¹ê° ì „ì°¨ ì •ê±°ìž¥ì„ ê±´ì„¤í•  수 없습니다...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}ì—¬ê¸°ì— í™”ë¬¼ ì „ì°¨ ì •ê±°ìž¥ì„ ê±´ì„¤í•  수 없습니다...
 STR_180A_ROAD_CONSTRUCTION                                      :ë„ë¡œ 건설
+STR_180A_TRAMWAY_CONSTRUCTION                                   :전찻길 건설
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}ë„ë¡œ 섹션 건설
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}전찻길 섹션 건설
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}차고 건설 (ì°¨ëŸ‰ì˜ ì œìž‘/ì ê²€ìš©)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}차량기지 건설 (차량 건설/ì ê²€ìš©)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}버스 정류장 건설
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}트럭 ì í•˜ìž¥ 건설
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}ìŠ¹ê° ì „ì°¨ 정거장 건설
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}화물 전차 전거장 건설
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}êµëŸ‰ 건설
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}ì² êµ ê±´ì„¤
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}í„°ë„ ê±´ì„¤
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}í„°ë„ ê±´ì„¤
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}ë„ë¡œ 제거툴 켜기/ë„기
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}전찻길/신호등 제거툴 켜기/ë„기
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}ì°¨ê³ ì˜ ë°©í–¥ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}ì°¨ëŸ‰ê¸°ì§€ì˜ ë°©í–¥ì„ ì„ íƒí•˜ì„¸ìš”
 STR_1814_ROAD                                                   :ë„ë¡œ
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :ì‹ í˜¸ë“±ì´ ìžˆëŠ” ë„ë¡œ
 STR_1816_TREE_LINED_ROAD                                        :가로수가 있는 ë„ë¡œ
@@ -1595,6 +1645,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :ì² ë„ ê±´ë„목
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}ë²„ìŠ¤ì •ë¥˜ìž¥ì„ ì œê±°í•  수 없습니다...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}트럭 터미ë„ì„ ì œê±°í•  수 없습니다...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}ìŠ¹ê° ì „ì°¨ ì •ê±°ìž¥ì„ ì œê±°í•  수 없습니다...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}화물 ì „ì°¨ ì •ê±°ìž¥ì„ ì œê±°í•  수 없습니다...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}ë„ì‹œ
@@ -1759,8 +1811,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION}ì—ì„œ {STRING}/{STRING}ì„/를 받습니다.
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}버스 정류장 방향
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}트럭 ì í•˜ìž¥ ë°©í–¥
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}ìŠ¹ê° ì „ì°¨ 정거장 ë°©í–¥
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}화물 전차 정거장 방향
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}버스 ì •ë¥˜ìž¥ì„ ë¨¼ì € 제거하십시오.
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}트럭 ì í•˜ìž¥ì„ 먼저 제거하십시오.
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}ìŠ¹ê° ì „ì°¨ ì •ê±°ìž¥ì„ ë¨¼ì € 제거하십시오.
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}화물 ì „ì°¨ ì •ê±°ìž¥ì„ ë¨¼ì € 제거하십시오.
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA}개 역사
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- ì—†ìŒ -
@@ -1772,6 +1828,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}ê¸°ì°¨ì—­ì˜ ê¸¸ì´ë¥¼ ì„ íƒí•©ë‹ˆë‹¤.
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}버스 ì •ë¥˜ìž¥ì˜ ë°©í–¥ì„ ì„ íƒí•©ë‹ˆë‹¤.
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}트럭 ì í•˜ìž¥ì˜ ë°©í–¥ì„ ì„ íƒí•©ë‹ˆë‹¤.
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}ìŠ¹ê° ì „ì°¨ ì •ê±°ìž¥ì˜ ë°©í–¥ì„ ì„ íƒí•˜ì„¸ìš”.
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}화물 ì „ì°¨ ì •ê±°ìž¥ì˜ ë°©í–¥ì„ ì„ íƒí•˜ì„¸ìš”.
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}ì´ ì—­ì´ ìžˆëŠ” 곳으로 ì´ë™í•©ë‹ˆë‹¤.
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}ì—­ì˜ ë“±ê¸‰ 표시
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}ì—­ ì´ë¦„ 변경
@@ -1992,6 +2050,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} 헬리í¬íŠ¸
 STR_SV_STNAME_FOREST                                            :{STRING} 삼림
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2027,6 +2087,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :ì—†ìŒ
+STR_NUM_VERY_LOW                                                :매우 ì ìŒ
 STR_6816_LOW                                                    :ë‚®ìŒ
 STR_6817_NORMAL                                                 :보통
 STR_6818_HIGH                                                   :높ìŒ
@@ -2219,6 +2280,8 @@
 STR_LIVERY_HELICOPTER                                           :헬리콥터
 STR_LIVERY_SMALL_PLANE                                          :소형 항공기
 STR_LIVERY_LARGE_PLANE                                          :대형 항공기
+STR_LIVERY_PASSENGER_TRAM                                       :ìŠ¹ê° ì „ì°¨
+STR_LIVERY_FREIGHT_TRAM                                         :화물 전차
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}ì¼ë°˜ ìƒ‰ìƒ ì„ íƒ
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}ì—´ì°¨ ìƒ‰ìƒ ì„ íƒ
@@ -2692,6 +2755,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}ìžë™ì°¨ ì´ë¦„ 지정
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}첫 버스가 {STATION} ì •ë¥˜ìž¥ì— ë„착했습니다!{}ì‹œë¯¼ë“¤ì´ í™˜í˜¸í•˜ê³  있습니다!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}첫 íŠ¸ëŸ­ì´ {STATION} ì •ë¥˜ìž¥ì— ë„착했습니다!{}ì‹œë¯¼ë“¤ì´ í™˜í˜¸í•˜ê³  있습니다!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}{STATION}ì— ì²˜ìŒìœ¼ë¡œ ìŠ¹ê° ì „ì°¨ê°€ ë„착했습니다!{}ì‚¬ëžŒë“¤ì´ í™˜í˜¸ì„±ì„ ì§€ë¦…ë‹ˆë‹¤!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}{STATION}ì— ì²˜ìŒìœ¼ë¡œ 화물 전차가 ë„착했습니다!{}ì‚¬ëžŒë“¤ì´ í™˜í˜¸ì„±ì„ ì§€ë¦…ë‹ˆë‹¤!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}ìžë™ì°¨ 충ëŒ!{}ì—´ì°¨ì™€ì˜ ì¶©ëŒë¡œ 운전사가 사ë§í–ˆìŠµë‹ˆë‹¤!
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}ìžë™ì°¨ 충ëŒ!{}ì—´ì°¨ì™€ì˜ ì¶©ëŒë¡œ {COMMA}ëª…ì´ ì‚¬ë§í–ˆìŠµë‹ˆë‹¤!
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}ìžë™ì°¨ë¥¼ 회차시킬 수 없습니다...
@@ -2976,6 +3041,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}ì´ ì•ˆì— ìžˆëŠ” 모든 ì°¨ëŸ‰ì„ íŒë§¤í•˜ë ¤ê³  합니다. ì •ë§ íŒë§¤í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :ìž˜ëª»ëœ ì°¨ëŸ‰ê¸°ì§€ 종류
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}ì´ ì°¨ëŸ‰ê¸°ì§€ì— ìžˆëŠ” 모든 열차를 íŒë‹ˆë‹¤.
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}ì´ ì°¨ëŸ‰ê¸°ì§€ì— ìžˆëŠ” 모든 ìžë™ì°¨ë¥¼ íŒë‹ˆë‹¤.
@@ -3013,7 +3079,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}ìžë™êµì²´ì‹œì— 열차가 기존보다 길어지면 화물차를 ì œê±°í•¨ìœ¼ë¡œì¨ êµì²´ì‹œ 달ë¼ì§€ëŠ” ì—´ì°¨ì˜ ê¸¸ì´ë¥¼ 같게 조정합니다 (앞쪽부터 시작ë¨)
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}êµì²´ì¤‘: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} ì‹¤í—˜ì  ê¸°ëŠ¥! {}기관차/화물차 êµì²´ ì°½ì„ ë²ˆê°ˆì•„ ë„ì›ë‹ˆë‹¤.{}화물차 êµì²´ëŠ” 예전 화물차가 ì‹£ë˜ í™”ë¬¼ì„ ì‹¤ì„ ìˆ˜ 있ë„ë¡ ê°œì¡°í•  수 있는 새로운 화물차ì—만 성공할 것입니다. 실제 êµì²´ê°€ ì´ë£¨ì–´ì§ˆ ë•Œ ê° í™”ë¬¼ì°¨ì— ì²´í¬ë˜ì—ˆìŠµë‹ˆë‹¤.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}기관차를 ìƒì„±í•  수 없습니다!
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}열차는 불가능합니다
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}ì°¨ëŸ‰ì€ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}ì„ ë°•ì€ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}항공기는 불가능합니다
 
 STR_ENGINES                                                     :기관차
 STR_WAGONS                                                      :화물차
@@ -3089,6 +3158,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}시작 ë…„ë„를 변경합니다.
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}맵 í¬ê¸°ì— 대한 경고
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}맵 ìžì›ì˜ í¬ê¸°ë¥¼ 너무 키우는 ê²ƒì€ ì¢‹ì§€ 않습니다. ìƒì„±ì„ 계ì†í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}ë„ì‹œ 설계 경고
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}ë„ì‹œ 설계 "ë„로건설 안함"ì€ ì¶”ì²œí•˜ì§€ 않습니다. ìƒì„±ì„ ê³„ì† í•˜ì‹œê² ìŠµë‹ˆê¹Œ?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}DEM지형 ì´ë¦„:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}í¬ê¸°: {ORANGE}{NUM} x {NUM}
@@ -3150,3 +3221,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}환승 단위: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...여기는 ë§ˆì„ ì†Œìœ ì˜ ë„ë¡œ 입니다
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...ë„로가 ìž˜ëª»ëœ ë°˜í–¥ì„ í–¥í•˜ê³  있습니다
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}투명 옵션
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}ì—­ì´ë¦„ íŒ»ë§ íˆ¬ëª… 전환
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}나무 투명 전환
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}집 투명 전환
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}산업시설 투명 전환
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}정거장, 차량기지, 웨ì´í¬ì¸íŠ¸, 연결고리와 ê°™ì€ ê±´ì„¤ 가능한 ê²ƒë“¤ì— ëŒ€í•œ 투명 전환
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}다리 투명 전환
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}등대와 안테나와 ê°™ì€ êµ¬ì¡°ë¬¼ 투명 전환
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :그룹 {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :모든 기차
+STR_GROUP_ALL_ROADS                                             :모든 차량
+STR_GROUP_ALL_SHIPS                                             :모든 선박
+STR_GROUP_ALL_AIRCRAFTS                                         :모든 항공기
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :모든 ê³µìœ ëœ ì°¨ëŸ‰
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :모든 차량 제거
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} 기차
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} ìžë™ì°¨
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} ì„ ë°•
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} 항공기
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}그룹 ì´ë¦„ 바꾸기
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}"{GROUP}"ì˜ ì°¨ëŸ‰ êµì²´
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}ê·¸ë£¹ì„ ë§Œë“¤ 수 없습니다...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}ì´ ê·¸ë£¹ì„ ì§€ìš¸ 수 없습니다.
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}ê·¸ë£¹ì˜ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다.
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}ì´ êµ¬ë¦…ì˜ ëª¨ë“  ì°¨ëŸ‰ì„ ì œê±°í•  수 없습니다.
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}ì´ ê·¸ë£¹ì— ì°¨ëŸ‰ì„ ì¶”ê°€í•  수 없습니다.
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}ì´ êµ¬ë¦…ì— ê³µìœ ëœ ì°¨ëŸ‰ì„ ì¶”ê°€í•  수 없습니다.
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}그룹 - ë•…ì„ í´ë¦­í•˜ë©´ ì´ ê·¸ë£¹ì˜ ëª¨ë“  ì°¨ëŸ‰ì„ ë‚˜ì—´
+STR_GROUP_CREATE_TIP                                            :{BLACK}그룹 만들기
+STR_GROUP_DELETE_TIP                                            :{BLACK}ì„ íƒí•œ 그룹 ì‚­ì œ
+STR_GROUP_RENAME_TIP                                            :{BLACK}ì„ íƒí•œ 그룹 ì´ë¦„ 바꾸기
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}ì „ì²´ ìžë™ êµì²´ë¡œë¶€í„° ì´ ê·¸ë£¹ 보호
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}ì˜¬í•´ì˜ ìˆ˜ìž…: {GREEN}{CURRENCY} {BLACK}(ìž‘ë…„: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}ì˜¬í•´ì˜ ìˆ˜ìž…: {RED}{CURRENCY} {BLACK}(ìž‘ë…„: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}올해 수입: {GREEN}{CURRENCY} {BLACK}(작년: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}올해 수입: {RED}{CURRENCY} {BLACK}(작년: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/lithuanian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/lithuanian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3018,7 +3018,6 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Pakeitimo metu išlaikyti traukinio ilgį atjungiant vagonus (pradedant juo priekio), jeigu pakeitus garvežį traukinys pailgėtų.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Keicima: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EKSPERIMENTINÄ– GALIMYBÄ– {}PereidinÄ—ti tarp garvežių ir vagonų pakeitimo langų.{}Vagonai bus pakeiÄiami tik tada, jeigu naujasis vagonas galÄ—s gabenti tÄ… patį krovinio tipÄ… kaip ir senasis. Tai atliekama patikrinant kiekvienÄ… vagonÄ… jo keitimo metu.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Variklio neimanoma pagaminti
 
 STR_ENGINES                                                     :Varikliai
 STR_WAGONS                                                      :Vagonai
--- a/src/lang/norwegian_bokmal.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/norwegian_bokmal.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode nb_NO
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Utenfor kartet
@@ -280,6 +282,7 @@
 STR_OSNAME_MORPHOS                                              :MorphOS
 STR_OSNAME_AMIGAOS                                              :AmigaOS
 STR_OSNAME_OS2                                                  :OS/2
+STR_OSNAME_SUNOS                                                :SunOS
 
 STR_013B_OWNED_BY                                               :{WHITE}...eies av {STRING}
 STR_013C_CARGO                                                  :{BLACK}Last
@@ -590,6 +593,7 @@
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Ankommst av første kjøretøy på motstanders stasjon
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Ulykker/katastrofer
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Firmainformasjon
+STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Ã…pninger / Stengninger av industrier
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Økonomiske endringer
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Råd/informasjon om spillers kjøretøy
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Nye kjøretøy
@@ -725,6 +729,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Plasser fyrtårn
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Plasser radiosender
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Definer ørkenområde.{}Trykk og hold inne CTRL for å fjerne den
+STR_CREATE_LAKE                                                 :{BLACK}Definer vannområde.{}Lag en kanal, untatt hvis CTRL holdes nede på havnivå, hvor områdene vil fylles istedenfor
 STR_0290_DELETE                                                 :{BLACK}Slett
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Slett denne byen fullstendig
 STR_0292_SAVE_SCENARIO                                          :Lagre scenario
@@ -748,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Liten
 STR_02A2_MEDIUM                                                 :{BLACK}Middels
 STR_02A3_LARGE                                                  :{BLACK}Stor
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}By
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Velg bystørrelse
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Bystørrelse:
 
@@ -799,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Verdenskart
 STR_EXTRA_VIEW_PORT                                             :Ekstra vindu
 STR_SIGN_LIST                                                   :Skiltliste
+STR_TRANSPARENCY_OPTIONS                                        :Instillinger for gjennomsiktighet
 STR_02DF_TOWN_DIRECTORY                                         :Byoversikt
 STR_TOWN_POPULATION                                             :{BLACK}Verdensbefolkning: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Vindu {COMMA}
@@ -1041,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny global rutesøking (NGR, overstyrer NTK): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Vektmultiplikator for frakt til å simulere tunge tog: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillat gjennomkjøring av stoppesteder på veier som er eid av byene: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillat bygging av nærliggende stasjoner: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Alltid tillat bygging av små flyplasser: {ORANGE}{STRING}
 
@@ -1087,6 +1095,13 @@
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Eget firma
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Alle firmaer
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Foretrekk lagchat med <ENTER>: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Rullehjulets funksjon: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zoom kartet
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Rull kartet
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Av
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Rullehjulets hastighet på kartet: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pause automatisk ved start av nytt spill: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Bruk den avanserte kjøretøyslisten: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maks antall tog per spiller: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maks antall kjøretøy per spiller: {ORANGE}{STRING}
@@ -1120,12 +1135,28 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Tillat kjøping av aksjer i andre selskaper
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ved opptrekking plasser signal hver: {ORANGE}{STRING} rute(r)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Bygg signalsystem med mast automatisk før: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Velg byvei-layout: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :ingen flere veier
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :default
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :bedre veier
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 rutenett
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Plassering av hovedverktøylinje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Venstre
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Midtstilt
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Høyre
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Knipseradius for vindu: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Knipseradius for vindu: {ORANGE}deaktivert
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Hastighet for byenes vekst: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ingen
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Sakte
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rask
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Veldig rask
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Andel tettsteder som kommer til å bli byer: {ORANGE}1 av {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Andel tettsted som kommer til å bli byer: {ORANGE}Ingen
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Innledende bystørrelse multiplikator: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Grensesnitt
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruksjon
@@ -1205,6 +1236,7 @@
 STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Plasser trær av tilfeldig type
 
 STR_CANT_BUILD_CANALS                                           :{WHITE}Kan ikke bygge kanaler her...
+STR_BUILD_CANALS_TIP                                            :{BLACK}Bygg kanaler.
 STR_LANDINFO_CANAL                                              :Kanal
 
 STR_CANT_BUILD_LOCKS                                            :{WHITE}Kan ikke bygge sluser her...
@@ -1982,6 +2014,7 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} helikopterstasjon
 STR_SV_STNAME_FOREST                                            :{STRING}skogen
 
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2631,6 +2664,9 @@
 STR_TRAIN_NO_POWER                                              :{RED}Ingen strøm
 STR_TRAIN_START_NO_CATENARY                                     :Dette sporet mangler et kjede, så toget kan ikke starte
 
+STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}Ny {STRING} nå tilgjengelig!
+STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{STRING}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}Ny {STRING} NÃ¥ tilgjengelig!  -  {STRING}
 
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Kjøretøy i veien
@@ -2902,6 +2938,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ugyldig parameter for {STRING}: parameter {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} må være lastet før {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} må være lastet etter {STRING}.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF filen den var laget for å oversette
 
 STR_NEWGRF_ADD                                                  :{BLACK}Legg til
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Legg en ny NewGRF-fil til listen
@@ -2999,7 +3036,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}La den automatiske utskiftningen beholde lengen på toget ved å fjerne vogner (fra første vogn), hvis utskiftningen gjør toget lenger.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Erstatter: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} Eksperimentell del {}Skift mellom tog- og vognvinduet.{}Vognutskiftningen vil bare bli utført hvis den nye vognen kan ha samme last som den gamle. Dette blir sjekket når utskiftingen finner sted.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Motoren kan ikke bygges
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Kjøretøyet er ikke tilgjengelig
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Kjøretøyet er ikke tilgjengelig
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Skipet er ikke tilgjengelig
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Flyfartøyet er ikke tilgjengelig
 
 STR_ENGINES                                                     :Motorer
 STR_WAGONS                                                      :Vogner
@@ -3135,3 +3175,23 @@
 
 ########
 
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Overfør kreditt: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...denne veien er eid av en by
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...veien vender mot feil retning
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Instillinger for gjennomsiktighet
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Skru på gjennomsiktighet for stasjonskilt
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Skru på gjennomsiktighet for trær
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Skru på gjennomsiktighet for hus
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Skru på gjennomsiktighet for industrier
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Skru på gjennomsiktighet for stasjoner, depoter, lokalstasjoner og skinner
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Skru på gjennomsiktighet for broer
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Skru på gjennomsiktighet for fyrtårn og antenner
+
+##### Mass Order
+
+
+
+
+
+########
--- a/src/lang/norwegian_nynorsk.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/norwegian_nynorsk.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -728,6 +728,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Plasser fyrtårn
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Plasser radiosendar
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Definer ørkenområde.{}Trykk og held inne CTRL for å fjerne det
+STR_CREATE_LAKE                                                 :{BLACK}Definer vassområde.{}Lag ein kanal. Viss CTRL er halde nede ved havnivå, vil vatnet i staden fløyme over omgivnadene
 STR_0290_DELETE                                                 :{BLACK}Slett
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Slett byen heilt
 STR_0292_SAVE_SCENARIO                                          :Lagre scenario
@@ -751,6 +752,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Liten
 STR_02A2_MEDIUM                                                 :{BLACK}Middels
 STR_02A3_LARGE                                                  :{BLACK}Stor
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}By
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Vel storleik på by
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Bystorleik:
 
@@ -802,6 +804,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Verdskart
 STR_EXTRA_VIEW_PORT                                             :Ekstra vindauge
 STR_SIGN_LIST                                                   :Skiltliste
+STR_TRANSPARENCY_OPTIONS                                        :Gjennomsiktigheitsinnstillingar
 STR_02DF_TOWN_DIRECTORY                                         :Byoversikt
 STR_TOWN_POPULATION                                             :{BLACK}Verdsinnbyggjartal: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Vindauge {COMMA}
@@ -1093,6 +1096,9 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Funksjonen til scrollhjulet: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Zoom kart
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scroll kart
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :av
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Fart på rullehjul: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatisk pause når ein startar nytt spel: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maks antal tog per speler: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maks antal køyretøy per spelar: {ORANGE}{STRING}
@@ -1126,12 +1132,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Tillat kjøping av aksjar i andre selskap
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ved opptrekking, plasser signal hver: {ORANGE}{STRING} rute{P "" r}
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Bygg semaforer automatisk før: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Byoppsettet " ingen fleire vegar" kan ikkje brukast i scenarioredigeringsprogrammet
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Velg oppsett for byvegar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :Ingen fleire vegar
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :standard
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :betre vegar
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 rutenett
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 rutenett
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Plassering av hovudverktøylinje: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Venstre
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Midtstilt
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Høgre
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Knipseradius for vindauge: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Knipseradius for vindauge: {ORANGE}deaktivert
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Byen sin vekseProporsjonfart: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ingen
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Sakte
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rask
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Særs rask
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporsjon på byar som vil vekse dobbelt så fort: {ORANGE}1 av {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporsjon på byar som vil vekse dobbelt så fort: {ORANGE}Ingen
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Faktor for multiplikasjon av bystorleik: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Grensesnitt
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruksjon
@@ -1450,7 +1474,7 @@
 STR_NETWORK_ERR_CLIENT_NOT_EXPECTED                             :mottok merkeleg pakke
 STR_NETWORK_ERR_CLIENT_WRONG_REVISION                           :feil versjon
 STR_NETWORK_ERR_CLIENT_NAME_IN_USE                              :namnet er brukt av nokon andre
-STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD                           :feil passord til spelet
+STR_NETWORK_ERR_CLIENT_WRONG_PASSWORD                           :feil passord for til spelet
 STR_NETWORK_ERR_CLIENT_PLAYER_MISMATCH                          :feil spelar-id i DoCommand
 STR_NETWORK_ERR_CLIENT_KICKED                                   :sparka ut av tenaren
 STR_NETWORK_ERR_CLIENT_CHEATER                                  :freista å jukse
@@ -2024,6 +2048,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ingen
+STR_NUM_VERY_LOW                                                :Særs låg
 STR_6816_LOW                                                    :Lite
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Høgt
@@ -2775,7 +2800,7 @@
 STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Kan ikkje bygge om skip...
 STR_9842_REFITTABLE                                             :(ombyggbart)
 STR_GO_TO_SHIP_DEPOT                                            :Seil til {TOWN} skipsdepot
-SERVICE_AT_SHIP_DEPOT                                           :Vedlikehald ved {TOWN} skipsdepot
+SERVICE_AT_SHIP_DEPOT                                           :Vedlikehald ved {TOWN} Skipsdepot
 
 ##id 0xA000
 STR_A000_AIRPORTS                                               :{WHITE}Flyplassar
@@ -3010,7 +3035,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Lat den automatiske utskiftinga behalde lengda på toget ved å fjerne vogner (frå første vogn), dersom utskiftinga gjer toget lenger.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Erstatter: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} Eksperimentell del {}Skift mellom tog- og vognvindauget.{} Utskiftinga av vogner skjer berre dersom den nye vogna kan ha same last som den nye.  Dette vert sjekka når skiftet skjer.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Motoren kan ikkje byggjast
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Køyretøyet er ikkje tilgjengeleg
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Køyretøyet er ikkje tilgjengeleg
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Skipet er ikkje tilgjengeleg
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Flyet er ikkje tilgjengeleg
 
 STR_ENGINES                                                     :Motorar
 STR_WAGONS                                                      :Vogner
@@ -3086,6 +3114,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Endre startår
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skalaåtvaring
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Å endre storleiken på kjeldekartet for mykje er ikkje anbefalt. Vil du halde fram med genereringa?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Ã…tvaring for byoppsett
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Byoppsettet "ingen fleire vegar" er ikkje anbefalt.  Hald fram med bygginga?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Høgdekartnamn:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Storleik: {ORANGE}{NUM} x {NUM}
@@ -3147,3 +3177,14 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Overfør kreditt: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...denne vegen eigast av ein by
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...vegen peiker feil veg
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Gjennomsynsval
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Byt gjennomsyn for stasjonssktilt
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Byt gjennomsyn for tre
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Byt gjennomsyn for hus
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Byt gjennomsyn for industriar
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Byt gjennomsyn for bygningar som kan byggast, til dømes depot og vegmerker
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Byt gjennomsyn for bruer
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Byt gjennomsyn for bygningar som fyrtårn og antenner, kanskje i framtida for fine effekter
--- a/src/lang/polish.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/polish.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -838,6 +838,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Male
 STR_02A2_MEDIUM                                                 :{BLACK}Åšrednie
 STR_02A3_LARGE                                                  :{BLACK}Duże
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Metropolia
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Wybierz wielkość miasta
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Wielkość miasta:
 
@@ -889,6 +890,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mapa świata
 STR_EXTRA_VIEW_PORT                                             :Dodatkowy podglÄ…d
 STR_SIGN_LIST                                                   :Lista tablic
+STR_TRANSPARENCY_OPTIONS                                        :Opcje przeźroczystości
 STR_02DF_TOWN_DIRECTORY                                         :Lista miast
 STR_TOWN_POPULATION                                             :{BLACK}Populacja świata: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}PodglÄ…d {COMMA}
@@ -1182,6 +1184,7 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Przesuń widok
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Rolka wyłączona
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Prędkość przesuwania widoku: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automatycznie włącz pauzę tworząc nową grę: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maks. liczba pociągów na gracza: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maks. liczba samochodów na gracza: {ORANGE}{STRING}
@@ -1215,12 +1218,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Pozwól kupować odziały w innych firmach
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}W trakcie przeciągania ustaw sygnały co: {ORANGE}{STRING} kratk{P e i ek}
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatycznie buduj semafory przed: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Plan sieci dróg "bez nowych dróg" nie jest poprawny dla edytora scenariuszy
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Wybierz plan sieci dróg miejskich: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :bez nowych dróg
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :standardowy
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :lepsze drogi
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :siatka 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :siatka 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pozycja głównego paska narzędzi: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Z lewej strony
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Wyśrodkowane
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Z prawej strony
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Strefa przyciÄ…gania okien: {ORANGE}{STRING} pkt
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Strefa przyciągania okien: {ORANGE}niedostępne
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Szybkość rozwoju miast: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Brak
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Mała
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normalna
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Duża
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Bardzo duża
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Ilość miast które staną się metropoliami: {ORANGE}1 na {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Ilość miast które staną się metropoliami: {ORANGE}Brak
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Początkowy mnożnik rozmiarów metropolii: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfejs
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstrukcje
@@ -3141,7 +3162,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Autowymiana zachowuje długość pociągu poprzez usuwanie wagonów (począwszy od początku), jeśli wymiana lokomotywy spowoduje wydłużenie pociągu.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Zastępowanie: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EKSPERYMENTALNE NARZEDZIE {}Przejdź pomiędzy oknami zamiany lokomotyw i wagonów.{}Wymiana wagonu nastąpi tylko jeśli nowy wagon może być przebudowany do przewożenia tego samego towaru co poprzedni. Każdy wagon pociągu jest sprawdzany podczas procesu zamiany.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Lokomotywa nie może być zbudowana
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Pojazd nie jest dostępny
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Pojazd nie jest dostępny
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Statek nie jest dostępny
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Samolot nie jest dostępny
 
 STR_ENGINES                                                     :Lokomotywy
 STR_WAGONS                                                      :Wagony
@@ -3189,7 +3213,7 @@
 STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK}Moc: {GOLD}+{POWER}{BLACK} Waga: {GOLD}+{WEIGHT_S}
 STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}Można przebudować na: {GOLD}
 STR_PURCHASE_INFO_ALL_TYPES                                     :Wszystkie typy towarów
-STR_PURCHASE_INFO_ALL_BUT                                       :Wszystko oprócz {GOLD}}
+STR_PURCHASE_INFO_ALL_BUT                                       :Wszystko oprócz {GOLD}
 STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}Max. Siła Pociągowa: {GOLD}{FORCE}
 
 ########### String for New Landscape Generator
@@ -3233,7 +3257,7 @@
 STR_SETTINGUP_GAME                                              :{BLACK}Ustawianie gry
 STR_PREPARING_TILELOOP                                          :{BLACK}Uaktywnianie pól
 STR_PREPARING_GAME                                              :{BLACK}Przygotowywanie gry
-STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Ta akcja zmieniła poziom trudności na "własny"
+STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Zmieniono poziom trudności na "własny"
 STR_SE_FLAT_WORLD                                               :{WHITE}Płaski świat
 STR_SE_FLAT_WORLD_TIP                                           :{BLACK}Stwórz płaski świat
 STR_SE_RANDOM_LAND                                              :{WHITE}Losowy teren
@@ -3277,3 +3301,15 @@
 
 ########
 
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Wartość transferu: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...ta droga należy do miasta
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...droga jest zorientowana w złym kierunku
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opcje Przeźroczystości
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Przełącz przeźroczystość nazw stacji
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Przełącz przeźroczystość drzew
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Przełącz przeźroczystość budynków miejskich
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Przełącz przeźroczystość przedsiębiorstw
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Przełącz przeźroczystość infrastruktury takiej jak stacje, zajezdnie, punkty kontrolne i trakcja elektryczna
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Przełącz przeźroczystość mostów
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Przełącz przeźroczystość obiektów takich jak latarnie morskie i nadajniki, być może w przyszłości dodatki graficzne
--- a/src/lang/portuguese.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/portuguese.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode pt_PT
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Fora da borda do mapa
@@ -386,7 +388,7 @@
 STR_SORT_BY_FACILITY                                            :Tipo de Estação
 STR_SORT_BY_WAITING                                             :Valor da carga em espera
 STR_SORT_BY_RATING_MAX                                          :Avaliação de carga
-STR_ENGINE_SORT_ENGINE_ID                                       :Ordenação clássica
+STR_ENGINE_SORT_ENGINE_ID                                       :EngineID (ordernação clássica)
 STR_ENGINE_SORT_COST                                            :Custo
 STR_ENGINE_SORT_POWER                                           :Potência
 STR_ENGINE_SORT_INTRO_DATE                                      :Data de Introdução
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Pequena
 STR_02A2_MEDIUM                                                 :{BLACK}Média
 STR_02A3_LARGE                                                  :{BLACK}Grande
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Cidade
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Seleccione o tamanho da cidade
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Tamanho da cidade:
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mapa do mundo
 STR_EXTRA_VIEW_PORT                                             :Visualizador extra
 STR_SIGN_LIST                                                   :Lista de sinais
+STR_TRANSPARENCY_OPTIONS                                        :Opções de Transparência
 STR_02DF_TOWN_DIRECTORY                                         :Lista de cidades
 STR_TOWN_POPULATION                                             :{BLACK}População Mundial: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Visualizador {COMMA}
@@ -1044,10 +1048,11 @@
 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}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permitir sempre aeroportos pequenos: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Avisar quando comboios andam perdidos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN                              :{LTBLUE}Alertar em caso de perda do combóio: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW                                 :{LTBLUE}Analisar ordens dos veículos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_ORDER_REVIEW_OFF                             :Não
 STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT                         :Sim, mas excluir veículos parados
@@ -1084,7 +1089,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Manutenção automática de helicópteros em heliportos: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Ligar ferramentas de paisagem com as de construção: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Ao deslizar com o rato, mover a vista na direcção oposta: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Mostrar medidas ao usar ferramentas de construção: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Mostrar uma dica de medição ao utilizar várias ferramentas de construção: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Mostrar estampagens da companhia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Nenhum
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Própria companhia
@@ -1095,6 +1100,7 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Percorrer mapa
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Desligado
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Velocidade do scrollwheel no mapa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pausa automática ao iniciar um novo jogo: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Máximo de comboios por jogador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Máximo de veículos de estrada por jogador: {ORANGE}{STRING}
@@ -1128,12 +1134,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permite comprar acções de outras companhias
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Ao arrastar colocar sinais a cada: {ORANGE}{STRING} quadrado(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Construir automaticamente semáforos antes de: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}A disposição de cidade "sem mais estradas" não é válida no editor de cenários
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Seleccionar disposição das estradas na cidade: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :sem mais estradas
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :por defeito
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :estradas melhores
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :grelha 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :grelha 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posição da barra de ferramentas principal: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Esquerda
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centro
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Direita
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Raio de atracção de janelas: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Raio de atracção de janelas: {ORANGE}desactivado
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Ritmo de crescimento de cidades: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Nenhum
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Lento
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rápido
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Muito Rápido
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporção de cidades que se tornarão metrópoles: {ORANGE}1 em {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporção de cidades que se tornarão metrópoles: {ORANGE}Nenhuma
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicador inicial para dimensão da cidade: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interface
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construção
@@ -1564,6 +1588,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Caminhos-de-ferro com pre-sinais
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Caminhos-de-ferro com sinais de saída
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Caminhos-de-ferro com sinais combinados
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}É preciso remover a estação primeiro
 
 
 
@@ -1991,6 +2016,8 @@
 STR_SV_STNAME_HELIPORT                                          :Heliporto de {STRING}
 STR_SV_STNAME_FOREST                                            :Floresta de {STRING}
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2053,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Nenhum
+STR_NUM_VERY_LOW                                                :Muito baixo
 STR_6816_LOW                                                    :Baixo
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Alto
@@ -2556,9 +2584,9 @@
 STR_8826_GO_TO                                                  :{BLACK}Ir Para
 STR_8827_FULL_LOAD                                              :{BLACK}Carga
 STR_8828_UNLOAD                                                 :{BLACK}Descarga
-STR_REFIT                                                       :{BLACK}Reconverter
-STR_REFIT_TIP                                                   :{BLACK}Escolha o tipo de carga para reconverter nesta ordem. Control click para remover a instrução de reconversão
-STR_REFIT_ORDER                                                 :(Reconverter para {STRING})
+STR_REFIT                                                       :{BLACK}Converter
+STR_REFIT_TIP                                                   :{BLACK}Seleccionar o tipo de carga a converter nesta ordem. Pressionar Ctrl e botão-esquerdo do rato para remover instrução de conversão
+STR_REFIT_ORDER                                                 :(Converter para {STRING})
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Ordens)
 STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Fim de Ordens - -
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
@@ -3012,7 +3040,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Forçar a substituição automática a manter o comprimento do comboio, removendo vagões (do início), nas situações em que a substituição da locomotiva resultar num comboio maior.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Trocando: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} FUNCIONALIDADE EXPERIMENTAL{}Alternar entre a janela de substituição de locomotivas e a janela de substituição de vagões.{}A substituição de vagões só ocorrerá se o novo vagão puder ser reconvertido para o mesmo tipo de carga que o vagão antigo. Esta verificação ocorre para cada vagão, durante a substituição.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Locomotiva não construível
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Veículo não está disponível
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Veículo não está disponível
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Barco não está disponível
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aeronave não está disponível
 
 STR_ENGINES                                                     :Locomotivas
 STR_WAGONS                                                      :Vagões
@@ -3088,6 +3119,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Mudar ano de início
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Aviso de redimensionamento
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Redimensionar muito o mapa não é recomendado. Continuar com a criação?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Aviso de disposição da cidade
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}A disposição de cidade "sem mais estradas" não é recomendado. Continuar a geração?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nome mapa de alt.:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Tamanho: {ORANGE}{NUM} x {NUM}
@@ -3149,3 +3182,24 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Créditos de Transferência: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...esta estrada é detida pela cidade
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...estrada orientada na direcção incorrecta
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opções de Transparência
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Comutar transparência para sinais das estações
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Comutar transparência das árvores
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Comutar transparência das casas
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Comutar transparência das indústrias
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Comutar transparência para edificações como estações, depósitos, pontos-de-passagem e catenárias
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Comutar transparência para pontes
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Comutar transparência para estruturas como faróis-terrestres e antenas (talvez, no futuro, para embelezamentos)
+
+##### Mass Order
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+
+
+
+
+
+########
--- a/src/lang/romanian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/romanian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,32 +3,34 @@
 ##isocode ro_RO
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
-STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Depãseste limita hãrtii
-STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}Prea aproape de marginea hãrtii
-STR_0003_NOT_ENOUGH_CASH_REQUIRES                               :{WHITE}Nu ai destui bani - îti trebuie {CURRENCY}
+STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Depăşeşte limita hărţii
+STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}Prea aproape de marginea hărţii
+STR_0003_NOT_ENOUGH_CASH_REQUIRES                               :{WHITE}Nu ai destui bani - îţi trebuie {CURRENCY}
 STR_0004                                                        :{WHITE}{CURRENCY64}
 STR_0005                                                        :{RED}{CURRENCY64}
 STR_EMPTY                                                       :
-STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Necesitã teren plat
-STR_0008_WAITING                                                :{BLACK}ÃŽn asteptare: {WHITE}{STRING}
+STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}Necesită teren plat
+STR_0008_WAITING                                                :{BLACK}ÃŽn aÅŸteptare: {WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
 STR_000A_EN_ROUTE_FROM                                          :{WHITE}{CARGO}{YELLOW}  (plecat de la
 STR_000B                                                        :{YELLOW}{STATION})
-STR_000C_ACCEPTS                                                :{BLACK}Acceptã: {WHITE}
-STR_000D_ACCEPTS                                                :{BLACK}Acceptã: {GOLD}
+STR_000C_ACCEPTS                                                :{BLACK}Acceptă: {WHITE}
+STR_000D_ACCEPTS                                                :{BLACK}Acceptă: {GOLD}
 STR_000E                                                        :
-STR_000F_PASSENGERS                                             :cãlãtori
-STR_0010_COAL                                                   :cãrbuni
-STR_0011_MAIL                                                   :colete postale
+STR_000F_PASSENGERS                                             :călători
+STR_0010_COAL                                                   :cărbuni
+STR_0011_MAIL                                                   :colete poÅŸtale
 STR_0012_OIL                                                    :petrol
 STR_0013_LIVESTOCK                                              :animale
 STR_0014_GOODS                                                  :bunuri
 STR_0015_GRAIN                                                  :cereale
 STR_0016_WOOD                                                   :lemne
 STR_0017_IRON_ORE                                               :minereu de fier
-STR_0018_STEEL                                                  :otel
+STR_0018_STEEL                                                  :oţel
 STR_0019_VALUABLES                                              :valori
 STR_001A_COPPER_ORE                                             :minereu de cupru
 STR_001B_MAIZE                                                  :porumb
@@ -37,30 +39,30 @@
 STR_001E_FOOD                                                   :alimente
 STR_001F_PAPER                                                  :hârtie
 STR_0020_GOLD                                                   :aur
-STR_0021_WATER                                                  :apã
+STR_0021_WATER                                                  :apă
 STR_0022_WHEAT                                                  :grâu
 STR_0023_RUBBER                                                 :cauciuc
-STR_0024_SUGAR                                                  :zahãr
-STR_0025_TOYS                                                   :jucãrii
+STR_0024_SUGAR                                                  :zahăr
+STR_0025_TOYS                                                   :jucării
 STR_0026_CANDY                                                  :bomboane
 STR_0027_COLA                                                   :cola
-STR_0028_COTTON_CANDY                                           :vatã de zahãr
-STR_0029_BUBBLES                                                :balonase
+STR_0028_COTTON_CANDY                                           :vată de zahăr
+STR_0029_BUBBLES                                                :balonaÅŸe
 STR_002A_TOFFEE                                                 :caramel
 STR_002B_BATTERIES                                              :baterii
 STR_002C_PLASTIC                                                :plastic
 STR_002D_FIZZY_DRINKS                                           :sucuri
 STR_002E                                                        :
-STR_002F_PASSENGER                                              :cãlãtori
-STR_0030_COAL                                                   :cãrbuni
-STR_0031_MAIL                                                   :colete postale
+STR_002F_PASSENGER                                              :călător
+STR_0030_COAL                                                   :cărbuni
+STR_0031_MAIL                                                   :colete poÅŸtale
 STR_0032_OIL                                                    :petrol
 STR_0033_LIVESTOCK                                              :animale
 STR_0034_GOODS                                                  :bunuri
 STR_0035_GRAIN                                                  :cereale
 STR_0036_WOOD                                                   :lemne
 STR_0037_IRON_ORE                                               :minereu de fier
-STR_0038_STEEL                                                  :otel
+STR_0038_STEEL                                                  :oţel
 STR_0039_VALUABLES                                              :valori
 STR_003A_COPPER_ORE                                             :minereu de cupru
 STR_003B_MAIZE                                                  :porumb
@@ -69,15 +71,15 @@
 STR_003E_FOOD                                                   :alimente
 STR_003F_PAPER                                                  :hârtie
 STR_0040_GOLD                                                   :aur
-STR_0041_WATER                                                  :apã
+STR_0041_WATER                                                  :apă
 STR_0042_WHEAT                                                  :grâu
 STR_0043_RUBBER                                                 :cauciuc
-STR_0044_SUGAR                                                  :zahãr
-STR_0045_TOY                                                    :jucãrii
+STR_0044_SUGAR                                                  :zahăr
+STR_0045_TOY                                                    :jucării
 STR_0046_CANDY                                                  :bomboane
 STR_0047_COLA                                                   :cola
-STR_0048_COTTON_CANDY                                           :vatã de zahãr
-STR_0049_BUBBLE                                                 :balonase
+STR_0048_COTTON_CANDY                                           :vată de zahăr
+STR_0049_BUBBLE                                                 :balonaÅŸe
 STR_004A_TOFFEE                                                 :caramel
 STR_004B_BATTERY                                                :baterii
 STR_004C_PLASTIC                                                :plastic
@@ -151,12 +153,12 @@
 STR_00AE                                                        :{WHITE}{DATE_SHORT}
 STR_00AF                                                        :{WHITE}{DATE_LONG}
 STR_00B0_MAP                                                    :{WHITE}Harta - {STRING}
-STR_00B1_GAME_OPTIONS                                           :{WHITE}Optiuni
+STR_00B1_GAME_OPTIONS                                           :{WHITE}Opţiuni
 STR_00B2_MESSAGE                                                :{YELLOW}Mesaj
 STR_00B3_MESSAGE_FROM                                           :{YELLOW}Mesaj de la {STRING}
 STR_POPUP_CAUTION_CAPTION                                       :{WHITE}Atentie!
 STR_00B4_CAN_T_DO_THIS                                          :{WHITE}Nu pot face asta....
-STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Nu pot curãta terenul....
+STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Nu pot curăţa terenul....
 STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Copyright original {COPYRIGHT} 1995 Chris Sawyer, toate drepturile rezervate
 STR_00B7_VERSION                                                :{BLACK}OpenTTD versiunea {REV}
 STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 Echipa OpenTTD
@@ -164,10 +166,10 @@
 
 STR_00C5                                                        :{BLACK}{CROSS}
 STR_00C6                                                        :{SILVER}{CROSS}
-STR_00C7_QUIT                                                   :{WHITE}Iesire din joc
+STR_00C7_QUIT                                                   :{WHITE}IeÅŸire din joc
 STR_00C8_YES                                                    :{BLACK}Da
 STR_00C9_NO                                                     :{BLACK}Nu
-STR_00CA_ARE_YOU_SURE_YOU_WANT_TO                               :{YELLOW}Esti sigur cã vrei sã abandonezi jocul curent si sã revii în {STRING}?
+STR_00CA_ARE_YOU_SURE_YOU_WANT_TO                               :{YELLOW}Eşti sigur că vrei să abandonezi jocul curent şi să revii în {STRING}?
 STR_00CB_1                                                      :{BLACK}1
 STR_00CC_2                                                      :{BLACK}2
 STR_00CD_3                                                      :{BLACK}3
@@ -200,7 +202,7 @@
 STR_00E8_ROUTES                                                 :Rute
 STR_00E9_VEGETATION                                             :Vegetatie
 STR_00EA_OWNERS                                                 :Proprietari
-STR_00EB_ROADS                                                  :{BLACK}{TINYFONT}Strãzi
+STR_00EB_ROADS                                                  :{BLACK}{TINYFONT}Drumuri
 STR_00EC_RAILROADS                                              :{BLACK}{TINYFONT}Cãi ferate
 STR_00ED_STATIONS_AIRPORTS_DOCKS                                :{BLACK}{TINYFONT}Statii/Aeroporturi/Porturi
 STR_00EE_BUILDINGS_INDUSTRIES                                   :{BLACK}{TINYFONT}Clãdiri/Industrii
@@ -223,7 +225,7 @@
 STR_00FF_FARM                                                   :{BLACK}{TINYFONT}Fermã
 STR_0100_FACTORY                                                :{BLACK}{TINYFONT}Fabricã de conserve
 STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}Tipografie
-STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Sonde
+STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}Sonde de petrol
 STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Minã de fier
 STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}Otelãrie
 STR_0105_BANK                                                   :{BLACK}{TINYFONT}Bancã
@@ -280,6 +282,7 @@
 STR_OSNAME_MORPHOS                                              :MorphOS
 STR_OSNAME_AMIGAOS                                              :AmigaOS
 STR_OSNAME_OS2                                                  :OS/2
+STR_OSNAME_SUNOS                                                :SunOS
 
 STR_013B_OWNED_BY                                               :{WHITE}...apartine companiei {STRING}
 STR_013C_CARGO                                                  :{BLACK}Încãrcãturã
@@ -346,7 +349,7 @@
 
 ############ range for menu starts
 STR_0154_OPERATING_PROFIT_GRAPH                                 :Profitul operational
-STR_0155_INCOME_GRAPH                                           :Cifra de afaceri
+STR_0155_INCOME_GRAPH                                           :Venituri
 STR_0156_DELIVERED_CARGO_GRAPH                                  :Numãr încãrcãturi livrate
 STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Evolutia performantei
 STR_0158_COMPANY_VALUE_GRAPH                                    :Valoarea companiei
@@ -391,6 +394,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                                  :Capacitate incarcatura
 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)
@@ -443,7 +447,7 @@
 STR_017F_ZOOM_THE_VIEW_IN                                       :{BLACK}Mãreste imaginea
 STR_0180_ZOOM_THE_VIEW_OUT                                      :{BLACK}Micsoreazã imaginea
 STR_0181_BUILD_RAILROAD_TRACK                                   :{BLACK}Construieste cãi ferate
-STR_0182_BUILD_ROADS                                            :{BLACK}Construieste strãzi
+STR_0182_BUILD_ROADS                                            :{BLACK}Construieste drumuri
 STR_0183_BUILD_SHIP_DOCKS                                       :{BLACK}Construieste porturi
 STR_0184_BUILD_AIRPORTS                                         :{BLACK}Construieste aeroporturi
 STR_0185_PLANT_TREES_PLACE_SIGNS                                :{BLACK}Planteazã arbori, plaseazã semne, etc.
@@ -451,7 +455,7 @@
 STR_0187_OPTIONS                                                :{BLACK}Optiuni
 STR_0188                                                        :{BLACK}{SMALLUPARROW}
 STR_0189                                                        :{BLACK}{SMALLDOWNARROW}
-STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}Nu pot schimba intervalul de service...
+STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}Nu pot schimba intervalul de întreţinere...
 STR_018B_CLOSE_WINDOW                                           :{BLACK}ÃŽnchide fereastra
 STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Titlul ferestrei - trage de aici pentru a muta fereastra
 STR_STICKY_BUTTON                                               :{BLACK}Mark this window as undeletable for the 'Close All Windows' key
@@ -468,7 +472,7 @@
 STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}Aratã rutele de transport pe hartã
 STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}Aratã vegetatia pe hartã
 STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}Aratã proprietãtile pe hartã
-STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Activeazã afisarea numelor oraselor pe hartã
+STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}Activeazã/Dezactiveazã afisarea numelor oraselor pe hartã
 STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}Profit anul acesta: {CURRENCY} (anul trecut: {CURRENCY})
 
 ############ range for service numbers starts
@@ -484,9 +488,9 @@
 STR_01A1_IS_GETTING_VERY_OLD                                    :{WHITE}{STRING} {COMMA} este foarte vechi
 STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} este foarte vechi si trebuie înlocuit urgent
 STR_01A3_LAND_AREA_INFORMATION                                  :{WHITE}Informatii teren
-STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}Costul demolãrii: {LTBLUE}N/A
+STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}Costul demolãrii: {LTBLUE}nu este cazul
 STR_01A5_COST_TO_CLEAR                                          :{BLACK}Costul demolãrii: {LTBLUE}{CURRENCY}
-STR_01A6_N_A                                                    :N/A
+STR_01A6_N_A                                                    :nu este cazul
 STR_01A7_OWNER                                                  :{BLACK}Proprietar: {LTBLUE}{STRING}
 STR_01A8_LOCAL_AUTHORITY                                        :{BLACK}Autoritatea localã: {LTBLUE}{STRING}
 STR_01A9_NONE                                                   :nici una
@@ -548,7 +552,7 @@
 STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Sãri la piesa urmãtoare din selectie
 STR_01E0_STOP_PLAYING_MUSIC                                     :{BLACK}Opreste muzica
 STR_01E1_START_PLAYING_MUSIC                                    :{BLACK}Porneste muzica
-STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Foloseste acest indicator pentru a regla volumul muzicii si al efectelor sonore
+STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Foloseste aceste indicatoare pentru a regla volumul muzicii si al efectelor sonore
 STR_01E3                                                        :{DKGREEN}{TINYFONT}--
 STR_01E4_0                                                      :{DKGREEN}{TINYFONT}0{COMMA}
 STR_01E5                                                        :{DKGREEN}{TINYFONT}{COMMA}
@@ -572,7 +576,7 @@
 STR_01F7_SELECT_CUSTOM_2_USER_DEFINED                           :{BLACK}Selecteazã programul personal 2
 STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}Sterge programul curent (doar pentru cele personale)
 STR_01F9_SAVE_MUSIC_SETTINGS                                    :{BLACK}Salveaza setarile pentru muzica
-STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Click pe o melodie pentru a adãuga-o in programul personal curent
+STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Click pe o melodie pentru a o adãuga in programul personal curent
 STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Apasa pe pista audio pentru a o elimina din programul actual (doar Custom1 sau Custom2)
 STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}Comutator pentru amestecarea melodiilor (da/nu)
 STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Afiseaza fereastra pentru selectia melodiilor
@@ -589,6 +593,7 @@
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Sosirea primului vehicul la una din statiile competitorilor
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Accidente/dezastre
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Informatii despre companie
+STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Deschidere / inchidere industrii
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Schimbãri economice
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Sfaturi/informatii despre vehiculele tale
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Vehicule noi
@@ -614,7 +619,7 @@
 STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} al {COMPANY} dobandeste titlul de '{STRING}'!
 STR_021F                                                        :{BLUE}{COMMA}
 STR_0221_OPENTTD                                                :{YELLOW}OpenTTD
-STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Editor scenarii
+STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Editor de scenarii
 STR_0223_LAND_GENERATION                                        :{WHITE}Generator suprafatã uscat
 STR_0224                                                        :{BLACK}{UPARROW}
 STR_0225                                                        :{BLACK}{DOWNARROW}
@@ -628,177 +633,180 @@
 STR_022E_LANDSCAPE_GENERATION                                   :{BLACK}Generare peisaj
 STR_022F_TOWN_GENERATION                                        :{BLACK}Generare oras
 STR_0230_INDUSTRY_GENERATION                                    :{BLACK}Generare industrii
-STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Constructii rutiere
+STR_0231_ROAD_CONSTRUCTION                                      :{BLACK}Construcţii rutiere
 STR_0233_TOWN_GENERATION                                        :{WHITE}Generare oras
 STR_0234_NEW_TOWN                                               :{BLACK}Oras nou
 STR_0235_CONSTRUCT_NEW_TOWN                                     :{BLACK}Construieste un oras nou
 STR_0236_CAN_T_BUILD_TOWN_HERE                                  :{WHITE}Nu pot construi un oras aici...
 STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP                               :{WHITE}...prea aproape de marginea hãrtii
 STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN                              :{WHITE}...prea aproape de alt oras
-STR_0239_SITE_UNSUITABLE                                        :{WHITE}...locatie nepotrivitã
-STR_023A_TOO_MANY_TOWNS                                         :{WHITE}...prea multe orase
+STR_0239_SITE_UNSUITABLE                                        :{WHITE}...locaţie nepotrivită
+STR_023A_TOO_MANY_TOWNS                                         :{WHITE}...prea multe oraÅŸe
 STR_CANNOT_GENERATE_TOWN                                        :{WHITE}Nu pot construi nici un oras
 STR_NO_SPACE_FOR_TOWN                                           :{WHITE}...nu mai este loc pe hartã
-STR_023B_INCREASE_SIZE_OF_TOWN                                  :{BLACK}Mãreste dimensiunile orasului
+STR_023B_INCREASE_SIZE_OF_TOWN                                  :{BLACK}Măreşte dimensiunile oraşului
 STR_023C_EXPAND                                                 :{BLACK}Extinde
-STR_023D_RANDOM_TOWN                                            :{BLACK}Oras aleator
-STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION                          :{BLACK}Construieste un oras într-o locatie aleatoare
+STR_023D_RANDOM_TOWN                                            :{BLACK}OraÅŸ aleator
+STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION                          :{BLACK}Construieşte un oraş într-o locaţie aleatoare
 STR_023F_INDUSTRY_GENERATION                                    :{WHITE}Generare industrii
-STR_0240_COAL_MINE                                              :{BLACK}Minã de cãrbune
-STR_0241_POWER_STATION                                          :{BLACK}Termocentralã
-STR_0242_SAWMILL                                                :{BLACK}Exploatatie forestierã
-STR_0243_FOREST                                                 :{BLACK}Pãdure
-STR_0244_OIL_REFINERY                                           :{BLACK}Rafinãrie
-STR_0245_OIL_RIG                                                :{BLACK}Platformã petrolierã
-STR_0246_FACTORY                                                :{BLACK}Fabricã de conserve
-STR_0247_STEEL_MILL                                             :{BLACK}Otelãrie
-STR_0248_FARM                                                   :{BLACK}Fermã
-STR_0249_IRON_ORE_MINE                                          :{BLACK}Minã de fier
-STR_024A_OIL_WELLS                                              :{BLACK}Sonde
-STR_024B_BANK                                                   :{BLACK}Bancã
-STR_024C_PAPER_MILL                                             :{BLACK}Fabricã de hârtie
+STR_0240_COAL_MINE                                              :{BLACK}Mină de cărbune
+STR_0241_POWER_STATION                                          :{BLACK}Termocentrală
+STR_0242_SAWMILL                                                :{BLACK}Exploataţie forestieră
+STR_0243_FOREST                                                 :{BLACK}Pădure
+STR_0244_OIL_REFINERY                                           :{BLACK}Rafinărie
+STR_0245_OIL_RIG                                                :{BLACK}Platformă petrolieră
+STR_0246_FACTORY                                                :{BLACK}Fabrică de conserve
+STR_0247_STEEL_MILL                                             :{BLACK}Oţelărie
+STR_0248_FARM                                                   :{BLACK}Fermă
+STR_0249_IRON_ORE_MINE                                          :{BLACK}Mină de fier
+STR_024A_OIL_WELLS                                              :{BLACK}Sonde de petrol
+STR_024B_BANK                                                   :{BLACK}Bancă
+STR_024C_PAPER_MILL                                             :{BLACK}Fabrică de hârtie
 STR_024D_FOOD_PROCESSING_PLANT                                  :{BLACK}Combinat alimentar
 STR_024E_PRINTING_WORKS                                         :{BLACK}Tipografie
-STR_024F_GOLD_MINE                                              :{BLACK}Minã de aur
-STR_0250_LUMBER_MILL                                            :{BLACK}Fabricã de cherestea
-STR_0251_FRUIT_PLANTATION                                       :{BLACK}Livadã
-STR_0252_RUBBER_PLANTATION                                      :{BLACK}Plantatie de cauciuc
-STR_0253_WATER_SUPPLY                                           :{BLACK}Rezervor de apã
-STR_0254_WATER_TOWER                                            :{BLACK}Turn de apã
-STR_0255_DIAMOND_MINE                                           :{BLACK}Minã de diamante
-STR_0256_COPPER_ORE_MINE                                        :{BLACK}Minã de cupru
-STR_0257_COTTON_CANDY_FOREST                                    :{BLACK}Pãdure de vatã de zahãr
-STR_0258_CANDY_FACTORY                                          :{BLACK}Fabricã de bomboane
-STR_0259_BATTERY_FARM                                           :{BLACK}Fermã de baterii
+STR_024F_GOLD_MINE                                              :{BLACK}Mină de aur
+STR_0250_LUMBER_MILL                                            :{BLACK}Fabrică de cherestea
+STR_0251_FRUIT_PLANTATION                                       :{BLACK}Livadă
+STR_0252_RUBBER_PLANTATION                                      :{BLACK}Plantaţie de cauciuc
+STR_0253_WATER_SUPPLY                                           :{BLACK}Rezervor de apă
+STR_0254_WATER_TOWER                                            :{BLACK}Turn de apă
+STR_0255_DIAMOND_MINE                                           :{BLACK}Mină de diamante
+STR_0256_COPPER_ORE_MINE                                        :{BLACK}Mină de cupru
+STR_0257_COTTON_CANDY_FOREST                                    :{BLACK}Pădure de vată de zahăr
+STR_0258_CANDY_FACTORY                                          :{BLACK}Fabrică de bomboane
+STR_0259_BATTERY_FARM                                           :{BLACK}Fermă de baterii
 STR_025A_COLA_WELLS                                             :{BLACK}Fântâni de cola
-STR_025B_TOY_SHOP                                               :{BLACK}Magazin de jucãrii
-STR_025C_TOY_FACTORY                                            :{BLACK}Fabricã de jucãrii
+STR_025B_TOY_SHOP                                               :{BLACK}Magazin de jucării
+STR_025C_TOY_FACTORY                                            :{BLACK}Fabrică de jucării
 STR_025D_PLASTIC_FOUNTAINS                                      :{BLACK}Fântâni de plastic
-STR_025E_FIZZY_DRINK_FACTORY                                    :{BLACK}Fabricã de sucuri
-STR_025F_BUBBLE_GENERATOR                                       :{BLACK}Generator de balonase
-STR_0260_TOFFEE_QUARRY                                          :{BLACK}Carierã de caramel
-STR_0261_SUGAR_MINE                                             :{BLACK}Minã de zahãr
-STR_0262_CONSTRUCT_COAL_MINE                                    :{BLACK}Construieste minã de cupru
-STR_0263_CONSTRUCT_POWER_STATION                                :{BLACK}Construieste termocentralã
-STR_0264_CONSTRUCT_SAWMILL                                      :{BLACK}Înfiinteazã exploatatie forestierã
-STR_0265_PLANT_FOREST                                           :{BLACK}Planteazã pãdure
-STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}Construieste rafinãrie
-STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}Construieste platformã petrolierã (doar în apropierea marginilor hãrtii)
-STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}Construieste fabricã de conserve
-STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Construieste otelãrie
-STR_026A_CONSTRUCT_FARM                                         :{BLACK}Înfiinteazã fermã
-STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}Construieste minã de fier
-STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}Construieste sonde
-STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Construieste bancã (doar în orasele cu o populatie de cel putin 1200 locuitori)
-STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Construieste fabricã de hârtie
-STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}Construieste combinat alimentar
-STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}Construieste tipografie
-STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Construieste minã de aur
-STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Construieste bancã (doar în orase)
-STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}Construieste fabricã de cherestea (taie arborii din jur pentru a produce lemne)
-STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Planteazã livadã
-STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Înfiinteazã plantatie de cauciuc
-STR_0276_CONSTRUCT_WATER_SUPPLY                                 :{BLACK}Construieste rezervor de apã
-STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}Construieste turn de apã (doar în orase)
-STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}Construieste minã de diamante
-STR_0279_CONSTRUCT_COPPER_ORE_MINE                              :{BLACK}Construieste minã de cupru
-STR_027A_PLANT_COTTON_CANDY_FOREST                              :{BLACK}Planteazã pãdure de vatã de zahãr
-STR_027B_CONSTRUCT_CANDY_FACTORY                                :{BLACK}Construieste fabricã de bomboane
-STR_027C_CONSTRUCT_BATTERY_FARM                                 :{BLACK}Înfiinteazã fermã de baterii
-STR_027D_CONSTRUCT_COLA_WELLS                                   :{BLACK}Construieste fântâni de cola
-STR_027E_CONSTRUCT_TOY_SHOP                                     :{BLACK}Construieste magazin de jucãrii
-STR_027F_CONSTRUCT_TOY_FACTORY                                  :{BLACK}Construieste fabricã de jucãrii
-STR_0280_CONSTRUCT_PLASTIC_FOUNTAINS                            :{BLACK}Construieste fântþni de plastic
-STR_0281_CONSTRUCT_FIZZY_DRINK_FACTORY                          :{BLACK}Construieste fabricã de sucuri
-STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}Construieste generator de balonase
-STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Construieste carierã de caramel
-STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Construieste minã de zahãr
+STR_025E_FIZZY_DRINK_FACTORY                                    :{BLACK}Fabrică de sucuri
+STR_025F_BUBBLE_GENERATOR                                       :{BLACK}Generator de balonaÅŸe
+STR_0260_TOFFEE_QUARRY                                          :{BLACK}Carieră de caramel
+STR_0261_SUGAR_MINE                                             :{BLACK}Mină de zahăr
+STR_0262_CONSTRUCT_COAL_MINE                                    :{BLACK}Construieşte mină de cupru
+STR_0263_CONSTRUCT_POWER_STATION                                :{BLACK}Construieşte termocentrală
+STR_0264_CONSTRUCT_SAWMILL                                      :{BLACK}Înfiinţează exploataţie forestieră
+STR_0265_PLANT_FOREST                                           :{BLACK}Plantează pădure
+STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}Construieşte rafinărie
+STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}Construieşte platformă petrolieră (doar în apropierea marginilor hărţii)
+STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}Construieşte fabrică de conserve
+STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}Construieşte oţelărie
+STR_026A_CONSTRUCT_FARM                                         :{BLACK}Înfiinţează fermă
+STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}Construieşte mină de fier
+STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}ConstruieÅŸte sonde de petrol
+STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Construieşte bancă (doar în oraşele cu o populaţie de cel puţin 1200 locuitori)
+STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}Construieşte fabrică de hârtie
+STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}ConstruieÅŸte combinat alimentar
+STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}ConstruieÅŸte tipografie
+STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}Construieşte mină de aur
+STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}Construieşte bancă (doar în oraşe)
+STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}Construieşte fabrică de cherestea (taie arborii din jur pentru a produce lemne)
+STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Plantează livadă
+STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Înfiinţează plantaţie de cauciuc
+STR_0276_CONSTRUCT_WATER_SUPPLY                                 :{BLACK}Construieşte rezervor de apă
+STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}Construieşte turn de apă (doar în oraşe)
+STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}Construieşte mină de diamante
+STR_0279_CONSTRUCT_COPPER_ORE_MINE                              :{BLACK}Construieşte mină de cupru
+STR_027A_PLANT_COTTON_CANDY_FOREST                              :{BLACK}Plantează pădure de vată de zahăr
+STR_027B_CONSTRUCT_CANDY_FACTORY                                :{BLACK}Construieşte fabrică de bomboane
+STR_027C_CONSTRUCT_BATTERY_FARM                                 :{BLACK}Înfiinţează fermă de baterii
+STR_027D_CONSTRUCT_COLA_WELLS                                   :{BLACK}Construieşte fântâni de cola
+STR_027E_CONSTRUCT_TOY_SHOP                                     :{BLACK}Construieşte magazin de jucării
+STR_027F_CONSTRUCT_TOY_FACTORY                                  :{BLACK}Construieşte fabrică de jucării
+STR_0280_CONSTRUCT_PLASTIC_FOUNTAINS                            :{BLACK}Construieşte fântâni de plastic
+STR_0281_CONSTRUCT_FIZZY_DRINK_FACTORY                          :{BLACK}Construieşte fabrică de sucuri
+STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}ConstruieÅŸte generator de balonaÅŸe
+STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}Construieşte carieră de caramel
+STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}Construieşte mină de zahăr
 STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}Nu pot construi {STRING} aici...
-STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...mai intâi trebuie creat un oras
-STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...un singur obiectiv de acest tip este permis intr-un oras
-STR_0288_PLANT_TREES                                            :{BLACK}Planteazã arbori
-STR_0289_PLACE_SIGN                                             :{BLACK}Plaseazã semn
+STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...mai întâi trebuie creat un oraş
+STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...un singur obiectiv de acest tip este permis într-un oraş
+STR_0288_PLANT_TREES                                            :{BLACK}Plantează arbori
+STR_0289_PLACE_SIGN                                             :{BLACK}Plasează semn
 STR_028A_RANDOM_TREES                                           :{BLACK}Arbori aleatori
-STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Planteazã aleator arbori pe uscat
-STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Plaseaza formatiuni pietroase
-STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Plaseazã far
-STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Plaseazã transmitãtor
-STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Defineste suprafata de desert.{}Apasã si mentine apasat CTRL pentru a o sterge
-STR_0290_DELETE                                                 :{BLACK}Sterge
-STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Sterge acest oras
-STR_0292_SAVE_SCENARIO                                          :Salveazã scenariul
-STR_0293_LOAD_SCENARIO                                          :Încarcã scenariu
+STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}Plantează aleator arbori pe uscat
+STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}Plasează formaţiuni pietroase
+STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Plasează far
+STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Plasează transmiţător
+STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Defineşte suprafaţa de deşert.{}Apasă şi menţine apăsat CTRL pentru a o şterge
+STR_CREATE_LAKE                                                 :{BLACK}Defineste zona apei.{}Creeaza un canal, mai putin cand CTRL este apasat la nivelul marii, cand va inunda, in loc, imprejurimile
+STR_0290_DELETE                                                 :{BLACK}Åžterge
+STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Åžterge acest oraÅŸ
+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_0294_QUIT_EDITOR                                            :IeÅŸire din editor
 STR_0295                                                        :
-STR_0296_QUIT                                                   :Iesire din joc
-STR_0297_SAVE_SCENARIO_LOAD_SCENARIO                            :{BLACK}Salveazã/încarcã scenariu, abandoneazã editorul, iesire din joc
-STR_0298_LOAD_SCENARIO                                          :{WHITE}Încarcã scenariu
-STR_0299_SAVE_SCENARIO                                          :{WHITE}Salveazã scenariu
-STR_029A_PLAY_SCENARIO                                          :{BLACK}Joacã scenariu
+STR_0296_QUIT                                                   :IeÅŸire din joc
+STR_0297_SAVE_SCENARIO_LOAD_SCENARIO                            :{BLACK}Salvează/încarcă scenariu, abandonează editorul, ieşire din joc
+STR_0298_LOAD_SCENARIO                                          :{WHITE}Încarcă scenariu
+STR_0299_SAVE_SCENARIO                                          :{WHITE}Salvează scenariu
+STR_029A_PLAY_SCENARIO                                          :{BLACK}Joacă scenariu
 STR_PLAY_HEIGHTMAP                                              :{BLACK}Reda harta inaltimi
 STR_PLAY_HEIGHTMAP_HINT                                         :{BLACK}Porneste un nou joc, folosind o scara de inaltimi ca peisaj
 STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Esti sigur cã vrei sã renunti la acest scenariu?
-STR_029C_QUIT_EDITOR                                            :{WHITE}Iesire din editor
-STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...Se poate construi doar in orase cu populatia de cel putin 1200
-STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Schimbã data de start cu un an în urmã
-STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Schimbã data de start înainte cu un an
-STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...ambele capete ale podului trebuie sã se situeze pe uscat
+STR_029C_QUIT_EDITOR                                            :{WHITE}IeÅŸire din editor
+STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...Se poate construi doar în oraşe cu populaţia de cel puţin 1200
+STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Schimbă data de start cu un an în urmă
+STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Schimbă data de start înainte cu un an
+STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...ambele capete ale podului trebuie să se situeze pe uscat
 STR_02A1_SMALL                                                  :{BLACK}Mic
 STR_02A2_MEDIUM                                                 :{BLACK}Mediu
 STR_02A3_LARGE                                                  :{BLACK}Mare
-STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Alege mãrimea orasului
-STR_02A5_TOWN_SIZE                                              :{YELLOW}Mãrime oras:
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Oras
+STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Alege mărimea oraşului
+STR_02A5_TOWN_SIZE                                              :{YELLOW}Mărime oraş:
 
 STR_02B6                                                        :{STRING}  -  {STRING}
-STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Re-afiseazã ultimul mesaj
+STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}Re-afişează ultimul mesaj
 STR_OFF                                                         :Oprit
 STR_SUMMARY                                                     :Pe scurt
 STR_FULL                                                        :Pe larg
 STR_02BA                                                        :{SILVER}- -  {COMPANY}  - -
-STR_02BB_TOWN_DIRECTORY                                         :Lista oraselor (F5)
-STR_02BC_VEHICLE_DESIGN_NAMES                                   :{BLACK}Numele vehiculelor si modelelor
+STR_02BB_TOWN_DIRECTORY                                         :Lista oraÅŸelor (F5)
+STR_02BC_VEHICLE_DESIGN_NAMES                                   :{BLACK}Numele vehiculelor
 STR_02BD                                                        :{BLACK}{STRING}
 STR_02BE_DEFAULT                                                :Prestabilit
 STR_02BF_CUSTOM                                                 :Propriu
-STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Salveaza numele proprii
-STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Selecteazã numele modelelor
-STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Salveazã pe disc numele personalizate de mãrci si modele
+STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Salvează numele proprii
+STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Selectează numele modelelor
+STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Salvează pe disc numele personalizate de mărci şi modele
 
 STR_CHECKMARK                                                   :{CHECKMARK}
 ############ range for menu starts
-STR_02C3_GAME_OPTIONS                                           :Optiunile jocului (F2)
-STR_02C5_DIFFICULTY_SETTINGS                                    :Setãri dificultate
+STR_02C3_GAME_OPTIONS                                           :Opţiunile jocului (F2)
+STR_02C5_DIFFICULTY_SETTINGS                                    :Setări dificultate
 STR_02C7_CONFIG_PATCHES                                         :Configurare patch
 STR_NEWGRF_SETTINGS                                             :Setari Newgrf
 STR_GAMEOPTMENU_0A                                              :
-STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Afiseazã numele oraselor
-STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Afiseazã numele statiilor
-STR_02CE_SIGNS_DISPLAYED                                        :{SETX 12}Afiseazã semnele de pe hartã
+STR_02CA_TOWN_NAMES_DISPLAYED                                   :{SETX 12}Afişează numele oraşelor
+STR_02CC_STATION_NAMES_DISPLAYED                                :{SETX 12}Afişează numele staţiilor
+STR_02CE_SIGNS_DISPLAYED                                        :{SETX 12}Afişează semnele de pe hartă
 STR_WAYPOINTS_DISPLAYED2                                        :{SETX 12}Afisare puncte de tranzit
-STR_02D0_FULL_ANIMATION                                         :{SETX 12}Animatie completã
+STR_02D0_FULL_ANIMATION                                         :{SETX 12}Animaţie completă
 STR_02D2_FULL_DETAIL                                            :{SETX 12}Detalii grafice complete
 STR_02D4_TRANSPARENT_BUILDINGS                                  :{SETX 12}Peisaj transparent (X)
-STR_TRANSPARENT_SIGNS                                           :{SETX 12}Numele statiilor transparente
+STR_TRANSPARENT_SIGNS                                           :{SETX 12}Semne statii, transparente
 ############ range ends here
 
 ############ range for menu starts
-STR_02D5_LAND_BLOCK_INFO                                        :Informatii despre teren
+STR_02D5_LAND_BLOCK_INFO                                        :Informaţii despre teren
 STR_02D6                                                        :
 STR_CONSOLE_SETTING                                             :Consola On/Off
-STR_02D7_SCREENSHOT_CTRL_S                                      :Screenshot (Ctrl-S)
-STR_02D8_GIANT_SCREENSHOT_CTRL_G                                :Screenshot gigant(Ctrl-G)
+STR_02D7_SCREENSHOT_CTRL_S                                      :Capturează ecranul (Ctrl-S)
+STR_02D8_GIANT_SCREENSHOT_CTRL_G                                :Capturează toată harta (Ctrl-G)
 STR_02D9_ABOUT_OPENTTD                                          :Despre 'OpenTTD'
 ############ range ends here
 
 STR_02DB_OFF                                                    :{BLACK}inactiv
 STR_02DA_ON                                                     :{BLACK}activ
-STR_02DC_DISPLAY_SUBSIDIES                                      :{BLACK}Afiseazã subventiile (F6)
-STR_02DD_SUBSIDIES                                              :Subventii (F6)
+STR_02DC_DISPLAY_SUBSIDIES                                      :{BLACK}Afişează subvenţiile (F6)
+STR_02DD_SUBSIDIES                                              :Subvenţii (F6)
 STR_02DE_MAP_OF_WORLD                                           :Harta lumii (F4)
 STR_EXTRA_VIEW_PORT                                             :Extra ecran
 STR_SIGN_LIST                                                   :Lista de semne
-STR_02DF_TOWN_DIRECTORY                                         :Lista oraselor
+STR_TRANSPARENCY_OPTIONS                                        :Optiuni transparenta
+STR_02DF_TOWN_DIRECTORY                                         :Lista oraÅŸelor
 STR_TOWN_POPULATION                                             :{BLACK}Populatia totala: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Ecran{COMMA}
 STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}Copiaza pe ecranul principal
@@ -806,66 +814,66 @@
 STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW                                :{BLACK}Importa din ecran
 STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT                             :{BLACK}Importa locatia acestui ecran in ecranul principal
 
-STR_02E0_CURRENCY_UNITS                                         :{BLACK}Unitãti monetare
+STR_02E0_CURRENCY_UNITS                                         :{BLACK}Unităţi monetare
 STR_02E1                                                        :{BLACK}{SKIP}{STRING}
-STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Alege unitatea monetarã
+STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Alege unitatea monetară
 STR_MEASURING_UNITS                                             :{BLACK}Unitãti de mãsurã
 STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
 STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Selectie unitãti de mãsurã
-STR_02E6_ROAD_VEHICLES                                          :{BLACK}Autovehiculele circulã..
+STR_02E6_ROAD_VEHICLES                                          :{BLACK}Autovehiculele circulă...
 STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Alege partea strãzii pe care se circulã
-STR_02E9_DRIVE_ON_LEFT                                          :Pe partea stângã
-STR_02EA_DRIVE_ON_RIGHT                                         :Pe partea dreaptã
-STR_02EB_TOWN_NAMES                                             :{BLACK}Numele oraselor
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Alege partea străzii pe care se circulă
+STR_02E9_DRIVE_ON_LEFT                                          :Pe partea stângă
+STR_02EA_DRIVE_ON_RIGHT                                         :Pe partea dreaptă
+STR_02EB_TOWN_NAMES                                             :{BLACK}Numele oraÅŸelor
 STR_02EC                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Alege nationalitatea numelor oraselor
+STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Alege naţionalitatea numelor oraşelor
 
-STR_02F4_AUTOSAVE                                               :{BLACK}Salvare automatã
+STR_02F4_AUTOSAVE                                               :{BLACK}Salvare automată
 STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Alege intervalul scurs între salvãrile automate
-STR_02F7_OFF                                                    :Dezactivatã
+STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Alege intervalul de timp dintre salvările automate
+STR_02F7_OFF                                                    :Dezactivată
 STR_02F8_EVERY_3_MONTHS                                         :La fiecare 3 luni
 STR_02F9_EVERY_6_MONTHS                                         :La fiecare 6 luni
 STR_02FA_EVERY_12_MONTHS                                        :La fiecare 12 luni
 STR_02FB_START_A_NEW_GAME                                       :{BLACK}ÃŽncepere joc nou
-STR_02FC_LOAD_A_SAVED_GAME                                      :{BLACK}Incarca un joc salvat
-STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Creeazã un joc/scenariu propriu
-STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Alege un joc cu un singur jucãtor
-STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Alege un joc multiplayer cu 2-8 jucatori
-STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Afiseazã optiunile jocului
-STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Afiseaza optiunile pentru alegerea dificultãtii
+STR_02FC_LOAD_A_SAVED_GAME                                      :{BLACK}Încarcă un joc salvat
+STR_02FE_CREATE_A_CUSTOMIZED_GAME                               :{BLACK}Creează un joc/scenariu propriu
+STR_02FF_SELECT_SINGLE_PLAYER_GAME                              :{BLACK}Alege un joc cu un singur jucător
+STR_0300_SELECT_MULTIPLAYER_GAME                                :{BLACK}Alege un joc multiplayer cu 2-8 jucători
+STR_0301_DISPLAY_GAME_OPTIONS                                   :{BLACK}Afişează opţiunile jocului
+STR_0302_DISPLAY_DIFFICULTY_OPTIONS                             :{BLACK}Afişează opţiunile pentru alegerea dificultăţii
 STR_0303_START_A_NEW_GAME_USING                                 :{BLACK}ÃŽnceperea unui joc nou folosind un scenariu deja existent
-STR_0304_QUIT                                                   :{BLACK}Iesire
-STR_0305_QUIT_OPENTTD                                           :{BLACK}Iesi din 'OpenTTD'
+STR_0304_QUIT                                                   :{BLACK}IeÅŸire
+STR_0305_QUIT_OPENTTD                                           :{BLACK}IeÅŸi din 'OpenTTD'
 STR_0307_OPENTTD                                                :{WHITE}OpenTTD {REV}
-STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...se poate construi doar în orase
-STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Alege peisajul 'climã temperatã'
-STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Alege peisajul 'climã sub-arcticã'
-STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Alege peisajul 'climã sub-tropicalã'
-STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Alege peisajul 'tara jucãriilor'
-STR_0312_FUND_CONSTRUCTION_OF_NEW                               :{BLACK}Finanteazã constructia de industrii noi
+STR_030D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...se poate construi doar în oraşe
+STR_030E_SELECT_TEMPERATE_LANDSCAPE                             :{BLACK}Alege peisajul 'climă temperată'
+STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE                            :{BLACK}Alege peisajul 'climă sub-arctică'
+STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE                          :{BLACK}Alege peisajul 'climă sub-tropicală'
+STR_0311_SELECT_TOYLAND_LANDSCAPE                               :{BLACK}Alege peisajul 'ţara jucăriilor'
+STR_0312_FUND_CONSTRUCTION_OF_NEW                               :{BLACK}Finanţează construcţia de industrii noi
 
 ############ range for menu starts
 STR_INDUSTRY_DIR                                                :Lista industriilor
 STR_0313_FUND_NEW_INDUSTRY                                      :Obiectiv industrial nou
 ############ range ends here
 
-STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}Construieste un nou obiectiv ind.
+STR_0314_FUND_NEW_INDUSTRY                                      :{WHITE}ConstruieÅŸte un nou obiectiv industrial
 STR_JUST_STRING                                                 :{STRING}
-STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...se poate construi doar in orase
+STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...se poate construi doar în oraşe
 STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST                        :{WHITE}...se poate construi doar in padurile ecuatoriale
-STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...se poate construi doar in zonele de desert
-STR_0319_PAUSED                                                 :{YELLOW}* *  PAUZÃ  (F1) *  *
+STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT                            :{WHITE}...se poate construi doar în zonele de deşert
+STR_0319_PAUSED                                                 :{YELLOW}* *  PAUZÄ‚  (F1) *  *
 
-STR_031B_SCREENSHOT_SUCCESSFULLY                                :{WHITE}Screenshot salvat cu succes pe disc în fisierul '{STRING}'
-STR_031C_SCREENSHOT_FAILED                                      :{WHITE}Screenshot nerealizat!
+STR_031B_SCREENSHOT_SUCCESSFULLY                                :{WHITE}Imagine salvată cu succes pe disc în fişierul '{STRING}'
+STR_031C_SCREENSHOT_FAILED                                      :{WHITE}Imaginea nu a putut fi capturată!
 
-STR_0329_PURCHASE_LAND_FOR_FUTURE                               :{BLACK}Cumpãrã teren pentru folosire ulterioarã
-STR_032F_AUTOSAVE                                               :{RED}SALVARE AUTOMATÃ
+STR_0329_PURCHASE_LAND_FOR_FUTURE                               :{BLACK}Cumpără teren pentru folosire ulterioară
+STR_032F_AUTOSAVE                                               :{RED}SALVARE AUTOMATÄ‚
 STR_SAVING_GAME                                                 :{RED}*  *  SALVARE JOC *  *
 STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Salvarea se efectueaza încã,{}vã rugãm asteptati pânã se încheie!
-STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Selecteazã programul muzical 'Ezy Street'
+STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Selectează programul muzical 'Ezy Street'
 
 STR_0335_6                                                      :{BLACK}6
 STR_0336_7                                                      :{BLACK}7
@@ -928,7 +936,7 @@
 STR_OPTIONS_LANG_CBO                                            :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_OPTIONS_LANG_TIP                                            :{BLACK}Alege limba în care doresti afisatã interfata
 
-STR_OPTIONS_FULLSCREEN                                          :{BLACK}Mod
+STR_OPTIONS_FULLSCREEN                                          :{BLACK}Ecran intreg
 STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Bifeaza aceasta casuta pentru a juca in modul
 
 STR_OPTIONS_RES                                                 :{BLACK}Rezolutia ecranului
@@ -1020,7 +1028,7 @@
 STR_CONFIG_PATCHES_FORBID_90_DEG                                :{LTBLUE}Interzice trenurilor si navelor sa faca intoarceri de 90 de grade: {ORANGE}{STRING} {LTBLUE} (necesita NPF)
 STR_CONFIG_PATCHES_JOINSTATIONS                                 :{LTBLUE}Uneste gãrile alãturate: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FULLLOADANY                                  :{LTBLUE}Pãrãseste statia când orice tip de marfã este 'full load': {ORANGE}{STRING}
-STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Foloseste algoritmul de LOAD imbunatatit: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_IMPROVEDLOAD                                 :{LTBLUE}Foloseste algoritm incarcare imbunatatit: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_GRADUAL_LOADING                              :{LTBLUE}Incarca vehiculele gradual: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_INFLATION                                    :{LTBLUE}Inflatia: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SELECTGOODS                                  :{LTBLUE}Livreazã marfa doar in statiile unde aceasta este ceruta: {ORANGE}{STRING}
@@ -1040,6 +1048,7 @@
 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_ADJACENT_STATIONS                            :{LTBLUE}Permite construirea de statii adiacente: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Permite întotdeauna aeroporturi mici: {ORANGE}{STRING}
 
@@ -1081,16 +1090,22 @@
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Conecteaza bara de instrumente pentru peisaj cu cea de constructii feroviare/auto/aeriane: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Cand faci scroll cu mouse-ul muta ecranul in directia opusã: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Arata o bara de unelte de masuratori la folosirea uneltelor de constructie: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Arata unifromete companiilor: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Arata uniformele companiilor: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Niciunul
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Propria companie
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Toate companiile
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}Echipa preferata pentru chat <ENTER>: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Functia rotii mouse-ului: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Focus harta
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Ruleaza harta
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :inactiva
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Viteza harta la rotita mouse: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}La pornirea unui joc nou, pune-l pe pauza: {ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Nr. max. de trenuri pentru un jucãtor: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Nr. max. de trenuri per jucãtor: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Nr. max. de autovehicule pentru un jucãtor: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_AIRCRAFT                                 :{LTBLUE}Nr. max. de aeronave pentru un jucãtor: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Nr. max. de nave pentru un jucãtor: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAX_SHIPS                                    :{LTBLUE}Nr. max. de nave per jucãtor: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_AI_BUILDS_TRAINS                             :{LTBLUE}Dezactiveazã trenurile pentru jucãtorii PC: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH                            :{LTBLUE}Dezactiveazã autovehiculele pentru jucãtorii PC: {ORANGE}{STRING}
@@ -1119,15 +1134,33 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permite cumpararea de actiuni de la alte companii
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Plasare automatã a semnalelor la fiecare: {ORANGE}{STRING} pãtrãtele
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Construieste automat semafaore înainte de: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Apectul de oras "fara alte drumuri" nu este valid in editorul de scenarii
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Alege aspect drum-de-oras: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :fara alte drumuri
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :implicit
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :drumuri mai bune
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :grila 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :grila 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pozitia listei cu instrumente: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :stânga
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :centru
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :dreapta
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Distanta de 'snap' pentru ferestre: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Distanta de 'snap' pentru ferestre: {ORANGE}dezactivata
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Viteza de dezvoltare a orasului: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Deloc
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Lenta
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normala
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rapida
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Foarte rapida
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proportia oraselor care se vor dezvolta de doua ori mai repede: {ORANGE}1 in {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proportia oraselor care se vor dezvolta de doua ori mai repede: {ORANGE}None
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicator initial dimensiune oras: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfatã
-STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Constructie
+STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construcţie
 STR_CONFIG_PATCHES_VEHICLES                                     :{BLACK}Vehicule
 STR_CONFIG_PATCHES_STATIONS                                     :{BLACK}Statii
 STR_CONFIG_PATCHES_ECONOMY                                      :{BLACK}Economie
@@ -1165,7 +1198,7 @@
 STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Merge spre {WAYPOINT}, {VELOCITY}
 
 STR_GO_TO_WAYPOINT                                              :Mergi via {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT                                     :Mergi non-stop via {WAYPOINT}
+STR_GO_NON_STOP_TO_WAYPOINT                                     :Mergi fără oprire via {WAYPOINT}
 
 STR_WAYPOINTNAME_CITY                                           :Halta {TOWN}
 STR_WAYPOINTNAME_CITY_SERIAL                                    :Halta {TOWN} #{COMMA}
@@ -1204,6 +1237,7 @@
 STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Planteazã arbori din diverse specii la întâmplare
 
 STR_CANT_BUILD_CANALS                                           :{WHITE}Nu pot construi un canal aici...
+STR_BUILD_CANALS_TIP                                            :{BLACK}Construieste canale.
 STR_LANDINFO_CANAL                                              :Canal
 
 STR_CANT_BUILD_LOCKS                                            :{WHITE}Nu pot construi o ecluzã aici...
@@ -1497,190 +1531,205 @@
 ##id 0x0800
 STR_0800_COST                                                   :{TINYFONT}{RED}Cheltuieli: {CURRENCY}
 STR_0801_COST                                                   :{RED}Cheltuieli: {CURRENCY}
-STR_0802_INCOME                                                 :{TINYFONT}{GREEN}Încasãri: {CURRENCY}
-STR_0803_INCOME                                                 :{GREEN}Încasãri: {CURRENCY}
+STR_0802_INCOME                                                 :{TINYFONT}{GREEN}Venituri: {CURRENCY}
+STR_0803_INCOME                                                 :{GREEN}Venituri: {CURRENCY}
 STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}Transferã: {CURRENCY}
 STR_FEEDER                                                      :{YELLOW}Transferã: {CURRENCY}
 STR_0805_ESTIMATED_COST                                         :{WHITE}Cost estimat: {CURRENCY}
 STR_0807_ESTIMATED_INCOME                                       :{WHITE}Venit estimat: {CURRENCY}
-STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}Nu pot înãlta terenul...
-STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Nu pot sãpa terenul...
+STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}Nu pot înălţa terenul...
+STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}Nu pot coborî terenul...
 STR_080A_ROCKS                                                  :Stânci
 STR_080B_ROUGH_LAND                                             :Teren pietros
 STR_080C_BARE_LAND                                              :Teren viran
-STR_080D_GRASS                                                  :Verdeatã
+STR_080D_GRASS                                                  :Verdeaţă
 STR_080E_FIELDS                                                 :Teren agricol
-STR_080F_SNOW_COVERED_LAND                                      :Zãpadã
-STR_0810_DESERT                                                 :Desert
+STR_080F_SNOW_COVERED_LAND                                      :Teren înzăpezit
+STR_0810_DESERT                                                 :DeÅŸert
 
 ##id 0x1000
-STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION                         :{WHITE}Terenul are o înclinatie nepotrivitã
-STR_1001_IMPOSSIBLE_TRACK_COMBINATION                           :{WHITE}Combinatie de linii imposibilã
-STR_1002_EXCAVATION_WOULD_DAMAGE                                :{WHITE}Sãpãturile ar afecta tunelul
-STR_1003_ALREADY_AT_SEA_LEVEL                                   :{WHITE}Te afli deja la nivelul mãrii
+STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION                         :{WHITE}Terenul are o înclinaţie nepotrivită
+STR_1001_IMPOSSIBLE_TRACK_COMBINATION                           :{WHITE}Combinaţie de linii imposibilă
+STR_1002_EXCAVATION_WOULD_DAMAGE                                :{WHITE}Săpăturile ar afecta tunelul
+STR_1003_ALREADY_AT_SEA_LEVEL                                   :{WHITE}Deja la nivelul mării
 STR_1004_TOO_HIGH                                               :{WHITE}Prea înalt
-STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Cale feratã nepotrivitã
+STR_1005_NO_SUITABLE_RAILROAD_TRACK                             :{WHITE}Cale ferată nepotrivită
 STR_1007_ALREADY_BUILT                                          :{WHITE}...deja construit
-STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Mai intâi trebuie demolatã calea feratã
-STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Constructii feroviare
-STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Constructie Cale Feratã Electrificatã
-STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Constructii monorail
-STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}Constructii maglev
-STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Alege podul de cale feratã
-STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Nu pot construi un depou aici...
-STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Nu pot construi o garã aici...
+STR_1008_MUST_REMOVE_RAILROAD_TRACK                             :{WHITE}Mai întâi trebuie înlăturată calea ferată
+STR_100A_RAILROAD_CONSTRUCTION                                  :{WHITE}Construcţii feroviare
+STR_TITLE_ELRAIL_CONSTRUCTION                                   :{WHITE}Construcţie Cale Ferată Electrificată
+STR_100B_MONORAIL_CONSTRUCTION                                  :{WHITE}Construcţii monoşină
+STR_100C_MAGLEV_CONSTRUCTION                                    :{WHITE}Construcţii maglev
+STR_100D_SELECT_RAIL_BRIDGE                                     :{WHITE}Alege podul de cale ferată
+STR_100E_CAN_T_BUILD_TRAIN_DEPOT                                :{WHITE}Nu pot construi un depou feroviar aici...
+STR_100F_CAN_T_BUILD_RAILROAD_STATION                           :{WHITE}Nu pot construi o gară aici...
 STR_1010_CAN_T_BUILD_SIGNALS_HERE                               :{WHITE}Nu pot plasa semnale aici...
-STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Nu pot construi cale feratã aici...
-STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Nu pot demola calea feratã...
-STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Nu pot demola semnalele de aici...
-STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Orientarea depoului
-STR_1015_RAILROAD_CONSTRUCTION                                  :Constructii feroviare
-STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Constructie cale feratã electrificatã
-STR_1016_MONORAIL_CONSTRUCTION                                  :Constructii monorail
-STR_1017_MAGLEV_CONSTRUCTION                                    :Constructii maglev
-STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Construieste cale feratã
-STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Construieste un depou feroviar (pentru construire/service trenuri)
-STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Construieste garã
-STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Plaseazã semnale feroviare
-STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Construieste pod de cale feratã
-STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}Construieste tunel feroviar
-STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Comutator pentru constructie/demolare cãi ferate si semnale
+STR_1011_CAN_T_BUILD_RAILROAD_TRACK                             :{WHITE}Nu pot construi cale ferată aici...
+STR_1012_CAN_T_REMOVE_RAILROAD_TRACK                            :{WHITE}Nu pot înlătura calea ferată...
+STR_1013_CAN_T_REMOVE_SIGNALS_FROM                              :{WHITE}Nu pot înlătura semnalele de aici...
+STR_1014_TRAIN_DEPOT_ORIENTATION                                :{WHITE}Orientarea depoului feroviar
+STR_1015_RAILROAD_CONSTRUCTION                                  :Construcţii feroviare
+STR_TOOLB_ELRAIL_CONSTRUCTION                                   :Construcţie cale ferată electrificată
+STR_1016_MONORAIL_CONSTRUCTION                                  :Construcţii monoşină
+STR_1017_MAGLEV_CONSTRUCTION                                    :Construcţii maglev
+STR_1018_BUILD_RAILROAD_TRACK                                   :{BLACK}Construieşte cale ferată
+STR_1019_BUILD_TRAIN_DEPOT_FOR_BUILDING                         :{BLACK}Construieşte un depou feroviar (pentru construire şi întreţinere de trenuri)
+STR_101A_BUILD_RAILROAD_STATION                                 :{BLACK}Construieşte gară
+STR_101B_BUILD_RAILROAD_SIGNALS                                 :{BLACK}Plasează semnale feroviare
+STR_101C_BUILD_RAILROAD_BRIDGE                                  :{BLACK}Construieşte pod de cale ferată
+STR_101D_BUILD_RAILROAD_TUNNEL                                  :{BLACK}ConstruieÅŸte tunel feroviar
+STR_101E_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Comutator pentru construcţie/înlăturare căi ferate şi semnale
 STR_101F_BRIDGE_SELECTION_CLICK                                 :{BLACK}Alegere pod - clic pe podul selectat pentru a-l construi
 STR_1020_SELECT_RAILROAD_DEPOT_ORIENTATIO                       :{BLACK}Alege orientarea depoului
-STR_1021_RAILROAD_TRACK                                         :Cale feratã
-STR_1023_RAILROAD_TRAIN_DEPOT                                   :Depou de cale feratã
-STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...terenul se aflã in posesia altei companii
+STR_1021_RAILROAD_TRACK                                         :Cale ferată
+STR_1023_RAILROAD_TRAIN_DEPOT                                   :Depou de cale ferată
+STR_1024_AREA_IS_OWNED_BY_ANOTHER                               :{WHITE}...terenul se află în proprietatea altei companii
 STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS                          :Cale feratã cu semnale normale
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Cale feratã cu pre-semnalizare
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Cale feratã cu semnale de iesire
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Cale feratã cu semnale combinate
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Trebuie mai intai sa demolati gara
 
 
 
 ##id 0x1800
-STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Mai întâi trebuie demolatã soseaua
+STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Mai întâi trebuie înlăturată şoseaua
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Lucrari la drum in curs de desfasurare
-STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Constructii rutiere
+STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Construcţii rutiere
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Construcţie Tramvai
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Alege pod rutier
-STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Nu pot construi sosea aici...
-STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Nu pot demola soseaua...
+STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Nu pot construi ÅŸosea aici...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Nu pot construi şină de tramvai aici...
+STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Nu pot înlătura şoseaua...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Nu pot înlătura şina de tramvai de aici...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Orientarea autobazei
-STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Nu pot construi autobazã aici...
-STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Nu pot construi statie de autobuz...
-STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Nu pot construi platformã pentru camioane...
-STR_180A_ROAD_CONSTRUCTION                                      :Constructii rutiere
-STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construieste sectiune de sosea
-STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construieste o autobazã (pentru construire/service autovehicule)
-STR_180D_BUILD_BUS_STATION                                      :{BLACK}Plaseazã statie de autobuz
-STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Construieste platformã pentru camioane
-STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Construieste pod rutier
-STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Construieste tunel rutier
-STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Comutator pentru constructie/demolare sosele
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Orientarea Depoului de Tramvaie
+STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Nu pot construi autobază aici...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Nu pot construi depou de tramvaie aici...
+STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Nu pot construi staţie de autobuz...
+STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Nu pot construi platformă pentru camioane...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Nu pot construi staţie de tramvai aici...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Nu pot construi staţie de tramvai aici...
+STR_180A_ROAD_CONSTRUCTION                                      :Construcţii rutiere
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Construcţie tramvai
+STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Construieşte secţiune de şosea
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Construcieşte şină de tramvai
+STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Construieşte o autobază (pentru construire şi întreţinere de autovehicule)
+STR_180D_BUILD_BUS_STATION                                      :{BLACK}Plasează staţie de autobuz
+STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Construieşte platformă pentru camioane
+STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}ConstruieÅŸte pod rutier
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}ConstruieÅŸte pod pentru tramvaie
+STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}ConstruieÅŸte tunel rutier
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}ConstruieÅŸte tunel pentru tramvaie
+STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Comutator pentru construcţie/înlăturare şosele
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Alege orientarea autobazei
-STR_1814_ROAD                                                   :Stradã
-STR_1815_ROAD_WITH_STREETLIGHTS                                 :Stradã iluminatã
-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_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Alege orientarea depoului de tramvaie
+STR_1814_ROAD                                                   :Åžosea
+STR_1815_ROAD_WITH_STREETLIGHTS                                 :Stradă iluminată
+STR_1816_TREE_LINED_ROAD                                        :Stradă cu copaci pe margine
+STR_1817_ROAD_VEHICLE_DEPOT                                     :Autobază
+STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Trecere 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...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Nu pot înlătura staţia de tramvai...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Nu pot înlătura staţia de tramvai...
 
 ##id 0x2000
-STR_2000_TOWNS                                                  :{WHITE}Orase
+STR_2000_TOWNS                                                  :{WHITE}OraÅŸe
 STR_TOWN_LABEL_POP                                              :{WHITE}{TOWN} ({COMMA})
 STR_TOWN_LABEL                                                  :{WHITE}{TOWN}
 STR_TOWN_LABEL_TINY_BLACK                                       :{TINYFONT}{BLACK}{TOWN}
 STR_TOWN_LABEL_TINY_WHITE                                       :{TINYFONT}{WHITE}{TOWN}
 STR_2002                                                        :{TINYFONT}{BLACK}{STRING}
-STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Mai întâi trebuie sã demolezi clãdirea
+STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}Mai întâi trebuie demolată clădirea
 STR_2005                                                        :{WHITE}{TOWN}
-STR_2006_POPULATION                                             :{BLACK}Populatia: {ORANGE}{COMMA}{BLACK}  Locuinte: {ORANGE}{COMMA}
-STR_2007_RENAME_TOWN                                            :Redenumire
-STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Nu pot redenumi orasul...
-STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}Autoritãtile locale din {TOWN} refuzã sã permitã acest lucru
-STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Numele oraselor - clic pe un nume pentru a centra imaginea pe orasul respectiv
-STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Mutã imaginea pe locatia orasului
-STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Schimbã numele orasului
-STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}Calatori luna trecuta: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
-STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}Colete postale luna trecuta: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
-STR_200F_TALL_OFFICE_BLOCK                                      :Clãdire înaltã de birouri
-STR_2010_OFFICE_BLOCK                                           :Clãdire de birouri
-STR_2011_SMALL_BLOCK_OF_FLATS                                   :Clãdire micã de birouri
-STR_2012_CHURCH                                                 :Bisericã
-STR_2013_LARGE_OFFICE_BLOCK                                     :Clãdire mare de birouri
+STR_2006_POPULATION                                             :{BLACK}Populaţia: {ORANGE}{COMMA}{BLACK}  Locuinţe: {ORANGE}{COMMA}
+STR_2007_RENAME_TOWN                                            :Redenumire oraÅŸ
+STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Nu pot redenumi oraÅŸul...
+STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}Autorităţile locale din {TOWN} refuză să permită această acţiune
+STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}Numele oraÅŸelor - clic pe un nume pentru a centra imaginea pe oraÅŸul respectiv
+STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Mută imaginea pe locaţia oraşului
+STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Schimbă numele oraşului
+STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}Călători luna trecută: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
+STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}Colete poştale luna trecută: {ORANGE}{COMMA}{BLACK}  max: {ORANGE}{COMMA}
+STR_200F_TALL_OFFICE_BLOCK                                      :Clădire înaltă de birouri
+STR_2010_OFFICE_BLOCK                                           :Clădire de birouri
+STR_2011_SMALL_BLOCK_OF_FLATS                                   :Bloc mic de apartamente
+STR_2012_CHURCH                                                 :Biserică
+STR_2013_LARGE_OFFICE_BLOCK                                     :Clădire mare de birouri
 STR_2014_TOWN_HOUSES                                            :Case
 STR_2015_HOTEL                                                  :Hotel
 STR_2016_STATUE                                                 :Statuie
-STR_2017_FOUNTAIN                                               :Fântânã
+STR_2017_FOUNTAIN                                               :Fântână
 STR_2018_PARK                                                   :Parc
-STR_2019_OFFICE_BLOCK                                           :Clãdire de birouri
-STR_201A_SHOPS_AND_OFFICES                                      :Magazine si birouri
-STR_201B_MODERN_OFFICE_BUILDING                                 :Clãdire modernã de birouri
+STR_2019_OFFICE_BLOCK                                           :Clădire de birouri
+STR_201A_SHOPS_AND_OFFICES                                      :Magazine ÅŸi birouri
+STR_201B_MODERN_OFFICE_BUILDING                                 :Clădire modernă de birouri
 STR_201C_WAREHOUSE                                              :Depozit
 STR_201D_OFFICE_BLOCK                                           :Bloc de birouri
 STR_201E_STADIUM                                                :Stadion
 STR_201F_OLD_HOUSES                                             :Case vechi
-STR_2020_LOCAL_AUTHORITY                                        :{BLACK}Autoritate loc.
-STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}Afiseazã informatii referitoare la autoritatea localã
-STR_2022_LOCAL_AUTHORITY                                        :{WHITE}Autoritatea localã din {TOWN}
-STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Ratingul companiilor de transport:
+STR_2020_LOCAL_AUTHORITY                                        :{BLACK}Autoritate locală
+STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}Afişează informaţii referitoare la autoritatea locală
+STR_2022_LOCAL_AUTHORITY                                        :{WHITE}Autoritatea locală din {TOWN}
+STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}Evaluarea companiilor de transport:
 STR_2024                                                        :{YELLOW}{COMPANY}{PLAYERNAME}: {ORANGE}{STRING}
-STR_2025_SUBSIDIES                                              :{WHITE}Subventii (F6)
-STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Subventii disponibile:
+STR_2025_SUBSIDIES                                              :{WHITE}Subvenţii (F6)
+STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Subvenţii disponibile:
 STR_2027_FROM_TO                                                :{ORANGE}- {STRING} de la {STRING} la {STRING}
-STR_2028_BY                                                     :{YELLOW} (data limitã: {DATE_SHORT})
+STR_2028_BY                                                     :{YELLOW} (data limită: {DATE_SHORT})
 STR_202A_NONE                                                   :{ORANGE}- nici una
-STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Subventii acordate la ora actualã:
+STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}Subvenţii acordate la ora actuală:
 STR_202C_FROM_TO                                                :{ORANGE}- {STRING} de la {STATION} la {STATION}{YELLOW} ({COMPANY}
-STR_202D_UNTIL                                                  :{YELLOW}, pânã în {DATE_SHORT})
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Ofertã expiratã:{}{}Transportul de {STRING} de la {STRING} la {STRING} nu va mai fi subventionat
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Ofertã închisã:{}{}Transportul de {STRING} de la {STATION} la {STATION} nu va mai fi subventionat
-STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Subventie oferitã:{}{}Primul transport de {STRING} de la {STRING} la {STRING} va atrage subventionarea pe un an din partea autoritãtilor locale
-STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subventie acordatã companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasãri cu 50% mai mari timp de un an!
-STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subventie acordatã companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasãri duble timp de un an!
-STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subventie acordatã companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasãri triple timp de un an!
-STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subventie acordatã companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasãri de patru ori mai mari timp de un an!
-STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}Autoritatea localã din {TOWN} refuzã sã permitã construirea unui nou aeroport în acest oras
-STR_2036_COTTAGES                                               :Cãsute
+STR_202D_UNTIL                                                  :{YELLOW}, până în {DATE_SHORT})
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Ofertă expirată:{}{}Transportul de {STRING} de la {STRING} la {STRING} nu va mai primi subvenţie
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Ofertă închisă:{}{}Transportul de {STRING} de la {STATION} la {STATION} nu va mai fi subvenţionat
+STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Subvenţie oferită:{}{}Primul transport de {STRING} de la {STRING} la {STRING} va primi o subvenţie pe un an din partea autorităţilor locale
+STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvenţie acordată companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasări cu 50% mai mari timp de un an!
+STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvenţie acordată companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasări duble timp de un an!
+STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvenţie acordată companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasări triple timp de un an!
+STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}Subvenţie acordată companiei {COMPANY}!{}{}Transportul de {STRING} de la {STATION} la {STATION} va aduce încasări de patru ori mai mari timp de un an!
+STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}Autoritatea locală din {TOWN} refuză să permită construirea unui nou aeroport în acest oraş
+STR_2036_COTTAGES                                               :Căsuţe
 STR_2037_HOUSES                                                 :Case
 STR_2038_FLATS                                                  :Blocuri
-STR_2039_TALL_OFFICE_BLOCK                                      :Clãdire înaltã de birouri
-STR_203A_SHOPS_AND_OFFICES                                      :Magazine si birouri
-STR_203B_SHOPS_AND_OFFICES                                      :Magazine si birouri
+STR_2039_TALL_OFFICE_BLOCK                                      :Clădire înaltă de birouri
+STR_203A_SHOPS_AND_OFFICES                                      :Magazine ÅŸi birouri
+STR_203B_SHOPS_AND_OFFICES                                      :Magazine ÅŸi birouri
 STR_203C_THEATER                                                :Teatru
 STR_203D_STADIUM                                                :Stadion
 STR_203E_OFFICES                                                :Birouri
 STR_203F_HOUSES                                                 :Case
-STR_2040_CINEMA                                                 :Cinema
+STR_2040_CINEMA                                                 :Cinematograf
 STR_2041_SHOPPING_MALL                                          :Centru comercial
 STR_2042_DO_IT                                                  :{BLACK}Alege
-STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Lista de actiuni disponibile pentru acest oras - clic pe fiecare pentru mai multe detalii
-STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}Activeazã actiunea selectatã din listã
-STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}Actiuni disponibile:
-STR_2046_SMALL_ADVERTISING_CAMPAIGN                             :Campanie publicitarã micã
-STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :Campanie publicitarã medie
-STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :Campanie publicitarã mare
-STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :Finanteazã reconstructia strãzilor
-STR_204A_BUILD_STATUE_OF_COMPANY                                :Ridicã un monument dedicat presedintelui companiei
-STR_204B_FUND_NEW_BUILDINGS                                     :Finanteazã constructia de noi clãdiri
-STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :Cumpãrã drepturile exclusive de transport
+STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}Lista de acţiuni disponibile pentru acest oraş - clic pe fiecare pentru mai multe detalii
+STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}Activează acţiunea selectată din listă
+STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}Acţiuni disponibile:
+STR_2046_SMALL_ADVERTISING_CAMPAIGN                             :Campanie publicitară mică
+STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :Campanie publicitară medie
+STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :Campanie publicitară mare
+STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :Finanţează reconstrucţia străzilor
+STR_204A_BUILD_STATUE_OF_COMPANY                                :Ridică un monument dedicat preşedintelui companiei
+STR_204B_FUND_NEW_BUILDINGS                                     :Finanţează construcţia de noi clădiri
+STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :Cumpără drepturi exclusive de transport
 STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY                              :Mituieste autoritatea localã
-STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Initiazã o campanie publicitarã micã pentru a atrage mai multi pasageri si mai multe mãrfuri spre compania ta.{}  Cost: {CURRENCY}
-STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Initiazã o campanie publicitarã medie pentru a atrage mai multi pasageri si mai multe mãrfuri spre compania ta.{}  Cost: {CURRENCY}
-STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Initiazã o mare campanie publicitarã pentru a atrage mai multi pasageri si mai multe mãrfuri spre compania ta.{}  Cost: {CURRENCY}
-STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} Finanteazã reconstructia strãzilor locale. Acest lucru cauzeazã devieri majore ale traficului rutier timp de 6 luni.{}  Cost: {CURRENCY}
-STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Înaltã o statuie în cinstea companiei tale.{} Cost: {CURRENCY}
-STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Finanteazã constructia de noi clãdiri comerciale în oras.{}  Cost: {CURRENCY}
-STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Cumpãrã drepturile exclusive în acest oras pe o perioadã de un an. Autoritãtile locale vor folosi doar compania ta pentru transportul de pasageri si mãrfuri.{} Cost: {CURRENCY}
+STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Iniţiază o campanie publicitară mică pentru a atrage mai mulţi călători şi mai multe mărfuri spre compania ta.{}  Cost: {CURRENCY}
+STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Iniţiază o campanie publicitară medie pentru a atrage mai mulţi călători şi mai multe mărfuri spre compania ta.{}  Cost: {CURRENCY}
+STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Iniţiază o mare campanie publicitară pentru a atrage mai mulţi călători şi mai multe mărfuri spre compania ta.{}  Cost: {CURRENCY}
+STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} Finanţează reconstrucţia străzilor locale. Acest lucru cauzează perturbări majore ale traficului rutier timp de până la 6 luni.{}  Cost: {CURRENCY}
+STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Înalţă o statuie în cinstea companiei tale.{} Cost: {CURRENCY}
+STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Finanţează construcţia de noi clădiri comerciale în oraş.{}  Cost: {CURRENCY}
+STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Cumpără drepturi exclusive în acest oraş pe o perioadă de un an. Autorităţile locale vor permite doar companiei tale să transporte călători şi mărfuri.{} Cost: {CURRENCY}
 STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} Mituieste autoritãtile locale pentru a-ti îmbunãtãti ratingul, dar cu riscul de a fi prins si de a plãti amenzi serioase.{}  Cost: {CURRENCY}
-STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}Haos pe strãzile din {TOWN}!{}{}Programul finantat de {COMPANY} pentru reconstructia strãzilor, aduce 6 luni de haos participantilor la trafic!
+STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}Haos pe străzile din {TOWN}!{}{}Programul finanţat de {COMPANY} pentru reconstrucţia străzilor aduce 6 luni de haos participanţilor la trafic!
 STR_2056                                                        :{TINYFONT}{WHITE}{TOWN}
 STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
-STR_2058_UNDER_CONSTRUCTION                                     :{STRING} (în constructie)
+STR_2058_UNDER_CONSTRUCTION                                     :{STRING} (în construcţie)
 STR_2059_IGLOO                                                  :Iglu
 STR_205A_TEPEES                                                 :Corturi
-STR_205B_TEAPOT_HOUSE                                           :Casã-ceainic
-STR_205C_PIGGY_BANK                                             :Pusculitã
+STR_205B_TEAPOT_HOUSE                                           :Casă-ceainic
+STR_205C_PIGGY_BANK                                             :Puşculiţă
 
 STR_INDUSTRY                                                    :{INDUSTRY}
 STR_TOWN                                                        :{TOWN}
@@ -1689,50 +1738,50 @@
 
 ##id 0x2800
 STR_LANDSCAPING                                                 :Modificare peisaj
-STR_2800_PLANT_TREES                                            :Planteazã arbori
-STR_2801_PLACE_SIGN                                             :Plaseazã semn
+STR_2800_PLANT_TREES                                            :Plantează arbori
+STR_2801_PLACE_SIGN                                             :Plasează semn
 STR_2802_TREES                                                  :{WHITE}Arbori
-STR_2803_TREE_ALREADY_HERE                                      :{WHITE}...sunt deja plantati arbori
-STR_2804_SITE_UNSUITABLE                                        :{WHITE}...locatie nepotrivitã
+STR_2803_TREE_ALREADY_HERE                                      :{WHITE}...sunt deja plantaţi arbori
+STR_2804_SITE_UNSUITABLE                                        :{WHITE}...locaţie nepotrivită
 STR_2805_CAN_T_PLANT_TREE_HERE                                  :{WHITE}Nu pot planta arbori aici...
 STR_2806                                                        :{WHITE}{STRING}
 STR_2808_TOO_MANY_SIGNS                                         :{WHITE}...prea multe semne
 STR_2809_CAN_T_PLACE_SIGN_HERE                                  :{WHITE}Nu pot plasa un semn aici...
 STR_280A_SIGN                                                   :Semn
-STR_280B_EDIT_SIGN_TEXT                                         :{WHITE}Editeazã textul semnului
+STR_280B_EDIT_SIGN_TEXT                                         :{WHITE}Editează textul semnului
 STR_280C_CAN_T_CHANGE_SIGN_NAME                                 :{WHITE}Nu pot schimba numele semnului...
-STR_280D_SELECT_TREE_TYPE_TO_PLANT                              :{BLACK}Alege specia de arbori plantati
+STR_280D_SELECT_TREE_TYPE_TO_PLANT                              :{BLACK}Alege specia de arbori de plantat
 STR_280E_TREES                                                  :Arbori
-STR_280F_RAINFOREST                                             :Pãdure tropicalã
-STR_2810_CACTUS_PLANTS                                          :Cactusi
+STR_280F_RAINFOREST                                             :Pădure tropicală
+STR_2810_CACTUS_PLANTS                                          :CactuÅŸi
 
 ##id 0x3000
-STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Alege tipul de garã
+STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}Alege tipul de gară
 STR_3001_AIRPORT_SELECTION                                      :{WHITE}Alege tipul de aeroport
 STR_3002_ORIENTATION                                            :{BLACK}Orientarea
-STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}Numãr de linii
+STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}Număr de linii
 STR_3004_PLATFORM_LENGTH                                        :{BLACK}Lungimea liniilor
-STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD                          :{WHITE}Prea aproape de altã garã
-STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING                         :{WHITE}Este adiacentã mai multor statii
-STR_3007_TOO_MANY_STATIONS_LOADING                              :{WHITE}Prea multe statii in acest oras
-STR_3008_TOO_MANY_STATIONS_LOADING                              :{WHITE}Prea multe statii
-STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Prea multe statii de autobuz
-STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Prea multe statii de camion
-STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Prea aproape de altã statie
+STR_3005_TOO_CLOSE_TO_ANOTHER_RAILROAD                          :{WHITE}Prea aproape de altă gară
+STR_3006_ADJOINS_MORE_THAN_ONE_EXISTING                         :{WHITE}Este adiacentă mai multor staţii
+STR_3007_TOO_MANY_STATIONS_LOADING                              :{WHITE}Prea multe staţii în acest oraş
+STR_3008_TOO_MANY_STATIONS_LOADING                              :{WHITE}Prea multe staţii
+STR_3008A_TOO_MANY_BUS_STOPS                                    :{WHITE}Prea multe staţii de autobuz
+STR_3008B_TOO_MANY_TRUCK_STOPS                                  :{WHITE}Prea multe staţii de camion
+STR_3009_TOO_CLOSE_TO_ANOTHER_STATION                           :{WHITE}Prea aproape de altă staţie
 STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
-STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Mai întâi trebuie demolatã gara
+STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}Mai întâi trebuie demolată gara
 STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT                           :{WHITE}Prea aproape de alt aeroport
 STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}Mai întâi trebuie demolat aeroportul
 
-STR_3030_RENAME_STATION_LOADING                                 :Redenumeste statia
-STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Nu pot redenumi statia...
-STR_3032_RATINGS                                                :{BLACK}Ratinguri
-STR_3033_ACCEPTS                                                :{BLACK}Acceptã
-STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}Ratingul serviciilor de transport local:
+STR_3030_RENAME_STATION_LOADING                                 :Redenumeşte staţia
+STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}Nu pot redenumi staţia...
+STR_3032_RATINGS                                                :{BLACK}Evaluări
+STR_3033_ACCEPTS                                                :{BLACK}Acceptă
+STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}Evaluarea serviciilor de transport local:
 
 ############ range for rating starts
 STR_3035_APPALLING                                              :Deplorabil
-STR_3036_VERY_POOR                                              :Foarte scãzut
+STR_3036_VERY_POOR                                              :Foarte scăzut
 STR_3037_POOR                                                   :Slab
 STR_3038_MEDIOCRE                                               :Mediocru
 STR_3039_GOOD                                                   :Bun
@@ -1742,47 +1791,53 @@
 ############ range for rating ends
 
 STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
-STR_303E_NO_LONGER_ACCEPTS                                      :{WHITE}{STATION} nu mai acceptã {STRING}
-STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} nu mai acceptã {STRING} sau {STRING}
-STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} acceptã acum {STRING}
-STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} acceptã acum {STRING} si {STRING}
-STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Orientarea statiei
-STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Orientarea statiei
-STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Mai intâi trebuie demolatã statia de autbuz
-STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Mai intâi trebuie demolatã platforma pentru camioane
-STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Statii
+STR_303E_NO_LONGER_ACCEPTS                                      :{WHITE}{STATION} nu mai acceptă {STRING}
+STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} nu mai acceptă {STRING} sau {STRING}
+STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} acceptă acum {STRING}
+STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} acceptă acum {STRING} si {STRING}
+STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Orientarea staţiei
+STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Orientarea platformei de camioane
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Orientarea staţiei de tramvai pentru călători
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Orientarea staţiei de tramvai pentru marfă
+STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Mai întâi trebuie demolată staţia de autobuz
+STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Mai întâi trebuie demolată platforma pentru camioane
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Mai întâi trebuie demolată staţia de tramvai
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Mai întâi trebuie demolată staţia de tramvai
+STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Staţi{P e i}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Nici una -
-STR_304B_SITE_UNSUITABLE                                        :{WHITE}...locatie nepotrivitã
+STR_304B_SITE_UNSUITABLE                                        :{WHITE}...locaţie nepotrivită
 STR_304C_TOO_CLOSE_TO_ANOTHER_DOCK                              :{WHITE}Prea aproape de alt port
-STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Mai intai trebuie demolat portul
-STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Alege orientarea gãrii
-STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Alege numãrul de linii al gãrii
-STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Alege lungimea liniilor gãrii
-STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Alege orientarea statiei de autobuz
+STR_304D_MUST_DEMOLISH_DOCK_FIRST                               :{WHITE}Mai întâi trebuie demolat portul
+STR_304E_SELECT_RAILROAD_STATION                                :{BLACK}Alege orientarea gării
+STR_304F_SELECT_NUMBER_OF_PLATFORMS                             :{BLACK}Alege numărul de linii al gării
+STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Alege lungimea liniilor gării
+STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Alege orientarea staţiei de autobuz
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Alege orientarea platformei pentru camioane
-STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centreazã imaginea pe locatia statiei
-STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Afiseazã ratingurile statiei
-STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Schimbã numele statiei
-STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO                            :{BLACK}Afiseazã lista de încarcãturi acceptate
-STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Numele statiilor - clic pe un nume pentru a centra imaginea pe statia respectivã
-STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT                            :{BLACK}Alege tipul de aeroport
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Alege orientarea staţiei de tramvai
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Alege orientarea staţiei de tramvai
+STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centrează imaginea pe locaţia staţiei
+STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Afişează evaluările staţiei
+STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Schimbă numele staţiei
+STR_3056_SHOW_LIST_OF_ACCEPTED_CARGO                            :{BLACK}Afişează lista de încărcături acceptate
+STR_3057_STATION_NAMES_CLICK_ON                                 :{BLACK}Numele staţiilor - clic pe un nume pentru a centra imaginea pe staţia respectivă
+STR_3058_SELECT_SIZE_TYPE_OF_AIRPORT                            :{BLACK}Alege tipul şi mărimea aeroportului
 STR_305C_0                                                      :{STATION} {STATIONFEATURES}
 STR_STATION_SIGN_TINY                                           :{TINYFONT}{STATION}
-STR_305E_RAILROAD_STATION                                       :Garã
+STR_305E_RAILROAD_STATION                                       :Gară
 STR_305F_AIRCRAFT_HANGAR                                        :Hangar
 STR_3060_AIRPORT                                                :Aeroport
-STR_3061_TRUCK_LOADING_AREA                                     :Platformã pentru camioane
-STR_3062_BUS_STATION                                            :Statie de autobuz
+STR_3061_TRUCK_LOADING_AREA                                     :Platformă pentru camioane
+STR_3062_BUS_STATION                                            :Staţie de autobuz
 STR_3063_SHIP_DOCK                                              :Port
-STR_3064_HIGHLIGHT_COVERAGE_AREA                                :{BLACK}Aratã aria de acoperire a locatiei propuse
-STR_3065_DON_T_HIGHLIGHT_COVERAGE                               :{BLACK}Nu arãta aria de acoperire a locatiei propuse
-STR_3066_COVERAGE_AREA_HIGHLIGHT                                :{BLACK}Aratã aria de acoperire
+STR_3064_HIGHLIGHT_COVERAGE_AREA                                :{BLACK}Arată aria de acoperire a locaţiei propuse
+STR_3065_DON_T_HIGHLIGHT_COVERAGE                               :{BLACK}Nu arăta aria de acoperire a locaţiei propuse
+STR_3066_COVERAGE_AREA_HIGHLIGHT                                :{BLACK}Aria de acoperire
 STR_3068_DOCK                                                   :{WHITE}Port
-STR_3069_BUOY                                                   :Balizã
-STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...balizã în cale
-STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...statie prea mare
-STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...statii neuniforme dezactivat
+STR_3069_BUOY                                                   :Baliză
+STR_306A_BUOY_IN_THE_WAY                                        :{WHITE}...baliză în cale
+STR_306C_STATION_TOO_SPREAD_OUT                                 :{WHITE}...staţie prea mare
+STR_306D_NONUNIFORM_STATIONS_DISALLOWED                         :{WHITE}...staţiile neuniforme nu sunt permise
 STR_USE_CTRL_TO_SELECT_MORE                                     :{BLACK}Tine apãsat CTRL pentru a alege mai mult decât un obiect
 
 STR_UNDEFINED                                                   :(sir nedefinit)
@@ -1790,75 +1845,75 @@
 STR_STAT_CLASS_WAYP                                             :Punct itinerar
 
 ##id 0x3800
-STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Orientarea santierului naval
-STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...trebuie construit pe apã
-STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Nu pot construi un santier naval aici...
-STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Alege orientarea santierului naval
-STR_3804_WATER                                                  :Apã
-STR_3805_COAST_OR_RIVERBANK                                     :Mal/Coastã
-STR_3806_SHIP_DEPOT                                             :Santier naval
-STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Nu pot construi pe apã
+STR_3800_SHIP_DEPOT_ORIENTATION                                 :{WHITE}Orientarea ÅŸantierului naval
+STR_3801_MUST_BE_BUILT_ON_WATER                                 :{WHITE}...trebuie construit pe apă
+STR_3802_CAN_T_BUILD_SHIP_DEPOT                                 :{WHITE}Nu pot construi un ÅŸantier naval aici...
+STR_3803_SELECT_SHIP_DEPOT_ORIENTATION                          :{BLACK}Alege orientarea ÅŸantierului naval
+STR_3804_WATER                                                  :Apă
+STR_3805_COAST_OR_RIVERBANK                                     :Mal/Coastă
+STR_3806_SHIP_DEPOT                                             :Åžantier naval
+STR_3807_CAN_T_BUILD_ON_WATER                                   :{WHITE}...Nu pot construi pe apă
 
 ##id 0x4000
-STR_4000_SAVE_GAME                                              :{WHITE}Salveazã joc
-STR_4001_LOAD_GAME                                              :{WHITE}Încarcã joc
-STR_4002_SAVE                                                   :{BLACK}Salveazã
-STR_4003_DELETE                                                 :{BLACK}Sterge
+STR_4000_SAVE_GAME                                              :{WHITE}Salvează joc
+STR_4001_LOAD_GAME                                              :{WHITE}Încarcă joc
+STR_4002_SAVE                                                   :{BLACK}Salvează
+STR_4003_DELETE                                                 :{BLACK}Åžterge
 STR_4004                                                        :{COMPANY}, {DATE_LONG}
-STR_4005_BYTES_FREE                                             :{BLACK}{COMMA} megabytes liberi
-STR_4006_UNABLE_TO_READ_DRIVE                                   :{BLACK}Nu pot citi acest drive
-STR_4007_GAME_SAVE_FAILED                                       :{WHITE}Salvarea jocului esuatã
-STR_4008_UNABLE_TO_DELETE_FILE                                  :{WHITE}Stergerea jocului esuatã
-STR_4009_GAME_LOAD_FAILED                                       :{WHITE}Încãrcarea jocului esuatã
-STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Lista de drive-uri, directoare si fisiere cu jocuri salvate
+STR_4005_BYTES_FREE                                             :{BLACK}{COMMA} megabyte{P "" s} liberi
+STR_4006_UNABLE_TO_READ_DRIVE                                   :{BLACK}Nu pot citi acest disc
+STR_4007_GAME_SAVE_FAILED                                       :{WHITE}Salvarea jocului eşuată
+STR_4008_UNABLE_TO_DELETE_FILE                                  :{WHITE}Ştergerea jocului eşuată
+STR_4009_GAME_LOAD_FAILED                                       :{WHITE}Încărcarea jocului eşuată
+STR_400A_LIST_OF_DRIVES_DIRECTORIES                             :{BLACK}Lista de discuri, directoare ÅŸi fiÅŸiere cu jocuri salvate
 STR_400B_CURRENTLY_SELECTED_NAME                                :{BLACK}Numele selectat pentru un joc salvat
-STR_400C_DELETE_THE_CURRENTLY_SELECTED                          :{BLACK}Sterge jocul salvat selectat
-STR_400D_SAVE_THE_CURRENT_GAME_USING                            :{BLACK}Salveazã cu numele selectat jocul curent
+STR_400C_DELETE_THE_CURRENTLY_SELECTED                          :{BLACK}Åžterge jocul salvat selectat
+STR_400D_SAVE_THE_CURRENT_GAME_USING                            :{BLACK}Salvează cu numele selectat jocul curent
 STR_400E_SELECT_NEW_GAME_TYPE                                   :{WHITE}Alege tipul noului joc
-STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Alege un scenariu (verde), joc predefinit (albastru) sau o hartã aleatoare
-STR_4010_GENERATE_RANDOM_NEW_GAME                               :Genereazã o hartã aleatoare
-STR_4011_LOAD_HEIGHTMAP                                         :{WHITE}Incarca harta inaltimilor
+STR_400F_SELECT_SCENARIO_GREEN_PRE                              :{BLACK}Alege un scenariu (verde), un joc predefinit (albastru) sau o hartă aleatoare
+STR_4010_GENERATE_RANDOM_NEW_GAME                               :Generează o hartă aleatoare
+STR_4011_LOAD_HEIGHTMAP                                         :{WHITE}Încarcă harta înălţimilor
 
 ##id 0x4800
 STR_4800_IN_THE_WAY                                             :{WHITE}{STRING} în cale
 STR_4801                                                        :{WHITE}{INDUSTRY}
-STR_4802_COAL_MINE                                              :Minã de cãrbune
-STR_4803_POWER_STATION                                          :Termocentralã
-STR_4804_SAWMILL                                                :Exploatatie forestierã
-STR_4805_FOREST                                                 :Pãdure
-STR_4806_OIL_REFINERY                                           :Rafinãrie
-STR_4807_OIL_RIG                                                :Platformã petrolierã
-STR_4808_FACTORY                                                :Fabricã de conserve
+STR_4802_COAL_MINE                                              :Mină de cărbune
+STR_4803_POWER_STATION                                          :Termocentrală
+STR_4804_SAWMILL                                                :Exploataţie forestieră
+STR_4805_FOREST                                                 :Pădure
+STR_4806_OIL_REFINERY                                           :Rafinărie
+STR_4807_OIL_RIG                                                :Platformă petrolieră
+STR_4808_FACTORY                                                :Fabrică de conserve
 STR_4809_PRINTING_WORKS                                         :Tipografie
-STR_480A_STEEL_MILL                                             :Otelãrie
-STR_480B_FARM                                                   :Fermã
-STR_480C_COPPER_ORE_MINE                                        :Minã de cupru
-STR_480D_OIL_WELLS                                              :Sonde
-STR_480E_BANK                                                   :Bancã
+STR_480A_STEEL_MILL                                             :Oţelărie
+STR_480B_FARM                                                   :Fermă
+STR_480C_COPPER_ORE_MINE                                        :Mină de cupru
+STR_480D_OIL_WELLS                                              :Sonde de petrol
+STR_480E_BANK                                                   :Bancă
 STR_480F_FOOD_PROCESSING_PLANT                                  :Combinat alimentar
-STR_4810_PAPER_MILL                                             :Fabricã de hârtie
-STR_4811_GOLD_MINE                                              :Minã de aur
-STR_4812_BANK                                                   :Bancã
-STR_4813_DIAMOND_MINE                                           :Minã de diamante
-STR_4814_IRON_ORE_MINE                                          :Minã de fier
-STR_4815_FRUIT_PLANTATION                                       :Livadã
-STR_4816_RUBBER_PLANTATION                                      :Plantatie de cauciuc
+STR_4810_PAPER_MILL                                             :Fabrică de hârtie
+STR_4811_GOLD_MINE                                              :Mină de aur
+STR_4812_BANK                                                   :Bancă
+STR_4813_DIAMOND_MINE                                           :Mină de diamante
+STR_4814_IRON_ORE_MINE                                          :Mină de fier
+STR_4815_FRUIT_PLANTATION                                       :Livadă
+STR_4816_RUBBER_PLANTATION                                      :Plantaţie de cauciuc
 STR_4817_WATER_SUPPLY                                           :Rezervor
-STR_4818_WATER_TOWER                                            :Turn de apã
-STR_4819_FACTORY                                                :Fabricã de conserve
-STR_481A_FARM                                                   :Fermã
-STR_481B_LUMBER_MILL                                            :Fabricã de cherestea
-STR_481C_COTTON_CANDY_FOREST                                    :Pãdure de vatã de zahãr
-STR_481D_CANDY_FACTORY                                          :Fabricã de bomboane
-STR_481E_BATTERY_FARM                                           :Fermã de baterii
+STR_4818_WATER_TOWER                                            :Turn de apă
+STR_4819_FACTORY                                                :Fabrică de conserve
+STR_481A_FARM                                                   :Fermă
+STR_481B_LUMBER_MILL                                            :Fabrică de cherestea
+STR_481C_COTTON_CANDY_FOREST                                    :Pădure de vată de zahăr
+STR_481D_CANDY_FACTORY                                          :Fabrică de bomboane
+STR_481E_BATTERY_FARM                                           :Fermă de baterii
 STR_481F_COLA_WELLS                                             :Fântâni de cola
-STR_4820_TOY_SHOP                                               :Magazin de jucãrii
-STR_4821_TOY_FACTORY                                            :Fabricã de jucãrii
+STR_4820_TOY_SHOP                                               :Magazin de jucării
+STR_4821_TOY_FACTORY                                            :Fabrică de jucării
 STR_4822_PLASTIC_FOUNTAINS                                      :Fântâni de plastic
-STR_4823_FIZZY_DRINK_FACTORY                                    :Fabricã de sucuri
-STR_4824_BUBBLE_GENERATOR                                       :Generator de balonase
-STR_4825_TOFFEE_QUARRY                                          :Carierã de caramel
-STR_4826_SUGAR_MINE                                             :Minã de zahãr
+STR_4823_FIZZY_DRINK_FACTORY                                    :Fabrică de sucuri
+STR_4824_BUBBLE_GENERATOR                                       :Generator de balonaÅŸe
+STR_4825_TOFFEE_QUARRY                                          :Carieră de caramel
+STR_4826_SUGAR_MINE                                             :Mină de zahăr
 
 ############ range for requires starts
 STR_4827_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}
@@ -1866,75 +1921,75 @@
 STR_4829_REQUIRES                                               :{BLACK}Are nevoie de: {YELLOW}{STRING}, {STRING}, {STRING}
 ############ range for requires ends
 
-STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Productia luna trecutã:
+STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Producţia lunii trecute:
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportat)
-STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centreazã imaginea pe locatia industriei
-STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Un nou obiectiv industrial ({STRING}) se construieste lângã {TOWN}!
-STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}O nouã {STRING} se planteazã lângã {TOWN}!
+STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Centrează imaginea pe locaţia industriei
+STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Un nou obiectiv industrial ({STRING}) se construieşte lângă {TOWN}!
+STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}O nouă {STRING} se plantează lângă {TOWN}!
 STR_482F_COST                                                   :{BLACK}Cost: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Acest tip de industrie nu se poate construi aici...
-STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...pãdurile pot fi plantate doar in zonele inzãpezite
-STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} anuntã inchiderea iminentã!
-STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemele de aprovizionare provoacã închiderea {INDUSTRY}!
-STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lipsa de teren împãdurit provoacã închiderea {INDUSTRY}!
-STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} mãreste productia!
-STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Rezerve noi de cãrbune la {INDUSTRY}!{}Se asteaptã dublarea productiei!
-STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Rezerve noi de petrol la {INDUSTRY}!{}Se asteaptã dublarea productiei!
-STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Noile tehnologii folosite la {INDUSTRY} vor aduce dublarea productiei!
-STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} scade productia cu 50%
-STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Insectele cauzeazã distrugeri masive la {INDUSTRY}!{}Productia scade cu 50%
-STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...se poate construi doar la marginea hãrtii
+STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...pădurile pot fi plantate doar în zonele înzăpezite
+STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} anunţă închidere iminentă!
+STR_4833_SUPPLY_PROBLEMS_CAUSE_TO                               :{BLACK}{BIGFONT}Problemele de aprovizionare provoacă închiderea {INDUSTRY}!
+STR_4834_LACK_OF_NEARBY_TREES_CAUSES                            :{BLACK}{BIGFONT}Lipsa de teren împădurit provoacă închiderea {INDUSTRY}!
+STR_4835_INCREASES_PRODUCTION                                   :{BLACK}{BIGFONT}{INDUSTRY} măreşte producţia!
+STR_4836_NEW_COAL_SEAM_FOUND_AT                                 :{BLACK}{BIGFONT}Rezerve noi de cărbune la {INDUSTRY}!{}Se preconizează dublarea producţiei!
+STR_4837_NEW_OIL_RESERVES_FOUND                                 :{BLACK}{BIGFONT}Rezerve noi de petrol la {INDUSTRY}!{}Se preconizează dublarea producţiei!
+STR_4838_IMPROVED_FARMING_METHODS                               :{BLACK}{BIGFONT}Noile tehnologii folosite la {INDUSTRY} vor aduce dublarea producţiei!
+STR_4839_PRODUCTION_DOWN_BY_50                                  :{BLACK}{BIGFONT}{INDUSTRY} scade producţia cu 50%
+STR_483A_INSECT_INFESTATION_CAUSES                              :{BLACK}{BIGFONT}Insectele cauzează distrugeri masive la {INDUSTRY}!{}Producţia scade cu 50%
+STR_483B_CAN_ONLY_BE_POSITIONED                                 :{WHITE}...se poate construi doar la marginea hărţii
 STR_INDUSTRY_PROD_GOUP                                          :{BLACK}{BIGFONT}Productia de {STRING} de la {INDUSTRY} creste cu {COMMA}%!
 STR_INDUSTRY_PROD_GODOWN                                        :{BLACK}{BIGFONT}Productia de {STRING} de la {INDUSTRY} scade cu {COMMA}%!
 
 ##id 0x5000
 STR_5000_TRAIN_IN_TUNNEL                                        :{WHITE}Tren în tunel
-STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Autovehicul în tunnel
+STR_5001_ROAD_VEHICLE_IN_TUNNEL                                 :{WHITE}Autovehicul în tunel
 STR_5003_ANOTHER_TUNNEL_IN_THE_WAY                              :{WHITE}Intersectare cu alt tunel
-STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Terenul de la celãlalt capãt al tunelului este imposibil de excavat
-STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Mai intâi trebuie demolat tunelul
-STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Mai intâi trebuie demolat podul
-STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Cele douã capete nu se pot situa în acelasi loc
-STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Sub pod trebuie sã existe teren nivelat
-STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Cele douã capete trebuie sã se situeze în linie
+STR_5005_UNABLE_TO_EXCAVATE_LAND                                :{WHITE}Terenul de la celălalt capăt al tunelului este imposibil de excavat
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Mai întâi trebuie demolat tunelul
+STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Mai întâi trebuie demolat podul
+STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Cele două capete nu se pot situa în acelaşi loc
+STR_5009_LEVEL_LAND_OR_WATER_REQUIRED                           :{WHITE}Sub pod trebuie să existe teren plat sau apă
+STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Cele două capete trebuie să se situeze în linie
 STR_500B_SITE_UNSUITABLE_FOR_TUNNEL                             :{WHITE}Loc nepotrivit pentru intrarea într-un tunel
 STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
-STR_500E_SUSPENSION_STEEL                                       :Suspensie (otel)
-STR_500F_GIRDER_STEEL                                           :Grindã (otel)
-STR_5010_CANTILEVER_STEEL                                       :Arc (otel)
+STR_500E_SUSPENSION_STEEL                                       :Suspensie (oţel)
+STR_500F_GIRDER_STEEL                                           :Grindă (oţel)
+STR_5010_CANTILEVER_STEEL                                       :Arc (oţel)
 STR_5011_SUSPENSION_CONCRETE                                    :Suspensie (beton)
 STR_5012_WOODEN                                                 :Lemn
 STR_5013_CONCRETE                                               :Beton
-STR_5014_TUBULAR_STEEL                                          :Tubular (otel)
+STR_5014_TUBULAR_STEEL                                          :Tubular (oţel)
 STR_BRIDGE_TUBULAR_SILICON                                      :Tubular (silicon)
 STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Nu pot construi pod aici...
 STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Nu pot construi tunel aici...
 STR_5017_RAILROAD_TUNNEL                                        :Tunel feroviar
 STR_5018_ROAD_TUNNEL                                            :Tunel rutier
-STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE                           :Pod feroviar suspendat din otel
-STR_501C_STEEL_GIRDER_RAIL_BRIDGE                               :Pod feroviar tip grindã din otel
-STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE                           :Pod feroviar tip arc din otel
+STR_501B_STEEL_SUSPENSION_RAIL_BRIDGE                           :Pod feroviar suspendat din oţel
+STR_501C_STEEL_GIRDER_RAIL_BRIDGE                               :Pod feroviar tip grindă din oţel
+STR_501D_STEEL_CANTILEVER_RAIL_BRIDGE                           :Pod feroviar tip arc din oţel
 STR_501E_REINFORCED_CONCRETE_SUSPENSION                         :Pod feroviar suspendat din beton
 STR_501F_WOODEN_RAIL_BRIDGE                                     :Pod feroviar din lemn
 STR_5020_CONCRETE_RAIL_BRIDGE                                   :Pod feroviar din beton
-STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE                           :Pod rutier suspendat din otel
-STR_5022_STEEL_GIRDER_ROAD_BRIDGE                               :Pod rutier tip grindã din otel
-STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE                           :Pod rutier tip arc din otel
-STR_5024_REINFORCED_CONCRETE_SUSPENSION                         :Pod rutier suspendat din beton
+STR_5021_STEEL_SUSPENSION_ROAD_BRIDGE                           :Pod rutier suspendat din oţel
+STR_5022_STEEL_GIRDER_ROAD_BRIDGE                               :Pod rutier tip grindă din oţel
+STR_5023_STEEL_CANTILEVER_ROAD_BRIDGE                           :Pod rutier tip arc din oţel
+STR_5024_REINFORCED_CONCRETE_SUSPENSION                         :Pod rutier suspendat din beton armat
 STR_5025_WOODEN_ROAD_BRIDGE                                     :Pod rutier din lemn
 STR_5026_CONCRETE_ROAD_BRIDGE                                   :Pod rutier din beton
 STR_5027_TUBULAR_RAIL_BRIDGE                                    :Pod feroviar tubular
 STR_5028_TUBULAR_ROAD_BRIDGE                                    :Pod rutier tubular
 
 ##id 0x5800
-STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Obiect in cale
-STR_5801_TRANSMITTER                                            :Transmitãtor
+STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Obiect în cale
+STR_5801_TRANSMITTER                                            :Transmiţător
 STR_5802_LIGHTHOUSE                                             :Far
 STR_5803_COMPANY_HEADQUARTERS                                   :Sediu companie
-STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...sediu de companie in cale
-STR_5805_COMPANY_OWNED_LAND                                     :Teren in posesia unei companii
-STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Nu poti cumpãra teren aici...
-STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...este deja in posesia ta!
+STR_5804_COMPANY_HEADQUARTERS_IN                                :{WHITE}...sediu de companie în cale
+STR_5805_COMPANY_OWNED_LAND                                     :Teren în proprietatea unei companii
+STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Nu poţi cumpăra teren aici...
+STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...este deja în proprietatea ta!
 
 
 ############ WARNING, using range 0x6000 for strings that are stored in the savegame
@@ -1981,6 +2036,8 @@
 STR_SV_STNAME_HELIPORT                                          :Heliportul {STRING}
 STR_SV_STNAME_FOREST                                            :Pãdurea {STRING}
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -1988,52 +2045,53 @@
 STR_OPTIONS_SAVE_CHANGES                                        :{BLACK}Salveazã
 
 ############ range for difficulty levels starts
-STR_6801_EASY                                                   :{BLACK}Usor
+STR_6801_EASY                                                   :{BLACK}UÅŸor
 STR_6802_MEDIUM                                                 :{BLACK}Mediu
 STR_6803_HARD                                                   :{BLACK}Greu
-STR_6804_CUSTOM                                                 :{BLACK}Propriu
+STR_6804_CUSTOM                                                 :{BLACK}Personalizat
 ############ range for difficulty levels ends
 
 ############ range for difficulty settings starts
-STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Numãrul maxim de companii concurente: {ORANGE}{COMMA}
-STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Când intrã concurentii pe piatã: {ORANGE}{STRING}
-STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Numãrul de orase de pe hartã: {ORANGE}{STRING}
-STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Numãrul de obiective industriale: {ORANGE}{STRING}
-STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Valoarea maximã a împrumutului initial: {ORANGE}{CURRENCY}
-STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Rata initialã a dobânzii: {ORANGE}{COMMA}%
+STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Numărul maxim de companii concurente: {ORANGE}{COMMA}
+STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Când intră concurenţii pe piaţă: {ORANGE}{STRING}
+STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Numărul de oraşe de pe hartă: {ORANGE}{STRING}
+STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Numărul de obiective industriale: {ORANGE}{STRING}
+STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}Valoarea maximă a împrumutului iniţial: {ORANGE}{CURRENCY}
+STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}Rata iniţială a dobânzii: {ORANGE}{COMMA}%
 STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Costul de exploatare al vehiculelor: {ORANGE}{STRING}
-STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Viteza de constructie a concurentilor: {ORANGE}{STRING}
-STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Gradul de inteligentã al concurentilor: {ORANGE}{STRING}
-STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}Defectiunile vehiculelor: {ORANGE}{STRING}
-STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}Multiplicarea veniturilor subventionate: {ORANGE}{STRING}
-STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Costul constructiilor: {ORANGE}{STRING}
+STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Viteza de construcţie a concurenţilor: {ORANGE}{STRING}
+STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}Gradul de inteligenţă al concurenţilor: {ORANGE}{STRING}
+STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}Defecţiunile vehiculelor: {ORANGE}{STRING}
+STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}Multiplicatorul pentru veniturile subvenţionate: {ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Costul construcţiilor: {ORANGE}{STRING}
 STR_6811_TERRAIN_TYPE                                           :{LTBLUE}Tipul de teren: {ORANGE}{STRING}
-STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Volumul de apã pe hartã: {ORANGE}{STRING}
+STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}Volumul de apă pe hartă: {ORANGE}{STRING}
 STR_6813_ECONOMY                                                :{LTBLUE}Economie: {ORANGE}{STRING}
 STR_6814_TRAIN_REVERSING                                        :{LTBLUE}Trenurile întorc: {ORANGE}{STRING}
 STR_6815_DISASTERS                                              :{LTBLUE}Dezastre: {ORANGE}{STRING}
-STR_16816_CITY_APPROVAL                                         :{LTBLUE}Reactia autoritãtilor la modificãrea mediului: {ORANGE}{STRING}
+STR_16816_CITY_APPROVAL                                         :{LTBLUE}Reacţia autorităţilor la modificarea mediului: {ORANGE}{STRING}
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :zero
-STR_6816_LOW                                                    :scãzut
+STR_NUM_VERY_LOW                                                :Foarte putine
+STR_6816_LOW                                                    :scăzut
 STR_6817_NORMAL                                                 :normal
 STR_6818_HIGH                                                   :ridicat
 STR_6819                                                        :{BLACK}{SMALLLEFTARROW}
 STR_681A                                                        :{BLACK}{SMALLRIGHTARROW}
-STR_681B_VERY_SLOW                                              :foarte incet
-STR_681C_SLOW                                                   :Incet
+STR_681B_VERY_SLOW                                              :foarte încet
+STR_681C_SLOW                                                   :încet
 STR_681D_MEDIUM                                                 :mediu
 STR_681E_FAST                                                   :repede
 STR_681F_VERY_FAST                                              :foarte repede
 STR_VERY_LOW                                                    :foarte scãzut
-STR_6820_LOW                                                    :scãzut
+STR_6820_LOW                                                    :scăzut
 STR_6821_MEDIUM                                                 :mediu
 STR_6822_HIGH                                                   :ridicat
 STR_6823_NONE                                                   :deloc
 STR_6824_REDUCED                                                :rare
-STR_6825_NORMAL                                                 :frecventã normalã
-STR_6826_X1_5                                                   :x1.5
+STR_6825_NORMAL                                                 :frecvenţă normală
+STR_6826_X1_5                                                   :x1,5
 STR_6827_X2                                                     :x2
 STR_6828_X3                                                     :x3
 STR_6829_X4                                                     :x4
@@ -2041,45 +2099,45 @@
 STR_682B_FLAT                                                   :plat
 STR_682C_HILLY                                                  :deluros
 STR_682D_MOUNTAINOUS                                            :muntos
-STR_682E_STEADY                                                 :stabilã
-STR_682F_FLUCTUATING                                            :fluctuantã
+STR_682E_STEADY                                                 :stabilă
+STR_682F_FLUCTUATING                                            :fluctuantă
 STR_6830_IMMEDIATE                                              :imediat
-STR_6831_3_MONTHS_AFTER_PLAYER                                  :la 3 luni dupã jucãtor
-STR_6832_6_MONTHS_AFTER_PLAYER                                  :la 6 luni dupã jucãtor
-STR_6833_9_MONTHS_AFTER_PLAYER                                  :la 9 luni dupã jucãtor
-STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :la capãt de linie si în garã
-STR_6835_AT_END_OF_LINE_ONLY                                    :doar la capãt de linie
+STR_6831_3_MONTHS_AFTER_PLAYER                                  :la 3 luni după jucător
+STR_6832_6_MONTHS_AFTER_PLAYER                                  :la 6 luni după jucător
+STR_6833_9_MONTHS_AFTER_PLAYER                                  :la 9 luni după jucător
+STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :la capăt de linie şi în gară
+STR_6835_AT_END_OF_LINE_ONLY                                    :doar la capăt de linie
 STR_6836_OFF                                                    :inactiv
 STR_6837_ON                                                     :activ
-STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Afiseazã clasamentul celor mai bune punctaje
-STR_6839_PERMISSIVE                                             :permisivã
-STR_683A_TOLERANT                                               :tolerantã
-STR_683B_HOSTILE                                                :ostilã
+STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Afişează clasamentul celor mai bune punctaje
+STR_6839_PERMISSIVE                                             :permisivă
+STR_683A_TOLERANT                                               :tolerantă
+STR_683B_HOSTILE                                                :ostilă
 
 ##id 0x7000
 STR_7000                                                        :
 STR_7001                                                        :{WHITE}{COMPANY} {BLACK}{PLAYERNAME}
-STR_7002_PLAYER                                                 :(Jucãtorul {COMMA})
-STR_7004_NEW_FACE                                               :{BLACK}Schimbã foto
+STR_7002_PLAYER                                                 :(Jucătorul {COMMA})
+STR_7004_NEW_FACE                                               :{BLACK}Schimbă poza
 STR_7005_COLOR_SCHEME                                           :{BLACK}Culoare
 STR_7006_COLOR_SCHEME                                           :{GOLD}Culoare:
 STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}Alege noua culoare
-STR_7008_COMPANY_NAME                                           :{BLACK}Nume companie
-STR_7009_PRESIDENT_NAME                                         :{BLACK}Presedinte
+STR_7008_COMPANY_NAME                                           :{BLACK}Numele companiei
+STR_7009_PRESIDENT_NAME                                         :{BLACK}Numele preÅŸedintelui
 STR_700A_COMPANY_NAME                                           :Noul nume al companiei
-STR_700B_PRESIDENT_S_NAME                                       :Numele noului presedinte
+STR_700B_PRESIDENT_S_NAME                                       :Noul nume al preÅŸedintelui
 STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Nu pot schimba numele companiei...
-STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Nu pot schimba numele presedintelui...
-STR_700E_FINANCES                                               :{WHITE}Situatia financiarã a companiei {COMPANY} {BLACK}{PLAYERNAME}
+STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Nu pot schimba numele preÅŸedintelui...
+STR_700E_FINANCES                                               :{WHITE}Situaţia financiară a companiei {COMPANY} {BLACK}{PLAYERNAME}
 STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Cheltuieli/Venituri
 STR_7010                                                        :{WHITE}{NUM}
-STR_7011_CONSTRUCTION                                           :{GOLD}Constructii
+STR_7011_CONSTRUCTION                                           :{GOLD}Construcţii
 STR_7012_NEW_VEHICLES                                           :{GOLD}Vehicule noi
 STR_7013_TRAIN_RUNNING_COSTS                                    :{GOLD}Costuri trenuri
 STR_7014_ROAD_VEH_RUNNING_COSTS                                 :{GOLD}Costuri autovehicule
 STR_7015_AIRCRAFT_RUNNING_COSTS                                 :{GOLD}Costuri aeronave
 STR_7016_SHIP_RUNNING_COSTS                                     :{GOLD}Costuri nave
-STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Întretinere proprietãti
+STR_7017_PROPERTY_MAINTENANCE                                   :{GOLD}Întreţinere proprietăţi
 STR_7018_TRAIN_INCOME                                           :{GOLD}Venituri trenuri
 STR_7019_ROAD_VEHICLES_INCOME                                   :{GOLD}Venituri autovehicule
 STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Venituri aeronave
@@ -2094,67 +2152,67 @@
 STR_CURRCOMPACT                                                 :{CURRCOMPACT64}
 STR_7024                                                        :{COMMA}
 STR_7025_OPERATING_PROFIT_GRAPH                                 :{WHITE}Graficul profitului din operare
-STR_7026_BANK_BALANCE                                           :{WHITE}Balantã curentã
+STR_7026_BANK_BALANCE                                           :{WHITE}Balanţă curentă
 STR_7027_LOAN                                                   :{WHITE}Credite
 STR_MAX_LOAN                                                    :{WHITE}Limita credite:  {BLACK}{CURRENCY64}
 STR_7028                                                        :{BLACK}{CURRENCY64}
-STR_7029_BORROW                                                 :{BLACK}Împrumutã {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
-STR_702A_REPAY                                                  :{BLACK}Plãteste înapoi {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
+STR_7029_BORROW                                                 :{BLACK}Împrumută {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
+STR_702A_REPAY                                                  :{BLACK}Plăteşte înapoi {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
 STR_702B_MAXIMUM_PERMITTED_LOAN                                 :{WHITE}...creditul maxim permis este de {CURRENCY}
-STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Nu mai poti imprumuta bani...
-STR_702D_LOAN_ALREADY_REPAYED                                   :{WHITE}...nu ai nici un credit de plãtit
+STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Nu mai poţi împrumuta bani...
+STR_702D_LOAN_ALREADY_REPAYED                                   :{WHITE}...nu ai nici un credit de plătit
 STR_702E_REQUIRED                                               :{WHITE}...ai nevoie de {CURRENCY}
-STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Nu poti plãti creditul...
+STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Nu poţi plăti creditul...
 STR_INSUFFICIENT_FUNDS                                          :{WHITE}Nu poti dona din banii împrumutati de bancã...
-STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Alege o nouã fotografie a presedintelui
-STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Schimbã culoarea care îti reprezintã compania
-STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Schimbã numele presedintelui
-STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Schimbã numele companiei
-STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Clic pe culoarea selectatã
-STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Împrumutã o nouã sumã de bani
-STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Plãteste inapoi o parte din credite
-STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Presedinte)
-STR_7038_INAUGURATED                                            :{GOLD}Anul înfiintãrii: {WHITE}{NUM}
+STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Alege o nouă poză a preşedintelui
+STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Schimbă culoarea care îţi reprezintă compania
+STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Schimbă numele preşedintelui
+STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Schimbă numele companiei
+STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Clic pe culoarea dorită
+STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Împrumută o nouă sumă de bani
+STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Plăteşte înapoi o parte din credite
+STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(PreÅŸedinte)
+STR_7038_INAUGURATED                                            :{GOLD}Anul înfiinţării: {WHITE}{NUM}
 STR_7039_VEHICLES                                               :{GOLD}Vehicule:
 STR_TRAINS                                                      :{WHITE}{COMMA} tren{P "" uri}
 STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} autovehicul{P "" e}
 STR_AIRCRAFT                                                    :{WHITE}{COMMA} aeronav{P ã e}
 STR_SHIPS                                                       :{WHITE}{COMMA} nav{P ã e}
 STR_7042_NONE                                                   :{WHITE}Nici unul
-STR_7043_FACE_SELECTION                                         :{WHITE}Alegerea fotografiei
-STR_7044_MALE                                                   :{BLACK}Bãrbat
+STR_7043_FACE_SELECTION                                         :{WHITE}Alegerea pozei
+STR_7044_MALE                                                   :{BLACK}Bărbat
 STR_7045_FEMALE                                                 :{BLACK}Femeie
-STR_7046_NEW_FACE                                               :{BLACK}Foto nouã
-STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Anuleazã alegerea unei noi fotografii
-STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Acceptã fotografia selectatã
-STR_7049_SELECT_MALE_FACES                                      :{BLACK}Alege figurã masculinã
-STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Alege figurã femininã
-STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Genereazã foto aleatoare
+STR_7046_NEW_FACE                                               :{BLACK}Poză nouă
+STR_7047_CANCEL_NEW_FACE_SELECTION                              :{BLACK}Anulează alegerea unei noi poze
+STR_7048_ACCEPT_NEW_FACE_SELECTION                              :{BLACK}Acceptă poza selectată
+STR_7049_SELECT_MALE_FACES                                      :{BLACK}Alege figură masculină
+STR_704A_SELECT_FEMALE_FACES                                    :{BLACK}Alege figură feminină
+STR_704B_GENERATE_RANDOM_NEW_FACE                               :{BLACK}Generează poză aleatoare
 STR_704C_KEY                                                    :{BLACK}Legenda
-STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Afiseazã legenda graficelor
+STR_704D_SHOW_KEY_TO_GRAPHS                                     :{BLACK}Afişează legenda graficelor
 STR_704E_KEY_TO_COMPANY_GRAPHS                                  :{WHITE}Legenda graficelor
-STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Clic aici pentru a comuta afisarea informatiilor despre companie
-STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Unitãti de marfã livratã
-STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Ratingul performantelor companiilor (rating maxim=1000)
+STR_704F_CLICK_HERE_TO_TOGGLE_COMPANY                           :{BLACK}Clic aici pentru a comuta afişarea informaţiilor despre companie
+STR_7050_UNITS_OF_CARGO_DELIVERED                               :{WHITE}Unităţi de marfă livrate
+STR_7051_COMPANY_PERFORMANCE_RATINGS                            :{WHITE}Evaluarea performanţelor companiilor (maxim=1000)
 STR_7052_COMPANY_VALUES                                         :{WHITE}Valorile companiilor
 STR_7053_COMPANY_LEAGUE_TABLE                                   :{WHITE}Clasamentul companiilor
 STR_7054                                                        :{WHITE}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{PLAYERNAME} '{STRING}'
 STR_7055                                                        :{YELLOW}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{PLAYERNAME}  '{STRING}'
 STR_7056_TRANSPORT_COMPANY_IN_TROUBLE                           :{BLACK}{BIGFONT}Companie de transport cu probleme!
-STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} va fi vândutã dacã situatia nu se va îmbunãtãti curând!
-STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(Presedinte)
-STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Fuziune între companiile de transport!
-STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} a fost vândutã companiei {COMPANY} la pretul de {CURRENCY}!
-STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Cãutãm o companie de transport care sã preia societatea noastrã {}{}Doriti sã cumpãrati {COMPANY} la pretul de {CURRENCY}?
+STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT}{COMPANY} va fi vândută dacă situaţia financiară nu se va îmbunătăţi curând!
+STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(PreÅŸedinte)
+STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Fuziune între companii de transport!
+STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} a fost vândută companiei {COMPANY} la preţul de {CURRENCY}!
+STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Căutăm o companie de transport care să preia societatea noastră {}{}Doriţi să cumpăraţi {COMPANY} la preţul de {CURRENCY}?
 STR_705C_BANKRUPT                                               :{BLACK}{BIGFONT}Faliment!
-STR_705D_HAS_BEEN_CLOSED_DOWN_BY                                :{BLACK}{BIGFONT}Compania {COMPANY} a fost închisã si toate activele au fost valorificate de creditori!
-STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED                         :{BLACK}{BIGFONT}A apãrut o nouã companie!
-STR_705F_STARTS_CONSTRUCTION_NEAR                               :{BLACK}{BIGFONT}{COMPANY} si-a stabilit sediul lângã {TOWN}!
-STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Nu pot cumpãra compania...
-STR_7061_CARGO_PAYMENT_RATES                                    :{WHITE}Preturile transportului de cãlãtori si mãrfuri
+STR_705D_HAS_BEEN_CLOSED_DOWN_BY                                :{BLACK}{BIGFONT}Compania {COMPANY} a fost închisă şi toate activele au fost valorificate de creditori!
+STR_705E_NEW_TRANSPORT_COMPANY_LAUNCHED                         :{BLACK}{BIGFONT}A apărut o nouă companie!
+STR_705F_STARTS_CONSTRUCTION_NEAR                               :{BLACK}{BIGFONT}{COMPANY} şi-a stabilit sediul lângă {TOWN}!
+STR_7060_CAN_T_BUY_COMPANY                                      :{WHITE}Nu pot cumpăra compania...
+STR_7061_CARGO_PAYMENT_RATES                                    :{WHITE}Preţurile transportului de călători şi mărfuri
 STR_7062_DAYS_IN_TRANSIT                                        :{BLACK}{TINYFONT}Zile în tranzit
-STR_7063_PAYMENT_FOR_DELIVERING                                 :{BLACK}{TINYFONT}Plata pentru livrarea a 10 unitãti (sau 10,000 de litri) de marfã pe o distantã de 20 de pãtrãtele
-STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}Comutator pentru afisarea graficului pentru marfã
+STR_7063_PAYMENT_FOR_DELIVERING                                 :{BLACK}{TINYFONT}Plata pentru livrarea a 10 unităţi (sau 10.000 de litri) de marfă pe o distanţă de 20 de pătrăţele
+STR_7064_TOGGLE_GRAPH_FOR_CARGO                                 :{BLACK}Comutator pentru afişarea graficului pentru marfă
 STR_7065                                                        :{BLACK}{TINYFONT}{STRING}
 STR_7066_ENGINEER                                               :Inginer
 STR_7067_TRAFFIC_MANAGER                                        :Manager de trafic
@@ -2163,10 +2221,10 @@
 STR_706A_DIRECTOR                                               :Director
 STR_706B_CHIEF_EXECUTIVE                                        :Director executiv
 STR_706C_CHAIRMAN                                               :Director general
-STR_706D_PRESIDENT                                              :Presedinte
+STR_706D_PRESIDENT                                              :PreÅŸedinte
 STR_706E_TYCOON                                                 :Magnat
-STR_706F_BUILD_HQ                                               :{BLACK}Constr. sediu
-STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Construieste/aratã sediul companiei
+STR_706F_BUILD_HQ                                               :{BLACK}ConstruieÅŸte sediu
+STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}Construieşte sau arată sediul companiei
 STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}Muta sediul companiei (costa 1% din valoarea companiei)
 STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Nu pot construi sediul...
 STR_7072_VIEW_HQ                                                :{BLACK}Vezi sediul
@@ -2174,20 +2232,20 @@
 STR_COMPANY_PASSWORD                                            :{BLACK}Parola
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Protejeaza-ti compania cu o parola pentru a preveni accesul neautorizat.
 STR_SET_COMPANY_PASSWORD                                        :Alege parola companiei
-STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recesiune mondialã!{}{}Expertii financiari se tem de ceea ce e mai rãu odatã cu prãbusirea economicã!
-STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recesiunea s-a încheiat!{}{}Cresterea comertului dã încredere industriei, iar economia se redreseazã!
-STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Comutator pentru mãrimea ferestrei
+STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}Recesiune mondială!{}{}Experţii financiari se tem de ceea ce e mai rău odată cu prăbuşirea economică!
+STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}Recesiunea s-a încheiat!{}{}Creşterea comerţului dă încredere industriei, iar economia se redresează!
+STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}Comutator pentru mărimea ferestrei
 STR_7076_COMPANY_VALUE                                          :{GOLD}Valoarea companiei: {WHITE}{CURRENCY64}
-STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Cumpãrã 25% din companie
-STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Vinde 25% din companie
-STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Cumpãrã 25% din actiunile aceste companii
-STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Vinde 25% din actiunile aceste companii
-STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Nu pot cumpãra 25% din aceastã companie...
-STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Nu pot vinde 25% din aceastã companie...
-STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% detinute de {COMPANY})
-STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% detinute de {COMPANY}{}   {COMMA}% detinute de {COMPANY})
-STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} a fost preluatã de {COMPANY}!
-STR_7080_PROTECTED                                              :{WHITE}Aceasta companie inca nu vinde actiuni...
+STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}Cumpără 25% din acţiunile companiei
+STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}Vinde 25% din acţiunile companiei
+STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}Cumpără 25% din acţiunile acestei companii
+STR_707A_SELL_25_SHARE_IN_THIS_COMPANY                          :{BLACK}Vinde 25% din acţiunile acestei companii
+STR_707B_CAN_T_BUY_25_SHARE_IN_THIS                             :{WHITE}Nu pot cumpăra 25% din acţiunile acestei companii...
+STR_707C_CAN_T_SELL_25_SHARE_IN                                 :{WHITE}Nu pot vinde 25% din acţiunile acestei companii...
+STR_707D_OWNED_BY                                               :{WHITE}({COMMA}% deţinute de {COMPANY})
+STR_707E_OWNED_BY_OWNED_BY                                      :{WHITE}({COMMA}% deţinute de {COMPANY}{}   {COMMA}% deţinute de {COMPANY})
+STR_707F_HAS_BEEN_TAKEN_OVER_BY                                 :{BLACK}{BIGFONT}{COMPANY} a fost preluată de {COMPANY}!
+STR_7080_PROTECTED                                              :{WHITE}Această companie încă nu vinde acţiuni...
 
 STR_LIVERY_DEFAULT                                              :Uniforma standard
 STR_LIVERY_STEAM                                                :Motor cu abur
@@ -2197,9 +2255,9 @@
 STR_LIVERY_MAGLEV                                               :Motor Maglev
 STR_LIVERY_DMU                                                  :DMU
 STR_LIVERY_EMU                                                  :EMU
-STR_LIVERY_PASSENGER_WAGON_STEAM                                :Trasura de pasageri (Aburi)
-STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Trasura de pasageri (Diesel)
-STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Trasura de pasageri (Electrica)
+STR_LIVERY_PASSENGER_WAGON_STEAM                                :Vagon de călători (Aburi)
+STR_LIVERY_PASSENGER_WAGON_DIESEL                               :Vagon de călători (Diesel)
+STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :Vagon de călători (Electric)
 STR_LIVERY_FREIGHT_WAGON                                        :Vagon de marfa
 STR_LIVERY_BUS                                                  :Autobus
 STR_LIVERY_TRUCK                                                :Camion
@@ -2246,60 +2304,60 @@
 STR_8018_SH_40_ELECTRIC                                         :SH '40' (Electric)
 STR_8019_T_I_M_ELECTRIC                                         :'T.I.M.' (Electric)
 STR_801A_ASIASTAR_ELECTRIC                                      :'AsiaStar' (Electric)
-STR_801B_PASSENGER_CAR                                          :Vagon pentru cãlãtori
-STR_801C_MAIL_VAN                                               :Vagon pentru postã
-STR_801D_COAL_CAR                                               :Vagon pentru cãrbuni
-STR_801E_OIL_TANKER                                             :Cisternã pentru petrol
+STR_801B_PASSENGER_CAR                                          :Vagon pentru călători
+STR_801C_MAIL_VAN                                               :Vagon pentru poştă
+STR_801D_COAL_CAR                                               :Vagon pentru cărbuni
+STR_801E_OIL_TANKER                                             :Cisternă pentru petrol
 STR_801F_LIVESTOCK_VAN                                          :Vagon pentru animale
 STR_8020_GOODS_VAN                                              :Vagon pentru bunuri
 STR_8021_GRAIN_HOPPER                                           :Vagon pentru cereale
 STR_8022_WOOD_TRUCK                                             :Vagon pentru lemne
 STR_8023_IRON_ORE_HOPPER                                        :Vagon pentru minereu de fier
-STR_8024_STEEL_TRUCK                                            :Vagon pentru otel
+STR_8024_STEEL_TRUCK                                            :Vagon pentru oţel
 STR_8025_ARMORED_VAN                                            :Vagon blindat
 STR_8026_FOOD_VAN                                               :Vagon pentru alimente
 STR_8027_PAPER_TRUCK                                            :Vagon pentru hârtie
 STR_8028_COPPER_ORE_HOPPER                                      :Vagon pentru minereu de cupru
-STR_8029_WATER_TANKER                                           :Cisternã pentru apã
+STR_8029_WATER_TANKER                                           :Cisternă pentru apă
 STR_802A_FRUIT_TRUCK                                            :Vagon penru fructe
 STR_802B_RUBBER_TRUCK                                           :Vagon pentru cauciuc
-STR_802C_SUGAR_TRUCK                                            :Vagon pentru zahãr
-STR_802D_COTTON_CANDY_HOPPER                                    :Vagon pentru vatã de zahãr
+STR_802C_SUGAR_TRUCK                                            :Vagon pentru zahăr
+STR_802D_COTTON_CANDY_HOPPER                                    :Vagon pentru vată de zahăr
 STR_802E_TOFFEE_HOPPER                                          :Vagon pentru caramel
-STR_802F_BUBBLE_VAN                                             :Vagon pentru balonase
-STR_8030_COLA_TANKER                                            :Cisternã pentru cola
+STR_802F_BUBBLE_VAN                                             :Vagon pentru balonaÅŸe
+STR_8030_COLA_TANKER                                            :Cisternă pentru cola
 STR_8031_CANDY_VAN                                              :Vagon pentru bomboane
-STR_8032_TOY_VAN                                                :Vagon pentru jucãrii
+STR_8032_TOY_VAN                                                :Vagon pentru jucării
 STR_8033_BATTERY_TRUCK                                          :Vagon pentru baterii
 STR_8034_FIZZY_DRINK_TRUCK                                      :Vagon pentru sucuri
 STR_8035_PLASTIC_TRUCK                                          :Vagon pentru plastic
 STR_8036_X2001_ELECTRIC                                         :'X2001' (Electric)
 STR_8037_MILLENNIUM_Z1_ELECTRIC                                 :'Millennium Z1' (Electric)
 STR_8038_WIZZOWOW_Z99                                           :Wizzowow Z99
-STR_8039_PASSENGER_CAR                                          :Vagon pentru cãlãtori
-STR_803A_MAIL_VAN                                               :Vagon pentru postã
-STR_803B_COAL_CAR                                               :Vagon pentru cãrbuni
-STR_803C_OIL_TANKER                                             :Cisternã pentru petrol
+STR_8039_PASSENGER_CAR                                          :Vagon pentru călători
+STR_803A_MAIL_VAN                                               :Vagon pentru poştă
+STR_803B_COAL_CAR                                               :Vagon pentru cărbuni
+STR_803C_OIL_TANKER                                             :Cisternă pentru petrol
 STR_803D_LIVESTOCK_VAN                                          :Vagon pentru animale
 STR_803E_GOODS_VAN                                              :Vagon pentru bunuri
 STR_803F_GRAIN_HOPPER                                           :Vagon pentru cereale
 STR_8040_WOOD_TRUCK                                             :Vagon pentru lemne
 STR_8041_IRON_ORE_HOPPER                                        :Vagon pentru minereu de fier
-STR_8042_STEEL_TRUCK                                            :Vagon pentru otel
+STR_8042_STEEL_TRUCK                                            :Vagon pentru oţel
 STR_8043_ARMORED_VAN                                            :Vagon blindat
 STR_8044_FOOD_VAN                                               :Vagon pentru alimente
 STR_8045_PAPER_TRUCK                                            :Vagon pentru hârtie
 STR_8046_COPPER_ORE_HOPPER                                      :Vagon pentru minereu de cupru
-STR_8047_WATER_TANKER                                           :Cisternã pentru apã
+STR_8047_WATER_TANKER                                           :Cisternă pentru apă
 STR_8048_FRUIT_TRUCK                                            :Vagon pentru fructe
 STR_8049_RUBBER_TRUCK                                           :Vagon pentru cauciuc
-STR_804A_SUGAR_TRUCK                                            :Vagon pentru zahãr
-STR_804B_COTTON_CANDY_HOPPER                                    :Vagon pentru vatã de zahãr
+STR_804A_SUGAR_TRUCK                                            :Vagon pentru zahăr
+STR_804B_COTTON_CANDY_HOPPER                                    :Vagon pentru vată de zahăr
 STR_804C_TOFFEE_HOPPER                                          :Vagon pentru caramel
-STR_804D_BUBBLE_VAN                                             :Vagon pentru balonase
-STR_804E_COLA_TANKER                                            :Cisternã pentru cola
+STR_804D_BUBBLE_VAN                                             :Vagon pentru balonaÅŸe
+STR_804E_COLA_TANKER                                            :Cisternă pentru cola
 STR_804F_CANDY_VAN                                              :Vagon pentru bomboane
-STR_8050_TOY_VAN                                                :Vagon pentru jucãrii
+STR_8050_TOY_VAN                                                :Vagon pentru jucării
 STR_8051_BATTERY_TRUCK                                          :Vagon pentru baterii
 STR_8052_FIZZY_DRINK_TRUCK                                      :Vagon pentru sucuri
 STR_8053_PLASTIC_TRUCK                                          :Vagon pentru plastic
@@ -2308,30 +2366,30 @@
 STR_8056_LEV3_PEGASUS_ELECTRIC                                  :Lev3 'Pegasus' (Electric)
 STR_8057_LEV4_CHIMAERA_ELECTRIC                                 :Lev4 'Chimaera' (Electric)
 STR_8058_WIZZOWOW_ROCKETEER                                     :Wizzowow Rocketeer
-STR_8059_PASSENGER_CAR                                          :Vagon pentru cãlãtori
-STR_805A_MAIL_VAN                                               :Vagon pentru postã
-STR_805B_COAL_CAR                                               :Vagon pentru cãrbuni
-STR_805C_OIL_TANKER                                             :Cisternã pentru petrol
+STR_8059_PASSENGER_CAR                                          :Vagon pentru călători
+STR_805A_MAIL_VAN                                               :Vagon pentru poştă
+STR_805B_COAL_CAR                                               :Vagon pentru cărbuni
+STR_805C_OIL_TANKER                                             :Cisternă pentru petrol
 STR_805D_LIVESTOCK_VAN                                          :Vagon pentru animale
 STR_805E_GOODS_VAN                                              :Vagon pentru bunuri
 STR_805F_GRAIN_HOPPER                                           :Vagon pentru cereale
 STR_8060_WOOD_TRUCK                                             :Vagon pentru lemne
 STR_8061_IRON_ORE_HOPPER                                        :Vagon pentru minereu de fier
-STR_8062_STEEL_TRUCK                                            :Vagon pentru otel
+STR_8062_STEEL_TRUCK                                            :Vagon pentru oţel
 STR_8063_ARMORED_VAN                                            :Vagon blindat
 STR_8064_FOOD_VAN                                               :Vagon pentru alimente
 STR_8065_PAPER_TRUCK                                            :Vagon pentru hârtie
 STR_8066_COPPER_ORE_HOPPER                                      :Vagon pentru minereu de cupru
-STR_8067_WATER_TANKER                                           :Cisternã pentru apã
+STR_8067_WATER_TANKER                                           :Cisternă pentru apă
 STR_8068_FRUIT_TRUCK                                            :Vagon pentru fructe
 STR_8069_RUBBER_TRUCK                                           :Vagon pentru cauciuc
-STR_806A_SUGAR_TRUCK                                            :Vagon pentru zahãr
-STR_806B_COTTON_CANDY_HOPPER                                    :Vagon pentru vatã de zahãr
+STR_806A_SUGAR_TRUCK                                            :Vagon pentru zahăr
+STR_806B_COTTON_CANDY_HOPPER                                    :Vagon pentru vată de zahăr
 STR_806C_TOFFEE_HOPPER                                          :Vagon pentru caramel
-STR_806D_BUBBLE_VAN                                             :Vagon pentru balonase
-STR_806E_COLA_TANKER                                            :Cisternã pentru cola
+STR_806D_BUBBLE_VAN                                             :Vagon pentru balonaÅŸe
+STR_806E_COLA_TANKER                                            :Cisternă pentru cola
 STR_806F_CANDY_VAN                                              :Vagon pentru bomboane
-STR_8070_TOY_VAN                                                :Vagon pentru jucãrii
+STR_8070_TOY_VAN                                                :Vagon pentru jucării
 STR_8071_BATTERY_TRUCK                                          :Vagon pentru baterii
 STR_8072_FIZZY_DRINK_TRUCK                                      :Vagon pentru sucuri
 STR_8073_PLASTIC_TRUCK                                          :Vagon pentru plastic
@@ -2342,18 +2400,18 @@
 STR_8078_PLODDYPHUT_MKI_BUS                                     :Autobuz Ploddyphut MkI
 STR_8079_PLODDYPHUT_MKII_BUS                                    :Autobuz Ploddyphut MkII
 STR_807A_PLODDYPHUT_MKIII_BUS                                   :Autobuz Ploddyphut MkIII
-STR_807B_BALOGH_COAL_TRUCK                                      :Camion pentru cãrbuni Balogh
-STR_807C_UHL_COAL_TRUCK                                         :Camion pentru cãrbuni Uhl
-STR_807D_DW_COAL_TRUCK                                          :Camion pentru cãrbuni DW
-STR_807E_MPS_MAIL_TRUCK                                         :Camion postal MPS
-STR_807F_REYNARD_MAIL_TRUCK                                     :Camion postal Reynard
-STR_8080_PERRY_MAIL_TRUCK                                       :Camion postal Perry
-STR_8081_MIGHTYMOVER_MAIL_TRUCK                                 :Camion postal MightyMover
-STR_8082_POWERNAUGHT_MAIL_TRUCK                                 :Camion postal Powernaught
-STR_8083_WIZZOWOW_MAIL_TRUCK                                    :Camion postal Wizzowow
-STR_8084_WITCOMBE_OIL_TANKER                                    :Cisternã pentru petrol Witcombe
-STR_8085_FOSTER_OIL_TANKER                                      :Cisternã pentru petrol Foster
-STR_8086_PERRY_OIL_TANKER                                       :Cisternã pentru petrol Perry
+STR_807B_BALOGH_COAL_TRUCK                                      :Camion pentru cărbuni Balogh
+STR_807C_UHL_COAL_TRUCK                                         :Camion pentru cărbuni Uhl
+STR_807D_DW_COAL_TRUCK                                          :Camion pentru cărbuni DW
+STR_807E_MPS_MAIL_TRUCK                                         :Camion poÅŸtal MPS
+STR_807F_REYNARD_MAIL_TRUCK                                     :Camion poÅŸtal Reynard
+STR_8080_PERRY_MAIL_TRUCK                                       :Camion poÅŸtal Perry
+STR_8081_MIGHTYMOVER_MAIL_TRUCK                                 :Camion poÅŸtal MightyMover
+STR_8082_POWERNAUGHT_MAIL_TRUCK                                 :Camion poÅŸtal Powernaught
+STR_8083_WIZZOWOW_MAIL_TRUCK                                    :Camion poÅŸtal Wizzowow
+STR_8084_WITCOMBE_OIL_TANKER                                    :Cisternă pentru petrol Witcombe
+STR_8085_FOSTER_OIL_TANKER                                      :Cisternă pentru petrol Foster
+STR_8086_PERRY_OIL_TANKER                                       :Cisternă pentru petrol Perry
 STR_8087_TALBOTT_LIVESTOCK_VAN                                  :Camion pentru animale Talbott
 STR_8088_UHL_LIVESTOCK_VAN                                      :Camion pentru animale Uhl
 STR_8089_FOSTER_LIVESTOCK_VAN                                   :Camion pentru animale Foster
@@ -2369,9 +2427,9 @@
 STR_8093_MPS_IRON_ORE_TRUCK                                     :Camion pentru fier MPS
 STR_8094_UHL_IRON_ORE_TRUCK                                     :Camion pentru fier Uhl
 STR_8095_CHIPPY_IRON_ORE_TRUCK                                  :Camion pentru fier Chippy
-STR_8096_BALOGH_STEEL_TRUCK                                     :Camion pentru otel Balogh
-STR_8097_UHL_STEEL_TRUCK                                        :Camion pentru otel Uhl
-STR_8098_KELLING_STEEL_TRUCK                                    :Camion pentru otel Kelling
+STR_8096_BALOGH_STEEL_TRUCK                                     :Camion pentru oţel Balogh
+STR_8097_UHL_STEEL_TRUCK                                        :Camion pentru oţel Uhl
+STR_8098_KELLING_STEEL_TRUCK                                    :Camion pentru oţel Kelling
 STR_8099_BALOGH_ARMORED_TRUCK                                   :Camion blindat Balogh
 STR_809A_UHL_ARMORED_TRUCK                                      :Camion blindat Uhl
 STR_809B_FOSTER_ARMORED_TRUCK                                   :Camion blindat Foster
@@ -2384,56 +2442,56 @@
 STR_80A2_MPS_COPPER_ORE_TRUCK                                   :Camion pentru cupru MPS
 STR_80A3_UHL_COPPER_ORE_TRUCK                                   :Camion pentru cupru Uhl
 STR_80A4_GOSS_COPPER_ORE_TRUCK                                  :Camion pentru cupru Goss
-STR_80A5_UHL_WATER_TANKER                                       :Cisternã pentru apã Uhl
-STR_80A6_BALOGH_WATER_TANKER                                    :Cisternã pentru apã Balogh
-STR_80A7_MPS_WATER_TANKER                                       :Cisternã pentru apã MPS
+STR_80A5_UHL_WATER_TANKER                                       :Cisternă pentru apă Uhl
+STR_80A6_BALOGH_WATER_TANKER                                    :Cisternă pentru apă Balogh
+STR_80A7_MPS_WATER_TANKER                                       :Cisternă pentru apă MPS
 STR_80A8_BALOGH_FRUIT_TRUCK                                     :Camion pentru fructe Balogh
 STR_80A9_UHL_FRUIT_TRUCK                                        :Camion pentru fructe Uhl
 STR_80AA_KELLING_FRUIT_TRUCK                                    :Camion pentru fructe Kelling
 STR_80AB_BALOGH_RUBBER_TRUCK                                    :Camion pentru cauciuc Balogh
 STR_80AC_UHL_RUBBER_TRUCK                                       :Camion pentru cauciuc Uhl
 STR_80AD_RMT_RUBBER_TRUCK                                       :Camion pentru cauciuc RMT
-STR_80AE_MIGHTYMOVER_SUGAR_TRUCK                                :Camion pt. zahãr MightyMover
-STR_80AF_POWERNAUGHT_SUGAR_TRUCK                                :Camion pt. zahãr Powernaught
-STR_80B0_WIZZOWOW_SUGAR_TRUCK                                   :Camion pentru zahãr Wizzowow
-STR_80B1_MIGHTYMOVER_COLA_TRUCK                                 :Cola Camion MightyMover
-STR_80B2_POWERNAUGHT_COLA_TRUCK                                 :Cola Camion Powernaught
-STR_80B3_WIZZOWOW_COLA_TRUCK                                    :Cola Camion Wizzowow
-STR_80B4_MIGHTYMOVER_COTTON_CANDY                               :Camion pt. vatã zahãr MightyMover
-STR_80B5_POWERNAUGHT_COTTON_CANDY                               :Camion pt. vatã zahãr Powernaught
-STR_80B6_WIZZOWOW_COTTON_CANDY_TRUCK                            :Camion pt. vatã zahãr Wizzowow
-STR_80B7_MIGHTYMOVER_TOFFEE_TRUCK                               :Camion pt. caramel MightyMover
-STR_80B8_POWERNAUGHT_TOFFEE_TRUCK                               :Camion pt. caramel Powernaught
+STR_80AE_MIGHTYMOVER_SUGAR_TRUCK                                :Camion pentru zahăr MightyMover
+STR_80AF_POWERNAUGHT_SUGAR_TRUCK                                :Camion pentru zahăr Powernaught
+STR_80B0_WIZZOWOW_SUGAR_TRUCK                                   :Camion pentru zahăr Wizzowow
+STR_80B1_MIGHTYMOVER_COLA_TRUCK                                 :Camion pentru cola MightyMover
+STR_80B2_POWERNAUGHT_COLA_TRUCK                                 :Camion pentru cola Powernaught
+STR_80B3_WIZZOWOW_COLA_TRUCK                                    :Camion pentru cola Wizzowow
+STR_80B4_MIGHTYMOVER_COTTON_CANDY                               :Camion pentru vată de zahăr MightyMover
+STR_80B5_POWERNAUGHT_COTTON_CANDY                               :Camion pentru vată de zahăr Powernaught
+STR_80B6_WIZZOWOW_COTTON_CANDY_TRUCK                            :Camion pentru vată de zahăr Wizzowow
+STR_80B7_MIGHTYMOVER_TOFFEE_TRUCK                               :Camion pentru caramel MightyMover
+STR_80B8_POWERNAUGHT_TOFFEE_TRUCK                               :Camion pentru caramel Powernaught
 STR_80B9_WIZZOWOW_TOFFEE_TRUCK                                  :Camion pentru caramel Wizzowow
-STR_80BA_MIGHTYMOVER_TOY_VAN                                    :Camion pt. jucãrii MightyMover
-STR_80BB_POWERNAUGHT_TOY_VAN                                    :Camion pt. jucãrii Powernaught
-STR_80BC_WIZZOWOW_TOY_VAN                                       :Camion pentru jucãrii Wizzowow
-STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :Camion pt. bomboane MightyMover
-STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Camion pt. bomboane Powernaught
+STR_80BA_MIGHTYMOVER_TOY_VAN                                    :Camion pentru jucării MightyMover
+STR_80BB_POWERNAUGHT_TOY_VAN                                    :Camion pentru jucării Powernaught
+STR_80BC_WIZZOWOW_TOY_VAN                                       :Camion pentru jucării Wizzowow
+STR_80BD_MIGHTYMOVER_CANDY_TRUCK                                :Camion pentru bomboane MightyMover
+STR_80BE_POWERNAUGHT_CANDY_TRUCK                                :Camion pentru bomboane Powernaught
 STR_80BF_WIZZOWOW_CANDY_TRUCK                                   :Camion pentru bomboane Wizzowow
-STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :Camion pt. baterii MightyMover
-STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Camion pt. baterii Powernaught
+STR_80C0_MIGHTYMOVER_BATTERY_TRUCK                              :Camion pentru baterii MightyMover
+STR_80C1_POWERNAUGHT_BATTERY_TRUCK                              :Camion pentru baterii Powernaught
 STR_80C2_WIZZOWOW_BATTERY_TRUCK                                 :Camion pentru baterii Wizzowow
-STR_80C3_MIGHTYMOVER_FIZZY_DRINK                                :Camion pt. sucuri MightyMover
-STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :Camion pt. sucuri Powernaught
+STR_80C3_MIGHTYMOVER_FIZZY_DRINK                                :Camion pentru sucuri MightyMover
+STR_80C4_POWERNAUGHT_FIZZY_DRINK                                :Camion pentru sucuri Powernaught
 STR_80C5_WIZZOWOW_FIZZY_DRINK_TRUCK                             :Camion pentru sucuri Wizzowow
-STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK                              :Camion pt. plastic MightyMover
-STR_80C7_POWERNAUGHT_PLASTIC_TRUCK                              :Camion pt. plastic Powernaught
+STR_80C6_MIGHTYMOVER_PLASTIC_TRUCK                              :Camion pentru plastic MightyMover
+STR_80C7_POWERNAUGHT_PLASTIC_TRUCK                              :Camion pentru plastic Powernaught
 STR_80C8_WIZZOWOW_PLASTIC_TRUCK                                 :Camion pentru plastic Wizzowow
-STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :Camion pt. balonase MightyMover
-STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Camion pt. balonase Powernaught
-STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Camion pentru balonase Wizzowow
+STR_80C9_MIGHTYMOVER_BUBBLE_TRUCK                               :Camion pentru balonaÅŸe MightyMover
+STR_80CA_POWERNAUGHT_BUBBLE_TRUCK                               :Camion pentru balonaÅŸe Powernaught
+STR_80CB_WIZZOWOW_BUBBLE_TRUCK                                  :Camion pentru balonaÅŸe Wizzowow
 STR_80CC_MPS_OIL_TANKER                                         :Tanc petrolier MPS
 STR_80CD_CS_INC_OIL_TANKER                                      :Tanc petrolier CS-Inc.
-STR_80CE_MPS_PASSENGER_FERRY                                    :Vas de pasageri MPS
-STR_80CF_FFP_PASSENGER_FERRY                                    :Vas de pasageri FFP
-STR_80D0_BAKEWELL_300_HOVERCRAFT                                :Vas de pasageri Bakewell 300
-STR_80D1_CHUGGER_CHUG_PASSENGER                                 :Vas de pasageri Chugger-Chug
-STR_80D2_SHIVERSHAKE_PASSENGER_FERRY                            :Vas de pasageri Shivershake
-STR_80D3_YATE_CARGO_SHIP                                        :Navã de marfã Yate Cargo
-STR_80D4_BAKEWELL_CARGO_SHIP                                    :Navã de marfã Bakewell
-STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Navã de marfã Mightymover
-STR_80D6_POWERNAUT_CARGO_SHIP                                   :Navã de marfã Powernaut
+STR_80CE_MPS_PASSENGER_FERRY                                    :Feribot de călători MPS
+STR_80CF_FFP_PASSENGER_FERRY                                    :Feribot de călători FFP
+STR_80D0_BAKEWELL_300_HOVERCRAFT                                :Aeroglisor Bakewell 300
+STR_80D1_CHUGGER_CHUG_PASSENGER                                 :Feribot de călători Chugger-Chug
+STR_80D2_SHIVERSHAKE_PASSENGER_FERRY                            :Feribot de călători Shivershake
+STR_80D3_YATE_CARGO_SHIP                                        :Navă de marfă Yate
+STR_80D4_BAKEWELL_CARGO_SHIP                                    :Navă de marfă Bakewell
+STR_80D5_MIGHTYMOVER_CARGO_SHIP                                 :Navă de marfă Mightymover
+STR_80D6_POWERNAUT_CARGO_SHIP                                   :Navă de marfă Powernaut
 STR_80D7_SAMPSON_U52                                            :Sampson U52
 STR_80D8_COLEMAN_COUNT                                          :Coleman Count
 STR_80D9_FFP_DART                                               :FFP Dart
@@ -2475,37 +2533,37 @@
 STR_80FD_TRICARIO_HELICOPTER                                    :Elicopter Tricario
 STR_80FE_GURU_X2_HELICOPTER                                     :Elicopter Guru X2
 STR_80FF_POWERNAUT_HELICOPTER                                   :Elicopter Powernaut
-STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Mesaj de la producãtorul de vehicule
+STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Mesaj de la producătorul de vehicule
 STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Am creat un nou tip de {STRING}. Ati fi interesati de folosirea exclusivã pentru un an a acestui vehicul, astfel ca noi sa putem observa rezultatele înaintea lansãrii oficiale?
-STR_8102_RAILROAD_LOCOMOTIVE                                    :vehicul feroviar
+STR_8102_RAILROAD_LOCOMOTIVE                                    :locomotivă
 STR_8103_ROAD_VEHICLE                                           :autovehicul
-STR_8104_AIRCRAFT                                               :aeronavã
-STR_8105_SHIP                                                   :navã
-STR_8106_MONORAIL_LOCOMOTIVE                                    :vehicul monorail
-STR_8107_MAGLEV_LOCOMOTIVE                                      :vehicul maglev
+STR_8104_AIRCRAFT                                               :aeronavă
+STR_8105_SHIP                                                   :navă
+STR_8106_MONORAIL_LOCOMOTIVE                                    :locomotivă monoşină
+STR_8107_MAGLEV_LOCOMOTIVE                                      :locomotivă maglev
 
 ##id 0x8800
 STR_8800_TRAIN_DEPOT                                            :{WHITE}Depoul {TOWN}
-STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cetãtenii sãrbãtoresc {}sosirea primului tren la {STATION}!
+STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cetăţenii sărbătoresc {}sosirea primului tren la {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{STRING} (Detalii)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Tren în drum
 STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8806_GO_TO                                                  :Mergi la {STATION}
-STR_8807_GO_TO_TRANSFER                                         :Mergi la {STATION} (Transferã si preia încãrcãtura)
-STR_8808_GO_TO_UNLOAD                                           :Mergi la {STATION} (Descarcã)
-STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Mergi la {STATION} (Transferã si lasã descãrcat)
-STR_880A_GO_TO_LOAD                                             :Mergi la {STATION} (Încarcã)
-STR_880B_GO_TO_TRANSFER_LOAD                                    :Mergi la {STATION} (Transferã si încarcã 100%)
-STR_880C_GO_NON_STOP_TO                                         :Mergi non-stop la {STATION}
+STR_8807_GO_TO_TRANSFER                                         :Mergi la {STATION} (Transferă şi preia încărcătura)
+STR_8808_GO_TO_UNLOAD                                           :Mergi la {STATION} (Descarcă)
+STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Mergi la {STATION} (Transferă şi lasă descărcat)
+STR_880A_GO_TO_LOAD                                             :Mergi la {STATION} (Încarcă)
+STR_880B_GO_TO_TRANSFER_LOAD                                    :Mergi la {STATION} (Transferă şi încarcă 100%)
+STR_880C_GO_NON_STOP_TO                                         :Mergi fără oprire la {STATION}
 STR_880D_GO_TO_NON_STOP_TRANSFER                                :Mergi non-stop la {STATION} (Transferã si ia încãrcãtura)
-STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Mergi non-stop la {STATION} (Descarcã)
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Mergi non-stop la {STATION} (Transferã si lasã descãrcat)
-STR_8810_GO_NON_STOP_TO_LOAD                                    :Mergi non-stop la {STATION} (Încarcã)
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Mergi non-stop la {STATION} (Transferã si încarcã 100%)
+STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Mergi fără oprire la {STATION} (Descarcă)
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Mergi fără oprire la {STATION} (Transferă şi lasă descărcat)
+STR_8810_GO_NON_STOP_TO_LOAD                                    :Mergi fără oprire la {STATION} (Încarcă)
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Mergi fără oprire la {STATION} (Transferă şi încarcă 100%)
 STR_GO_TO_TRAIN_DEPOT                                           :Mergi la depoul {TOWN}
 STR_SERVICE_AT_TRAIN_DEPOT                                      :Service la Depoul {TOWN}
-STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Mergi non-stop la Depoul {TOWN}
+STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Mergi fără oprire la Depoul {TOWN}
 STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :Non-stop pt. service la Depoul {TOWN}
 
 STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Merge la Depoul {TOWN}
@@ -2519,65 +2577,65 @@
 STR_8812_EMPTY                                                  :{LTBLUE}Gol
 STR_8813_FROM                                                   :{LTBLUE}{CARGO} de la {STATION}
 STR_FROM_MULT                                                   :{LTBLUE}{CARGO} de la {STATION} (x{NUM})
-STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Trenul {COMMA} asteaptã în depou
+STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}Trenul {COMMA} aşteaptă în depou
 STR_8815_NEW_VEHICLES                                           :{BLACK}Vehicule noi
 STR_8816                                                        :{BLACK}-
 STR_8819_TRAIN_TOO_LONG                                         :{WHITE}Tren prea lung
-STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Trenurile pot fi modificate doar când se aflã într-un depou
-STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Trenuri
+STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Trenurile pot fi modificate doar când staţionează într-un depou
+STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Tren{P "" uri}
 
 STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Noi vehicule feroviare
 STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Noi Vehicule Electrice pe Sine
-STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Noi vehicule monorail
+STR_881D_NEW_MONORAIL_VEHICLES                                  :{WHITE}Noi vehicule monoşină
 STR_881E_NEW_MAGLEV_VEHICLES                                    :{WHITE}Noi vehicule maglev
 STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Vehicule pe sine
 
-STR_881F_BUILD_VEHICLE                                          :{BLACK}Cumpãrã vehicul
+STR_881F_BUILD_VEHICLE                                          :{BLACK}Cumpără vehicul
 STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Cloneazã vehiculul
 STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Acest buton va crea o copie a autovehiculului. Control+click pentru comenzi comune
 STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Acest buton va crea o copie a autovehiculului. Apasã acest buton, apoi fã click pe un autovehicul de pe hartã. Control+click pentru a-i da ordine comune
 STR_CLONE_TRAIN                                                 :{BLACK}Cloneazã trenul
 STR_CLONE_TRAIN_INFO                                            :{BLACK}Acest buton va crea o copie a întregului tren. Control+click pentru comenzi comune
 STR_CLONE_TRAIN_DEPOT_INFO                                      :{BLACK}Acest buton va crea o copie a întregului tren. Apasã acest buton, apoi fã click pe un tren de pe hartã. Control+click pentru a-i da ordine comune
-STR_8820_RENAME                                                 :{BLACK}Redenumeste
+STR_8820_RENAME                                                 :{BLACK}RedenumeÅŸte
 STR_8823_SKIP                                                   :{BLACK}Sãri peste
-STR_8824_DELETE                                                 :{BLACK}Sterge
-STR_8825_NON_STOP                                               :{BLACK}Non-stop
+STR_8824_DELETE                                                 :{BLACK}Åžterge
+STR_8825_NON_STOP                                               :{BLACK}Fără oprire
 STR_8826_GO_TO                                                  :{BLACK}Mergi la
-STR_8827_FULL_LOAD                                              :{BLACK}Full-load
-STR_8828_UNLOAD                                                 :{BLACK}Descãrcare
+STR_8827_FULL_LOAD                                              :{BLACK}Încarcă 100%
+STR_8828_UNLOAD                                                 :{BLACK}Descarcă
 STR_REFIT                                                       :{BLACK}Rearanjeaza
 STR_REFIT_TIP                                                   :{BLACK}Alege tipul de marfa pentru rearanjare. Control+click pt a anula rearanjarea
 STR_REFIT_ORDER                                                 :(Rearanjeaza in {STRING})
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (Comenzi)
-STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Sfârsitul comenzilor - -
+STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Sfârşitul comenzilor - -
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}Service
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Nu pot construi vehiculul...
-STR_882C_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Cumpãrat: {LTBLUE}{NUM}{BLACK} Valoare: {LTBLUE}{CURRENCY}
+STR_882C_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   Cumpărat: {LTBLUE}{NUM}{BLACK} Valoare: {LTBLUE}{CURRENCY}
 STR_882D_VALUE                                                  :{LTBLUE}{STRING}{BLACK}   Valoare: {LTBLUE}{CURRENCY}
 STR_882E                                                        :{WHITE}{VEHICLE}
-STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Încarcã / Descarcã
+STR_882F_LOADING_UNLOADING                                      :{LTBLUE}Încărcare / Descărcare
 STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}Trenul trebuie oprit intr-un depou
 STR_8830_CAN_T_SEND_TRAIN_TO_DEPOT                              :{WHITE}Nu pot trimite trenul la depou...
 STR_8831_NO_MORE_SPACE_FOR_ORDERS                               :{WHITE}Nu mai este loc pentru comenzi
 STR_8832_TOO_MANY_ORDERS                                        :{WHITE}Prea multe comenzi
-STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Nu pot adãuga o comandã nouã...
-STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Nu pot sterge aceastã comandã...
-STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Nu pot modifica aceastã comandã...
+STR_8833_CAN_T_INSERT_NEW_ORDER                                 :{WHITE}Nu pot adăuga o comandă nouă...
+STR_8834_CAN_T_DELETE_THIS_ORDER                                :{WHITE}Nu pot şterge această comandă...
+STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Nu pot modifica această comandă...
 STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Nu pot muta vehiculul...
 STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}Al doilea vagon+motor va avea mereu aceeasi destinatie ca si primul
 STR_8838_N_A                                                    :N/A{SKIP}
 STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Nu pot vinde vehiculul...
-STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Nu pot gãsi un drum spre un depou local
+STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Nu pot găsi un drum spre un depou local
 STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Nu pot opri-porni trenul...
-STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Intervalul pt. service: {LTBLUE}{COMMA}zile{BLACK}   Ultimul service: {LTBLUE}{DATE_LONG}
+STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}Intervalul pentru întreţinere: {LTBLUE}{COMMA}zile{BLACK}   Ultima întreţinere: {LTBLUE}{DATE_LONG}
 STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}Intervalul de service: {LTBLUE}{COMMA}%{BLACK}   Ultimul service: {LTBLUE}{DATE_LONG}
-STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Trenuri - apasã aici pentru informatii despre trenuri
-STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Cumpãrã trenuri noi (necesitã un depou)
-STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Trenuri - clic pe tren pentru informatii, mutã vehiculele pentru adaugare scoatere din tren
-STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}Construieste un nou vehicul feroviar
-STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Mutã un vehicul aici pentru a-l vinde
+STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Trenuri - apasă aici pentru informaţii despre trenuri
+STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}Cumpără trenuri noi (necesită un depou)
+STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}Trenuri - clic pe tren pentru informaţii, mută vehiculele pentru adăugare-scoatere din tren
+STR_8840_BUILD_NEW_TRAIN_VEHICLE                                :{BLACK}ConstruieÅŸte un nou vehicul feroviar
+STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE                             :{BLACK}Mută un vehicul aici pentru a-l vinde
 STR_8842_CENTER_MAIN_VIEW_ON_TRAIN                              :{BLACK}Centreazã imaginea pe locatia depoului
 STR_8843_TRAIN_VEHICLE_SELECTION                                :{BLACK}Lista de selectie a componentelor trenului - clic pe vehicule pt. informatii
 STR_8844_BUILD_THE_HIGHLIGHTED_TRAIN                            :{BLACK}Cumpãrã vehiculul selectat
@@ -2598,11 +2656,11 @@
 STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Lista de comenzi - clic pe comandã pentru a o selecta
 STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}Sãri peste comanda curentã si treci la urmãtoarea
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Sterge comanda selectatã
-STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Mergi non-stop pânã la destinatia din comanda selectatã
+STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Circulă fără oprire până la destinaţia selectată
 STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Introdu o comandã înaintea celei selectate sau adaugã o comandã la sfârsitul listei
 STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Forteazã trenul sã astepte la destinatia selectatã pânã la umplerea la capacitate maximã
 STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Forteazã trenul sã descarce marfa la destinatia selectatã
-STR_SERVICE_HINT                                                :{BLACK}Sãri peste aceastã comandã dacã nu este necesar un service
+STR_SERVICE_HINT                                                :{BLACK}Sari peste aceastã comandã dacã nu este necesar un service
 STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Cost: {CURRENCY} Greutate: {WEIGHT_S}{}Vitezã: {VELOCITY}  Putere: {POWER}{}Cost de rulare: {CURRENCY}/an{}Capacitate: {CARGO}
 STR_885C_BROKEN_DOWN                                            :{RED}Defectiune
 STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}Vechimea: {LTBLUE}{STRING}{BLACK}   Cost de rulare: {LTBLUE}{CURRENCY}/an
@@ -2681,6 +2739,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Numele autovehiculului
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cetãtenii sãrbãtoresc{}sosirea primului autobuz la {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Cetãtenii sãrbãtoresc{}sosirea primului camion la {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Cetăţenii sărbătoresc . . .{}sosirea primului primul tramvai pentru călători la {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Cetăţenii sărbătoresc . . .{}sosirea primului primul tramvai pentru marfă la {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Accident rutier!{}Soferul decedat in urma coliziunii cu un tren
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Accident rutier!{}{COMMA} victime in urma coliziunii cu un tren
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Nu pot schimba întoarce autvehiculul...
@@ -2699,8 +2759,8 @@
 STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Alege tipul de marfa pentru transport cu autovehiculul
 
 ##id 0x9800
-STR_9800_DOCK_CONSTRUCTION                                      :Constructii navale
-STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Constructie port
+STR_9800_DOCK_CONSTRUCTION                                      :Construcţii navale
+STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}Construcţie port
 STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Nu pot construi port aici...
 STR_9803_SHIP_DEPOT                                             :{WHITE}Santierul Naval {TOWN}
 STR_9804_NEW_SHIPS                                              :{BLACK}Nave noi
@@ -2767,7 +2827,7 @@
 STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Nu pot schimba tipul navei...
 STR_9842_REFITTABLE                                             :(suportã alte mãrfuri)
 STR_GO_TO_SHIP_DEPOT                                            :Mergi la Santierul Naval {TOWN}
-SERVICE_AT_SHIP_DEPOT                                           :Service la Santierul Naval {TOWN}
+SERVICE_AT_SHIP_DEPOT                                           :Întreţinere la şantierul naval {TOWN}
 
 ##id 0xA000
 STR_A000_AIRPORTS                                               :{WHITE}Airoporturi
@@ -2802,7 +2862,7 @@
 STR_A01A_CAPACITY                                               :{BLACK}Capacitate: {LTBLUE}{CARGO}
 STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}Aeronava trebuie sã se afle într-un hangar
 STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}Nu pot vinde aeronava...
-STR_A01D_AIRPORT_CONSTRUCTION                                   :Constructie aeroport
+STR_A01D_AIRPORT_CONSTRUCTION                                   :Construcţie aeroport
 STR_A01E_BUILD_AIRPORT                                          :{BLACK}Constr. aeroport
 STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}Aeronavã - clic pe aeronavã pentru informatii
 STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}Cumpãrã o nouã aeronavã (necesitã un aeroport)
@@ -2839,7 +2899,7 @@
 STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}Noua capacitate: {GOLD}{STRING}{}{BLACK}Costul transformãrii: {GOLD}{CURRENCY}
 STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}Nu pot schimba tipul de încãrcãturã...
 STR_GO_TO_AIRPORT_HANGAR                                        :Mergi la Hangarul {STATION}
-SERVICE_AT_AIRPORT_HANGAR                                       :Service la Hangarul {STATION}
+SERVICE_AT_AIRPORT_HANGAR                                       :Întreţinere la hangarul {STATION}
 
 ##id 0xB000
 STR_B000_ZEPPELIN_DISASTER_AT                                   :{BLACK}{BIGFONT}Accident de zepelin la{STATION}!
@@ -2904,6 +2964,7 @@
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Parametru invalid pentru {STRING}: parametrul {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} trebuie sa fie incarcat inaintea {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} trebuie sa fie incarcat dupa {STRING}.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :fisierul GRF conceput pentru traducere
 
 STR_NEWGRF_ADD                                                  :{BLACK}Adauga
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Adauga un fisier NewGRF in lista
@@ -2964,6 +3025,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Esti pe cale sa vinzi toate vehiculele din depou. Esti sigur?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Tip incorect de depou
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Vinde toate trenurile din the depou
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Vinde toate autovehiculele din depou
@@ -3001,7 +3063,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Fã optiunea de autoînlocuire sã pãstreze identicã lungimea unui tren prin eliminarea vagoanelor (începând din fatã), dacã înlocuirea motorului ar face trenul mai lung.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}ÃŽnlocuire: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} ELEMENT EXPERIMENTAL {}Comutã între ferestrele de ]nlocuire motoare si vagoane.{}Înlocuirea de vagoane va fi efectuatã numai dacã noul vagon poate transporta acelasi tip de încãrcãturã ca cel vechi. Aceast lucru este verificat pentru fiecare vagon atunci când este fãcutã înlocuirea efectivã.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Motorul nu poate fi construit
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehiculul nu este disponibil
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehiculul nu este disponibil
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Vasul nu este disponibil
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aeronava nu este disponibila
 
 STR_ENGINES                                                     :Motoare
 STR_WAGONS                                                      :Vagoane
@@ -3077,6 +3142,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Modifica inceputul anului
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Avertisment de scala
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Redimensionarea excesiva a hartii nu este recomandata. Continui cu generarea?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Avertisment aspect oras
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Aspectul de oras "fara alte drumuri" nu este recomanat. Continui generarea?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nume harta inaltimi:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Dimensiune: {ORANGE}{NUM} x {NUM}
@@ -3138,3 +3205,36 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transfera Credit: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...drum in proprietatea orasului
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...drum orientat in directia gresita
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Optiuni transparenta
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Comuta transparenta pentru semnele de statii
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Comuta transparenta pentru copaci
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Comuta transparenta pentru case
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Comuta transparenta pentru industrii
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Comuta transparenta pentru construibile, precum statii, depouri, indicatoare si linii electrificate
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Comuta transparenta pentru poduri
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Comuta transparenta pentru structuri ca farurile si antenele - poate in viitor, pentru efect
+
+##### Mass Order
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Toate trenurile
+STR_GROUP_ALL_ROADS                                             :Toate autovehiculele
+STR_GROUP_ALL_SHIPS                                             :Toate navele
+STR_GROUP_ALL_AIRCRAFTS                                         :Toate aeronavele
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Tren{P "" uri}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Autovehicul{P "" e}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Nav{P a e}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Aeronav{P a e}
+
+
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Profit anul acesta: {GREEN}{CURRENCY} {BLACK}(anul trecut: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit anul acesta: {RED}{CURRENCY} {BLACK}(anul trecut: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Profit anul acesta: {GREEN}{CURRENCY} {BLACK}(anul trecut: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Profit anul acesta: {RED}{CURRENCY} {BLACK}(anul trecut: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/russian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/russian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -5,6 +5,8 @@
 ##case m f n p
 ##gender m f n p
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Край карты
@@ -158,7 +160,7 @@
 STR_00B3_MESSAGE_FROM                                           :{YELLOW}Сообщение из {STRING}
 STR_POPUP_CAUTION_CAPTION                                       :{WHITE}ОÑторожно!
 STR_00B4_CAN_T_DO_THIS                                          :{WHITE}Это невозможно
-STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Ðевозможно раÑчиÑтить
+STR_00B5_CAN_T_CLEAR_THIS_AREA                                  :{WHITE}Ðевозможно раÑчиÑтить...
 STR_00B6_ORIGINAL_COPYRIGHT                                     :{BLACK}Оригинальные авторÑкие права {COPYRIGHT} 1995 Chris Sawyer, Ð’Ñе права защищены
 STR_00B7_VERSION                                                :{BLACK}OpenTTD v{REV}
 STR_00BA_COPYRIGHT_OPENTTD                                      :{BLACK}OpenTTD {COPYRIGHT}2002-2007 Команда разработчиков OpenTTD
@@ -195,7 +197,7 @@
 STR_00E1_TOO_MANY_VEHICLES_IN_GAME                              :{WHITE}Слишком много транÑпорта в игре
 STR_00E2                                                        :{BLACK}{COMMA}
 STR_00E3                                                        :{RED}{COMMA}
-STR_00E4_LOCATION                                               :{BLACK}ПозициÑ
+STR_00E4_LOCATION                                               :{BLACK}Обзор
 STR_00E5_CONTOURS                                               :Контуры
 STR_00E6_VEHICLES                                               :ТранÑпорт
 STR_00E7_INDUSTRIES                                             :ПромышленноÑÑ‚ÑŒ
@@ -221,7 +223,7 @@
 STR_00FB_POWER_STATION                                          :{BLACK}{TINYFONT}ЭлектроÑтанциÑ
 STR_00FC_FOREST                                                 :{BLACK}{TINYFONT}ЛеÑ
 STR_00FD_SAWMILL                                                :{BLACK}{TINYFONT}ЛеÑопилка
-STR_00FE_OIL_REFINERY                                           :{BLACK}{TINYFONT}Ðефтеперегонный завод
+STR_00FE_OIL_REFINERY                                           :{BLACK}{TINYFONT}Ðефтезавод
 STR_00FF_FARM                                                   :{BLACK}{TINYFONT}Ферма
 STR_0100_FACTORY                                                :{BLACK}{TINYFONT}Завод
 STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}ТипографиÑ
@@ -229,7 +231,7 @@
 STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}Шахта железной руды
 STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}Сталелитейный завод
 STR_0105_BANK                                                   :{BLACK}{TINYFONT}Банк
-STR_0106_PAPER_MILL                                             :{BLACK}{TINYFONT}Целлюлозно-бумажный комбинат
+STR_0106_PAPER_MILL                                             :{BLACK}{TINYFONT}Ð‘ÑƒÐ¼Ð°Ð¶Ð½Ð°Ñ Ñ„Ð°Ð±Ñ€Ð¸ÐºÐ°
 STR_0107_GOLD_MINE                                              :{BLACK}{TINYFONT}Золотой прииÑк
 STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}Пищевой завод
 STR_0109_DIAMOND_MINE                                           :{BLACK}{TINYFONT}ÐÐ»Ð¼Ð°Ð·Ð½Ð°Ñ ÑˆÐ°Ñ…Ñ‚Ð°
@@ -270,7 +272,7 @@
 STR_012C_MESSAGE                                                :{WHITE}Сообщение
 STR_012D                                                        :{WHITE}{STRING}
 STR_012E_CANCEL                                                 :{BLACK}Отмена
-STR_012F_OK                                                     :{BLACK}Хорошо
+STR_012F_OK                                                     :{BLACK}ПринÑÑ‚ÑŒ
 STR_0130_RENAME                                                 :{BLACK}Переимен.
 STR_0131_TOO_MANY_NAMES_DEFINED                                 :{WHITE}Слишком много имен определено
 STR_0132_CHOSEN_NAME_IN_USE_ALREADY                             :{WHITE}Выбранное Ð¸Ð¼Ñ ÑƒÐ¶Ðµ иÑпользуетÑÑ
@@ -284,7 +286,7 @@
 STR_OSNAME_OS2                                                  :OS/2
 STR_OSNAME_SUNOS                                                :SunOS
 
-STR_013B_OWNED_BY                                               :{WHITE}...принадлежащий {STRING}
+STR_013B_OWNED_BY                                               :{WHITE}...принадлежит {STRING}
 STR_013C_CARGO                                                  :{BLACK}Груз
 STR_013D_INFORMATION                                            :{BLACK}ИнформациÑ
 STR_013E_CAPACITIES                                             :{BLACK}ВмеÑтимоÑÑ‚ÑŒ
@@ -348,14 +350,14 @@
 STR_UNITS_FORCE_SI                                              :{COMMA} kN
 
 ############ range for menu starts
-STR_0154_OPERATING_PROFIT_GRAPH                                 :Текущий график доходов
+STR_0154_OPERATING_PROFIT_GRAPH                                 :График прибыли
 STR_0155_INCOME_GRAPH                                           :График дохода
-STR_0156_DELIVERED_CARGO_GRAPH                                  :ДоÑтавленные грузы
-STR_0157_PERFORMANCE_HISTORY_GRAPH                              :Рейтинг
-STR_0158_COMPANY_VALUE_GRAPH                                    :СтоимоÑÑ‚ÑŒ компании
-STR_0159_CARGO_PAYMENT_RATES                                    :Оплата перевозок
-STR_015A_COMPANY_LEAGUE_TABLE                                   :ПорÑÐ´ÐºÐ¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° компаний
-STR_PERFORMANCE_DETAIL_MENU                                     :Подробные данные
+STR_0156_DELIVERED_CARGO_GRAPH                                  :График доÑтавленного груза
+STR_0157_PERFORMANCE_HISTORY_GRAPH                              :График рейтинга компаний
+STR_0158_COMPANY_VALUE_GRAPH                                    :График ÑтоимоÑти компаний
+STR_0159_CARGO_PAYMENT_RATES                                    :График оплаты перевозок
+STR_015A_COMPANY_LEAGUE_TABLE                                   :Табель о рангах
+STR_PERFORMANCE_DETAIL_MENU                                     :Рейтинг в деталÑÑ…
 ############ range for menu ends
 
 STR_015B_OPENTTD                                                :{WHITE}Об OpenTTD
@@ -365,35 +367,35 @@
 STR_015F_QUIT                                                   :Выход
 STR_ABANDON_GAME_QUERY                                          :{YELLOW}Ð’Ñ‹ дейÑтвительно хотите выйти из игры?
 STR_0161_QUIT_GAME                                              :{WHITE}В главное меню
-STR_SORT_ORDER_TIP                                              :{BLACK}Выбор Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñортировки (убывание/возраÑтание)
-STR_SORT_CRITERIA_TIP                                           :{BLACK}Выбор ÐºÑ€Ð¸Ñ‚ÐµÑ€Ð¸Ñ Ñортировки
-STR_SORT_BY                                                     :{BLACK}Сортировать по
+STR_SORT_ORDER_TIP                                              :{BLACK}Смена Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñортировки (убывание/возраÑтание)
+STR_SORT_CRITERIA_TIP                                           :{BLACK}Смена ÐºÑ€Ð¸Ñ‚ÐµÑ€Ð¸Ñ Ñортировки
+STR_SORT_BY                                                     :{BLACK}Сортировка
 
-STR_SORT_BY_POPULATION                                          :{BLACK}наÑелению
-STR_SORT_BY_PRODUCTION                                          :{BLACK}кол-ву продукции
-STR_SORT_BY_TYPE                                                :{BLACK}типу
-STR_SORT_BY_TRANSPORTED                                         :{BLACK}перевезенной прод.
-STR_SORT_BY_NAME                                                :{BLACK}имени
-STR_SORT_BY_DROPDOWN_NAME                                       :названию
-STR_SORT_BY_DATE                                                :{BLACK}дате
-STR_SORT_BY_NUMBER                                              :номеру
-STR_SORT_BY_PROFIT_LAST_YEAR                                    :прибыли в прошлом году
-STR_SORT_BY_PROFIT_THIS_YEAR                                    :прибыли в Ñтом году
-STR_SORT_BY_AGE                                                 :возраÑту
-STR_SORT_BY_RELIABILITY                                         :надежноÑти
-STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :вмеÑтимоÑти грузов
-STR_SORT_BY_MAX_SPEED                                           :макÑ. ÑкороÑти
-STR_SORT_BY_MODEL                                               :модели
-STR_SORT_BY_VALUE                                               :значению
-STR_SORT_BY_FACILITY                                            :типу Ñтанции
-STR_SORT_BY_WAITING                                             :кол-ву товара на Ñтанции
-STR_SORT_BY_RATING_MAX                                          :рейтингу грузов
+STR_SORT_BY_POPULATION                                          :{BLACK}ÐаÑеление
+STR_SORT_BY_PRODUCTION                                          :{BLACK}ПродукциÑ
+STR_SORT_BY_TYPE                                                :{BLACK}Тип
+STR_SORT_BY_TRANSPORTED                                         :{BLACK}Вывоз
+STR_SORT_BY_NAME                                                :{BLACK}ИмÑ
+STR_SORT_BY_DROPDOWN_NAME                                       :Ðазвание
+STR_SORT_BY_DATE                                                :{BLACK}Дата
+STR_SORT_BY_NUMBER                                              :Ðомер
+STR_SORT_BY_PROFIT_LAST_YEAR                                    :Прибыль в прошлом году
+STR_SORT_BY_PROFIT_THIS_YEAR                                    :Прибыль в Ñтом году
+STR_SORT_BY_AGE                                                 :ВозраÑÑ‚
+STR_SORT_BY_RELIABILITY                                         :ÐадежноÑÑ‚ÑŒ
+STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE                        :ВмеÑтимоÑÑ‚ÑŒ груза
+STR_SORT_BY_MAX_SPEED                                           :МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ
+STR_SORT_BY_MODEL                                               :Модель
+STR_SORT_BY_VALUE                                               :СтоимоÑÑ‚ÑŒ
+STR_SORT_BY_FACILITY                                            :Тип Ñтанции
+STR_SORT_BY_WAITING                                             :Кол-во товара на Ñтанции
+STR_SORT_BY_RATING_MAX                                          :Рейтинг грузов
 STR_ENGINE_SORT_ENGINE_ID                                       :Ðазвание
 STR_ENGINE_SORT_COST                                            :Цена
 STR_ENGINE_SORT_POWER                                           :МощноÑÑ‚ÑŒ
 STR_ENGINE_SORT_INTRO_DATE                                      :Дата поÑтройки
-STR_ENGINE_SORT_RUNNING_COST                                    :СтоимоÑÑ‚ÑŒ обÑлуж.
-STR_ENGINE_SORT_POWER_VS_RUNNING_COST                           :Мощн./Стоим. обÑлуж.
+STR_ENGINE_SORT_RUNNING_COST                                    :Цена обÑлуживаниÑ
+STR_ENGINE_SORT_POWER_VS_RUNNING_COST                           :МощноÑÑ‚ÑŒ/Цена обÑлуживаниÑ
 STR_ENGINE_SORT_CARGO_CAPACITY                                  :ВмеÑтимоÑÑ‚ÑŒ
 STR_NO_WAITING_CARGO                                            :{BLACK}Ðа Ñтанции нет грузов, ожидающих погрузки
 STR_SELECT_ALL_FACILITIES                                       :{BLACK}Выбрать вÑе уÑтройÑтва
@@ -403,14 +405,14 @@
 STR_AVAILABLE_SHIPS                                             :{BLACK}ДоÑтупные Ñуда
 STR_AVAILABLE_AIRCRAFT                                          :{BLACK}ДоÑтупные Ñамолеты
 STR_AVAILABLE_ENGINES_TIP                                       :{BLACK}СпиÑок доÑтупного транÑпорта.
-STR_MANAGE_LIST                                                 :{BLACK}Редакт. ÑпиÑок
-STR_MANAGE_LIST_TIP                                             :{BLACK}ПоÑлать инÑтрукции вÑему транÑпорту в ÑпиÑке
-STR_REPLACE_VEHICLES                                            :Замена ТранÑпорта
-STR_SEND_TRAIN_TO_DEPOT                                         :ПоÑлать в Депо
+STR_MANAGE_LIST                                                 :{BLACK}ОрганизациÑ
+STR_MANAGE_LIST_TIP                                             :{BLACK}Управление транÑпортом, находÑщимÑÑ Ð² Ñтом ÑпиÑке
+STR_REPLACE_VEHICLES                                            :Замена транÑпорта
+STR_SEND_TRAIN_TO_DEPOT                                         :ПоÑлать в депо
 STR_SEND_ROAD_VEHICLE_TO_DEPOT                                  :ПоÑлать в гараж
-STR_SEND_SHIP_TO_DEPOT                                          :ПоÑлать в Док
-STR_SEND_AIRCRAFT_TO_HANGAR                                     :ПоÑлать в Ðнгар
-STR_SEND_FOR_SERVICING                                          :ПоÑлать на обÑлуживание
+STR_SEND_SHIP_TO_DEPOT                                          :ПоÑлать в док
+STR_SEND_AIRCRAFT_TO_HANGAR                                     :ПоÑлать в ангар
+STR_SEND_FOR_SERVICING                                          :ПоÑлать обÑлужить
 
 ############ range for months starts
 STR_0162_JAN                                                    :Янв
@@ -458,10 +460,10 @@
 STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}Ðевозможно изменить ÑервиÑный интервал...
 STR_018B_CLOSE_WINDOW                                           :{BLACK}Закрыть Окно
 STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}Заголовок окна - Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð° тащить за него
-STR_STICKY_BUTTON                                               :{BLACK}Пометить Ñто окно как незакрываемое Ð´Ð»Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸ 'Закрыть вÑе Окна'
+STR_STICKY_BUTTON                                               :{BLACK}Иммунитет от Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ¸ 'Закрыть вÑе окна'
 STR_RESIZE_BUTTON                                               :{BLACK}Ðажмите и тащите Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° окна
 STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}Кликните, чтобы перейти к текущей папке загрузки/ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию
-STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Уничтожить поÑтройки и Ñ‚.п. в квадрате земли
+STR_018D_DEMOLISH_BUILDINGS_ETC                                 :{BLACK}Уничтожить зданиÑ, поÑтройки, траву, Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð² Ñчейке меÑтноÑти
 STR_018E_LOWER_A_CORNER_OF_LAND                                 :{BLACK}ОпуÑтить угол земли
 STR_018F_RAISE_A_CORNER_OF_LAND                                 :{BLACK}ПоднÑÑ‚ÑŒ угол земли
 STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}Прокрутка вверх/вниз
@@ -482,8 +484,8 @@
 
 STR_019C_ROAD_VEHICLE                                           :ÐвтотранÑпорт
 STR_019D_AIRCRAFT                                               :Воздушный транÑпорт
-STR_019E_SHIP                                                   :Корабли
-STR_019F_TRAIN                                                  :Поезда
+STR_019E_SHIP                                                   :Корабль
+STR_019F_TRAIN                                                  :Поезд
 STR_01A0_IS_GETTING_OLD                                         :{WHITE}{STRING} {COMMA} уÑтарел
 STR_01A1_IS_GETTING_VERY_OLD                                    :{WHITE}{STRING} {COMMA} Ñильно уÑтарел
 STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA} Ñильно уÑтарел и требует замены
@@ -577,7 +579,7 @@
 STR_01F8_CLEAR_CURRENT_PROGRAM_CUSTOM1                          :{BLACK}ОчиÑтка пользовательÑкой программы
 STR_01F9_SAVE_MUSIC_SETTINGS                                    :{BLACK}Сохранить наÑтройки музыки
 STR_01FA_CLICK_ON_MUSIC_TRACK_TO                                :{BLACK}Кликните по названию трека Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² пользовательÑкую программу
-STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Выберите трек Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ из данной программы (только пользовательÑкие)
+STR_CLICK_ON_TRACK_TO_REMOVE                                    :{BLACK}Выберите дорожку Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· ÑпиÑка (только пользовательÑкого)
 STR_01FB_TOGGLE_PROGRAM_SHUFFLE                                 :{BLACK}Вкл./Выкл. Ñлучайный выбор программы
 STR_01FC_SHOW_MUSIC_TRACK_SELECTION                             :{BLACK}Показать окно выбора музыкальных треков
 STR_01FD_CLICK_ON_SERVICE_TO_CENTER                             :{BLACK}Ðажмите на маршрут Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¸ÑтиÑ/города
@@ -653,8 +655,8 @@
 STR_0241_POWER_STATION                                          :{BLACK}ЭлектроÑтанциÑ
 STR_0242_SAWMILL                                                :{BLACK}ЛеÑопилка
 STR_0243_FOREST                                                 :{BLACK}ЛеÑ
-STR_0244_OIL_REFINERY                                           :{BLACK}Ðефтеобраб. завод
-STR_0245_OIL_RIG                                                :{BLACK}Ð‘ÑƒÑ€Ð¾Ð²Ð°Ñ Ð²Ñ‹ÑˆÐºÐ°
+STR_0244_OIL_REFINERY                                           :{BLACK}Ðефтезавод
+STR_0245_OIL_RIG                                                :{BLACK}ÐефтÑÐ½Ð°Ñ Ð²Ñ‹ÑˆÐºÐ°
 STR_0246_FACTORY                                                :{BLACK}Фабрика
 STR_0247_STEEL_MILL                                             :{BLACK}Сталеплавильный завод
 STR_0248_FARM                                                   :{BLACK}Ферма
@@ -687,24 +689,24 @@
 STR_0263_CONSTRUCT_POWER_STATION                                :{BLACK}ПоÑтроить ÑлектроÑтанцию
 STR_0264_CONSTRUCT_SAWMILL                                      :{BLACK}ПоÑтроить леÑопилку
 STR_0265_PLANT_FOREST                                           :{BLACK}ПоÑадить леÑ
-STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}ПоÑтроить нефтеперераб. завод
-STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}ПоÑтроить буровую платформу (возможно только у ÐºÑ€Ð°Ñ ÐºÐ°Ñ€Ñ‚Ñ‹)
+STR_0266_CONSTRUCT_OIL_REFINERY                                 :{BLACK}ПоÑтроить нефтезавод
+STR_0267_CONSTRUCT_OIL_RIG_CAN_ONLY                             :{BLACK}ПоÑтроить нефтÑную вышку (только возможно у ÐºÑ€Ð°Ñ ÐºÐ°Ñ€Ñ‚Ñ‹)
 STR_0268_CONSTRUCT_FACTORY                                      :{BLACK}ПоÑтроить фабрику
-STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}ПоÑтроить Сталелитейный завод
+STR_0269_CONSTRUCT_STEEL_MILL                                   :{BLACK}ПоÑтроить Ñталелитейный завод
 STR_026A_CONSTRUCT_FARM                                         :{BLACK}ПоÑтроить ферму
 STR_026B_CONSTRUCT_IRON_ORE_MINE                                :{BLACK}ПоÑтроить шахту железной руды
 STR_026C_CONSTRUCT_OIL_WELLS                                    :{BLACK}ПоÑтроить нефтÑные Ñкважины
-STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}ПоÑтроить банк (Возможно только в городе Ñ Ð½Ð°Ñелением более 1200)
-STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}ПоÑтроить ЦБК
+STR_026D_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}ПоÑтроить банк (только возможно в городе Ñ Ð½Ð°Ñелением более 1200)
+STR_026E_CONSTRUCT_PAPER_MILL                                   :{BLACK}ПоÑтроить бумажную фабрику
 STR_026F_CONSTRUCT_FOOD_PROCESSING                              :{BLACK}ПоÑтроить пищевой завод
 STR_0270_CONSTRUCT_PRINTING_WORKS                               :{BLACK}ПоÑтроить типографию
 STR_0271_CONSTRUCT_GOLD_MINE                                    :{BLACK}ПоÑтроить золотой прииÑк
-STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}ПоÑтроить банк (Возможно только в городе)
+STR_0272_CONSTRUCT_BANK_CAN_ONLY                                :{BLACK}ПоÑтроить банк (только возможно в городе)
 STR_0273_CONSTRUCT_LUMBER_MILL_TO                               :{BLACK}ПоÑтроить леÑопилку (уничтожает джунгли и производит дерево)
 STR_0274_PLANT_FRUIT_PLANTATION                                 :{BLACK}Создать фруктовую плантацию
 STR_0275_PLANT_RUBBER_PLANTATION                                :{BLACK}Создать плантацию каучука
 STR_0276_CONSTRUCT_WATER_SUPPLY                                 :{BLACK}ПоÑтроить водокачку
-STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}ПоÑтроить водонапорную башню (только в городе)
+STR_0277_CONSTRUCT_WATER_TOWER_CAN                              :{BLACK}ПоÑтроить водонапорную башню (только возможно в городе)
 STR_0278_CONSTRUCT_DIAMOND_MINE                                 :{BLACK}ПоÑтроить алмазную шахту
 STR_0279_CONSTRUCT_COPPER_ORE_MINE                              :{BLACK}ПоÑтроить шахту медной руды
 STR_027A_PLANT_COTTON_CANDY_FOREST                              :{BLACK}ПоÑадить Ð»ÐµÑ Ñахарной ваты
@@ -718,18 +720,18 @@
 STR_0282_CONSTRUCT_BUBBLE_GENERATOR                             :{BLACK}ПоÑтроить генератор пузырьков
 STR_0283_CONSTRUCT_TOFFEE_QUARRY                                :{BLACK}ПоÑтроить карьер ириÑок
 STR_0284_CONSTRUCT_SUGAR_MINE                                   :{BLACK}ПоÑтроить Ñахарную шахту
-STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать {STRING} ...
+STR_0285_CAN_T_BUILD_HERE                                       :{WHITE}ЗдеÑÑŒ Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать {STRING}...
 STR_0286_MUST_BUILD_TOWN_FIRST                                  :{WHITE}...Ñначала поÑтройте город
 STR_0287_ONLY_ONE_ALLOWED_PER_TOWN                              :{WHITE}...такой объект уже еÑÑ‚ÑŒ в городе
 STR_0288_PLANT_TREES                                            :{BLACK}Сажать деревьÑ
 STR_0289_PLACE_SIGN                                             :{BLACK}ПомеÑтить знак
-STR_028A_RANDOM_TREES                                           :{BLACK}Случайные деревьÑ
-STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}РазмеÑтить Ñлучайные Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ð½Ð° карте
+STR_028A_RANDOM_TREES                                           :{BLACK}РаÑÑтавить по карте
+STR_028B_PLANT_TREES_RANDOMLY_OVER                              :{BLACK}РазмеÑтить по карте Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ñлучайным образом
 STR_028C_PLACE_ROCKY_AREAS_ON_LANDSCAPE                         :{BLACK}РазмеÑтить Ñкалы на карте
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}ПоÑтавить маÑк
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}ПоÑтавить передатчик
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Задать площадь пуÑтыни.{}Ðажмите и держите CTRL Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ
-STR_CREATE_LAKE                                                 :{BLACK}Указать водную облаÑÑ‚ÑŒ.{}Создать канал, или наводнить вÑÑŽ окружающую облаÑÑ‚ÑŒ при зажатом CTRL на уровне морÑ.
+STR_CREATE_LAKE                                                 :{BLACK}Создать воду:{}При отжатом CTRL ÑоздаётÑÑ ÐºÐ°Ð½Ð°Ð».{}При зажатом CTRL клетка на уровне Ð¼Ð¾Ñ€Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð²Ð¾Ð´Ð¾Ð¹.
 STR_0290_DELETE                                                 :{BLACK}Уничтожить
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}ПолноÑтью уничтожить Ñтот город
 STR_0292_SAVE_SCENARIO                                          :Сохранить Ñценарий
@@ -746,13 +748,14 @@
 STR_PLAY_HEIGHTMAP_HINT                                         :{BLACK}Ðачать новую игру, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°Ñ€Ñ‚Ñƒ выÑот в качеÑтве шаблона карты
 STR_QUIT_SCENARIO_QUERY                                         :{YELLOW}Ð’Ñ‹ уверены, что хотите выйти из Ñтого ÑценариÑ?
 STR_029C_QUIT_EDITOR                                            :{WHITE}Выход из редактора
-STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...может быть поÑтроен только в городах Ñ Ð½Ð°Ñелением не менее 1200
+STR_029D_CAN_ONLY_BE_BUILT_IN_TOWNS                             :{WHITE}...можно поÑтроить в городах Ñ Ð½Ð°Ñелением более 1200 жителей
 STR_029E_MOVE_THE_STARTING_DATE                                 :{BLACK}Уменьшить год начала игры на 1
 STR_029F_MOVE_THE_STARTING_DATE                                 :{BLACK}Увеличить год начала игры на 1
 STR_02A0_ENDS_OF_BRIDGE_MUST_BOTH                               :{WHITE}...оба конца моÑта должны опиратьÑÑ Ð½Ð° землю
 STR_02A1_SMALL                                                  :{BLACK}Малый
 STR_02A2_MEDIUM                                                 :{BLACK}Средний
 STR_02A3_LARGE                                                  :{BLACK}Большой
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Город
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Выбор размера города
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Размер города:
 
@@ -767,9 +770,9 @@
 STR_02BD                                                        :{BLACK}{STRING}
 STR_02BE_DEFAULT                                                :По умолчанию
 STR_02BF_CUSTOM                                                 :Свои
-STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Сохранить Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñпорта
-STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Выберите Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñпортных ÑредÑтв
-STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Сохранить Ñвои Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñпортных ÑредÑтв
+STR_02C0_SAVE_CUSTOM_NAMES                                      :{BLACK}Сохранить пользовательÑкие названиÑ
+STR_02C1_VEHICLE_DESIGN_NAMES_SELECTION                         :{BLACK}Загрузка пользовательÑких названий транÑпортных ÑредÑтв
+STR_02C2_SAVE_CUSTOMIZED_VEHICLE                                :{BLACK}Сохранить пользовательÑкие Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ñпортных ÑредÑтв
 
 STR_CHECKMARK                                                   :{CHECKMARK}
 ############ range for menu starts
@@ -804,32 +807,33 @@
 STR_02DE_MAP_OF_WORLD                                           :Карта мира
 STR_EXTRA_VIEW_PORT                                             :Доп. окно проÑмотра
 STR_SIGN_LIST                                                   :СпиÑок меток
+STR_TRANSPARENCY_OPTIONS                                        :ÐаÑтройки прозрачноÑти
 STR_02DF_TOWN_DIRECTORY                                         :СпиÑок городов
 STR_TOWN_POPULATION                                             :{BLACK}ÐаÑеление: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Окно проÑмотра {COMMA}
-STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}Скопировать позицию в окно проÑмотра
+STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}Скопировать в окно
 STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT                             :{BLACK}Скопировать Ñту позицию в окно проÑмотра
-STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW                                :{BLACK}Ð’Ñтавить позицию из окна проÑмотра
+STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW                                :{BLACK}Ð’Ñтавить из окна
 STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT                             :{BLACK}Ð’Ñтавить Ñту позицию из окна проÑмотра
 
 STR_02E0_CURRENCY_UNITS                                         :{BLACK}Валюта
 STR_02E1                                                        :{BLACK}{SKIP}{STRING}
-STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Выберите валюту
+STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}Смена иÑпользуемой в игре валюты
 STR_MEASURING_UNITS                                             :{BLACK}Единицы измерениÑ
 STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION                                   :{BLACK}Выберите ÑиÑтему единиц измерениÑ
+STR_MEASURING_UNITS_SELECTION                                   :{BLACK}ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ ÑиÑтема единиц измерениÑ
 STR_02E6_ROAD_VEHICLES                                          :{BLACK}Ðаправление движениÑ
 STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}Выберите направление движениÑ
+STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}С какой Ñтороны дороги ездит автотранÑпорт
 STR_02E9_DRIVE_ON_LEFT                                          :ЛевоÑтороннее
 STR_02EA_DRIVE_ON_RIGHT                                         :ПравоÑтороннее
 STR_02EB_TOWN_NAMES                                             :{BLACK}ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ€Ð¾Ð´Ð¾Ð²
 STR_02EC                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Выберите Ñзык названий городов
+STR_02ED_SELECT_STYLE_OF_TOWN_NAMES                             :{BLACK}Ðа каком Ñзыке будут названы наÑелённые пункты
 
 STR_02F4_AUTOSAVE                                               :{BLACK}ÐвтоÑохранение
 STR_02F5                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Выберите интервал автоÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ñ‹
+STR_02F6_SELECT_INTERVAL_BETWEEN                                :{BLACK}Интервал автоÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ñ‹
 STR_02F7_OFF                                                    :Отключено
 STR_02F8_EVERY_3_MONTHS                                         :Каждые 3 меÑÑца
 STR_02F9_EVERY_6_MONTHS                                         :Каждые 6 меÑÑцев
@@ -869,7 +873,7 @@
 
 STR_0329_PURCHASE_LAND_FOR_FUTURE                               :{BLACK}Купить землю
 STR_032F_AUTOSAVE                                               :{RED}ÐвтоÑохранение
-STR_SAVING_GAME                                                 :{RED}*  *  СОХРÐÐЯЮ ИГРУ  *  *
+STR_SAVING_GAME                                                 :{RED}*  *  СОХРÐÐЕÐИЕ ИГРЫ  *  *
 STR_SAVE_STILL_IN_PROGRESS                                      :{WHITE}Сохранение вÑе еще идет,{}пожалуйÑта, дождитеÑÑŒ завершениÑ!
 STR_0330_SELECT_EZY_STREET_STYLE                                :{BLACK}Выбрать музыкальную программу
 
@@ -877,10 +881,10 @@
 STR_0336_7                                                      :{BLACK}7
 
 ############ start of townname region
-STR_TOWNNAME_ORIGINAL_ENGLISH                                   :ÐнглийÑкие (оригинальные)
+STR_TOWNNAME_ORIGINAL_ENGLISH                                   :ÐнглийÑкие
 STR_TOWNNAME_FRENCH                                             :ФранцузÑкие
 STR_TOWNNAME_GERMAN                                             :Ðемецкие
-STR_TOWNNAME_ADDITIONAL_ENGLISH                                 :ÐнглийÑкие (дополнительные)
+STR_TOWNNAME_ADDITIONAL_ENGLISH                                 :ÐнглийÑкие (дополн.)
 STR_TOWNNAME_LATIN_AMERICAN                                     :Латино-американÑкие
 STR_TOWNNAME_SILLY                                              :ÐнглийÑкие (шуточные)
 STR_TOWNNAME_SWEDISH                                            :ШведÑкие
@@ -932,18 +936,18 @@
 
 STR_OPTIONS_LANG                                                :{BLACK}Язык
 STR_OPTIONS_LANG_CBO                                            :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_LANG_TIP                                            :{BLACK}Выберите Ñзык интерфейÑа
+STR_OPTIONS_LANG_TIP                                            :{BLACK}Язык пользовательÑкого интерфейÑа
 
 STR_OPTIONS_FULLSCREEN                                          :{BLACK}ПолноÑкранный режим
 STR_OPTIONS_FULLSCREEN_TIP                                      :{BLACK}Включить/выключить полноÑкранный режим
 
 STR_OPTIONS_RES                                                 :{BLACK}Разрешение Ñкрана
 STR_OPTIONS_RES_CBO                                             :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_RES_TIP                                             :{BLACK}Выберите разрешение Ñкрана
+STR_OPTIONS_RES_TIP                                             :{BLACK}Выбор Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñкрана
 
 STR_OPTIONS_SCREENSHOT_FORMAT                                   :{BLACK}Формат Ñкриншотов
 STR_OPTIONS_SCREENSHOT_FORMAT_CBO                               :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_OPTIONS_SCREENSHOT_FORMAT_TIP                               :{BLACK}Выберите формат Ñкриншотов
+STR_OPTIONS_SCREENSHOT_FORMAT_TIP                               :{BLACK}Формат, в котором будут ÑохранÑÑ‚ÑŒÑÑ Ñнимки Ñкрана
 
 STR_AUTOSAVE_1_MONTH                                            :Каждый меÑÑц
 STR_AUTOSAVE_FAILED                                             :{WHITE}Ошибка автоÑохранениÑ
@@ -979,15 +983,15 @@
 
 STR_CANT_SHARE_ORDER_LIST                                       :{WHITE}Ðевозможно иÑпользовать общий ÑпиÑок заданий
 STR_CANT_COPY_ORDER_LIST                                        :{WHITE}Ðевозможно Ñкопировать ÑпиÑок заданий
-STR_END_OF_SHARED_ORDERS                                        :{SETX 10}- - Конец ÑпиÑка заданий - -
+STR_END_OF_SHARED_ORDERS                                        :{SETX 10}- - Конец общих заданий - -
 
-STR_TRAIN_IS_LOST                                               :{WHITE}Поезд {COMMA} не находит путь ...
-STR_TRAIN_IS_UNPROFITABLE                                       :{WHITE}Доход поезда {COMMA} за прошлый год ÑоÑтавил {CURRENCY}
+STR_TRAIN_IS_LOST                                               :{WHITE}Поезд {COMMA} не может найти пути
+STR_TRAIN_IS_UNPROFITABLE                                       :{WHITE}Поезд {COMMA} за прошлый год Ð¿Ñ€Ð¸Ð½Ñ‘Ñ {CURRENCY} убытка
 STR_EURO_INTRODUCE                                              :{BLACK}{BIGFONT}Создана зона евро!{}{}Теперь в вашей Ñтране в качеÑтве единой валюты иÑпользуетÑÑ ÐµÐ²Ñ€Ð¾!
 
 # Start of order review system.
 # DON'T ADD OR REMOVE LINES HERE
-STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Только одно задание в ÑпиÑке заданий Ð´Ð»Ñ Ð¿Ð¾ÐµÐ·Ð´Ð° {COMMA}
+STR_TRAIN_HAS_TOO_FEW_ORDERS                                    :{WHITE}Только одно задание у поезда {COMMA}
 STR_TRAIN_HAS_VOID_ORDER                                        :{WHITE}У поезда {COMMA} нет заданий
 STR_TRAIN_HAS_DUPLICATE_ENTRY                                   :{WHITE}У поезда {COMMA} дублируютÑÑ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ
 STR_TRAIN_HAS_INVALID_ENTRY                                     :{WHITE}У поезда {COMMA} неправильное меÑто назначениÑ
@@ -1020,53 +1024,53 @@
 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_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_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_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_GOTODEPOT                                    :{LTBLUE}Депо можно добавить в маршрут: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDXTRAIND                                 :{LTBLUE}Разрешить ÑтроительÑтво Ñырьевых предприÑтий: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}Разрешить неÑколько предприÑтий одного типа на город: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SAMEINDCLOSE                                 :{LTBLUE}Одинаковые предприÑÑ‚Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть Ñ€Ñдом друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Ð’Ñегда показывать длинную дату в панели ÑоÑтоÑниÑ: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LONGDATE                                     :{LTBLUE}Ð’Ñегда Ð¿Ð¾Ð»Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° в панели ÑоÑтоÑниÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SIGNALSIDE                                   :{LTBLUE}Показывать Ñветофоры на Ñтороне движениÑ: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Показывать финанÑовую ÑтатиÑтику в конце года: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SHOWFINANCES                                 :{LTBLUE}Показывать финанÑовую ÑтатиÑтику каждый год: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}ИÑпользовать поведение TTDP Ð´Ð»Ñ Ð¿Ñ€Ð¸ÐºÐ°Ð·Ð° "без оÑтановок": {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROADVEH_QUEUE                                :{LTBLUE}Разрешить автомобилÑм ожидать въезда на Ñтанцию: {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_NEW_PATHFINDING_ALL                          :{LTBLUE}Ðлгоритм навигации NPF (замена оригинального): {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_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_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_ERRMSG_DURATION                              :{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_NEVER_EXPIRE_VEHICLES                        :{LTBLUE}ТранÑпорт не будет выходить из ÑкÑплутации: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_VEHICLE                            :{LTBLUE}Ðвтоозамена изношенного транÑпорта
+STR_CONFIG_PATCHES_AUTORENEW_MONTHS                             :{LTBLUE}Замена через {ORANGE}{STRING}{LTBLUE} меÑÑц{P "" а ев} поÑле иÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока Ñлужбы
+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}
 
 STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}Генератор земли: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL                      :оригинальный
+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             :Очень гладкий
@@ -1084,8 +1088,8 @@
 
 STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}МакÑ. протÑженноÑÑ‚ÑŒ: {ORANGE}{STRING} {RED}(большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð¼ÐµÐ´Ð»ÑÑŽÑ‚ игру)
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Включить обÑлуживание на вертолетных площадках: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Открывать ландшафтную панель вмеÑте Ñ Ñ‚Ñ€Ð°Ð½Ñпортными: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Обратить направление перетаÑÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}СвÑзать ландшафтную панель Ñ Ñ‚Ñ€Ð°Ð½Ñпортной: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Обратить направление Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð° мышью: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Показывать замеры при ÑтроительÑтве: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Показывать окраÑку транÑпорта: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :нет
@@ -1097,45 +1101,65 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Ð´Ð»Ñ ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð°
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :не иÑпользовать
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}СкороÑÑ‚ÑŒ ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±Ð·Ð¾Ñ€Ð° прокруткой колеÑа мыши: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Ðвтопауза в начале игры: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}ИÑпользовать раÑширенный ÑпиÑок транÑпорта: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}МакÑимальное количеÑтво поездов на игрока: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{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_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_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_SHIPS                                :{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_SERVINT_TRAINS                               :{LTBLUE}ОбÑлуживание поездов по умолчанию: {ORANGE}кажд{P 1 ый ые ые} {STRING} д{P 1 ень Ð½Ñ Ð½ÐµÐ¹}/%
+STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED                      :{LTBLUE}ОбÑлуживание поездов по умолчанию: {ORANGE}не обÑлуживаютÑÑ
+STR_CONFIG_PATCHES_SERVINT_ROADVEH                              :{LTBLUE}ОбÑлуживание автотранÑпорта: {ORANGE}кажд{P 1 ый ые ые} {STRING} д{P 1 ень Ð½Ñ Ð½ÐµÐ¹}/%
+STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED                     :{LTBLUE}ОбÑлуживание автотранÑпорта: {ORANGE}не обÑлуживаютÑÑ
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT                             :{LTBLUE}ОбÑлуживание авиатранÑпорта: {ORANGE}кажд{P 1 ый ые ые} {STRING} д{P 1 ень Ð½Ñ Ð½ÐµÐ¹}/%
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED                    :{LTBLUE}ОбÑлуживание авиатранÑпорта: {ORANGE}не обÑлуживаетÑÑ
+STR_CONFIG_PATCHES_SERVINT_SHIPS                                :{LTBLUE}ОбÑлуживание кораблей: {ORANGE}кажд{P 1 ый ые ые} {STRING} д{P 1 ень Ð½Ñ Ð½ÐµÐ¹}/%
+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_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_ALLOW_SHARES                                 :{LTBLUE}Разрешить торговлю акциÑми других компаний
+STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}При уÑтановке Ñветофоров линией, Ñтавить кажд{P 1 ую ые ые}: {ORANGE}{STRING} клет{P 1 ку ки ок}
+STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Строить Ñемафоры Ñтарого ÑтилÑ: {ORANGE}до {STRING} года
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}РаÑположение дорог "не Ñтроить дороги" не дейÑтвительно в редакторе Ñценариев
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}РаÑположение дорог у городов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :не Ñтроить дороги
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :Ñтарый алгоритм
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :улучшенный алгоритм
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :решёткой 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :решёткой 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Положение главной панели инÑтрументов: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Ñлева
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :в центре
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Ñправа
-STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Ð Ð°Ð´Ð¸ÑƒÑ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Ð Ð°Ð´Ð¸ÑƒÑ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½: {ORANGE}отключено
+STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Ð Ð°Ð´Ð¸ÑƒÑ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½ (пикÑелей): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Ð Ð°Ð´Ð¸ÑƒÑ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½ (пикÑелей): {ORANGE}отключено
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}СкороÑÑ‚ÑŒ роÑта городов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :нет
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :медленнаÑ
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :обычнаÑ
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :быÑтраÑ
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :очень быÑтраÑ
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Соотношение городов, которые раÑтут вдвое быÑтрее: {ORANGE}1 из {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Соотношение городов, которые раÑтут вдвое быÑтрее: {ORANGE}Выкл.
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Изначальный множитель размера города: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}ИнтерфейÑ
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}СтроительÑтво
@@ -1149,10 +1173,10 @@
 STR_CONFIG_PATCHES_CURRENCY                                     :{CURRENCY}
 
 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_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_TEMPERATE_LANDSCAPE                                         :Умеренный ландшафт
 STR_SUB_ARCTIC_LANDSCAPE                                        :СубарктичеÑкий ландшафт
@@ -1163,11 +1187,11 @@
 STR_CHEATS_TIP                                                  :{BLACK}Галочка показывает, иÑпользовали ли Ð’Ñ‹ Ñтот ЧИТ раньше
 STR_CHEATS_WARNING                                              :{BLACK}Внимание, вы ÑобираетеÑÑŒ предать Ñвоих Ñоперников! Этого вам никогда не проÑÑ‚ÑÑ‚!
 STR_CHEAT_MONEY                                                 :{LTBLUE}Увеличить деньги на {CURRENCY64}
-STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}УправлÑÑ‚ÑŒ игроком: {ORANGE}{COMMA}
-STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Волшебный бульдозер (удалÑет промышленноÑÑ‚ÑŒ и Ñ‚.п.): {ORANGE}{STRING}
+STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}Играть за компанию: {ORANGE}{COMMA}
+STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}Волшебный динамит (ÑÐ½Ð¾Ñ _ВСЕГО_): {ORANGE}{STRING}
 STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}Туннели могут переÑекатьÑÑ: {ORANGE}{STRING}
 STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}Строить в режиме паузы: {ORANGE}{STRING}
-STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}Большие Ñамолеты не будут чаÑто разбиватьÑÑ Ð² маленьких аÑропортах: {ORANGE} {STRING}
+STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}Большие Ñамолеты реже разбиваютÑÑ Ð² малых аÑропортах: {ORANGE}{STRING}
 STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}Сменить климат на: {ORANGE} {STRING}
 STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}Изменение даты: {ORANGE} {DATE_SHORT}
 STR_CHEAT_SETUP_PROD                                            :{LTBLUE}Разрешить изменение производительноÑти: {ORANGE}{STRING}
@@ -1175,8 +1199,8 @@
 STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}Следует к {WAYPOINT}
 STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}Следует к {WAYPOINT}, {VELOCITY}
 
-STR_GO_TO_WAYPOINT                                              :Идти через {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT                                     :Идти б/оÑтан. через {WAYPOINT}
+STR_GO_TO_WAYPOINT                                              :Ехать через {WAYPOINT}
+STR_GO_NON_STOP_TO_WAYPOINT                                     :Ехать через {WAYPOINT} без оÑтановки
 
 STR_WAYPOINTNAME_CITY                                           :Точка пути {TOWN}
 STR_WAYPOINTNAME_CITY_SERIAL                                    :Точка пути {TOWN} #{COMMA}
@@ -1215,7 +1239,7 @@
 STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}РазмеÑтить Ð´ÐµÑ€ÐµÐ²ÑŒÑ Ñлучайного типа
 
 STR_CANT_BUILD_CANALS                                           :{WHITE}Ðевозможно поÑтроить канал здеÑÑŒ...
-STR_BUILD_CANALS_TIP                                            :{BLACK}Строить каналы.
+STR_BUILD_CANALS_TIP                                            :{BLACK}Строить каналы
 STR_LANDINFO_CANAL                                              :Канал
 
 STR_CANT_BUILD_LOCKS                                            :{WHITE}Ðевозможно поÑтроить шлюз здеÑÑŒ...
@@ -1232,8 +1256,8 @@
 
 STR_DRAG_WHOLE_TRAIN_TO_SELL_TIP                                :{BLACK}Перетащите Ñюда локомотив Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¸ вÑего поезда
 
-STR_DRAG_DROP                                                   :{BLACK}ПеретаÑкивание
-STR_STATION_DRAG_DROP                                           :{BLACK}Строить Ñтанцию, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿ÐµÑ€ÐµÑ‚Ð°Ñкивание
+STR_DRAG_DROP                                                   :{BLACK}УчаÑток
+STR_STATION_DRAG_DROP                                           :{BLACK}ПоÑтройка Ñтанции на указанном игроком учаÑтке
 STR_SELECT_STATION_CLASS_TIP                                    :{BLACK}Выберите клаÑÑ Ñтанций Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ
 STR_SELECT_STATION_TYPE_TIP                                     :{BLACK}Выберите тип Ñтанции Ð´Ð»Ñ Ð¿Ð¾Ñтройки
 
@@ -1274,36 +1298,36 @@
 STR_RAIL_REFIT_VEHICLE                                          :{BLACK}Переоборудовать поезда
 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_RAIL_CAN_T_REFIT_VEHICLE                                    :{WHITE}Ðе могу переоборудовать поезд...
+STR_CONFIG_PATCHES_SERVINT_ISPERCENT                            :{LTBLUE}Интервал обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² процентах: {ORANGE}{STRING}
 STR_CONFIG_GAME_PRODUCTION                                      :{WHITE}Изменить производительноÑÑ‚ÑŒ
 
 TEMP_AI_IN_PROGRESS                                             :{WHITE}Добро пожаловать в новый ИИ, он ÑовершенÑтвуетÑÑ. Ð’Ñ‹ должны быть готовы к проблемам. Когда Ñто ÑлучитÑÑ, Ñделайте Ñнимок и отправьте на форум. ÐаÑлаждайтеÑÑŒ!
 TEMP_AI_ACTIVATED                                               :{WHITE}Внимание: новый AI вÑÑ‘ еще находитÑÑ Ð² ÑоÑтоÑнии альфа-верÑии! Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚ только Ñ Ð°Ð²Ñ‚Ð¾Ñ‚Ñ€Ð°Ð½Ñпортом!
-TEMP_AI_MULTIPLAYER                                             :{WHITE}Внимание: ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÑкÑÐ¿Ð»ÑƒÐ°Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ AI. ПожалуйÑта, Ñообщайте обо вÑех проблемах на truelight@openttd.org.
+TEMP_AI_MULTIPLAYER                                             :{WHITE}Внимание: ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÑкÑÐ¿Ð»ÑƒÐ°Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ AI. ПожалуйÑта, Ñообщайте обо вÑех проблемах на truelight@openttd.org
 
 ############ network gui strings
 
 STR_NETWORK_MULTIPLAYER                                         :{WHITE}Ð¡ÐµÑ‚ÐµÐ²Ð°Ñ Ð¸Ð³Ñ€Ð°
 
 STR_NETWORK_PLAYER_NAME                                         :{BLACK}Ð˜Ð¼Ñ Ð¸Ð³Ñ€Ð¾ÐºÐ°:
-STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Это имÑ, по которому другие игроки определÑÑŽÑ‚ ваÑ
+STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}Это имÑ, под которым вы предÑтавитеÑÑŒ другим игрокам
 STR_NETWORK_CONNECTION                                          :{BLACK}Соединение:
-STR_NETWORK_CONNECTION_TIP                                      :{BLACK}Выбор между Интернет игрой или игрой в Локальной Сети (СЕТЬ)
+STR_NETWORK_CONNECTION_TIP                                      :{BLACK}ИÑкать Ñервера в локальной Ñети, или в Интернете
 
 STR_NETWORK_START_SERVER                                        :{BLACK}ЗапуÑк Ñервера
-STR_NETWORK_START_SERVER_TIP                                    :{BLACK}ЗапуÑк Ñвоего Ñервера
+STR_NETWORK_START_SERVER_TIP                                    :{BLACK}ЗапуÑк Ñервера на вашем компьютере. К Ñтой игре Ñмогут подÑоединÑÑ‚ÑŒÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ðµ игроки.
 
 STR_NETWORK_GAME_NAME                                           :{BLACK}Ðазвание
 STR_NETWORK_GAME_NAME_TIP                                       :{BLACK}Ðазвание игры
 STR_NETWORK_INFO_ICONS_TIP                                      :{BLACK}Язык, верÑÐ¸Ñ Ñервера и Ñ‚.п.
 STR_NETWORK_CLICK_GAME_TO_SELECT                                :{BLACK}Выберите игру из ÑпиÑка
 
-STR_NETWORK_FIND_SERVER                                         :{BLACK}Ðайти Ñервер
-STR_NETWORK_FIND_SERVER_TIP                                     :{BLACK}Ðайти Ñервер в Ñети
+STR_NETWORK_FIND_SERVER                                         :{BLACK}Обновить
+STR_NETWORK_FIND_SERVER_TIP                                     :{BLACK}Обновить ÑпиÑок Ñерверов, которые ÑÐµÐ¹Ñ‡Ð°Ñ ÐµÑÑ‚ÑŒ в Ñети
 STR_NETWORK_ADD_SERVER                                          :{BLACK}Добавить Ñервер
-STR_NETWORK_ADD_SERVER_TIP                                      :{BLACK}Добавить Ñервер в ÑпиÑок, который будет вÑегда проверÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸ запуÑке игр.
-STR_NETWORK_ENTER_IP                                            :{BLACK}ВвеÑти Ð°Ð´Ñ€ÐµÑ Ñервера
+STR_NETWORK_ADD_SERVER_TIP                                      :{BLACK}Добавить Ñервер, который будет автоматичеÑки обновлÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸ открытии Ñтого окна
+STR_NETWORK_ENTER_IP                                            :{BLACK}Введите Ð°Ð´Ñ€ÐµÑ Ñервера
 
 STR_NETWORK_GENERAL_ONLINE                                      :{BLACK}{COMMA}/{COMMA} - {COMMA}/{COMMA}
 STR_NETWORK_CLIENTS_CAPTION                                     :{BLACK}Клиенты
@@ -1324,7 +1348,7 @@
 STR_NETWORK_VERSION_MISMATCH                                    :{SILVER}ВЕРСИЯ ÐЕ ПОДХОДИТ
 STR_NETWORK_GRF_MISMATCH                                        :{SILVER}ÐЕ СОВПÐДÐЕТ ÐÐБОР NEWGRF
 
-STR_NETWORK_JOIN_GAME                                           :{BLACK}ПриÑоединитьÑÑ Ðº игре
+STR_NETWORK_JOIN_GAME                                           :{BLACK}ПриÑоединитьÑÑ
 
 
 STR_NETWORK_START_GAME_WINDOW                                   :{WHITE}ЗапуÑк новой Ñетевой игры
@@ -1340,8 +1364,8 @@
 STR_NETWORK_COMBO1                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть
 STR_NETWORK_INTERNET                                            :Интернет
-STR_NETWORK_LAN_INTERNET                                        :Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñеть/Интернет
-STR_NETWORK_INTERNET_ADVERTISE                                  :Интернет (объÑвленный)
+STR_NETWORK_LAN_INTERNET                                        :Лок. Ñеть/Интернет
+STR_NETWORK_INTERNET_ADVERTISE                                  :Интернет (объÑвл.)
 STR_NETWORK_COMBO2                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_0_PLAYERS                                           :0 игроков
 STR_NETWORK_1_PLAYERS                                           :1 игрок
@@ -1363,9 +1387,9 @@
 STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}Язык общениÑ:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}Другие игроки будут знать, на каком Ñзыке говорÑÑ‚ на Ñервере
 STR_NETWORK_COMBO5                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_NETWORK_START_GAME                                          :{BLACK}ЗапуÑк Игры
+STR_NETWORK_START_GAME                                          :{BLACK}ЗапуÑк игры
 STR_NETWORK_START_GAME_TIP                                      :{BLACK}ЗапуÑк новой Ñетевой игры Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ð¾Ð¹ карты или ÑценариÑ
-STR_NETWORK_LOAD_GAME                                           :{BLACK}Загрузка Игры
+STR_NETWORK_LOAD_GAME                                           :{BLACK}Загрузка игры
 STR_NETWORK_LOAD_GAME_TIP                                       :{BLACK}Продолжить ранее Ñохраненную Ñетевую игру (проверьте, что подÑоединилиÑÑŒ прежним игроком)
 
 ############ Leave those lines in this order!!
@@ -1383,8 +1407,8 @@
 STR_NETWORK_NEW_COMPANY_TIP                                     :{BLACK}ОÑновать новую компанию
 STR_NETWORK_SPECTATE_GAME                                       :{BLACK}Ðаблюдать за игрой
 STR_NETWORK_SPECTATE_GAME_TIP                                   :{BLACK}Следить за игрой в качеÑтве зрителÑ
-STR_NETWORK_JOIN_COMPANY                                        :{BLACK}ПриÑоединитьÑÑ Ðº компании
-STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}Помочь в управлении компанией
+STR_NETWORK_JOIN_COMPANY                                        :{BLACK}ПриÑоединитьÑÑ
+STR_NETWORK_JOIN_COMPANY_TIP                                    :{BLACK}ПриÑоединитьÑÑ Ðº компании и помочь в управлении ею
 STR_NETWORK_REFRESH                                             :{BLACK}Обновить Ñервер
 STR_NETWORK_REFRESH_TIP                                         :{BLACK}Обновить информацию о Ñервере
 
@@ -1507,8 +1531,8 @@
 STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...невозможно преобразовать тип изображениÑ.
 
 ##id 0x0800
-STR_0800_COST                                                   :{TINYFONT}{RED}Цена: {CURRENCY}
-STR_0801_COST                                                   :{RED}Цена: {CURRENCY}
+STR_0800_COST                                                   :{TINYFONT}{RED}РаÑход: {CURRENCY}
+STR_0801_COST                                                   :{RED}РаÑход: {CURRENCY}
 STR_0802_INCOME                                                 :{TINYFONT}{GREEN}Доход: {CURRENCY}
 STR_0803_INCOME                                                 :{GREEN}Доход: {CURRENCY}
 STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}ТранÑфер: {CURRENCY}
@@ -1571,7 +1595,7 @@
 
 ##id 0x1800
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Сначала удалите дорогу
-STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Идут дорожные работы ...
+STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Идут дорожные работы...
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}СтроительÑтво дорог
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Выберите тип моÑта
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Ðе могу проложить дорогу здеÑÑŒ...
@@ -1609,7 +1633,7 @@
 STR_2006_POPULATION                                             :{BLACK}ÐаÑеление: {ORANGE}{COMMA}{BLACK}  Зданий: {ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :Переименовать город
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}Ðе могу переименовать город...
-STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} меÑÑ‚Ð½Ð°Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ дает
+STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}МеÑÑ‚Ð½Ð°Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð³Ð¾Ñ€Ð¾Ð´Ð° {TOWN} не допуÑтит.
 STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ€Ð¾Ð´Ð¾Ð² - кликните на названии Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð³Ð¾Ñ€Ð¾Ð´Ð°
 STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Отцентрировать оÑновное окно по городу
 STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}Переименовать город
@@ -1639,7 +1663,7 @@
 STR_2024                                                        :{YELLOW}{COMPANY}{PLAYERNAME}: {ORANGE}{STRING}
 STR_2025_SUBSIDIES                                              :{WHITE}СубÑидии
 STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}Свободные ÑубÑидии
-STR_2027_FROM_TO                                                :{ORANGE}{STRING} по маршруту из {STRING} в {STRING}
+STR_2027_FROM_TO                                                :{ORANGE}{STRING.p} по маршруту из {STRING} в {STRING}
 STR_2028_BY                                                     :{YELLOW} (по {DATE_SHORT})
 STR_202A_NONE                                                   :{ORANGE}нет
 STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}СубÑидируемые маршруты:
@@ -1648,10 +1672,10 @@
 STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}Предложение ÑубÑидии иÑтекло:{}{}{STRING} по маршруту {STRING} - {STRING} ÑубÑидироватьÑÑ Ð½Ðµ будет.
 STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}Срок ÑубÑидии иÑтек:{}{}{STRING} по маршруту {STATION} - {STATION} больше не ÑубÑидируетÑÑ.
 STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}Предложена ÑубÑидиÑ:{}{}ÐŸÐµÑ€Ð²Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð²ÐµÐ·ÐµÑ‚ {STRING} по маршруту {STRING} - {STRING} получит годовую ÑубÑидию от меÑтных влаÑтей!
-STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ {COMPANY} получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} - {STATION} оплачиваетÑÑ Ð½Ð° 50% больше в Ñледующем году!
-STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ {COMPANY}получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} - {STATION} оплачиваетÑÑ Ð²Ð´Ð²Ð¾Ð¹Ð½Ðµ в Ñледующем году!
-STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}КомпаниÑ{COMPANY} получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} - {STATION} оплачиваетÑÑ Ð²Ñ‚Ñ€Ð¾Ð¹Ð½Ðµ в Ñледующем году!
-STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ {COMPANY} получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} в {STATION} оплачиваетÑÑ Ð²Ñ‡ÐµÑ‚Ð²ÐµÑ€Ð¾ в Ñледующем году!
+STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ {COMPANY} получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} - {STATION} оплачиваетÑÑ Ð½Ð°Ð¿Ð¾Ð»Ð¾Ð²Ð¸Ð½Ñƒ больше в Ñледующем году!
+STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ {COMPANY} получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} - {STATION} оплачиваетÑÑ Ð²Ð´Ð²Ð¾Ð¹Ð½Ðµ в Ñледующем году!
+STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ {COMPANY} получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} - {STATION} оплачиваетÑÑ Ð²Ñ‚Ñ€Ð¾Ð¹Ð½Ðµ в Ñледующем году!
+STR_2034_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ {COMPANY} получает ÑубÑидию!{}{}{STRING} по маршруту {STATION} - {STATION} оплачиваетÑÑ Ð²Ñ‡ÐµÑ‚Ð²ÐµÑ€Ð¾ в Ñледующем году!
 STR_2035_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} меÑÑ‚Ð½Ð°Ñ Ð²Ð»Ð°ÑÑ‚ÑŒ запрещает поÑтройку другого аÑропорта в городе
 STR_2036_COTTAGES                                               :Коттеджи
 STR_2037_HOUSES                                                 :Дома
@@ -1665,7 +1689,7 @@
 STR_203F_HOUSES                                                 :Дома
 STR_2040_CINEMA                                                 :Кинотеатр
 STR_2041_SHOPPING_MALL                                          :Торговый центр
-STR_2042_DO_IT                                                  :{BLACK}ДÐÐ’ÐЙ!
+STR_2042_DO_IT                                                  :{BLACK}Применить
 STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}То, что можно Ñделать в Ñтом городе - кликните Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿. Ñведений
 STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}Выполнить выделенное дейÑтвие в ÑпиÑке выше
 STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}ДоÑтупные дейÑтвиÑ:
@@ -1673,10 +1697,10 @@
 STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :СреднÑÑ Ñ€ÐµÐºÐ»Ð°Ð¼Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ
 STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ
 STR_2049_FUND_LOCAL_ROAD_RECONSTRUCTION                         :ПрофинанÑировать ремонт городÑких дорог
-STR_204A_BUILD_STATUE_OF_COMPANY                                :ПоÑтроить Ñтатую владельца компании
+STR_204A_BUILD_STATUE_OF_COMPANY                                :УÑтановить Ñтатую владельца компании
 STR_204B_FUND_NEW_BUILDINGS                                     :ПрофинанÑировать ÑтроительÑтво новых зданий
 STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :Купить ÑкÑклюзивные транÑпортные права
-STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY                              :Дать взÑтку меÑтной админиÑтрации
+STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY                              :ВзÑтка меÑтной админиÑтрации
 STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} ПровеÑти малую рекламную кампанию Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ·Ð¾- и паÑÑажиропотока на ваших ÑтанциÑÑ….{} Цена: {CURRENCY}
 STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} ПровеÑти Ñреднюю рекламную кампанию Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ·Ð¾- и паÑÑажиропотока на ваших ÑтанциÑÑ….{} Цена: {CURRENCY}
 STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} ПровеÑти большую рекламную кампанию Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ·Ð¾- и паÑÑажиропотока на ваших ÑтанциÑÑ….{} Цена: {CURRENCY}
@@ -1762,7 +1786,7 @@
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ñтанции
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Сначала удалите автобуÑную оÑтановку
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Сначала удалите грузовой терминал
-STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Станции
+STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Станц{P 2 Ð¸Ñ Ð¸Ð¸ ий}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Ðет -
 STR_304B_SITE_UNSUITABLE                                        :{WHITE}...неподходÑщее меÑто
@@ -1838,14 +1862,14 @@
 STR_4803_POWER_STATION                                          :ЭлектроÑтанциÑ
 STR_4804_SAWMILL                                                :ЛеÑопилка
 STR_4805_FOREST                                                 :ЛеÑ
-STR_4806_OIL_REFINERY                                           :Ðефтеперерабат. завод
-STR_4807_OIL_RIG                                                :Ð‘ÑƒÑ€Ð¾Ð²Ð°Ñ Ð²Ñ‹ÑˆÐºÐ°
+STR_4806_OIL_REFINERY                                           :Ðефтезавод
+STR_4807_OIL_RIG                                                :ÐефтÑÐ½Ð°Ñ Ð²Ñ‹ÑˆÐºÐ°
 STR_4808_FACTORY                                                :Завод
 STR_4809_PRINTING_WORKS                                         :ТипографиÑ
 STR_480A_STEEL_MILL                                             :Сталелитейный завод
 STR_480B_FARM                                                   :Ферма
 STR_480C_COPPER_ORE_MINE                                        :Шахта медной руды
-STR_480D_OIL_WELLS                                              :ÐефтÑÐ½Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð°
+STR_480D_OIL_WELLS                                              :ÐефтÑÐ½Ð°Ñ Ñкважина
 STR_480E_BANK                                                   :Банк
 STR_480F_FOOD_PROCESSING_PLANT                                  :ÐŸÐ¸Ñ‰ÐµÐ²Ð°Ñ Ñ„Ð°Ð±Ñ€Ð¸ÐºÐ°
 STR_4810_PAPER_MILL                                             :Ð‘ÑƒÐ¼Ð°Ð¶Ð½Ð°Ñ Ñ„Ð°Ð±Ñ€Ð¸ÐºÐ°
@@ -1881,8 +1905,8 @@
 STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}Произведено за прошлый меÑÑц:
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} ({COMMA}% перевезено)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}Показать предприÑтие в оÑновном окне
-STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ðовое предприÑтие - {STRING} ÑтроитÑÑ Ð²Ð¾Ð·Ð»Ðµ г. {TOWN}!
-STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ðовое предприÑтие - {STRING} заложен возле г. {TOWN}!
+STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}Ðовое предприÑтие! {STRING} ÑтроитÑÑ Ð²Ð¾Ð·Ð»Ðµ г. {TOWN}!
+STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}Ðовое предприÑтие! {STRING} заложен возле г. {TOWN}!
 STR_482F_COST                                                   :{BLACK}Цена: {YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}Ðевозможно поÑтроить Ñто предприÑтие здеÑÑŒ...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...Ð»ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñажать только выше линии Ñнега
@@ -1960,21 +1984,21 @@
 STR_SV_AIRCRAFT_NAME                                            :Самолет {COMMA}
 
 STR_SV_STNAME                                                   :{STRING}
-STR_SV_STNAME_NORTH                                             :{STRING} СевернаÑ
-STR_SV_STNAME_SOUTH                                             :{STRING} ЮжнаÑ
-STR_SV_STNAME_EAST                                              :{STRING} ВоÑточнаÑ
-STR_SV_STNAME_WEST                                              :{STRING} ЗападнаÑ
-STR_SV_STNAME_CENTRAL                                           :{STRING} ЦентральнаÑ
-STR_SV_STNAME_TRANSFER                                          :Платформа {STRING}
-STR_SV_STNAME_HALT                                              :ПолуÑтанок {STRING}
-STR_SV_STNAME_VALLEY                                            :{STRING} Долина
-STR_SV_STNAME_HEIGHTS                                           :{STRING} Ð’Ñ‹ÑотнаÑ
-STR_SV_STNAME_WOODS                                             :{STRING} ЛеÑнаÑ
-STR_SV_STNAME_LAKESIDE                                          :{STRING} ОзернаÑ
-STR_SV_STNAME_EXCHANGE                                          :{STRING} СортировочнаÑ
-STR_SV_STNAME_AIRPORT                                           :{STRING} ÐÑропорт
-STR_SV_STNAME_OILFIELD                                          :ÐефтÑное поле {STRING}
-STR_SV_STNAME_MINES                                             :{STRING} Шахты
+STR_SV_STNAME_NORTH                                             :Северный {STRING}
+STR_SV_STNAME_SOUTH                                             :Южный {STRING}
+STR_SV_STNAME_EAST                                              :ВоÑточный {STRING}
+STR_SV_STNAME_WEST                                              :Западный {STRING}
+STR_SV_STNAME_CENTRAL                                           :Центральный {STRING}
+STR_SV_STNAME_TRANSFER                                          :Перегонный {STRING}
+STR_SV_STNAME_HALT                                              :{STRING}-привал
+STR_SV_STNAME_VALLEY                                            :Долина {STRING}
+STR_SV_STNAME_HEIGHTS                                           :{STRING}-выÑотнаÑ
+STR_SV_STNAME_WOODS                                             :ЛеÑÐ½Ð°Ñ {STRING}
+STR_SV_STNAME_LAKESIDE                                          :ÐžÐ·Ñ‘Ñ€Ð½Ð°Ñ {STRING}
+STR_SV_STNAME_EXCHANGE                                          :{STRING}-ÑортировочнаÑ
+STR_SV_STNAME_AIRPORT                                           :ÐÑропорт {STRING}
+STR_SV_STNAME_OILFIELD                                          :ÐефтÑÐ½Ð°Ñ Ð²Ñ‹ÑˆÐºÐ° {STRING}
+STR_SV_STNAME_MINES                                             :Шахты {STRING}
 STR_SV_STNAME_DOCKS                                             :ПриÑтань {STRING}
 STR_SV_STNAME_BUOY_1                                            :{STRING} Буй 1
 STR_SV_STNAME_BUOY_2                                            :{STRING} Буй 2
@@ -1985,13 +2009,15 @@
 STR_SV_STNAME_BUOY_7                                            :{STRING} Буй 7
 STR_SV_STNAME_BUOY_8                                            :{STRING} Буй 8
 STR_SV_STNAME_BUOY_9                                            :{STRING} Буй 9
-STR_SV_STNAME_ANNEXE                                            :{STRING} ДополнительнаÑ
-STR_SV_STNAME_SIDINGS                                           :{STRING} ЗапаÑнаÑ
-STR_SV_STNAME_BRANCH                                            :{STRING} БереговаÑ
-STR_SV_STNAME_UPPER                                             :{STRING} ВерхнÑÑ
-STR_SV_STNAME_LOWER                                             :{STRING} ÐижнÑÑ
+STR_SV_STNAME_ANNEXE                                            :{STRING}-дополнительнаÑ
+STR_SV_STNAME_SIDINGS                                           :{STRING}-запаÑный
+STR_SV_STNAME_BRANCH                                            :{STRING}-ветка
+STR_SV_STNAME_UPPER                                             :Верхний {STRING}
+STR_SV_STNAME_LOWER                                             :Ðижний {STRING}
 STR_SV_STNAME_HELIPORT                                          :Площадка {STRING}
-STR_SV_STNAME_FOREST                                            :{STRING} ЛеÑ
+STR_SV_STNAME_FOREST                                            :Ð›ÐµÑ {STRING}
+
+STR_SV_GROUP_NAME                                               :{GROUP}
 
 ############ end of savegame specific region!
 
@@ -2006,8 +2032,8 @@
 STR_6802_MEDIUM.f                                               :{BLACK}ÑреднÑÑ
 STR_6803_HARD                                                   :{BLACK}ТÑжёлый
 STR_6803_HARD.f                                                 :{BLACK}Ñ‚ÑжёлаÑ
-STR_6804_CUSTOM                                                 :{BLACK}Свой
-STR_6804_CUSTOM.f                                               :{BLACK}ÑвоÑ
+STR_6804_CUSTOM                                                 :{BLACK}Пользов.
+STR_6804_CUSTOM.f                                               :{BLACK}пользов.
 ############ range for difficulty levels ends
 
 ############ range for difficulty settings starts
@@ -2015,7 +2041,7 @@
 STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Конкуренты начинают игру: {ORANGE}{STRING}
 STR_6807_NO_OF_TOWNS                                            :{LTBLUE}КоличеÑтво городов: {ORANGE}{STRING}
 STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}КоличеÑтво предприÑтий: {ORANGE}{STRING}
-STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑÑуда: {ORANGE}{CURRENCY}
+STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑÑ‚Ð°Ñ€Ñ‚Ð¾Ð²Ð°Ñ ÑÑуда: {ORANGE}{CURRENCY}
 STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ½Ñ‚Ð½Ð°Ñ Ñтавка: {ORANGE}{COMMA}%
 STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}Затраты на Ñодержание транÑпорта: {ORANGE}{STRING.p}
 STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}СкороÑÑ‚ÑŒ ÑтроительÑтва конкурентов: {ORANGE}{STRING}
@@ -2031,70 +2057,71 @@
 STR_16816_CITY_APPROVAL                                         :{LTBLUE}Отношение влаÑтей к изменению территорий: {ORANGE}{STRING}
 ############ range for difficulty settings ends
 
-STR_26816_NONE                                                  :нет
-STR_6816_LOW                                                    :низкое
-STR_6817_NORMAL                                                 :Ñреднее
-STR_6818_HIGH                                                   :большое
+STR_26816_NONE                                                  :Ðет
+STR_NUM_VERY_LOW                                                :Очень низкое
+STR_6816_LOW                                                    :Ðизкое
+STR_6817_NORMAL                                                 :Среднее
+STR_6818_HIGH                                                   :Большое
 STR_6819                                                        :{BLACK}{SMALLLEFTARROW}
 STR_681A                                                        :{BLACK}{SMALLRIGHTARROW}
-STR_681B_VERY_SLOW                                              :очень медленнаÑ
-STR_681C_SLOW                                                   :медленнаÑ
-STR_681D_MEDIUM                                                 :ÑреднÑÑ
-STR_681E_FAST                                                   :быÑтраÑ
-STR_681F_VERY_FAST                                              :очень быÑтраÑ
-STR_VERY_LOW                                                    :очень низкий
-STR_VERY_LOW.n                                                  :очень низкое
-STR_6820_LOW                                                    :низкий
+STR_681B_VERY_SLOW                                              :Очень медленнаÑ
+STR_681C_SLOW                                                   :МедленнаÑ
+STR_681D_MEDIUM                                                 :СреднÑÑ
+STR_681E_FAST                                                   :БыÑтраÑ
+STR_681F_VERY_FAST                                              :Очень быÑтраÑ
+STR_VERY_LOW                                                    :Очень низкий
+STR_VERY_LOW.n                                                  :Очень низкое
+STR_6820_LOW                                                    :Ðизкий
 STR_6820_LOW.n                                                  :низкое
-STR_6820_LOW.p                                                  :низкие
-STR_6821_MEDIUM                                                 :Ñредний
+STR_6820_LOW.p                                                  :Ðизкие
+STR_6821_MEDIUM                                                 :Средний
 STR_6821_MEDIUM.n                                               :Ñреднее
-STR_6821_MEDIUM.p                                               :Ñредние
-STR_6822_HIGH                                                   :выÑокий
+STR_6821_MEDIUM.p                                               :Средние
+STR_6822_HIGH                                                   :Ð’Ñ‹Ñокий
 STR_6822_HIGH.n                                                 :выÑокое
-STR_6822_HIGH.p                                                 :выÑокие
-STR_6823_NONE                                                   :нет
-STR_6824_REDUCED                                                :уменьшеннаÑ
-STR_6825_NORMAL                                                 :нормальнаÑ
+STR_6822_HIGH.p                                                 :Ð’Ñ‹Ñокие
+STR_6823_NONE                                                   :Выключено
+STR_6824_REDUCED                                                :УмереннаÑ
+STR_6825_NORMAL                                                 :ОбычнаÑ
 STR_6826_X1_5                                                   :x1.5
 STR_6827_X2                                                     :x2
 STR_6828_X3                                                     :x3
 STR_6829_X4                                                     :x4
-STR_682A_VERY_FLAT                                              :очень плоÑкий
-STR_682B_FLAT                                                   :плоÑкий
-STR_682C_HILLY                                                  :холмиÑтый
-STR_682D_MOUNTAINOUS                                            :гориÑтый
-STR_682E_STEADY                                                 :ÑтабильнаÑ
-STR_682F_FLUCTUATING                                            :неуÑтойчиваÑ
-STR_6830_IMMEDIATE                                              :немедленно
-STR_6831_3_MONTHS_AFTER_PLAYER                                  :через 3 меÑÑца поÑле игрока
-STR_6832_6_MONTHS_AFTER_PLAYER                                  :через 6 меÑÑцев поÑле игрока
-STR_6833_9_MONTHS_AFTER_PLAYER                                  :через 9 меÑÑцев поÑле игрока
-STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :в конце линий и на ÑтанциÑÑ…
-STR_6835_AT_END_OF_LINE_ONLY                                    :только в конце линий
-STR_6836_OFF                                                    :выключены
-STR_6837_ON                                                     :включены
+STR_682A_VERY_FLAT                                              :Очень плоÑкий
+STR_682B_FLAT                                                   :ПлоÑкий
+STR_682C_HILLY                                                  :ХолмиÑтый
+STR_682D_MOUNTAINOUS                                            :ГориÑтый
+STR_682E_STEADY                                                 :СтабильнаÑ
+STR_682F_FLUCTUATING                                            :ÐеуÑтойчиваÑ
+STR_6830_IMMEDIATE                                              :Ðемедленно
+STR_6831_3_MONTHS_AFTER_PLAYER                                  :Через 3 меÑÑца поÑле игрока
+STR_6832_6_MONTHS_AFTER_PLAYER                                  :Через 6 меÑÑцев поÑле игрока
+STR_6833_9_MONTHS_AFTER_PLAYER                                  :Через 9 меÑÑцев поÑле игрока
+STR_6834_AT_END_OF_LINE_AND_AT_STATIONS                         :Ð’ конце линий и на ÑтанциÑÑ…
+STR_6835_AT_END_OF_LINE_ONLY                                    :Только в конце линий
+STR_6836_OFF                                                    :Выключены
+STR_6837_ON                                                     :Включены
 STR_6838_SHOW_HI_SCORE_CHART                                    :{BLACK}Показать таблицу рекордов
-STR_6839_PERMISSIVE                                             :ÑниÑходительное
-STR_683A_TOLERANT                                               :терпимое
-STR_683B_HOSTILE                                                :отрицательное
+STR_6839_PERMISSIVE                                             :ДозволÑющее
+STR_683A_TOLERANT                                               :Терпимое
+STR_683B_HOSTILE                                                :Враждебное
 
 ##id 0x7000
 STR_7000                                                        :
 STR_7001                                                        :{WHITE}{COMPANY} {BLACK}{PLAYERNAME}
 STR_7002_PLAYER                                                 :(Игрок {COMMA})
-STR_7004_NEW_FACE                                               :{BLACK}Ðовое лицо
+STR_7004_NEW_FACE                                               :{BLACK}Лицо
 STR_7005_COLOR_SCHEME                                           :{BLACK}Цвет
 STR_7006_COLOR_SCHEME                                           :{GOLD}Цвет:
 STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}Ðовый цвет
-STR_7008_COMPANY_NAME                                           :{BLACK}Ðазвание фирмы
-STR_7009_PRESIDENT_NAME                                         :{BLACK}Ð˜Ð¼Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð°
+STR_7008_COMPANY_NAME                                           :{BLACK}Ðазвание
+STR_7009_PRESIDENT_NAME                                         :{BLACK}Директор
 STR_700A_COMPANY_NAME                                           :КомпаниÑ
 STR_700B_PRESIDENT_S_NAME                                       :Ð˜Ð¼Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð°
 STR_700C_CAN_T_CHANGE_COMPANY_NAME                              :{WHITE}Ðевозможно изменить название компании...
 STR_700D_CAN_T_CHANGE_PRESIDENT                                 :{WHITE}Ðевозможно изменить Ð¸Ð¼Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð°...
 STR_700E_FINANCES                                               :{WHITE}{COMPANY} Денежные ÑредÑтва {BLACK}{PLAYERNAME}
-STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Статьи раÑхода/дохода
+STR_700F_EXPENDITURE_INCOME                                     :{WHITE}РаÑход/доход
 STR_7010                                                        :{WHITE}{NUM}
 STR_7011_CONSTRUCTION                                           :{GOLD}СтроительÑтво
 STR_7012_NEW_VEHICLES                                           :{GOLD}ÐÐ¾Ð²Ð°Ñ Ñ‚ÐµÑ…Ð½Ð¸ÐºÐ°
@@ -2123,22 +2150,22 @@
 STR_7028                                                        :{BLACK}{CURRENCY64}
 STR_7029_BORROW                                                 :{BLACK}ЗанÑÑ‚ÑŒ {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
 STR_702A_REPAY                                                  :{BLACK}Отдать {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
-STR_702B_MAXIMUM_PERMITTED_LOAN                                 :{WHITE}...макÑимально допуÑтимый размер ÑÑуды {CURRENCY}
+STR_702B_MAXIMUM_PERMITTED_LOAN                                 :{WHITE}...макÑимально допуÑтимый размер ÑÑуды - {CURRENCY}.
 STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Ðевозможно занÑÑ‚ÑŒ больше денег...
 STR_702D_LOAN_ALREADY_REPAYED                                   :{WHITE}...нет ÑÑуды Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð»Ð°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ
 STR_702E_REQUIRED                                               :{WHITE}...{CURRENCY} надо
 STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Ðевозможно погаÑить ÑÑуду...
 STR_INSUFFICIENT_FUNDS                                          :{WHITE}Ðевозможно отдать ÑÑуженные банком деньги...
-STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Выбрать новое лицо управлÑющего
+STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Выбрать новое лицо директора
 STR_7031_CHANGE_THE_COMPANY_VEHICLE                             :{BLACK}Изменить цвет транÑпортных ÑредÑтв компании
-STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Изменение имени управлÑющего
+STR_7032_CHANGE_THE_PRESIDENT_S                                 :{BLACK}Изменение имени директора
 STR_7033_CHANGE_THE_COMPANY_NAME                                :{BLACK}Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð¸
 STR_7034_CLICK_ON_SELECTED_NEW_COLOR                            :{BLACK}Выберите цветовую Ñхему
 STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}ВзÑÑ‚ÑŒ/увеличить кредит
 STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Вернуть чаÑÑ‚ÑŒ ÑÑуды
-STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(УправлÑющий)
+STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Директор)
 STR_7038_INAUGURATED                                            :{GOLD}Ð’ должноÑти Ñ: {WHITE}{NUM}
-STR_7039_VEHICLES                                               :{GOLD}ТранÑпорта:
+STR_7039_VEHICLES                                               :{GOLD}ТранÑпорт:
 STR_TRAINS                                                      :{WHITE}{COMMA} поезд{P "" а ов}
 STR_ROAD_VEHICLES                                               :{WHITE}{COMMA} автомашин{P а ы ""}
 STR_AIRCRAFT                                                    :{WHITE}{COMMA} авиатранÑпорт
@@ -2165,7 +2192,7 @@
 STR_7055                                                        :{YELLOW}{STRING}{SETX 45}{ORANGE}{COMPANY} {BLACK}{PLAYERNAME} '{STRING}'
 STR_7056_TRANSPORT_COMPANY_IN_TROUBLE                           :{BLACK}{BIGFONT}ТранÑÐ¿Ð¾Ñ€Ñ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Ð² опаÑном положении!
 STR_7057_WILL_BE_SOLD_OFF_OR_DECLARED                           :{BLACK}{BIGFONT} {COMPANY} будет продана или объÑвлена банкротом, еÑли ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ð¸Ñ Ð½Ðµ изменитÑÑ!
-STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(УправлÑющий)
+STR_7058_PRESIDENT                                              :{BLACK}{PLAYERNAME}{}(Директор)
 STR_7059_TRANSPORT_COMPANY_MERGER                               :{BLACK}{BIGFONT}Объединение компаний!
 STR_705A_HAS_BEEN_SOLD_TO_FOR                                   :{BLACK}{BIGFONT}{COMPANY} продана {COMPANY} за {CURRENCY}!
 STR_705B_WE_ARE_LOOKING_FOR_A_TRANSPORT                         :{WHITE}Мы ищем транÑпортную компанию Ð´Ð»Ñ Ð¿Ñ€Ð¸ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº ней.{}{}Ð’Ñ‹ хотите купить {COMPANY} за {CURRENCY}?
@@ -2188,12 +2215,12 @@
 STR_706C_CHAIRMAN                                               :ПредÑедатель
 STR_706D_PRESIDENT                                              :Президент
 STR_706E_TYCOON                                                 :Магнат
-STR_706F_BUILD_HQ                                               :{BLACK}ПоÑтроить штаб-квартиру
-STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}ПоÑтроить/проÑмотреть штаб-квартиру компании
-STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}ПереÑтроить штаб компании в другом меÑте за 1% оценочной ÑтоимоÑти капитала компании
+STR_706F_BUILD_HQ                                               :{BLACK}ПоÑтроить штаб
+STR_7070_BUILD_COMPANY_HEADQUARTERS                             :{BLACK}ПоÑтроить штаб-квартиру компании / ОÑмотреть штаб-квартиру компании
+STR_RELOCATE_COMPANY_HEADQUARTERS                               :{BLACK}ПеремеÑтить штаб компании в другом меÑте за 1% оценочной ÑтоимоÑти капитала компании
 STR_7071_CAN_T_BUILD_COMPANY_HEADQUARTERS                       :{WHITE}Ðевозможно поÑтроить штаб-квартиру компании...
-STR_7072_VIEW_HQ                                                :{BLACK}ПоÑмотреть штаб
-STR_RELOCATE_HQ                                                 :{BLACK}ПеремеÑтить штаб
+STR_7072_VIEW_HQ                                                :{BLACK}ОÑмотреть штаб
+STR_RELOCATE_HQ                                                 :{BLACK}ПеремеÑтить
 STR_COMPANY_PASSWORD                                            :{BLACK}Пароль
 STR_COMPANY_PASSWORD_TOOLTIP                                    :{BLACK}Защитить вашу компанию паролем, чтобы неавторизованные пользователи не могли приÑоединитьÑÑ
 STR_SET_COMPANY_PASSWORD                                        :УÑтановить пароль компании
@@ -2220,9 +2247,9 @@
 STR_LIVERY_MAGLEV                                               :Маглев
 STR_LIVERY_DMU                                                  :DMU
 STR_LIVERY_EMU                                                  :EMU
-STR_LIVERY_PASSENGER_WAGON_STEAM                                :ПаÑÑажирÑкий вагон (паровоз)
-STR_LIVERY_PASSENGER_WAGON_DIESEL                               :ПаÑÑажирÑкий вагон (дизель)
-STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :ПаÑÑажирÑкий вагон (Ñлектро)
+STR_LIVERY_PASSENGER_WAGON_STEAM                                :ПаÑÑаж. вагон (паровоз)
+STR_LIVERY_PASSENGER_WAGON_DIESEL                               :ПаÑÑаж. вагон (дизель)
+STR_LIVERY_PASSENGER_WAGON_ELECTRIC                             :ПаÑÑаж. вагон (Ñлектро)
 STR_LIVERY_FREIGHT_WAGON                                        :Грузовой вагон
 STR_LIVERY_BUS                                                  :ÐвтобуÑ
 STR_LIVERY_TRUCK                                                :Грузовое авто
@@ -2232,13 +2259,13 @@
 STR_LIVERY_SMALL_PLANE                                          :Малый Ñамолет
 STR_LIVERY_LARGE_PLANE                                          :Большой Ñамолет
 
-STR_LIVERY_GENERAL_TIP                                          :{BLACK}Показ. оÑновную цветовую Ñхему
-STR_LIVERY_TRAIN_TIP                                            :{BLACK}Показ. цветовую Ñхему поездов
-STR_LIVERY_ROADVEH_TIP                                          :{BLACK}Показ. цветовую Ñхему авто
-STR_LIVERY_SHIP_TIP                                             :{BLACK}Показ. цветовую Ñхему Ñудов
-STR_LIVERY_AIRCRAFT_TIP                                         :{BLACK}Показ. цветовую Ñхему авиатранÑпорта
-STR_LIVERY_PRIMARY_TIP                                          :{BLACK}Выберите оÑновной цвет Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñхемы
-STR_LIVERY_SECONDARY_TIP                                        :{BLACK}Выберите вторичный цвет Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñхемы
+STR_LIVERY_GENERAL_TIP                                          :{BLACK}ÐаÑтройка оÑновной цветовой Ñхемы
+STR_LIVERY_TRAIN_TIP                                            :{BLACK}ÐаÑтройка цветовой Ñхемы поездов
+STR_LIVERY_ROADVEH_TIP                                          :{BLACK}ÐаÑтройка цветовой Ñхемы автотранÑпорта
+STR_LIVERY_SHIP_TIP                                             :{BLACK}ÐаÑтройка цветовой Ñхемы Ñудов
+STR_LIVERY_AIRCRAFT_TIP                                         :{BLACK}ÐаÑтройка цветовой Ñхемы авиатранÑпорта
+STR_LIVERY_PRIMARY_TIP                                          :{BLACK}ÐаÑтройка оÑновного цвета
+STR_LIVERY_SECONDARY_TIP                                        :{BLACK}ÐаÑтройка вторичного цвета
 STR_LIVERY_PANEL_TIP                                            :{BLACK}Выберите цветовую Ñхему Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, либо неÑколько Ñхем Ñ CTRL. Кликните на Ñ‡ÐµÐºÐ±Ð¾ÐºÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ Ñхемы.
 
 ##id 0x8000
@@ -2501,35 +2528,35 @@
 STR_8100_MESSAGE_FROM_VEHICLE_MANUFACTURE                       :{WHITE}Сообщение от Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ‚Ñ€Ð°Ð½Ñпорта
 STR_8101_WE_HAVE_JUST_DESIGNED_A                                :{GOLD}Мы Ñоздали новую модель: {STRING}. ЗаинтереÑованы ли вы в его годовом ÑкÑклюзивном иÑпользовании Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ перед запуÑком в Ñерийное производÑтво?
 STR_8102_RAILROAD_LOCOMOTIVE                                    :ж/д локомотив
-STR_8103_ROAD_VEHICLE                                           :автомобиль
-STR_8104_AIRCRAFT                                               :воздушное Ñудно
+STR_8103_ROAD_VEHICLE                                           :автотранÑпорт
+STR_8104_AIRCRAFT                                               :авиатранÑпорт
 STR_8105_SHIP                                                   :корабль
-STR_8106_MONORAIL_LOCOMOTIVE                                    :монорельÑ
-STR_8107_MAGLEV_LOCOMOTIVE                                      :магниторельÑ
+STR_8106_MONORAIL_LOCOMOTIVE                                    :монорельÑовый локомотив
+STR_8107_MAGLEV_LOCOMOTIVE                                      :магниторельÑовый локомотив
 
 ##id 0x8800
 STR_8800_TRAIN_DEPOT                                            :{WHITE}Депо {TOWN}
-STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют . . .{}Первый поезд прибыл на Ñтанцию {STATION}!
+STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют!{}Первый поезд прибыл на Ñтанцию {STATION}!
 STR_8802_DETAILS                                                :{WHITE}{STRING} (Детали)
-STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Впереди поезд
+STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}Поезд мешает
 STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
 STR_8806_GO_TO                                                  :Ехать к ÑÑ‚. {STATION}
-STR_8807_GO_TO_TRANSFER                                         :Ехать к ÑÑ‚. {STATION} (Отдать и забрать груз)
-STR_8808_GO_TO_UNLOAD                                           :Ехать к ÑÑ‚. {STATION} (Разгрузка)
-STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Ехать к ÑÑ‚. {STATION} (РазгрузитьÑÑ Ð¸ уехать пуÑтым)
-STR_880A_GO_TO_LOAD                                             :Ехать к ÑÑ‚. {STATION} (ЗагрузитьÑÑ)
-STR_880B_GO_TO_TRANSFER_LOAD                                    :Ехать к ÑÑ‚. {STATION} (Отдать и ждать полной загрузки)
-STR_880C_GO_NON_STOP_TO                                         :Ехать без оÑÑ‚. на {STATION}
-STR_880D_GO_TO_NON_STOP_TRANSFER                                :Ехать без оÑÑ‚. на {STATION} (Отдать и забрать груз)
-STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Ехать без оÑÑ‚. на {STATION} (Разгрузка)
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Ехать без оÑÑ‚. на {STATION} (РазгрузитьÑÑ Ð¸ уехать пуÑтым)
-STR_8810_GO_NON_STOP_TO_LOAD                                    :Ехать без оÑÑ‚. на {STATION} (ЗагрузитьÑÑ)
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Ехать без оÑÑ‚. на {STATION} (Отдать и ждать полной загрузки)
+STR_8807_GO_TO_TRANSFER                                         :Ехать к ÑÑ‚. {STATION} (ТранÑфер)
+STR_8808_GO_TO_UNLOAD                                           :Ехать к ÑÑ‚. {STATION} (Ðе грузитьÑÑ)
+STR_8809_GO_TO_TRANSFER_UNLOAD                                  :Ехать к ÑÑ‚. {STATION} (ТранÑфер и не грузитьÑÑ)
+STR_880A_GO_TO_LOAD                                             :Ехать к ÑÑ‚. {STATION} (ÐŸÐ¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
+STR_880B_GO_TO_TRANSFER_LOAD                                    :Ехать к ÑÑ‚. {STATION} (ТранÑфер и Ð¿Ð¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
+STR_880C_GO_NON_STOP_TO                                         :Ехать к ÑÑ‚. {STATION} без оÑтановки
+STR_880D_GO_TO_NON_STOP_TRANSFER                                :Ехать к ÑÑ‚. {STATION} без оÑтановки (ТранÑфер)
+STR_880E_GO_NON_STOP_TO_UNLOAD                                  :Ехать к ÑÑ‚. {STATION} без оÑтановки (Ðе грузитьÑÑ)
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :Ехать к ÑÑ‚. {STATION} без оÑтановки (ТранÑфер и не грузитьÑÑ)
+STR_8810_GO_NON_STOP_TO_LOAD                                    :Ехать к ÑÑ‚. {STATION} без оÑтановки (ÐŸÐ¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :Ехать к ÑÑ‚. {STATION} без оÑтановки (ТранÑфер и Ð¿Ð¾Ð»Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°)
 STR_GO_TO_TRAIN_DEPOT                                           :Ехать в депо {TOWN}
-STR_SERVICE_AT_TRAIN_DEPOT                                      :ОбÑлуж. в депо {TOWN}
-STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ехать без оÑÑ‚. в Депо {TOWN}
-STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :ОбÑлуж. без оÑÑ‚. в депо {TOWN}
+STR_SERVICE_AT_TRAIN_DEPOT                                      :ОбÑлужитьÑÑ Ð² депо {TOWN}
+STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :Ехать в депо {TOWN} без оÑтановки
+STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT                             :ОбÑлужитьÑÑ Ð² депо {TOWN} без оÑтановки
 
 STR_HEADING_FOR_TRAIN_DEPOT                                     :{ORANGE}Следует в депо {TOWN}
 STR_HEADING_FOR_TRAIN_DEPOT_VEL                                 :{ORANGE}Следует в Депо {TOWN}, {VELOCITY}
@@ -2547,7 +2574,7 @@
 STR_8816                                                        :{BLACK}-
 STR_8819_TRAIN_TOO_LONG                                         :{WHITE}Поезд Ñлишком длинный
 STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}Структуру поезда можно менÑÑ‚ÑŒ только в депо
-STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Поезда
+STR_881B_TRAINS                                                 :{WHITE}{COMPANY} - {COMMA} Поезд{P 2 "" а ов}
 
 STR_881C_NEW_RAIL_VEHICLES                                      :{WHITE}Ðовый поезд
 STR_NEW_ELRAIL_VEHICLES                                         :{WHITE}Ðовый Ñлектропоезд
@@ -2556,7 +2583,7 @@
 STR_ALL_AVAIL_RAIL_VEHICLES                                     :{WHITE}Поезда
 
 STR_881F_BUILD_VEHICLE                                          :{BLACK}ПоÑтроить
-STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Копировать транÑпорт
+STR_CLONE_ROAD_VEHICLE                                          :{BLACK}Копировать
 STR_CLONE_ROAD_VEHICLE_INFO                                     :{BLACK}Создает копию автомобилÑ. Control-щелчок копирует заданиÑ
 STR_CLONE_ROAD_VEHICLE_DEPOT_INFO                               :{BLACK}Создает копию автомобилÑ. Щелкнуть на кнопке и затем на машине внутри или Ñнаружи гаража. Control-щелчок копирует и заданиÑ
 STR_CLONE_TRAIN                                                 :{BLACK}Копировать ÑоÑтав
@@ -2565,17 +2592,17 @@
 STR_8820_RENAME                                                 :{BLACK}Переимен.
 STR_8823_SKIP                                                   :{BLACK}ПропуÑк
 STR_8824_DELETE                                                 :{BLACK}Удалить
-STR_8825_NON_STOP                                               :{BLACK}Б/оÑтанов.
+STR_8825_NON_STOP                                               :{BLACK}Без оÑÑ‚.
 STR_8826_GO_TO                                                  :{BLACK}Ехать
-STR_8827_FULL_LOAD                                              :{BLACK}Загрузка
-STR_8828_UNLOAD                                                 :{BLACK}Разгрузка
-STR_REFIT                                                       :{BLACK}Переоборуд.
+STR_8827_FULL_LOAD                                              :{BLACK}Полный
+STR_8828_UNLOAD                                                 :{BLACK}Без груза
+STR_REFIT                                                       :{BLACK}Переоб.
 STR_REFIT_TIP                                                   :{BLACK}Выберите тип грузов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ. CTRL+клик - Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ.
 STR_REFIT_ORDER                                                 :(Переоборуд. Ð´Ð»Ñ {STRING})
 STR_8829_ORDERS                                                 :{WHITE}{VEHICLE} (ЗаданиÑ)
-STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Конец ÑпиÑка заданий - -
+STR_882A_END_OF_ORDERS                                          :{SETX 10}- - Конец заданий - -
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
-STR_SERVICE                                                     :{BLACK}ОбÑлуживание
+STR_SERVICE                                                     :{BLACK}ОбÑлуж.
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}Ðевозможно поÑтроить ж/д транÑпорт...
 STR_882C_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   ПоÑтроен: {LTBLUE}{NUM}{BLACK} СтоимоÑÑ‚ÑŒ: {LTBLUE}{CURRENCY}
 STR_882D_VALUE                                                  :{LTBLUE}{STRING}{BLACK}   СтоимоÑÑ‚ÑŒ: {LTBLUE}{CURRENCY}
@@ -2590,7 +2617,7 @@
 STR_8835_CAN_T_MODIFY_THIS_ORDER                                :{WHITE}Ðевозможно изменить Ñто задание...
 STR_8837_CAN_T_MOVE_VEHICLE                                     :{WHITE}Ðевозможно перемеÑтить транÑп. ÑредÑтво...
 STR_REAR_ENGINE_FOLLOW_FRONT_ERROR                              :{WHITE}Тыловой локомотив вÑегда Ñледует за его передней чаÑтью
-STR_8838_N_A                                                    :недоÑтупно{SKIP}
+STR_8838_N_A                                                    :отÑутÑтвует{SKIP}
 STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}Ðевозможно продать рельÑовый транÑпорт...
 STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}Ðевозможно найти дорогу к депо
 STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}Ðевозможно оÑтановить/запуÑтить поезд...
@@ -2618,19 +2645,19 @@
 STR_8850_SHOW_DETAILS_OF_TRAIN_VEHICLES                         :{BLACK}Показать ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ вагонах
 STR_8851_SHOW_CAPACITIES_OF_EACH                                :{BLACK}Показать вмеÑтимоÑÑ‚ÑŒ вагонов
 STR_8852_SHOW_TOTAL_CARGO                                       :{BLACK}Показать общую вмеÑтимоÑÑ‚ÑŒ поезда по типам грузов
-STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Показать ÑпиÑок заданий - кликните Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ. CTRL+клик - переход к Ñтанции.
+STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}Показ ÑпиÑка заданий - щелкните Ð´Ð»Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ. ЕÑли зажать CTRL - обзор Ñтанции.
 STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}ПропуÑтить текущее задание и перейти к Ñледующему
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}Удалить выделенное задание
 STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Ехать по выбранному заданию без оÑтановок
-STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Ð’Ñтавить новое задание перед выделенным или в конец ÑпиÑка
+STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}Ð’Ñтавить новое задание перед выделенным, или в конец ÑпиÑка
 STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Задать ожидание полной загрузки
 STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}Задать ожидание полной разгрузки
 STR_SERVICE_HINT                                                :{BLACK}ПропуÑтить Ñто задание, еÑли обÑлуживание не требуетÑÑ
 STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}Цена: {CURRENCY} ВеÑ: {WEIGHT_S}{}СкороÑÑ‚ÑŒ: {VELOCITY}  МощноÑÑ‚ÑŒ: {POWER}{}Цена обÑлуж.: {CURRENCY}/год{}ЕмкоÑÑ‚ÑŒ: {CARGO}
 STR_885C_BROKEN_DOWN                                            :{RED}Поломка
 STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}ВозраÑÑ‚: {LTBLUE}{STRING}{BLACK} СтоимоÑÑ‚ÑŒ обÑлуживаниÑ: {LTBLUE}{CURRENCY}/год
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}ВеÑ: {LTBLUE}{WEIGHT_S}  {BLACK}МощноÑÑ‚ÑŒ: {LTBLUE}{POWER}{BLACK} МакÑ. ÑкороÑÑ‚ÑŒ: {LTBLUE}{VELOCITY}
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}ВеÑ: {LTBLUE}{WEIGHT_S} {BLACK}МощноÑÑ‚ÑŒ: {LTBLUE}{POWER}{BLACK} МакÑ. ÑкороÑÑ‚ÑŒ: {LTBLUE}{VELOCITY} {BLACK}МакÑ. ТÑговое УÑилие: {LTBLUE}{FORCE}
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}ВеÑ: {LTBLUE}{WEIGHT_S} {BLACK}МощноÑÑ‚ÑŒ: {LTBLUE}{POWER}{BLACK} МакÑ. ÑкороÑÑ‚ÑŒ: {LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}ВеÑ: {LTBLUE}{WEIGHT_S} {BLACK}Мощн.: {LTBLUE}{POWER}{BLACK} МакÑ. Ñк.: {LTBLUE}{VELOCITY} {BLACK}МакÑ. ТУ: {LTBLUE}{FORCE}
 STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Прибыль в Ñтом году: {LTBLUE}{CURRENCY}  (прошлый год: {CURRENCY})
 STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}ÐадежноÑÑ‚ÑŒ: {LTBLUE}{COMMA}%  {BLACK}Поломок Ñ Ð¿Ð¾Ñледнего ремонта: {LTBLUE}{COMMA}
 STR_8861_STOPPED                                                :{RED}ОÑтановлен
@@ -2640,7 +2667,7 @@
 STR_8865_NAME_TRAIN                                             :{WHITE}Ðазвать поезд
 STR_8866_CAN_T_NAME_TRAIN                                       :{WHITE}Ðевозможно назвать поезд...
 STR_8867_NAME_TRAIN                                             :{BLACK}Ðазвать поезд
-STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Крушение поезда!{}{COMMA} чел. погибло в огне!
+STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}Крушение поезда!{}{COMMA} человек{P "" а ""} погиб{P "" ло ли} в огне!
 STR_8869_CAN_T_REVERSE_DIRECTION                                :{WHITE}Ðевозможно развернуть поезд...
 STR_886A_RENAME_TRAIN_VEHICLE_TYPE                              :{WHITE}Переименовать тип вагона
 STR_886B_CAN_T_RENAME_TRAIN_VEHICLE                             :{WHITE}Ðевозможно переименовать тип вагона ...
@@ -2649,7 +2676,7 @@
 
 STR_TRAIN_STOPPING                                              :{RED}ОÑтановлен
 STR_TRAIN_STOPPING_VEL                                          :{RED}ОÑтанавливаю, {VELOCITY}
-STR_INCOMPATIBLE_RAIL_TYPES                                     :IÐеÑовмеÑтимый тип рельÑов
+STR_INCOMPATIBLE_RAIL_TYPES                                     :IÐеÑовмеÑтимый тип рельÑ
 STR_TRAIN_NO_POWER                                              :{RED}Ðет тока.
 STR_TRAIN_START_NO_CATENARY                                     :Кто-то украл вÑе провода, поезд не может ехать...
 
@@ -2659,9 +2686,9 @@
 
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Машина на пути
-STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Ðвтомашин{P а Ñ‹ ""}
+STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Ðвтомашин{P 2 а Ñ‹ ""}
 STR_9002                                                        :{WHITE}{VEHICLE}
-STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}{TOWN} Гараж
+STR_9003_ROAD_VEHICLE_DEPOT                                     :{WHITE}Гараж {TOWN}
 STR_9004_NEW_VEHICLES                                           :{BLACK}ÐÐ¾Ð²Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð°
 STR_9006_NEW_ROAD_VEHICLES                                      :{WHITE}ÐÐ¾Ð²Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð°
 STR_9007_BUILD_VEHICLE                                          :{BLACK}ПоÑтроить
@@ -2695,42 +2722,42 @@
 STR_9023_BUILD_NEW_ROAD_VEHICLE                                 :{BLACK}ПоÑтроить новый автомобиль
 STR_9024_DRAG_ROAD_VEHICLE_TO_HERE                              :{BLACK}Перетащите автомобиль Ñюда, чтобы продать его
 STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}Показать гараж в главном окне
-STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}СпиÑок автомобилей - кликните Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸
+STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}СпиÑок автотранÑпорта - кликните Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}ПоÑтроить выделенный автомобиль
-STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Цена: {CURRENCY}{}СкороÑÑ‚ÑŒ: {VELOCITY}{}СтоимоÑÑ‚ÑŒ обÑлуж.: {CURRENCY}/год{}ЕмкоÑÑ‚ÑŒ: {CARGO}
+STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}Цена: {CURRENCY}{}СкороÑÑ‚ÑŒ: {VELOCITY}{}СтоимоÑÑ‚ÑŒ обÑлуживаниÑ: {CURRENCY}/год{}ЕмкоÑÑ‚ÑŒ: {CARGO}
 
-STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}Ðазвать автомобиль
-STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Ðевозможно переименовать автомобиль ...
-STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Ðазвать автомобиль
-STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют . . .{}Первый Ð°Ð²Ñ‚Ð¾Ð±ÑƒÑ Ð¿Ñ€Ð¸Ð±Ñ‹Ð» на оÑтановку {STATION}!
-STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют . . .{}Первый грузовик прибыл на Ñтанцию {STATION}!
+STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}Ðазвать автотранÑпорт
+STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}Ðевозможно переименовать автотранÑпорт ...
+STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Ðазвать автотранÑпорт
+STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют!{}Первый Ð°Ð²Ñ‚Ð¾Ð±ÑƒÑ Ð¿Ñ€Ð¸Ð±Ñ‹Ð» на оÑтановку {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют!{}Первый грузовик прибыл на Ñтанцию {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}ÐÐ’ÐРИЯ!{}Водитель погиб при Ñтолкновении Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð¼
-STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}ÐÐ’ÐРИЯ!{}{COMMA} человек погибло в Ñтолкновении Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð¼
-STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Ðевозможно развернуть автомобиль ...
+STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}ÐÐ’ÐРИЯ!{}{COMMA} человек{P "" а ""} погиб{P "" ло ли} в Ñтолкновении Ñ Ð¿Ð¾ÐµÐ·Ð´Ð¾Ð¼!
+STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Ðевозможно развернуть автомобиль...
 STR_ONLY_TURN_SINGLE_UNIT                                       :{WHITE}Ðевозможно развернуть многоÑоÑтавной транÑпорт
 STR_9034_RENAME                                                 :{BLACK}Переимен.
 STR_9035_RENAME_ROAD_VEHICLE_TYPE                               :{BLACK}Переименовать автомобиль
 STR_9036_RENAME_ROAD_VEHICLE_TYPE                               :{WHITE}Переименовать автомобиль
-STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Ðевозможно переименовать автомобиль ...
+STR_9037_CAN_T_RENAME_ROAD_VEHICLE                              :{WHITE}Ðевозможно переименовать автомобиль...
 STR_9038_GO_TO_ROADVEH_DEPOT                                    :Ехать в гараж {TOWN}
 STR_SERVICE_AT_ROADVEH_DEPOT                                    :ОбÑлуж. в гараже {TOWN}
 
 STR_REFIT_ROAD_VEHICLE_TO_CARRY                                 :{BLACK}Переоборуд. авто Ð´Ð»Ñ Ð´Ð¾Ñтавки разных видов грузов.
 STR_REFIT_ROAD_VEHICLE                                          :{BLACK}Переоборуд. авто
 STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED                     :{BLACK}Переоборуд авто Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð·ÐºÐ¸ доÑтупных видов грузов
-STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Ðевозможно переоборуд. авто...
+STR_REFIT_ROAD_VEHICLE_CAN_T                                    :{WHITE}Ðевозможно переоборудовать авто...
 STR_ROAD_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Выберите тип грузов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð·ÐºÐ¸
 
 ##id 0x9800
-STR_9800_DOCK_CONSTRUCTION                                      :СтроительÑтво РЕКÐ-МОРЕ
-STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}СтроительÑтво РЕКÐ-МОРЕ
+STR_9800_DOCK_CONSTRUCTION                                      :МорÑкие коммуникации
+STR_9801_DOCK_CONSTRUCTION                                      :{WHITE}МорÑкие коммуникации
 STR_9802_CAN_T_BUILD_DOCK_HERE                                  :{WHITE}Ðевозможно поÑтроить приÑтань здеÑÑŒ...
-STR_9803_SHIP_DEPOT                                             :{WHITE}{TOWN} ДОК
-STR_9804_NEW_SHIPS                                              :{BLACK}Ðовые корабли
-STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} Корабли
-STR_9808_NEW_SHIPS                                              :{WHITE}Ðовые корабли
-STR_9809_BUILD_SHIP                                             :{BLACK}Купить Корабль
-STR_CLONE_SHIP                                                  :{BLACK}Копировать Судно
+STR_9803_SHIP_DEPOT                                             :{WHITE}Док {TOWN}
+STR_9804_NEW_SHIPS                                              :{BLACK}Ðовое Ñудно
+STR_9805_SHIPS                                                  :{WHITE}{COMPANY} - {COMMA} Корабл{P 2 ÑŒ Ñ ÐµÐ¹}
+STR_9808_NEW_SHIPS                                              :{WHITE}Покупка кораблей
+STR_9809_BUILD_SHIP                                             :{BLACK}Купить
+STR_CLONE_SHIP                                                  :{BLACK}Копировать Ñудно
 STR_CLONE_SHIP_INFO                                             :{BLACK}Создает копию кораблÑ. Control-клик копирует заданиÑ
 STR_CLONE_SHIP_DEPOT_INFO                                       :{BLACK}Создает копию кораблÑ. Щелкнуть на кнопке и затем на корабле внутри или Ñнаружи дока. Control-клик копирует заданиÑ
 STR_980B_SHIP_MUST_BE_STOPPED_IN                                :{WHITE}Корабль должен быть оÑтановлен в доке
@@ -2739,7 +2766,7 @@
 STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}Корабль на пути
 STR_980F                                                        :{WHITE}{VEHICLE}
 STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (Детали)
-STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}ВозраÑÑ‚: {LTBLUE}{STRING}{BLACK}  СтоимоÑÑ‚ÑŒ обÑлуж.: {LTBLUE}{CURRENCY}/год
+STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}ВозраÑÑ‚: {LTBLUE}{STRING}{BLACK}  СтоимоÑÑ‚ÑŒ обÑлуживаниÑ: {LTBLUE}{CURRENCY}/год
 STR_9813_MAX_SPEED                                              :{BLACK}МакÑ. ÑкороÑÑ‚ÑŒ: {LTBLUE}{VELOCITY}
 STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Прибыль в Ñтом году: {LTBLUE}{CURRENCY}  (прошлый год: {CURRENCY})
 STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}ÐадежноÑÑ‚ÑŒ: {LTBLUE}{COMMA}%  {BLACK}Поломок Ñ Ð¿Ð¾Ñледнего обÑлуж.: {LTBLUE}{COMMA}
@@ -2768,13 +2795,13 @@
 STR_9829_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}Показать корабль в главном окне
 STR_982A_SEND_SHIP_TO_DEPOT                                     :{BLACK}Отправить корабль в док. CTRL+клик - только Ð´Ð»Ñ Ð¾Ð±ÑлуживаниÑ
 STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}Показать информацию о корабле
-STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Цена: {CURRENCY} МакÑ. СкороÑÑ‚ÑŒ: {VELOCITY}{}ЕмкоÑÑ‚ÑŒ: {CARGO}{}СтоимоÑÑ‚ÑŒ обÑлуж.: {CURRENCY}/год
+STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Цена: {CURRENCY} МакÑ. СкороÑÑ‚ÑŒ: {VELOCITY}{}ЕмкоÑÑ‚ÑŒ: {CARGO}{}СтоимоÑÑ‚ÑŒ обÑлуживаниÑ: {CURRENCY}/год
 STR_982F_NAME_SHIP                                              :{BLACK}Ðазвание кораблÑ
 
 STR_9831_NAME_SHIP                                              :{WHITE}Ðазвание кораблÑ
 STR_9832_CAN_T_NAME_SHIP                                        :{WHITE}Ðе могу назвать корабль...
-STR_9833_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют . . .{}Первый корабль причалил к {STATION}!
-STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}ПоÑтройте буй, чтобы иÑпользовать его как точку маршрута
+STR_9833_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют!{}Первый корабль причалил к {STATION}!
+STR_9834_POSITION_BUOY_WHICH_CAN                                :{BLACK}Буй помогает в навигации, еÑли диÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ, иÑользуйте его как точку маршрута
 STR_9835_CAN_T_POSITION_BUOY_HERE                               :{WHITE}Ðе могу поÑтроить буй здеÑÑŒ...
 STR_9836_RENAME                                                 :{BLACK}Переимен.
 STR_9837_RENAME_SHIP_TYPE                                       :{BLACK}Переименовать
@@ -2786,28 +2813,28 @@
 STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}Выберите тип груза Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð·ÐºÐ¸
 STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}Переоборудовать корабль Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð·ÐºÐ¸ выбранного груза
 STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}Выберите тип груза Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð·ÐºÐ¸:
-STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}ÐÐ¾Ð²Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ: {GOLD}{CARGO}{}{BLACK}СтоимоÑÑ‚ÑŒ переоборуд.: {GOLD}{CURRENCY}
-STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Ðе могу переоборуд. корабль......
-STR_9842_REFITTABLE                                             :(переоборудование)
+STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}ÐÐ¾Ð²Ð°Ñ ÐµÐ¼ÐºÐ¾ÑÑ‚ÑŒ: {GOLD}{CARGO}{}{BLACK}СтоимоÑÑ‚ÑŒ переоборудованиÑ: {GOLD}{CURRENCY}
+STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}Ðе могу переоборудовать корабль......
+STR_9842_REFITTABLE                                             :(переоб.)
 STR_GO_TO_SHIP_DEPOT                                            :Плыть в Док {TOWN}
 SERVICE_AT_SHIP_DEPOT                                           :ОбÑлуживание в доке {TOWN}
 
 ##id 0xA000
 STR_A000_AIRPORTS                                               :{WHITE}ÐÑропорты
 STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}Ðевозможно поÑтроить аÑропорт здеÑÑŒ...
-STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} Ðнгар
-STR_A003_NEW_AIRCRAFT                                           :{BLACK}Ðовый
-STR_CLONE_AIRCRAFT                                              :{BLACK}Копировать транÑпорт
+STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}Ðнгар {STATION}
+STR_A003_NEW_AIRCRAFT                                           :{BLACK}Ðовое Ñудно
+STR_CLONE_AIRCRAFT                                              :{BLACK}Копировать
 STR_CLONE_AIRCRAFT_INFO                                         :{BLACK}Создает копию Ñамолета. Control-клик - копирует заданиÑ
 STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW                           :{BLACK}ПоÑтроить копию возд. Ñудна. Ðажмите на кнопку, а потом на возд. Ñудно в/вне ангара. CTRL+click - также Ñкопирует и задание.
 STR_A005_NEW_AIRCRAFT                                           :{WHITE}Ðовый
 STR_A006_BUILD_AIRCRAFT                                         :{BLACK}ПоÑтроить
 STR_A008_CAN_T_BUILD_AIRCRAFT                                   :{WHITE}Ðевозможно поÑтроить возд. транÑпорт...
-STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} ÐвиатранÑпорт
+STR_A009_AIRCRAFT                                               :{WHITE}{COMPANY} - {COMMA} Единиц{P 2 а Ñ‹ ""} авиатранÑпорта
 STR_A00A                                                        :{WHITE}{VEHICLE}
 STR_A00B_ORDERS                                                 :{WHITE}{VEHICLE} (ЗаданиÑ)
 STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (Детали)
-STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}ВозраÑÑ‚: {LTBLUE}{STRING}{BLACK} СтоимоÑÑ‚ÑŒ обÑлуж.: {LTBLUE}{CURRENCY}/год
+STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}ВозраÑÑ‚: {LTBLUE}{STRING}{BLACK} СтоимоÑÑ‚ÑŒ обÑлуживаниÑ: {LTBLUE}{CURRENCY}/год
 STR_A00E_MAX_SPEED                                              :{BLACK}МакÑ. ÑкороÑÑ‚ÑŒ: {LTBLUE}{VELOCITY}
 STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}Прибыль в Ñтом году: {LTBLUE}{CURRENCY}  (прошлый год: {CURRENCY})
 STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}ÐадежноÑÑ‚ÑŒ: {LTBLUE}{COMMA}%  {BLACK}Поломок Ñ Ð¿Ð¾Ñледнего ремонта: {LTBLUE}{COMMA}
@@ -2840,14 +2867,14 @@
 STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT                           :{BLACK}Показать транÑпорт в главном окне
 STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}ПоÑлать авиатранÑпорт в ангар. CTRL+клик - только Ð´Ð»Ñ Ð¾Ð±ÑлуживаниÑ.
 STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}Показать ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± авиатранÑпорте.
-STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Цена: {CURRENCY} МакÑ. СкороÑÑ‚ÑŒ: {VELOCITY}{}ЕмкоÑÑ‚ÑŒ: {COMMA} паÑÑажиров, {COMMA} почты{}Цена обÑлуж.: {CURRENCY}/год
+STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}Цена: {CURRENCY} МакÑ. СкороÑÑ‚ÑŒ: {VELOCITY}{}ЕмкоÑÑ‚ÑŒ: {COMMA} паÑÑажиров, {COMMA} почты{}Цена обÑлуживаниÑ: {CURRENCY}/год
 
 STR_A030_NAME_AIRCRAFT                                          :{WHITE}Ðазвание Ñамолета
 STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}Ðе могу назвать Ñамолет...
 STR_A032_NAME_AIRCRAFT                                          :{BLACK}Ðазвание Ñамолета
-STR_A033_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют...{}Первый Ñамолет прибыл в {STATION}!
-STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}ÐвиакатаÑтрофа!{}{COMMA} человек погибло в огне в {STATION}
-STR_PLANE_CRASH_OUT_OF_FUEL                                     :{BLACK}{BIGFONT}ÐвиакатаÑтрофа{}Ð’ Ñамолете закончилоÑÑŒ топливо, {COMMA} человек погибли при Ñтолкновении Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹!
+STR_A033_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жители празднуют!{}Первый Ñамолет прибыл в {STATION}!
+STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}ÐвиакатаÑтрофа!{}{COMMA} человек{P "" а ""} погиб{P "" ло ли} в огне в {STATION}!
+STR_PLANE_CRASH_OUT_OF_FUEL                                     :{BLACK}{BIGFONT}ÐвиакатаÑтрофа!{}Ð’ Ñамолете закончилоÑÑŒ топливо, {COMMA} человек{P "" а ""} погиб{P "" ло ли} при Ñтолкновении Ñ Ð·ÐµÐ¼Ð»ÐµÐ¹!
 STR_A036                                                        :{TINYFONT}{BLACK}{STATION}
 STR_A037_RENAME                                                 :{BLACK}Переимен.
 STR_A038_RENAME_AIRCRAFT_TYPE                                   :{BLACK}Переименовать
@@ -2871,13 +2898,13 @@
 STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS                        :{BLACK}{BIGFONT}Взрыв завода при подозрительных обÑтоÑтельÑтвах вблизи {TOWN}!
 STR_B004_UFO_LANDS_NEAR                                         :{BLACK}{BIGFONT}ÐЛО приземлилоÑÑŒ возле {TOWN}!
 STR_B005_COAL_MINE_SUBSIDENCE_LEAVES                            :{BLACK}{BIGFONT}Обвал на угольной шахте вызывает оползень около {TOWN}!
-STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}ÐÐВОДÐЕÐИЕ!{}По крайней мере {COMMA} Ñкорее вÑего погибли при наводнении!
+STR_B006_FLOOD_VEHICLE_DESTROYED                                :{BLACK}{BIGFONT}ПОТОП!{}{COMMA} человек{P "" а ""} погиб{P "" ло ли} при наводнении транÑпорта!
 
 STR_BRIBE_FAILED                                                :{WHITE}Ваша попытка дать взÑтку была
 STR_BRIBE_FAILED_2                                              :{WHITE}обнаружена региональным Ñледователем
 STR_BUILD_DATE                                                  :{BLACK}ПоÑтроено: {LTBLUE}{DATE_LONG}
 
-STR_PERFORMANCE_DETAIL                                          :{WHITE}Подробные данные
+STR_PERFORMANCE_DETAIL                                          :{WHITE}Рейтинг в деталÑÑ…
 STR_PERFORMANCE_DETAIL_KEY                                      :{BLACK}Детали
 STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY                          :{BLACK}({CURRCOMPACT}/{CURRCOMPACT})
 STR_PERFORMANCE_DETAIL_AMOUNT_INT                               :{BLACK}({COMMA}/{COMMA})
@@ -2915,18 +2942,19 @@
 STR_NEWGRF_FILENAME                                             :{BLACK}Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: {SILVER}{STRING}
 STR_NEWGRF_GRF_ID                                               :{BLACK}GRF ID: {SILVER}{STRING}
 STR_NEWGRF_MD5SUM                                               :{BLACK}Сумма MD5: {SILVER}{STRING}
-STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Ð’Ñ‹ хотите Ñделать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² уже запущенной игре - Ñто может привеÑти к ошибке игры, и ее вылету.{}Ð’Ñ‹ абÑолютно уверены в том, что хотите Ñделать?
+STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}Ð’Ñ‹ вноÑите Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² загруженной карте - Ñто может привеÑти к неÑтабильноÑти игры.{}{}Ð’Ñ‹ дейÑтвительно хотите Ñтого?
 
 STR_NEWGRF_ERROR_MSG_INFO                                       :{SILVER}{STRING}
 STR_NEWGRF_ERROR_MSG_WARNING                                    :{RED}Внимание: {SILVER}{STRING}
 STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}Ошибка: {SILVER}{STRING}
 STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°: {SILVER}{STRING}
 STR_NEWGRF_ERROR_VERSION_NUMBER                                 :{STRING} не будет работать Ñ Ð²ÐµÑ€Ñией TTDPatch, Ñообщенной OpenTTD.
-STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} Ð´Ð»Ñ {STRING}-верÑии TTD.
-STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} Ñделан Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² {STRING}
+STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :Файл {STRING} требует {STRING}-верÑию TTD.
+STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} Ñделан Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑовмеÑтно Ñ {STRING}
 STR_NEWGRF_ERROR_INVALID_PARAMETER                              :Ðеверный параметр {STRING}: параметр {STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :{STRING} должен быть загружен перед {STRING}.
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} должен быть загружен поÑле {STRING}.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :файл GRF, который им переводитÑÑ.
 
 STR_NEWGRF_ADD                                                  :{BLACK}Добавить
 STR_NEWGRF_ADD_TIP                                              :{BLACK}Добавить файл NewGRF в ÑпиÑок
@@ -3008,23 +3036,26 @@
 STR_VEHICLE_LIST_SHIP_DEPOT                                     :{BLACK}{STRING} - {COMMA} корабл{P ÑŒ Ñ ÐµÐ¹}
 STR_VEHICLE_LIST_AIRCRAFT_DEPOT                                 :{BLACK}{STRING} - {COMMA} авиатранÑпорт{P "" а ов}
 
-STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}Заменить транÑпорт {STRING}
-STR_REPLACE_VEHICLES_START                                      :{BLACK}Ðачать замену транÑпорта
-STR_REPLACE_VEHICLES_STOP                                       :{BLACK}ОÑтановить замену транÑпорта
+STR_REPLACE_VEHICLES_WHITE                                      :{WHITE}Замена {STRING.p}
+STR_REPLACE_VEHICLES_START                                      :{BLACK}Ðачать замену
+STR_REPLACE_VEHICLES_STOP                                       :{BLACK}Прекратить замену
 STR_NOT_REPLACING                                               :{BLACK}Ðет замены
 STR_NOT_REPLACING_VEHICLE_SELECTED                              :{BLACK}ТранÑпорт не выбран
 STR_REPLACE_HELP_LEFT_ARRAY                                     :{BLACK}Выбор типа транÑпорта Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹
-STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Выбор нового типа машин, который хотелоÑÑŒ бы иÑпользовать вмеÑто выбранного Ñлева типа транÑпорта
-STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Ðажмите, чтобы прекратить замену локомотивов выбранного
-STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Ðажмите Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° замены выбранного Ñлева типа на выбранный Ñправа тип
-STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Выберите тип пути, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ вы хотите заменить локомотивы
-STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Показывает, на какой локомотив заменÑетÑÑ Ð»Ð¾ÐºÐ¾Ð¼Ð¾Ñ‚Ð¸Ð², выбранный Ñлева.
+STR_REPLACE_HELP_RIGHT_ARRAY                                    :{BLACK}Выбор типа транÑпорта, на который Ñледует заменить
+STR_REPLACE_HELP_STOP_BUTTON                                    :{BLACK}Прекратить замену транÑпорта
+STR_REPLACE_HELP_START_BUTTON                                   :{BLACK}Ðачать замену выбранных типов транÑпорта
+STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}Тип пути, на котором производить замену
+STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}Ðа какой танÑпорт проиÑходит замена
 STR_REPLACE_HELP                                                :{BLACK}Это позволÑет заменÑÑ‚ÑŒ один тип локомотива другим, когда локомотивы выбранного типа заезжают в депо.
-STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Удаление вагона: {ORANGE}{SKIP}{STRING}
-STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Разрешить при автозамене ÑохранÑÑ‚ÑŒ длину поездов удалением вагонов (Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð³Ð¾Ð»Ð¾Ð²Ñ‹ поезда), еÑли при автозамене локомотив увеличит длину поезда.
+STR_REPLACE_REMOVE_WAGON                                        :{BLACK}Удаление вагонов: {ORANGE}{SKIP}{STRING}
+STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Разрешить при автозамене ÑохранÑÑ‚ÑŒ длину поездов ÑпоÑобом ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²Ð°Ð³Ð¾Ð½Ð¾Ð² (Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð³Ð¾Ð»Ð¾Ð²Ñ‹ поезда), еÑли при автозамене локомотива увеличитÑÑ Ð´Ð»Ð¸Ð½Ð° поезда.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}ЗаменÑем: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK}ЭКСПЕРИМЕÐТÐЛЬÐО {}Переключение между окнами замены локомотивов и вагонов.{}Ðвтозамена вагонов производитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в том Ñлучае, еÑли Ñовпадает тип перевозимых грузов. Эта проверка производитÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ вагона во Ð²Ñ€ÐµÐ¼Ñ Ð°Ð²Ñ‚Ð¾Ð·Ð°Ð¼ÐµÐ½Ñ‹.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ñтроить локомотив
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Локомотив недоÑтупен
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}ÐвтотранÑпорт недоÑтупен
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Корабль недоÑтупен
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}ÐвиатранÑпорт недоÑтупен
 
 STR_ENGINES                                                     :Локомотивы
 STR_WAGONS                                                      :Вагоны
@@ -3043,16 +3074,16 @@
 STR_MASS_START_LIST_TIP                                         :{BLACK}Ðажмите Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка вÑего транÑпорта в ÑпиÑке
 
 STR_SHORT_DATE                                                  :{WHITE}{DATE_TINY}
-STR_SIGN_LIST_CAPTION                                           :{WHITE}СпиÑок меток - {COMMA} Метки
+STR_SIGN_LIST_CAPTION                                           :{WHITE}СпиÑок меток - {COMMA} Мет{P ка ки ок}
 
 STR_ORDER_REFIT_FAILED                                          :{WHITE}Ошибка Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¾Ð±Ð¾Ñ€ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ {STRING} {COMMA}
 
 ############ Lists rail types
 
-STR_RAIL_VEHICLES                                               :ЖД ТранÑпорт
+STR_RAIL_VEHICLES                                               :Поезда
 STR_ELRAIL_VEHICLES                                             :Электропоезда
-STR_MONORAIL_VEHICLES                                           :МонорельÑовый ТранÑпорт
-STR_MAGLEV_VEHICLES                                             :Магнитный ТранÑпорт
+STR_MONORAIL_VEHICLES                                           :МонорельÑовые
+STR_MAGLEV_VEHICLES                                             :Магнитные
 
 ############ End of list of rail types
 
@@ -3061,9 +3092,9 @@
 STR_PURCHASE_INFO_COST_WEIGHT                                   :{BLACK}Цена: {GOLD}{CURRENCY}{BLACK} ВеÑ: {GOLD}{WEIGHT_S}
 STR_PURCHASE_INFO_SPEED_POWER                                   :{BLACK}СкороÑÑ‚ÑŒ: {GOLD}{VELOCITY}{BLACK}   МощноÑÑ‚ÑŒ: {GOLD}{POWER}
 STR_PURCHASE_INFO_SPEED                                         :{BLACK}СкороÑÑ‚ÑŒ: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}СтоимоÑÑ‚ÑŒ обÑлуж.: {GOLD}{CURRENCY}/год
+STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}СтоимоÑÑ‚ÑŒ обÑлуживаниÑ: {GOLD}{CURRENCY}/год
 STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}ЕмкоÑÑ‚ÑŒ: {GOLD}{CARGO} {STRING}
-STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}Разработано в: {GOLD}{NUM}{BLACK} Срок работы: {GOLD}{COMMA} лет
+STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}Разработано в: {GOLD}{NUM}{BLACK} Срок Ñлужбы: {GOLD}{COMMA} лет
 STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}МакÑ. надежноÑÑ‚ÑŒ: {GOLD}{COMMA}%
 STR_PURCHASE_INFO_COST                                          :{BLACK}Цена: {GOLD}{CURRENCY}
 STR_PURCHASE_INFO_WEIGHT_CWEIGHT                                :{BLACK}ВеÑ: {GOLD}{WEIGHT_S} ({WEIGHT_S})
@@ -3073,16 +3104,16 @@
 STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}Переоборуд. длÑ: {GOLD}
 STR_PURCHASE_INFO_ALL_TYPES                                     :Ð’Ñех типов грузов
 STR_PURCHASE_INFO_ALL_BUT                                       :Ð’Ñе, кроме {GOLD}
-STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}МакÑ. ТÑговое УÑилие: {GOLD}{FORCE}
+STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}МакÑ. Ñ‚Ñговое уÑилие: {GOLD}{FORCE}
 
 ########### String for New Landscape Generator
 
 STR_GENERATE                                                    :{WHITE}Создать
-STR_RANDOM                                                      :{BLACK}Случайно
-STR_RANDOM_HELP                                                 :{BLACK}Изменить Ñлучайный номер, иÑпользуемый Генератором ландшафта.
+STR_RANDOM                                                      :{BLACK}Изменить
+STR_RANDOM_HELP                                                 :{BLACK}Изменить Ñлучайный номер, иÑпользуемый генератором ландшафта
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}Создание мира
-STR_RANDOM_SEED                                                 :{BLACK}Случ. номер:
-STR_RANDOM_SEED_HELP                                            :{BLACK}Ðажмите Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° Ñлучайного номера
+STR_RANDOM_SEED                                                 :{BLACK}Ðачальное чиÑло:
+STR_RANDOM_SEED_HELP                                            :{BLACK}Ландшафт генерируетÑÑ Ð¿ÑевдоÑлучайно, чиÑло - Ð¾Ð¿Ð¾Ñ€Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° в поÑледовательноÑти Ñлучайных чиÑел.
 STR_LAND_GENERATOR                                              :{BLACK}Генератор ландш.:
 STR_TREE_PLACER                                                 :{BLACK}Генератор леÑов:
 STR_HEIGHTMAP_ROTATION                                          :{BLACK}Поворот РЕЛЬЕФÐ:
@@ -3100,6 +3131,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Изменить год начала игры
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Выход за пределы доÑтупных значений
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Увеличение карты до таких размеров не рекомендуетÑÑ. Продолжить?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Предупреждение о раÑположении дорог
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}РаÑположение дорог "не Ñтроить дороги" не рекомендуетÑÑ. Продолжить Ñоздание карты?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Ð˜Ð¼Ñ Ð Ð•Ð›Ð¬Ð•Ð¤Ð:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Размер: {ORANGE}{NUM} x {NUM}
@@ -3112,11 +3145,11 @@
 STR_WORLD_GENERATION                                            :{BLACK}Создание мира
 STR_TREE_GENERATION                                             :{BLACK}Ð’Ñ‹Ñадка леÑов
 STR_UNMOVABLE_GENERATION                                        :{BLACK}Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½ÐµÐ´Ð²Ð¸Ð¶Ð¸Ð¼Ð¾Ñти
-STR_CLEARING_TILES                                              :{BLACK}Ð’Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð·Ð±Ñ€Ð°Ñывать камни ...
+STR_CLEARING_TILES                                              :{BLACK}РаÑÑтановка декораций и камней
 STR_SETTINGUP_GAME                                              :{BLACK}ÐаÑтройка
 STR_PREPARING_TILELOOP                                          :{BLACK}ВыполнÑем цикл
 STR_PREPARING_GAME                                              :{BLACK}Подготовка игры
-STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}ЗдеÑÑŒ можно изменить уровень ÑложноÑти
+STR_DIFFICULTY_TO_CUSTOM                                        :{WHITE}Ваши дейÑÑ‚Ð²Ð¸Ñ Ñменили уровень ÑложноÑти на пользовательÑкий
 STR_SE_FLAT_WORLD                                               :{WHITE}Ð Ð¾Ð²Ð½Ð°Ñ Ð·ÐµÐ¼Ð»Ñ
 STR_SE_FLAT_WORLD_TIP                                           :{BLACK}Создать ровную землю
 STR_SE_RANDOM_LAND                                              :{WHITE}Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ð·ÐµÐ¼Ð»Ñ
@@ -3131,20 +3164,20 @@
 STR_SMALLMAP_CENTER                                             :{BLACK}Центрировать миникарту по Ñтой позиции
 
 ########### String for new airports
-STR_SMALL_AIRPORT                                               :{BLACK}Малый аÑропорт
-STR_CITY_AIRPORT                                                :{BLACK}ГородÑкой аÑропорт
-STR_METRO_AIRPORT                                               :{BLACK}Федеральный аÑропорт
-STR_INTERNATIONAL_AIRPORT                                       :{BLACK}Международный аÑропорт
-STR_COMMUTER_AIRPORT                                            :{BLACK}Пригородный аÑропорт
-STR_INTERCONTINENTAL_AIRPORT                                    :{BLACK}Межконтинентальный аÑропорт
-STR_HELIPORT                                                    :{BLACK}Вертопорт
-STR_HELIDEPOT                                                   :{BLACK}ВертоДепо
-STR_HELISTATION                                                 :{BLACK}ВертоÑтанциÑ
+STR_SMALL_AIRPORT                                               :{BLACK}Малый
+STR_CITY_AIRPORT                                                :{BLACK}ГородÑкой
+STR_METRO_AIRPORT                                               :{BLACK}Федеральный
+STR_INTERNATIONAL_AIRPORT                                       :{BLACK}Международный
+STR_COMMUTER_AIRPORT                                            :{BLACK}Пригородный
+STR_INTERCONTINENTAL_AIRPORT                                    :{BLACK}Межконтинентальный
+STR_HELIPORT                                                    :{BLACK}Ð’ÐµÑ€Ñ‚Ð¾Ð»Ñ‘Ñ‚Ð½Ð°Ñ Ð¿Ð»Ð¾Ñ‰Ð°Ð´ÐºÐ°
+STR_HELIDEPOT                                                   :{BLACK}Вертолётное депо
+STR_HELISTATION                                                 :{BLACK}Ð’ÐµÑ€Ñ‚Ð¾Ð»Ñ‘Ñ‚Ð½Ð°Ñ ÑтанциÑ
 
 STR_SMALL_AIRPORTS                                              :{BLACK}Малые аÑропорты
 STR_LARGE_AIRPORTS                                              :{BLACK}Большие аÑропорты
 STR_HUB_AIRPORTS                                                :{BLACK}Базовые аÑропорты
-STR_HELIPORTS                                                   :{BLACK}Вертопорты
+STR_HELIPORTS                                                   :{BLACK}Вертолётные площадки
 
 ############ Tooltip measurment
 
@@ -3161,3 +3194,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Выручка перевозки: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...Ñта дорога принадлежит городу
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...дорога неправильного направлениÑ
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}ÐаÑтройки прозрачноÑти
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Переключить прозрачноÑÑ‚ÑŒ значков Ñтанций.
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Переключить прозрачноÑÑ‚ÑŒ деревьев.
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Переключить прозрачноÑÑ‚ÑŒ зданий.
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Переключить прозрачноÑÑ‚ÑŒ зданий промышленноÑти.
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Переключить прозрачноÑÑ‚ÑŒ зданий, которые можно Ñтроить игроком. Ðапример -- Ñтанции, депо, точки пути и Ñтолбы Ð´Ð»Ñ ÑлектричеÑтва.
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Переключить прозрачноÑÑ‚ÑŒ моÑтов
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Переключить прозрачноÑÑ‚ÑŒ зданий, вроде антенн и маÑков.
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Группа {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Ð’Ñе поезда
+STR_GROUP_ALL_ROADS                                             :ВеÑÑŒ автотранÑпорт
+STR_GROUP_ALL_SHIPS                                             :Ð’Ñе корабли
+STR_GROUP_ALL_AIRCRAFTS                                         :Ð’Ñе Ñамолёты
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Добавить Ñ Ð¾Ð±Ñ‰Ð¸Ð¼Ð¸ заданиÑми
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Удалить вÑех
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} поезд{P "" а ов}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} автомашин{P а ы ""}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} корабл{P ÑŒ Ñ ÐµÐ¹}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Ñамолёт{P "" а ов}
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Переименовать группу
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Заменить транÑпорт в группе "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Ðе могу Ñоздать группу...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Ðе могу удалить группу...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Ðе могу переименовать группу...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Ðе могу удалить веÑÑŒ транÑпорт Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Ðе могу добавить транÑпорт в группу...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Ðе могу добавить транÑпорт Ñ Ð¾Ð±Ñ‰Ð¸Ð¼Ð¸ заданиÑми в группу...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Группы - Щёлкните группу Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² ÑпиÑке
+STR_GROUP_CREATE_TIP                                            :{BLACK}Создать группу
+STR_GROUP_DELETE_TIP                                            :{BLACK}Удалить выбранную группу
+STR_GROUP_RENAME_TIP                                            :{BLACK}Переименовать выбранную группу
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Ð’ зажатом ÑоÑтоÑнии защищает группу от вÑеобщей автозамены
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Прибыль Ñтот год: {GREEN}{CURRENCY} {BLACK}(прошлый год: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Прибыль Ñтот год: {RED}{CURRENCY} {BLACK}(прошлый год: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Прибыль за год: {GREEN}{CURRENCY} {BLACK}(прошлый год: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Прибыль за год: {RED}{CURRENCY} {BLACK}(прошлый год: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/simplified_chinese.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/simplified_chinese.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -751,6 +751,7 @@
 STR_02A1_SMALL                                                  :{BLACK}å°
 STR_02A2_MEDIUM                                                 :{BLACK}中
 STR_02A3_LARGE                                                  :{BLACK}大
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}城市
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}选择城镇规模
 STR_02A5_TOWN_SIZE                                              :{YELLOW}城镇规模:
 
@@ -802,6 +803,7 @@
 STR_02DE_MAP_OF_WORLD                                           :世界地图
 STR_EXTRA_VIEW_PORT                                             :é¢å¤–视点
 STR_SIGN_LIST                                                   :标志列表
+STR_TRANSPARENCY_OPTIONS                                        :é€æ˜Žé€‰é¡¹
 STR_02DF_TOWN_DIRECTORY                                         :城镇地图
 STR_TOWN_POPULATION                                             :{BLACK}世界人å£ï¼š{COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}视点 {COMMA}
@@ -1134,6 +1136,15 @@
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :å³ä¾§
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}窗å£ä¾é™„åŠå¾„:{ORANGE}{STRING} åƒç´ 
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}窗å£ä¾é™„åŠå¾„:{ORANGE}ç¦ç”¨
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}城镇å‘展速度:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :æ— 
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :æ…¢
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :正常
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :å¿«
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :éžå¸¸å¿«
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}城镇å‘展为城市的比例:{ORANGE}1 / {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}城镇å‘展为城市的比例:{ORANGE}æ— 
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}åˆå§‹åŸŽå¸‚规模因å­ï¼š{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}ç•Œé¢
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}建设
@@ -3012,7 +3023,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}当引擎å‡çº§å¯èƒ½é€ æˆåˆ—车å˜é•¿æ—¶ï¼Œè‡ªåŠ¨åŽ»æŽ‰æœ€å¼€å§‹çš„若干挂车以ä¿è¯åˆ—车长度ä¸å˜ã€‚
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}替æ¢é¡¹ç›®ï¼š {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK}试验功能:{}å¯ä»¥åˆ‡æ¢å¼•æ“Ž/挂车替æ¢æ¨¡å¼ã€‚{}åªæœ‰å½“新的挂车å¯ä»¥æ”¹è£…æˆä¸ŽåŽŸå§‹æŒ‚车装载货物类型相åŒçš„时候,æ‰èƒ½æ›¿æ¢æŒ‚车。当替æ¢è¿‡ç¨‹è¿›è¡Œæ—¶ï¼Œç³»ç»Ÿå°†è‡ªåŠ¨æ£€æŸ¥æ¯èŠ‚挂车的类型。
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}ä¸èƒ½å»ºé€ è¿™ç§å¼•æ“Žã€‚
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}列车ä¸å¯ç”¨
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}车辆ä¸å¯ç”¨
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}船åªä¸å¯ç”¨
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}飞机ä¸å¯ç”¨
 
 STR_ENGINES                                                     :引擎
 STR_WAGONS                                                      :挂车
@@ -3149,3 +3163,14 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}转è¿è¯„分: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}这是一æ¡åŸŽé•‡æ‰€å±žçš„é“è·¯
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}é“路方å‘ä¸å¯¹
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}é€æ˜Žé€‰é¡¹
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}调整站牌的é€æ˜Žåº¦
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}调节树木é€æ˜Žåº¦
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}调节建筑é€æ˜Žåº¦
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}调节工业设施é€æ˜Žåº¦
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}调节车站ã€ç å¤´åŠè·¯ç‚¹ç­‰çš„é€æ˜Žåº¦
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}调节桥æ¢çš„é€æ˜Žåº¦
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}调节ç¯å¡”åŠä¿¡å·å‘射塔的é€æ˜Žåº¦
--- a/src/lang/slovak.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/slovak.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -5,6 +5,8 @@
 ##case g
 ##gender m z s
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Za okrajom mapy
@@ -602,36 +604,36 @@
 STR_01D3_SOUND_MUSIC                                            :Zvuk/Hudba
 STR_01D4_SHOW_SOUND_MUSIC_WINDOW                                :{BLACK}Zobraz okno zvuku a hudby
 STR_01D5_ALL                                                    :{TINYFONT}VÅ¡etko
-STR_01D6_OLD_STYLE                                              :{TINYFONT}Stary styl
-STR_01D7_NEW_STYLE                                              :{TINYFONT}Novy styl
+STR_01D6_OLD_STYLE                                              :{TINYFONT}Starý štýl
+STR_01D7_NEW_STYLE                                              :{TINYFONT}Nový štýl
 STR_01D8_EZY_STREET                                             :{TINYFONT}Ezy Street
-STR_01D9_CUSTOM_1                                               :{TINYFONT}Vlastne 1
-STR_01DA_CUSTOM_2                                               :{TINYFONT}Vlastne 2
+STR_01D9_CUSTOM_1                                               :{TINYFONT}Vlastné 1
+STR_01DA_CUSTOM_2                                               :{TINYFONT}Vlastné 2
 STR_01DB_MUSIC_VOLUME                                           :{BLACK}{TINYFONT}Hlasitost hudby
 STR_01DC_EFFECTS_VOLUME                                         :{BLACK}{TINYFONT}Hlasitost zvuk. efektov
 STR_01DD_MIN_MAX                                                :{BLACK}{TINYFONT}MIN  '  '  ' '  '  '  MAX
-STR_01DE_SKIP_TO_PREVIOUS_TRACK                                 :{BLACK}Predchadzajuca stopa
-STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Nasledujuca stopa
-STR_01E0_STOP_PLAYING_MUSIC                                     :{BLACK}Zastavit prehravanie hudby
-STR_01E1_START_PLAYING_MUSIC                                    :{BLACK}Spustit prehravanie hudby
-STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Tahat posuvace pre zmenu hlasitosti
+STR_01DE_SKIP_TO_PREVIOUS_TRACK                                 :{BLACK}Predchádzajúca stopa
+STR_01DF_SKIP_TO_NEXT_TRACK_IN_SELECTION                        :{BLACK}Nasledujúca stopa
+STR_01E0_STOP_PLAYING_MUSIC                                     :{BLACK}Zastavit prehrávanie hudby
+STR_01E1_START_PLAYING_MUSIC                                    :{BLACK}Spustit prehrávanie hudby
+STR_01E2_DRAG_SLIDERS_TO_SET_MUSIC                              :{BLACK}Tahat posúvace pre zmenu hlasitosti
 STR_01E3                                                        :{DKGREEN}{TINYFONT}--
 STR_01E4_0                                                      :{DKGREEN}{TINYFONT}0{COMMA}
 STR_01E5                                                        :{DKGREEN}{TINYFONT}{COMMA}
 STR_01E6                                                        :{DKGREEN}{TINYFONT}------
 STR_01E7                                                        :{DKGREEN}{TINYFONT}"{STRING}"
 STR_01E8_TRACK_XTITLE                                           :{BLACK}{TINYFONT}Stopa{SETX 88}Title
-STR_01E9_SHUFFLE                                                :{TINYFONT}Nahodne
+STR_01E9_SHUFFLE                                                :{TINYFONT}Náhodne
 STR_01EA_PROGRAM                                                :{TINYFONT}{BLACK}Program
-STR_01EB_MUSIC_PROGRAM_SELECTION                                :{WHITE}Vyber hudobneho programu
+STR_01EB_MUSIC_PROGRAM_SELECTION                                :{WHITE}Výber hudobného programu
 STR_01EC_0                                                      :{TINYFONT}{LTBLUE}0{COMMA} "{STRING}"
 STR_01ED                                                        :{TINYFONT}{LTBLUE}{COMMA} "{STRING}"
-STR_01EE_TRACK_INDEX                                            :{TINYFONT}{BLACK}Cislo stopy
+STR_01EE_TRACK_INDEX                                            :{TINYFONT}{BLACK}Císlo stopy
 STR_01EF_PROGRAM                                                :{TINYFONT}{BLACK}Program - '{STRING}'
 STR_01F0_CLEAR                                                  :{TINYFONT}{BLACK}Zmazat
-STR_01F1_SAVE                                                   :{TINYFONT}{BLACK}Ulozit
-STR_01F2_CURRENT_PROGRAM_OF_MUSIC                               :{BLACK}Aktualny program
-STR_01F3_SELECT_ALL_TRACKS_PROGRAM                              :{BLACK}Vybrat 'Vsetko'
+STR_01F1_SAVE                                                   :{TINYFONT}{BLACK}Uložit
+STR_01F2_CURRENT_PROGRAM_OF_MUSIC                               :{BLACK}Aktuálny program
+STR_01F3_SELECT_ALL_TRACKS_PROGRAM                              :{BLACK}Vybrat 'VÅ¡etko'
 STR_01F4_SELECT_OLD_STYLE_MUSIC                                 :{BLACK}Vybrat 'Stary styl'
 STR_01F5_SELECT_NEW_STYLE_MUSIC                                 :{BLACK}Vybrat 'Novy styl'
 STR_01F6_SELECT_CUSTOM_1_USER_DEFINED                           :{BLACK}Vybrat 'Vlastny 1' (uzivatelom definovany) program
@@ -815,6 +817,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Male
 STR_02A2_MEDIUM                                                 :{BLACK}Stredne
 STR_02A3_LARGE                                                  :{BLACK}Velke
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Mesto
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Vyber velkost mesta
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Velkost mesta:
 
@@ -866,6 +869,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mapa sveta
 STR_EXTRA_VIEW_PORT                                             :Dalsi pohlad
 STR_SIGN_LIST                                                   :Zoznam popisov
+STR_TRANSPARENCY_OPTIONS                                        :Nastavenia priehladnosti
 STR_02DF_TOWN_DIRECTORY                                         :Zoznam miest
 STR_TOWN_POPULATION                                             :{BLACK}Svetova populacia: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Pohlad {COMMA}
@@ -1108,6 +1112,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Novy globalny algoritmus hladania cesty (NPF namiesto NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Váhový násobok pre nákladné vlaky: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Povolit prejazdné zastávky na mestských cestách: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Povolit stavbu oddelených staníc: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Vzdy povolit stavbu malych letisk: {ORANGE}{STRING}
 
@@ -1159,6 +1164,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Posúvat mapu
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Vypnuté
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Rychlost posúvania mapy: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automaticka pauza pri Å¡tarte novej hry: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Použit vylepšený zoznam vozidiel: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Maximalny pocet vlakov hraca: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Maximalny pocet automobilov hraca: {ORANGE}{STRING}
@@ -1192,12 +1199,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Povolit nakup akcii ostatnych spolocnosti
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Pri stavbe tahanim umiestnit semafory na kazde: {ORANGE}{STRING}. pole
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Automatická stavba semafórov pred: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Struktúra mesta "žiadne cesty naviac" nie je platná v editore scenárov
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Štruktúra mestských ciestt: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :žiadne cesty naviac
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :štandardná
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :lepšie cesty
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :mriežka 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :mriežka 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pozicia hlavneho menu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Nalavo
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :V strede
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Napravo
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Vzdialenost pre prichytenie okna: {ORANGE}{STRING} bodov
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Vzdialenost pre prichytenie okna: {ORANGE}vypnute
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Rozvoj miest: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Žiadny
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Pomalý
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normálny
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rýchly
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Velmi rýchly
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Pomer miest, ktoré budú rást 2x rýchlejšie: {ORANGE}1 v {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Pomer miest, ktoré budú rást 2x rýchlejšie: {ORANGE}Žiadny
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Násobok pociatocnej velkosti mesta: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Rozhranie
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Vystavba
@@ -1628,6 +1653,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Zeleznicne kolaje s pre-signalmi
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Zeleznicne kolaje s exit-signalmi
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Zeleznicne kolaje s combo-signalmi
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Je potrebné najprv odstránit železnicnú stanicu
 
 
 
@@ -2055,6 +2081,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Heliport
 STR_SV_STNAME_FOREST                                            :{STRING} Les
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2090,6 +2118,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ziadny
+STR_NUM_VERY_LOW                                                :Velmi malý
 STR_6816_LOW                                                    :Nizke
 STR_6817_NORMAL                                                 :Normalne
 STR_6818_HIGH                                                   :Vysoke
@@ -3076,7 +3105,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Funkcia automatickeho vylepsovania vlakov moze udrzovat rovnaku dlzku vlakov odstranovanim vagonov (od zaciatku vlakov), pokial by zmena rusna vlak predlzila.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Vymena: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTALNA VLASTNOST {}Prepne medzi oknami na vymenu lokomotiv a vagonov.{}Vagon sa vymeni, len ked je nový vagon schopny vozit rovnaky naklad, ako ten stary. Toto sa overuje pre kazdy vagon.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Lokomotiva sa nevyraba
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vozidlo nie je dostupné
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vozidlo nie je dostupné
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Lod nie je dostupná
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Lietadlo nie je dostupné
 
 STR_ENGINES                                                     :Lokomotívy
 STR_WAGONS                                                      :Vagonov
@@ -3152,6 +3184,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Zmenit rok zaciatku hry
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Upozornenie na stupnicu
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Prilis velka zmena velkosti zdrojovej mapy sa neodporuca. Pokracovat s generovanim?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Upozornenie na štruktúra mesta
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Štruktúra mesta  "žiadne cesty naviac" sa neodporúca. Pokracovat s generovaním?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nazov vyskovej mapy:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Velkost: {ORANGE}{NUM} x {NUM}
@@ -3213,3 +3247,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transfer kredity: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}... cesta vlastnená mestom
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}... nesprávna orientácia cesty
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Nastavenia priehladnosti
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Prepnút priehladnost názvov staníc
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Prepnút priehladnost stromov
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Prepnút priehladnost domov
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Prepnút priehladnost priemyslu
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Prepnút priehladnost staníc, garáží, tratí, ...
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Prepnút priehladnost mostov
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Prepnút priehladnost objektov ako sú majáky a antény
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Skupina {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :VÅ¡etky vlaky
+STR_GROUP_ALL_ROADS                                             :Všetky cestné vozidlá
+STR_GROUP_ALL_SHIPS                                             :VÅ¡etky lode
+STR_GROUP_ALL_AIRCRAFTS                                         :Všetky lietadlá
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Pridat zdielané vozidlá
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Odstránit všetky vozidlá
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Vlak{P "" y ov}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Vozid{P lo lá ied}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Lod{P "" e í}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Lietad{P lo lá iel}
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Premenovat skupinu
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Nahradit vozidlá skupiny "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Nie je možné vytvorit skupinu ...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Nie je možné zrušit túto skupinu ...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Nie je možné premenovat skupinu ...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Nie je možné odstránit všetky vozdilá z tejto skupiny ...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Nie je možné pridat vozidlo do tejto skupiny
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Nie je možné pridat zdielané vozidlo do skupiny
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Skupiny  - kliknite na skupinu pre zobrazenie všetkých vozidiel skupiny
+STR_GROUP_CREATE_TIP                                            :{BLACK}Kliknite pre vytvorenie skupiny
+STR_GROUP_DELETE_TIP                                            :{BLACK}Zrušit vybranú skupinu
+STR_GROUP_RENAME_TIP                                            :{BLACK}Premenovat vybranú skupinu
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Kliknite pre znemoznenie automatického nahradzovania v skupine
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Zisk tento rok: {GREEN}{CURRENCY} {BLACK}(minulý rok: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Zisk tento rok: {RED}{CURRENCY} {BLACK}(lminulý rok: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Zisk tento rok: {GREEN}{CURRENCY} {BLACK}(minulý rok: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Zisk tento rok: {RED}{CURRENCY} {BLACK}(minulý rok: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/slovenian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/slovenian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -769,6 +769,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Postavi svetilnik
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Postavi oddajnik
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}DoloÄi obmoÄja puÅ¡Äave.{}Pritisni in drži CTRL za odstranitev
+STR_CREATE_LAKE                                                 :{BLACK}DoloÄi podroÄje vode.{}Naredi kanal, razen Äe je pritisnjen CTRL na morski gladini, ko bo poplavilo okolico.
 STR_0290_DELETE                                                 :{BLACK}Izbriši
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Popolnoma izbriši mesto
 STR_0292_SAVE_SCENARIO                                          :Shrani scenarij
@@ -792,6 +793,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Majhno
 STR_02A2_MEDIUM                                                 :{BLACK}Srednje
 STR_02A3_LARGE                                                  :{BLACK}Veliko
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Mesto
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Izberi velikost mesta
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Velikost mesta:
 
@@ -843,6 +845,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Zemljevid sveta
 STR_EXTRA_VIEW_PORT                                             :Dodaten pogled
 STR_SIGN_LIST                                                   :Seznam napisov
+STR_TRANSPARENCY_OPTIONS                                        :Nastavitve prozornega pogleda
 STR_02DF_TOWN_DIRECTORY                                         :Imenik mest
 STR_TOWN_POPULATION                                             :{BLACK}Svetovno prebivalstvo: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Pogled {COMMA}
@@ -1136,6 +1139,7 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Premikaj zemljevid
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Izklopljeno
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Hitrost premika s kolescem miške: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Avtomatsko pavziraj ob zagonu nove igre: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}NajveÄ vlakov na igralca: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}NajveÄ cestnih vozil na igralca: {ORANGE}{STRING}
@@ -1169,12 +1173,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Dovoli kupovanje delnic od drugih podjetij
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Med vleÄenjem postavi signale vsakih: {ORANGE}{STRING} ploÅ¡Äic
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Samodejno postavi semaforje pred: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Mestna razporeditev "niÄ veÄ cest" ni veljavna v urejevalniku terena
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Izberi razporeditev mestnih cest: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :niÄ veÄ cest
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :privzeto
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :boljše ceste
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 mreža
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 mreža
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Pozicija glavne orodne vrstice: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Levo
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Sredina
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Desno
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Radij lepljenja oken: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Radij lepljenja oken: {ORANGE}onemogoÄeno
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Hitrost rasti mesta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Brez
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :PoÄasi
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normalno
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Hitro
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Zelo hitro
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Razmerje mest, ki bodo rastla z dvakratno hitrostjo: {ORANGE}1 v {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Razmerje mest, ki bodo rastla z dvakratno hitrostjo: {ORANGE}Brez
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}ZaÄetni faktor rasti mesta: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Vmesnik
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Gradnja
@@ -1254,6 +1276,7 @@
 STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Postavi drevesa nakljuÄne vrste
 
 STR_CANT_BUILD_CANALS                                           :{WHITE}Ni mogoÄe zgraditi kanalov tukaj ...
+STR_BUILD_CANALS_TIP                                            :{BLACK}Zgradi kanale.
 STR_LANDINFO_CANAL                                              :Kanal
 
 STR_CANT_BUILD_LOCKS                                            :{WHITE}Ni mogoÄe zgraditi zapornic tukaj ...
@@ -2069,6 +2092,7 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} PristajaliÅ¡Äe
 STR_SV_STNAME_FOREST                                            :{STRING} Gozd
 
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2104,6 +2128,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Brez
+STR_NUM_VERY_LOW                                                :Zelo malo
 STR_6816_LOW                                                    :Malo
 STR_6817_NORMAL                                                 :Normalno
 STR_6818_HIGH                                                   :Veliko
@@ -3090,7 +3115,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Dovoli samozamenjavi, da z odstranitvijo vagonov, zaÄenÅ¡i na zaÄetku, ohrani isto dolžino vlaka, Äe bi ga menjava lokomotive podaljÅ¡ala.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Zamenjuje: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} POSKUSNA MOŽNOST {}Preklop med okni za menjavo lokomotiv in vagonov.{}Zamenjava vagonov je možna edino, Äe je lahko drugi tip vagona predelan za prevoz iste vrste tovora, kot prvi. To je preverjeno za vsak vagon, ko se izvrÅ¡i zamenjava,
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Lokomotive ni moÄ zgraditi
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vozilo ni na voljo
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vozilo ni na voljo
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Ladja ni na voljo
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Letalo ni na voljo
 
 STR_ENGINES                                                     :Lokomotive
 STR_WAGONS                                                      :Vagoni
@@ -3166,6 +3194,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Spremeni zaÄetno leto
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Opozorilo za merilo
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Prevelika sprememba velikosti ozemlja ni priporoÄena. Nadaljujem?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Opozorilo mestne  razporeditve
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Mestna razporeditev "niÄ veÄ cest" ni priporoÄena. NadaljujeÅ¡ z ustvarjanjem?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Ime višinskega zemljevida:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Velikost: {ORANGE}{NUM} x {NUM}
@@ -3227,3 +3257,22 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Prenesi kredite: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...ta cesta je last mesta
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...cesta je obrnjena napaÄno
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Nastavitve prozornega pogleda
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Prozoren ali poln pogled imen postaj
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Prozoren ali poln pogled dreves
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Prozoren ali navaden pogled hiš
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Prozoren ali navaden pogled industrij
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Prozoren ali navaden pogled ostalih objektov kot so postaje, garaže...
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Prozoren ali navaden pogled mostov
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Prozoren ali navaden pogled struktur kot so antene, svetilniki...
+
+##### Mass Order
+
+
+
+
+
+########
--- a/src/lang/spanish.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/spanish.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -752,6 +752,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Pequeña
 STR_02A2_MEDIUM                                                 :{BLACK}Mediana
 STR_02A3_LARGE                                                  :{BLACK}Grande
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Ciudad
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Selecciona el tamaño de la población
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Tamaño población:
 
@@ -803,6 +804,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Mapa del mundo
 STR_EXTRA_VIEW_PORT                                             :Punto de vista extra
 STR_SIGN_LIST                                                   :Lista de señales
+STR_TRANSPARENCY_OPTIONS                                        :Opciones de transparencia
 STR_02DF_TOWN_DIRECTORY                                         :Listado de poblaciones
 STR_TOWN_POPULATION                                             :{BLACK}Población mundial: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Vista {COMMA}
@@ -1096,6 +1098,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scroll sobre el mapa
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Nada
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Velocidad del scroll sobre el mapa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Automaticamente hace pausa cuando empieza un juego nuevo: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Usar la lista avanza de vehículos: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Máx trenes por jugador: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Máx vehículos de carretera por jugador: {ORANGE}{STRING}
@@ -1129,12 +1133,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Permitir comprar acciones de otras empresas
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Cuando arrastre colocar señales cada: {ORANGE}{STRING} casilla(s)
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Coloca automáticamente semáforos antes de: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}El trazado de ciudad "no más carreteras" no es válido en el editor de escenarios
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Selecciona trazado de carretera en ciudad: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :no más carreteras
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :por defecto
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :mejores carreteras
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :rejilla 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :rejilla 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Posición de la barra de herramientas principal: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Izquierda
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centro
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Derecha
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Radio de snap de ventana: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Radio de snap de ventana: {ORANGE}desactivado
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Velocidad crecimiento ciudad: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ninguna
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Lenta
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Rápida
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Muy rápida
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Proporción de ciudades que crecerán el doble de rápido: {ORANGE}1 de {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Proporción de ciudades que crecerán el doble de rápido: {ORANGE}Ninguna
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Multiplicador inicial tamaño de ciudad: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Interfaz
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Construcción
@@ -1992,6 +2014,7 @@
 STR_SV_STNAME_HELIPORT                                          :Helipuerto de {STRING}
 STR_SV_STNAME_FOREST                                            :Bosque de {STRING}
 
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2027,6 +2050,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ninguno
+STR_NUM_VERY_LOW                                                :Muy bajo
 STR_6816_LOW                                                    :Baja
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Alta
@@ -3013,7 +3037,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Hacer que el cambio automático mantenga la longitud del tren quitando vagones (empezando por adelante), si el cambio de locomotora produce un tren más largo.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Reemplazando: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} FUNCIÓN EXPERIMENTAL {}Cambia entre las ventanas de cambio de vagón y locomotora.{}Los cambios de vagón solo se harán si el nuevo vagón puede ser reparado para transportar el mismo tipo de carga que el anterior. Está marcado para cada vagón cuando el cambio actual se realiza.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}No es posible construir este motor
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehículo no disponible
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Vehículo no disponible
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Barco no disponible
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Aeronave no disponible
 
 STR_ENGINES                                                     :Motores
 STR_WAGONS                                                      :Vagones
@@ -3089,6 +3116,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Cambiar año de inicio
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Alerta de escala
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Cambiar demasiado el tamaño del mapa de origen no está recomendado. ¿Desea continuar con la generación?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Aviso de trazado de ciudad
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}El trazado de ciudad "no más carreteras" no es recomendable. ¿Continuar con la generación?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Nombre del mapa de alturas:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Tamaño: {ORANGE}{NUM} x {NUM}
@@ -3150,3 +3179,46 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Transferir Créditos: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...esta es una carretera propiedad de una ciudad
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...revestimientos del camino en la dirección incorrecta
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Opciones de Transparencia
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Activar transparencia para las señales de estaciones
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Activar transparencia para los árboles
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Activar transparencia para las casas
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Activar transparencia para las industrias
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Activar transparencias para construcciones como estaciones, depósitos, puntos de paso, etc.
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Activar transparencias para puentes
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Activar transparencias para estructuras como faros, antenas, etc.
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Grupo {COMMA}
+STR_GROUP_ALL_TRAINS                                            :Todos los trenes
+STR_GROUP_ALL_ROADS                                             :Todos los vehículos de carretera
+STR_GROUP_ALL_SHIPS                                             :Todos los barcos
+STR_GROUP_ALL_AIRCRAFTS                                         :Todas las aeronaves
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Todos los vehículos compartidos
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Quitar todos los vehículos
+
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Renombrar un grupo
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}No se puede crear grupo...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}No se puede borrar este grupo...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}No se puede renombrar grupo...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}No se pueden quitar todos los vehículos de este grupo...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}No se puede añadir el vehículo a este grupo...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}No se pueden añadir vehículos compartidos al grupo...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Grupos - Pulsa en el grupo para ver la lista de vehículos que tiene el grupo
+STR_GROUP_CREATE_TIP                                            :{BLACK}Pulsa para crear un grupo
+STR_GROUP_DELETE_TIP                                            :{BLACK}Borrar el grupo seleccionado
+STR_GROUP_RENAME_TIP                                            :{BLACK}Renombrar el grupo seleccionado
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Pulsa para proteger este grupo del auto reemplazado global
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Beneficio este año: {GREEN}{CURRENCY} {BLACK}(año pasado: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Beneficio este año: {RED}{CURRENCY} {BLACK}(año pasado: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Beneficio este año: {GREEN}{CURRENCY} {BLACK}(año pasado: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Beneficio este año: {RED}{CURRENCY} {BLACK}(año pasado: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/swedish.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/swedish.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode sv_SE
 ##plural 0
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Utanför kanten
@@ -751,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Liten
 STR_02A2_MEDIUM                                                 :{BLACK}Mellan
 STR_02A3_LARGE                                                  :{BLACK}Stor
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Stad
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Välj stadsstorlek
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Stadsstorlek:
 
@@ -802,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Världskarta
 STR_EXTRA_VIEW_PORT                                             :Nytt vyfönster
 STR_SIGN_LIST                                                   :Skyltlista
+STR_TRANSPARENCY_OPTIONS                                        :Genomskinlighetsinställningar
 STR_02DF_TOWN_DIRECTORY                                         :Stadslista
 STR_TOWN_POPULATION                                             :{BLACK}Världsbefolkning: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Vyfönster {COMMA}
@@ -1044,6 +1048,7 @@
 STR_CONFIG_PATCHES_NEW_PATHFINDING_ALL                          :{LTBLUE}Ny globalt sätt att hitta rutt (NPF, åsidosätter NTP): {ORANGE}{STRING}
 STR_CONFIG_PATCHES_FREIGHT_TRAINS                               :{LTBLUE}Godsfaktor för att simulera tunga tåg: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD                            :{LTBLUE}Tillåt genomfarts-stop på stadsägda vägar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{LTBLUE}Tillåt byggande av närliggande stationer: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Tillåt alltid små flygplatser: {ORANGE}{STRING}
 
@@ -1084,6 +1089,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Serva helikoptrar vid landningplattor automatiskt: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Koppla landskapsverktyget till övriga verktygsfält: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Omvänd scrollriktning: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Mjuk skrollning av vy: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Visa måtthjälptext vid användning av byggverktyg: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Visa färgschema för företag: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Inga
@@ -1095,6 +1101,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Scrolla kartan
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Avstängd
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Mushjulshastighet: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Pausa automatiskt vid start av nytt spel: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}Använd den avancerade fordonslistan: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Max antal tåg per spelare: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Max antal vägfordon per spelare: {ORANGE}{STRING}
@@ -1128,12 +1136,30 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Tillåt inköp av aktier från andra företag
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Vid utdragning av signaler, placera en signal var: {ORANGE}{STRING} ruta
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Bygg automatiskt semaforer innan: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Det går ej att använda "inga fler vägar" i scenario editorn
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Välj stadens väg-inställningar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :inga fler vägar
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :standard
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :bättre vägar
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2 rutnät
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3 rutnät
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Position av verktygsraden: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Vänster
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Centrerad
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Höger
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Fönstersnäppsradie: {ORANGE}{STRING} px
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Fönstersnäppsradie: {ORANGE}avaktiverad
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Stadens tillväxthastighet: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ingen
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :LÃ¥ngsamt
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normalt
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Snabbt
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Väldigt snabbt
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Andel av städerna som kommer växa dubbelt så fort: {ORANGE}1 av {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}Andel av städerna som kommer växa dubbelt så fort: {ORANGE}Inga
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Initial stadsstorleks multiplikator: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Gränssnitt
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Konstruktion
@@ -1564,6 +1590,13 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :Järnväg med för-signaler
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :Järnväg med utgående signaler
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :Järnväg med kombinerade signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS                       :Järnväg med normala signaler och för-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS                      :Järnväg med normala signaler och utfarts-signaler
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS                     :Järnväg med normala signaler och kombo-signaler
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS                         :Järnväg med för- och utfarts-signaler
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS                        :Järnväg med för- och kombo-signaler
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS                       :Järnväg med utfards-signaler och kombo-signaler
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Måste ta bort tågstationen först
 
 
 
@@ -1571,22 +1604,39 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Måste ta bort väg först
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Vägarbete pågår
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Bygg väg
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Byggnation av spårvagn
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Välj vägbro
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... enkelriktade vägar kan inte ha korsningar
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Kan inte bygga väg här...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Kan inte bygga spårvagnsräls här...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Kan inte ta bort väg här...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Kan inte ta bort spårvagnsrälsen härifrån...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Riktning för bussgarage
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Spårvagnsdepåns orientering
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Kan inte bygga bussgarage här...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Kan inte bygga spårvagnsdepå här...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Kan inte bygga busshållplats...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Kan inte bygga lastbilsstation...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Kan inte bygga passagerar-spårvagnsstation...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Kan inte bygga frakt-spårvagnsstation...
 STR_180A_ROAD_CONSTRUCTION                                      :Bygg väg
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Spårvagnskonstruktion
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Bygg väg
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Bygg spårvagnssektion
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Bygg bussgarage (för att bygga eller reparera vägfordon)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Bygg spårvagnsdepå (för att konstruera och serva fordon)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Bygg busshållplats
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Bygg lastbilsstation
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Bygg passagerar-spårvagnsstation
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Bygg frakt-spårvagnsstation
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Bygg vägbro
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Bygg spårvagnsbro
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Bygg vägtunnel
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Bygg spårvagnstunnel
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Växla mellan att bygga/ta bort väg
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Växla byggande/rivande av spårvagnskonstruktion
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Välj riktning för bussgarage
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Välj spårvagnsdepåns orientering
 STR_1814_ROAD                                                   :Väg
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Väg med gatubelysning
 STR_1816_TREE_LINED_ROAD                                        :Väg med träd
@@ -1594,6 +1644,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Väg-/Järnvägskorsning
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Kan inte ta bort busstation...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Kan inte ta bort lastbilsstation...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Kan inte ta bort passagerar-spårvagnsstation...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Kan inte ta bort frakt-spårvagnsstation...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Städer
@@ -1678,7 +1730,7 @@
 STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Starta en liten lokal reklamkampanj, för att attrahera fler passagerare och gods till dina tranporttjänster.{}  Kostnad: {CURRENCY}
 STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} Starta en mellanstor lokal reklamkampanj, för att attrahera fler passagerare och gods till dina tranporttjänster.{}  Kostnad: {CURRENCY}
 STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} Starta en stor lokal reklamkampanj, för att attrahera fler passagerare och gods till dina tranporttjänster.{}  Kostnad: {CURRENCY}
-STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} Bekosta ombyggnad av stadens vägnätverk. Orsakar ansenlig splittring för vägtrafik upp till 6 månader.{}  Kostnad: {CURRENCY}
+STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} Bekosta ombyggnad av stadens vägnätverk. Orsakar ansenliga störningar för vägtrafik i upp till 6 månader.{}  Kostnad: {CURRENCY}
 STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} Bygg en staty i ditt företags ära.{} Kostnad: {CURRENCY}
 STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} Bekosta uppbyggnad av nya kommersiella byggnader i staden.{}  Kostnad: {CURRENCY}
 STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} Köp 1 års exklusiv transporträttighet i staden. Stadens myndigheter kommer bara tillåta passagerare och gods till användning för ditt företags stationer.{} Kostnad: {CURRENCY}
@@ -1758,8 +1810,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} tar nu emot {STRING} och {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Busshållplatsriktning
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Lastbilsbryggsriktning
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Passagerar-spårvagns riktning
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Frakt-spårvagns riktning
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Måste riva busshållplats först
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Måste riva lastbilsbrygga först
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Måste ta bort passagerar-spårvagnsstation först
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Måste ta bort frakt-spårvagnsstation först
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Station{P "" er}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Inga -
@@ -1771,6 +1827,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Välj längden på järnvägsstation
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Välj riktning för busshållplats
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Välj riktning för lastbilsbrygga
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Välj passagerar-spårvagnsstationens orientering
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Välj frakt-spårvagnsstationens orientering
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Centrera vyn på stationen
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Visa stationens klassificering
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Byt namn på stationen
@@ -1991,6 +2049,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Helikopterplats
 STR_SV_STNAME_FOREST                                            :{STRING} Skog
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2026,6 +2086,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ingen
+STR_NUM_VERY_LOW                                                :Väldigt låg
 STR_6816_LOW                                                    :LÃ¥g
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Hög
@@ -2218,6 +2279,8 @@
 STR_LIVERY_HELICOPTER                                           :Helikopter
 STR_LIVERY_SMALL_PLANE                                          :Litet flygplan
 STR_LIVERY_LARGE_PLANE                                          :Stort Flygplan
+STR_LIVERY_PASSENGER_TRAM                                       :Passagerarspårvagn
+STR_LIVERY_FREIGHT_TRAM                                         :Fraktspårvagn
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Visa generellt färgschema
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Visa färgscheman för tåg
@@ -2691,6 +2754,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Byt namn på vägfordon
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Invånarna firar . . .{}Första bussen ankommer till {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Invånarna firar . . .{}Första lastbilen ankommer till {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Invånarna firar . . .{}Första passagerar-spårvagnen anländer på {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Invånarna firar . . .{}Första frakt-spårvagnen anländer på {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}Vägfordonskrash!{}förare dör i eldklot efter kollision med tåg
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}Vägfordonskrash!{}{COMMA} dör i eldklot efter kollision med tåg
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Kan inte tvinga fordonet att vända om...
@@ -2975,6 +3040,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Du är på väg att sälja alla fordon i depån. Är du säker?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Felaktig depå-typ
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Sälj alla tåg i depån
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Sälj alla vägfordon i depån
@@ -3012,7 +3078,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Gör så att automatiskt utbytning behåller ett tågs längd genom att ta bort vagnar (med början längst fram) om utbytandet av loket skulle göra tåget längre.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Ersätter: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} EXPERIMENTIELL FEATURE {}Välj mellan lok och vagn ersättnings-fönster.{}Vagns-ersättning kommer endast ske om den nya vagnen kan bli omrustad till att bära samma typ av last som den gamla. Detta kollas för varje vagn när den faktiska ersättningen sker
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Loket går inte att bygga
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Fordonet är ej tillgängligt
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Fordonet är ej tillgängligt
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Fartyget är ej tillgängligt
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Flygplanet är ej tillgängligt
 
 STR_ENGINES                                                     :Lok
 STR_WAGONS                                                      :Vagnar
@@ -3088,6 +3157,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Ändra Startår
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Skala-varning
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}För stora storleksändringar av källkarta är inte rekomenderat. Fortsätt med generering?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}Varning genererat från stadens väg-inställningar
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Det är ej rekommenderat att använda inställningen "inga fler vägar". Vill du fortsätta ändå?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Namn på höjdkarta:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Storlek: {ORANGE}{NUM} x {NUM}
@@ -3149,3 +3220,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Överföringingskredit: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...detta är en stadsägd väg
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...vägen pekar i fel riktning
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Genomskinlighetsinställningar
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Växla genomskinlighet för stationsskyltar
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Växla genomskinlighet för träd
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Växla genomskinlighet för byggnader
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Växla genomskinlighet för industrier
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Växla genomskinlighet för byggnader såsom stationer, depåer, riktmärken eller kedjelinje
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Växla genomskinlighet för industrier
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Växla genomskinlighet för byggnader såsom fyrar och antenner, kanske i framtiden även ögongodis
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Grupp {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Alla tåg
+STR_GROUP_ALL_ROADS                                             :Alla vägfordon
+STR_GROUP_ALL_SHIPS                                             :Alla skepp
+STR_GROUP_ALL_AIRCRAFTS                                         :Alla flygplan
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Lägg till delade fordon
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Ta bort alla fordon
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} TÃ¥g{P "" s}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Vägfordon{P "" s}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Skepp{P "" s}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Flygplan
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Döp om en grupp
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Byt ut fordonen i "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Kan inte skapa grupp...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Kan inte ta bort denna grupp...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Kan inte döpa om grupp...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Kan inte ta bort alla fordon från denna grupp...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Kan inte lägga till fordonet till denna grupp...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Kan inte lägga till delade fordon till grupp...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Grupper - Klicka på en grupp för att lista alla fordon i denna grupp
+STR_GROUP_CREATE_TIP                                            :{BLACK}Klicka för att skapa en grupp
+STR_GROUP_DELETE_TIP                                            :{BLACK}Ta bort den valda gruppen
+STR_GROUP_RENAME_TIP                                            :{BLACK}Döp om den valda gruppen
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Klicka för att skydda denna grupp från globalt autoutbyte
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Vinst detta år: {GREEN}{CURRENCY} {BLACK}(förra året: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Vinst detta år: {RED}{CURRENCY} {BLACK}(förra året: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Vinst detta år: {GREEN}{CURRENCY} {BLACK}(förra året: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Vinst detta år: {RED}{CURRENCY} {BLACK}(förra året: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/traditional_chinese.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/traditional_chinese.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode zh_TW
 ##plural 1
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}超越版圖邊緣
@@ -12,12 +14,12 @@
 STR_0005                                                        :{RED}{CURRENCY64}
 STR_EMPTY                                                       :
 STR_0007_FLAT_LAND_REQUIRED                                     :{WHITE}需è¦å¹³åœ°
-STR_0008_WAITING                                                :{BLACK}等候: {WHITE}{STRING}
+STR_0008_WAITING                                                :{BLACK}等候:{WHITE}{STRING}
 STR_0009                                                        :{WHITE}{CARGO}
 STR_000A_EN_ROUTE_FROM                                          :{WHITE}{CARGO}{YELLOW}  (轉é‹è‡ª
 STR_000B                                                        :{YELLOW}{STATION})
-STR_000C_ACCEPTS                                                :{BLACK}接å—: {WHITE}
-STR_000D_ACCEPTS                                                :{BLACK}接å—: {GOLD}
+STR_000C_ACCEPTS                                                :{BLACK}接å—:{WHITE}
+STR_000D_ACCEPTS                                                :{BLACK}接å—:{GOLD}
 STR_000E                                                        :
 STR_000F_PASSENGERS                                             :乘客
 STR_0010_COAL                                                   :煤炭
@@ -25,7 +27,7 @@
 STR_0012_OIL                                                    :石油
 STR_0013_LIVESTOCK                                              :牲畜
 STR_0014_GOODS                                                  :商å“
-STR_0015_GRAIN                                                  :穀粒
+STR_0015_GRAIN                                                  :穀物
 STR_0016_WOOD                                                   :木æ
 STR_0017_IRON_ORE                                               :éµç¤¦çŸ³
 STR_0018_STEEL                                                  :鋼éµ
@@ -37,7 +39,7 @@
 STR_001E_FOOD                                                   :食物
 STR_001F_PAPER                                                  :ç´™
 STR_0020_GOLD                                                   :金塊
-STR_0021_WATER                                                  :食水
+STR_0021_WATER                                                  :æ·¡æ°´
 STR_0022_WHEAT                                                  :å°éº¥
 STR_0023_RUBBER                                                 :橡膠
 STR_0024_SUGAR                                                  :ç ‚ç³–
@@ -57,7 +59,7 @@
 STR_0032_OIL                                                    :石油
 STR_0033_LIVESTOCK                                              :牲畜
 STR_0034_GOODS                                                  :商å“
-STR_0035_GRAIN                                                  :穀粒
+STR_0035_GRAIN                                                  :穀物
 STR_0036_WOOD                                                   :木æ
 STR_0037_IRON_ORE                                               :éµç¤¦çŸ³
 STR_0038_STEEL                                                  :鋼éµ
@@ -66,10 +68,10 @@
 STR_003B_MAIZE                                                  :玉蜀é»
 STR_003C_FRUIT                                                  :水果
 STR_003D_DIAMOND                                                :鑽石
-STR_003E_FOOD                                                   :食物
+STR_003E_FOOD                                                   :食å“
 STR_003F_PAPER                                                  :紙張
 STR_0040_GOLD                                                   :金塊
-STR_0041_WATER                                                  :食水
+STR_0041_WATER                                                  :æ·¡æ°´
 STR_0042_WHEAT                                                  :å°éº¥
 STR_0043_RUBBER                                                 :橡膠
 STR_0044_SUGAR                                                  :ç ‚ç³–
@@ -89,7 +91,7 @@
 STR_QUANTITY_OIL                                                :{VOLUME}石油
 STR_QUANTITY_LIVESTOCK                                          :{COMMA}頭牲畜
 STR_QUANTITY_GOODS                                              :{COMMA}箱商å“
-STR_QUANTITY_GRAIN                                              :{WEIGHT}å°éº¥
+STR_QUANTITY_GRAIN                                              :{WEIGHT}穀物
 STR_QUANTITY_WOOD                                               :{WEIGHT}木æ
 STR_QUANTITY_IRON_ORE                                           :{WEIGHT}éµç¤¦
 STR_QUANTITY_STEEL                                              :{WEIGHT}鋼éµ
@@ -101,7 +103,7 @@
 STR_QUANTITY_FOOD                                               :{WEIGHT}食物
 STR_QUANTITY_PAPER                                              :{WEIGHT}紙張
 STR_QUANTITY_GOLD                                               :{COMMA}包黃金
-STR_QUANTITY_WATER                                              :{VOLUME}食水
+STR_QUANTITY_WATER                                              :{VOLUME}æ·¡æ°´
 STR_QUANTITY_WHEAT                                              :{WEIGHT}å°éº¥
 STR_QUANTITY_RUBBER                                             :{VOLUME}橡膠
 STR_QUANTITY_SUGAR                                              :{WEIGHT}ç ‚ç³–
@@ -225,11 +227,11 @@
 STR_0101_PRINTING_WORKS                                         :{BLACK}{TINYFONT}å°åˆ·å» 
 STR_0102_OIL_WELLS                                              :{BLACK}{TINYFONT}油井
 STR_0103_IRON_ORE_MINE                                          :{BLACK}{TINYFONT}éµç¤¦
-STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}鋼廠
+STR_0104_STEEL_MILL                                             :{BLACK}{TINYFONT}煉鋼廠
 STR_0105_BANK                                                   :{BLACK}{TINYFONT}銀行
 STR_0106_PAPER_MILL                                             :{BLACK}{TINYFONT}造紙廠
 STR_0107_GOLD_MINE                                              :{BLACK}{TINYFONT}金礦
-STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}食物加工廠
+STR_0108_FOOD_PROCESSING_PLANT                                  :{BLACK}{TINYFONT}食å“加工廠
 STR_0109_DIAMOND_MINE                                           :{BLACK}{TINYFONT}鑽石礦
 STR_010A_COPPER_ORE_MINE                                        :{BLACK}{TINYFONT}銅礦
 STR_010B_FRUIT_PLANTATION                                       :{BLACK}{TINYFONT}水果莊園
@@ -282,14 +284,14 @@
 STR_OSNAME_OS2                                                  :OS/2
 STR_OSNAME_SUNOS                                                :SunOS
 
-STR_013B_OWNED_BY                                               :{WHITE}...已被{STRING}æ“有
+STR_013B_OWNED_BY                                               :{WHITE}...{STRING} 所有
 STR_013C_CARGO                                                  :{BLACK}貨物
 STR_013D_INFORMATION                                            :{BLACK}資訊
 STR_013E_CAPACITIES                                             :{BLACK}載é‡
-STR_013E_TOTAL_CARGO                                            :{BLACK}總貨物數
-STR_013F_CAPACITY                                               :{BLACK}總載é‡: {LTBLUE}{CARGO}
-STR_CAPACITY_MULT                                               :{BLACK}載é‡: {LTBLUE}{CARGO} (x{NUM})
-STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}此列車的總載é‡:
+STR_013E_TOTAL_CARGO                                            :{BLACK}總貨物é‡
+STR_013F_CAPACITY                                               :{BLACK}載é‡ï¼š{LTBLUE}{CARGO}
+STR_CAPACITY_MULT                                               :{BLACK}載é‡ï¼š{LTBLUE}{CARGO} (x{NUM})
+STR_013F_TOTAL_CAPACITY_TEXT                                    :{BLACK}此列車的總載é‡ï¼š
 STR_013F_TOTAL_CAPACITY                                         :{LTBLUE}- {CARGO} ({SHORTCARGO})
 STR_TOTAL_CAPACITY_MULT                                         :{LTBLUE}- {CARGO} ({SHORTCARGO}) (x{NUM})
 STR_0140_NEW_GAME                                               :{BLACK}é–‹æ–°éŠæˆ²
@@ -304,7 +306,7 @@
 STR_512                                                         :512
 STR_1024                                                        :1024
 STR_2048                                                        :2048
-STR_MAPSIZE                                                     :{BLACK}版圖大å°:
+STR_MAPSIZE                                                     :{BLACK}版圖大å°ï¼š
 STR_BY                                                          :{BLACK}*
 STR_0148_GAME_OPTIONS                                           :{BLACK}éŠæˆ²é¸é …
 
@@ -346,9 +348,9 @@
 STR_UNITS_FORCE_SI                                              :{COMMA} kN
 
 ############ range for menu starts
-STR_0154_OPERATING_PROFIT_GRAPH                                 :營é‹åˆ©ç›Šåœ–表
+STR_0154_OPERATING_PROFIT_GRAPH                                 :營é‹å ±è¡¨
 STR_0155_INCOME_GRAPH                                           :收入圖表
-STR_0156_DELIVERED_CARGO_GRAPH                                  :å·²é‹è¼‰é‡åœ–表
+STR_0156_DELIVERED_CARGO_GRAPH                                  :é‹è¼‰å ±è¡¨
 STR_0157_PERFORMANCE_HISTORY_GRAPH                              :業績歷å²åœ–表
 STR_0158_COMPANY_VALUE_GRAPH                                    :å…¬å¸å¸‚值圖表
 STR_0159_CARGO_PAYMENT_RATES                                    :貨物收費圖表
@@ -421,8 +423,8 @@
 STR_0169_AUG                                                    :8
 STR_016A_SEP                                                    :9
 STR_016B_OCT                                                    :10
-STR_016C_NOV                                                    :å一月
-STR_016D_DEC                                                    :å二月
+STR_016C_NOV                                                    :11
+STR_016D_DEC                                                    :12
 ############ range for months ends
 
 STR_016E                                                        :{TINYFONT}{STRING}{} {STRING}
@@ -430,22 +432,22 @@
 STR_0170                                                        :{TINYFONT}{STRING}-
 STR_0171_PAUSE_GAME                                             :{BLACK}æš«åœéŠæˆ²
 STR_0172_SAVE_GAME_ABANDON_GAME                                 :{BLACK}儲存éŠæˆ², 於棄éŠæˆ², 離開
-STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}顯示公å¸å„車站列表
+STR_0173_DISPLAY_LIST_OF_COMPANY                                :{BLACK}列出å„å…¬å¸è»Šç«™æ¸…å–®
 STR_0174_DISPLAY_MAP                                            :{BLACK}顯示地圖
-STR_0175_DISPLAY_MAP_TOWN_DIRECTORY                             :{BLACK}顯示地圖和市鎮目錄
-STR_0176_DISPLAY_TOWN_DIRECTORY                                 :{BLACK}顯示市鎮目錄
+STR_0175_DISPLAY_MAP_TOWN_DIRECTORY                             :{BLACK}顯示地圖和市鎮清冊
+STR_0176_DISPLAY_TOWN_DIRECTORY                                 :{BLACK}顯示市鎮清冊
 STR_0177_DISPLAY_COMPANY_FINANCES                               :{BLACK}顯示公å¸è²¡å‹™è³‡è¨Š
 STR_0178_DISPLAY_COMPANY_GENERAL                                :{BLACK}顯示公å¸ä¸€èˆ¬è³‡è¨Š
 STR_0179_DISPLAY_GRAPHS                                         :{BLACK}顯示圖表
 STR_017A_DISPLAY_COMPANY_LEAGUE                                 :{BLACK}顯示公å¸æŽ’行榜
 STR_017B_DISPLAY_LIST_OF_COMPANY                                :{BLACK}顯示公å¸æ“有的列車
-STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}顯示公å¸æ“有的巴士與貨車
+STR_017C_DISPLAY_LIST_OF_COMPANY                                :{BLACK}顯示公å¸æ“有的公車/貨車
 STR_017D_DISPLAY_LIST_OF_COMPANY                                :{BLACK}顯示公å¸æ“有的輪船
 STR_017E_DISPLAY_LIST_OF_COMPANY                                :{BLACK}顯示公å¸æ“有的飛機
 STR_017F_ZOOM_THE_VIEW_IN                                       :{BLACK}拉近視域
 STR_0180_ZOOM_THE_VIEW_OUT                                      :{BLACK}拉é è¦–域
-STR_0181_BUILD_RAILROAD_TRACK                                   :{BLACK}鋪設路軌
-STR_0182_BUILD_ROADS                                            :{BLACK}鋪設é“è·¯
+STR_0181_BUILD_RAILROAD_TRACK                                   :{BLACK}興建路軌設施
+STR_0182_BUILD_ROADS                                            :{BLACK}興建é“路設施
 STR_0183_BUILD_SHIP_DOCKS                                       :{BLACK}興建碼頭設施
 STR_0184_BUILD_AIRPORTS                                         :{BLACK}興建機場設施
 STR_0185_PLANT_TREES_PLACE_SIGNS                                :{BLACK}æ¤æ¨¹/置放標示
@@ -453,9 +455,9 @@
 STR_0187_OPTIONS                                                :{BLACK}é¸é …
 STR_0188                                                        :{BLACK}{SMALLUPARROW}
 STR_0189                                                        :{BLACK}{SMALLDOWNARROW}
-STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}ä¸èƒ½æ›´æ”¹ç¶­ä¿®é€±æœŸ...
+STR_018A_CAN_T_CHANGE_SERVICING                                 :{WHITE}ä¸èƒ½æ›´æ”¹æª¢ä¿®é€±æœŸ...
 STR_018B_CLOSE_WINDOW                                           :{BLACK}關閉視窗
-STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}視窗標題 - 拖曳這è£ä»¥ç§»å‹•è¦–窗
+STR_018C_WINDOW_TITLE_DRAG_THIS                                 :{BLACK}視窗標題 - 點此拖曳å¯ç§»å‹•è¦–窗
 STR_STICKY_BUTTON                                               :{BLACK}「關閉所有視窗ã€ä¸æœƒé—œé–‰æœ¬è¦–窗
 STR_RESIZE_BUTTON                                               :{BLACK}點按拖放更改視窗大å°
 STR_SAVELOAD_HOME_BUTTON                                        :{BLACK}跳到é è¨­å„²å­˜æª”目錄
@@ -464,14 +466,14 @@
 STR_018F_RAISE_A_CORNER_OF_LAND                                 :{BLACK}上昇土地上的一角
 STR_0190_SCROLL_BAR_SCROLLS_LIST                                :{BLACK}æ²è»¸ - 上下æ²å‹•æ¸…å–®
 STR_HSCROLL_BAR_SCROLLS_LIST                                    :{BLACK}æ²å‹•æ£’ - å·¦å³æ²å‹•æ¸…å–®
-STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}於地圖上顯示地形
+STR_0191_SHOW_LAND_CONTOURS_ON_MAP                              :{BLACK}於地圖上顯示地形輪廓
 STR_0192_SHOW_VEHICLES_ON_MAP                                   :{BLACK}於地圖上顯示交通公具
 STR_0193_SHOW_INDUSTRIES_ON_MAP                                 :{BLACK}於地圖上顯示å„種工業
 STR_0194_SHOW_TRANSPORT_ROUTES_ON                               :{BLACK}於地圖上顯示é‹è¼¸è·¯ç·š
 STR_0195_SHOW_VEGETATION_ON_MAP                                 :{BLACK}於地圖上顯示è‰æœ¨
 STR_0196_SHOW_LAND_OWNERS_ON_MAP                                :{BLACK}於地圖上顯示土地æ“有人
 STR_0197_TOGGLE_TOWN_NAMES_ON_OFF                               :{BLACK}於地圖上開關市鎮å稱
-STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}本年利潤: {CURRENCY} (去年利潤: {CURRENCY})
+STR_0198_PROFIT_THIS_YEAR_LAST_YEAR                             :{TINYFONT}{BLACK}本年利潤:{CURRENCY} (去年利潤:{CURRENCY})
 
 ############ range for service numbers starts
 STR_AGE                                                         :{COMMA} å¹´ ({COMMA})
@@ -486,11 +488,11 @@
 STR_01A1_IS_GETTING_VERY_OLD                                    :{WHITE}{STRING} {COMMA}使用年é™å·²éŽ
 STR_01A2_IS_GETTING_VERY_OLD_AND                                :{WHITE}{STRING} {COMMA}使用年é™å·²éŽå¿…須替æ›
 STR_01A3_LAND_AREA_INFORMATION                                  :{WHITE}土地資訊
-STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}清拆æˆæœ¬: {LTBLUE}ä¸é©ç”¨
-STR_01A5_COST_TO_CLEAR                                          :{BLACK}清拆æˆæœ¬: {LTBLUE}{CURRENCY}
+STR_01A4_COST_TO_CLEAR_N_A                                      :{BLACK}整地花費:{LTBLUE}ä¸é©ç”¨
+STR_01A5_COST_TO_CLEAR                                          :{BLACK}整地花費:{LTBLUE}{CURRENCY}
 STR_01A6_N_A                                                    :ä¸é©ç”¨
-STR_01A7_OWNER                                                  :{BLACK}æ“有人: {LTBLUE}{STRING}
-STR_01A8_LOCAL_AUTHORITY                                        :{BLACK}地方政府: {LTBLUE}{STRING}
+STR_01A7_OWNER                                                  :{BLACK}æ“有人:{LTBLUE}{STRING}
+STR_01A8_LOCAL_AUTHORITY                                        :{BLACK}地方政府:{LTBLUE}{STRING}
 STR_01A9_NONE                                                   :ç„¡
 STR_01AA_NAME                                                   :{BLACK}å稱
 STR_01AB                                                        :{BLACK}{TINYFONT}{STRING}
@@ -531,7 +533,7 @@
 
 STR_01CB                                                        :{TINYFONT}{COMMA}
 
-STR_01CE_CARGO_ACCEPTED                                         :{BLACK}接收貨物: {LTBLUE}
+STR_01CE_CARGO_ACCEPTED                                         :{BLACK}接收貨物:{LTBLUE}
 
 STR_01D1_8                                                      :({COMMA}/8 {STRING})
 STR_01D2_JAZZ_JUKEBOX                                           :{WHITE}爵士樂唱盤
@@ -586,7 +588,7 @@
 STR_MESSAGE_HISTORY_MENU                                        :訊æ¯ç´€éŒ„
 STR_0203_SHOW_LAST_MESSAGE_NEWS                                 :{BLACK}展示「上一次訊æ¯æˆ–æ–°èžå ±å‘Šã€ã€ã€Œé¡¯ç¤ºè¨Šæ¯ã€é¸é …
 STR_0204_MESSAGE_OPTIONS                                        :{WHITE}訊æ¯é¸é …
-STR_0205_MESSAGE_TYPES                                          :{BLACK}訊æ¯ç¨®é¡ž:
+STR_0205_MESSAGE_TYPES                                          :{BLACK}訊æ¯ç¨®é¡žï¼š
 STR_0206_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}首個交通工具已到é”玩家的車站
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}首個交通工具已到é”競爭å°æ‰‹çš„車站
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}æ„外 / ç½é›£
@@ -598,7 +600,7 @@
 STR_020D_CHANGES_OF_CARGO_ACCEPTANCE                            :{YELLOW}接收貨物的改動
 STR_020E_SUBSIDIES                                              :{YELLOW}資助
 STR_020F_GENERAL_INFORMATION                                    :{YELLOW}一般資訊
-STR_MESSAGES_ALL                                                :{YELLOW}將所有訊æ¯è¨­ç‚º: 關閉 / æ¦‚è¦ / 完整
+STR_MESSAGES_ALL                                                :{YELLOW}將所有訊æ¯è¨­ç‚ºï¼šé—œé–‰ / æ¦‚è¦ / 完整
 STR_MESSAGE_SOUND                                               :{YELLOW}摘è¦è¨Šæ¯ç™¼å‡ºè²éŸ³æ示
 STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO                       :{WHITE}...與上一個目的地相è·å¤ªé 
 STR_0211_TOP_COMPANIES_WHO_REACHED                              :{BIGFONT}{BLACK}å…¬å¸å·²é”到 {NUM}{}({STRING} 等級)
@@ -727,7 +729,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}建立燈塔
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}建立發射站
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}定義沙漠å€ã€‚{}è«‹æŒ‰ä½ CTRL 移除
-STR_CREATE_LAKE                                                 :{BLACK}劃出湖泊範åœã€‚{}é–‹é‘¿é‹æ²³ã€‚在海平é¢ä¸ŠæŒ‰ CTRL éµå‰‡æœƒæ·¹æ²«é€±é­åœŸåœ°
+STR_CREATE_LAKE                                                 :{BLACK}劃出湖泊範åœã€‚{}é–‹é‘¿é‹æ²³ã€‚在海平é¢ä¸ŠæŒ‰ CTRL éµå‰‡æœƒæ·¹æ²’週é­åœŸåœ°
 STR_0290_DELETE                                                 :{BLACK}刪除
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}完全移除這個市鎮
 STR_0292_SAVE_SCENARIO                                          :儲存場景
@@ -751,8 +753,9 @@
 STR_02A1_SMALL                                                  :{BLACK}å°åž‹
 STR_02A2_MEDIUM                                                 :{BLACK}中型
 STR_02A3_LARGE                                                  :{BLACK}大型
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}市鎮
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}é¸æ“‡å¸‚鎮大å°
-STR_02A5_TOWN_SIZE                                              :{YELLOW}市鎮大å°:
+STR_02A5_TOWN_SIZE                                              :{YELLOW}市鎮大å°ï¼š
 
 STR_02B6                                                        :{STRING}  -  {STRING}
 STR_02B7_SHOW_LAST_MESSAGE_OR_NEWS                              :{BLACK}顯示最近的訊æ¯æˆ–æ–°èž
@@ -802,8 +805,9 @@
 STR_02DE_MAP_OF_WORLD                                           :世界地圖
 STR_EXTRA_VIEW_PORT                                             :打開新視野
 STR_SIGN_LIST                                                   :標誌清單
+STR_TRANSPARENCY_OPTIONS                                        :é€æ˜Žåº¦é¸é …
 STR_02DF_TOWN_DIRECTORY                                         :市鎮索引
-STR_TOWN_POPULATION                                             :{BLACK}世界人å£: {COMMA}
+STR_TOWN_POPULATION                                             :{BLACK}世界人å£ï¼š{COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}視野 {COMMA}
 STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN                                :{BLACK}將視窗視野移到主視野
 STR_EXTRA_VIEW_MOVE_VIEW_TO_MAIN_TT                             :{BLACK}將這個視窗的視野ä½ç½®ç§»åˆ°ä¸»è¦–野的ä½ç½®
@@ -813,9 +817,9 @@
 STR_02E0_CURRENCY_UNITS                                         :{BLACK}貨幣單ä½
 STR_02E1                                                        :{BLACK}{SKIP}{STRING}
 STR_02E2_CURRENCY_UNITS_SELECTION                               :{BLACK}é¸æ“‡è²¨å¹£å–®ä½
-STR_MEASURING_UNITS                                             :{BLACK}é‡åº¦å–®ä½
+STR_MEASURING_UNITS                                             :{BLACK}度é‡å–®ä½
 STR_02E4                                                        :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION                                   :{BLACK}é‡åº¦å–®ä½
+STR_MEASURING_UNITS_SELECTION                                   :{BLACK}度é‡å–®ä½
 STR_02E6_ROAD_VEHICLES                                          :{BLACK}公車/貨車
 STR_02E7                                                        :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
 STR_02E8_SELECT_SIDE_OF_ROAD_FOR                                :{BLACK}é¸æ“‡è»Šè¼›åœ¨è·¯ä¸Šçš„行駛ä½ç½®
@@ -899,7 +903,7 @@
 ############ end of townname region
 
 STR_CURR_GBP                                                    :英鎊 (£)
-STR_CURR_USD                                                    :å…ƒ ($)
+STR_CURR_USD                                                    :美元 ($)
 STR_CURR_EUR                                                    :æ­å…ƒ (€)
 STR_CURR_YEN                                                    :日圓 (¥)
 STR_CURR_ATS                                                    :奧地利先令 (ATS)
@@ -959,8 +963,8 @@
 STR_MONTH_NOV                                                   :å一月
 STR_MONTH_DEC                                                   :å二月
 
-STR_HEADING_FOR_STATION                                         :{LTBLUE}目的地: {STATION}
-STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}目的地: {STATION}, {VELOCITY}
+STR_HEADING_FOR_STATION                                         :{LTBLUE}目的地:{STATION}
+STR_HEADING_FOR_STATION_VEL                                     :{LTBLUE}目的地:{STATION},{VELOCITY}
 STR_NO_ORDERS                                                   :{LTBLUE}沒有指令
 STR_NO_ORDERS_VEL                                               :{LTBLUE}沒有指令, {VELOCITY}
 
@@ -1015,125 +1019,146 @@
 
 STR_CONFIG_PATCHES_OFF                                          :關
 STR_CONFIG_PATCHES_ON                                           :é–‹
-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}ç¦æ­¢åˆ—車直角轉å‘: {ORANGE}{STRING} {LTBLUE} (requires 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_BUILDXTRAIND                                 :{LTBLUE}å¯ä»¥èˆˆå»ºåŽŸæ料工業: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}æ¯å€‹å¸‚鎮å¯æ“有多個åŒé¡žåž‹å·¥æ¥­: {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_SHOWFINANCES                                 :{LTBLUE}於年末顯示財政視窗: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}TTDPatch 兼容ä¸åœç«™è™•ç†: {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_STOP_ON_TOWN_ROAD                            :{LTBLUE}å¯åœ¨éŽ®å…§èˆˆå»ºè·¯é‚Šè»Šç«™: {ORANGE}{STRING}
+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}ç¦æ­¢åˆ—車直角轉å‘:{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_BUILDXTRAIND                                 :{LTBLUE}å¯ä»¥èˆˆå»ºåŽŸç‰©æ–™å·¥æ¥­ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_MULTIPINDTOWN                                :{LTBLUE}æ¯å€‹å¸‚鎮å¯æ“有多個åŒé¡žåž‹å·¥æ¥­ï¼š{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_SHOWFINANCES                                 :{LTBLUE}於年末顯示財政視窗:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_NEW_NONSTOP                                  :{LTBLUE}與 TTDPatch 相容之ä¸åœç«™è™•ç†ï¼š{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_STOP_ON_TOWN_ROAD                            :{LTBLUE}å¯åœ¨éŽ®å…§èˆˆå»ºè·¯é‚Šè»Šç«™ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS                            :{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_NEVER_EXPIRE_VEHICLES                        :{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_ERRMSG_DURATION                              :{LTBLUE}錯誤訊æ¯é¡¯ç¤ºæ™‚é–“: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_POPULATION_IN_LABEL                          :{LTBLUE}於標籤顯示市鎮人å£: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES                              :{LTBLUE}é¸æ“‡åŠé€æ˜Žå»ºç¯‰ç‰©æ™‚將樹木隱è—: {ORANGE}{STRING}
+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}
 
-STR_CONFIG_PATCHES_LAND_GENERATOR                               :{LTBLUE}地形產生器: {ORANGE}{STRING}
+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_SNOWLINE_HEIGHT                              :{LTBLUE}雪線高度: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN                         :{LTBLUE}地形ä¸å¹³åº¦ (åªé©ç”¨æ–¼ TerraGenesis) : {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             :éžå¸¸å¹³æ»‘
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_SMOOTH                  :平滑
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_ROUGH                   :高低ä¸å¹³
 STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_ROUGH              :éžå¸¸ç²—ç³™
-STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}樹木分佈演算法: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TREE_PLACER                                  :{LTBLUE}樹木分佈演算法:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_TREE_PLACER_NONE                             :沒有
 STR_CONFIG_PATCHES_TREE_PLACER_ORIGINAL                         :原版
 STR_CONFIG_PATCHES_TREE_PLACER_IMPROVED                         :改進版
-STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION                           :{LTBLUE}高度圖旋轉: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION                           :{LTBLUE}高度圖旋轉:{ORANGE}{STRING}
 STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE         :逆時é‡
 STR_CONFIG_PATCHES_HEIGHTMAP_ROTATION_CLOCKWISE                 :順時é‡
-STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}å¹³é¢ç‰ˆåœ–高度: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SE_FLAT_WORLD_HEIGHT                         :{LTBLUE}å¹³é¢ç‰ˆåœ–高度:{ORANGE}{STRING}
 
-STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}車站最長長度: {ORANGE}{STRING} {RED}注æ„: éŽé«˜æœƒä»¤æ•ˆèƒ½ä¸‹é™
-STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}ç›´å‡æ©Ÿæ–¼ç›´å‡æ©Ÿå°è‡ªå‹•ç¶­ä¿®: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}地形工具列與路軌/é“è·¯/碼頭建設/機場建設åˆä½µ: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}倒轉滾動棒方å‘: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}使用æŸäº›å»ºè¨­å·¥å…·æ™‚顯示é‡åº¦æ示: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}顯示公å¸æ¨™è¨˜: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_STATION_SPREAD                               :{LTBLUE}車站最長延展範åœï¼š{ORANGE}{STRING} {RED}注æ„:éŽé«˜æœƒä½¿æ•ˆèƒ½ä¸‹é™
+STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}ç›´å‡æ©Ÿæ–¼ç›´å‡æ©Ÿå°è‡ªå‹•ç¶­ä¿®ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}地形工具列與路軌/é“è·¯/碼頭建設/機場建設åˆä½µï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}倒轉滾動棒方å‘:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}使用æŸäº›å»ºè¨­å·¥å…·æ™‚顯示é‡åº¦æ示:{ORANGE}{STRING}
+STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}顯示公å¸æ¨™è¨˜ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :ä¸é¡¯ç¤º
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :自己的公å¸
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :所有公å¸
-STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}按 <ENTER> éµèˆ‡å°éšŠäº¤è«‡: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}按 <ENTER> éµèˆ‡å°éšŠäº¤è«‡ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}滑鼠滾輪作用: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :放大地圖
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :æ²å‹•åœ°åœ–
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :關閉
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{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_SHIPS                              :{LTBLUE}電腦ä¸å¯æ“有飛機: {ORANGE}{STRING}
-
-STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}使用新人工智能 (開發中): {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}å¯æ–¼é€£ç·šéŠæˆ²åŠ å…¥é›»è…¦å°æ‰‹ (測試階段): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}自動在開始新éŠæˆ²æ™‚æš«åœï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}使用進階載具å單: {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_SHIPS                                :{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_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_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_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_SHIPS                              :{LTBLUE}電腦ä¸å¯æ“有飛機:{ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_AINEW_ACTIVE                                 :{LTBLUE}使用新人工智能 (開發階段):{ORANGE}{STRING}
+STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER                            :{LTBLUE}å¯æ–¼é€£ç·šéŠæˆ²åŠ å…¥é›»è…¦å°æ‰‹ (測試階段):{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_SHIPS                                :{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_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_TOOLBAR_POS                                  :{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_TOWN_LAYOUT_INVALID                          :{WHITE}在場景編輯器中,"市鎮é“è·¯ä¸å†è¦åŠƒ" 是ä¸å¯è¡Œçš„
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}é¸æ“‡å¸‚鎮é“è·¯è¦åŠƒï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :é“è·¯ä¸å†è¦åŠƒ
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :é è¨­
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :較好的è¦åŠƒ
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2乘2網格
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3乘3網格
+
+STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}主工具列ä½ç½®ï¼š{ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :å·¦
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :中
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :å³
-STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}視窗自動é»è²¼ç¯„åœ: {ORANGE}{STRING} åƒç´ 
-STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}視窗自動é»è²¼ç¯„åœ: {ORANGE}關閉
+STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}視窗自動é»è²¼ç¯„åœï¼š{ORANGE}{STRING} åƒç´ 
+STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}視窗自動é»è²¼ç¯„åœï¼š{ORANGE}關閉
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}城市增長速度: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :ä¸æœƒå¢žé•·
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :æ…¢
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :正常
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :å¿«
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :éžå¸¸å¿«
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}é›™å€é€Ÿå¢žé•·åŸŽå¸‚比例: {ORANGE}{STRING} 分之一
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}é›™å€é€Ÿå¢žé•·åŸŽå¸‚比例: {ORANGE}沒有
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}市鎮è¦æ¨¡åˆå§‹å€çŽ‡ï¼š{ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}介é¢
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}建築
@@ -1148,9 +1173,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}車輛使用新的尋路系統: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_YAPF_RAIL                                    :{LTBLUE}列車使用新的尋路系統: {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}列車使用新的尋路系統:{ORANGE}{STRING}
 
 STR_TEMPERATE_LANDSCAPE                                         :溫帶
 STR_SUB_ARCTIC_LANDSCAPE                                        :亞北極帶
@@ -1160,21 +1185,21 @@
 STR_CHEATS                                                      :{WHITE}作弊
 STR_CHEATS_TIP                                                  :{BLACK}被勾é¸çš„項目表示你之å‰ç”¨éŽé€™å€‹ä½œå¼Š
 STR_CHEATS_WARNING                                              :{BLACK}注æ„! ä½ è¦èƒŒå›ä½ çš„å°æ‰‹å–”! ä½ è¦è¨˜ä½é€™ç¨®è¡Œç‚ºæœƒè¢«ä¸€è¼©å­è¨˜è‘—的。
-STR_CHEAT_MONEY                                                 :{LTBLUE}增加金錢: {CURRENCY64}
-STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}控制玩家: {ORANGE}{COMMA}
-STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}神奇剷泥車 (å¯ä»¥ç§»é™¤å·¥æ¥­ç­‰å¹³æ™‚拆ä¸æŽ‰çš„æ±è¥¿): {ORANGE}{STRING}
-STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}隧é“å¯ä»¥äº’相穿éŽ: {ORANGE}{STRING}
-STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}於暫åœæ¨¡å¼å»ºè¨­: {ORANGE}{STRING}
-STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}噴射客機ä¸æœƒæ–¼å°åž‹æ©Ÿå ´ç¶“常墜æ¯: {ORANGE} {STRING}
-STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}改變氣候: {ORANGE} {STRING}
-STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}改變日期: {ORANGE} {DATE_SHORT}
-STR_CHEAT_SETUP_PROD                                            :{LTBLUE}å¯æ”¹è®Šç”¢é‡: {ORANGE}{STRING}
+STR_CHEAT_MONEY                                                 :{LTBLUE}增加金錢:{CURRENCY64}
+STR_CHEAT_CHANGE_PLAYER                                         :{LTBLUE}控制玩家:{ORANGE}{COMMA}
+STR_CHEAT_EXTRA_DYNAMITE                                        :{LTBLUE}神奇剷泥車 (å¯ä»¥ç§»é™¤å·¥æ¥­ç­‰å¹³æ™‚拆ä¸æŽ‰çš„æ±è¥¿):{ORANGE}{STRING}
+STR_CHEAT_CROSSINGTUNNELS                                       :{LTBLUE}隧é“å¯ä»¥äº’相穿éŽï¼š{ORANGE}{STRING}
+STR_CHEAT_BUILD_IN_PAUSE                                        :{LTBLUE}於暫åœæ¨¡å¼å»ºè¨­ï¼š{ORANGE}{STRING}
+STR_CHEAT_NO_JETCRASH                                           :{LTBLUE}噴射客機ä¸æœƒç¶“常於å°åž‹æ©Ÿå ´å¢œæ¯ï¼š{ORANGE} {STRING}
+STR_CHEAT_SWITCH_CLIMATE                                        :{LTBLUE}改變氣候:{ORANGE} {STRING}
+STR_CHEAT_CHANGE_DATE                                           :{LTBLUE}改變日期:{ORANGE} {DATE_SHORT}
+STR_CHEAT_SETUP_PROD                                            :{LTBLUE}å¯æ”¹è®Šç”¢é‡ï¼š{ORANGE}{STRING}
 
-STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}目的地: {WAYPOINT}
-STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}目的地: {WAYPOINT}, {VELOCITY}
+STR_HEADING_FOR_WAYPOINT                                        :{LTBLUE}目的地:{WAYPOINT}
+STR_HEADING_FOR_WAYPOINT_VEL                                    :{LTBLUE}目的地:{WAYPOINT},{VELOCITY}
 
 STR_GO_TO_WAYPOINT                                              :經 {WAYPOINT}
-STR_GO_NON_STOP_TO_WAYPOINT                                     :經 {WAYPOINT},ä¸åœç«™
+STR_GO_NON_STOP_TO_WAYPOINT                                     :經 {WAYPOINT},中途ä¸åœ
 
 STR_WAYPOINTNAME_CITY                                           :路標 {TOWN}
 STR_WAYPOINTNAME_CITY_SERIAL                                    :路標 {TOWN} #{COMMA}
@@ -1222,7 +1247,7 @@
 
 STR_BUOY_IS_IN_USE                                              :{WHITE}...浮標正被使用!
 
-STR_LANDINFO_COORDS                                             :{BLACK}座標: {LTBLUE}{NUM}x{NUM} ({STRING})
+STR_LANDINFO_COORDS                                             :{BLACK}座標:{LTBLUE}{NUM}x{NUM} ({STRING})
 
 STR_CANT_REMOVE_PART_OF_STATION                                 :{WHITE}ä¸èƒ½ç§»é™¤è»Šç«™éƒ¨ä»½...
 STR_CANT_CONVERT_RAIL                                           :{WHITE}無法轉æ›è»Œé“種類...
@@ -1273,20 +1298,20 @@
 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}歡迎使用正在開發的新 AI。如果有任何å•é¡Œï¼Œæ­¡è¿Žæ“·å–ç•«é¢æ”¾ä¸Šè¨Žè«–å€é€šçŸ¥é–‹ç™¼åœ˜éšŠã€‚
-TEMP_AI_ACTIVATED                                               :{WHITE}警告: 這個新 AI 還在早期測試Warning: this new AI is still alpha! Currently, only trucks and busses work!
-TEMP_AI_MULTIPLAYER                                             :{WHITE}警告: æ–° AI 實作ä»åœ¨æ¸¬è©¦éšŽæ®µã€‚如有任何å•é¡Œï¼Œè«‹é›»éƒµè‡³ truelight@openttd.org。
+TEMP_AI_ACTIVATED                                               :{WHITE}警告: 這個新 AI 還在開發階段,目å‰åƒ…於汽車上實作ï¼
+TEMP_AI_MULTIPLAYER                                             :{WHITE}警告: æ–° AI 實作ä»åœ¨é–‹ç™¼éšŽæ®µã€‚如有任何å•é¡Œï¼Œè«‹ E-Mail 至 truelight@openttd.org。
 
 ############ network gui strings
 
 STR_NETWORK_MULTIPLAYER                                         :{WHITE}連線éŠæˆ²
 
-STR_NETWORK_PLAYER_NAME                                         :{BLACK}玩家å稱:
+STR_NETWORK_PLAYER_NAME                                         :{BLACK}玩家å稱:
 STR_NETWORK_ENTER_NAME_TIP                                      :{BLACK}這是其他玩家辨èªæ‚¨çš„å稱
-STR_NETWORK_CONNECTION                                          :{BLACK}連線:
+STR_NETWORK_CONNECTION                                          :{BLACK}連線:
 STR_NETWORK_CONNECTION_TIP                                      :{BLACK}é¸æ“‡ Internet 或å€åŸŸç¶²è·¯ (LAN) éŠæˆ²
 
 STR_NETWORK_START_SERVER                                        :{BLACK}起動伺æœå™¨
@@ -1308,14 +1333,14 @@
 STR_NETWORK_CLIENTS_CAPTION_TIP                                 :{BLACK}線上客戶端 / 客戶端上é™{}ç·šä¸Šå…¬å¸ / å…¬å¸ä¸Šé™
 STR_NETWORK_GAME_INFO                                           :{SILVER}éŠæˆ²è³‡è¨Š
 STR_ORANGE                                                      :{ORANGE}{STRING}
-STR_NETWORK_CLIENTS                                             :{SILVER}客戶端:  {WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
-STR_NETWORK_LANGUAGE                                            :{SILVER}語言:  {WHITE}{STRING}
-STR_NETWORK_TILESET                                             :{SILVER}圖片組:  {WHITE}{STRING}
-STR_NETWORK_MAP_SIZE                                            :{SILVER}地圖大å°:  {WHITE}{COMMA}x{COMMA}
-STR_NETWORK_SERVER_VERSION                                      :{SILVER}伺æœå™¨ç‰ˆæœ¬:  {WHITE}{STRING}
-STR_NETWORK_SERVER_ADDRESS                                      :{SILVER}伺æœå™¨ä½å€:  {WHITE}{STRING} : {NUM}
-STR_NETWORK_START_DATE                                          :{SILVER}開始日期:  {WHITE}{DATE_SHORT}
-STR_NETWORK_CURRENT_DATE                                        :{SILVER}ç›®å‰æ—¥æœŸ:  {WHITE}{DATE_SHORT}
+STR_NETWORK_CLIENTS                                             :{SILVER}客戶端:{WHITE}{COMMA} / {COMMA} - {COMMA} / {COMMA}
+STR_NETWORK_LANGUAGE                                            :{SILVER}語言:{WHITE}{STRING}
+STR_NETWORK_TILESET                                             :{SILVER}網格組:{WHITE}{STRING}
+STR_NETWORK_MAP_SIZE                                            :{SILVER}地圖大å°ï¼š{WHITE}{COMMA}x{COMMA}
+STR_NETWORK_SERVER_VERSION                                      :{SILVER}伺æœå™¨ç‰ˆæœ¬ï¼š{WHITE}{STRING}
+STR_NETWORK_SERVER_ADDRESS                                      :{SILVER}伺æœå™¨ä½å€ï¼š{WHITE}{STRING} : {NUM}
+STR_NETWORK_START_DATE                                          :{SILVER}開始日期:{WHITE}{DATE_SHORT}
+STR_NETWORK_CURRENT_DATE                                        :{SILVER}ç›®å‰æ—¥æœŸï¼š{WHITE}{DATE_SHORT}
 STR_NETWORK_PASSWORD                                            :{SILVER}å—密碼ä¿è­·ï¼
 STR_NETWORK_SERVER_OFFLINE                                      :{SILVER}伺æœå™¨é›¢ç·š
 STR_NETWORK_SERVER_FULL                                         :{SILVER}伺æœå™¨å·²æ»¿
@@ -1327,13 +1352,13 @@
 
 STR_NETWORK_START_GAME_WINDOW                                   :{WHITE}開始新的多人éŠæˆ²
 
-STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}éŠæˆ²å稱:
+STR_NETWORK_NEW_GAME_NAME                                       :{BLACK}éŠæˆ²å稱:
 STR_NETWORK_NEW_GAME_NAME_TIP                                   :{BLACK}éŠæˆ²å稱會顯示在其他玩家é¸æ“‡éŠæˆ²çš„é¸å–®å†…
 STR_NETWORK_SET_PASSWORD                                        :{BLACK}設定密碼
 STR_NETWORK_PASSWORD_TIP                                        :{BLACK}如果您ä¸æƒ³è®“大眾連線的話,å¯ä»¥ç”¨å¯†ç¢¼ä¿è­·éŠæˆ²
-STR_NETWORK_SELECT_MAP                                          :{BLACK}é¸æ“‡åœ°åœ–:
+STR_NETWORK_SELECT_MAP                                          :{BLACK}é¸æ“‡åœ°åœ–:
 STR_NETWORK_SELECT_MAP_TIP                                      :{BLACK}您想玩哪個地圖?
-STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}客戶端上é™:
+STR_NETWORK_NUMBER_OF_CLIENTS                                   :{BLACK}客戶端上é™ï¼š
 STR_NETWORK_NUMBER_OF_CLIENTS_TIP                               :{BLACK}é¸æ“‡é€£ç·šäººæ•¸ä¸Šé™ã€‚未必æ¯å€‹åé¡éƒ½éœ€é€£ç·š
 STR_NETWORK_COMBO1                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_LAN                                                 :局域網絡(LAN)
@@ -1352,13 +1377,13 @@
 STR_NETWORK_8_PLAYERS                                           :8 ä½çŽ©å®¶
 STR_NETWORK_9_PLAYERS                                           :9 ä½çŽ©å®¶
 STR_NETWORK_10_PLAYERS                                          :10 ä½çŽ©å®¶
-STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}å…¬å¸ä¸Šé™:
+STR_NETWORK_NUMBER_OF_COMPANIES                                 :{BLACK}å…¬å¸ä¸Šé™ï¼š
 STR_NETWORK_NUMBER_OF_COMPANIES_TIP                             :{BLACK}é™åˆ¶ä¼ºæœå™¨å¯ä»¥å»ºç«‹çš„å…¬å¸æ•¸
 STR_NETWORK_COMBO3                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}觀看者上é™:
+STR_NETWORK_NUMBER_OF_SPECTATORS                                :{BLACK}觀看者上é™ï¼š
 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP                            :{BLACK}é™åˆ¶å¯åŠ å…¥çš„觀察者數é‡
 STR_NETWORK_COMBO4                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
-STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}所用的語言:
+STR_NETWORK_LANGUAGE_SPOKEN                                     :{BLACK}所用的語言:
 STR_NETWORK_LANGUAGE_TIP                                        :{BLACK}讓其他人知é“這個伺æœå™¨ä½¿ç”¨çš„交談語言
 STR_NETWORK_COMBO5                                              :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
 STR_NETWORK_START_GAME                                          :{BLACK}開始éŠæˆ²
@@ -1375,7 +1400,7 @@
 
 STR_NETWORK_GAME_LOBBY                                          :{WHITE}連線éŠæˆ²å¤§å»³
 
-STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}準備加入:   {ORANGE}{STRING}
+STR_NETWORK_PREPARE_TO_JOIN                                     :{BLACK}準備加入:{ORANGE}{STRING}
 STR_NETWORK_COMPANY_LIST_TIP                                    :{BLACK}列出éŠæˆ²å†…所有公å¸ã€‚您å¯ä»¥åŠ å…¥ç¾æœ‰å…¬å¸ï¼Œè‹¥é‚„有公å¸ç©ºä½çš„話,也å¯å‰µç«‹æ–°å…¬å¸ã€‚
 STR_NETWORK_NEW_COMPANY                                         :{BLACK}æ–°å…¬å¸
 STR_NETWORK_NEW_COMPANY_TIP                                     :{BLACK}建立新公å¸
@@ -1388,16 +1413,16 @@
 
 STR_NETWORK_COMPANY_INFO                                        :{SILVER}å…¬å¸è³‡è¨Š
 
-STR_NETWORK_COMPANY_NAME                                        :{SILVER}å…¬å¸å稱:  {WHITE}{STRING}
-STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}æˆç«‹æ–¼:  {WHITE}{NUM}
-STR_NETWORK_VALUE                                               :{SILVER}å…¬å¸åƒ¹å€¼:  {WHITE}{CURRENCY64}
-STR_NETWORK_CURRENT_BALANCE                                     :{SILVER}ç›®å‰é¤˜é¡:  {WHITE}{CURRENCY64}
-STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}去年收入:  {WHITE}{CURRENCY64}
-STR_NETWORK_PERFORMANCE                                         :{SILVER}效率:  {WHITE}{NUM}
+STR_NETWORK_COMPANY_NAME                                        :{SILVER}å…¬å¸å稱:{WHITE}{STRING}
+STR_NETWORK_INAUGURATION_YEAR                                   :{SILVER}æˆç«‹æ–¼ï¼š{WHITE}{NUM}
+STR_NETWORK_VALUE                                               :{SILVER}å…¬å¸å¸‚值:{WHITE}{CURRENCY64}
+STR_NETWORK_CURRENT_BALANCE                                     :{SILVER}ç›®å‰é¤˜é¡ï¼š{WHITE}{CURRENCY64}
+STR_NETWORK_LAST_YEARS_INCOME                                   :{SILVER}去年收入:{WHITE}{CURRENCY64}
+STR_NETWORK_PERFORMANCE                                         :{SILVER}效率:{WHITE}{NUM}
 
-STR_NETWORK_VEHICLES                                            :{SILVER}é‹å…·:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
-STR_NETWORK_STATIONS                                            :{SILVER}車站:  {WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
-STR_NETWORK_PLAYERS                                             :{SILVER}玩家:  {WHITE}{STRING}
+STR_NETWORK_VEHICLES                                            :{SILVER}é‹å…·ï¼š{WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
+STR_NETWORK_STATIONS                                            :{SILVER}站點:{WHITE}{NUM} {TRAIN}, {NUM} {LORRY}, {NUM} {BUS}, {NUM} {PLANE}, {NUM} {SHIP}
+STR_NETWORK_PLAYERS                                             :{SILVER}玩家:{WHITE}{STRING}
 
 STR_NETWORK_CONNECTING                                          :{WHITE}正在連線...
 
@@ -1461,14 +1486,14 @@
 STR_NETWORK_CLIENT_JOINED                                       :加入éŠæˆ²
 STR_NETWORK_GIVE_MONEY                                          :給了您的公å¸ä¸€äº›éŒ¢ ({CURRENCY})
 STR_NETWORK_GAVE_MONEY_AWAY                                     :您給了 {STRING} 一些錢 ({CURRENCY})
-STR_NETWORK_CHAT_COMPANY_CAPTION                                :[團隊] :
-STR_NETWORK_CHAT_COMPANY                                        :[團隊] {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_TO_COMPANY                                     :[團隊] 給 {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[ç§äºº] :
-STR_NETWORK_CHAT_CLIENT                                         :[ç§äºº] {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_TO_CLIENT                                      :[ç§äºº] 給 {STRING}: {GRAY}{STRING}
-STR_NETWORK_CHAT_ALL_CAPTION                                    :[全員] :
-STR_NETWORK_CHAT_ALL                                            :[全員] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_COMPANY_CAPTION                                :[團隊]:
+STR_NETWORK_CHAT_COMPANY                                        :[團隊] {STRING}:{GRAY}{STRING}
+STR_NETWORK_CHAT_TO_COMPANY                                     :[團隊] 給 {STRING}:{GRAY}{STRING}
+STR_NETWORK_CHAT_CLIENT_CAPTION                                 :[ç§äºº]:
+STR_NETWORK_CHAT_CLIENT                                         :[ç§äºº] {STRING}:{GRAY}{STRING}
+STR_NETWORK_CHAT_TO_CLIENT                                      :[ç§äºº] 給 {STRING}:{GRAY}{STRING}
+STR_NETWORK_CHAT_ALL_CAPTION                                    :[全員] :
+STR_NETWORK_CHAT_ALL                                            :[全員] {STRING}:{GRAY}{STRING}
 STR_NETWORK_NAME_CHANGE                                         :將自己的å稱改為
 STR_NETWORK_SERVER_SHUTDOWN                                     :{WHITE} 伺æœå™¨é—œé–‰é€£ç·š
 STR_NETWORK_SERVER_REBOOT                                       :{WHITE} 伺æœå™¨æ­£åœ¨é‡æ–°å•Ÿå‹•...{}è«‹ç¨å€™...
@@ -1490,8 +1515,8 @@
 ############ end network gui strings
 
 
-STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}地圖 X 軸大å°: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}地圖 Y 軸大å°: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_X                                        :{LTBLUE}地圖 X 軸大å°ï¼š{ORANGE}{STRING}
+STR_CONFIG_PATCHES_MAP_Y                                        :{LTBLUE}地圖 Y 軸大å°ï¼š{ORANGE}{STRING}
 
 
 ##### PNG-MAP-Loader
@@ -1505,14 +1530,14 @@
 STR_BMPMAP_ERR_IMAGE_TYPE                                       :{WHITE}...無法轉æ›å½±åƒæ ¼å¼
 
 ##id 0x0800
-STR_0800_COST                                                   :{TINYFONT}{RED}花費: {CURRENCY}
-STR_0801_COST                                                   :{RED}花費: {CURRENCY}
-STR_0802_INCOME                                                 :{TINYFONT}{GREEN}收入: {CURRENCY}
-STR_0803_INCOME                                                 :{GREEN}收入: {CURRENCY}
-STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}轉é‹: {CURRENCY}
-STR_FEEDER                                                      :{YELLOW}轉é‹: {CURRENCY}
+STR_0800_COST                                                   :{TINYFONT}{RED}花費:{CURRENCY}
+STR_0801_COST                                                   :{RED}花費:{CURRENCY}
+STR_0802_INCOME                                                 :{TINYFONT}{GREEN}收入:{CURRENCY}
+STR_0803_INCOME                                                 :{GREEN}收入:{CURRENCY}
+STR_FEEDER_TINY                                                 :{TINYFONT}{YELLOW}轉é‹ï¼š{CURRENCY}
+STR_FEEDER                                                      :{YELLOW}轉é‹ï¼š{CURRENCY}
 STR_0805_ESTIMATED_COST                                         :{WHITE}é ä¼°èŠ±è²» {CURRENCY}
-STR_0807_ESTIMATED_INCOME                                       :{WHITE}é ä¼°æ”¶å…¥: {CURRENCY}
+STR_0807_ESTIMATED_INCOME                                       :{WHITE}é ä¼°æ”¶å…¥ï¼š{CURRENCY}
 STR_0808_CAN_T_RAISE_LAND_HERE                                  :{WHITE}無法æ昇土地...
 STR_0809_CAN_T_LOWER_LAND_HERE                                  :{WHITE}無法é™ä½ŽåœŸåœ°...
 STR_080A_ROCKS                                                  :石頭
@@ -1564,6 +1589,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :有入å£è™ŸèªŒçš„éµè»Œ
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :有出å£è™ŸèªŒçš„éµè»Œ
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :有綜åˆè™ŸèªŒçš„éµè»Œ
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}必須先移除ç«è»Šç«™
 
 
 
@@ -1571,22 +1597,38 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}必須先移除é“è·¯
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}é“路施工中
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}鋪設é“è·¯
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}鋪設電車軌
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}é¸æ“‡é“路橋樑
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}ä¸èƒ½åœ¨æ­¤é‹ªè¨­é“è·¯...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}ä¸å¯ä»¥åœ¨é€™è£é‹ªè¨­é›»è»Šè»Œ...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}ä¸èƒ½å¾žæ­¤ç§»é™¤é“è·¯...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}ä¸å¯ä»¥ç§»é™¤é€™è£çš„電車軌...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}車庫方å‘
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}電車
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}ä¸èƒ½åœ¨æ­¤å»ºç¯‰è»Šåº«...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}ä¸å¯ä»¥åœ¨é€™è£èˆˆå»ºé›»è»Šç¶­ä¿®å» ...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}無法建築公車站...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}無法建築貨é‹ç«™...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}ä¸å¯ä»¥èˆˆå»ºé›»è»Šç«™...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}ä¸å¯èˆˆå»ºè¼‰è²¨é›»è»Šç«™...
 STR_180A_ROAD_CONSTRUCTION                                      :鋪設é“è·¯
+STR_180A_TRAMWAY_CONSTRUCTION                                   :鋪設電車軌
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}鋪設一段公路
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}興建電車站
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}建築車庫 (用來製造與維護公路車輛)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}興建電車維修廠 (供製造åŠç¶­ä¿®ç”¨)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}建築公車站
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}建築貨é‹ç«™
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}興建載客電車站
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}興建載貨電車站
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}建築公路橋樑
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}架設電車橋
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}建築公路隧é“
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}é–‹é…電車隧é“
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}切æ›å»ºç¯‰/移除公路
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}鋪設電車軌開關
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}é¸æ“‡è»Šåº«æ–¹å‘
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}é¸æ“‡é›»è»Šç¶­ä¿®å» æ–¹å‘
 STR_1814_ROAD                                                   :公路
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :有路燈的公路
 STR_1816_TREE_LINED_ROAD                                        :有行é“樹的公路
@@ -1594,6 +1636,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :公路/éµé“平交é“
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}ä¸èƒ½å¾žé€™é‚Šç§»é™¤å…¬è»Šç«™...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}ä¸èƒ½å¾žé€™é‚Šç§»é™¤è²¨é‹ç«™...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}ä¸å¯ç§»é™¤è¼‰å®¢é›»è»Šç«™...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}ä¸å¯ç§»é™¤è¼‰è²¨é›»è»Šç«™...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}城鎮
@@ -1604,15 +1648,15 @@
 STR_2002                                                        :{TINYFONT}{BLACK}{STRING}
 STR_2004_BUILDING_MUST_BE_DEMOLISHED                            :{WHITE}必須先摧毀建築
 STR_2005                                                        :{WHITE}{TOWN}
-STR_2006_POPULATION                                             :{BLACK}人å£: {ORANGE}{COMMA}{BLACK}  房屋: {ORANGE}{COMMA}
+STR_2006_POPULATION                                             :{BLACK}人å£ï¼š{ORANGE}{COMMA}{BLACK}  房屋:{ORANGE}{COMMA}
 STR_2007_RENAME_TOWN                                            :修改城鎮å稱
 STR_2008_CAN_T_RENAME_TOWN                                      :{WHITE}無法修改城鎮å稱...
 STR_2009_LOCAL_AUTHORITY_REFUSES                                :{WHITE}{TOWN} 城鎮當局ä¸åŒæ„
 STR_200A_TOWN_NAMES_CLICK_ON_NAME                               :{BLACK}城鎮å稱 - 點é¸å稱å¯å°‡åŸŽéŽ®ç½®æ–¼ç•«é¢ä¸­å¤®
 STR_200B_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}將主視野移到城鎮ä½ç½®
 STR_200C_CHANGE_TOWN_NAME                                       :{BLACK}修改城鎮å稱
-STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}上月乘客: {ORANGE}{COMMA}{BLACK}  最多: {ORANGE}{COMMA}
-STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}上月郵件: {ORANGE}{COMMA}{BLACK}  最多: {ORANGE}{COMMA}
+STR_200D_PASSENGERS_LAST_MONTH_MAX                              :{BLACK}上月乘客:{ORANGE}{COMMA}{BLACK}  最多:{ORANGE}{COMMA}
+STR_200E_MAIL_LAST_MONTH_MAX                                    :{BLACK}上月郵件:{ORANGE}{COMMA}{BLACK}  最多:{ORANGE}{COMMA}
 STR_200F_TALL_OFFICE_BLOCK                                      :摩天辦公大樓
 STR_2010_OFFICE_BLOCK                                           :辦公大樓
 STR_2011_SMALL_BLOCK_OF_FLATS                                   :平房
@@ -1633,19 +1677,19 @@
 STR_2020_LOCAL_AUTHORITY                                        :{BLACK}地方政府
 STR_2021_SHOW_INFORMATION_ON_LOCAL                              :{BLACK}顯示地方政府資訊
 STR_2022_LOCAL_AUTHORITY                                        :{WHITE}{TOWN} 地方政府
-STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}é‹è¼¸å…¬å¸è©•æ¯”:
-STR_2024                                                        :{YELLOW}{COMPANY}{PLAYERNAME}: {ORANGE}{STRING}
+STR_2023_TRANSPORT_COMPANY_RATINGS                              :{BLACK}é‹è¼¸å…¬å¸è©•æ¯”:
+STR_2024                                                        :{YELLOW}{COMPANY}{PLAYERNAME}:{ORANGE}{STRING}
 STR_2025_SUBSIDIES                                              :{WHITE}補助
-STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}æ供補助的é‹è¼¸æœå‹™:
+STR_2026_SUBSIDIES_ON_OFFER_FOR                                 :{BLACK}æ供補助的é‹è¼¸æœå‹™ï¼š
 STR_2027_FROM_TO                                                :{ORANGE}å°‡ {STRING} 從 {STRING} é‹åˆ° {STRING}
 STR_2028_BY                                                     :{YELLOW} (在 {DATE_SHORT} 之å‰)
 STR_202A_NONE                                                   :{ORANGE}ç„¡
-STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}å·²ç²è£œåŠ©çš„æœå‹™:
+STR_202B_SERVICES_ALREADY_SUBSIDISED                            :{BLACK}å·²ç²è£œåŠ©çš„æœå‹™ï¼š
 STR_202C_FROM_TO                                                :{ORANGE}å°‡ {STRING} 從 {STATION} é‹åˆ° {STATION}{YELLOW} ({COMPANY}
 STR_202D_UNTIL                                                  :{YELLOW}, 補助到 {DATE_SHORT})
-STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}補助éŽæœŸ:{}{}å°‡ {STRING} 從 {STRING} é‹åˆ° {STRING} 從此ä¸å†æ供補助。
-STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}補助çµæŸ:{}{}å°‡ {STRING} 從 {STATION} é‹åˆ° {STATION} ä¸å†æ供補助。
-STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}æ供補助:{}{}首先將 {STRING} 從 {STRING} é‹åˆ° {STRING} çš„å…¬å¸å°‡å¾—到å€åŸŸç•¶å±€è£œåŠ©ä¸€å¹´ï¼
+STR_202E_OFFER_OF_SUBSIDY_EXPIRED                               :{BLACK}{BIGFONT}補助éŽæœŸï¼š{}{}å°‡ {STRING} 從 {STRING} é‹åˆ° {STRING} 從此ä¸å†æ供補助。
+STR_202F_SUBSIDY_WITHDRAWN_SERVICE                              :{BLACK}{BIGFONT}補助çµæŸï¼š{}{}å°‡ {STRING} 從 {STATION} é‹åˆ° {STATION} å°‡ä¸å†æ供補助。
+STR_2030_SERVICE_SUBSIDY_OFFERED                                :{BLACK}{BIGFONT}æ供補助:{}{}首先將 {STRING} 從 {STRING} é‹åˆ° {STRING} çš„å…¬å¸å°‡å¾—到å€åŸŸç•¶å±€è£œåŠ©ä¸€å¹´ï¼
 STR_2031_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}{COMPANY} ç²å¾—補助ï¼{}{}å°‡ {STRING} 從 {STATION} é‹åˆ° {STATION} çš„æœå‹™å¯åœ¨å¾€å¾Œä¸€å¹´å¾—到é¡å¤– 50% çš„é‹è²»è£œåŠ©ï¼
 STR_2032_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}{COMPANY} ç²å¾—補助ï¼{}{}å°‡ {STRING} 從 {STATION} é‹åˆ° {STATION} çš„æœå‹™å¯åœ¨å¾€å¾Œä¸€å¹´æ”¶åˆ°é›™å€é‹è²»ï¼
 STR_2033_SERVICE_SUBSIDY_AWARDED                                :{BLACK}{BIGFONT}{COMPANY} ç²å¾—補助ï¼{}{}å°‡ {STRING} 從 {STATION} é‹åˆ° {STATION} çš„æœå‹™å¯åœ¨å¾€å¾Œä¸€å¹´æ”¶åˆ°ä¸‰å€é‹è²»ï¼
@@ -1657,7 +1701,7 @@
 STR_2039_TALL_OFFICE_BLOCK                                      :摩天辦公大樓
 STR_203A_SHOPS_AND_OFFICES                                      :店舖與辦公室
 STR_203B_SHOPS_AND_OFFICES                                      :店舖與辦公室
-STR_203C_THEATER                                                :劇場
+STR_203C_THEATER                                                :劇院
 STR_203D_STADIUM                                                :體育館
 STR_203E_OFFICES                                                :辦公室
 STR_203F_HOUSES                                                 :房èˆ
@@ -1666,7 +1710,7 @@
 STR_2042_DO_IT                                                  :{BLACK}辦ç†
 STR_2043_LIST_OF_THINGS_TO_DO_AT                                :{BLACK}在這個城鎮辦ç†å·¥ä½œ - é¸æ“‡å„工作å¯çœ‹åˆ°èªªæ˜Ž
 STR_2044_CARRY_OUT_THE_HIGHLIGHTED                              :{BLACK}辦ç†é¸å®šçš„工作
-STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}å¯è¾¦ç†çš„工作:
+STR_2045_ACTIONS_AVAILABLE                                      :{BLACK}å¯è¾¦ç†çš„工作:
 STR_2046_SMALL_ADVERTISING_CAMPAIGN                             :å°åž‹å»£å‘Šæ´»å‹•
 STR_2047_MEDIUM_ADVERTISING_CAMPAIGN                            :中型廣告活動
 STR_2048_LARGE_ADVERTISING_CAMPAIGN                             :大型廣告活動
@@ -1675,14 +1719,14 @@
 STR_204B_FUND_NEW_BUILDINGS                                     :出資新建築物
 STR_204C_BUY_EXCLUSIVE_TRANSPORT                                :購買專屬é‹è¼¸æ¬Š
 STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY                              :å‘地方當局行賄
-STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} 開始進行å°åž‹å€åŸŸå»£å‘Šæ´»å‹•ï¼Œç‚ºæ‚¨çš„é‹è¼¸æœå‹™å¸å¼•æ›´å¤šä¹˜å®¢èˆ‡è²¨ç‰©ã€‚{}  花費: {CURRENCY}
-STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} 開始進行中型å€åŸŸå»£å‘Šæ´»å‹•ï¼Œç‚ºæ‚¨çš„é‹è¼¸æœå‹™å¸å¼•æ›´å¤šä¹˜å®¢èˆ‡è²¨ç‰©ã€‚{}  花費: {CURRENCY}
-STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} 開始進行大型å€åŸŸå»£å‘Šæ´»å‹•ï¼Œç‚ºæ‚¨çš„é‹è¼¸æœå‹™å¸å¼•æ›´å¤šä¹˜å®¢èˆ‡è²¨ç‰©ã€‚{}  花費: {CURRENCY}
-STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} 出資é‡å»ºåŸŽå…§é“路網。將å°å¾€å¾Œå…­å€‹æœˆçš„é“è·¯é‹è¼¸é€ æˆå¯è§€çš„è¡æ“Šã€‚{}  花費: {CURRENCY}
-STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} 建造雕åƒç´€å¿µæ‚¨çš„å…¬å¸ã€‚{}  花費: {CURRENCY}
-STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} 出資在城內建造新的商業建築。{}  費用: {CURRENCY}
-STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} 在城內購買一年的專屬é‹è¼¸æ¬Šã€‚å€åŸŸç•¶å±€å°‡åªè®“乘客與貨物使用您的é‹è¼¸æœå‹™ã€‚{}  費用: {CURRENCY}
-STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} 冒著被抓到å—嚴懲的風險,å‘地方當局行賄以æ高評價{}  費用: {CURRENCY}
+STR_204D_INITIATE_A_SMALL_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} 開始進行å°åž‹å€åŸŸå»£å‘Šæ´»å‹•ï¼Œç‚ºæ‚¨çš„é‹è¼¸æœå‹™å¸å¼•æ›´å¤šä¹˜å®¢èˆ‡è²¨ç‰©ã€‚{}  花費:{CURRENCY}
+STR_204E_INITIATE_A_MEDIUM_LOCAL                                :{WHITE}{STRING}{}{YELLOW} 開始進行中型å€åŸŸå»£å‘Šæ´»å‹•ï¼Œç‚ºæ‚¨çš„é‹è¼¸æœå‹™å¸å¼•æ›´å¤šä¹˜å®¢èˆ‡è²¨ç‰©ã€‚{}  花費:{CURRENCY}
+STR_204F_INITIATE_A_LARGE_LOCAL                                 :{WHITE}{STRING}{}{YELLOW} 開始進行大型å€åŸŸå»£å‘Šæ´»å‹•ï¼Œç‚ºæ‚¨çš„é‹è¼¸æœå‹™å¸å¼•æ›´å¤šä¹˜å®¢èˆ‡è²¨ç‰©ã€‚{}  花費:{CURRENCY}
+STR_2050_FUND_THE_RECONSTRUCTION                                :{WHITE}{STRING}{}{YELLOW} 出資é‡å»ºåŸŽå…§é“路網。將å°å¾€å¾Œå…­å€‹æœˆçš„é“è·¯é‹è¼¸é€ æˆå¯è§€çš„è¡æ“Šã€‚{}  花費:{CURRENCY}
+STR_2051_BUILD_A_STATUE_IN_HONOR                                :{WHITE}{STRING}{}{YELLOW} 建造雕åƒç´€å¿µæ‚¨çš„å…¬å¸ã€‚{}  花費:{CURRENCY}
+STR_2052_FUND_THE_CONSTRUCTION_OF                               :{WHITE}{STRING}{}{YELLOW} 出資在城內建造新的商業建築。{}  費用:{CURRENCY}
+STR_2053_BUY_1_YEAR_S_EXCLUSIVE                                 :{WHITE}{STRING}{}{YELLOW} 在城內購買一年的專屬é‹è¼¸æ¬Šã€‚å€åŸŸç•¶å±€å°‡åªè®“乘客與貨物使用您的é‹è¼¸æœå‹™ã€‚{}  費用:{CURRENCY}
+STR_TOWN_BRIBE_THE_LOCAL_AUTHORITY_DESC                         :{WHITE}{STRING}{}{YELLOW} 冒著被抓到å—嚴懲的風險,å‘地方當局行賄以æ高評價{}  費用:{CURRENCY}
 STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING                       :{BIGFONT}{BLACK}{TOWN} 交通大亂ï¼{}{}{COMPANY} 出資的é“è·¯é‡å»ºè¨ˆåŠƒç‚ºä¹˜è»Šè€…帶來六個月的惡夢ï¼
 STR_2056                                                        :{TINYFONT}{WHITE}{TOWN}
 STR_2057                                                        :{ORANGE}{TOWN}{BLACK} ({COMMA})
@@ -1718,7 +1762,7 @@
 
 ##id 0x3000
 STR_3000_RAIL_STATION_SELECTION                                 :{WHITE}é¸æ“‡éµé“車站
-STR_3001_AIRPORT_SELECTION                                      :{WHITE}é¸æ“‡é£›æ©Ÿå ´
+STR_3001_AIRPORT_SELECTION                                      :{WHITE}é¸æ“‡æ©Ÿå ´
 STR_3002_ORIENTATION                                            :{BLACK}æ–¹å‘
 STR_3003_NUMBER_OF_TRACKS                                       :{BLACK}軌數
 STR_3004_PLATFORM_LENGTH                                        :{BLACK}月å°é•·åº¦
@@ -1732,13 +1776,13 @@
 STR_300A_0                                                      :{WHITE}{STATION} {STATIONFEATURES}
 STR_300B_MUST_DEMOLISH_RAILROAD                                 :{WHITE}必須先摧毀éµé“車站
 STR_300D_TOO_CLOSE_TO_ANOTHER_AIRPORT                           :{WHITE}太é è¿‘å¦ä¸€å€‹é£›æ©Ÿå ´
-STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}必須先摧毀飛機場
+STR_300E_MUST_DEMOLISH_AIRPORT_FIRST                            :{WHITE}必須先剷除機場
 
 STR_3030_RENAME_STATION_LOADING                                 :修改車站/載貨å€å稱
 STR_3031_CAN_T_RENAME_STATION                                   :{WHITE}ä¸èƒ½ä¿®æ”¹è»Šç«™å稱...
 STR_3032_RATINGS                                                :{BLACK}評價
 STR_3033_ACCEPTS                                                :{BLACK}接å—貨物
-STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}本地å°é‹è¼¸æœå‹™çš„評價:
+STR_3034_LOCAL_RATING_OF_TRANSPORT                              :{BLACK}本地å°é‹è¼¸æœå‹™çš„評價:
 
 ############ range for rating starts
 STR_3035_APPALLING                                              :駭人è½èž
@@ -1751,15 +1795,19 @@
 STR_303C_OUTSTANDING                                            :傑出
 ############ range for rating ends
 
-STR_303D                                                        :{WHITE}{STRING}: {YELLOW}{STRING} ({COMMA}%)
+STR_303D                                                        :{WHITE}{STRING}:{YELLOW}{STRING} ({COMMA}%)
 STR_303E_NO_LONGER_ACCEPTS                                      :{WHITE}{STATION} ä¸å†æŽ¥å— {STRING}
 STR_303F_NO_LONGER_ACCEPTS_OR                                   :{WHITE}{STATION} ä¸å†æŽ¥å— {STRING} 或 {STRING}
 STR_3040_NOW_ACCEPTS                                            :{WHITE}{STATION} ç¾åœ¨æŽ¥å— {STRING}
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} ç¾åœ¨æŽ¥å— {STRING} 與 {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}公車站方å‘
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}貨é‹ç«™æ–¹å‘
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}載客電車方å‘
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}載貨電車方å‘
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}必須先摧毀公車站
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}必須先摧毀貨é‹ç«™
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}必須先移除載客電車車站
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}必須先移除載貨電車車站
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} 座車站
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- ç„¡ -
@@ -1771,6 +1819,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}é¸æ“‡éµé“車站的長度
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}é¸æ“‡å…¬è»Šç«™æ–¹å‘
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}é¸æ“‡è²¨é‹ç«™æ–¹å‘
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}é¸æ“‡è¼‰å®¢é›»è»Šæ–¹å‘
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}é¸æ“‡è¼‰è²¨é›»è»Šæ–¹å‘
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}將主視野帶到車站ä½ç½®
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}顯示車站評價
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}變更車站å稱
@@ -1781,7 +1831,7 @@
 STR_STATION_SIGN_TINY                                           :{TINYFONT}{STATION}
 STR_305E_RAILROAD_STATION                                       :éµé“車站
 STR_305F_AIRCRAFT_HANGAR                                        :飛機棚
-STR_3060_AIRPORT                                                :飛機場
+STR_3060_AIRPORT                                                :æ©Ÿå ´
 STR_3061_TRUCK_LOADING_AREA                                     :貨é‹å ´
 STR_3062_BUS_STATION                                            :公車站
 STR_3063_SHIP_DOCK                                              :船塢
@@ -1871,17 +1921,17 @@
 STR_4826_SUGAR_MINE                                             :糖礦
 
 ############ range for requires starts
-STR_4827_REQUIRES                                               :{BLACK}需è¦: {YELLOW}{STRING}
-STR_4828_REQUIRES                                               :{BLACK}需è¦: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES                                               :{BLACK}需è¦: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}
+STR_4828_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}, {STRING}
+STR_4829_REQUIRES                                               :{BLACK}需è¦ï¼š{YELLOW}{STRING}, {STRING}, {STRING}
 ############ range for requires ends
 
-STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}上月產é‡:
+STR_482A_PRODUCTION_LAST_MONTH                                  :{BLACK}上月產é‡ï¼š
 STR_482B_TRANSPORTED                                            :{YELLOW}{CARGO}{BLACK} (é‹é€äº† {COMMA}%)
 STR_482C_CENTER_THE_MAIN_VIEW_ON                                :{BLACK}將主視野帶到工業上方
 STR_482D_NEW_UNDER_CONSTRUCTION                                 :{BLACK}{BIGFONT}æ–°çš„ {STRING} 正在 {TOWN} 附近建造中ï¼
 STR_482E_NEW_BEING_PLANTED_NEAR                                 :{BLACK}{BIGFONT}æ–°çš„ {STRING} 正在 {TOWN} 附近種æ¤ä¸­ï¼
-STR_482F_COST                                                   :{BLACK}費用: {YELLOW}{CURRENCY}
+STR_482F_COST                                                   :{BLACK}費用:{YELLOW}{CURRENCY}
 STR_4830_CAN_T_CONSTRUCT_THIS_INDUSTRY                          :{WHITE}無法在此新建這種工業...
 STR_4831_FOREST_CAN_ONLY_BE_PLANTED                             :{WHITE}...森林åªèƒ½ç¨®åœ¨é›ªç·šä»¥ä¸Š
 STR_4832_ANNOUNCES_IMMINENT_CLOSURE                             :{BLACK}{BIGFONT}{INDUSTRY} 宣佈立å³é—œé–‰ï¼
@@ -1991,6 +2041,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} ç›´å‡æ©Ÿå ´
 STR_SV_STNAME_FOREST                                            :{STRING} 森林
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2005,27 +2057,28 @@
 ############ range for difficulty levels ends
 
 ############ range for difficulty settings starts
-STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}競爭å°æ‰‹æ•¸ç›®ä¸Šé™: {ORANGE}{COMMA}
-STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}競爭å°æ‰‹é–‹å§‹æ™‚é–“: {ORANGE}{STRING}
-STR_6807_NO_OF_TOWNS                                            :{LTBLUE}城鎮數: {ORANGE}{STRING}
-STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}工業數: {ORANGE}{STRING}
-STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}最åˆè²¸æ¬¾ä¸Šé™: {ORANGE}{CURRENCY}
-STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}最åˆåˆ©çŽ‡: {ORANGE}{COMMA}%
-STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}é‹å…·ç‡Ÿé‹æ”¯å‡º: {ORANGE}{STRING}
-STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}競爭å°æ‰‹ç™¼å±•é€Ÿåº¦: {ORANGE}{STRING}
-STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}競爭å°æ‰‹æ™ºå•†: {ORANGE}{STRING}
-STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}é‹å…·æ•…障率: {ORANGE}{STRING}
-STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}補助å€çŽ‡: {ORANGE}{STRING}
-STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}建築費用: {ORANGE}{STRING}
-STR_6811_TERRAIN_TYPE                                           :{LTBLUE}地形種類: {ORANGE}{STRING}
-STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}海/湖比率: {ORANGE}{STRING}
-STR_6813_ECONOMY                                                :{LTBLUE}經濟: {ORANGE}{STRING}
-STR_6814_TRAIN_REVERSING                                        :{LTBLUE}列車倒轉: {ORANGE}{STRING}
-STR_6815_DISASTERS                                              :{LTBLUE}ç½é›£: {ORANGE}{STRING}
-STR_16816_CITY_APPROVAL                                         :{LTBLUE}市議會å°å€åŸŸé‡å»ºçš„態度: {ORANGE}{STRING}
+STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}競爭å°æ‰‹æ•¸ç›®ä¸Šé™ï¼š{ORANGE}{COMMA}
+STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}競爭å°æ‰‹é–‹å§‹æ™‚間:{ORANGE}{STRING}
+STR_6807_NO_OF_TOWNS                                            :{LTBLUE}城鎮數:{ORANGE}{STRING}
+STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}工業數:{ORANGE}{STRING}
+STR_6809_MAXIMUM_INITIAL_LOAN_000                               :{LTBLUE}最åˆè²¸æ¬¾ä¸Šé™ï¼š{ORANGE}{CURRENCY}
+STR_680A_INITIAL_INTEREST_RATE                                  :{LTBLUE}起始利率:{ORANGE}{COMMA}%
+STR_680B_VEHICLE_RUNNING_COSTS                                  :{LTBLUE}é‹å…·ç‡Ÿé‹æ”¯å‡ºï¼š{ORANGE}{STRING}
+STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}競爭å°æ‰‹ç™¼å±•é€Ÿåº¦ï¼š{ORANGE}{STRING}
+STR_680D_INTELLIGENCE_OF_COMPETITORS                            :{LTBLUE}競爭å°æ‰‹æ™ºå•†ï¼š{ORANGE}{STRING}
+STR_680E_VEHICLE_BREAKDOWNS                                     :{LTBLUE}é‹å…·æ•…障率:{ORANGE}{STRING}
+STR_680F_SUBSIDY_MULTIPLIER                                     :{LTBLUE}補助å€çŽ‡ï¼š{ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}興建費用:{ORANGE}{STRING}
+STR_6811_TERRAIN_TYPE                                           :{LTBLUE}地形種類:{ORANGE}{STRING}
+STR_6812_QUANTITY_OF_SEA_LAKES                                  :{LTBLUE}海/湖比率:{ORANGE}{STRING}
+STR_6813_ECONOMY                                                :{LTBLUE}經濟:{ORANGE}{STRING}
+STR_6814_TRAIN_REVERSING                                        :{LTBLUE}列車倒轉:{ORANGE}{STRING}
+STR_6815_DISASTERS                                              :{LTBLUE}ç½é›£ï¼š{ORANGE}{STRING}
+STR_16816_CITY_APPROVAL                                         :{LTBLUE}市議會å°å€åŸŸé‡å»ºçš„態度:{ORANGE}{STRING}
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :ç„¡
+STR_NUM_VERY_LOW                                                :éžå¸¸å°‘
 STR_6816_LOW                                                    :低
 STR_6817_NORMAL                                                 :普通
 STR_6818_HIGH                                                   :高
@@ -2072,7 +2125,7 @@
 STR_7002_PLAYER                                                 :(玩家 {COMMA})
 STR_7004_NEW_FACE                                               :{BLACK}新臉孔
 STR_7005_COLOR_SCHEME                                           :{BLACK}é…色
-STR_7006_COLOR_SCHEME                                           :{GOLD}é…色:
+STR_7006_COLOR_SCHEME                                           :{GOLD}é…色:
 STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}æ–°é…色
 STR_7008_COMPANY_NAME                                           :{BLACK}å…¬å¸å稱
 STR_7009_PRESIDENT_NAME                                         :{BLACK}經ç†å§“å
@@ -2098,7 +2151,7 @@
 STR_701D_OTHER                                                  :{GOLD}其它
 STR_701E                                                        :{BLACK}-{CURRENCY64}
 STR_701F                                                        :{BLACK}+{CURRENCY64}
-STR_7020_TOTAL                                                  :{WHITE}總計:
+STR_7020_TOTAL                                                  :{WHITE}總計:
 STR_7021                                                        :{COMPANY}{PLAYERNAME}
 STR_7022_INCOME_GRAPH                                           :{WHITE}收入圖
 STR_CURRCOMPACT                                                 :{CURRCOMPACT64}
@@ -2106,7 +2159,7 @@
 STR_7025_OPERATING_PROFIT_GRAPH                                 :{WHITE}營é‹æ益圖
 STR_7026_BANK_BALANCE                                           :{WHITE}餘é¡
 STR_7027_LOAN                                                   :{WHITE}貸款
-STR_MAX_LOAN                                                    :{WHITE}貸款上é™:  {BLACK}{CURRENCY64}
+STR_MAX_LOAN                                                    :{WHITE}貸款上é™::{BLACK}{CURRENCY64}
 STR_7028                                                        :{BLACK}{CURRENCY64}
 STR_7029_BORROW                                                 :{BLACK}貸款 {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
 STR_702A_REPAY                                                  :{BLACK}å„Ÿé‚„ {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
@@ -2124,8 +2177,8 @@
 STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}增加貸款
 STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}償還貸款
 STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(經ç†)
-STR_7038_INAUGURATED                                            :{GOLD}æˆç«‹æ–¼: {WHITE}{NUM}
-STR_7039_VEHICLES                                               :{GOLD}é‹å…·:
+STR_7038_INAUGURATED                                            :{GOLD}æˆç«‹æ–¼ï¼š{WHITE}{NUM}
+STR_7039_VEHICLES                                               :{GOLD}é‹å…·ï¼š
 STR_TRAINS                                                      :{WHITE}列車 {COMMA} 列
 STR_ROAD_VEHICLES                                               :{WHITE}汽車 {COMMA} 輛
 STR_AIRCRAFT                                                    :{WHITE}{COMMA} 飛機
@@ -2187,7 +2240,7 @@
 STR_7073_WORLD_RECESSION_FINANCIAL                              :{BIGFONT}{BLACK}世界ä¸æ™¯æ°£ï¼{}{}財務專家å°ç¶“æ¿Ÿè•­æ¢åšå‡ºæœ€å£žæ‰“ç®—ï¼
 STR_7074_RECESSION_OVER_UPTURN_IN                               :{BIGFONT}{BLACK}景氣回å‡ï¼{}{}湧ç¾çš„訂單讓工業å°ç¶“濟熱絡充滿信心ï¼
 STR_7075_TOGGLE_LARGE_SMALL_WINDOW                              :{BLACK}切æ›å¤§/å°è¦–窗
-STR_7076_COMPANY_VALUE                                          :{GOLD}å…¬å¸åƒ¹å€¼: {WHITE}{CURRENCY64}
+STR_7076_COMPANY_VALUE                                          :{GOLD}å…¬å¸åƒ¹å€¼ï¼š{WHITE}{CURRENCY64}
 STR_7077_BUY_25_SHARE_IN_COMPANY                                :{BLACK}購買 25% å…¬å¸è‚¡ä»½
 STR_7078_SELL_25_SHARE_IN_COMPANY                               :{BLACK}出售 25% å…¬å¸è‚¡ä»½
 STR_7079_BUY_25_SHARE_IN_THIS_COMPANY                           :{BLACK}購買這間公å¸çš„ 25% 股份
@@ -2499,20 +2552,20 @@
 STR_8801_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}å¸‚æ°‘æ…¶ç¥ . . .{}é¦–è¼›åˆ—è»ŠæŠµé” {STATION}ï¼
 STR_8802_DETAILS                                                :{WHITE}{STRING} (詳細資料)
 STR_8803_TRAIN_IN_THE_WAY                                       :{WHITE}å‰æ–¹æœ‰åˆ—車
-STR_8804                                                        :{SETX 10}{COMMA}: {STRING} {STRING}
-STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}: {STRING} {STRING}
+STR_8804                                                        :{SETX 10}{COMMA}:{STRING} {STRING}
+STR_8805                                                        :{RIGHTARROW}{SETX 10}{COMMA}:{STRING} {STRING}
 STR_8806_GO_TO                                                  :å‰å¾€ {STATION}
 STR_8807_GO_TO_TRANSFER                                         :å‰å¾€ {STATION} (轉é‹ï¼Œåƒ…載ä¸å¸)
 STR_8808_GO_TO_UNLOAD                                           :å‰å¾€ {STATION} (å¸å®¢è²¨)
 STR_8809_GO_TO_TRANSFER_UNLOAD                                  :å‰å¾€ {STATION} (轉é‹ï¼Œå¸å®¢è²¨æ¸…空離站)
-STR_880A_GO_TO_LOAD                                             :å‰å¾€ {STATION} (載貨)
+STR_880A_GO_TO_LOAD                                             :å‰å¾€ {STATION} (滿載)
 STR_880B_GO_TO_TRANSFER_LOAD                                    :å‰å¾€ {STATION} (轉é‹ï¼Œç­‰å¾…滿載)
 STR_880C_GO_NON_STOP_TO                                         :å‰å¾€ {STATION} ä¸åœé /中途ä¸åœ
-STR_880D_GO_TO_NON_STOP_TRANSFER                                :å‰å¾€ {STATION} (轉é‹ï¼Œåƒ…載ä¸å¸) 中途ä¸åœ
-STR_880E_GO_NON_STOP_TO_UNLOAD                                  :å‰å¾€ {STATION} (å¸å®¢è²¨) 中途ä¸åœ
-STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :å‰å¾€ {STATION} (轉é‹ï¼Œå¸å®¢è²¨æ¸…空離站) 中途ä¸åœ
-STR_8810_GO_NON_STOP_TO_LOAD                                    :å‰å¾€ {STATION} (載貨) 中途ä¸åœ
-STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :å‰å¾€ {STATION} (轉é‹ï¼Œç­‰å¾…滿載) 中途ä¸åœ
+STR_880D_GO_TO_NON_STOP_TRANSFER                                :å‰å¾€ {STATION} (è½‰é‹ [僅載ä¸å¸]) 中途ä¸åœ
+STR_880E_GO_NON_STOP_TO_UNLOAD                                  :å‰å¾€ {STATION} (å¸è¼‰) 中途ä¸åœ
+STR_880F_GO_TO_NON_STOP_TRANSFER_UNLOAD                         :å‰å¾€ {STATION} (è½‰é‹ [å¸è¼‰æ¸…空離站]) 中途ä¸åœ
+STR_8810_GO_NON_STOP_TO_LOAD                                    :å‰å¾€ {STATION} (滿載) 中途ä¸åœ
+STR_8811_GO_TO_NON_STOP_TRANSFER_LOAD                           :å‰å¾€ {STATION} (è½‰é‹ [等待滿載]) 中途ä¸åœ
 STR_GO_TO_TRAIN_DEPOT                                           :å‰å¾€ {TOWN} æ©Ÿå» 
 STR_SERVICE_AT_TRAIN_DEPOT                                      :在 {TOWN} 機廠維護
 STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT                             :å‰å¾€ {TOWN} æ©Ÿå»  中途ä¸åœ
@@ -2530,7 +2583,7 @@
 STR_8813_FROM                                                   :{LTBLUE}{CARGO} 來自 {STATION}
 STR_FROM_MULT                                                   :{LTBLUE}{CARGO} 來自 {STATION} (x{NUM})
 STR_8814_TRAIN_IS_WAITING_IN_DEPOT                              :{WHITE}列車 {COMMA} 已在機廠待命
-STR_8815_NEW_VEHICLES                                           :{BLACK}新造車輛
+STR_8815_NEW_VEHICLES                                           :{BLACK}購買新車輛
 STR_8816                                                        :{BLACK}-
 STR_8819_TRAIN_TOO_LONG                                         :{WHITE}列車太長
 STR_881A_TRAINS_CAN_ONLY_BE_ALTERED                             :{WHITE}列車åªæœ‰åœ¨åœæ”¾æ–¼æ©Ÿå» å…§çš„時候æ‰èƒ½è®Šå‹•
@@ -2552,7 +2605,7 @@
 STR_8820_RENAME                                                 :{BLACK}æ›´å
 STR_8823_SKIP                                                   :{BLACK}è·³éŽ
 STR_8824_DELETE                                                 :{BLACK}刪除
-STR_8825_NON_STOP                                               :{BLACK}(中途)ä¸åœ
+STR_8825_NON_STOP                                               :{BLACK}中途ä¸åœ
 STR_8826_GO_TO                                                  :{BLACK}å‰å¾€
 STR_8827_FULL_LOAD                                              :{BLACK}滿載
 STR_8828_UNLOAD                                                 :{BLACK}å¸è¼‰
@@ -2564,8 +2617,8 @@
 STR_FULLLOAD_OR_SERVICE                                         :{SKIP}{SKIP}{STRING}
 STR_SERVICE                                                     :{BLACK}維護
 STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE                           :{WHITE}無法購買éµé“車輛...
-STR_882C_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購於: {LTBLUE}{NUM}{BLACK} 價值: {LTBLUE}{CURRENCY}
-STR_882D_VALUE                                                  :{LTBLUE}{STRING}{BLACK}   價值: {LTBLUE}{CURRENCY}
+STR_882C_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購於:{LTBLUE}{NUM}{BLACK} 價值:{LTBLUE}{CURRENCY}
+STR_882D_VALUE                                                  :{LTBLUE}{STRING}{BLACK}   價值:{LTBLUE}{CURRENCY}
 STR_882E                                                        :{WHITE}{VEHICLE}
 STR_882F_LOADING_UNLOADING                                      :{LTBLUE}正在è£å¸å®¢è²¨
 STR_TRAIN_MUST_BE_STOPPED                                       :{WHITE}列車必須åœåœ¨æ©Ÿå» å†…
@@ -2581,8 +2634,8 @@
 STR_8839_CAN_T_SELL_RAILROAD_VEHICLE                            :{WHITE}無法出售éµé“車輛...
 STR_883A_UNABLE_TO_FIND_ROUTE_TO                                :{WHITE}無法找到å‰å¾€é™„近機廠的路徑
 STR_883B_CAN_T_STOP_START_TRAIN                                 :{WHITE}無法åœæ­¢/啟動列車...
-STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}維護間隔: {LTBLUE}{COMMA} 天{BLACK}   上次維護: {LTBLUE}{DATE_LONG}
-STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}維護間隔: {LTBLUE}{COMMA}%{BLACK}   上次維護: {LTBLUE}{DATE_LONG}
+STR_883C_SERVICING_INTERVAL_DAYS                                :{BLACK}維護間隔:{LTBLUE}{COMMA} 天{BLACK}   上次維護:{LTBLUE}{DATE_LONG}
+STR_SERVICING_INTERVAL_PERCENT                                  :{BLACK}維護間隔:{LTBLUE}{COMMA}%{BLACK}   上次維護:{LTBLUE}{DATE_LONG}
 STR_883D_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}列車 - 點é¸åˆ—車檢視資訊
 STR_883E_BUILD_NEW_TRAINS_REQUIRES                              :{BLACK}購買新列車 (需è¦éµé“æ©Ÿå» )
 STR_883F_TRAINS_CLICK_ON_TRAIN_FOR                              :{BLACK}列車 - 點é¸åˆ—車檢視資訊,拖放車廂å¯åŠ æŽ›/解è¯
@@ -2608,18 +2661,18 @@
 STR_8852_ORDERS_LIST_CLICK_ON_ORDER                             :{BLACK}指令清單 - 點é¸æŒ‡ä»¤å¯é¸æ“‡ã€‚æŒ‰ä½ CTRL 點é¸å¯è·³åˆ°è»Šç«™ä½ç½®
 STR_8853_SKIP_THE_CURRENT_ORDER                                 :{BLACK}è·³éŽç›®å‰æŒ‡ä»¤ï¼Œç¹¼çºŒä¸‹å€‹æŒ‡ä»¤
 STR_8854_DELETE_THE_HIGHLIGHTED                                 :{BLACK}刪除é¸å®šæŒ‡ä»¤
-STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}使é¸å®šçš„指令(中途)ä¸åœ
+STR_8855_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}使é¸å®šçš„指令中途ä¸åœ
 STR_8856_INSERT_A_NEW_ORDER_BEFORE                              :{BLACK}在é¸å®šçš„指令å‰æ’入新指令,或在最後新增指令
 STR_8857_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}讓列車在é¸å®šçš„指令等待載滿
 STR_8858_MAKE_THE_HIGHLIGHTED_ORDER                             :{BLACK}讓列車在é¸å®šçš„指令強制å¸è¼‰
 STR_SERVICE_HINT                                                :{BLACK}è·³éŽé€™å€‹æŒ‡ä»¤ï¼Œé™¤éžéœ€è¦ç¶­è­·
-STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}價格: {CURRENCY} é‡é‡: {WEIGHT_S}{}速度: {VELOCITY}  功率: {POWER}{}Running Cost: {CURRENCY}/yr{}Capacity: {CARGO}
+STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER                        :{BLACK}價格:{CURRENCY} é‡é‡ï¼š{WEIGHT_S}{}速度:{VELOCITY}  功率:{POWER}{}æ“作æˆæœ¬ï¼š{CURRENCY} / å¹´{}Capacity:{CARGO}
 STR_885C_BROKEN_DOWN                                            :{RED}故障
-STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數: {LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡º: {LTBLUE}{CURRENCY}/å¹´
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}é‡é‡: {LTBLUE}{WEIGHT_S}  {BLACK}功率: {LTBLUE}{POWER}{BLACK} 極速: {LTBLUE}{VELOCITY}
-STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}é‡é‡: {LTBLUE}{WEIGHT_S} {BLACK}功率: {LTBLUE}{POWER}{BLACK} 極速: {LTBLUE}{VELOCITY} {BLACK}最大牽引力: {LTBLUE}{FORCE}
-STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益: {LTBLUE}{CURRENCY}  (去年: {CURRENCY})
-STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦: {LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數: {LTBLUE}{COMMA}
+STR_885D_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數:{LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡ºï¼š{LTBLUE}{CURRENCY}/å¹´
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED                         :{BLACK}é‡é‡ï¼š{LTBLUE}{WEIGHT_S}  {BLACK}功率:{LTBLUE}{POWER}{BLACK} 極速:{LTBLUE}{VELOCITY}
+STR_VEHICLE_INFO_WEIGHT_POWER_MAX_SPEED_MAX_TE                  :{BLACK}é‡é‡ï¼š{LTBLUE}{WEIGHT_S} {BLACK}功率:{LTBLUE}{POWER}{BLACK} 極速:{LTBLUE}{VELOCITY} {BLACK}最大牽引力:{LTBLUE}{FORCE}
+STR_885F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益:{LTBLUE}{CURRENCY}  (去年:{CURRENCY})
+STR_8860_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦ï¼š{LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數:{LTBLUE}{COMMA}
 STR_8861_STOPPED                                                :{RED}åœæ­¢
 STR_8862_CAN_T_MAKE_TRAIN_PASS_SIGNAL                           :{WHITE}無法讓列車通éŽéšªé˜»è™ŸèªŒ...
 STR_8863_CRASHED                                                :{RED}撞毀ï¼
@@ -2654,12 +2707,12 @@
 STR_9007_BUILD_VEHICLE                                          :{BLACK}購買車輛
 STR_9009_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}無法購買汽車
 STR_900C_DETAILS                                                :{WHITE}{VEHICLE} (詳細資料)
-STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數: {LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡º: {LTBLUE}{CURRENCY}/å¹´
-STR_900E_MAX_SPEED                                              :{BLACK}極速: {LTBLUE}{VELOCITY}
-STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益: {LTBLUE}{CURRENCY}  (去年: {CURRENCY})
-STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦: {LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數: {LTBLUE}{COMMA}
-STR_9011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購買於: {LTBLUE}{NUM}{BLACK} 價值: {LTBLUE}{CURRENCY}
-STR_9012_CAPACITY                                               :{BLACK}容é‡: {LTBLUE}{CARGO}
+STR_900D_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數:{LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡ºï¼š{LTBLUE}{CURRENCY}/å¹´
+STR_900E_MAX_SPEED                                              :{BLACK}極速:{LTBLUE}{VELOCITY}
+STR_900F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益:{LTBLUE}{CURRENCY}  (去年:{CURRENCY})
+STR_9010_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦ï¼š{LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數:{LTBLUE}{COMMA}
+STR_9011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購買於:{LTBLUE}{NUM}{BLACK} 價值:{LTBLUE}{CURRENCY}
+STR_9012_CAPACITY                                               :{BLACK}容é‡ï¼š{LTBLUE}{CARGO}
 STR_9013_MUST_BE_STOPPED_INSIDE                                 :{WHITE}...å¿…é ˆåœåœ¨æ±½è»Šåº«å†…
 STR_9014_CAN_T_SELL_ROAD_VEHICLE                                :{WHITE}無法出售汽車...
 STR_9015_CAN_T_STOP_START_ROAD_VEHICLE                          :{WHITE}無法åœæ­¢/起動汽車...
@@ -2684,7 +2737,7 @@
 STR_9025_CENTER_MAIN_VIEW_ON_ROAD                               :{BLACK}將主視野移到車庫ä½ç½®
 STR_9026_ROAD_VEHICLE_SELECTION                                 :{BLACK}汽車清單 - 點é¸æ±½è»Šå¯çœ‹åˆ°è©³ç´°è³‡è¨Š
 STR_9027_BUILD_THE_HIGHLIGHTED_ROAD                             :{BLACK}購買é¸å®šçš„汽車
-STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}價格: {CURRENCY}{}速度: {VELOCITY}{}營é‹è²»ç”¨: {CURRENCY}/å¹´{}容é‡: {CARGO}
+STR_902A_COST_SPEED_RUNNING_COST                                :{BLACK}價格:{CURRENCY}{}速度:{VELOCITY}{}營é‹è²»ç”¨ï¼š{CURRENCY}/å¹´{}容é‡ï¼š{CARGO}
 
 STR_902C_NAME_ROAD_VEHICLE                                      :{WHITE}命å汽車
 STR_902D_CAN_T_NAME_ROAD_VEHICLE                                :{WHITE}無法命å汽車...
@@ -2726,12 +2779,12 @@
 STR_980E_SHIP_IN_THE_WAY                                        :{WHITE}å‰æ–¹æœ‰èˆ¹èˆ¶
 STR_980F                                                        :{WHITE}{VEHICLE}
 STR_9811_DETAILS                                                :{WHITE}{VEHICLE} (詳細資料)
-STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數: {LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡º: {LTBLUE}{CURRENCY}/å¹´
-STR_9813_MAX_SPEED                                              :{BLACK}極速: {LTBLUE}{VELOCITY}
-STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益: {LTBLUE}{CURRENCY}  (去年: {CURRENCY})
-STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦: {LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數: {LTBLUE}{COMMA}
-STR_9816_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購買於: {LTBLUE}{NUM}{BLACK} 價值: {LTBLUE}{CURRENCY}
-STR_9817_CAPACITY                                               :{BLACK}容é‡: {LTBLUE}{CARGO}
+STR_9812_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數:{LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡ºï¼š{LTBLUE}{CURRENCY}/å¹´
+STR_9813_MAX_SPEED                                              :{BLACK}極速:{LTBLUE}{VELOCITY}
+STR_9814_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益:{LTBLUE}{CURRENCY}  (去年:{CURRENCY})
+STR_9815_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦ï¼š{LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數:{LTBLUE}{COMMA}
+STR_9816_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購買於:{LTBLUE}{NUM}{BLACK} 價值:{LTBLUE}{CURRENCY}
+STR_9817_CAPACITY                                               :{BLACK}容é‡ï¼š{LTBLUE}{CARGO}
 STR_9818_CAN_T_STOP_START_SHIP                                  :{WHITE}無法åœæ­¢/起動船舶...
 STR_9819_CAN_T_SEND_SHIP_TO_DEPOT                               :{WHITE}無法將船舶é€åˆ°èˆ¹å¡¢...
 STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT                             :{WHITE}找ä¸åˆ°é™„近的船塢
@@ -2755,7 +2808,7 @@
 STR_9829_CENTER_MAIN_VIEW_ON_SHIP                               :{BLACK}將主視窗移到船舶ä½ç½®
 STR_982A_SEND_SHIP_TO_DEPOT                                     :{BLACK}將船舶é€å¾€èˆ¹å¡¢ã€‚æŒ‰ä½ CTRL 點é¸å‰‡åªåšç¶­è­·
 STR_982B_SHOW_SHIP_DETAILS                                      :{BLACK}顯示船舶詳細資料
-STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}價格: {CURRENCY} 極速: {VELOCITY}{}容é‡: {CARGO}{}營é‹æ”¯å‡º: {CURRENCY}/å¹´
+STR_982E_COST_MAX_SPEED_CAPACITY                                :{BLACK}價格:{CURRENCY} 極速:{VELOCITY}{}容é‡ï¼š{CARGO}{}營é‹æ”¯å‡ºï¼š{CURRENCY}/å¹´
 STR_982F_NAME_SHIP                                              :{BLACK}命å船舶
 
 STR_9831_NAME_SHIP                                              :{WHITE}命å船舶
@@ -2772,8 +2825,8 @@
 STR_983C_REFIT_SHIP                                             :{BLACK}改è£èˆ¹èˆ¶
 STR_983D_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}é¸æ“‡è¦è®“船舶é‹è¼¸çš„酬載種類
 STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED                        :{BLACK}改è£èˆ¹èˆ¶ä»¥é‹è¼¸é¸å®šçš„酬載
-STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}é¸æ“‡è¦é‹è¼¸çš„酬載種類:
-STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}新容é‡: {GOLD}{CARGO}{}{BLACK}改è£è²»ç”¨: {GOLD}{CURRENCY}
+STR_983F_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}é¸æ“‡è¦é‹è¼¸çš„酬載種類:
+STR_9840_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}新容é‡ï¼š{GOLD}{CARGO}{}{BLACK}改è£è²»ç”¨ï¼š{GOLD}{CURRENCY}
 STR_9841_CAN_T_REFIT_SHIP                                       :{WHITE}無法改è£èˆ¹èˆ¶...
 STR_9842_REFITTABLE                                             :(å¯æ”¹è£)
 STR_GO_TO_SHIP_DEPOT                                            :å‰å¾€ {TOWN} 船塢
@@ -2781,7 +2834,7 @@
 
 ##id 0xA000
 STR_A000_AIRPORTS                                               :{WHITE}æ©Ÿå ´
-STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}無法在此建造機場...
+STR_A001_CAN_T_BUILD_AIRPORT_HERE                               :{WHITE}無法在此興建機場...
 STR_A002_AIRCRAFT_HANGAR                                        :{WHITE}{STATION} åœæ©Ÿæ£š
 STR_A003_NEW_AIRCRAFT                                           :{BLACK}購買飛機
 STR_CLONE_AIRCRAFT                                              :{BLACK}複製飛機
@@ -2794,11 +2847,11 @@
 STR_A00A                                                        :{WHITE}{VEHICLE}
 STR_A00B_ORDERS                                                 :{WHITE}{VEHICLE} (指令)
 STR_A00C_DETAILS                                                :{WHITE}{VEHICLE} (詳細資料)
-STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數: {LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡º: {LTBLUE}{CURRENCY}/å¹´
-STR_A00E_MAX_SPEED                                              :{BLACK}極速: {LTBLUE}{VELOCITY}
-STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益: {LTBLUE}{CURRENCY}  (去年: {CURRENCY})
-STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦: {LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數: {LTBLUE}{COMMA}
-STR_A011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購買於: {LTBLUE}{NUM}{BLACK} 價值: {LTBLUE}{CURRENCY}
+STR_A00D_AGE_RUNNING_COST_YR                                    :{BLACK}使用年數:{LTBLUE}{STRING}{BLACK}   營é‹æ”¯å‡ºï¼š{LTBLUE}{CURRENCY}/å¹´
+STR_A00E_MAX_SPEED                                              :{BLACK}極速:{LTBLUE}{VELOCITY}
+STR_A00F_PROFIT_THIS_YEAR_LAST_YEAR                             :{BLACK}今年æ益:{LTBLUE}{CURRENCY}  (去年:{CURRENCY})
+STR_A010_RELIABILITY_BREAKDOWNS                                 :{BLACK}å¯é åº¦ï¼š{LTBLUE}{COMMA}%  {BLACK}上次維護後故障次數:{LTBLUE}{COMMA}
+STR_A011_BUILT_VALUE                                            :{LTBLUE}{STRING}{BLACK}   購買於:{LTBLUE}{NUM}{BLACK} 價值:{LTBLUE}{CURRENCY}
 STR_A012_CAN_T_SEND_AIRCRAFT_TO                                 :{WHITE}無法將飛機é€å›žæ©Ÿæ£š...
 STR_HEADING_FOR_HANGAR                                          :{ORANGE}æ­£å‰å¾€ {STATION} 機棚
 STR_HEADING_FOR_HANGAR_VEL                                      :{ORANGE}æ­£å‰å¾€ {STATION} 機棚, {VELOCITY}
@@ -2808,16 +2861,16 @@
 STR_A015_AIRCRAFT_IN_THE_WAY                                    :{WHITE}å‰æ–¹æœ‰é£›æ©Ÿ
 STR_A016_CAN_T_STOP_START_AIRCRAFT                              :{WHITE}無法åœæ­¢/起動飛機...
 STR_A017_AIRCRAFT_IS_IN_FLIGHT                                  :{WHITE}飛機正在飛行中
-STR_A019_CAPACITY                                               :{BLACK}容é‡: {LTBLUE}{CARGO}, {CARGO}
-STR_A01A_CAPACITY                                               :{BLACK}容é‡: {LTBLUE}{CARGO}
+STR_A019_CAPACITY                                               :{BLACK}容é‡ï¼š{LTBLUE}{CARGO}, {CARGO}
+STR_A01A_CAPACITY                                               :{BLACK}容é‡ï¼š{LTBLUE}{CARGO}
 STR_A01B_AIRCRAFT_MUST_BE_STOPPED                               :{WHITE}飛機必須åœåœ¨æ©Ÿæ£šå†…
 STR_A01C_CAN_T_SELL_AIRCRAFT                                    :{WHITE}無法出售飛機...
-STR_A01D_AIRPORT_CONSTRUCTION                                   :建造機場
-STR_A01E_BUILD_AIRPORT                                          :{BLACK}建造機場
+STR_A01D_AIRPORT_CONSTRUCTION                                   :興建機場
+STR_A01E_BUILD_AIRPORT                                          :{BLACK}興建機場
 STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}飛機 - 點é¸é£›æ©Ÿé¡¯ç¤ºè©³ç´°è³‡æ–™
 STR_A020_BUILD_NEW_AIRCRAFT_REQUIRES                            :{BLACK}購買新飛機 (需è¦æœ‰æ©Ÿæ£šçš„æ©Ÿå ´)
 STR_A021_AIRCRAFT_CLICK_ON_AIRCRAFT                             :{BLACK}飛機 - 點é¸é£›æ©Ÿé¡¯ç¤ºè©³ç´°è³‡æ–™
-STR_A022_BUILD_NEW_AIRCRAFT                                     :{BLACK}建造新機場
+STR_A022_BUILD_NEW_AIRCRAFT                                     :{BLACK}購買新飛機
 STR_A023_DRAG_AIRCRAFT_TO_HERE_TO                               :{BLACK}將飛機拉至此å³å¯å‡ºå”®
 STR_A024_CENTER_MAIN_VIEW_ON_HANGAR                             :{BLACK}將主視野帶到機棚ä½ç½®
 STR_A025_AIRCRAFT_SELECTION_LIST                                :{BLACK}飛機清單 - 點é¸é£›æ©Ÿæª¢è¦–詳細資料
@@ -2827,13 +2880,13 @@
 STR_A029_CENTER_MAIN_VIEW_ON_AIRCRAFT                           :{BLACK}將主視野帶到飛機ä½ç½®
 STR_A02A_SEND_AIRCRAFT_TO_HANGAR                                :{BLACK}將飛機é€åˆ°æ©Ÿæ£šã€‚æŒ‰ä½ CTRL 點é¸å‰‡åªåšç¶­è­·
 STR_A02B_SHOW_AIRCRAFT_DETAILS                                  :{BLACK}顯示飛機詳細資料
-STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}價格: {CURRENCY} 極速: {VELOCITY}{}容é‡: 乘客 {COMMA} å,郵件 {COMMA} 袋{}營é‹æ”¯å‡º: {CURRENCY}/å¹´
+STR_A02E_COST_MAX_SPEED_CAPACITY                                :{BLACK}價格:{CURRENCY} 極速:{VELOCITY}{}容é‡ï¼šä¹˜å®¢ {COMMA} å,郵件 {COMMA} 袋{}營é‹æ”¯å‡ºï¼š{CURRENCY}/å¹´
 
 STR_A030_NAME_AIRCRAFT                                          :{WHITE}命å飛機
 STR_A031_CAN_T_NAME_AIRCRAFT                                    :{WHITE}無法命å飛機
 STR_A032_NAME_AIRCRAFT                                          :{BLACK}命å飛機
 STR_A033_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}市民慶賀 . . .{}é¦–æž¶é£›æ©ŸæŠµé” {STATION}ï¼
-STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}飛機墜毀ï¼{}{COMMA} å死於 {STATION} æ©Ÿå ´çš„ç«çƒä¸‹
+STR_A034_PLANE_CRASH_DIE_IN_FIREBALL                            :{BLACK}{BIGFONT}墜機ï¼{}{COMMA} å乘客與機組員死於 {STATION} çš„ç«çƒä¸‹
 STR_PLANE_CRASH_OUT_OF_FUEL                                     :{BLACK}{BIGFONT}飛機墜毀ï¼{}飛機用光燃油, {COMMA} 死在ç«çƒè£¡ï¼
 STR_A036                                                        :{TINYFONT}{BLACK}{STATION}
 STR_A037_RENAME                                                 :{BLACK}æ›´å
@@ -2845,11 +2898,11 @@
 STR_A03D_REFIT_AIRCRAFT                                         :{BLACK}改è£é£›æ©Ÿ
 STR_A03E_SELECT_TYPE_OF_CARGO_FOR                               :{BLACK}é¸æ“‡è¦è®“飛機é‹é€çš„酬載
 STR_A03F_REFIT_AIRCRAFT_TO_CARRY                                :{BLACK}改è£é£›æ©Ÿä»¥é‹é€é¸å®šçš„酬載
-STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}é¸æ“‡è¦é‹é€çš„酬載種類:
-STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}新容é‡: {GOLD}{STRING}{}{BLACK}改è£è²»ç”¨: {GOLD}{CURRENCY}
+STR_A040_SELECT_CARGO_TYPE_TO_CARRY                             :{GOLD}é¸æ“‡è¦é‹é€çš„酬載種類:
+STR_A041_NEW_CAPACITY_COST_OF_REFIT                             :{BLACK}新容é‡ï¼š{GOLD}{STRING}{}{BLACK}改è£è²»ç”¨ï¼š{GOLD}{CURRENCY}
 STR_A042_CAN_T_REFIT_AIRCRAFT                                   :{WHITE}無法改è£é£›æ©Ÿ...
 STR_GO_TO_AIRPORT_HANGAR                                        :å‰å¾€ {STATION} 機棚
-SERVICE_AT_AIRPORT_HANGAR                                       :在{STATION}飛機庫進行維修
+SERVICE_AT_AIRPORT_HANGAR                                       :在{STATION}機棚進行檢修
 
 ##id 0xB000
 STR_B000_ZEPPELIN_DISASTER_AT                                   :{BLACK}{BIGFONT}{STATION} 發生飛船ç½é›£ï¼
@@ -2862,7 +2915,7 @@
 
 STR_BRIBE_FAILED                                                :{WHITE}您嘗試行賄的舉動
 STR_BRIBE_FAILED_2                                              :{WHITE}已經被調查員發ç¾
-STR_BUILD_DATE                                                  :{BLACK}建於: {LTBLUE}{DATE_LONG}
+STR_BUILD_DATE                                                  :{BLACK}建於:{LTBLUE}{DATE_LONG}
 
 STR_PERFORMANCE_DETAIL                                          :{WHITE}詳細效率評比
 STR_PERFORMANCE_DETAIL_KEY                                      :{BLACK}詳細資料
@@ -2871,16 +2924,16 @@
 STR_PERFORMANCE_DETAIL_PERCENT                                  :{WHITE}{NUM}%
 SET_PERFORMANCE_DETAIL_INT                                      :{BLACK}{NUM}
 ############ Those following lines need to be in this order!!
-STR_PERFORMANCE_DETAIL_VEHICLES                                 :{BLACK}é‹å…·:
-STR_PERFORMANCE_DETAIL_STATIONS                                 :{BLACK}車站:
-STR_PERFORMANCE_DETAIL_MIN_PROFIT                               :{BLACK}最低æ益:
-STR_PERFORMANCE_DETAIL_MIN_INCOME                               :{BLACK}最低收入:
-STR_PERFORMANCE_DETAIL_MAX_INCOME                               :{BLACK}最高收入:
-STR_PERFORMANCE_DETAIL_DELIVERED                                :{BLACK}é‹é€äº†:
-STR_PERFORMANCE_DETAIL_CARGO                                    :{BLACK}酬載:
-STR_PERFORMANCE_DETAIL_MONEY                                    :{BLACK}錢:
-STR_PERFORMANCE_DETAIL_LOAN                                     :{BLACK}貸款:
-STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}總計:
+STR_PERFORMANCE_DETAIL_VEHICLES                                 :{BLACK}é‹å…·ï¼š
+STR_PERFORMANCE_DETAIL_STATIONS                                 :{BLACK}站點:
+STR_PERFORMANCE_DETAIL_MIN_PROFIT                               :{BLACK}最低æ益:
+STR_PERFORMANCE_DETAIL_MIN_INCOME                               :{BLACK}最低收入:
+STR_PERFORMANCE_DETAIL_MAX_INCOME                               :{BLACK}最高收入:
+STR_PERFORMANCE_DETAIL_DELIVERED                                :{BLACK}å·²é‹é€ï¼š
+STR_PERFORMANCE_DETAIL_CARGO                                    :{BLACK}酬載:
+STR_PERFORMANCE_DETAIL_MONEY                                    :{BLACK}資金:
+STR_PERFORMANCE_DETAIL_LOAN                                     :{BLACK}貸款:
+STR_PERFORMANCE_DETAIL_TOTAL                                    :{BLACK}總計:
 ############ End of order list
 STR_PERFORMANCE_DETAIL_VEHICLES_TIP                             :{BLACK}é‹å…·æ•¸é‡ï¼›é€™åŒ…å«æ±½è»Šã€éµé“ã€èˆ¹èˆ¶èˆ‡é£›æ©Ÿ
 STR_PERFORMANCE_DETAIL_STATIONS_TIP                             :{BLACK}車站部分的數é‡ã€‚æ¯éƒ¨ä»½è»Šç«™ (ç«è»Šç«™ï¼Œå…¬è»Šç«™ï¼Œæ©Ÿå ´) 都算在内,就算連在一起亦然
@@ -2899,19 +2952,19 @@
 STR_NEWGRF_SET_PARAMETERS                                       :{BLACK}設定åƒæ•¸
 STR_NEWGRF_TIP                                                  :{BLACK}列出所有您安è£çš„ NewGRF 組。點é¸ä»¥ä¿®æ”¹è¨­å®š
 STR_NEWGRF_NO_FILES_INSTALLED                                   :{BLACK}ç›®å‰æ²’æœ‰å®‰è£ NewGRF 檔ï¼è«‹åƒè€ƒèªªæ˜Žæ–‡ä»¶é—œæ–¼å®‰è£æ–°åœ–片的部份
-STR_NEWGRF_FILENAME                                             :{BLACK}檔å: {SILVER}{STRING}
-STR_NEWGRF_GRF_ID                                               :{BLACK}GRF 編號: {SILVER}{STRING}
-STR_NEWGRF_MD5SUM                                               :{BLACK}MD5 雜湊值: {SILVER}{STRING}
+STR_NEWGRF_FILENAME                                             :{BLACK}檔å:{SILVER}{STRING}
+STR_NEWGRF_GRF_ID                                               :{BLACK}GRF 編號:{SILVER}{STRING}
+STR_NEWGRF_MD5SUM                                               :{BLACK}MD5 雜湊值:{SILVER}{STRING}
 STR_NEWGRF_CONFIRMATION_TEXT                                    :{YELLOW}您正準備修改進行中的éŠæˆ²ï¼›é€™å¯èƒ½ä½¿ OpenTTD 當掉。{}您絕å°ç¢ºå®šè¦é€™éº¼åšå—Žï¼Ÿ
 
 STR_NEWGRF_ERROR_MSG_INFO                                       :{SILVER}{STRING}
-STR_NEWGRF_ERROR_MSG_WARNING                                    :{RED}警告: {SILVER}{STRING}
-STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}錯誤: {SILVER}{STRING}
-STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}åš´é‡éŒ¯èª¤: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_WARNING                                    :{RED}警告:{SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_ERROR                                      :{RED}錯誤:{SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_FATAL                                      :{RED}åš´é‡éŒ¯èª¤ï¼š{SILVER}{STRING}
 STR_NEWGRF_ERROR_VERSION_NUMBER                                 :已知 {STRING} è·Ÿ TTDPatch 版本ä¸åˆã€‚
 STR_NEWGRF_ERROR_DOS_OR_WINDOWS                                 :{STRING} åªé©åˆç”¨æ–¼ TTD 版本 {STRING}
 STR_NEWGRF_ERROR_UNSET_SWITCH                                   :{STRING} 必須跟 {STRING} 一起使用
-STR_NEWGRF_ERROR_INVALID_PARAMETER                              : {STRING} çš„åƒæ•¸ç„¡æ•ˆ: {STRING} ({NUM})
+STR_NEWGRF_ERROR_INVALID_PARAMETER                              : {STRING} çš„åƒæ•¸ç„¡æ•ˆï¼š{STRING} ({NUM})
 STR_NEWGRF_ERROR_LOAD_BEFORE                                    :è¼‰å…¥å‰ {1:STRING} 必須先載入 {0:STRING}。
 STR_NEWGRF_ERROR_LOAD_AFTER                                     :{STRING} 必須在 {STRING} 之後載入。
 STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE                          :GRF 檔案翻譯後出ç¾éŒ¯èª¤
@@ -2925,7 +2978,7 @@
 STR_NEWGRF_MOVEDOWN                                             :{BLACK}下移
 STR_NEWGRF_MOVEDOWN_TIP                                         :{BLACK}å°‡é¸å®šçš„ NewGRF 檔案往清單下方移動
 STR_NEWGRF_FILE_TIP                                             :{BLACK}列出已安è£çš„ NewGRF 檔案。點é¸æª”案以修改設定。
-STR_NEWGRF_PARAMETER                                            :{BLACK}åƒæ•¸: {SILVER}{STRING}
+STR_NEWGRF_PARAMETER                                            :{BLACK}åƒæ•¸ï¼š{SILVER}{STRING}
 STR_NEWGRF_PARAMETER_QUERY                                      :{BLACK}輸入 NewGRF åƒæ•¸
 STR_NEWGRF_NO_INFO                                              :{BLACK}沒有相關資訊
 
@@ -2934,7 +2987,7 @@
 STR_NEWGRF_ADD_FILE_TIP                                         :{BLACK}å°‡é¸å®šçš„ NewGRF 加入目å‰é…ç½®
 STR_NEWGRF_RESCAN_FILES                                         :{BLACK}é‡æ–°æŽƒæ檔案
 STR_NEWGRF_RESCAN_FILES_TIP                                     :{BLACK}æ›´æ–°å¯ç”¨çš„ NewGRF 檔案清單
-STR_NEWGRF_DUPLICATE_GRFID                                      :{WHITE}無法新增檔案: GRF ID é‡è¤‡
+STR_NEWGRF_DUPLICATE_GRFID                                      :{WHITE}無法新增檔案:GRF ID é‡è¤‡
 
 STR_NEWGRF_NOT_FOUND                                            :{RED}找ä¸åˆ°ç¬¦åˆçš„檔案
 STR_NEWGRF_DISABLED                                             :{RED}關閉
@@ -2945,13 +2998,13 @@
 STR_NEWGRF_NOT_FOUND_WARNING                                    :{WHITE}找ä¸åˆ°è¼‰å…¥éŠæˆ²æ‰€éœ€çš„ GRF 檔案
 
 STR_CURRENCY_WINDOW                                             :{WHITE}自訂幣值
-STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}匯率: {ORANGE}{CURRENCY} = £ {COMMA}
-STR_CURRENCY_SEPARATOR                                          :{LTBLUE}分隔符號:
-STR_CURRENCY_PREFIX                                             :{LTBLUE}å‰ç½®:
-STR_CURRENCY_SUFFIX                                             :{LTBLUE}後置:
-STR_CURRENCY_SWITCH_TO_EURO                                     :{LTBLUE}改用æ­å…ƒ: {ORANGE}{NUM}
-STR_CURRENCY_SWITCH_TO_EURO_NEVER                               :{LTBLUE}改用æ­å…ƒ: {ORANGE}æ°¸ä¸æ”¹ç”¨
-STR_CURRENCY_PREVIEW                                            :{LTBLUE}é è¦½: {ORANGE}{CURRENCY}
+STR_CURRENCY_EXCHANGE_RATE                                      :{LTBLUE}匯率:{ORANGE}{CURRENCY} = £ {COMMA}
+STR_CURRENCY_SEPARATOR                                          :{LTBLUE}分隔符號:
+STR_CURRENCY_PREFIX                                             :{LTBLUE}å‰ç½®ï¼š
+STR_CURRENCY_SUFFIX                                             :{LTBLUE}後置:
+STR_CURRENCY_SWITCH_TO_EURO                                     :{LTBLUE}改用æ­å…ƒï¼š{ORANGE}{NUM}
+STR_CURRENCY_SWITCH_TO_EURO_NEVER                               :{LTBLUE}改用æ­å…ƒï¼š{ORANGE}æ°¸ä¸æ”¹ç”¨
+STR_CURRENCY_PREVIEW                                            :{LTBLUE}é è¦½ï¼š{ORANGE}{CURRENCY}
 STR_CURRENCY_CHANGE_PARAMETER                                   :{BLACK}變更自訂幣值åƒæ•¸
 
 STR_TRAIN                                                       :{BLACK}{TRAIN}
@@ -3008,11 +3061,14 @@
 STR_REPLACE_HELP_RAILTYPE                                       :{BLACK}é¸æ“‡æ‚¨è¦å–代車頭的軌é“é¡žåž‹
 STR_REPLACE_HELP_REPLACE_INFO_TAB                               :{BLACK}顯示左方的車頭è¦æ›¿æ›æˆå“ªç¨®è»Šé ­
 STR_REPLACE_HELP                                                :{BLACK}這讓您å¯åœ¨åˆ—車進入機廠的時候,用一種車頭å–代å¦ä¸€ç¨®è»Šé ­
-STR_REPLACE_REMOVE_WAGON                                        :{BLACK}移除車廂: {ORANGE}{SKIP}{STRING}
+STR_REPLACE_REMOVE_WAGON                                        :{BLACK}移除載具:{ORANGE}{SKIP}{STRING}
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}如果替æ›å¾Œçš„車廂較長的話,讓自動替æ›åŠŸèƒ½ç§»é™¤è»Šå»‚ (從頭開始) 以便維æŒåˆ—車長度。
-STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}å–代: {ORANGE}{SKIP}{SKIP}{STRING}
+STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}å–代:{ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} 實驗功能 {}在車頭與車廂å–代畫é¢ä¹‹é–“切æ›ã€‚{}車廂å–代åªæœ‰åœ¨æ–°è»Šå»‚能改è£é‹é€èˆŠè»Šå»‚酬載的時候æ‰æœƒåŸ·è¡Œã€‚æ¯å€‹è»Šå»‚都會進行一次檢查。
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}無法購買車頭
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}載具已經åœç”¢
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}車輛已經åœç”¢
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}船舶已經åœç”¢
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}飛機已經åœç”¢
 
 STR_ENGINES                                                     :車頭
 STR_WAGONS                                                      :車廂
@@ -3046,22 +3102,22 @@
 
 STR_TINY_BLACK                                                  :{BLACK}{TINYFONT}{COMMA}
 
-STR_PURCHASE_INFO_COST_WEIGHT                                   :{BLACK}價格: {GOLD}{CURRENCY}{BLACK} é‡é‡: {GOLD}{WEIGHT_S}
-STR_PURCHASE_INFO_SPEED_POWER                                   :{BLACK}速度: {GOLD}{VELOCITY}{BLACK}   功率: {GOLD}{POWER}
-STR_PURCHASE_INFO_SPEED                                         :{BLACK}速度: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}營é‹æ”¯å‡º: {GOLD}{CURRENCY}/å¹´
-STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}容é‡: {GOLD}{CARGO} {STRING}
-STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}設計年份: {GOLD}{NUM}{BLACK} 壽命: {GOLD}{COMMA} 年
-STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}最大å¯é åº¦: {GOLD}{COMMA}%
-STR_PURCHASE_INFO_COST                                          :{BLACK}價格: {GOLD}{CURRENCY}
-STR_PURCHASE_INFO_WEIGHT_CWEIGHT                                :{BLACK}é‡é‡: {GOLD}{WEIGHT_S}  ({WEIGHT_S})
-STR_PURCHASE_INFO_COST_SPEED                                    :{BLACK}價格: {GOLD}{CURRENCY}{BLACK} 速度: {GOLD}{VELOCITY}
-STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}容é‡: {GOLD}乘客 {COMMA} 人, 郵件 {COMMA} 袋
-STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK}動力車廂: {GOLD}+{POWER}{BLACK} é‡é‡: {GOLD}+{WEIGHT_S}
-STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}å¯æ”¹é€ æˆ: {GOLD}
+STR_PURCHASE_INFO_COST_WEIGHT                                   :{BLACK}價格:{GOLD}{CURRENCY}{BLACK} é‡é‡ï¼š{GOLD}{WEIGHT_S}
+STR_PURCHASE_INFO_SPEED_POWER                                   :{BLACK}速度:{GOLD}{VELOCITY}{BLACK}   功率:{GOLD}{POWER}
+STR_PURCHASE_INFO_SPEED                                         :{BLACK}速度:{GOLD}{VELOCITY}
+STR_PURCHASE_INFO_RUNNINGCOST                                   :{BLACK}營é‹æ”¯å‡ºï¼š{GOLD}{CURRENCY} / å¹´
+STR_PURCHASE_INFO_CAPACITY                                      :{BLACK}容é‡ï¼š{GOLD}{CARGO} {STRING}
+STR_PURCHASE_INFO_DESIGNED_LIFE                                 :{BLACK}設計年份:{GOLD}{NUM}{BLACK} 使用年é™ï¼š{GOLD}{COMMA} å¹´
+STR_PURCHASE_INFO_RELIABILITY                                   :{BLACK}最大å¯é åº¦ï¼š{GOLD}{COMMA}%
+STR_PURCHASE_INFO_COST                                          :{BLACK}價格:{GOLD}{CURRENCY}
+STR_PURCHASE_INFO_WEIGHT_CWEIGHT                                :{BLACK}é‡é‡ï¼š{GOLD}{WEIGHT_S}  ({WEIGHT_S})
+STR_PURCHASE_INFO_COST_SPEED                                    :{BLACK}價格:{GOLD}{CURRENCY}{BLACK} 速度:{GOLD}{VELOCITY}
+STR_PURCHASE_INFO_AIRCRAFT_CAPACITY                             :{BLACK}容é‡ï¼š{GOLD}乘客 {COMMA} 人,郵件 {COMMA} 袋
+STR_PURCHASE_INFO_PWAGPOWER_PWAGWEIGHT                          :{BLACK}動力車廂:{GOLD}+{POWER}{BLACK} é‡é‡ï¼š{GOLD}+{WEIGHT_S}
+STR_PURCHASE_INFO_REFITTABLE_TO                                 :{BLACK}å¯æ”¹è£æˆï¼š{GOLD}
 STR_PURCHASE_INFO_ALL_TYPES                                     :所有酬載類型
-STR_PURCHASE_INFO_ALL_BUT                                       :{GOLD} 以外皆å¯
-STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}最大牽引力: {GOLD}{FORCE}
+STR_PURCHASE_INFO_ALL_BUT                                       :{GOLD}除了
+STR_PURCHASE_INFO_MAX_TE                                        :{BLACK}最大牽引力:{GOLD}{FORCE}
 
 ########### String for New Landscape Generator
 
@@ -3069,18 +3125,18 @@
 STR_RANDOM                                                      :{BLACK}亂數化
 STR_RANDOM_HELP                                                 :{BLACK}改變產生地形的亂數種å­
 STR_WORLD_GENERATION_CAPTION                                    :{WHITE}產生世界
-STR_RANDOM_SEED                                                 :{BLACK}亂數種å­:
+STR_RANDOM_SEED                                                 :{BLACK}亂數種å­ï¼š
 STR_RANDOM_SEED_HELP                                            :{BLACK}點é¸å¯è¼¸å…¥äº‚數種å­
 STR_LAND_GENERATOR                                              :{BLACK}地形產生器
-STR_TREE_PLACER                                                 :{BLACK}æ¤æ¨¹æ¼”算法:
-STR_HEIGHTMAP_ROTATION                                          :{BLACK}高度圖旋轉:
-STR_TERRAIN_TYPE                                                :{BLACK}地形種類:
-STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}æµ·å¹³é¢:
-STR_SMOOTHNESS                                                  :{BLACK}平滑度:
-STR_SNOW_LINE_HEIGHT                                            :{BLACK}雪線高度:
-STR_DATE                                                        :{BLACK}日期:
-STR_NUMBER_OF_TOWNS                                             :{BLACK}城鎮數é‡:
-STR_NUMBER_OF_INDUSTRIES                                        :{BLACK}工業數é‡:
+STR_TREE_PLACER                                                 :{BLACK}æ¤æ¨¹æ¼”算法:
+STR_HEIGHTMAP_ROTATION                                          :{BLACK}高度圖旋轉:
+STR_TERRAIN_TYPE                                                :{BLACK}地形種類:
+STR_QUANTITY_OF_SEA_LAKES                                       :{BLACK}æµ·å¹³é¢ï¼š
+STR_SMOOTHNESS                                                  :{BLACK}平滑度:
+STR_SNOW_LINE_HEIGHT                                            :{BLACK}雪線高度:
+STR_DATE                                                        :{BLACK}日期:
+STR_NUMBER_OF_TOWNS                                             :{BLACK}城鎮數é‡ï¼š
+STR_NUMBER_OF_INDUSTRIES                                        :{BLACK}工業數é‡ï¼š
 STR_GENERATE_DATE                                               :{BLACK}{DATE_LONG}
 STR_SNOW_LINE_UP                                                :{BLACK}將雪線高度上移一格
 STR_SNOW_LINE_DOWN                                              :{BLACK}將雪線高度下移一格
@@ -3088,9 +3144,11 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}變更開始年份
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}縮放警告
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}ä¸å»ºè­°éŽåº¦ç¸®æ”¾åœ°åœ–。繼續產生?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}市鎮è¦åŠƒè­¦å‘Š
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW} "市鎮é“è·¯ä¸å†è¦åŠƒ" 是ä¸å»ºè­°çš„。è¦ç¹¼çºŒç”¢ç”Ÿå—Žï¼Ÿ
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
-STR_HEIGHTMAP_NAME                                              :{BLACK}高度圖å稱:
-STR_HEIGHTMAP_SIZE                                              :{BLACK}大å°: {ORANGE}{NUM} x {NUM}
+STR_HEIGHTMAP_NAME                                              :{BLACK}高度圖å稱:
+STR_HEIGHTMAP_SIZE                                              :{BLACK}大å°ï¼š{ORANGE}{NUM} x {NUM}
 STR_GENERATION_WORLD                                            :{WHITE}正在產生世界...
 STR_GENERATION_ABORT                                            :{BLACK}放棄
 STR_GENERATION_ABORT_CAPTION                                    :{WHITE}放棄產生地形
@@ -3113,7 +3171,7 @@
 STR_FLAT_WORLD_HEIGHT_DOWN                                      :{BLACK}將平地高度下移一層
 STR_FLAT_WORLD_HEIGHT_UP                                        :{BLACK}將平地高度上移一格
 STR_FLAT_WORLD_HEIGHT_QUERY_CAPT                                :{WHITE}修改平地高度
-STR_FLAT_WORLD_HEIGHT                                           :{BLACK}平地高度:
+STR_FLAT_WORLD_HEIGHT                                           :{BLACK}平地高度:
 STR_FLAT_WORLD_HEIGHT_NUM                                       :{NUM}
 
 STR_SMALLMAP_CENTER                                             :{BLACK}å°‡å°åœ°åœ–移到目å‰åœ°é»žä½ç½®
@@ -3129,17 +3187,17 @@
 STR_HELIDEPOT                                                   :{BLACK}ç›´å‡æ©Ÿæ£š
 STR_HELISTATION                                                 :{BLACK}ç›´å‡æ©Ÿç«™
 
-STR_SMALL_AIRPORTS                                              :{BLACK}å°æ©Ÿå ´
-STR_LARGE_AIRPORTS                                              :{BLACK}大機場
+STR_SMALL_AIRPORTS                                              :{BLACK}å°åž‹æ©Ÿå ´
+STR_LARGE_AIRPORTS                                              :{BLACK}大型機場
 STR_HUB_AIRPORTS                                                :{BLACK}轉é‹æ©Ÿå ´
 STR_HELIPORTS                                                   :{BLACK}ç›´å‡æ©Ÿå ´
 
 ############ Tooltip measurment
 
-STR_MEASURE_LENGTH                                              :{BLACK}長度: {NUM}
-STR_MEASURE_AREA                                                :{BLACK}å€åŸŸ: {NUM} x {NUM}
-STR_MEASURE_LENGTH_HEIGHTDIFF                                   :{BLACK}長度: {NUM}{}高度差: {NUM} m
-STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}å€åŸŸ: {NUM} x {NUM}{}高度差: {NUM} m
+STR_MEASURE_LENGTH                                              :{BLACK}長度:{NUM}
+STR_MEASURE_AREA                                                :{BLACK}å€åŸŸï¼š{NUM} x {NUM}
+STR_MEASURE_LENGTH_HEIGHTDIFF                                   :{BLACK}長度:{NUM}{}高度差:{NUM} m
+STR_MEASURE_AREA_HEIGHTDIFF                                     :{BLACK}å€åŸŸï¼š{NUM} x {NUM}{}高度差:{NUM} m
 
 ############ Date formatting
 STR_DATE_TINY                                                   :{STRING}-{STRING}-{NUM}
@@ -3148,4 +3206,52 @@
 
 ########
 
-STR_FEEDER_CARGO_VALUE                                          :{BLACK}轉é‹é€²å¸³: {LTBLUE}{CURRENCY}
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}轉é‹é€²å¸³ï¼š{LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...此路段為市鎮所有
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...此路é¢å‘錯誤的方å‘
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}é€æ˜Žåº¦é¸é …
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}å°‡é€æ˜Žåº¦å¥—用於車站å稱
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}å°‡é€æ˜Žåº¦å¥—用於樹木
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}å°‡é€æ˜Žåº¦å¥—用於房屋
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}å°‡é€æ˜Žåº¦å¥—用於工業
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}å°‡é€æ˜Žåº¦å¥—用於建物,如車站ã€å» æ£šã€è·¯æ¨™åŠé›»ç·š
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}å°‡é€æ˜Žåº¦å¥—用於橋樑
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}å°‡é€æ˜Žåº¦å¥—用於設施,如燈塔ã€å¤©ç·šå¡”ç­‰
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :群組 {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :所有列車
+STR_GROUP_ALL_ROADS                                             :所有車輛
+STR_GROUP_ALL_SHIPS                                             :所有船舶
+STR_GROUP_ALL_AIRCRAFTS                                         :所有飛機
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :加入共用載具
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :移除所有載具
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} 列車
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} 車輛
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} 船舶
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} 飛機
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}為群組é‡æ–°å‘½å
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}ç½®æ› "{GROUP}" 載具
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}ä¸èƒ½å»ºç«‹ç¾¤çµ„...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}ä¸èƒ½ç§»é™¤ç¾¤çµ„...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}ä¸èƒ½é‡æ–°å‘½å群組...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}ä¸èƒ½å¾žç¾¤çµ„移除所有載具...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}ä¸èƒ½åŠ å…¥è¼‰å…·åˆ°é€™ç¾¤çµ„...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}ä¸èƒ½åŠ å…¥å…±ç”¨è¼‰å…·åˆ°é€™ç¾¤çµ„...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}群組 - 單擊群組以顯示載具åå–®
+STR_GROUP_CREATE_TIP                                            :{BLACK}單擊建立群組
+STR_GROUP_DELETE_TIP                                            :{BLACK}移除é¸æ“‡ç¾¤çµ„
+STR_GROUP_RENAME_TIP                                            :{BLACK}為群組é‡æ–°å‘½å
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}本年盈餘: {GREEN}{CURRENCY} {BLACK}(去年: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}本年盈餘:{RED}{CURRENCY} {BLACK}(去年: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}本年盈餘: {GREEN}{CURRENCY} {BLACK}(去年: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}本年盈餘: {RED}{CURRENCY} {BLACK}(去年:{RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/turkish.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/turkish.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -3,6 +3,8 @@
 ##isocode tr_TR
 ##plural 1
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}Harita kenarında
@@ -280,6 +282,7 @@
 STR_OSNAME_MORPHOS                                              :MorphOS
 STR_OSNAME_AMIGAOS                                              :AmigaOS
 STR_OSNAME_OS2                                                  :OS/2
+STR_OSNAME_SUNOS                                                :SunOS
 
 STR_013B_OWNED_BY                                               :{WHITE}...sahibi {STRING}
 STR_013C_CARGO                                                  :{BLACK}Kargo
@@ -590,6 +593,7 @@
 STR_0207_ARRIVAL_OF_FIRST_VEHICLE                               :{YELLOW}Rakibin durağına ilk aracın gelişi
 STR_0208_ACCIDENTS_DISASTERS                                    :{YELLOW}Kazalar / felaketler
 STR_0209_COMPANY_INFORMATION                                    :{YELLOW}Åžirket bilgisi
+STR_NEWS_OPEN_CLOSE                                             :{YELLOW}Fabrika açılış/kapanışları
 STR_020A_ECONOMY_CHANGES                                        :{YELLOW}Ekonomi deÄŸiÅŸimleri
 STR_020B_ADVICE_INFORMATION_ON_PLAYER                           :{YELLOW}Oyuncunun araçlarıyla ilgili ögüt / bilgi
 STR_020C_NEW_VEHICLES                                           :{YELLOW}Yeni araçlar
@@ -725,6 +729,7 @@
 STR_028D_PLACE_LIGHTHOUSE                                       :{BLACK}Deniz feneri koy
 STR_028E_PLACE_TRANSMITTER                                      :{BLACK}Verici koy
 STR_028F_DEFINE_DESERT_AREA                                     :{BLACK}Çöl yap, kaldırmak için CTRL'ye basılı tut
+STR_CREATE_LAKE                                                 :{BLACK}Su alanını belirle.{}Deniz seviyesinde CTRL tuşu basılı olmadığı sürece kanal yapar, basılıysa etraftakileri su altında bırakır
 STR_0290_DELETE                                                 :{BLACK}Sil
 STR_0291_DELETE_THIS_TOWN_COMPLETELY                            :{BLACK}Sehri tamamen sil
 STR_0292_SAVE_SCENARIO                                          :Kaydet
@@ -748,6 +753,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Küçük
 STR_02A2_MEDIUM                                                 :{BLACK}Orta
 STR_02A3_LARGE                                                  :{BLACK}Büyük
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}Åžehir
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Şehir büyüklüğü seç
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Şehir büyüklüğü:
 
@@ -799,6 +805,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Dünya haritası
 STR_EXTRA_VIEW_PORT                                             :Ekstra görünüm
 STR_SIGN_LIST                                                   :Tabela listesi
+STR_TRANSPARENCY_OPTIONS                                        :Şeffaflık seçenekleri
 STR_02DF_TOWN_DIRECTORY                                         :Åžehir listesi
 STR_TOWN_POPULATION                                             :{BLACK}Dünya nüfusu: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Görünüm {COMMA}
@@ -1087,6 +1094,11 @@
 STR_CONFIG_PATCHES_LIVERIES_OWN                                 :Åžirketi al
 STR_CONFIG_PATCHES_LIVERIES_ALL                                 :Tüm şirketler
 STR_CONFIG_PATCHES_PREFER_TEAMCHAT                              :{LTBLUE}<ENTER> tuşu takım içi sohbette kullanılsın: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING                        :{LTBLUE}Fare tekerleÄŸinin fonksiyonu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM                             :Haritayı yakınaştır
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Haritayı kaydır
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Kapalı
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}Tekerlek hızı: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}Her oyuncu için en fazla tren: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}Her oyuncu için en fazla araba: {ORANGE}{STRING}
@@ -1120,12 +1132,27 @@
 STR_CONFIG_PATCHES_ALLOW_SHARES                                 :{LTBLUE}Diğer şirketlerin hisseleri alınabilsin
 STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY                         :{LTBLUE}Sürüklerken her: {ORANGE}{STRING} karede bir sinyal koy
 STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE                  :{LTBLUE}Bu tarihten önce ışık yerine semafor kullan: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID                          :{WHITE}Senaryo düzenleyicisinde "yolsuz" şehir seçeneği kullanılamaz
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :yolsuz
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :varsayılan
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :daha iyi yollar
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}Ana araç çubuğu pozisyonu: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Sol
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :Orta
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :SaÄŸ
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Pencere yapışma yarıçapı: {ORANGE}{STRING} piksel
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}Pencere yapışma yarıçapı: {ORANGE}kapalı
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}Şehirlerin genişleme hızı: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Hiçbiri
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :YavaÅŸ
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :Normal
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Hızlı
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Çok Hızlı
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}Kasabaların şehir olması için gerekli nüfus: {ORANGE}1 in {STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}Arayüz
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Ä°nÅŸaat
@@ -1205,6 +1232,7 @@
 STR_TREES_RANDOM_TYPE_TIP                                       :{BLACK}Rastgele türde ağaçlar koy
 
 STR_CANT_BUILD_CANALS                                           :{WHITE}Buraya kanal yapılamaz...
+STR_BUILD_CANALS_TIP                                            :{BLACK}Kanal yap.
 STR_LANDINFO_CANAL                                              :Kanal
 
 STR_CANT_BUILD_LOCKS                                            :{WHITE}Buraya kilit yapılamaz...
@@ -1564,20 +1592,34 @@
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Yol Yapımı
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Köprü Seç
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Yol yapılamıyor...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Buraya tramvay yapılamaz...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Yol kaldırılamıyor...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Tramvay kaldırılamaz...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}Garaj Yönü
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}Tramvay Garı Yönü
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Buraya Garaj yapılamaz...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Buraya tramvay garı yapılamaz...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Otobüs durağı yapılamaz...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Kamyon durağı yapılamaz...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Yolcu tramvayı istasyonu yapılamaz...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Yük tramvayı istasyonu yapılamaz...
 STR_180A_ROAD_CONSTRUCTION                                      :Yol yapımı
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Tramvay yapımı
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Yol bölmesi yap
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Tramvay yolu yap
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Garaj yap (araç alımı ve bakımlar için)
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Tramvay garı yap (araç alımı ve tamiri için)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Otobüs durağı yap
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Kamyon yükleme bölgesi yap
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Yolcu tramvayı istasyonu yap
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Yük tramvayı istasyonu yap
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Köprü yap
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Tramvay köprüsü yap
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Tünel Yap
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Tramvay tüneli yap
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Yol yap/sil arasında geçiş yap
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Garaj yönünü seç
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Tramvay garı yönü
 STR_1814_ROAD                                                   :Yol
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Lambali yol
 STR_1816_TREE_LINED_ROAD                                        :Ağaçli yol
@@ -1585,6 +1627,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Hemzemin geçit
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Otobüs durağı kaldırılamaz...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Kamyon durağı kaldırılamaz...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Yolcu tramvayı istasyonu kaldırılamıyor...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Yük tramvayı istasyonu kaldırılamıyor...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}Åžehirler
@@ -1749,8 +1793,11 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} artık {STRING} ve {STRING} istiyor
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}Otobüs Durağı Yönü
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}Kamyon Durağı Yönü
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}Yolcu Tramvayı Yönü
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}Yük Tramvayı Yönü
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Önce otobüs durağı yıkılmalı
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Önce kamyon durağı yıkılmalı
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Önce yolcu tramvayı istasyonu yıkılmalı
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} istasyonları
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- Yok -
@@ -1982,6 +2029,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} Heliport
 STR_SV_STNAME_FOREST                                            :{STRING} Ormanı
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2017,6 +2066,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Hiç
+STR_NUM_VERY_LOW                                                :Çok az
 STR_6816_LOW                                                    :Düşük
 STR_6817_NORMAL                                                 :Normal
 STR_6818_HIGH                                                   :Yüksek
@@ -2209,6 +2259,8 @@
 STR_LIVERY_HELICOPTER                                           :Helikopter
 STR_LIVERY_SMALL_PLANE                                          :Küçük Uçak
 STR_LIVERY_LARGE_PLANE                                          :Büyük Uçak
+STR_LIVERY_PASSENGER_TRAM                                       :Yolcu Tramvayı
+STR_LIVERY_FREIGHT_TRAM                                         :Yük Tramvayı
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Genel renk şemalarını göster
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Tren renk düzenlerini göster
@@ -2631,6 +2683,10 @@
 STR_TRAIN_NO_POWER                                              :{RED}Elektrik yok
 STR_TRAIN_START_NO_CATENARY                                     :Bu rayda elektrik olmadiği için bu tren çalışamaz
 
+STR_NEW_VEHICLE_NOW_AVAILABLE                                   :{BLACK}{BIGFONT}{STRING} artık kullanılabilir!
+STR_NEW_VEHICLE_TYPE                                            :{BLACK}{BIGFONT}{STRING}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE                         :{BLACK}{STRING} artık kullanılabilir!  -  {STRING}
+
 ##id 0x9000
 STR_9000_ROAD_VEHICLE_IN_THE_WAY                                :{WHITE}Yolda araba var
 STR_9001_ROAD_VEHICLES                                          :{WHITE}{COMPANY} - {COMMA} Arabalar
@@ -2998,7 +3054,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Otomatik yenilemede tren boyutunun artması gerekiyorsa vagonları kaldır(en önden başlayarak yeterli sayıda vagon silinir).
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}DeÄŸiÅŸtiriyor: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} DENEYSEL ÖZELLiK {}Lokomotif ve vagon değişimi pencereleri arasında geçiş yap.{}Vagon değişimi sadece yeni vagon eskisinin taşıdığı türde yükü taşıyabiliyorsa yapılir. Değiştirme işlemi sırasında tüm vagonlar için bu durum kontrol edilir.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Lokomotif alınamaz
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Tren kullanılamaz
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Araba kullanılamaz
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Gemi kullanılamaz
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Uçak kullanılamaz
 
 STR_ENGINES                                                     :Lokomotifler
 STR_WAGONS                                                      :Vagon
@@ -3133,3 +3192,49 @@
 STR_DATE_LONG                                                   :{STRING} {STRING} {NUM}
 
 ########
+
+STR_FEEDER_CARGO_VALUE                                          :{BLACK}Aktarma Maliyeti: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...bu yol belediyeye ait
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...yol yanlış yönde
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Şeffaflık Seçenekleri
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Durak tabelaları için şeffaflık
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Ağaçlar için şeffaflık
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Evler için şeffaflık
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Fabrikalar için şeffaflık
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}İstasyonlar, garajlar tershaneler vb. için şeffaflık
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Köprüler için şeffaflık
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Antenler ve deniz fenerleri için şeffaflık
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Grup {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :Bütün trenler
+STR_GROUP_ALL_ROADS                                             :Bütün arabalar
+STR_GROUP_ALL_SHIPS                                             :Bütün Gemiler
+STR_GROUP_ALL_AIRCRAFTS                                         :Bütün uçaklar
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Bütün paylaşılan araçlar
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :Bütün araçları çıkar
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} Tren
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} Araba
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} Gemi
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} Uçak
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Grubun ismini deÄŸiÅŸtir
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}"{GROUP}"  Araçlarını Değiştir
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Grup oluşturulamıyor...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Bu grup silinemiyor...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Grubun ismi deÄŸiÅŸtirilemiyor...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Bu gruptaki bütün araçlar çıkartılamıyor...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Araç bu gruba eklenemiyor...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Paylaşılan araçlar bu gruba eklenemiyor...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Gruplar - Gruba ait araçları listelemek için grubun üzerine tıklayın
+STR_GROUP_CREATE_TIP                                            :{BLACK}Grup oluşturmak için tıklayın
+STR_GROUP_DELETE_TIP                                            :{BLACK}Seçili grubu sil
+STR_GROUP_RENAME_TIP                                            :{BLACK}Seçili grubun ismini değiştir
+
+
+########
--- a/src/lang/ukrainian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/ukrainian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -5,6 +5,8 @@
 ##case r d z
 ##gender m f s mn
 
+#
+
 ##id 0x0000
 STR_NULL                                                        :
 STR_0001_OFF_EDGE_OF_MAP                                        :{WHITE}За межами карти
@@ -877,6 +879,7 @@
 STR_02A1_SMALL                                                  :{BLACK}Мале
 STR_02A2_MEDIUM                                                 :{BLACK}Середнє
 STR_02A3_LARGE                                                  :{BLACK}Велике
+STR_SCENARIO_EDITOR_CITY                                        :{BLACK}МіÑто
 STR_02A4_SELECT_TOWN_SIZE                                       :{BLACK}Вибір розміру міÑта
 STR_02A5_TOWN_SIZE                                              :{YELLOW}Розмір міÑта:
 
@@ -928,6 +931,7 @@
 STR_02DE_MAP_OF_WORLD                                           :Карта Ñвіту
 STR_EXTRA_VIEW_PORT                                             :Додаткове вікно
 STR_SIGN_LIST                                                   :СпиÑок позначень
+STR_TRANSPARENCY_OPTIONS                                        :Опції прозороÑÑ‚Ñ–
 STR_02DF_TOWN_DIRECTORY                                         :СпиÑок міÑÑ‚
 STR_TOWN_POPULATION                                             :{BLACK}ÐаÑÐµÐ»ÐµÐ½Ð½Ñ Ñвіту: {COMMA}
 STR_EXTRA_VIEW_PORT_TITLE                                       :{WHITE}Вікно {COMMA}
@@ -1170,6 +1174,7 @@
 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_ADJACENT_STATIONS                            :{LTBLUE}Дозволити будувати Ñуміжні Ñтанції: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_SMALL_AIRPORTS                               :{LTBLUE}Будувати малі аеропорти можна завжди: {ORANGE}{STRING}
 
@@ -1210,6 +1215,7 @@
 STR_CONFIG_PATCHES_SERVICEATHELIPAD                             :{LTBLUE}Ðвтоматичний техоглÑд гелікоптерів на площадках: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR                       :{LTBLUE}Включити меню рельєфу до меню будуваннÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REVERSE_SCROLLING                            :{LTBLUE}Протилежний напрÑмок прокрутки: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING                             :{LTBLUE}Плавна прокрутка у вікні: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MEASURE_TOOLTIP                              :{LTBLUE}Показувати розміри будівництва в підказці: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES                                     :{LTBLUE}Показати кольори компаній: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_LIVERIES_NONE                                :Жодна
@@ -1221,6 +1227,8 @@
 STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL                           :Прокрутка карти
 STR_CONFIG_PATCHES_SCROLLWHEEL_OFF                              :Відкл.
 STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER                       :{LTBLUE}ШвидкіÑÑ‚ÑŒ прокрутки колеÑом миші: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME                            :{LTBLUE}Ðвтоматично Ñтавити паузу при Ñтарті нової гри: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS                       :{LTBLUE}ВикориÑтовувати покращений ÑпиÑок транÑпорту: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_MAX_TRAINS                                   :{LTBLUE}МакÑ. поїздів у гравцÑ: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAX_ROADVEH                                  :{LTBLUE}МакÑ. авто у гравцÑ: {ORANGE}{STRING}
@@ -1254,12 +1262,30 @@
 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_TOWN_LAYOUT_INVALID                          :{WHITE}Схема міÑта "не треба більше доріг" недійÑна у редакторі Ñценаріїв
+STR_CONFIG_PATCHES_TOWN_LAYOUT                                  :{LTBLUE}Виберіть Ñхему доріг у міÑÑ‚Ñ–: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS                         :не треба більше доріг
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT                          :Ñтандартна
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS                     :кращі дороги
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID                         :Ñітка 2x2
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID                         :Ñітка 3x3
+
 STR_CONFIG_PATCHES_TOOLBAR_POS                                  :{LTBLUE}ÐŸÐ¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð³Ð¾ меню: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT                             :Ліворуч
 STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER                           :По центру
 STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT                            :Праворуч
 STR_CONFIG_PATCHES_SNAP_RADIUS                                  :{LTBLUE}Ð Ð°Ð´Ñ–ÑƒÑ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½: {ORANGE}{STRING} пікÑ.
 STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED                         :{LTBLUE}ÐŸÑ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð½Ñ Ð²Ñ–ÐºÐ¾Ð½ {ORANGE}вимкнено
+STR_CONFIG_PATCHES_TOWN_GROWTH                                  :{LTBLUE}ШвидкіÑÑ‚ÑŒ роÑту міÑта: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE                             :Ðемає
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW                             :Повільна
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL                           :СереднÑ
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST                             :Швидка
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST                        :Дуже швидка
+STR_CONFIG_PATCHES_LARGER_TOWNS                                 :{LTBLUE}КількіÑÑ‚ÑŒ міÑÑ‚, Ñкі будуть роÑти вдвічі швидше: {ORANGE}1 з {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED                        :{LTBLUE}КількіÑÑ‚ÑŒ міÑÑ‚, Ñкі будуть роÑти вдвічі швидше: {ORANGE}нема
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER                         :{LTBLUE}Початковий коефіцієнт розміру міÑÑ‚: {ORANGE}{STRING}
 
 STR_CONFIG_PATCHES_GUI                                          :{BLACK}ВиглÑд
 STR_CONFIG_PATCHES_CONSTRUCTION                                 :{BLACK}Споруди
@@ -1690,6 +1716,7 @@
 STR_RAILROAD_TRACK_WITH_PRESIGNALS                              :ÐšÐ¾Ð»Ñ–Ñ Ð· вхідними Ñигналами
 STR_RAILROAD_TRACK_WITH_EXITSIGNALS                             :ÐšÐ¾Ð»Ñ–Ñ Ð· вихідними Ñигналами
 STR_RAILROAD_TRACK_WITH_COMBOSIGNALS                            :ÐšÐ¾Ð»Ñ–Ñ Ð· комбінованими Ñигналами
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST                           :{WHITE}Спочатку потрібно знеÑти залізничну Ñтанцію
 
 
 
@@ -1697,22 +1724,39 @@
 STR_1801_MUST_REMOVE_ROAD_FIRST                                 :{WHITE}Спочатку зруйнуйте дорогу
 STR_ROAD_WORKS_IN_PROGRESS                                      :{WHITE}Дорога ремонтуєтьÑÑ
 STR_1802_ROAD_CONSTRUCTION                                      :{WHITE}Будівництво дороги
+STR_1802_TRAMWAY_CONSTRUCTION                                   :{WHITE}Будівництво трамвайної колії
 STR_1803_SELECT_ROAD_BRIDGE                                     :{WHITE}Виберіть дорожний міÑÑ‚
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION                        :{WHITE}... одноÑторонні дороги не можуть перетинатиÑÑŒ
 STR_1804_CAN_T_BUILD_ROAD_HERE                                  :{WHITE}Ðеможливо тут побудувати дорогу ...
+STR_1804_CAN_T_BUILD_TRAMWAY_HERE                               :{WHITE}Тут не можна побудувати трамвайну колію...
 STR_1805_CAN_T_REMOVE_ROAD_FROM                                 :{WHITE}Ðеможливо прибрати дорогу звідÑи...
+STR_1805_CAN_T_REMOVE_TRAMWAY_FROM                              :{WHITE}Ðе можна прибрати трамвайну колію звідÑи...
 STR_1806_ROAD_DEPOT_ORIENTATION                                 :{WHITE}ÐžÑ€Ñ–Ñ”Ð½Ñ‚Ð°Ñ†Ñ–Ñ Ð´ÐµÐ¿Ð¾
+STR_1806_TRAM_DEPOT_ORIENTATION                                 :{WHITE}ÐžÑ€Ñ–Ñ”Ð½Ñ‚Ð°Ñ†Ñ–Ñ Ñ‚Ñ€Ð°Ð¼Ð²Ð°Ð¹Ð½Ð¾Ð³Ð¾ депо
 STR_1807_CAN_T_BUILD_ROAD_VEHICLE                               :{WHITE}Ðеможливо будувати депо тут...
+STR_1807_CAN_T_BUILD_TRAM_VEHICLE                               :{WHITE}Тут не можна побудувати трамвайне депо...
 STR_1808_CAN_T_BUILD_BUS_STATION                                :{WHITE}Ðеможливо будувати зупинку тут...
 STR_1809_CAN_T_BUILD_TRUCK_STATION                              :{WHITE}Ðеможливо будувати вантажну Ñтанцію тут...
+STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION                     :{WHITE}Ðе можна побудувати паÑажирÑьку трамвайну Ñтанцію...
+STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION                         :{WHITE}Ðе можна побудувати вантажну трамвайну Ñтанцію...
 STR_180A_ROAD_CONSTRUCTION                                      :Будувати дороги
+STR_180A_TRAMWAY_CONSTRUCTION                                   :Будівництво трамвайної колії
 STR_180B_BUILD_ROAD_SECTION                                     :{BLACK}Будувати дорогу
+STR_180B_BUILD_TRAMWAY_SECTION                                  :{BLACK}Будувати трамвайну колію
 STR_180C_BUILD_ROAD_VEHICLE_DEPOT                               :{BLACK}Будувати автомобільне депо
+STR_180C_BUILD_TRAM_VEHICLE_DEPOT                               :{BLACK}Будувати трамвайне депо (Ð´Ð»Ñ Ð±ÑƒÐ´Ñ–Ð²Ð½Ð¸Ñ†Ñ‚Ð²Ð° та обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð¼Ð²Ð°Ñ—Ð²)
 STR_180D_BUILD_BUS_STATION                                      :{BLACK}Будувати зупинку
 STR_180E_BUILD_TRUCK_LOADING_BAY                                :{BLACK}Будувати вантажну Ñтанцію
+STR_180D_BUILD_PASSENGER_TRAM_STATION                           :{BLACK}Побудувати паÑажирÑьку трамвайну Ñтанцію
+STR_180E_BUILD_CARGO_TRAM_STATION                               :{BLACK}Побудувати вантажну трамвайну Ñтанцію
 STR_180F_BUILD_ROAD_BRIDGE                                      :{BLACK}Будувати міÑÑ‚
+STR_180F_BUILD_TRAMWAY_BRIDGE                                   :{BLACK}Побудувати трамвайний міÑÑ‚
 STR_1810_BUILD_ROAD_TUNNEL                                      :{BLACK}Будувати тунель
+STR_1810_BUILD_TRAMWAY_TUNNEL                                   :{BLACK}Побудувати трамвайний тунель
 STR_1811_TOGGLE_BUILD_REMOVE_FOR                                :{BLACK}Будувати/зруйнувати дорогу
+STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS                       :{BLACK}Будувати/демонтувати колію
 STR_1813_SELECT_ROAD_VEHICLE_DEPOT                              :{BLACK}Виберіть Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´ÐµÐ¿Ð¾
+STR_1813_SELECT_TRAM_VEHICLE_DEPOT                              :{BLACK}Виберіть орієнтацію трамвайного депо
 STR_1814_ROAD                                                   :Дорога
 STR_1815_ROAD_WITH_STREETLIGHTS                                 :Дорога з вуличними ліхтарÑми
 STR_1816_TREE_LINED_ROAD                                        :Дорога з наÑадженнÑми
@@ -1720,6 +1764,8 @@
 STR_1818_ROAD_RAIL_LEVEL_CROSSING                               :Залізничний переїзд
 STR_CAN_T_REMOVE_BUS_STATION                                    :{WHITE}Ðе можна знеÑти автобуÑну Ñтанцію...
 STR_CAN_T_REMOVE_TRUCK_STATION                                  :{WHITE}Ðе можна знеÑти грузову Ñтанцію...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION                         :{WHITE}Ðе можна знеÑти паÑажирÑьку трамвайну Ñтанцію...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION                             :{WHITE}Ðе можна знеÑти вантажну трамвайну Ñтанцію...
 
 ##id 0x2000
 STR_2000_TOWNS                                                  :{WHITE}МіÑта
@@ -1884,8 +1930,12 @@
 STR_3041_NOW_ACCEPTS_AND                                        :{WHITE}{STATION} тепер приймає {STRING} і {STRING}
 STR_3042_BUS_STATION_ORIENTATION                                :{WHITE}ÐžÑ€Ñ–Ñ”Ð½Ñ‚Ð°Ñ†Ñ–Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ¸
 STR_3043_TRUCK_STATION_ORIENT                                   :{WHITE}ÐžÑ€Ñ–Ñ”Ð½Ñ‚Ð°Ñ†Ñ–Ñ Ñтанції
+STR_3042_PASSENGER_TRAM_STATION_ORIENTATION                     :{WHITE}ÐžÑ€Ñ–Ñ”Ð½Ñ‚Ð°Ñ†Ñ–Ñ Ð¿Ð°ÑажирÑької трамвайної Ñтанції
+STR_3043_CARGO_TRAM_STATION_ORIENT                              :{WHITE}ÐžÑ€Ñ–Ñ”Ð½Ñ‚Ð°Ñ†Ñ–Ñ Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð½Ð¾Ñ— трамвайної Ñтанції
 STR_3046_MUST_DEMOLISH_BUS_STATION                              :{WHITE}Спочатку зруйнуйте зупинку
 STR_3047_MUST_DEMOLISH_TRUCK_STATION                            :{WHITE}Спочатку зруйнуйте вантажну Ñтанцію
+STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION                   :{WHITE}Спочатку треба знеÑти паÑажирÑьку трамвайну Ñтанцію
+STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION                       :{WHITE}Спочатку треба знеÑти вантажну трамвайну Ñтанцію
 STR_3048_STATIONS                                               :{WHITE}{COMPANY} - {COMMA} Ñтанці{P Ñ Ñ— й}
 STR_3049_0                                                      :{YELLOW}{STATION} {STATIONFEATURES}
 STR_304A_NONE                                                   :{YELLOW}- нема -
@@ -1897,6 +1947,8 @@
 STR_3050_SELECT_LENGTH_OF_RAILROAD                              :{BLACK}Виберіть довжину залізничної Ñтанції
 STR_3051_SELECT_BUS_STATION_ORIENTATION                         :{BLACK}Виберіть орієнтацію зупинки
 STR_3052_SELECT_TRUCK_LOADING_BAY                               :{BLACK}Виберіть орієнтацію вантажної Ñтанції
+STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION              :{BLACK}Виберіть орієнтацію паÑажирÑької трамвайної Ñтанції
+STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION                  :{BLACK}Виберіть орієнтацію вантажної трамвайної Ñтанції
 STR_3053_CENTER_MAIN_VIEW_ON_STATION                            :{BLACK}Показати Ñтанцію в центрі екрану
 STR_3054_SHOW_STATION_RATINGS                                   :{BLACK}Показати рейтинг Ñтанції
 STR_3055_CHANGE_NAME_OF_STATION                                 :{BLACK}Перейменувати Ñтанцію
@@ -2154,6 +2206,8 @@
 STR_SV_STNAME_HELIPORT                                          :{STRING} ГелМайданчик
 STR_SV_STNAME_FOREST                                            :{STRING} ЛіÑ
 
+STR_SV_GROUP_NAME                                               :{GROUP}
+
 ############ end of savegame specific region!
 
 ##id 0x6800
@@ -2189,6 +2243,7 @@
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Ðема
+STR_NUM_VERY_LOW                                                :дуже мало
 STR_6816_LOW                                                    :МалО
 STR_6817_NORMAL                                                 :Ðормально
 STR_6818_HIGH                                                   :Багато
@@ -2381,6 +2436,8 @@
 STR_LIVERY_HELICOPTER                                           :Гелікоптер
 STR_LIVERY_SMALL_PLANE                                          :Малий літак
 STR_LIVERY_LARGE_PLANE                                          :Великий літак
+STR_LIVERY_PASSENGER_TRAM                                       :ПаÑажирÑький трамвай
+STR_LIVERY_FREIGHT_TRAM                                         :Вантажний трамвай
 
 STR_LIVERY_GENERAL_TIP                                          :{BLACK}Показати оÑновні кольорові Ñхеми
 STR_LIVERY_TRAIN_TIP                                            :{BLACK}Показати кольорову Ñхему поїздів
@@ -2854,6 +2911,8 @@
 STR_902E_NAME_ROAD_VEHICLE                                      :{BLACK}Ðазвати авто
 STR_902F_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жителі ÑвÑткують . . .{}Перший Ð°Ð²Ñ‚Ð¾Ð±ÑƒÑ Ð·'ÑвивÑÑ Ð½Ð° {STATION}!
 STR_9030_CITIZENS_CELEBRATE_FIRST                               :{BLACK}{BIGFONT}Жителі ÑвÑткують . . .{}Перша вантажівка з'ÑвилаÑÑ Ð½Ð° {STATION}!
+STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Жителі ÑвÑткують . . .{}Перший паÑажирÑький трамвай прибув на {STATION}!
+STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM                          :{BLACK}{BIGFONT}Жителі ÑвÑткують . . .{}Перший вантажний трамвай прибув на {STATION}!
 STR_9031_ROAD_VEHICLE_CRASH_DRIVER                              :{BLACK}{BIGFONT}ÐваріÑ!{}Водій загинув при зіткненні авто з поїздом
 STR_9032_ROAD_VEHICLE_CRASH_DIE                                 :{BLACK}{BIGFONT}ÐваріÑ!{}{COMMA} загинуло при зіткненні авто з поїздом
 STR_9033_CAN_T_MAKE_VEHICLE_TURN                                :{WHITE}Ðеможливо розвернути авто...
@@ -3138,6 +3197,7 @@
 
 ### depot strings
 STR_DEPOT_SELL_CONFIRMATION_TEXT                                :{YELLOW}Ви впевнені, що хочете продати уÑÑ– машини в депо?
+STR_DEPOT_WRONG_DEPOT_TYPE                                      :Ðеправильний тип депо
 
 STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP                             :{BLACK}Продати вÑÑ– поїзди з депо
 STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP                           :{BLACK}Продати вÑÑ– автомобілі з депо
@@ -3175,7 +3235,10 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Дозволити автооновленню видалÑти вагони зберігаючи довжину потÑгу(починаючи Ñпереду), Ñкщо Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¸Ñ‚ÑŒ поїзд довшим.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}ОновленнÑ: {ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK} ЕКСПЕРИМЕÐТÐЛЬÐО {}ÐŸÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ вікнами заміни потÑгів та вагонів.{}Ðвтозаміна потÑгів відбудетьÑÑ Ð»Ð¸ÑˆÐµ в тому випадку, Ñкщо Ñпівпаде тип вантажу що перевозитьÑÑ. Ð¦Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ° проводитьÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ вагону під Ñ‡Ð°Ñ Ð°Ð²Ñ‚Ð¾Ð·Ð°Ð¼Ñ–Ð½Ð¸.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}потÑг неможливо побудувати
+STR_RAIL_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Поїзд недоÑтупний
+STR_ROAD_VEHICLE_NOT_AVAILABLE                                  :{WHITE}Ðвтомобіль недоÑтупний
+STR_SHIP_NOT_AVAILABLE                                          :{WHITE}Корабель недоÑтупний
+STR_AIRCRAFT_NOT_AVAILABLE                                      :{WHITE}Літак недоÑтупний
 
 STR_ENGINES                                                     :ПотÑги
 STR_WAGONS                                                      :Вагони
@@ -3251,6 +3314,8 @@
 STR_START_DATE_QUERY_CAPT                                       :{WHITE}Змінити рік початку гри
 STR_HEIGHTMAP_SCALE_WARNING_CAPTION                             :{WHITE}Завелике значеннÑ
 STR_HEIGHTMAP_SCALE_WARNING_MESSAGE                             :{YELLOW}Розміри дуже великі. Продовжити генерацію?
+STR_TOWN_LAYOUT_WARNING_CAPTION                                 :{WHITE}ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ñхему міÑта
+STR_TOWN_LAYOUT_WARNING_MESSAGE                                 :{YELLOW}Схема міÑта "не треба більше доріг" небажана. Продовжити генерацію?
 STR_SNOW_LINE_HEIGHT_NUM                                        :{NUM}
 STR_HEIGHTMAP_NAME                                              :{BLACK}Ім'Ñ Ñ€ÐµÐ»ÑŒÑ”Ñ„Ð°:
 STR_HEIGHTMAP_SIZE                                              :{BLACK}Розмір: {ORANGE}{NUM} x {NUM}
@@ -3312,3 +3377,52 @@
 ########
 
 STR_FEEDER_CARGO_VALUE                                          :{BLACK}Плата за транÑфер: {LTBLUE}{CURRENCY}
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD                            :{WHITE}...Ñ†Ñ Ð´Ð¾Ñ€Ð¾Ð³Ð° у влаÑноÑÑ‚Ñ– міÑта
+STR_DRIVE_THROUGH_ERROR_DIRECTION                               :{WHITE}...дорога не в тому напрÑмку
+
+STR_TRANSPARENCY_TOOLB                                          :{WHITE}Опції прозороÑÑ‚Ñ–
+STR_TRANSPARENT_SIGNS_DESC                                      :{BLACK}Переключити прозоріÑÑ‚ÑŒ Ð´Ð»Ñ Ð·Ð½Ð°ÐºÑ–Ð² Ñтанцій
+STR_TRANSPARENT_TREES_DESC                                      :{BLACK}Переключити прозоріÑÑ‚ÑŒ Ð´Ð»Ñ Ð´ÐµÑ€ÐµÐ²
+STR_TRANSPARENT_HOUSES_DESC                                     :{BLACK}Переключити прозоріÑÑ‚ÑŒ Ð´Ð»Ñ Ð±ÑƒÐ´Ð¸Ð½ÐºÑ–Ð²
+STR_TRANSPARENT_INDUSTRIES_DESC                                 :{BLACK}Переключити прозоріÑÑ‚ÑŒ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¼Ð¸ÑловоÑÑ‚Ñ–
+STR_TRANSPARENT_BUILDINGS_DESC                                  :{BLACK}Переключити прозоріÑÑ‚ÑŒ Ð´Ð»Ñ Ñпоруд, таких Ñк Ñтанції, депо, ЛЕП тощо
+STR_TRANSPARENT_BRIDGES_DESC                                    :{BLACK}Переключити прозоріÑÑ‚ÑŒ Ð´Ð»Ñ Ð¼Ð¾Ñтів
+STR_TRANSPARENT_STRUCTURES_DESC                                 :{BLACK}Переключити прозоріÑÑ‚ÑŒ Ð´Ð»Ñ Ñпоруд, таких Ñк маÑки та антенни (може, потім)
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT                                           :Група {COMMA}
+STR_GROUP_TINY_NAME                                             :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS                                            :УÑÑ– поїзди
+STR_GROUP_ALL_ROADS                                             :УÑÑ– авто
+STR_GROUP_ALL_SHIPS                                             :УÑÑ– кораблі
+STR_GROUP_ALL_AIRCRAFTS                                         :УÑÑ– літаки
+STR_GROUP_TINY_NUM                                              :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE                                    :Добавити Ñпільний транÑпорт
+STR_GROUP_REMOVE_ALL_VEHICLES                                   :ПозбутиÑÑ Ð²Ñього транÑпорту
+
+STR_GROUP_TRAINS_CAPTION                                        :{WHITE}{GROUP} - {COMMA} поїзд{P "" и ів}
+STR_GROUP_ROADVEH_CAPTION                                       :{WHITE}{GROUP} - {COMMA} автомобіл{P ь і ів}
+STR_GROUP_SHIPS_CAPTION                                         :{WHITE}{GROUP} - {COMMA} кораб{P ель лі лів}
+STR_GROUP_AIRCRAFTS_CAPTION                                     :{WHITE}{GROUP} - {COMMA} літак{P "" и ів}
+STR_GROUP_RENAME_CAPTION                                        :{BLACK}Перейменувати групу
+STR_GROUP_REPLACE_CAPTION                                       :{WHITE}Замінити транÑпорт групи "{GROUP}"
+
+STR_GROUP_CAN_T_CREATE                                          :{WHITE}Ðе можна Ñтворити групу...
+STR_GROUP_CAN_T_DELETE                                          :{WHITE}Ðе можна Ñтерти групу...
+STR_GROUP_CAN_T_RENAME                                          :{WHITE}Ðе можна перейменувати групу...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES                             :{WHITE}Ðе можна позбутиÑÑ Ð²Ñього транÑпорту цієї групи...
+STR_GROUP_CAN_T_ADD_VEHICLE                                     :{WHITE}Ðе можна додати цей транÑпорт у групу...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE                              :{WHITE}Ðе можна додати Ñпільний транÑпорт у групу...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP                               :{BLACK}Групи - клікніть на групі, щоб побачити ÑпиÑок транÑпорту цієї групи
+STR_GROUP_CREATE_TIP                                            :{BLACK}Клікніть, щоб Ñтворити групу
+STR_GROUP_DELETE_TIP                                            :{BLACK}Стерти вибрану групу
+STR_GROUP_RENAME_TIP                                            :{BLACK}Перейменувати вибрану групу
+STR_GROUP_REPLACE_PROTECTION_TIP                                :{BLACK}Клікніть, щоб захиÑтити групу від глобальної автозаміни
+
+STR_PROFIT_GOOD_THIS_YEAR_GOOD_LAST_YEAR                        :{TINYFONT}{BLACK}Прибуток цього року: {GREEN}{CURRENCY} {BLACK}(торік: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_GOOD_LAST_YEAR                         :{TINYFONT}{BLACK}Прибуток цього року: {RED}{CURRENCY} {BLACK}(торік: {GREEN}{CURRENCY}{BLACK})
+STR_PROFIT_GOOD_THIS_YEAR_BAD_LAST_YEAR                         :{TINYFONT}{BLACK}Прибуток цього року: {GREEN}{CURRENCY} {BLACK}(торік: {RED}{CURRENCY}{BLACK})
+STR_PROFIT_BAD_THIS_YEAR_BAD_LAST_YEAR                          :{TINYFONT}{BLACK}Прибуток цього року: {RED}{CURRENCY} {BLACK}(торік: {RED}{CURRENCY}{BLACK})
+
+########
--- a/src/lang/unfinished/afrikaans.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/unfinished/afrikaans.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -2796,7 +2796,6 @@
 
 STR_NOT_REPLACING                                               :{BLACK}Word nie vervang nie
 STR_NOT_REPLACING_VEHICLE_SELECTED                              :{BLACK}Geen voertuig gekies
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Enjin is nie boubaar nie
 
 STR_ENGINES                                                     :Enjine
 
--- a/src/lang/unfinished/croatian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/unfinished/croatian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -2781,7 +2781,6 @@
 STR_REPLACE_REMOVE_WAGON_HELP                                   :{BLACK}Neka automatska zamijena drži dužinu vlaka istom briÅ¡ući vagone(poÄevÅ¡i od naprijed), ako bi zamijena lokomotive vlak uÄinila dužim.
 STR_REPLACE_ENGINE_WAGON_SELECT                                 :{BLACK}Zamjenjujem:{ORANGE}{SKIP}{SKIP}{STRING}
 STR_REPLACE_ENGINE_WAGON_SELECT_HELP                            :{BLACK}EXPERIMENTALNA FUNKCIJA {} Prebaci između prozora za izmjenu lokomotiva i vagona.{}Izmjena vagona će se izvršiti samo ako novi vagon može biti prenamijenjen za prijevoz istog tipa tereta kao i stari vagon. Ovo se provjerava za svaki vagon kada se stvarna zamjena odvija.
-STR_ENGINE_NOT_BUILDABLE                                        :{WHITE}Lokomotiva se nemože izgraditi
 
 STR_ENGINES                                                     :Lokomotive
 STR_WAGONS                                                      :Vagoni
--- a/src/lang/unfinished/frisian.txt	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/lang/unfinished/frisian.txt	Sat Jun 02 19:59:29 2007 +0000
@@ -232,8 +232,10 @@
 STR_0140_NEW_GAME                                               :{BLACK}Nei Spul
 STR_0141_LOAD_GAME                                              :{BLACK}Laad Spul
 
+STR_64                                                          :64
 STR_128                                                         :128
 STR_256                                                         :256
+STR_512                                                         :512
 STR_1024                                                        :1024
 STR_2048                                                        :2048
 STR_0148_GAME_OPTIONS                                           :{BLACK}Spul Opsjes
@@ -461,20 +463,16 @@
 STR_021B_ACHIEVES_STATUS                                        :{BLACK}{BIGFONT}{COMPANY} behellet '{STRING}' status!
 STR_021C_OF_ACHIEVES_STATUS                                     :{WHITE}{BIGFONT}{PLAYERNAME} fan {COMPANY} behellet '{STRING}' status!
 STR_021F                                                        :{BLUE}{COMMA}
-STR_0220_CREATE_SCENARIO                                        :{BLACK}Meitsje Lânskip
 STR_0221_OPENTTD                                                :{YELLOW}OpenTTD
 STR_0222_SCENARIO_EDITOR                                        :{YELLOW}Lânskip Ferbouer
 STR_0223_LAND_GENERATION                                        :{WHITE}Lân Generaasje
 STR_0224                                                        :{BLACK}{UPARROW}
 STR_0225                                                        :{BLACK}{DOWNARROW}
-STR_0226_RANDOM_LAND                                            :{BLACK}Samar wat lân
-STR_0227_RESET_LAND                                             :{BLACK}Set lân werom
 STR_0228_INCREASE_SIZE_OF_LAND_AREA                             :{BLACK}Fergrutsje gebiet om te ferheegjen/ferleegjen
 STR_0229_DECREASE_SIZE_OF_LAND_AREA                             :{BLACK}Ferlyts gebiet om te ferheegjen/ferleegjen
 STR_022A_GENERATE_RANDOM_LAND                                   :{BLACK}Meitsje samar wat lân
 STR_022B_RESET_LANDSCAPE                                        :{BLACK}Set it lânskip werom
 STR_022C_RESET_LANDSCAPE                                        :{WHITE}Lânskip weromsette
-STR_022D_ARE_YOU_SURE_YOU_WANT_TO                               :{WHITE}Bist der wis fan dast it lânskip weromsette wolst?
 STR_022E_LANDSCAPE_GENERATION                                   :{BLACK}Lânskip generaasje
 STR_022F_TOWN_GENERATION                                        :{BLACK}Stêd generaasje
 STR_0230_INDUSTRY_GENERATION                                    :{BLACK}Yndustry generaasje
@@ -1099,8 +1097,26 @@
 STR_482F_COST                                                   :{BLACK}Kostet: {YELLOW}{CURRENCY}
 
 ##id 0x5000
+STR_5006_MUST_DEMOLISH_TUNNEL_FIRST                             :{WHITE}Tunnel mat earst fuorthelle wurde
+STR_5007_MUST_DEMOLISH_BRIDGE_FIRST                             :{WHITE}Brêge mat earst fuorthelle wurde
+STR_5008_CANNOT_START_AND_END_ON                                :{WHITE}Begjin en ein kin net op itselde plak wêze
+STR_500A_START_AND_END_MUST_BE_IN                               :{WHITE}Begjin en ein mat yn ien lijn wêze
+STR_500D                                                        :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
+STR_5012_WOODEN                                                 :Hout
+STR_5013_CONCRETE                                               :Beton
+STR_5014_TUBULAR_STEEL                                          :Buis, Stiel
+STR_5015_CAN_T_BUILD_BRIDGE_HERE                                :{WHITE}Kin hjir gjin brêge bouwe...
+STR_5016_CAN_T_BUILD_TUNNEL_HERE                                :{WHITE}Kin hjir gjin tunnel bouwe...
+STR_5017_RAILROAD_TUNNEL                                        :Spoartunnel
+STR_501F_WOODEN_RAIL_BRIDGE                                     :Houten spoarbrêge
+STR_5020_CONCRETE_RAIL_BRIDGE                                   :Betonnen spoarbrêge
 
 ##id 0x5800
+STR_5800_OBJECT_IN_THE_WAY                                      :{WHITE}Objekt yn it paad
+STR_5801_TRANSMITTER                                            :Sendmast
+STR_5802_LIGHTHOUSE                                             :Fjoertoer
+STR_5806_CAN_T_PURCHASE_THIS_LAND                               :{WHITE}Kin dit stikje lân net keapje...
+STR_5807_YOU_ALREADY_OWN_IT                                     :{WHITE}...it is al fan dy!
 
 
 ############ WARNING, using range 0x6000 for strings that are stored in the savegame
@@ -1113,14 +1129,93 @@
 ##id 0x6800
 
 ############ range for difficulty levels starts
+STR_6801_EASY                                                   :{BLACK}Maklik
+STR_6802_MEDIUM                                                 :{BLACK}Gewoan
 ############ range for difficulty levels ends
 
 ############ range for difficulty settings starts
+STR_6805_MAXIMUM_NO_COMPETITORS                                 :{LTBLUE}Maksimum oantal tsjinstanders: {ORANGE}{COMMA}
+STR_6806_COMPETITOR_START_TIME                                  :{LTBLUE}Tsjinstander begjint: {ORANGE}{STRING}
+STR_6807_NO_OF_TOWNS                                            :{LTBLUE}Oantal stêden: {ORANGE}{STRING}
+STR_6808_NO_OF_INDUSTRIES                                       :{LTBLUE}Oantal yndustrieen: {ORANGE}{STRING}
+STR_680C_CONSTRUCTION_SPEED_OF_COMPETITOR                       :{LTBLUE}Konstruksjesnelhyd fan tsjinstanders: {ORANGE}{STRING}
+STR_6810_COST_OF_CONSTRUCTION                                   :{LTBLUE}Konstruksjekosten: {ORANGE}{STRING}
+STR_6811_TERRAIN_TYPE                                           :{LTBLUE}Terreinsoart: {ORANGE}{STRING}
+STR_6813_ECONOMY                                                :{LTBLUE}Ekonomy: {ORANGE}{STRING}
 ############ range for difficulty settings ends
 
 STR_26816_NONE                                                  :Gjin
+STR_6816_LOW                                                    :Leech
+STR_6817_NORMAL                                                 :Gewoan
+STR_6818_HIGH                                                   :Heech
+STR_6819                                                        :{BLACK}{SMALLLEFTARROW}
+STR_681A                                                        :{BLACK}{SMALLRIGHTARROW}
+STR_681B_VERY_SLOW                                              :Hiel dreech
+STR_681C_SLOW                                                   :Dreech
+STR_681D_MEDIUM                                                 :Gewoan
+STR_681E_FAST                                                   :Hurd
+STR_681F_VERY_FAST                                              :Hiel hurd
+STR_6820_LOW                                                    :Leech
+STR_6821_MEDIUM                                                 :Gewoan
+STR_6822_HIGH                                                   :Heech
+STR_6823_NONE                                                   :Gjin
+STR_6824_REDUCED                                                :Minder
+STR_6825_NORMAL                                                 :Gewoan
+STR_6826_X1_5                                                   :x1.5
+STR_6827_X2                                                     :x2
+STR_6828_X3                                                     :x3
+STR_6829_X4                                                     :x4
+STR_682A_VERY_FLAT                                              :Hiel Flak
+STR_682B_FLAT                                                   :Flak
+STR_682D_MOUNTAINOUS                                            :Bergachtich
+STR_682F_FLUCTUATING                                            :Wikseljend
+STR_6830_IMMEDIATE                                              :Fuortendaliks
+STR_6831_3_MONTHS_AFTER_PLAYER                                  :3 moannen nei spyler
+STR_6832_6_MONTHS_AFTER_PLAYER                                  :6 moannen nei spyler
+STR_6833_9_MONTHS_AFTER_PLAYER                                  :9 moannen nei spyler
+STR_6836_OFF                                                    :Ut
+STR_6837_ON                                                     :Oan
 
 ##id 0x7000
+STR_7000                                                        :
+STR_7001                                                        :{WHITE}{COMPANY} {BLACK}{PLAYERNAME}
+STR_7002_PLAYER                                                 :(Spyler {COMMA})
+STR_7004_NEW_FACE                                               :{BLACK}Nei Gesicht
+STR_7005_COLOR_SCHEME                                           :{BLACK}Kleurenskema
+STR_7006_COLOR_SCHEME                                           :{GOLD}Kleurenskema:
+STR_7007_NEW_COLOR_SCHEME                                       :{WHITE}Nei Kleurenskema
+STR_700E_FINANCES                                               :{WHITE}{COMPANY} Finansieen {BLACK}{PLAYERNAME}
+STR_700F_EXPENDITURE_INCOME                                     :{WHITE}Utjeften/Ynkomsten
+STR_7010                                                        :{WHITE}{NUM}
+STR_7011_CONSTRUCTION                                           :{GOLD}Konstruksje
+STR_7018_TRAIN_INCOME                                           :{GOLD}Ynkomsten Treinen
+STR_701A_AIRCRAFT_INCOME                                        :{GOLD}Ynkomsten Fleantúgen
+STR_701B_SHIP_INCOME                                            :{GOLD}Ynkomsten Skepen
+STR_701C_LOAN_INTEREST                                          :{GOLD}Rinte Liening
+STR_701D_OTHER                                                  :{GOLD}Oaren
+STR_701E                                                        :{BLACK}-{CURRENCY64}
+STR_701F                                                        :{BLACK}+{CURRENCY64}
+STR_7020_TOTAL                                                  :{WHITE}Totaal:
+STR_7021                                                        :{COMPANY}{PLAYERNAME}
+STR_7022_INCOME_GRAPH                                           :{WHITE}Ynkomsten Grafyk
+STR_7024                                                        :{COMMA}
+STR_7027_LOAN                                                   :{WHITE}Liening
+STR_7028                                                        :{BLACK}{CURRENCY64}
+STR_7029_BORROW                                                 :{BLACK}Lien {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY}
+STR_702A_REPAY                                                  :{BLACK}Betelje {SKIP}{SKIP}{SKIP}{SKIP}{CURRENCY} werom
+STR_702C_CAN_T_BORROW_ANY_MORE_MONEY                            :{WHITE}Kin net mear jild liene
+STR_702E_REQUIRED                                               :{WHITE}...{CURRENCY} nedich
+STR_702F_CAN_T_REPAY_LOAN                                       :{WHITE}Kin liening net werombetelje
+STR_7030_SELECT_NEW_FACE_FOR_PRESIDENT                          :{BLACK}Selektear nei gesicht foar de bedriuwslieder
+STR_7035_INCREASE_SIZE_OF_LOAN                                  :{BLACK}Lien mear jild
+STR_7036_REPAY_PART_OF_LOAN                                     :{BLACK}Betelje in diel fan de liening werom
+STR_7037_PRESIDENT                                              :{WHITE}{PLAYERNAME}{}{GOLD}(Bedriuwslieder)
+STR_7038_INAUGURATED                                            :{GOLD}Oprjochte: {WHITE}{NUM}
+STR_7042_NONE                                                   :{WHITE}Gjin
+STR_7044_MALE                                                   :{BLACK}Man
+STR_7045_FEMALE                                                 :{BLACK}Frou
+STR_7046_NEW_FACE                                               :{BLACK}Nei Gesicht
+STR_704C_KEY                                                    :{BLACK}Kaai
 
 
 
@@ -1135,6 +1230,7 @@
 
 
 
+
 ##id 0x9000
 
 
@@ -1164,6 +1260,7 @@
 
 
 
+
 ### depot strings
 
 
@@ -1194,4 +1291,8 @@
 ############ Tooltip measurment
 
 
+############ Date formatting
+
 ########
+
+
--- a/src/livery.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/livery.h	Sat Jun 02 19:59:29 2007 +0000
@@ -38,6 +38,10 @@
 	LS_SMALL_PLANE,
 	LS_LARGE_PLANE,
 
+	/* Trams (appear on Road Vehicles tab) */
+	LS_PASSENGER_TRAM,
+	LS_FREIGHT_TRAM,
+
 	LS_END
 };
 
--- a/src/macros.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/macros.h	Sat Jun 02 19:59:29 2007 +0000
@@ -82,9 +82,9 @@
 
 
 /* checking more bits. Maybe unneccessary, but easy to use */
-#define HASBITS(x,y) ((x) & (y))
-#define SETBITS(x,y) ((x) |= (y))
-#define CLRBITS(x,y) ((x) &= ~(y))
+#define HASBITS(x, y) ((x) & (y))
+#define SETBITS(x, y) ((x) |= (y))
+#define CLRBITS(x, y) ((x) &= ~(y))
 
 #define GENERAL_SPRITE_COLOR(color) ((color) + PALETTE_RECOLOR_START)
 #define PLAYER_SPRITE_COLOR(owner) (GENERAL_SPRITE_COLOR(_player_colors[owner]))
@@ -98,7 +98,7 @@
 /* Returns x with the first bit that is not zero, counted from the left, set
  * to zero. So, 10110100 returns 10110000, 00000001 returns 00000000, etc.
  */
-#define KILL_FIRST_BIT(x) _ffb_64[(x)+64]
+#define KILL_FIRST_BIT(x) _ffb_64[(x) + 64]
 
 static inline int FindFirstBit2x64(int value)
 {
@@ -133,13 +133,13 @@
 #define HAS_SINGLE_BIT(a) ( ((a) & ((a) - 1)) == 0)
 
 /* [min,max), strictly less than */
-#define IS_BYTE_INSIDE(a,min,max) ((byte)((a)-(min)) < (byte)((max)-(min)))
-#define IS_INT_INSIDE(a,min,max) ((uint)((a)-(min)) < (uint)((max)-(min)))
+#define IS_BYTE_INSIDE(a, min, max) ((byte)((a) - (min)) < (byte)((max) - (min)))
+#define IS_INT_INSIDE(a, min, max) ((uint)((a) - (min)) < (uint)((max) - (min)))
 
 
-#define CHANCE16(a,b) ((uint16)Random() <= (uint16)((65536 * (a)) / (b)))
-#define CHANCE16R(a,b,r) ((uint16)(r=Random()) <= (uint16)((65536 * (a)) / (b)))
-#define CHANCE16I(a,b,v) ((uint16)(v) <= (uint16)((65536 * (a)) / (b)))
+#define CHANCE16(a, b) ((uint16)Random() <= (uint16)((65536 * (a)) / (b)))
+#define CHANCE16R(a, b, r) ((uint16)(r = Random()) <= (uint16)((65536 * (a)) / (b)))
+#define CHANCE16I(a, b, v) ((uint16)(v) <= (uint16)((65536 * (a)) / (b)))
 
 
 #define for_each_bit(_i, _b)            \
--- a/src/main_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/main_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -37,6 +37,7 @@
 #include "settings.h"
 #include "date.h"
 #include "vehicle_gui.h"
+#include "transparency_gui.h"
 #include "newgrf_config.h"
 
 #include "network/network_data.h"
@@ -50,7 +51,8 @@
 
 static byte _terraform_size = 1;
 RailType _last_built_railtype;
-static int _scengen_town_size = 2; // depress medium-sized towns per default
+RoadType _last_built_roadtype;
+static int _scengen_town_size = 1; // depress medium-sized towns per default
 
 extern void GenerateIndustries();
 extern bool GenerateTowns();
@@ -88,7 +90,7 @@
 		} else {
 			NetworkServer_HandleChat(NETWORK_ACTION_GIVE_MONEY, DESTTYPE_TEAM, id, msg, NETWORK_SERVER_INDEX);
 		}
-	}	break;
+	} break;
 #endif /* ENABLE_NETWORK */
 		default: NOT_REACHED();
 	}
@@ -146,6 +148,22 @@
 }
 
 
+/** Toggle all transparency options, except for signs */
+static void ToggleTransparency()
+{
+	static byte trans_opt = ~0;
+
+	if (GB(_transparent_opt, 1, 7) == 0) {
+		SB(_transparent_opt, 1, 7, GB(trans_opt, 1, 7));
+	} else {
+		trans_opt = _transparent_opt;
+		SB(_transparent_opt, 1, 7, 0);
+	}
+
+	MarkWholeScreenDirty();
+}
+
+
 static void MenuClickSettings(int index)
 {
 	switch (index) {
@@ -154,14 +172,14 @@
 		case 2: ShowPatchesSelection(); return;
 		case 3: ShowNewGRFSettings(!_networking, true, true, &_grfconfig);   return;
 
-		case  5: _display_opt ^= DO_SHOW_TOWN_NAMES;    break;
-		case  6: _display_opt ^= DO_SHOW_STATION_NAMES; break;
-		case  7: _display_opt ^= DO_SHOW_SIGNS;         break;
-		case  8: _display_opt ^= DO_WAYPOINTS;          break;
-		case  9: _display_opt ^= DO_FULL_ANIMATION;     break;
-		case 10: _display_opt ^= DO_FULL_DETAIL;        break;
-		case 11: _display_opt ^= DO_TRANS_BUILDINGS;    break;
-		case 12: _display_opt ^= DO_TRANS_SIGNS;        break;
+		case  5: TOGGLEBIT(_display_opt, DO_SHOW_TOWN_NAMES);    break;
+		case  6: TOGGLEBIT(_display_opt, DO_SHOW_STATION_NAMES); break;
+		case  7: TOGGLEBIT(_display_opt, DO_SHOW_SIGNS);         break;
+		case  8: TOGGLEBIT(_display_opt, DO_WAYPOINTS);          break;
+		case  9: TOGGLEBIT(_display_opt, DO_FULL_ANIMATION);     break;
+		case 10: TOGGLEBIT(_display_opt, DO_FULL_DETAIL);        break;
+		case 11: ToggleTransparency(); break;
+		case 12: TOGGLEBIT(_transparent_opt, TO_SIGNS); break;
 	}
 	MarkWholeScreenDirty();
 }
@@ -192,6 +210,7 @@
 		case 0: ShowSmallMap();            break;
 		case 1: ShowExtraViewPortWindow(); break;
 		case 2: ShowSignList();            break;
+		case 3: ShowTransparencyToolbar(); break;
 	}
 }
 
@@ -206,7 +225,8 @@
 		case 0: ShowSmallMap();            break;
 		case 1: ShowExtraViewPortWindow(); break;
 		case 2: ShowSignList();            break;
-		case 3: ShowTownDirectory();       break;
+		case 3: ShowTransparencyToolbar(); break;
+		case 4: ShowTownDirectory();       break;
 	}
 }
 
@@ -291,7 +311,8 @@
 
 static void MenuClickBuildRoad(int index)
 {
-	ShowBuildRoadToolbar();
+	_last_built_roadtype = (RoadType)index;
+	ShowBuildRoadToolbar(_last_built_roadtype);
 }
 
 static void MenuClickBuildWater(int index)
@@ -762,7 +783,7 @@
 
 static void ToolbarMapClick(Window *w)
 {
-	PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 3, 0);
+	PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 4, 0);
 }
 
 static void ToolbarTownClick(Window *w)
@@ -861,20 +882,24 @@
 
 	switch (how) {
 		case ZOOM_IN:
-			if (vp->zoom == 0) return false;
-			vp->zoom--;
+			if (vp->zoom == ZOOM_LVL_MIN) return false;
+			vp->zoom = (ZoomLevel)((byte)vp->zoom - 1);
 			vp->virtual_width >>= 1;
 			vp->virtual_height >>= 1;
 
 			WP(w,vp_d).scrollpos_x += vp->virtual_width >> 1;
 			WP(w,vp_d).scrollpos_y += vp->virtual_height >> 1;
+			WP(w,vp_d).dest_scrollpos_x = WP(w,vp_d).scrollpos_x;
+			WP(w,vp_d).dest_scrollpos_y = WP(w,vp_d).scrollpos_y;
 			break;
 		case ZOOM_OUT:
-			if (vp->zoom == 2) return false;
-			vp->zoom++;
+			if (vp->zoom == ZOOM_LVL_MAX) return false;
+			vp->zoom = (ZoomLevel)((byte)vp->zoom + 1);
 
 			WP(w,vp_d).scrollpos_x -= vp->virtual_width >> 1;
 			WP(w,vp_d).scrollpos_y -= vp->virtual_height >> 1;
+			WP(w,vp_d).dest_scrollpos_x = WP(w,vp_d).scrollpos_x;
+			WP(w,vp_d).dest_scrollpos_y = WP(w,vp_d).scrollpos_y;
 
 			vp->virtual_width <<= 1;
 			vp->virtual_height <<= 1;
@@ -909,14 +934,16 @@
 static void ToolbarBuildRailClick(Window *w)
 {
 	const Player *p = GetPlayer(_local_player);
-	Window *w2;
-	w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
-	WP(w2,menu_d).sel_index = _last_built_railtype;
+	Window *w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
+	WP(w2, menu_d).sel_index = _last_built_railtype;
 }
 
 static void ToolbarBuildRoadClick(Window *w)
 {
-	PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 1, 0);
+	const Player *p = GetPlayer(_local_player);
+	/* The standard road button is *always* available */
+	Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | 1));
+	WP(w2, menu_d).sel_index = _last_built_roadtype;
 }
 
 static void ToolbarBuildWaterClick(Window *w)
@@ -955,14 +982,14 @@
 
 	w = PopupMainToolbMenu(w, 2, STR_02C3_GAME_OPTIONS, 13, 0);
 
-	if (_display_opt & DO_SHOW_TOWN_NAMES)    SETBIT(x,  5);
-	if (_display_opt & DO_SHOW_STATION_NAMES) SETBIT(x,  6);
-	if (_display_opt & DO_SHOW_SIGNS)         SETBIT(x,  7);
-	if (_display_opt & DO_WAYPOINTS)          SETBIT(x,  8);
-	if (_display_opt & DO_FULL_ANIMATION)     SETBIT(x,  9);
-	if (_display_opt & DO_FULL_DETAIL)        SETBIT(x, 10);
-	if (_display_opt & DO_TRANS_BUILDINGS)    SETBIT(x, 11);
-	if (_display_opt & DO_TRANS_SIGNS)        SETBIT(x, 12);
+	if (HASBIT(_display_opt, DO_SHOW_TOWN_NAMES))    SETBIT(x,  5);
+	if (HASBIT(_display_opt, DO_SHOW_STATION_NAMES)) SETBIT(x,  6);
+	if (HASBIT(_display_opt, DO_SHOW_SIGNS))         SETBIT(x,  7);
+	if (HASBIT(_display_opt, DO_WAYPOINTS))          SETBIT(x,  8);
+	if (HASBIT(_display_opt, DO_FULL_ANIMATION))     SETBIT(x,  9);
+	if (HASBIT(_display_opt, DO_FULL_DETAIL))        SETBIT(x, 10);
+	if (GB(_transparent_opt, 1, 7) != 0)      SETBIT(x, 11);
+	if (HASBIT(_transparent_opt, TO_SIGNS))   SETBIT(x, 12);
 	WP(w,menu_d).checked_items = x;
 }
 
@@ -1001,7 +1028,7 @@
 static void ToolbarScenMapTownDir(Window *w)
 {
 	/* Scenario editor button, *hack*hack* use different button to activate */
-	PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 4, 0);
+	PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 5, 0);
 }
 
 static void ToolbarScenZoomIn(Window *w)
@@ -1030,12 +1057,12 @@
 	vp = w->viewport;
 
 	if (_game_mode != GM_MENU) {
-		if ((in && vp->zoom == 0) || (!in && vp->zoom == 2))
+		if ((in && vp->zoom == ZOOM_LVL_MIN) || (!in && vp->zoom == ZOOM_LVL_MAX))
 			return;
 
 		pt = GetTileZoomCenterWindow(in,w);
 		if (pt.x != -1) {
-			ScrollWindowTo(pt.x, pt.y, w);
+			ScrollWindowTo(pt.x, pt.y, w, true);
 
 			DoZoomInOutWindow(in ? ZOOM_IN : ZOOM_OUT, w);
 		}
@@ -1109,7 +1136,7 @@
 
 static void PlaceProc_RockyArea(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_RockyArea);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_ROCKS);
 }
 
 static void PlaceProc_LightHouse(TileIndex tile)
@@ -1136,12 +1163,12 @@
 
 static void PlaceProc_DesertArea(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_DesertArea);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_DESERT);
 }
 
 static void PlaceProc_WaterArea(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_WaterArea);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_WATER);
 }
 
 static const Widget _scen_edit_land_gen_widgets[] = {
@@ -1244,7 +1271,8 @@
 
 
 /** Callback function for the scenario editor 'reset landscape' confirmation window
- * @param yes_clicked boolean value, true when yes was clicked, false otherwise */
+ * @param w Window unused
+ * @param confirmed boolean value, true when yes was clicked, false otherwise */
 static void ResetLandscapeConfirmationCallback(Window *w, bool confirmed)
 {
 	if (confirmed) {
@@ -1354,13 +1382,20 @@
 		_place_proc(e->we.place.tile);
 		break;
 	case WE_PLACE_DRAG:
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata & 0xF);
+		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		break;
 
 	case WE_PLACE_MOUSEUP:
 		if (e->we.place.pt.x != -1) {
-			if ((e->we.place.userdata & 0xF) == VPM_X_AND_Y) // dragged actions
-				GUIPlaceProcDragXY(e);
+			switch (e->we.place.select_proc) {
+				case DDSP_CREATE_ROCKS:
+				case DDSP_CREATE_DESERT:
+				case DDSP_CREATE_WATER:
+				case DDSP_LEVEL_AREA:
+				case DDSP_DEMOLISH_AREA:
+					GUIPlaceProcDragXY(e);
+					break;
+			}
 		}
 		break;
 
@@ -1402,7 +1437,9 @@
 
 static void PlaceProc_Town(TileIndex tile)
 {
-	DoCommandP(tile, _scengen_town_size, 0, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
+	uint32 size = min(_scengen_town_size, (int)TSM_CITY);
+	uint32 mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
+	DoCommandP(tile, size, mode, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
 }
 
 
@@ -1410,13 +1447,14 @@
 {   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                 STR_018B_CLOSE_WINDOW},
 {    WWT_CAPTION,   RESIZE_NONE,     7,    11,   147,     0,    13, STR_0233_TOWN_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
 {  WWT_STICKYBOX,   RESIZE_NONE,     7,   148,   159,     0,    13, 0x0,                      STR_STICKY_BUTTON},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   159,    14,    81, 0x0,                      STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   159,    14,    94, 0x0,                      STR_NULL},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    16,    27, STR_0234_NEW_TOWN,        STR_0235_CONSTRUCT_NEW_TOWN},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    29,    40, STR_023D_RANDOM_TOWN,     STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    42,    53, STR_MANY_RANDOM_TOWNS,    STR_RANDOM_TOWNS_TIP},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,    53,    68,    79, STR_02A1_SMALL,           STR_02A4_SELECT_TOWN_SIZE},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,    54,   105,    68,    79, STR_02A2_MEDIUM,          STR_02A4_SELECT_TOWN_SIZE},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,   106,   157,    68,    79, STR_02A3_LARGE,           STR_02A4_SELECT_TOWN_SIZE},
+{    WWT_TEXTBTN,   RESIZE_NONE,    14,     2,   157,    81,    92, STR_SCENARIO_EDITOR_CITY, STR_02A4_SELECT_TOWN_SIZE},
 {      WWT_LABEL,   RESIZE_NONE,     7,     0,   147,    54,    67, STR_02A5_TOWN_SIZE,       STR_NULL},
 {   WIDGETS_END},
 };
@@ -1429,7 +1467,7 @@
 		break;
 
 	case WE_CREATE:
-		LowerWindowWidget(w, (_scengen_town_size - 1)+ 7);
+		LowerWindowWidget(w, _scengen_town_size + 7);
 		break;
 
 	case WE_CLICK:
@@ -1439,10 +1477,12 @@
 			break;
 		case 5: {// random town
 			Town *t;
+			uint size = min(_scengen_town_size, (int)TSM_CITY);
+			TownSizeMode mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
 
 			HandleButtonClick(w, 5);
 			_generating_world = true;
-			t = CreateRandomTown(20, _scengen_town_size);
+			t = CreateRandomTown(20, mode, size);
 			_generating_world = false;
 
 			if (t == NULL) {
@@ -1462,10 +1502,10 @@
 			break;
 		}
 
-		case 7: case 8: case 9:
-			RaiseWindowWidget(w, (_scengen_town_size - 1) + 7);
-			_scengen_town_size = (e->we.click.widget - 7) + 1;
-			LowerWindowWidget(w, (_scengen_town_size - 1) + 7);
+		case 7: case 8: case 9: case 10:
+			RaiseWindowWidget(w, _scengen_town_size + 7);
+			_scengen_town_size = e->we.click.widget - 7;
+			LowerWindowWidget(w, _scengen_town_size + 7);
 			SetWindowDirty(w);
 			break;
 		}
@@ -1481,14 +1521,14 @@
 		break;
 	case WE_ABORT_PLACE_OBJ:
 		RaiseWindowButtons(w);
-		LowerWindowWidget(w, (_scengen_town_size - 1) + 7);
+		LowerWindowWidget(w, _scengen_town_size + 7);
 		SetWindowDirty(w);
 		break;
 	}
 }
 
 static const WindowDesc _scen_edit_town_gen_desc = {
-	WDP_AUTO, WDP_AUTO, 160, 82,
+	WDP_AUTO, WDP_AUTO, 160, 95,
 	WC_SCEN_TOWN_GEN, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_scen_edit_town_gen_widgets,
@@ -1848,7 +1888,7 @@
 		case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
 		case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
 		case WKC_SHIFT | WKC_F7: ShowBuildRailToolbar(_last_built_railtype, -1); break;
-		case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(); break;
+		case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
 		case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
 		case WKC_SHIFT | WKC_F10:ShowBuildAirToolbar(); break;
 		case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
@@ -2330,9 +2370,24 @@
 				break;
 #endif
 
+			case '1' | WKC_CTRL:
+			case '2' | WKC_CTRL:
+			case '3' | WKC_CTRL:
+			case '4' | WKC_CTRL:
+			case '5' | WKC_CTRL:
+			case '6' | WKC_CTRL:
+			case '7' | WKC_CTRL:
+				/* Transparency toggle hot keys */
+				TOGGLEBIT(_transparent_opt, e->we.keypress.keycode - ('1' | WKC_CTRL));
+				MarkWholeScreenDirty();
+				break;
+
+			case 'X' | WKC_CTRL:
+				ShowTransparencyToolbar();
+				break;
+
 			case 'X':
-				_display_opt ^= DO_TRANS_BUILDINGS;
-				MarkWholeScreenDirty();
+				ToggleTransparency();
 				break;
 
 #ifdef ENABLE_NETWORK
@@ -2385,8 +2440,10 @@
 				_scrolling_viewport = false;
 			}
 
-			WP(w, vp_d).scrollpos_x += e->we.scroll.delta.x << vp->zoom;
-			WP(w, vp_d).scrollpos_y += e->we.scroll.delta.y << vp->zoom;
+			WP(w, vp_d).scrollpos_x += ScaleByZoom(e->we.scroll.delta.x, vp->zoom);
+			WP(w, vp_d).scrollpos_y += ScaleByZoom(e->we.scroll.delta.y, vp->zoom);
+			WP(w, vp_d).dest_scrollpos_x = WP(w, vp_d).scrollpos_x;
+			WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y;
 		} break;
 
 		case WE_MOUSEWHEEL:
@@ -2420,7 +2477,7 @@
 	height = _screen.height;
 
 	w = AllocateWindow(0, 0, width, height, MainWindowWndProc, WC_MAIN_WINDOW, NULL);
-	AssignWindowViewport(w, 0, 0, width, height, TileXY(32, 32), 0);
+	AssignWindowViewport(w, 0, 0, width, height, TileXY(32, 32), ZOOM_LVL_VIEWPORT);
 
 	/* XXX: these are not done */
 	switch (_game_mode) {
@@ -2474,6 +2531,7 @@
 {
 	/* Clean old GUI values */
 	_last_built_railtype = RAILTYPE_RAIL;
+	_last_built_roadtype = ROADTYPE_ROAD;
 }
 
 
--- a/src/map.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/map.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -16,24 +16,29 @@
 extern "C" _CRTIMP void __cdecl _assert(void *, void *, unsigned);
 #endif
 
-uint _map_log_x;
-uint _map_size_x;
-uint _map_size_y;
-uint _map_tile_mask;
-uint _map_size;
+uint _map_log_x;     ///< 2^_map_log_x == _map_size_x
+uint _map_size_x;    ///< Size of the map along the X
+uint _map_size_y;    ///< Size of the map along the Y
+uint _map_size;      ///< The number of tiles on the map
+uint _map_tile_mask; ///< _map_size - 1 (to mask the mapsize)
 
-Tile *_m = NULL;
-TileExtended *_me = NULL;
+Tile *_m = NULL;          ///< Tiles of the map
+TileExtended *_me = NULL; ///< Extended Tiles of the map
 
 
+/**
+ * (Re)allocates a map with the given dimension
+ * @param size_x the width of the map along the NE/SW edge
+ * @param size_y the 'height' of the map along the SE/NW edge
+ */
 void AllocateMap(uint size_x, uint size_y)
 {
 	/* Make sure that the map size is within the limits and that
 	 * the x axis size is a power of 2. */
 	if (size_x < 64 || size_x > 2048 ||
 			size_y < 64 || size_y > 2048 ||
-			(size_x&(size_x-1)) != 0 ||
-			(size_y&(size_y-1)) != 0)
+			(size_x & (size_x - 1)) != 0 ||
+			(size_y & (size_y - 1)) != 0)
 		error("Invalid map size");
 
 	DEBUG(map, 1, "Allocating map of size %dx%d", size_x, size_y);
@@ -48,12 +53,12 @@
 	free(_me);
 
 	_m = CallocT<Tile>(_map_size);
- 	_me = CallocT<TileExtended>(_map_size);
+	_me = CallocT<TileExtended>(_map_size);
 
- 	/* XXX @todo handle memory shortage more gracefully
- 	 * Maybe some attemps could be made to try with smaller maps down to 64x64
- 	 * Maybe check for available memory before doing the calls, after all, we know how big
- 	 * the map is */
+	/* XXX @todo handle memory shortage more gracefully
+	 * Maybe some attemps could be made to try with smaller maps down to 64x64
+	 * Maybe check for available memory before doing the calls, after all, we know how big
+	 * the map is */
 	if ((_m == NULL) || (_me == NULL)) error("Failed to allocate memory for the map");
 }
 
@@ -86,39 +91,55 @@
 #endif
 	}
 
-	assert(TileXY(x,y) == TILE_MASK(tile + add));
+	assert(TileXY(x, y) == TILE_MASK(tile + add));
 
-	return TileXY(x,y);
+	return TileXY(x, y);
 }
 #endif
 
-
+/**
+ * Scales the given value by the map size, where the given value is
+ * for a 256 by 256 map
+ * @param n the value to scale
+ * @return the scaled size
+ */
 uint ScaleByMapSize(uint n)
 {
 	/* First shift by 12 to prevent integer overflow for large values of n.
 	 * >>12 is safe since the min mapsize is 64x64
 	 * Add (1<<4)-1 to round upwards. */
-	return (n * (MapSize() >> 12) + (1<<4) - 1) >> 4;
+	return (n * (MapSize() >> 12) + (1 << 4) - 1) >> 4;
 }
 
 
-/* Scale relative to the circumference of the map */
+/**
+ * Scales the given value by the maps circumference, where the given
+ * value is for a 256 by 256 map
+ * @param n the value to scale
+ * @return the scaled size
+ */
 uint ScaleByMapSize1D(uint n)
 {
 	/* Normal circumference for the X+Y is 256+256 = 1<<9
 	 * Note, not actually taking the full circumference into account,
 	 * just half of it.
 	 * (1<<9) - 1 is there to scale upwards. */
-	return (n * (MapSizeX() + MapSizeY()) + (1<<9) - 1) >> 9;
+	return (n * (MapSizeX() + MapSizeY()) + (1 << 9) - 1) >> 9;
 }
 
 
-/* This function checks if we add addx/addy to tile, if we
+/**
+ * This function checks if we add addx/addy to tile, if we
  *  do wrap around the edges. For example, tile = (10,2) and
  *  addx = +3 and addy = -4. This function will now return
  *  INVALID_TILE, because the y is wrapped. This is needed in
  *  for example, farmland. When the tile is not wrapped,
- *  the result will be tile + TileDiffXY(addx, addy) */
+ *  the result will be tile + TileDiffXY(addx, addy)
+ * @param tile the 'starting' point of the adding
+ * @param addx the amount of tiles in the X direction to add
+ * @param addy the amount of tiles in the Y direction to add
+ * @return translated tile, or INVALID_TILE when it would've wrapped.
+ */
 uint TileAddWrap(TileIndex tile, int addx, int addy)
 {
 	uint x = TileX(tile) + addx;
@@ -131,6 +152,7 @@
 	return INVALID_TILE;
 }
 
+/** 'Lookup table' for tile offsets given a DiagDirection */
 extern const TileIndexDiffC _tileoffs_by_diagdir[] = {
 	{-1,  0}, ///< DIAGDIR_NE
 	{ 0,  1}, ///< DIAGDIR_SE
@@ -138,6 +160,7 @@
 	{ 0, -1}  ///< DIAGDIR_NW
 };
 
+/** 'Lookup table' for tile offsets given a Direction */
 extern const TileIndexDiffC _tileoffs_by_dir[] = {
 	{-1, -1}, ///< DIR_N
 	{-1,  0}, ///< DIR_NE
@@ -149,6 +172,15 @@
 	{ 0, -1}  ///< DIR_NW
 };
 
+/**
+ * Gets the Manhattan distance between the two given tiles.
+ * The Manhattan distance is the sum of the delta of both the
+ * X and Y component.
+ * Also known as L1-Norm
+ * @param t0 the start tile
+ * @param t1 the end tile
+ * @return the distance
+ */
 uint DistanceManhattan(TileIndex t0, TileIndex t1)
 {
 	const uint dx = delta(TileX(t0), TileX(t1));
@@ -157,6 +189,15 @@
 }
 
 
+/**
+ * Gets the 'Square' distance between the two given tiles.
+ * The 'Square' distance is the square of the shortest (straight line)
+ * distance between the two tiles.
+ * Also known as euclidian- or L2-Norm squared.
+ * @param t0 the start tile
+ * @param t1 the end tile
+ * @return the distance
+ */
 uint DistanceSquare(TileIndex t0, TileIndex t1)
 {
 	const int dx = TileX(t0) - TileX(t1);
@@ -165,6 +206,13 @@
 }
 
 
+/**
+ * Gets the biggest distance component (x or y) between the two given tiles.
+ * Also known as L-Infinity-Norm.
+ * @param t0 the start tile
+ * @param t1 the end tile
+ * @return the distance
+ */
 uint DistanceMax(TileIndex t0, TileIndex t1)
 {
 	const uint dx = delta(TileX(t0), TileX(t1));
@@ -173,6 +221,14 @@
 }
 
 
+/**
+ * Gets the biggest distance component (x or y) between the two given tiles
+ * plus the Manhattan distance, i.e. two times the biggest distance component
+ * and once the smallest component.
+ * @param t0 the start tile
+ * @param t1 the end tile
+ * @return the distance
+ */
 uint DistanceMaxPlusManhattan(TileIndex t0, TileIndex t1)
 {
 	const uint dx = delta(TileX(t0), TileX(t1));
@@ -180,6 +236,11 @@
 	return dx > dy ? 2 * dx + dy : 2 * dy + dx;
 }
 
+/**
+ * Param the minimum distance to an edge
+ * @param tile the tile to get the distance from
+ * @return the distance from the edge in tiles
+ */
 uint DistanceFromEdge(TileIndex tile)
 {
 	const uint xl = TileX(tile);
--- a/src/map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -7,29 +7,41 @@
 
 #include "stdafx.h"
 
-/* Putting externs inside inline functions seems to confuse the aliasing
- * checking on MSVC6. Never use those variables directly. */
-extern uint _map_log_x;
-extern uint _map_size_x;
-extern uint _map_size_y;
 extern uint _map_tile_mask;
-extern uint _map_size;
+
+/**
+ * 'Wraps' the given tile to it is within the map. It does
+ * this by masking the 'high' bits of.
+ * @param x the tile to 'wrap'
+ */
 
 #define TILE_MASK(x) ((x) & _map_tile_mask)
+/**
+ * Asserts when the tile is outside of the map.
+ * @param x the tile to check
+ */
 #define TILE_ASSERT(x) assert(TILE_MASK(x) == (x));
 
+/**
+ * Data that is stored per tile. Also used TileExtended for this.
+ * Look at docs/landscape.html for the exact meaning of the members.
+ */
 struct Tile {
-	byte type_height;
-	byte m1;
-	uint16 m2;
-	byte m3;
-	byte m4;
-	byte m5;
-	byte m6;
+	byte type_height; ///< The type (bits 4..7) and height of the northern corner
+	byte m1;   ///< Primarily used for ownership information
+	uint16 m2; ///< Primarily used for indices to towns, industries and stations
+	byte m3;   ///< General purpose
+	byte m4;   ///< General purpose
+	byte m5;   ///< General purpose
+	byte m6;   ///< Primarily used for bridges and rainforest/desert
 };
 
+/**
+ * Data that is stored per tile. Also used Tile for this.
+ * Look at docs/landscape.html for the exact meaning of the members.
+ */
 struct TileExtended {
-	byte m7;
+	byte m7; ///< Primarily used for newgrf support
 };
 
 extern Tile *_m;
@@ -37,16 +49,64 @@
 
 void AllocateMap(uint size_x, uint size_y);
 
-/* binary logarithm of the map size, try to avoid using this one */
-static inline uint MapLogX()  { return _map_log_x; }
-/* The size of the map */
-static inline uint MapSizeX() { return _map_size_x; }
-static inline uint MapSizeY() { return _map_size_y; }
-/* The maximum coordinates */
-static inline uint MapMaxX() { return _map_size_x - 1; }
-static inline uint MapMaxY() { return _map_size_y - 1; }
-/* The number of tiles in the map */
-static inline uint MapSize() { return _map_size; }
+/**
+ * Logarithm of the map size along the X side.
+ * @note try to avoid using this one
+ * @return 2^"return value" == MapSizeX()
+ */
+static inline uint MapLogX()
+{
+	extern uint _map_log_x;
+	return _map_log_x;
+}
+
+/**
+ * Get the size of the map along the X
+ * @return the number of tiles along the X of the map
+ */
+static inline uint MapSizeX()
+{
+	extern uint _map_size_x;
+	return _map_size_x;
+}
+
+/**
+ * Get the size of the map along the Y
+ * @return the number of tiles along the Y of the map
+ */
+static inline uint MapSizeY()
+{
+	extern uint _map_size_y;
+	return _map_size_y;
+}
+
+/**
+ * Get the size of the map
+ * @return the number of tiles of the map
+ */
+static inline uint MapSize()
+{
+	extern uint _map_size;
+	return _map_size;
+}
+
+/**
+ * Gets the maximum X coordinate within the map, including MP_VOID
+ * @return the maximum X coordinate
+ */
+static inline uint MapMaxX()
+{
+	return MapSizeX() - 1;
+}
+
+/**
+ * Gets the maximum X coordinate within the map, including MP_VOID
+ * @return the maximum X coordinate
+ */
+static inline uint MapMaxY()
+{
+	return MapSizeY() - 1;
+}
 
 /* Scale a number relative to the map size */
 uint ScaleByMapSize(uint); // Scale relative to the number of tiles
@@ -76,7 +136,7 @@
 
 
 enum {
-	INVALID_TILE = (TileIndex)-1
+	INVALID_TILE = (TileIndex)-1 ///< The very nice invalid tile marker
 };
 
 enum {
@@ -86,11 +146,21 @@
 };
 
 
+/**
+ * Get the X component of a tile
+ * @param tile the tile to get the X component of
+ * @return the X component
+ */
 static inline uint TileX(TileIndex tile)
 {
 	return tile & MapMaxX();
 }
 
+/**
+ * Get the Y component of a tile
+ * @param tile the tile to get the Y component of
+ * @return the Y component
+ */
 static inline uint TileY(TileIndex tile)
 {
 	return tile >> MapLogX();
@@ -139,6 +209,23 @@
 		return TileXY(x, y);
 }
 
+/**
+ * Returns the diff between two tiles
+ *
+ * @param tile_a from tile
+ * @param tile_b to tile
+ * @return the difference between tila_a and tile_b
+ */
+static inline TileIndexDiffC TileIndexToTileIndexDiffC(TileIndex tile_a, TileIndex tile_b)
+{
+	TileIndexDiffC difference;
+
+	difference.x = TileX(tile_a) - TileX(tile_b);
+	difference.y = TileY(tile_a) - TileY(tile_b);
+
+	return difference;
+}
+
 /* Functions to calculate distances */
 uint DistanceManhattan(TileIndex, TileIndex); ///< also known as L1-Norm. Is the shortest distance one could go over diagonal tracks (or roads)
 uint DistanceSquare(TileIndex, TileIndex); ///< euclidian- or L2-Norm squared
@@ -147,7 +234,7 @@
 uint DistanceFromEdge(TileIndex); ///< shortest distance from any edge of the map
 
 
-#define BEGIN_TILE_LOOP(var,w,h,tile)                      \
+#define BEGIN_TILE_LOOP(var, w, h, tile)                      \
 	{                                                        \
 		int h_cur = h;                                         \
 		uint var = tile;                                       \
@@ -155,7 +242,7 @@
 			int w_cur = w;                                       \
 			do {
 
-#define END_TILE_LOOP(var,w,h,tile)                        \
+#define END_TILE_LOOP(var, w, h, tile)                        \
 			} while (++var, --w_cur != 0);                       \
 		} while (var += TileDiffXY(0, 1) - (w), --h_cur != 0); \
 	}
--- a/src/misc.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -6,6 +6,7 @@
 #include "openttd.h"
 #include "currency.h"
 #include "functions.h"
+#include "landscape.h"
 #include "news.h"
 #include "player.h"
 #include "string.h"
@@ -21,6 +22,7 @@
 #include "newgrf_house.h"
 #include "date.h"
 #include "cargotype.h"
+#include "group.h"
 
 char _name_array[512][32];
 
@@ -87,7 +89,6 @@
 void InitializeDockGui();
 void InitializeIndustries();
 void InitializeMainGui();
-void InitializeLandscape();
 void InitializeTowns();
 void InitializeTrees();
 void InitializeSigns();
@@ -120,6 +121,7 @@
 	InitializeWaypoints();
 	InitializeDepots();
 	InitializeOrders();
+	InitializeGroup();
 
 	InitNewsItemStructs();
 	InitializeLandscape();
@@ -286,7 +288,7 @@
 	int index;
 
 	while ((index = SlIterateArray()) != -1) {
-		SlArray(_name_array[index],SlGetFieldLength(),SLE_UINT8);
+		SlArray(_name_array[index], SlGetFieldLength(), SLE_UINT8);
 	}
 }
 
--- a/src/misc/array.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/array.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file array.hpp */
+
 #ifndef  ARRAY_HPP
 #define  ARRAY_HPP
 
--- a/src/misc/autocopyptr.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/autocopyptr.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file autocopyptr.hpp */
+
 #ifndef  AUTOCOPYPTR_HPP
 #define  AUTOCOPYPTR_HPP
 
@@ -8,7 +10,7 @@
  *  It is non-invasive smart pointer (reference counter is held outside
  *  of Tdata).
  *  When copied, its new copy shares the same underlaying structure Tdata.
- *  When dereferenced, its behavior depends on 2 factors:
+ *  When dereferenced, its behaviour depends on 2 factors:
  *     - whether the data is shared (used by more than one pointer)
  *     - type of access (read/write)
  *    When shared pointer is dereferenced for write, new clone of Tdata
--- a/src/misc/autoptr.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/autoptr.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file autoptr.hpp */
+
 #ifndef AUTOPTR_HPP
 #define AUTOPTR_HPP
 
--- a/src/misc/binaryheap.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/binaryheap.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file binaryheap.hpp */
+
 #ifndef  BINARYHEAP_HPP
 #define  BINARYHEAP_HPP
 
--- a/src/misc/blob.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/blob.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file blob.hpp */
+
 #ifndef  BLOB_HPP
 #define  BLOB_HPP
 
--- a/src/misc/countedptr.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/countedptr.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file countedptr.hpp */
+
 #ifndef COUNTEDPTR_HPP
 #define COUNTEDPTR_HPP
 
--- a/src/misc/crc32.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/crc32.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file crc32.hpp */
+
 #ifndef  CRC32_HPP
 #define  CRC32_HPP
 
--- a/src/misc/fixedsizearray.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/fixedsizearray.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file fixedsizearray.hpp */
+
 #ifndef  FIXEDSIZEARRAY_HPP
 #define  FIXEDSIZEARRAY_HPP
 
--- a/src/misc/hashtable.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc/hashtable.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file hashtable.hpp */
+
 #ifndef  HASHTABLE_HPP
 #define  HASHTABLE_HPP
 
@@ -97,7 +99,7 @@
 	}
 };
 
-/** @class CHashTableT<Titem, Thash_bits> - simple hash table
+/** class CHashTableT<Titem, Thash_bits> - simple hash table
  *  of pointers allocated elsewhere.
  *
  *  Supports: Add/Find/Remove of Titems.
--- a/src/misc_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -20,6 +20,7 @@
 
 /** Change the player's face.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 unused
  * @param p2 face bitmasked
  */
@@ -38,6 +39,7 @@
 
 /** Change the player's company-colour
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 bitstuffed:
  * p1 bits 0-7 scheme to set
  * p1 bits 8-9 set in use state or first/second colour
@@ -117,6 +119,7 @@
 
 /** Increase the loan of your company.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 unused
  * @param p2 when set, loans the maximum amount in one go (press CTRL)
  */
@@ -146,6 +149,7 @@
 
 /** Decrease the loan of your company.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 unused
  * @param p2 when set, pays back the maximum loan permitting money (press CTRL)
  */
@@ -186,6 +190,7 @@
 
 /** Change the name of the company.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 unused
  * @param p2 unused
  */
@@ -213,6 +218,7 @@
 
 /** Change the name of the president.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 unused
  * @param p2 unused
  */
@@ -251,6 +257,7 @@
  * the game is unpaused. A counter is used instead of a boolean value
  * to have more control over the game when saving/loading, etc.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 0 = decrease pause counter; 1 = increase pause counter
  * @param p2 unused
  */
@@ -269,6 +276,7 @@
  * This is normally only enabled in offline mode, but if there is a debug
  * build, you can cheat (to test).
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 the amount of money to receive (if negative), or spend (if positive)
  * @param p2 unused
  */
@@ -286,6 +294,7 @@
  * players if you have paid off your loan (either explicitely, or implicitely
  * given the fact that you have more money than loan).
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 the amount of money to transfer; max 20.000.000
  * @param p2 the player to transfer the money to
  */
@@ -317,6 +326,7 @@
  * in file 'settings_gui.c' _game_setting_info[]; we'll just trust the server it knows
  * what to do and does this correctly
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 the difficulty setting being changed. If it is -1, the difficulty level
  *           itself is changed. The new value is inside p2
  * @param p2 new value for a difficulty setting or difficulty level
--- a/src/misc_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/misc_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -8,6 +8,7 @@
 #include "heightmap.h"
 #include "debug.h"
 #include "functions.h"
+#include "landscape.h"
 #include "newgrf.h"
 #include "saveload.h"
 #include "strings.h"
@@ -40,8 +41,6 @@
 FiosItem *_fios_list;
 int _saveload_mode;
 
-extern void GenerateLandscape(byte mode);
-extern void SwitchMode(int new_mode);
 
 static bool _fios_path_changed;
 static bool _savegame_sort_dirty;
@@ -240,6 +239,7 @@
 	"",
 	"  Michael Blunck - Pre-Signals and Semaphores © 2003",
 	"  George - Canal/Lock graphics © 2003-2004",
+	"  David Dallaston - Tram tracks",
 	"  Marcin Grzegorczyk - Foundations for Tracks on Slopes",
 	"  All Translators - Who made OpenTTD a truly international game",
 	"  Bug Reporters - Without whom OpenTTD would still be full of bugs!",
@@ -278,7 +278,7 @@
 
 		DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", 16);
 		DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, 0);
-	}	break;
+	} break;
 	case WE_MOUSELOOP: // Timer to scroll the text and adjust the new top
 		if (WP(w, scroller_d).counter++ % 3 == 0) {
 			WP(w, scroller_d).height--;
@@ -383,16 +383,16 @@
 	} break;
 
 	case WE_PLACE_OBJ:
-		VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED);
+		VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED, DDSP_PLANT_TREES);
 		VpSetPlaceSizingLimit(20);
 		break;
 
 	case WE_PLACE_DRAG:
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata);
+		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		return;
 
 	case WE_PLACE_MOUSEUP:
-		if (e->we.place.pt.x != -1) {
+		if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) {
 			DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL,
 				CMD_PLANT_TREE | CMD_AUTO | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
 		}
@@ -580,11 +580,11 @@
 			vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
 
 			/* move x pos to opposite corner */
-			pt.x = ((pt.x - vp->virtual_left) >> vp->zoom) + vp->left;
+			pt.x = UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left;
 			pt.x = (pt.x < (_screen.width >> 1)) ? _screen.width - 260 : 20;
 
 			/* move y pos to opposite corner */
-			pt.y = ((pt.y - vp->virtual_top) >> vp->zoom) + vp->top;
+			pt.y = UnScaleByZoom(pt.y - vp->virtual_top, vp->zoom) + vp->top;
 			pt.y = (pt.y < (_screen.height >> 1)) ? _screen.height - 80 : 100;
 
 		} else {
@@ -596,8 +596,8 @@
 		if ( (x|y) != 0) {
 			pt = RemapCoords2(x, y);
 			vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
-			pt.x = clamp(((pt.x - vp->virtual_left) >> vp->zoom) + vp->left - (334/2), 0, _screen.width - 334);
-			pt.y = clamp(((pt.y - vp->virtual_top) >> vp->zoom) + vp->top - (137/2), 22, _screen.height - 137);
+			pt.x = clamp(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (334/2), 0, _screen.width - 334);
+			pt.y = clamp(UnScaleByZoom(pt.y - vp->virtual_top, vp->zoom) + vp->top - (137/2), 22, _screen.height - 137);
 		} else {
 			pt.x = (_screen.width - 334) >> 1;
 			pt.y = (_screen.height - 137) >> 1;
@@ -678,9 +678,10 @@
 }
 
 /** Shows a tooltip
-* @param str String to be displayed
-* @param params (optional) up to 5 pieces of additional information that may be
-* added to a tooltip; currently only supports parameters of {NUM} (integer) */
+ * @param str String to be displayed
+ * @param paramcount number of params to deal with
+ * @param params (optional) up to 5 pieces of additional information that may be
+ * added to a tooltip; currently only supports parameters of {NUM} (integer) */
 void GuiShowTooltipsWithArgs(StringID str, uint paramcount, const uint32 params[])
 {
 	char buffer[512];
@@ -825,8 +826,8 @@
 /**
  * Delete a character from a textbuffer, either with 'Delete' or 'Backspace'
  * The character is delete from the position the caret is at
- * @param tb @Textbuf type to be changed
- * @param delmode Type of deletion, either @WKC_BACKSPACE or @WKC_DELETE
+ * @param tb Textbuf type to be changed
+ * @param delmode Type of deletion, either WKC_BACKSPACE or WKC_DELETE
  * @return Return true on successfull change of Textbuf, or false otherwise
  */
 bool DeleteTextBufferChar(Textbuf *tb, int delmode)
@@ -844,7 +845,7 @@
 
 /**
  * Delete every character in the textbuffer
- * @param tb @Textbuf buffer to be emptied
+ * @param tb Textbuf buffer to be emptied
  */
 void DeleteTextBufferAll(Textbuf *tb)
 {
@@ -857,7 +858,7 @@
  * Insert a character to a textbuffer. If maxwidth of the Textbuf is zero,
  * we don't care about the visual-length but only about the physical
  * length of the string
- * @param tb @Textbuf type to be changed
+ * @param tb Textbuf type to be changed
  * @param key Character to be inserted
  * @return Return true on successfull change of Textbuf, or false otherwise
  */
@@ -881,8 +882,8 @@
 /**
  * Handle text navigation with arrow keys left/right.
  * This defines where the caret will blink and the next characer interaction will occur
- * @param tb @Textbuf type where navigation occurs
- * @param navmode Direction in which navigation occurs @WKC_LEFT, @WKC_RIGHT, @WKC_END, @WKC_HOME
+ * @param tb Textbuf type where navigation occurs
+ * @param navmode Direction in which navigation occurs WKC_LEFT, WKC_RIGHT, WKC_END, WKC_HOME
  * @return Return true on successfull change of Textbuf, or false otherwise
  */
 bool MoveTextBufferPos(Textbuf *tb, int navmode)
@@ -925,7 +926,7 @@
 /**
  * Initialize the textbuffer by supplying it the buffer to write into
  * and the maximum length of this buffer
- * @param tb @Textbuf type which is getting initialized
+ * @param tb Textbuf type which is getting initialized
  * @param buf the buffer that will be holding the data for input
  * @param maxlength maximum length in characters of this buffer
  * @param maxwidth maximum length in pixels of this buffer. If reached, buffer
@@ -941,10 +942,10 @@
 }
 
 /**
- * Update @Textbuf type with its actual physical character and screenlength
+ * Update Textbuf type with its actual physical character and screenlength
  * Get the count of characters in the string as well as the width in pixels.
  * Useful when copying in a larger amount of text at once
- * @param tb @Textbuf type which length is calculated
+ * @param tb Textbuf type which length is calculated
  */
 void UpdateTextBufferSize(Textbuf *tb)
 {
@@ -1272,8 +1273,7 @@
  * @param message string that will be shown for the window
  * @param parent pointer to parent window, if this pointer is NULL the parent becomes
  * the main window WC_MAIN_WINDOW
- * @param x,y coordinates to show the window at
- * @param yes_no_callback callback function called when window is closed through any button */
+ * @param callback callback function pointer to set in the window descriptor*/
 void ShowQuery(StringID caption, StringID message, Window *parent, void (*callback)(Window*, bool))
 {
 	Window *w = AllocateWindowDesc(&_query_desc);
@@ -1458,7 +1458,7 @@
 		}
 
 		if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
-			DrawEditBox(w, &WP(w,querystr_d), 10);
+			DrawEditBox(w, &WP(w, querystr_d), 10);
 		}
 		break;
 	}
@@ -1551,7 +1551,7 @@
 		if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break;
 
 		if (IsWindowWidgetLowered(w, 11)) { // Delete button clicked
-			if (!FiosDelete(WP(w,querystr_d).text.buf)) {
+			if (!FiosDelete(WP(w, querystr_d).text.buf)) {
 				ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0);
 			} else {
 				BuildFileList();
@@ -1563,7 +1563,7 @@
 			SetWindowDirty(w);
 		} else if (IsWindowWidgetLowered(w, 12)) { // Save button clicked
 			_switch_mode = SM_SAVE;
-			FiosMakeSavegameName(_file_to_saveload.name, WP(w,querystr_d).text.buf, sizeof(_file_to_saveload.name));
+			FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name));
 
 			/* In the editor set up the vehicle engines correctly (date might have changed) */
 			if (_game_mode == GM_EDITOR) StartupEngines();
@@ -1723,6 +1723,7 @@
 
 /**
  * @param p1 -1 or +1 (down/up)
+ * @param p2 unused
  */
 static int32 ClickChangeClimateCheat(int32 p1, int32 p2)
 {
@@ -1736,6 +1737,7 @@
 extern void EnginesMonthlyLoop();
 
 /**
+ * @param p1 unused
  * @param p2 1 (increase) or -1 (decrease)
  */
 static int32 ClickChangeDateCheat(int32 p1, int32 p2)
--- a/src/music/bemidi.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/music/bemidi.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file bemidi.cpp */
+
 #include "../stdafx.h"
 #include "../openttd.h"
 #include "bemidi.h"
--- a/src/music/dmusic.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/music/dmusic.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file dmusic.cpp */
+
 #ifdef WIN32_ENABLE_DIRECTMUSIC_SUPPORT
 
 #include "../stdafx.h"
@@ -14,13 +16,13 @@
 #include <dmusicf.h>
 
 
-// the performance object controls manipulation of the segments
+/** the performance object controls manipulation of the segments */
 static IDirectMusicPerformance* performance = NULL;
 
-// the loader object can load many types of DMusic related files
+/** the loader object can load many types of DMusic related files */
 static IDirectMusicLoader* loader = NULL;
 
-// the segment object is where the MIDI data is stored for playback
+/** the segment object is where the MIDI data is stored for playback */
 static IDirectMusicSegment* segment = NULL;
 
 static bool seeking = false;
@@ -54,12 +56,12 @@
 			return "ole32.dll load failed";
 	}
 
-	// Initialize COM
+	/* Initialize COM */
 	if (FAILED(proc.CoInitialize(NULL))) {
 		return "COM initialization failed";
 	}
 
-	// create the performance object
+	/* create the performance object */
 	if (FAILED(proc.CoCreateInstance(
 				CLSID_DirectMusicPerformance,
 				NULL,
@@ -71,7 +73,7 @@
 		return "Failed to create the performance object";
 	}
 
-	// initialize it
+	/* initialize it */
 	if (FAILED(performance->Init(NULL, NULL, NULL))) {
 		performance->Release();
 		performance = NULL;
@@ -79,7 +81,7 @@
 		return "Failed to initialize performance object";
 	}
 
-	// choose default Windows synth
+	/* choose default Windows synth */
 	if (FAILED(performance->AddPort(NULL))) {
 		performance->CloseDown();
 		performance->Release();
@@ -88,7 +90,7 @@
 		return "AddPort failed";
 	}
 
-	// create the loader object; this will be used to load the MIDI file
+	/* create the loader object; this will be used to load the MIDI file */
 	if (FAILED(proc.CoCreateInstance(
 				CLSID_DirectMusicLoader,
 				NULL,
@@ -136,7 +138,7 @@
 
 static void DMusicMidiPlaySong(const char* filename)
 {
-	// set up the loader object info
+	/* set up the loader object info */
 	DMUS_OBJECTDESC obj_desc;
 	ZeroMemory(&obj_desc, sizeof(obj_desc));
 	obj_desc.dwSize = sizeof(obj_desc);
@@ -148,13 +150,13 @@
 		obj_desc.wszFileName, lengthof(obj_desc.wszFileName)
 	);
 
-	// release the existing segment if we have any
+	/* release the existing segment if we have any */
 	if (segment != NULL) {
 		segment->Release();
 		segment = NULL;
 	}
 
-	// make a new segment
+	/* make a new segment */
 	if (FAILED(loader->GetObject(
 				&obj_desc, IID_IDirectMusicSegment, (LPVOID*)&segment
 			))) {
@@ -162,7 +164,7 @@
 		return;
 	}
 
-	// tell the segment what kind of data it contains
+	/* tell the segment what kind of data it contains */
 	if (FAILED(segment->SetParam(
 				GUID_StandardMIDIFile, 0xFFFFFFFF, 0, 0, performance
 			))) {
@@ -170,13 +172,13 @@
 		return;
 	}
 
-	// tell the segment to 'download' the instruments
+	/* tell the segment to 'download' the instruments */
 	if (FAILED(segment->SetParam(GUID_Download, 0xFFFFFFFF, 0, 0, performance))) {
 		DEBUG(driver, 0, "DirectMusic: failed to download instruments");
 		return;
 	}
 
-	// start playing the MIDI file
+	/* start playing the MIDI file */
 	if (FAILED(performance->PlaySegment(segment, 0, 0, NULL))) {
 		DEBUG(driver, 0, "DirectMusic: PlaySegment failed");
 		return;
@@ -210,8 +212,7 @@
 
 static void DMusicMidiSetVolume(byte vol)
 {
-	// 0 - 127 -> -2000 - 0
-	long db = vol * 2000 / 127 - 2000;
+	long db = vol * 2000 / 127 - 2000; ///< 0 - 127 -> -2000 - 0
 	performance->SetGlobalParam(GUID_PerfMasterVolume, &db, sizeof(db));
 }
 
--- a/src/music_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/music_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -207,8 +207,8 @@
 		LowerWindowWidget(w, 4);
 		DrawWindowWidgets(w);
 
-		GfxFillRect(3, 23, 3+177,23+191,0);
-		GfxFillRect(251, 23, 251+177,23+191,0);
+		GfxFillRect(3, 23, 3 + 177, 23 + 191, 0);
+		GfxFillRect(251, 23, 251 + 177, 23 + 191, 0);
 
 		DrawStringCentered(92, 15, STR_01EE_TRACK_INDEX, 0);
 
@@ -219,14 +219,14 @@
 			SetDParam(0, i);
 			SetDParam(2, i);
 			SetDParam(1, SPECSTR_SONGNAME);
-			DrawString(4, 23+(i-1)*6, (i < 10) ? STR_01EC_0 : STR_01ED, 0);
+			DrawString(4, 23 + (i - 1) * 6, (i < 10) ? STR_01EC_0 : STR_01ED, 0);
 		}
 
 		for (i = 0; i != 6; i++) {
 			DrawStringCentered(216, 45 + i * 8, STR_01D5_ALL + i, (i == msf.playlist) ? 0xC : 0x10);
 		}
 
-		DrawStringCentered(216, 45+8*6+16, STR_01F0_CLEAR, 0);
+		DrawStringCentered(216, 45 + 8 * 6 + 16, STR_01F0_CLEAR, 0);
 #if 0
 		DrawStringCentered(216, 45 + 8 * 6 + 16 * 2, STR_01F1_SAVE, 0);
 #endif
--- a/src/namegen.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/namegen.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -90,7 +90,7 @@
 	/* optional first segment */
 	i = SeedChanceBias(0, lengthof(name_additional_english_prefix), seed, 50);
 	if (i >= 0)
-		strecat(buf,name_additional_english_prefix[i], last);
+		strecat(buf, name_additional_english_prefix[i], last);
 
 	if (SeedChance(3, 20, seed) >= 14) {
 		strecat(buf, name_additional_english_1a[SeedChance(6, lengthof(name_additional_english_1a), seed)], last);
@@ -176,13 +176,13 @@
 	/* optional prefix */
 	if (seed_derivative == 12 || seed_derivative == 19) {
 		i = SeedChance(2, lengthof(name_german_pre), seed);
-		strecat(buf,name_german_pre[i], last);
+		strecat(buf, name_german_pre[i], last);
 	}
 
 	/* mandatory middle segments including option of hardcoded name */
 	i = SeedChance(3, lengthof(name_german_real) + lengthof(name_german_1), seed);
 	if (i < lengthof(name_german_real)) {
-		strecat(buf,name_german_real[i], last);
+		strecat(buf, name_german_real[i], last);
 	} else {
 		strecat(buf, name_german_1[i - lengthof(name_german_real)], last);
 
@@ -283,7 +283,7 @@
 	if (SeedChance(0, 15, seed) >= 10) {
 		strecat(buf, name_finnish_real[SeedChance(2, lengthof(name_finnish_real), seed)], last);
 	} else if (SeedChance(0, 15, seed) >= 5) {
-		/* A two-part name by combining one of name_finnish_1 + "la"/"lä"
+		/* A two-part name by combining one of name_finnish_1 + "la"/"lä"
 		 * The reason for not having the contents of name_finnish_{1,2} in the same table is
 		 * that the ones in name_finnish_2 are not good for this purpose. */
 		uint sel = SeedChance( 0, lengthof(name_finnish_1), seed);
@@ -297,7 +297,7 @@
 		{
 			strecat(buf, "la", last);
 		} else {
-			strecat(buf, "lä", last);
+			strecat(buf, "lä", last);
 		}
 	} else {
 		/* A two-part name by combining one of name_finnish_{1,2} + name_finnish_3.
@@ -679,7 +679,7 @@
 
 		if (SeedModChance(3, 3, seed) == 0) {
 			strecat(buf, name_italian_2[SeedModChance(11, lengthof(name_italian_2), seed)], last);
-			strecat(buf,mascul_femin_italian[i], last);
+			strecat(buf, mascul_femin_italian[i], last);
 		} else {
 			strecat(buf, name_italian_2i[SeedModChance(16, lengthof(name_italian_2i), seed)], last);
 		}
--- a/src/namegen.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/namegen.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file namegen.h */
+/** @file src/namegen.h Town name generator stuff */
 
 #ifndef NAMEGEN_H
 #define NAMEGEN_H
--- a/src/network/core/config.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/core/config.h	Sat Jun 02 19:59:29 2007 +0000
@@ -46,7 +46,7 @@
 	 */
 	NETWORK_MAX_GRF_COUNT         =   55,
 
-	NETWORK_NUM_LANGUAGES         =    4, ///< Number of known languages (to the network protocol) + 1 for 'any'.
+	NETWORK_NUM_LANGUAGES         =   29, ///< Number of known languages (to the network protocol) + 1 for 'any'.
 	/**
 	 * The number of landscapes in OpenTTD.
 	 * This number must be equal to NUM_LANDSCAPE, but as this number is used
--- a/src/network/core/os_abstraction.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/core/os_abstraction.h	Sat Jun 02 19:59:29 2007 +0000
@@ -161,7 +161,7 @@
 /* Make the names compatible */
 #	define closesocket(s) CloseSocket(s)
 #	define GET_LAST_ERROR() Errno()
-#	define ioctlsocket(s,request,status) IoctlSocket((LONG)s,(ULONG)request,(char*)status)
+#	define ioctlsocket(s, request, status) IoctlSocket((LONG)s, (ULONG)request, (char*)status)
 #	define ioctl ioctlsocket
 
 	typedef unsigned int in_addr_t;
--- a/src/network/network.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/network.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1395,11 +1395,13 @@
 		byte cl_max = _network_game_info.clients_max;
 		byte cp_max = _network_game_info.companies_max;
 		byte sp_max = _network_game_info.spectators_max;
+		byte s_lang = _network_game_info.server_lang;
 
 		memset(&_network_game_info, 0, sizeof(_network_game_info));
 		_network_game_info.clients_max = cl_max;
 		_network_game_info.companies_max = cp_max;
 		_network_game_info.spectators_max = sp_max;
+		_network_game_info.server_lang = s_lang;
 	}
 
 
--- a/src/network/network_client.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/network_client.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -184,7 +184,7 @@
 	// Data:
 	//    uint8:  ActionID (see network_data.h, NetworkAction)
 	//    uint8:  Destination Type (see network_data.h, DestType);
-	//    uint8:  Destination Player (1..MAX_PLAYERS)
+	//    uint16: Destination Player
 	//    String: Message (max MAX_TEXT_MSG_LEN)
 	//
 
@@ -192,7 +192,7 @@
 
 	p->Send_uint8 (action);
 	p->Send_uint8 (type);
-	p->Send_uint8 (dest);
+	p->Send_uint16(dest);
 	p->Send_string(msg);
 	MY_CLIENT->Send_Packet(p);
 }
@@ -523,7 +523,7 @@
 		if (_network_join_kbytes_total == 0) return NETWORK_RECV_STATUS_MALFORMED_PACKET;
 
 		_network_join_status = NETWORK_JOIN_STATUS_DOWNLOADING;
- 		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
+		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
 
 		// The first packet does not contain any more data
 		return NETWORK_RECV_STATUS_OKAY;
--- a/src/network/network_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/network_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -84,15 +84,73 @@
 	STR_NETWORK_10_PLAYERS,
 	INVALID_STRING_ID
 };
-
+/* The strings are in alphabetical order (in English). */
 static const StringID _language_dropdown[] = {
 	STR_NETWORK_LANG_ANY,
+	STR_NETWORK_LANG_BRAZILIAN,
+	STR_NETWORK_LANG_BULGARIAN,
+	STR_NETWORK_LANG_CHINESE,
+	STR_NETWORK_LANG_CZECH,
+	STR_NETWORK_LANG_DANISH,
+	STR_NETWORK_LANG_DUTCH,
 	STR_NETWORK_LANG_ENGLISH,
+	STR_NETWORK_LANG_ESPERANTO,
+	STR_NETWORK_LANG_FINNISH,
+	STR_NETWORK_LANG_FRENCH,
 	STR_NETWORK_LANG_GERMAN,
-	STR_NETWORK_LANG_FRENCH,
+	STR_NETWORK_LANG_HUNGARIAN,
+	STR_NETWORK_LANG_ICELANDIC,
+	STR_NETWORK_LANG_ITALIAN,
+	STR_NETWORK_LANG_JAPANESE,
+	STR_NETWORK_LANG_KOREAN,
+	STR_NETWORK_LANG_LITHUANIAN,
+	STR_NETWORK_LANG_NORWEGIAN,
+	STR_NETWORK_LANG_POLISH,
+	STR_NETWORK_LANG_PORTUGUESE,
+	STR_NETWORK_LANG_ROMANIAN,
+	STR_NETWORK_LANG_RUSSIAN,
+	STR_NETWORK_LANG_SLOVAK,
+	STR_NETWORK_LANG_SLOVENIAN,
+	STR_NETWORK_LANG_SPANISH,
+	STR_NETWORK_LANG_SWEDISH,
+	STR_NETWORK_LANG_TURKISH,
+	STR_NETWORK_LANG_UKRAINIAN,
 	INVALID_STRING_ID
 };
 
+/* Used to map the _server_lang value to the sorted string. */
+static const int _server_lang_to_string[] = {
+	 0, // Any
+	 7, // English
+	11, // German
+	10, // French
+	 1, // Brazilian
+	 2, // Bulgarian
+	 3, // Chinese
+	 4, // Czech
+	 5, // Danish
+	 6, // Dutch
+	 8, // Esperanto
+	 9, // Finnish
+	12, // Hungarian
+	13, // Icelandic
+	14, // Italian
+	15, // Japanese
+	16, // Korean
+	17, // Lithuanian
+	18, // Norwegian
+	19, // Polish
+	20, // Portuguese
+	21, // Romanian
+	22, // Russian
+	23, // Slovak
+	24, // Slovenian
+	25, // Spanish
+	26, // Swedish
+	27, // Turkish
+	28, // Ukrainian
+};
+
 enum {
 	NET_PRC__OFFSET_TOP_WIDGET          = 54,
 	NET_PRC__OFFSET_TOP_WIDGET_COMPANY  = 52,
@@ -342,7 +400,7 @@
 			DrawString(x, y, STR_NETWORK_CLIENTS, 2);
 			y += 10;
 
-			SetDParam(0, _language_dropdown[sel->info.server_lang]);
+			SetDParam(0, _language_dropdown[_server_lang_to_string[sel->info.server_lang]]);
 			DrawString(x, y, STR_NETWORK_LANGUAGE, 2); // server language
 			y += 10;
 
@@ -385,7 +443,7 @@
 
 			y += 10;
 		}
-	}	break;
+	} break;
 
 	case WE_CLICK:
 		nd->field = e->we.click.widget;
@@ -452,7 +510,7 @@
 			if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig);
 			break;
 
-	}	break;
+	} break;
 
 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
 		switch (e->we.dropdown.button) {
@@ -609,7 +667,7 @@
 		SetDParam( 9, _players_dropdown[_network_game_info.clients_max]);
 		SetDParam(11, _players_dropdown[_network_game_info.companies_max]);
 		SetDParam(13, _players_dropdown[_network_game_info.spectators_max]);
-		SetDParam(15, _language_dropdown[_network_game_info.server_lang]);
+		SetDParam(15, _language_dropdown[_server_lang_to_string[_network_game_info.server_lang]]);
 		DrawWindowWidgets(w);
 
 		GfxFillRect(11, 63, 258, 215, 0xD7);
@@ -644,7 +702,7 @@
 
 			if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
 		}
-	}	break;
+	} break;
 
 	case WE_CLICK:
 		nd->field = e->we.click.widget;
@@ -680,7 +738,7 @@
 			ShowDropDownMenu(w, _players_dropdown, _network_game_info.spectators_max, 14, 0, 0);
 			break;
 		case 15: case 16: /* Language */
-			ShowDropDownMenu(w, _language_dropdown, _network_game_info.server_lang, 16, 0, 0);
+			ShowDropDownMenu(w, _language_dropdown, _server_lang_to_string[_network_game_info.server_lang], 16, 0, 0);
 			break;
 		case 17: /* Start game */
 			_is_network_server = true;
@@ -715,7 +773,13 @@
 			case 10: _network_game_info.clients_max    = e->we.dropdown.index;        break;
 			case 12: _network_game_info.companies_max  = e->we.dropdown.index;        break;
 			case 14: _network_game_info.spectators_max = e->we.dropdown.index;        break;
-			case 16: _network_game_info.server_lang    = e->we.dropdown.index;        break;
+			case 16:
+				for (uint i = 0; i < lengthof(_server_lang_to_string); i++) {
+					if (_server_lang_to_string[i] == e->we.dropdown.index) {
+						_network_game_info.server_lang = i;
+					}
+				}
+				break;
 		}
 
 		SetWindowDirty(w);
@@ -789,7 +853,7 @@
 	_saveload_mode = SLD_NEW_GAME;
 	BuildFileList();
 	w->vscroll.cap = 12;
-	w->vscroll.count = _fios_num+1;
+	w->vscroll.count = _fios_num + 1;
 
 	WP(w, network_ql_d).q.afilter = CS_ALPHANUMERAL;
 	InitializeTextBuffer(&WP(w, network_ql_d).q.text, _edit_str_buf, lengthof(_edit_str_buf), 160);
@@ -914,7 +978,7 @@
 			SetDParamStr(0, _network_player_info[nd->company].players);
 			DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, 2, trunc_width); // players
 		}
-	}	break;
+	} break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
@@ -929,7 +993,7 @@
 			id_v += w->vscroll.pos;
 			nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
 			SetWindowDirty(w);
-		}	break;
+		} break;
 		case 7: /* Join company */
 			if (nd->company != (byte)-1) {
 				_network_playas = nd->company;
@@ -948,7 +1012,7 @@
 			NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
 			NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
 			break;
-		}	break;
+		} break;
 
 	case WE_MESSAGE:
 		SetWindowDirty(w);
@@ -1265,7 +1329,7 @@
 
 			DoDrawString(_clientlist_action[i], 4, y, colour);
 		}
-	}	break;
+	} break;
 
 	case WE_POPUPMENU_SELECT: {
 		// We selected an action
@@ -1275,7 +1339,7 @@
 			HandleClientListPopupClick(index, WP(w,menu_d).main_button);
 
 		DeleteWindowById(WC_TOOLBAR_MENU, 0);
-	}	break;
+	} break;
 
 	case WE_POPUPMENU_OVER: {
 		// Our mouse hoovers over an action? Select it!
@@ -1327,7 +1391,7 @@
 
 			y += CLNWND_ROWSIZE;
 		}
-	}	break;
+	} break;
 
 	case WE_CLICK:
 		// Show the popup with option
@@ -1420,7 +1484,7 @@
 
 		/* Draw nice progress bar :) */
 		DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE);
-	}	break;
+	} break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
@@ -1469,7 +1533,7 @@
 	if (w != NULL) w->parent = FindWindowById(WC_NETWORK_WINDOW, 0);
 }
 
-static void SendChat(const char *buf, DestType type, byte dest)
+static void SendChat(const char *buf, DestType type, int dest)
 {
 	if (buf[0] == '\0') return;
 	if (!_network_server) {
@@ -1533,7 +1597,7 @@
 static void ChatTabCompletion(Window *w)
 {
 	static char _chat_tab_completion_buf[lengthof(_edit_str_buf)];
-	Textbuf *tb = &WP(w, querystr_d).text;
+	Textbuf *tb = &WP(w, chatquerystr_d).text;
 	uint len, tb_len;
 	uint item;
 	char *tb_buf, *pre_buf;
@@ -1591,7 +1655,7 @@
 			}
 
 			/* Update the textbuffer */
-			UpdateTextBufferSize(&WP(w, querystr_d).text);
+			UpdateTextBufferSize(&WP(w, chatquerystr_d).text);
 
 			SetWindowDirty(w);
 			free(pre_buf);
@@ -1605,17 +1669,17 @@
 		_chat_tab_completion_active = false;
 
 		/* Update the textbuffer */
-		UpdateTextBufferSize(&WP(w, querystr_d).text);
+		UpdateTextBufferSize(&WP(w, chatquerystr_d).text);
 
 		SetWindowDirty(w);
 	}
 	free(pre_buf);
 }
 
-/* uses querystr_d WP macro
- * uses querystr_d->caption to store
- * - type of chat message (Private/Team/All) in bytes 0-7
- * - destination of chat message in the case of Team/Private in bytes 8-15 */
+/*
+ * uses chatquerystr_d WP macro
+ * uses chatquerystr_d->caption to store type of chat message (Private/Team/All)
+ */
 static void ChatWindowWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
@@ -1634,25 +1698,25 @@
 
 		DrawWindowWidgets(w);
 
-		assert(GB(WP(w, querystr_d).caption, 0, 8) < lengthof(chat_captions));
-		msg = chat_captions[GB(WP(w, querystr_d).caption, 0, 8)];
+		assert(WP(w, chatquerystr_d).caption < lengthof(chat_captions));
+		msg = chat_captions[WP(w, chatquerystr_d).caption];
 		DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, msg, 16);
-		DrawEditBox(w, &WP(w, querystr_d), 2);
+		DrawEditBox(w, &WP(w, chatquerystr_d), 2);
 	} break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
 			case 3: { /* Send */
-				DestType type = (DestType)GB(WP(w, querystr_d).caption, 0, 8);
-				byte dest = GB(WP(w, querystr_d).caption, 8, 8);
-				SendChat(WP(w, querystr_d).text.buf, type, dest);
+				DestType type = (DestType)WP(w, chatquerystr_d).caption;
+				int dest = WP(w, chatquerystr_d).dest;
+				SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
 			} /* FALLTHROUGH */
 			case 0: /* Cancel */ DeleteWindow(w); break;
 		}
 		break;
 
 	case WE_MOUSELOOP:
-		HandleEditBox(w, &WP(w, querystr_d), 2);
+		HandleEditBox(w, &WP(w, chatquerystr_d), 2);
 		break;
 
 	case WE_KEYPRESS:
@@ -1660,11 +1724,11 @@
 			ChatTabCompletion(w);
 		} else {
 			_chat_tab_completion_active = false;
-			switch (HandleEditBoxKey(w, &WP(w, querystr_d), 2, e)) {
+			switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) {
 				case 1: { /* Return */
-				DestType type = (DestType)GB(WP(w, querystr_d).caption, 0, 8);
-				byte dest = GB(WP(w, querystr_d).caption, 8, 8);
-				SendChat(WP(w, querystr_d).text.buf, type, dest);
+				DestType type = (DestType)WP(w, chatquerystr_d).caption;
+				int dest = WP(w, chatquerystr_d).dest;
+				SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
 			} /* FALLTHROUGH */
 				case 2: /* Escape */ DeleteWindow(w); break;
 			}
@@ -1694,7 +1758,7 @@
 	ChatWindowWndProc
 };
 
-void ShowNetworkChatQueryWindow(DestType type, byte dest)
+void ShowNetworkChatQueryWindow(DestType type, int dest)
 {
 	Window *w;
 
@@ -1706,9 +1770,10 @@
 	w = AllocateWindowDesc(&_chat_window_desc);
 
 	LowerWindowWidget(w, 2);
-	WP(w, querystr_d).caption = GB(type, 0, 8) | (dest << 8); // Misuse of caption
-	WP(w, querystr_d).afilter = CS_ALPHANUMERAL;
-	InitializeTextBuffer(&WP(w, querystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 0);
+	WP(w, chatquerystr_d).caption = type; // Misuse of caption
+	WP(w, chatquerystr_d).dest    = dest;
+	WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
+	InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 0);
 }
 
 #endif /* ENABLE_NETWORK */
--- a/src/network/network_gui.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/network_gui.h	Sat Jun 02 19:59:29 2007 +0000
@@ -9,7 +9,7 @@
 
 void ShowNetworkNeedPassword(NetworkPasswordType npt);
 void ShowNetworkGiveMoneyWindow(PlayerID player); // PlayerID
-void ShowNetworkChatQueryWindow(DestType type, byte dest);
+void ShowNetworkChatQueryWindow(DestType type, int dest);
 void ShowJoinStatusWindow();
 void ShowNetworkGameWindow();
 void ShowClientList();
@@ -17,7 +17,7 @@
 #else /* ENABLE_NETWORK */
 /* Network function stubs when networking is disabled */
 
-static inline void ShowNetworkChatQueryWindow(byte desttype, byte dest) {}
+static inline void ShowNetworkChatQueryWindow(byte desttype, int dest) {}
 static inline void ShowClientList() {}
 static inline void ShowNetworkGameWindow() {}
 
--- a/src/network/network_server.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/network_server.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -101,7 +101,7 @@
 		p->Send_uint16(_network_player_info[player->index].performance);
 
 		/* Send 1 if there is a passord for the company else send 0 */
-		p->Send_bool(StrEmpty(_network_player_info[player->index].password));
+		p->Send_bool(!StrEmpty(_network_player_info[player->index].password));
 
 		for (i = 0; i < NETWORK_VEHICLE_TYPES; i++) {
 			p->Send_uint16(_network_player_info[player->index].num_vehicle[i]);
@@ -1115,7 +1115,7 @@
 {
 	NetworkAction action = (NetworkAction)p->Recv_uint8();
 	DestType desttype = (DestType)p->Recv_uint8();
-	int dest = p->Recv_uint8();
+	int dest = p->Recv_uint16();
 	char msg[MAX_TEXT_MSG_LEN];
 
 	p->Recv_string(msg, MAX_TEXT_MSG_LEN);
@@ -1301,9 +1301,7 @@
 				_network_player_info[v->owner].num_vehicle[4]++;
 				break;
 
-			case VEH_SPECIAL:
-			case VEH_DISASTER:
-				break;
+			default: break;
 		}
 	}
 
--- a/src/network/network_udp.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/network/network_udp.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -240,7 +240,7 @@
 		/* The name could be an empty string, if so take the filename */
 		ttd_strlcpy(name, (in_reply[i]->name != NULL && !StrEmpty(in_reply[i]->name)) ?
 				in_reply[i]->name : in_reply[i]->filename, sizeof(name));
-	 	this->Send_GRFIdentifier(&packet, in_reply[i]);
+		this->Send_GRFIdentifier(&packet, in_reply[i]);
 		packet.Send_string(name);
 	}
 
@@ -391,12 +391,13 @@
 		/* Don't know the GRF, so mark game incompatible and the (possibly)
 		 * already resolved name for this GRF (another server has sent the
 		 * name of the GRF already */
-		config->name     = FindUnknownGRFName(config->grfid, config->md5sum, true);
-		config->status   = GCS_NOT_FOUND;
+		config->name   = FindUnknownGRFName(config->grfid, config->md5sum, true);
+		config->status = GCS_NOT_FOUND;
 	} else {
-		config->filename = f->filename;
-		config->name     = f->name;
-		config->info     = f->info;
+		config->filename  = f->filename;
+		config->full_path = f->full_path;
+		config->name      = f->name;
+		config->info      = f->info;
 	}
 	SETBIT(config->flags, GCF_COPY);
 }
--- a/src/newgrf.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -38,6 +38,9 @@
 #include "helpers.hpp"
 #include "table/town_land.h"
 #include "cargotype.h"
+#include "industry.h"
+#include "newgrf_canal.h"
+#include "newgrf_commons.h"
 
 /* TTDPatch extended GRF format codec
  * (c) Petr Baudis 2004 (GPL'd)
@@ -71,12 +74,8 @@
 /* Used by Action 0x06 to preload a pseudo sprite and modify its content */
 static byte *_preload_sprite = NULL;
 
-/* Set if any vehicle is loaded which uses 2cc (two company colours) */
-bool _have_2cc = false;
-
-/* Set if there are any newhouses loaded. */
-bool _have_newhouses = false;
-
+/* Indicates which are the newgrf features currently loaded ingame */
+uint8 _loaded_newgrf_features;
 
 enum GrfDataType {
 	GDT_SOUND,
@@ -100,6 +99,7 @@
 	GSF_INDUSTRIES,
 	GSF_CARGOS,
 	GSF_SOUNDFX,
+	GSF_FSMPORTS,
 };
 
 
@@ -121,6 +121,7 @@
 
 enum {
 	MAX_STATIONS = 256,
+	MAX_FSM_PORTS = 256,
 };
 
 static uint16 cargo_allowed[TOTAL_NUM_ENGINES];
@@ -129,6 +130,9 @@
 /* Contains the GRF ID of the owner of a vehicle if it has been reserved */
 static uint32 _grm_engines[TOTAL_NUM_ENGINES];
 
+/* Contains the GRF ID of the owner of a cargo if it has been reserved */
+static uint32 _grm_cargos[NUM_CARGO];
+
 /** DEBUG() function dedicated to newGRF debugging messages
  * Function is essentialy the same as DEBUG(grf, severity, ...) with the
  * addition of file:line information when parsing grf files.
@@ -136,7 +140,7 @@
  * loading/parsing grf files, not for runtime debug messages as there
  * is no file information available during that time.
  * @param severity debugging severity level, see debug.h
- * @param debugging message in printf() format */
+ * @param str message in printf() format */
 void CDECL grfmsg(int severity, const char *str, ...)
 {
 	char buf[1024];
@@ -234,6 +238,7 @@
 
 /** Used when setting an object's property to map to the GRF's strings
  * while taking in consideration the "drift" between TTDPatch string system and OpenTTD's one
+ * @param grfid Id of the grf file
  * @param str StringID that we want to have the equivalent in OoenTTD
  * @return the properly adjusted StringID
  */
@@ -309,7 +314,7 @@
 				uint8 tracktype = grf_load_byte(&buf);
 
 				switch (tracktype) {
-					case 0: rvi[i].railtype = rvi[i].engclass == 2 ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL; break;
+					case 0: rvi[i].railtype = rvi[i].engclass >= 2 ? RAILTYPE_ELECTRIC : RAILTYPE_RAIL; break;
 					case 1: rvi[i].railtype = RAILTYPE_MONO; break;
 					case 2: rvi[i].railtype = RAILTYPE_MAGLEV; break;
 					default:
@@ -445,21 +450,23 @@
 			 */
 			FOR_EACH_OBJECT {
 				uint8 traction = grf_load_byte(&buf);
-				int engclass;
+				EngineClass engclass;
 
 				if (traction <= 0x07) {
-					engclass = 0;
+					engclass = EC_STEAM;
 				} else if (traction <= 0x27) {
-					engclass = 1;
+					engclass = EC_DIESEL;
 				} else if (traction <= 0x31) {
-					engclass = 2;
+					engclass = EC_ELECTRIC;
+				} else if (traction <= 0x37) {
+					engclass = EC_MONORAIL;
 				} else if (traction <= 0x41) {
-					engclass = 2;
+					engclass = EC_MAGLEV;
 				} else {
 					break;
 				}
-				if (rvi[i].railtype == RAILTYPE_RAIL     && engclass == 2) rvi[i].railtype = RAILTYPE_ELECTRIC;
-				if (rvi[i].railtype == RAILTYPE_ELECTRIC && engclass != 2) rvi[i].railtype = RAILTYPE_RAIL;
+				if (rvi[i].railtype == RAILTYPE_RAIL     && engclass >= EC_ELECTRIC) rvi[i].railtype = RAILTYPE_ELECTRIC;
+				if (rvi[i].railtype == RAILTYPE_ELECTRIC && engclass  < EC_ELECTRIC) rvi[i].railtype = RAILTYPE_RAIL;
 
 				rvi[i].engclass = engclass;
 			}
@@ -526,10 +533,14 @@
 			FOR_EACH_OBJECT rvi[i].user_def_data = grf_load_byte(&buf);
 			break;
 
+		case 0x26: // Retire vehicle early
+			FOR_EACH_OBJECT ei[i].retire_early = grf_load_byte(&buf);
+			break;
+
 		case 0x27: // Miscellaneous flags
 			FOR_EACH_OBJECT {
 				ei[i].misc_flags = grf_load_byte(&buf);
-				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
+				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) SETBIT(_loaded_newgrf_features, GRFLOADED_2CC);
 			}
 			break;
 
@@ -548,7 +559,6 @@
 		/* @todo air drag and retire vehicle early
 		 * Fall-through for unimplemented one byte long properties. */
 		case 0x20: // Air drag
-		case 0x26: // Retire vehicle early
 			FOR_EACH_OBJECT grf_load_byte(&buf);
 			ret = true;
 			break;
@@ -645,10 +655,14 @@
 			FOR_EACH_OBJECT ei[i].refit_cost = grf_load_byte(&buf);
 			break;
 
+		case 0x1B: // Retire vehicle early
+			FOR_EACH_OBJECT ei[i].retire_early = grf_load_byte(&buf);
+			break;
+
 		case 0x1C: // Miscellaneous flags
 			FOR_EACH_OBJECT {
 				ei[i].misc_flags = grf_load_byte(&buf);
-				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
+				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) SETBIT(_loaded_newgrf_features, GRFLOADED_2CC);
 			}
 			break;
 
@@ -666,7 +680,6 @@
 
 		case 0x18: // Tractive effort
 		case 0x19: // Air drag
-		case 0x1B: // Retire vehicle early
 			/* @todo */
 			FOR_EACH_OBJECT grf_load_byte(&buf);
 			ret = true;
@@ -753,10 +766,14 @@
 			FOR_EACH_OBJECT ei[i].refit_cost = grf_load_byte(&buf);
 			break;
 
+		case 0x16: // Retire vehicle early
+			FOR_EACH_OBJECT ei[i].retire_early = grf_load_byte(&buf);
+			break;
+
 		case 0x17: // Miscellaneous flags
 			FOR_EACH_OBJECT {
 				ei[i].misc_flags = grf_load_byte(&buf);
-				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
+				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) SETBIT(_loaded_newgrf_features, GRFLOADED_2CC);
 			}
 			break;
 
@@ -774,7 +791,6 @@
 
 		case 0x14: // Ocean speed fraction
 		case 0x15: // Canal speed fraction
-		case 0x16: // Retire vehicle early
 			/* @todo */
 			FOR_EACH_OBJECT grf_load_byte(&buf);
 			ret = true;
@@ -866,10 +882,14 @@
 			FOR_EACH_OBJECT ei[i].refit_cost = grf_load_byte(&buf);
 			break;
 
+		case 0x16: // Retire vehicle early
+			FOR_EACH_OBJECT ei[i].retire_early = grf_load_byte(&buf);
+			break;
+
 		case 0x17: // Miscellaneous flags
 			FOR_EACH_OBJECT {
 				ei[i].misc_flags = grf_load_byte(&buf);
-				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) _have_2cc = true;
+				if (HASBIT(ei[i].misc_flags, EF_USES_2CC)) SETBIT(_loaded_newgrf_features, GRFLOADED_2CC);
 			}
 			break;
 
@@ -885,12 +905,6 @@
 			FOR_EACH_OBJECT ei[i].base_intro = grf_load_dword(&buf);
 			break;
 
-		case 0x16: // Retire vehicle early
-			/* @todo */
-			FOR_EACH_OBJECT grf_load_byte(&buf);
-			ret = true;
-			break;
-
 		default:
 			ret = true;
 			break;
@@ -1234,7 +1248,7 @@
 		_cur_grffile->housespec = CallocT<HouseSpec*>(HOUSE_MAX);
 
 		/* Reset any overrides that have been set. */
-		ResetHouseOverrides();
+		_house_mngr.ResetOverride();
 	}
 
 	housespec = &_cur_grffile->housespec[hid];
@@ -1284,7 +1298,7 @@
 				 * FinaliseHouseArray() for more details. */
 				if (housespec[i]->min_date < 1930) housespec[i]->min_date = 1930;
 			}
-			_have_newhouses = true;
+			SETBIT(_loaded_newgrf_features, GRFLOADED_NEWHOUSES);
 			break;
 
 		case 0x09: // Building flags
@@ -1360,7 +1374,7 @@
 					return false;
 				}
 
-				AddHouseOverride(hid, override);
+				_house_mngr.Add(hid, override);
 			}
 			break;
 
@@ -1371,7 +1385,7 @@
 		case 0x17: // Four random colours to use
 			FOR_EACH_OBJECT {
 				uint j;
-				for (j = 0; j < 4; j++)	housespec[i]->random_colour[j] = grf_load_byte(&buf);
+				for (j = 0; j < 4; j++) housespec[i]->random_colour[j] = grf_load_byte(&buf);
 			}
 			break;
 
@@ -1403,8 +1417,29 @@
 			break;
 
 		case 0x1E: // Accepted cargo types
-			FOR_EACH_OBJECT grf_load_dword(&buf);
-			ret = true;
+			FOR_EACH_OBJECT {
+				uint32 cargotypes = grf_load_dword(&buf);
+
+				/* Check if the cargo types should not be changed */
+				if (cargotypes == 0xFFFFFFFF) break;
+
+				for (uint j = 0; j < 3; j++) {
+					/* Get the cargo number from the 'list' */
+					uint8 cargo_part = GB(cargotypes, 8 * j, 8);
+					CargoID cargo = GetCargoTranslation(cargo_part, _cur_grffile);
+
+					if (cargo == CT_INVALID) {
+						/* Disable acceptance of invalid cargo type */
+						housespec[i]->cargo_acceptance[j] = 0;
+					} else {
+						housespec[i]->accepts_cargo[j] = cargo;
+					}
+				}
+			}
+			break;
+
+		case 0x1F: // Minimum life span
+			FOR_EACH_OBJECT housespec[i]->minimum_life = grf_load_byte(&buf);
 			break;
 
 		default:
@@ -1505,7 +1540,7 @@
 				uint32 tempfix = grf_load_dword(&buf);
 
 				if (curidx < NUM_CURRENCY) {
-					memcpy(&_currency_specs[curidx].suffix,&tempfix,4);
+					memcpy(&_currency_specs[curidx].suffix, &tempfix, 4);
 					_currency_specs[curidx].suffix[4] = 0;
 				} else {
 					grfmsg(1, "GlobalVarChangeInfo: Currency symbol %d out of range, ignoring", curidx);
@@ -1735,6 +1770,240 @@
 	return ret;
 }
 
+static bool FSMPortChangeInfo(uint stid, int numinfo, int prop, byte **bufp, int len)
+{
+	StationSpec **statspec;
+	byte *buf = *bufp;
+	int i;
+	bool ret = false;
+
+	if (stid + numinfo > MAX_FSM_PORTS) {
+		grfmsg(1, "StationChangeInfo: Station %u is invalid, max %u, ignoring", stid + numinfo, MAX_FSM_PORTS);
+		return false;
+	}
+
+	/* Allocate station specs if necessary */
+	if (_cur_grffile->stations == NULL) _cur_grffile->stations = CallocT<StationSpec*>(MAX_FSM_PORTS);
+
+	statspec = &_cur_grffile->stations[stid];
+
+	if (prop != 0x08) {
+		/* Check that all stations we are modifying are defined. */
+		FOR_EACH_OBJECT {
+			if (statspec[i] == NULL) {
+				grfmsg(2, "StationChangeInfo: Attempt to modify undefined station %u, ignoring", stid + i);
+				return false;
+			}
+		}
+	}
+
+	switch (prop) {
+		case 0x08: // Class ID
+			FOR_EACH_OBJECT {
+				/* Property 0x08 is special; it is where the station is allocated */
+				if (statspec[i] == NULL) statspec[i] = CallocT<StationSpec>(1);
+
+				/* Swap classid because we read it in BE meaning WAYP or DFLT */
+				uint32 classid = grf_load_dword(&buf);
+				statspec[i]->sclass = AllocateStationClass(BSWAP32(classid));
+			}
+			break;
+
+		case 0x09: // Define sprite layout
+			FOR_EACH_OBJECT {
+				StationSpec *statspec = _cur_grffile->stations[stid + i];
+
+				statspec->tiles = grf_load_extended(&buf);
+				statspec->renderdata = CallocT<DrawTileSprites>(statspec->tiles);
+				statspec->copied_renderdata = false;
+
+				for (uint t = 0; t < statspec->tiles; t++) {
+					DrawTileSprites *dts = &statspec->renderdata[t];
+					uint seq_count = 0;
+
+					dts->seq = NULL;
+					dts->ground_sprite = grf_load_word(&buf);
+					dts->ground_pal = grf_load_word(&buf);
+					if (dts->ground_sprite == 0) continue;
+					if (HASBIT(dts->ground_pal, 15)) {
+						CLRBIT(dts->ground_pal, 15);
+						SETBIT(dts->ground_sprite, SPRITE_MODIFIER_USE_OFFSET);
+					}
+
+					while (buf < *bufp + len) {
+						DrawTileSeqStruct *dtss;
+
+						/* no relative bounding box support */
+						dts->seq = ReallocT((DrawTileSeqStruct*)dts->seq, ++seq_count);
+						dtss = (DrawTileSeqStruct*) &dts->seq[seq_count - 1];
+
+						dtss->delta_x = grf_load_byte(&buf);
+						if ((byte) dtss->delta_x == 0x80) break;
+						dtss->delta_y = grf_load_byte(&buf);
+						dtss->delta_z = grf_load_byte(&buf);
+						dtss->size_x = grf_load_byte(&buf);
+						dtss->size_y = grf_load_byte(&buf);
+						dtss->size_z = grf_load_byte(&buf);
+						dtss->image = grf_load_word(&buf);
+						dtss->pal = grf_load_word(&buf);
+
+						/* Remap flags as ours collide */
+						if (HASBIT(dtss->pal, 15)) {
+							CLRBIT(dtss->pal, 15);
+							SETBIT(dtss->image, SPRITE_MODIFIER_USE_OFFSET);
+						}
+
+						if (HASBIT(dtss->image, 15)) {
+							CLRBIT(dtss->image, 15);
+							SETBIT(dtss->image, PALETTE_MODIFIER_COLOR);
+						}
+						if (HASBIT(dtss->image, 14)) {
+							CLRBIT(dtss->image, 14);
+							SETBIT(dtss->image, PALETTE_MODIFIER_TRANSPARENT);
+						}
+					}
+				}
+			}
+			break;
+
+		case 0x0A: // Copy sprite layout
+			FOR_EACH_OBJECT {
+				StationSpec *statspec = _cur_grffile->stations[stid + i];
+				byte srcid = grf_load_byte(&buf);
+				const StationSpec *srcstatspec = _cur_grffile->stations[srcid];
+
+				statspec->tiles = srcstatspec->tiles;
+				statspec->renderdata = srcstatspec->renderdata;
+				statspec->copied_renderdata = true;
+			}
+			break;
+
+		case 0x0B: // Callback mask
+			FOR_EACH_OBJECT statspec[i]->callbackmask = grf_load_byte(&buf);
+			break;
+
+		case 0x0C: // Disallowed number of platforms
+			FOR_EACH_OBJECT statspec[i]->disallowed_platforms = grf_load_byte(&buf);
+			break;
+
+		case 0x0D: // Disallowed platform lengths
+			FOR_EACH_OBJECT statspec[i]->disallowed_lengths = grf_load_byte(&buf);
+			break;
+
+		case 0x0E: // Define custom layout
+			FOR_EACH_OBJECT {
+				StationSpec *statspec = _cur_grffile->stations[stid + i];
+
+				statspec->copied_layouts = false;
+
+				while (buf < *bufp + len) {
+					byte length = grf_load_byte(&buf);
+					byte number = grf_load_byte(&buf);
+					StationLayout layout;
+					uint l, p;
+
+					if (length == 0 || number == 0) break;
+
+					//debug("l %d > %d ?", length, stat->lengths);
+					if (length > statspec->lengths) {
+						statspec->platforms = ReallocT(statspec->platforms, length);
+						memset(statspec->platforms + statspec->lengths, 0, length - statspec->lengths);
+
+						statspec->layouts = ReallocT(statspec->layouts, length);
+						memset(statspec->layouts + statspec->lengths, 0,
+						       (length - statspec->lengths) * sizeof(*statspec->layouts));
+
+						statspec->lengths = length;
+					}
+					l = length - 1; // index is zero-based
+
+					//debug("p %d > %d ?", number, stat->platforms[l]);
+					if (number > statspec->platforms[l]) {
+						statspec->layouts[l] = ReallocT(statspec->layouts[l], number);
+						/* We expect NULL being 0 here, but C99 guarantees that. */
+						memset(statspec->layouts[l] + statspec->platforms[l], 0,
+						       (number - statspec->platforms[l]) * sizeof(**statspec->layouts));
+
+						statspec->platforms[l] = number;
+					}
+
+					p = 0;
+					layout = MallocT<byte>(length * number);
+					for (l = 0; l < length; l++) {
+						for (p = 0; p < number; p++) {
+							layout[l * number + p] = grf_load_byte(&buf);
+						}
+					}
+
+					l--;
+					p--;
+					free(statspec->layouts[l][p]);
+					statspec->layouts[l][p] = layout;
+				}
+			}
+			break;
+
+		case 0x0F: // Copy custom layout
+			FOR_EACH_OBJECT {
+				StationSpec *statspec = _cur_grffile->stations[stid + i];
+				byte srcid = grf_load_byte(&buf);
+				const StationSpec *srcstatspec = _cur_grffile->stations[srcid];
+
+				statspec->lengths   = srcstatspec->lengths;
+				statspec->platforms = srcstatspec->platforms;
+				statspec->layouts   = srcstatspec->layouts;
+				statspec->copied_layouts = true;
+			}
+			break;
+
+		case 0x10: // Little/lots cargo threshold
+			FOR_EACH_OBJECT statspec[i]->cargo_threshold = grf_load_word(&buf);
+			break;
+
+		case 0x11: // Pylon placement
+			FOR_EACH_OBJECT statspec[i]->pylons = grf_load_byte(&buf);
+			break;
+
+		case 0x12: // Cargo types for random triggers
+			FOR_EACH_OBJECT statspec[i]->cargo_triggers = grf_load_dword(&buf);
+			break;
+
+		case 0x13: // General flags
+			FOR_EACH_OBJECT statspec[i]->flags = grf_load_byte(&buf);
+			break;
+
+		case 0x14: // Overhead wire placement
+			FOR_EACH_OBJECT statspec[i]->wires = grf_load_byte(&buf);
+			break;
+
+		case 0x15: // Blocked tiles
+			FOR_EACH_OBJECT statspec[i]->blocked = grf_load_byte(&buf);
+			break;
+
+		case 0x16: // @todo Animation info
+			FOR_EACH_OBJECT grf_load_word(&buf);
+			ret = true;
+			break;
+
+		case 0x17: // @todo Animation speed
+			FOR_EACH_OBJECT grf_load_byte(&buf);
+			ret = true;
+			break;
+
+		case 0x18: // @todo Animation triggers
+			FOR_EACH_OBJECT grf_load_word(&buf);
+			ret = true;
+			break;
+
+		default:
+			ret = true;
+			break;
+	}
+
+	*bufp = buf;
+	return ret;
+}
+
 /* Action 0x00 */
 static void FeatureChangeInfo(byte *buf, int len)
 {
@@ -1768,15 +2037,11 @@
 		/* GSF_INDUSTRIES */   NULL,
 		/* GSF_CARGOS */       NULL, /* Cargo is handled during reservation */
 		/* GSF_SOUNDFX */      SoundEffectChangeInfo,
+		/* GSF_FSMPORTS */     FSMPortChangeInfo,
 	};
 
 	EngineInfo *ei = NULL;
 
-	if (len == 1) {
-		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
-		return;
-	}
-
 	if (!check_length(len, 6, "FeatureChangeInfo")) return;
 	buf++;
 	uint8 feature  = grf_load_byte(&buf);
@@ -1860,11 +2125,6 @@
 /* Action 0x00 (GLS_SAFETYSCAN) */
 static void SafeChangeInfo(byte *buf, int len)
 {
-	if (len == 1) {
-		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
-		return;
-	}
-
 	if (!check_length(len, 6, "SafeChangeInfo")) return;
 	buf++;
 	uint8 feature  = grf_load_byte(&buf);
@@ -1890,11 +2150,6 @@
 {
 	byte *bufend = buf + len;
 
-	if (len == 1) {
-		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
-		return;
-	}
-
 	if (!check_length(len, 6, "InitChangeInfo")) return;
 	buf++;
 	uint8 feature  = grf_load_byte(&buf);
@@ -1935,11 +2190,6 @@
 {
 	byte *bufend = buf + len;
 
-	if (len == 1) {
-		grfmsg(8, "Silently ignoring one-byte special sprite 0x00");
-		return;
-	}
-
 	if (!check_length(len, 6, "InitChangeInfo")) return;
 	buf++;
 	uint8 feature  = grf_load_byte(&buf);
@@ -1954,7 +2204,7 @@
 		uint8 prop = grf_load_byte(&buf);
 
 		if (CargoChangeInfo(index, numinfo, prop, &buf, bufend - buf)) {
-			grfmsg(2, "FeatureChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
+			grfmsg(2, "ReserveChangeInfo: Ignoring property 0x%02X (not implemented)", prop);
 		}
 	}
 }
@@ -1987,8 +2237,8 @@
 
 /**
  * Creates a spritegroup representing a sprite number result.
- * @param value The sprite number.
- * @param sprites The number of sprites per set.
+ * @param sprite The sprite number.
+ * @param num_sprites The number of sprites per set.
  * @return A spritegroup representing the sprite number result.
  */
 static const SpriteGroup* NewResultSpriteGroup(SpriteID sprite, byte num_sprites)
@@ -2036,6 +2286,20 @@
 	}
 }
 
+/* Action 0x01 (SKIP) */
+static void SkipAct1(byte *buf, int len)
+{
+	if (!check_length(len, 4, "SkipAct1")) return;
+	buf++;
+	grf_load_byte(&buf);
+	uint8 num_sets  = grf_load_byte(&buf);
+	uint16 num_ents = grf_load_extended(&buf);
+
+	_skip_sprites = num_sets * num_ents;
+
+	grfmsg(3, "SkipAct1: Skipping %d sprites", _skip_sprites);
+}
+
 /* Helper function to either create a callback or link to a previously
  * defined spritegroup. */
 static const SpriteGroup* GetGroupFromGroupID(byte setid, byte type, uint16 groupid)
@@ -2043,7 +2307,7 @@
 	if (HASBIT(groupid, 15)) return NewCallBackResultSpriteGroup(groupid);
 
 	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
-		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Groupid 0x%04X does not exist, leaving empty", setid, type, groupid);
+		grfmsg(1, "GetGroupFromGroupID(0x%02X:0x%02X): Groupid 0x%04X does not exist, leaving empty", setid, type, groupid);
 		return NULL;
 	}
 
@@ -2056,7 +2320,7 @@
 	if (HASBIT(spriteid, 15)) return NewCallBackResultSpriteGroup(spriteid);
 
 	if (spriteid >= _cur_grffile->spriteset_numsets) {
-		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Sprite set %u invalid, max %u", setid, type, spriteid, _cur_grffile->spriteset_numsets);
+		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Sprite set %u invalid, max %u", setid, type, spriteid, _cur_grffile->spriteset_numsets);
 		return NULL;
 	}
 
@@ -2064,7 +2328,7 @@
 	 * is skipped, as TTDPatch mandates that Action 0x02s must be processed.
 	 * We don't have that rule, but must live by the Patch... */
 	if (_cur_grffile->spriteset_start + spriteid * num_sprites + num_sprites > _cur_spriteid) {
-		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Real Sprite IDs 0x%04X - 0x%04X do not (all) exist (max 0x%04X), leaving empty",
+		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Real Sprite IDs 0x%04X - 0x%04X do not (all) exist (max 0x%04X), leaving empty",
 				setid, type,
 				_cur_grffile->spriteset_start + spriteid * num_sprites,
 				_cur_grffile->spriteset_start + spriteid * num_sprites + num_sprites - 1, _cur_spriteid - 1);
@@ -2072,7 +2336,7 @@
 	}
 
 	if (feature != _cur_grffile->spriteset_feature) {
-		grfmsg(1, "NewSpriteGroup(0x%02X:0x%02X): Sprite set feature 0x%02X does not match action feature 0x%02X, skipping",
+		grfmsg(1, "CreateGroupFromGroupID(0x%02X:0x%02X): Sprite set feature 0x%02X does not match action feature 0x%02X, skipping",
 				_cur_grffile->spriteset_feature, feature);
 		return NULL;
 	}
@@ -2180,7 +2444,7 @@
 			} while (HASBIT(varadjust, 5));
 
 			group->g.determ.num_ranges = grf_load_byte(&buf);
-			group->g.determ.ranges = CallocT<DeterministicSpriteGroupRange>(group->g.determ.num_ranges);
+			if (group->g.determ.num_ranges > 0) group->g.determ.ranges = CallocT<DeterministicSpriteGroupRange>(group->g.determ.num_ranges);
 
 			if (!check_length(bufend - buf, 2 + (2 + 2 * varsize) * group->g.determ.num_ranges, "NewSpriteGroup (Deterministic)")) return;
 
@@ -2231,6 +2495,7 @@
 				case GSF_SHIP:
 				case GSF_AIRCRAFT:
 				case GSF_STATION:
+				case GSF_CANAL:
 				case GSF_CARGOS:
 				{
 					byte sprites     = _cur_grffile->spriteset_numents;
@@ -2368,7 +2633,7 @@
 	if (_cur_grffile->cargo_max == 0) {
 		/* No cargo table, so use bitnum values */
 		if (ctype >= 32) {
-			grfmsg(1, "FeatureMapSpriteGroup: Cargo bitnum %d out of range (max 31), skipping.", ctype);
+			grfmsg(1, "TranslateCargo: Cargo bitnum %d out of range (max 31), skipping.", ctype);
 			return CT_INVALID;
 		}
 
@@ -2377,35 +2642,35 @@
 			if (!cs->IsValid()) continue;
 
 			if (cs->bitnum == ctype) {
-				grfmsg(6, "FeatureMapSpriteGroup: Cargo bitnum %d mapped to cargo type %d.", ctype, c);
+				grfmsg(6, "TranslateCargo: Cargo bitnum %d mapped to cargo type %d.", ctype, c);
 				return c;
 			}
 		}
 
-		grfmsg(5, "FeatureMapSpriteGroup: Cargo bitnum %d not available in this climate, skipping.", ctype);
+		grfmsg(5, "TranslateCargo: Cargo bitnum %d not available in this climate, skipping.", ctype);
 		return CT_INVALID;
 	}
 
 	/* Check if the cargo type is out of bounds of the cargo translation table */
 	if (ctype >= _cur_grffile->cargo_max) {
-		grfmsg(1, "FeatureMapSpriteGroup: Cargo type %d out of range (max %d), skipping.", ctype, _cur_grffile->cargo_max - 1);
+		grfmsg(1, "TranslateCargo: Cargo type %d out of range (max %d), skipping.", ctype, _cur_grffile->cargo_max - 1);
 		return CT_INVALID;
 	}
 
 	/* Look up the cargo label from the translation table */
 	CargoLabel cl = _cur_grffile->cargo_list[ctype];
 	if (cl == 0) {
-		grfmsg(5, "FeatureMapSpriteGroup: Cargo type %d not available in this climate, skipping.", ctype);
+		grfmsg(5, "TranslateCargo: 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));
+		grfmsg(5, "TranslateCargo: 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);
+	grfmsg(6, "TranslateCargo: 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;
 }
 
@@ -2422,11 +2687,11 @@
 		}
 	} else {
 		if (last_engines_count == 0) {
-			grfmsg(0, "FeatureMapSpriteGroup: WagonOverride: No engine to do override with");
+			grfmsg(0, "VehicleMapSpriteGroup: WagonOverride: No engine to do override with");
 			return;
 		}
 
-		grfmsg(6, "FeatureMapSpriteGroup: WagonOverride: %u engines, %u wagons",
+		grfmsg(6, "VehicleMapSpriteGroup: WagonOverride: %u engines, %u wagons",
 				last_engines_count, idcount);
 	}
 
@@ -2440,16 +2705,16 @@
 			return;
 		}
 
-		grfmsg(7, "FeatureMapSpriteGroup: [%d] Engine %d...", i, engine);
+		grfmsg(7, "VehicleMapSpriteGroup: [%d] Engine %d...", i, engine);
 
 		for (uint c = 0; c < cidcount; c++) {
 			uint8 ctype = grf_load_byte(&bp);
 			uint16 groupid = grf_load_word(&bp);
 
-			grfmsg(8, "FeatureMapSpriteGroup: * [%d] Cargo type 0x%X, group id 0x%02X", c, ctype, groupid);
+			grfmsg(8, "VehicleMapSpriteGroup: * [%d] Cargo type 0x%X, group id 0x%02X", c, ctype, groupid);
 
 			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
-				grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping", groupid, _cur_grffile->spritegroups_count);
+				grfmsg(1, "VehicleMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping", groupid, _cur_grffile->spritegroups_count);
 				continue;
 			}
 
@@ -2500,6 +2765,30 @@
 }
 
 
+static void CanalMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
+{
+	byte *bp = &buf[4 + idcount + cidcount * 3];
+	uint16 groupid = grf_load_word(&bp);
+
+	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
+		grfmsg(1, "CanalMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
+		       groupid, _cur_grffile->spritegroups_count);
+		return;
+	}
+
+	for (uint i = 0; i < idcount; i++) {
+		CanalFeature cf = (CanalFeature)buf[3 + i];
+
+		if (cf >= CF_END) {
+			grfmsg(1, "CanalMapSpriteGroup: Canal subset %d out of range, skipping", cf);
+			continue;
+		}
+
+		_canal_sg[cf] = _cur_grffile->spritegroups[groupid];
+	}
+}
+
+
 static void StationMapSpriteGroup(byte *buf, uint8 idcount, uint8 cidcount)
 {
 	for (uint i = 0; i < idcount; i++) {
@@ -2512,7 +2801,7 @@
 			uint16 groupid = grf_load_word(&bp);
 
 			if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
-				grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
+				grfmsg(1, "StationMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
 				       groupid, _cur_grffile->spritegroups_count);
 				continue;
 			}
@@ -2529,7 +2818,7 @@
 		uint16 groupid = grf_load_word(&bp);
 
 		if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
-			grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
+			grfmsg(1, "StationMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping",
 			       groupid, _cur_grffile->spritegroups_count);
 			return;
 		}
@@ -2539,7 +2828,7 @@
 			StationSpec *statspec = _cur_grffile->stations[stid];
 
 			statspec->spritegroup[CT_DEFAULT] = _cur_grffile->spritegroups[groupid];
-			statspec->grfid = _cur_grffile->grfid;
+			statspec->grffile = _cur_grffile;
 			statspec->localidx = stid;
 			SetCustomStationSpec(statspec);
 		}
@@ -2553,7 +2842,7 @@
 	uint16 groupid = grf_load_word(&bp);
 
 	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
-		grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
+		grfmsg(1, "TownHouseMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
 		       groupid, _cur_grffile->spritegroups_count);
 		return;
 	}
@@ -2563,7 +2852,7 @@
 		HouseSpec *hs = _cur_grffile->housespec[hid];
 
 		if (hs == NULL) {
-			grfmsg(1, "FeatureMapSpriteGroup: Too many houses defined, skipping");
+			grfmsg(1, "TownHouseMapSpriteGroup: Too many houses defined, skipping");
 			return;
 		}
 
@@ -2578,7 +2867,7 @@
 	uint16 groupid = grf_load_word(&bp);
 
 	if (groupid >= _cur_grffile->spritegroups_count || _cur_grffile->spritegroups[groupid] == NULL) {
-		grfmsg(1, "FeatureMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
+		grfmsg(1, "CargoMapSpriteGroup: Spriteset 0x%04X out of range 0x%X or empty, skipping.",
 		       groupid, _cur_grffile->spritegroups_count);
 		return;
 	}
@@ -2587,7 +2876,7 @@
 		CargoID cid = buf[3 + i];
 
 		if (cid >= NUM_CARGO) {
-			grfmsg(1, "FeatureMapSpriteGroup: Cargo ID %d out of range, skipping");
+			grfmsg(1, "CargoMapSpriteGroup: Cargo ID %d out of range, skipping");
 			continue;
 		}
 
@@ -2648,6 +2937,10 @@
 			VehicleMapSpriteGroup(buf, feature, idcount, cidcount, wagover);
 			return;
 
+		case GSF_CANAL:
+			CanalMapSpriteGroup(buf, idcount, cidcount);
+			return;
+
 		case GSF_STATION:
 			StationMapSpriteGroup(buf, idcount, cidcount);
 			return;
@@ -2713,72 +3006,65 @@
 
 		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) {
-				case GSF_TRAIN:
-				case GSF_ROAD:
-				case GSF_SHIP:
-				case GSF_AIRCRAFT: {
-					if (id < TOTAL_NUM_ENGINES) {
-						StringID string = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_8000_KIRBY_PAUL_TANK_STEAM + id);
-						SetCustomEngineName(id, string);
-					} else {
-						AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, id);
-					}
-					break;
+		grfmsg(8, "FeatureNewName: 0x%04X <- %s", id, name);
+
+		switch (feature) {
+			case GSF_TRAIN:
+			case GSF_ROAD:
+			case GSF_SHIP:
+			case GSF_AIRCRAFT:
+				if (id < TOTAL_NUM_ENGINES) {
+					StringID string = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_8000_KIRBY_PAUL_TANK_STEAM + id);
+					SetCustomEngineName(id, string);
+				} else {
+					AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, id);
 				}
-
-				case GSF_TOWNHOUSE:
-				default:
-					switch (GB(id, 8, 8)) {
-						case 0xC4: // Station class name
-							if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
-								grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
-							} else {
-								StationClassID sclass = _cur_grffile->stations[GB(id, 0, 8)]->sclass;
-								SetStationClassName(sclass, AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED));
-							}
-							break;
-
-						case 0xC5: // Station name
-							if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
-								grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
-							} else {
-								_cur_grffile->stations[GB(id, 0, 8)]->name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
-							}
-							break;
-
-						case 0xC9: { // House name
-							if (_cur_grffile->housespec == NULL || _cur_grffile->housespec[GB(id, 0, 8)] == NULL) {
-								grfmsg(1, "FeatureNewName: Attempt to name undefined house 0x%X, ignoring.", GB(id, 0, 8));
-							} else {
-								_cur_grffile->housespec[GB(id, 0, 8)]->building_name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
-							}
-							break;
+				break;
+
+			case GSF_TOWNHOUSE:
+			default:
+				switch (GB(id, 8, 8)) {
+					case 0xC4: // Station class name
+						if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
+							grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
+						} else {
+							StationClassID sclass = _cur_grffile->stations[GB(id, 0, 8)]->sclass;
+							SetStationClassName(sclass, AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED));
 						}
-
-						case 0xD0:
-						case 0xDC:
-							AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
-							break;
-
-						default:
-							grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
-							break;
-					}
-					break;
+						break;
+
+					case 0xC5: // Station name
+						if (_cur_grffile->stations == NULL || _cur_grffile->stations[GB(id, 0, 8)] == NULL) {
+							grfmsg(1, "FeatureNewName: Attempt to name undefined station 0x%X, ignoring", GB(id, 0, 8));
+						} else {
+							_cur_grffile->stations[GB(id, 0, 8)]->name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
+						}
+						break;
+
+					case 0xC9: // House name
+						if (_cur_grffile->housespec == NULL || _cur_grffile->housespec[GB(id, 0, 8)] == NULL) {
+							grfmsg(1, "FeatureNewName: Attempt to name undefined house 0x%X, ignoring.", GB(id, 0, 8));
+						} else {
+							_cur_grffile->housespec[GB(id, 0, 8)]->building_name = AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
+						}
+						break;
+
+					case 0xD0:
+					case 0xDC:
+						AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
+						break;
+
+					default:
+						grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
+						break;
+				}
+				break;
 
 #if 0
 				case GSF_CANAL :
 				case GSF_BRIDGE :
 					AddGRFString(_cur_spriteid, id, lang, name);
-					switch (GB(id, 8,8)) {
+					switch (GB(id, 8, 8)) {
 						case 0xC9: // House name
 						default:
 							grfmsg(7, "FeatureNewName: Unsupported ID (0x%04X)", id);
@@ -2793,7 +3079,6 @@
 					grfmsg(7, "FeatureNewName: Unsupported feature (0x%02X)", feature);
 					break;
 #endif
-			}
 		}
 	}
 }
@@ -2818,7 +3103,7 @@
 	switch (type) {
 		case 0x04: // Signal graphics
 			if (num != 112 && num != 240) {
-				grfmsg(1, "GraphicsNews: Signal graphics sprite count must be 112 or 240, skipping");
+				grfmsg(1, "GraphicsNew: Signal graphics sprite count must be 112 or 240, skipping");
 				return;
 			}
 			_signal_base = _cur_spriteid;
@@ -2826,7 +3111,7 @@
 
 		case 0x05: // Catenary graphics
 			if (num != 48) {
-				grfmsg(1, "GraphicsNews: Catenary graphics sprite count must be 48, skipping");
+				grfmsg(1, "GraphicsNew: Catenary graphics sprite count must be 48, skipping");
 				return;
 			}
 			replace = SPR_ELRAIL_BASE + 3;
@@ -2834,7 +3119,7 @@
 
 		case 0x06: // Foundations
 			if (num != 74) {
-				grfmsg(1, "GraphicsNews: Foundation graphics sprite count must be 74, skipping");
+				grfmsg(1, "GraphicsNew: Foundation graphics sprite count must be 74, skipping");
 				return;
 			}
 			replace = SPR_SLOPES_BASE;
@@ -2842,20 +3127,60 @@
 
 		case 0x08: // Canal graphics
 			if (num != 65) {
-				grfmsg(1, "GraphicsNews: Canal graphics sprite count must be 65, skipping");
+				grfmsg(1, "GraphicsNew: Canal graphics sprite count must be 65, skipping");
 				return;
 			}
 			replace = SPR_CANALS_BASE + 5;
 			break;
 
+		case 0x09: // One way graphics
+			if (num != 6) {
+				grfmsg(1, "GraphicsNew: One way road graphics sprite count must be 6, skipping");
+				return;
+			}
+			replace = SPR_ONEWAY_BASE;
+			break;
+
+		case 0x0A: // 2CC colour maps
+			if (num != 256) {
+				grfmsg(1, "GraphicsNew: 2CC colour maps sprite count must be 256, skipping");
+				return;
+			}
+			replace = SPR_2CCMAP_BASE;
+			break;
+
+		case 0x0B: // tramways
+			if (num != 113) {
+				grfmsg(1, "GraphicsNews: Tramway graphics sprite count must be 113, skipping");
+				return;
+			}
+			replace = SPR_TRAMWAY_BASE;
+			break;
+
 		case 0x0D: // Coast graphics
 			if (num != 16) {
-				grfmsg(1, "GraphicsNews: Coast graphics sprite count must be 16, skipping");
+				grfmsg(1, "GraphicsNew: Coast graphics sprite count must be 16, skipping");
 				return;
 			}
 			_coast_base = _cur_spriteid;
 			break;
 
+		case 0x10: // New airport sprites
+			if (num != 15) {
+				grfmsg(1, "GraphicsNew: Airport graphics sprite count must be 15, skipping");
+				return;
+			}
+			replace = SPR_AIRPORTX_BASE;
+			break;
+
+		case 0x11: // Road stop sprites
+			if (num != 8) {
+				grfmsg(1, "GraphicsNew: Road stop graphics sprite count must be 8, skipping");
+				return;
+			}
+			replace = SPR_ROADSTOP_BASE;
+			break;
+
 		default:
 			grfmsg(2, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring)",
 					type, num);
@@ -2874,6 +3199,21 @@
 	}
 }
 
+/* Action 0x05 (SKIP) */
+static void SkipAct5(byte *buf, int len)
+{
+	if (!check_length(len, 2, "SkipAct5")) return;
+	buf++;
+
+	/* Ignore type byte */
+	grf_load_byte(&buf);
+
+	/* Skip the sprites of this action */
+	_skip_sprites = grf_load_extended(&buf);
+
+	grfmsg(3, "SkipAct5: Skipping %d sprites", _skip_sprites);
+}
+
 static uint32 GetParamVal(byte param, uint32 *cond_val)
 {
 	switch (param) {
@@ -2906,7 +3246,7 @@
 			uint major    = 2;
 			uint minor    = 6;
 			uint revision = 0; // special case: 2.0.1 is 2.0.10
-			uint build    = 1168;
+			uint build    = 1210;
 			return (major << 24) | (minor << 20) | (revision << 16) | build;
 		}
 
@@ -3006,11 +3346,18 @@
 
 		grfmsg(8, "CfgApply: Applying %u bytes from parameter 0x%02X at offset 0x%04X", param_size, param_num, offset);
 
+		bool carry = false;
 		for (i = 0; i < param_size; i++) {
 			uint32 value = GetParamVal(param_num + i / 4, NULL);
+			/* Reset carry flag for each iteration of the variable (only really
+			 * matters if param_size is greater than 4) */
+			if (i == 0) carry = false;
 
 			if (add_value) {
-				_preload_sprite[offset + i] += GB(value, (i % 4) * 8, 8);
+				uint new_value = _preload_sprite[offset + i] + GB(value, (i % 4) * 8, 8) + (carry ? 1 : 0);
+				_preload_sprite[offset + i] = GB(new_value, 0, 8);
+				/* Check if the addition overflowed */
+				carry = new_value >= 256;
 			} else {
 				_preload_sprite[offset + i] = GB(value, (i % 4) * 8, 8);
 			}
@@ -3053,13 +3400,13 @@
 	}
 
 	if (param < 0x80 && _cur_grffile->param_end <= param) {
-		grfmsg(7, "Param %d undefined, skipping test", param);
+		grfmsg(7, "SkipIf: Param %d undefined, skipping test", param);
 		return;
 	}
 
 	uint32 param_val = GetParamVal(param, &cond_val);
 
-	grfmsg(7, "Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
+	grfmsg(7, "SkipIf: Test condtype %d, param 0x%08X, condval 0x%08X", condtype, param_val, cond_val);
 
 	if (param == 0x88) {
 		/* GRF ID checks */
@@ -3067,7 +3414,7 @@
 		const GRFConfig *c = GetGRFConfig(cond_val);
 
 		if (condtype != 10 && c == NULL) {
-			grfmsg(7, "GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
+			grfmsg(7, "SkipIf: GRFID 0x%08X unknown, skipping test", BSWAP32(cond_val));
 			return;
 		}
 
@@ -3094,7 +3441,7 @@
 				result = c == NULL || c->flags == GCS_DISABLED || c->status == GCS_NOT_FOUND;
 				break;
 
-			default: grfmsg(1, "Unsupported GRF test %d. Ignoring", condtype); return;
+			default: grfmsg(1, "SkipIf: Unsupported GRF test %d. Ignoring", condtype); return;
 		}
 	} else {
 		/* Parameter or variable tests */
@@ -3111,13 +3458,17 @@
 				break;
 			case 5: result = (param_val & mask) > cond_val;
 				break;
-
-			default: grfmsg(1, "Unsupported test %d. Ignoring", condtype); return;
+			case 11: result = GetCargoIDByLabel(BSWAP32(cond_val)) == CT_INVALID;
+				break;
+			case 12: result = GetCargoIDByLabel(BSWAP32(cond_val)) != CT_INVALID;
+				break;
+
+			default: grfmsg(1, "SkipIf: Unsupported test %d. Ignoring", condtype); return;
 		}
 	}
 
 	if (!result) {
-		grfmsg(2, "Not skipping sprites, test was false");
+		grfmsg(2, "SkipIf: Not skipping sprites, test was false");
 		return;
 	}
 
@@ -3141,13 +3492,13 @@
 	}
 
 	if (choice != NULL) {
-		grfmsg(2, "Jumping to label 0x%0X at line %d, test was true", choice->label, choice->nfo_line);
+		grfmsg(2, "SkipIf: Jumping to label 0x%0X at line %d, test was true", choice->label, choice->nfo_line);
 		FioSeekTo(choice->pos, SEEK_SET);
 		_nfo_line = choice->nfo_line;
 		return;
 	}
 
-	grfmsg(2, "Skipping %d sprites, test was true", numsprites);
+	grfmsg(2, "SkipIf: Skipping %d sprites, test was true", numsprites);
 	_skip_sprites = numsprites;
 	if (_skip_sprites == 0) {
 		/* Zero means there are no sprites to skip, so
@@ -3209,7 +3560,7 @@
 	_cur_grfconfig->status = _cur_stage < GLS_ACTIVATION ? GCS_INITIALISED : GCS_ACTIVATED;
 
 	/* Do swap the GRFID for displaying purposes since people expect that */
-	DEBUG(grf, 1, "Loaded GRFv%d set %08lX - %s", version, BSWAP32(grfid), name);
+	DEBUG(grf, 1, "GRFInfo: Loaded GRFv%d set %08lX - %s", version, BSWAP32(grfid), name);
 }
 
 /* Action 0x0A */
@@ -3241,6 +3592,22 @@
 	}
 }
 
+/* Action 0x0A (SKIP) */
+static void SkipActA(byte *buf, int len)
+{
+	buf++;
+	uint8 num_sets = grf_load_byte(&buf);
+
+	for (uint i = 0; i < num_sets; i++) {
+		/* Skip the sprites this replaces */
+		_skip_sprites += grf_load_byte(&buf);
+		/* But ignore where they go */
+		grf_load_word(&buf);
+	}
+
+	grfmsg(3, "SkipActA: Skipping %d sprites", _skip_sprites);
+}
+
 /* Action 0x0B */
 static void GRFLoadError(byte *buf, int len)
 {
@@ -3298,7 +3665,7 @@
 	/* 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");
+		grfmsg(7, "GRFLoadError: Skipping non-fatal GRFLoadError in stage 1");
 		return;
 	}
 	CLRBIT(severity, 7);
@@ -3392,6 +3759,76 @@
 	_skip_sprites = -1;
 }
 
+
+static uint32 GetPatchVariable(uint8 param)
+{
+	switch (param) {
+		/* start year - 1920 */
+		case 0x0B: return max(_patches.starting_year, ORIGINAL_BASE_YEAR) - ORIGINAL_BASE_YEAR;
+		/* freight trains weight factor */
+		case 0x0E: return _patches.freight_trains;
+		/* empty wagon speed increase */
+		case 0x0F: return 0;
+		/* plane speed factor */
+		case 0x10: return 4;
+		/* 2CC colormap base sprite */
+		case 0x11: return SPR_2CCMAP_BASE;
+
+		default:
+			grfmsg(2, "ParamSet: Unknown Patch variable 0x%02X.", param);
+			return 0;
+	}
+}
+
+
+static uint32 PerformGRM(uint32 *grm, uint16 num_ids, uint16 count, uint8 op, uint8 target, const char *type)
+{
+	uint start = 0;
+	uint size  = 0;
+
+	if (op == 6) {
+		/* Return GRFID of set that reserved ID */
+		return grm[_cur_grffile->param[target]];
+	}
+
+	/* With an operation of 2 or 3, we want to reserve a specific block of IDs */
+	if (op == 2 || op == 3) start = _cur_grffile->param[target];
+
+	for (uint i = start; i < num_ids; i++) {
+		if (grm[i] == 0) {
+			size++;
+		} else {
+			if (op == 2 || op == 3) break;
+			start = i + 1;
+			size = 0;
+		}
+
+		if (size == count) break;
+	}
+
+	if (size == count) {
+		/* Got the slot... */
+		if (op == 0 || op == 3) {
+			grfmsg(2, "ParamSet: GRM: Reserving %d %s at %d", count, type, start);
+			for (uint i = 0; i < count; i++) grm[start + i] = _cur_grffile->grfid;
+		}
+		return start;
+	}
+
+	/* Unable to allocate */
+	if (op != 4 && op != 5) {
+		/* Deactivate GRF */
+		grfmsg(0, "ParamSet: GRM: Unable to allocate %d %s, deactivating", count, type);
+		_cur_grfconfig->status = GCS_DISABLED;
+		_skip_sprites = -1;
+		return UINT_MAX;
+	}
+
+	grfmsg(1, "ParamSet: GRM: Unable to allocate %d %s", count, type);
+	return UINT_MAX;
+}
+
+
 /* Action 0x0D */
 static void ParamSet(byte *buf, int len)
 {
@@ -3435,7 +3872,7 @@
 	 *   an earlier action D */
 	if (HASBIT(oper, 7)) {
 		if (target < 0x80 && target < _cur_grffile->param_end) {
-			grfmsg(7, "Param %u already defined, skipping", target);
+			grfmsg(7, "ParamSet: Param %u already defined, skipping", target);
 			return;
 		}
 
@@ -3446,8 +3883,7 @@
 		if (GB(data, 0, 8) == 0xFF) {
 			if (data == 0x0000FFFF) {
 				/* Patch variables */
-				grfmsg(2, "ParamSet: Reading Patch variables unsupported");
-				return;
+				src1 = GetPatchVariable(src1);
 			} else {
 				/* GRF Resource Management */
 				if (_cur_stage != GLS_ACTIVATION) {
@@ -3463,62 +3899,16 @@
 						case 0x01: // Road Vehicles
 						case 0x02: // Ships
 						case 0x03: // Aircraft
-						{
-							uint start = 0;
-							uint size  = 0;
-							uint shift = _vehshifts[feature];
-
-							if (op == 6) {
-								/* Return GRFID of set that reserved ID */
-								src1 = _grm_engines[shift + _cur_grffile->param[target]];
-								break;
-							}
-
-							/* With an operation of 2 or 3, we want to reserve a specific block of IDs */
-							if (op == 2 || op == 3) start = _cur_grffile->param[target];
-
-							for (uint i = start; i < _vehcounts[feature]; i++) {
-								if (_grm_engines[shift + i] == 0) {
-									size++;
-								} else {
-									if (op == 2 || op == 3) break;
-									start = i + 1;
-									size = 0;
-								}
-
-								if (size == count) break;
-							}
-
-							if (size == count) {
-								/* Got the slot... */
-								if (op == 0 || op == 3) {
-									grfmsg(2, "GRM: Reserving %d vehicles at %d", count, start);
-									for (uint i = 0; i < count; i++) _grm_engines[shift + start + i] = _cur_grffile->grfid;
-								}
-								src1 = start;
-							} else {
-								/* Unable to allocate */
-								if (op != 4 && op != 5) {
-									/* Deactivate GRF */
-									grfmsg(0, "GRM: Unable to allocate %d vehicles, deactivating", count);
-									_cur_grfconfig->status = GCS_DISABLED;
-
-									_skip_sprites = -1;
-									return;
-								}
-
-								grfmsg(1, "GRM: Unable to allocate %d vehicles", count);
-								src1 = UINT_MAX;
-							}
+							src1 = PerformGRM(&_grm_engines[_vehshifts[feature]], _vehcounts[feature], count, op, target, "vehicles");
+							if (_skip_sprites == -1) return;
 							break;
-						}
 
 						case 0x08: // General sprites
 							switch (op) {
 								case 0:
 									/* Check if the allocated sprites will fit below the original sprite limit */
 									if (_cur_spriteid + count >= 16384) {
-										grfmsg(0, "GRM: Unable to allocate %d sprites; try changing NewGRF order", count);
+										grfmsg(0, "ParamSet: GRM: Unable to allocate %d sprites; try changing NewGRF order", count);
 										_cur_grfconfig->status = GCS_DISABLED;
 
 										_skip_sprites = -1;
@@ -3535,12 +3925,17 @@
 									break;
 
 								default:
-									grfmsg(1, "GRM: Unsupported operation %d for general sprites", op);
+									grfmsg(1, "ParamSet: GRM: Unsupported operation %d for general sprites", op);
 									return;
 							}
 							break;
 
-						default: grfmsg(1, "GRM: Unsupported feature 0x%X", feature); return;
+						case 0x0B: // Cargo
+							src1 = PerformGRM(_grm_cargos, NUM_CARGO, count, op, target, "cargos");
+							if (_skip_sprites == -1) return;
+							break;
+
+						default: grfmsg(1, "ParamSet: GRM: Unsupported feature 0x%X", feature); return;
 					}
 				}
 			}
@@ -3669,7 +4064,7 @@
 		case 0x9E: // Miscellaneous GRF features
 			_misc_grf_features = res;
 			/* Set train list engine width */
-			_traininfo_vehicle_width = HASBIT(res, 3) ? 32 : 29;
+			_traininfo_vehicle_width = HasGrfMiscBit(GMB_TRAIN_WIDTH_32_PIXELS) ? 32 : 29;
 			break;
 
 		default:
@@ -3943,7 +4338,7 @@
 	uint32 grfid = grf_load_dword(&buf);
 	const GRFConfig *c = GetGRFConfig(grfid);
 	if (c == NULL || (c->status != GCS_INITIALISED && c->status != GCS_ACTIVATED)) {
-		grfmsg(7, "GRFID 0x%08x unknown, skipping action 13", BSWAP32(grfid));
+		grfmsg(7, "TranslateGRFStrings: GRFID 0x%08x unknown, skipping action 13", BSWAP32(grfid));
 		return;
 	}
 
@@ -3967,7 +4362,7 @@
 	uint16 first_id  = grf_load_word(&buf);
 
 	if (!((first_id >= 0xD000 && first_id + num_strings <= 0xD3FF) || (first_id >= 0xDC00 && first_id + num_strings <= 0xDCFF))) {
-		grfmsg(7, "Attempting to set out-of-range string IDs in action 13 (first: 0x%4X, number: 0x%2X)", first_id, num_strings);
+		grfmsg(7, "TranslateGRFStrings: Attempting to set out-of-range string IDs in action 13 (first: 0x%4X, number: 0x%2X)", first_id, num_strings);
 		return;
 	}
 
@@ -4062,16 +4457,17 @@
 	                   |                                        (0 << 0x0B)  // enhancedgui
 	                   |                                        (0 << 0x0C)  // newagerating
 	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x0D)  // buildonslopes
+	                   |         ((_patches.full_load_any ? 1 : 0) << 0x0E)  // fullloadany
 	                   |                                        (0 << 0x0F)  // planespeed
 	                   |                                        (0 << 0x10)  // moreindustriesperclimate - obsolete
 	                   |                                        (0 << 0x11)  // moretoylandfeatures
 	                   |                                        (1 << 0x12)  // newstations
 	                   |                                        (0 << 0x13)  // tracktypecostdiff
-	                   |                                        (0 << 0x14)  // manualconvert
+	                   |                                        (1 << 0x14)  // manualconvert
 	                   |       ((_patches.build_on_slopes ? 1 : 0) << 0x15)  // buildoncoasts
 	                   |                                        (1 << 0x16)  // canals
 	                   |                                        (1 << 0x17)  // newstartyear
-	                   |                                        (0 << 0x18)  // freighttrains
+	                   |    ((_patches.freight_trains > 1 ? 1 : 0) << 0x18)  // freighttrains
 	                   |                                        (1 << 0x19)  // newhouses
 	                   |                                        (1 << 0x1A)  // newbridges
 	                   |                                        (0 << 0x1B)  // newtownnames
@@ -4088,10 +4484,10 @@
 	                   |                                        (1 << 0x05)  // resolutionwidth
 	                   |                                        (1 << 0x06)  // resolutionheight
 	                   |                                        (0 << 0x07)  // newindustries
-	                   |                                        (0 << 0x08)  // fifoloading
+	                   |         ((_patches.improved_load ? 1 : 0) << 0x08)  // fifoloading
 	                   |                                        (0 << 0x09)  // townroadbranchprob
 	                   |                                        (0 << 0x0A)  // tempsnowline
-	                   |                                        (0 << 0x0B)  // newcargo
+	                   |                                        (1 << 0x0B)  // newcargo
 	                   |                                        (1 << 0x0C)  // enhancemultiplayer
 	                   |                                        (1 << 0x0D)  // onewayroads
 	                   |   ((_patches.nonuniform_stations ? 1 : 0) << 0x0E)  // irregularstations
@@ -4100,10 +4496,11 @@
 	                   |                                        (1 << 0x11)  // autoreplace
 	                   |                                        (1 << 0x12)  // autoslope
 	                   |                                        (0 << 0x13)  // followvehicle
-	                   |                                        (0 << 0x14)  // trams
+	                   |                                        (1 << 0x14)  // trams
 	                   |                                        (0 << 0x15)  // enhancetunnels
 	                   |                                        (0 << 0x16)  // shortrvs
-	                   |                                        (0 << 0x17); // articulatedrvs
+	                   |                                        (0 << 0x17)  // articulatedrvs
+	                   |                                        (1 << 0x1E); // variablerunningcosts
 }
 
 static void ResetCustomStations()
@@ -4158,6 +4555,61 @@
 	}
 }
 
+static void ResetCustomIndustries()
+{
+	GRFFile *file;
+
+	for (file = _first_grffile; file != NULL; file = file->next) {
+		uint i;
+		/* We are verifiying both tiles and industries specs loaded from the grf file
+		 * First, let's deal with industryspec */
+		if (file->industryspec != NULL) {
+
+			for (i = 0; i < NUM_INDUSTRYTYPES; i++) {
+				IndustrySpec *ind = file->industryspec[i];
+
+				if (ind != NULL) {
+					/* We need to remove the sounds array */
+					if (HASBIT(ind->cleanup_flag, CLEAN_RANDOMSOUNDS)) {
+						free((void*)ind->random_sounds);
+					}
+
+					/* We need to remove the tiles layouts */
+					if (HASBIT(ind->cleanup_flag, CLEAN_TILELSAYOUT) && ind->table != NULL) {
+						for (int j = 0; j < ind->num_table; j++) {
+							/* remove the individual layouts */
+							if (ind->table[j] != NULL) {
+								free((IndustryTileTable*)ind->table[j]);
+							}
+						}
+						/* remove the layouts pointers */
+						free((IndustryTileTable**)ind->table);
+						ind->table = NULL;
+					}
+
+					free(ind);
+					ind = NULL;
+				}
+			}
+
+			free(file->industryspec);
+			file->industryspec = NULL;
+		}
+
+		if (file->indtspec != NULL) {
+			for (i = 0; i < NUM_INDUSTRYTILES; i++) {
+				if (file->indtspec[i] != NULL) {
+					free(file->indtspec[i]);
+					file->indtspec[i] = NULL;
+				}
+			}
+
+			free(file->indtspec);
+			file->indtspec = NULL;
+		}
+	}
+}
+
 static void ResetNewGRF()
 {
 	GRFFile *next;
@@ -4166,6 +4618,7 @@
 		next = f->next;
 
 		free(f->filename);
+		free(f->cargo_list);
 		free(f);
 	}
 
@@ -4204,6 +4657,7 @@
 
 	/* Reset GRM reservations */
 	memset(&_grm_engines, 0, sizeof(_grm_engines));
+	memset(&_grm_cargos, 0, sizeof(_grm_cargos));
 
 	/* Unload sprite group data */
 	UnloadWagonOverrides();
@@ -4222,10 +4676,17 @@
 	ResetCustomHouses();
 	ResetHouses();
 
+	/* Reset the industries structures*/
+	ResetCustomIndustries();
+	ResetIndustries();
+
 	/* Reset station classes */
 	ResetStationClasses();
 	ResetCustomStations();
 
+	/* Reset canal sprite groups */
+	memset(_canal_sg, 0, sizeof(_canal_sg));
+
 	/* Reset the snowline table. */
 	ClearSnowLine();
 
@@ -4242,8 +4703,9 @@
 	_misc_grf_features = 0;
 	_traininfo_vehicle_pitch = 0;
 	_traininfo_vehicle_width = 29;
-	_have_2cc = false;
-	_have_newhouses = false;
+
+	_loaded_newgrf_features = 0;
+
 	_signal_base = 0;
 	_coast_base = 0;
 
@@ -4305,7 +4767,7 @@
 
 	if (newfile == NULL) error ("Out of memory");
 
-	newfile->filename = strdup(config->filename);
+	newfile->filename = strdup(config->full_path);
 	newfile->sprite_offset = sprite_offset;
 
 	/* Copy the initial parameter list */
@@ -4361,9 +4823,6 @@
 static void CalculateRefitMasks()
 {
 	for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
-		/* Skip engine if not available in this climate */
-		if (!HASBIT(_engine_info[engine].climates, _opt.landscape)) continue;
-
 		uint32 mask = 0;
 		uint32 not_mask = 0;
 		uint32 xor_mask = 0;
@@ -4423,6 +4882,8 @@
 		/* 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) {
+			default: NOT_REACHED();
+			case VEH_AIRCRAFT: break;
 			case VEH_TRAIN: {
 				RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
 				if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
@@ -4465,7 +4926,7 @@
 		for (int i = 0; i < HOUSE_MAX; i++) {
 			HouseSpec *hs = file->housespec[i];
 			if (hs != NULL) {
-				SetHouseSpec(hs);
+				_house_mngr.SetEntitySpec(hs);
 				if (hs->min_date < 1930) reset_dates = false;
 			}
 		}
@@ -4522,16 +4983,16 @@
 	 * In other stages we skip action 0x10 since it's already dealt with. */
 	static const SpecialSpriteHandler handlers[][GLS_END] = {
 		/* 0x00 */ { NULL,     SafeChangeInfo, NULL,       InitChangeInfo, ReserveChangeInfo, FeatureChangeInfo, },
-		/* 0x01 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              NewSpriteSet, },
-		/* 0x02 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              NewSpriteGroup, },
+		/* 0x01 */ { SkipAct1, SkipAct1,  SkipAct1,        SkipAct1,       SkipAct1,          NewSpriteSet, },
+		/* 0x02 */ { NULL,     NULL,      NULL,            NULL,           NULL,              NewSpriteGroup, },
 		/* 0x03 */ { NULL,     GRFUnsafe, NULL,            NULL,           NULL,              FeatureMapSpriteGroup, },
 		/* 0x04 */ { NULL,     NULL,      NULL,            NULL,           NULL,              FeatureNewName, },
-		/* 0x05 */ { NULL,     NULL,      NULL,            NULL,           NULL,              GraphicsNew, },
+		/* 0x05 */ { SkipAct5, SkipAct5,  SkipAct5,        SkipAct5,       SkipAct5,          GraphicsNew, },
 		/* 0x06 */ { NULL,     NULL,      NULL,            CfgApply,       CfgApply,          CfgApply, },
 		/* 0x07 */ { NULL,     NULL,      NULL,            NULL,           SkipIf,            SkipIf, },
 		/* 0x08 */ { ScanInfo, NULL,      NULL,            GRFInfo,        NULL,              GRFInfo, },
 		/* 0x09 */ { NULL,     NULL,      NULL,            SkipIf,         SkipIf,            SkipIf, },
-		/* 0x0A */ { NULL,     NULL,      NULL,            NULL,           NULL,              SpriteReplace, },
+		/* 0x0A */ { SkipActA, SkipActA,  SkipActA,        SkipActA,       SkipActA,          SpriteReplace, },
 		/* 0x0B */ { NULL,     NULL,      NULL,            GRFLoadError,   GRFLoadError,      GRFLoadError, },
 		/* 0x0C */ { NULL,     NULL,      NULL,            GRFComment,     NULL,              GRFComment, },
 		/* 0x0D */ { NULL,     SafeParamSet, NULL,         ParamSet,       ParamSet,          ParamSet, },
@@ -4564,17 +5025,17 @@
 	byte action = buf[0];
 
 	if (action == 0xFF) {
-		grfmsg(7, "Handling data block in stage %d", stage);
+		grfmsg(7, "DecodeSpecialSprite: Handling data block in stage %d", stage);
 		GRFDataBlock(buf, num);
 	} else if (action == 0xFE) {
-		grfmsg(7, "Handling import block in stage %d", stage);
+		grfmsg(7, "DecodeSpecialSprite: andling import block in stage %d", stage);
 		GRFImportBlock(buf, num);
 	} else if (action >= lengthof(handlers)) {
-		grfmsg(7, "Skipping unknown action 0x%02X", action);
+		grfmsg(7, "DecodeSpecialSprite: Skipping unknown action 0x%02X", action);
 	} else if (handlers[action][stage] == NULL) {
-		grfmsg(7, "Skipping action 0x%02X in stage %d", action, stage);
+		grfmsg(7, "DecodeSpecialSprite: Skipping action 0x%02X in stage %d", action, stage);
 	} else {
-		grfmsg(7, "Handling action 0x%02X in stage %d", action, stage);
+		grfmsg(7, "DecodeSpecialSprite: Handling action 0x%02X in stage %d", action, stage);
 		handlers[action][stage](buf, num);
 	}
 	free(buf);
@@ -4583,7 +5044,7 @@
 
 void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage)
 {
-	const char *filename = config->filename;
+	const char *filename = config->full_path;
 	uint16 num;
 
 	/* A .grf file is activated only if it was active when the game was
@@ -4606,7 +5067,7 @@
 
 	_cur_grfconfig = config;
 
-	DEBUG(grf, 2, "Reading NewGRF-file '%s'", filename);
+	DEBUG(grf, 2, "LoadNewGRFFile: Reading NewGRF-file '%s'", filename);
 
 	/* Skip the first sprite; we don't care about how many sprites this
 	 * does contain; newest TTDPatches and George's longvehicles don't
@@ -4614,7 +5075,7 @@
 	if (FioReadWord() == 4 && FioReadByte() == 0xFF) {
 		FioReadDword();
 	} else {
-		DEBUG(grf, 7, "Custom .grf has invalid format");
+		DEBUG(grf, 7, "LoadNewGRFFile: Custom .grf has invalid format");
 		return;
 	}
 
@@ -4637,7 +5098,7 @@
 				FioSkipBytes(num);
 			}
 		} else {
-			if (_skip_sprites == 0) grfmsg(7, "Skipping unexpected sprite");
+			if (_skip_sprites == 0) grfmsg(7, "LoadNewGRFFile: Skipping unexpected sprite");
 
 			FioSkipBytes(7);
 			num -= 8;
@@ -4667,6 +5128,13 @@
 
 static void AfterLoadGRFs()
 {
+	/* Update the bitmasks for the vehicle lists */
+	Player *p;
+	FOR_ALL_PLAYERS(p) {
+		p->avail_railtypes = GetPlayerRailtypes(p->index);
+		p->avail_roadtypes = GetPlayerRoadtypes(p->index);
+	}
+
 	/* Pre-calculate all refit masks after loading GRF files. */
 	CalculateRefitMasks();
 
@@ -4676,6 +5144,9 @@
 	/* Add all new houses to the house array. */
 	FinaliseHouseArray();
 
+	/* Create dynamic list of industry legends for smallmap_gui.cpp */
+	BuildIndustriesLegend();
+
 	/* Map cargo strings. This is a separate step because cargos are
 	 * loaded before strings... */
 	MapNewCargoStrings();
@@ -4699,14 +5170,14 @@
 			if (c->status == GCS_DISABLED || c->status == GCS_NOT_FOUND) continue;
 
 			/* @todo usererror() */
-			if (!FioCheckFileExists(c->filename)) error("NewGRF file is missing '%s'", c->filename);
+			if (!FileExists(c->full_path)) error("NewGRF file is missing '%s'", c->filename);
 
 			if (stage == GLS_LABELSCAN) InitNewGRFFile(c, _cur_spriteid);
 			LoadNewGRFFile(c, slot++, stage);
 			if (stage == GLS_ACTIVATION) {
 				ClearTemporaryNewGRFData();
 				BuildCargoTranslationMap();
-				DEBUG(sprite, 2, "Currently %i sprites are loaded", _cur_spriteid);
+				DEBUG(sprite, 2, "LoadNewGRF: Currently %i sprites are loaded", _cur_spriteid);
 			}
 		}
 	}
@@ -4714,3 +5185,8 @@
 	/* Call any functions that should be run after GRFs have been loaded. */
 	AfterLoadGRFs();
 }
+
+bool HasGrfMiscBit(GrfMiscBit bit)
+{
+	return HASBIT(_misc_grf_features, bit);
+}
--- a/src/newgrf.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf.h	Sat Jun 02 19:59:29 2007 +0000
@@ -10,6 +10,7 @@
 #include "newgrf_config.h"
 #include "helpers.hpp"
 #include "cargotype.h"
+#include "industry.h"
 
 enum GrfLoadingStage {
 	GLS_FILESCAN,
@@ -23,6 +24,14 @@
 
 DECLARE_POSTFIX_INCREMENT(GrfLoadingStage);
 
+enum GrfMiscBit {
+	GMB_DESERT_TREES_FIELDS    = 0, // Unsupported.
+	GMB_DESERT_PAVED_ROADS     = 1,
+	GMB_FIELD_BOUNDING_BOX     = 2, // Unsupported.
+	GMB_TRAIN_WIDTH_32_PIXELS  = 3,
+	GMB_AMBIENT_SOUND_CALLBACK = 4, // Unsupported.
+	GMB_CATENARY_ON_3RD_TRACK  = 5, // Unsupported.
+};
 
 struct GRFLabel {
 	byte label;
@@ -61,6 +70,8 @@
 
 	StationSpec **stations;
 	HouseSpec **housespec;
+	IndustrySpec **industryspec;
+	IndustryTileSpec **indtspec;
 
 	uint32 param[0x80];
 	uint param_end;  ///< one more than the highest set parameter
@@ -76,8 +87,15 @@
 
 extern SpriteID _signal_base;
 extern SpriteID _coast_base;
-extern bool _have_2cc;
-extern bool _have_newhouses;
+
+enum GRFLoadedFeatures {
+	GRFLOADED_2CC,             // Set if any vehicle is loaded which uses 2cc (two company colours).
+	GRFLOADED_NEWHOUSES,       // Set if there are any newhouses loaded.
+	GRFLOADED_NEWINDUSTRIES,   // Set if there are any newindustries loaded.
+};
+
+/* Indicates which are the newgrf features currently loaded ingame */
+extern uint8 _loaded_newgrf_features;
 
 void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage);
 void LoadNewGRF(uint load_index, uint file_index);
@@ -85,4 +103,6 @@
 
 void CDECL grfmsg(int severity, const char *str, ...);
 
+bool HasGrfMiscBit(GrfMiscBit bit);
+
 #endif /* NEWGRF_H */
--- a/src/newgrf_callbacks.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_callbacks.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,11 @@
 /* $Id$ */
 
+/** @file newgrf_callbacks.h
+ */
+
 #ifndef NEWGRF_CALLBACKS_H
 #define NEWGRF_CALLBACKS_H
 
-/** @file newgrf_callbacks.h
- */
 
 /**
  * List of implemented NewGRF callbacks.
@@ -73,6 +74,9 @@
 	 * determine if a house should be destroyed. */
 	CBID_HOUSE_DESTRUCTION          = 0x21,
 
+	/* Called to determine if the given industry type is available */
+	CBID_INDUSTRY_AVAILABLE         = 0x22, // not yet implemented
+
 	/* This callback is called from vehicle purchase lists. It returns a value to be
 	 * used as a custom string ID in the 0xD000 range. */
 	CBID_VEHICLE_ADDITIONAL_TEXT    = 0x23,
@@ -80,10 +84,31 @@
 	/* Called when building a station to customize the tile layout */
 	CBID_STATION_TILE_LAYOUT        = 0x24,
 
+	/* Called for periodically starting or stopping the animation. */
+	CBID_INDTILE_ANIM_START_STOP    = 0x25, // not yet implemented
+
+	/* Called to determine industry tile next animation frame. */
+	CBID_INDTILE_ANIM_NEXT_FRAME    = 0x26, // not yet implemented
+
+	/* Called to indicate how long the current animation frame should last. */
+	CBID_INDTILE_ANIMATION_SPEED    = 0x27, // not yet implemented
+
+	/* Called to determine if the given industry can be built on specific area */
+	CBID_INDUSTRY_LOCATION          = 0x28, // not yet implemented
+
+	/* Called on production changes, so it can be adjusted */
+	CBID_INDUSTRY_PRODUCTION_CHANGE = 0x29, // not yet implemented
+
 	/* Called (if appropriate bit in callback mask is set) to determine which
 	 * cargoes a town building should accept. */
 	CBID_HOUSE_ACCEPT_CARGO         = 0x2A, // not yet implemented
 
+	/* Called to query the cargo acceptance of the industry tile */
+	CBID_INDTILE_ACCEPT_CARGO       = 0x2B, // not yet implemented
+
+	/* Called to determine which cargoes an industry should accept. */
+	CBID_INDUSTRY_ACCEPT_CARGO      = 0x2C, // not yet implemented
+
 	/* Called to determine if a specific colour map should be used for a vehicle
 	 * instead of the default livery */
 	CBID_VEHICLE_COLOUR_MAPPING     = 0x2D,
@@ -92,6 +117,12 @@
 	 * cargo a town building produces. */
 	CBID_HOUSE_PRODUCE_CARGO        = 0x2E, // not yet implemented
 
+	/* Called to determine if the given industry tile can be built on specific tile */
+	CBID_INDTILE_SHAPE_CHECK        = 0x2F, // not yet implemented
+
+	/* Called to determine the type (if any) of foundation to draw for industry tile */
+	CBID_INDUSTRY_DRAW_FOUNDATIONS  = 0x30, // not yet implemented
+
 	/* Called when the player (or AI) tries to start or stop a vehicle. Mainly
 	 * used for preventing a vehicle from leaving the depot. */
 	CBID_VEHICLE_START_STOP_CHECK   = 0x31,
@@ -99,9 +130,34 @@
 	/* Called to play a special sound effect */
 	CBID_VEHICLE_SOUND_EFFECT       = 0x33,
 
+	/* Called monthly on production changes, so it can be adjusted more frequently */
+	CBID_INDUSTRY_MONTHLYPROD_CHANGE= 0x35, // not yet implemented
+
+	/* Called to modify various vehicle properties. Callback parameter 1
+	 * specifies the property index, as used in Action 0, to change. */
+	CBID_VEHICLE_MODIFY_PROPERTY    = 0x36,
+
+	/* Called to determine text to display after cargo name */
+	CBID_INDUSTRY_CARGO_SUFFIX      = 0x37, // not yet implemented
+
+	/* Called to determine more text in the fund industry window */
+	CBID_INDUSTRY_FUND_MORE_TEXT    = 0x38, // not yet implemented
+
 	/* Called to calculate the income of delivered cargo */
 	CBID_CARGO_PROFIT_CALC          = 0x39,
 
+	/* Called to determine more text in the industry window */
+	CBID_INDUSTRY_WINDOW_MORE_TEXT  = 0x3A, // not yet implemented
+
+	/* Called to determine industry special effects */
+	CBID_INDUSTRY_SPECIAL_EFFECT    = 0x3B, // not yet implemented
+
+	/* Called to determine if industry can alter the ground below industry tile */
+	CBID_INDUSTRY_AUTOSLOPE         = 0x3C, // not yet implemented
+
+	/* Called to determine if the industry can still accept or refuse  more cargo arrival */
+	CBID_INDUSTRY_REFUSE_CARGO      = 0x3D, // not yet implemented
+
 	/* Called (if appropriate bit in callback mask set) to determine whether a
 	 * town building can be destroyed. */
 	CBID_HOUSE_DENY_DESTRUCTION     = 0x143,
@@ -159,6 +215,36 @@
 };
 
 /**
+ * Callback masks for Industries
+ */
+enum IndustryCallbackMask {
+	CBM_IND_AVAILABLE                 = 0,  ///< industry availability callback
+	CBM_IND_PRODUCTION_CARGO_ARRIVAL  = 1,  ///< call production callback when cargo arrives at the industry
+	CBM_IND_PRODUCTION_256_TICKS      = 2,  ///< call production callback every 256 ticks
+	CBM_IND_LOCATION                  = 3,  ///< check industry construction on given area
+	CBM_IND_PRODUCTION_CHANGE         = 4,  ///< controls random production change
+	CBM_IND_MONTHLYPROD_CHANGE        = 5,  ///< controls monthly random production change
+	CBM_IND_CARGO_SUFFIX              = 6,  ///< cargo sub-type display
+	CBM_IND_FUND_MORE_TEXT            = 7,  ///< additional text in fund window
+	CBM_IND_WINDOW_MORE_TEXT          = 8,  ///< additional text in industry window
+	CBM_IND_SPECIAL_EFFECT            = 9,  ///< control special effects
+	CBM_IND_REFUSE_CARGO              = 10, ///< option out of accepting cargo
+};
+
+/**
+ * Callback masks for industry tiles
+ */
+enum IndustryTileCallbackMask {
+	CBM_INDT_ANIM_NEXT_FRAME          = 0,  ///< decides next animation frame
+	CBM_INDT_ANIM_SPEED               = 1,  ///< decides animation speed
+	CBM_INDT_ACCEPTANCE_CARGO         = 2,  ///< decides amount of cargo acceptance
+	CBM_INDT_ACCEPT_CARGO             = 3,  ///< decides accepted types
+	CBM_INDT_SHAPE_CHECK              = 4,  ///< decides slope suitability
+	CBM_INDT_DRAW_FOUNDATIONS         = 5,  ///< decides if default foundations need to be drawn
+	CBM_INDT_AUTOSLOPE                = 6,  ///< decides allowance of autosloping
+};
+
+/**
  * Result of a failed callback.
  */
 enum {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_canal.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,96 @@
+/* $Id$ */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "variables.h"
+#include "landscape.h"
+#include "debug.h"
+#include "newgrf.h"
+#include "newgrf_callbacks.h"
+#include "newgrf_spritegroup.h"
+#include "newgrf_canal.h"
+
+
+/** Table of canal 'feature' sprite groups */
+const SpriteGroup *_canal_sg[CF_END];
+
+
+/* Random bits and triggers are not supported for canals, so the following
+ * three functions are stubs. */
+static uint32 CanalGetRandomBits(const ResolverObject *object)
+{
+	return 0;
+}
+
+
+static uint32 CanalGetTriggers(const ResolverObject *object)
+{
+	return 0;
+}
+
+
+static void CanalSetTriggers(const ResolverObject *object, int triggers)
+{
+	return;
+}
+
+
+static uint32 CanalGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
+{
+	TileIndex tile = object->u.canal.tile;
+
+	switch (variable) {
+		case 0x80:
+			return TileHeight(tile);
+
+		case 0x81:
+			return ((_opt.landscape == LT_ARCTIC && GetTileZ(tile) > GetSnowLine()) ? 4 : 0) |
+			       (_opt.landscape == LT_TROPIC ? GetTropicZone(tile) : 0);
+	}
+
+	DEBUG(grf, 1, "Unhandled canal property 0x%02X", variable);
+
+	*available = false;
+	return 0;
+}
+
+
+static const SpriteGroup *CanalResolveReal(const ResolverObject *object, const SpriteGroup *group)
+{
+	if (group->g.real.num_loaded == 0) return NULL;
+
+	return group->g.real.loaded[0];
+}
+
+
+static void NewCanalResolver(ResolverObject *res, TileIndex tile)
+{
+	res->GetRandomBits = &CanalGetRandomBits;
+	res->GetTriggers   = &CanalGetTriggers;
+	res->SetTriggers   = &CanalSetTriggers;
+	res->GetVariable   = &CanalGetVariable;
+	res->ResolveReal   = &CanalResolveReal;
+
+	res->u.canal.tile = tile;
+
+	res->callback        = 0;
+	res->callback_param1 = 0;
+	res->callback_param2 = 0;
+	res->last_value      = 0;
+	res->trigger         = 0;
+	res->reseed          = 0;
+}
+
+
+SpriteID GetCanalSprite(CanalFeature feature, TileIndex tile)
+{
+	ResolverObject object;
+	const SpriteGroup *group;
+
+	NewCanalResolver(&object, tile);
+
+	group = Resolve(_canal_sg[feature], &object);
+	if (group == NULL || group->type != SGT_RESULT) return 0;
+
+	return group->g.result.sprite;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_canal.h	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,29 @@
+/* $Id$ */
+
+#ifndef NEWGRF_CANAL_H
+#define NEWGRF_CANAL_H
+
+/** List of different canal 'features'.
+ * Each feature gets an entry in the canal spritegroup table */
+enum CanalFeature {
+	CF_WATERSLOPE,
+	CF_LOCKS,
+	CF_DIKES,
+	CF_ICON,
+	CF_DOCKS,
+	CF_END,
+};
+
+
+/** Table of canal 'feature' sprite groups */
+extern const SpriteGroup *_canal_sg[CF_END];
+
+
+/** Lookup the base sprite to use for a canal.
+ * @param feature Which canal feature we want.
+ * @param tile Tile index of canal, if appropriate.
+ * @return Base sprite returned by GRF, or 0 if none.
+ */
+SpriteID GetCanalSprite(CanalFeature feature, TileIndex tile);
+
+#endif /* NEWGRF_CANAL_H */
--- a/src/newgrf_cargo.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_cargo.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -39,10 +39,12 @@
 
 static const SpriteGroup *CargoResolveReal(const ResolverObject *object, const SpriteGroup *group)
 {
-	/* Cargo action 2s should always have only 1 "loaded" state */
-	if (group->g.real.num_loaded == 0) return NULL;
+	/* Cargo action 2s should always have only 1 "loaded" state, but some
+	 * times things don't follow the spec... */
+	if (group->g.real.num_loaded > 0) return group->g.real.loaded[0];
+	if (group->g.real.num_loading > 0) return group->g.real.loading[0];
 
-	return group->g.real.loaded[0];
+	return NULL;
 }
 
 
@@ -94,3 +96,17 @@
 
 	return group->g.callback.result;
 }
+
+
+CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile)
+{
+	/* Pre-version 7 uses the 'climate dependent' ID, i.e. cargo is the cargo ID */
+	if (grffile->grf_version < 7) return HASBIT(_cargo_mask, cargo) ? cargo : (CargoID) CT_INVALID;
+
+	/* If the GRF contains a translation table (and the cargo is in bounds)
+	 * then get the cargo ID for the label */
+	if (cargo < grffile->cargo_max) return GetCargoIDByLabel(grffile->cargo_list[cargo]);
+
+	/* Else the cargo value is a 'climate independent' 'bitnum' */
+	return GetCargoIDByBitnum(cargo);
+}
--- a/src/newgrf_cargo.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_cargo.h	Sat Jun 02 19:59:29 2007 +0000
@@ -21,9 +21,12 @@
 static const CargoID CT_PURCHASE     = NUM_CARGO + 1;
 static const CargoID CT_DEFAULT_NA   = NUM_CARGO + 2;
 
+/* Forward declarations of structs used */
 struct CargoSpec;
+struct GRFFile;
 
 SpriteID GetCustomCargoSprite(const CargoSpec *cs);
 uint16 GetCargoCallback(uint16 callback, uint32 param1, uint32 param2, const CargoSpec *cs);
+CargoID GetCargoTranslation(uint8 cargo, const GRFFile *grffile);
 
 #endif /* NEWGRF_CARGO_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_commons.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,150 @@
+/* $Id$ */
+
+/** @file newgrf_commons.cpp Implementation of the class OverrideManagerBase
+ * and its descendance, present and futur
+ */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "town.h"
+#include "industry.h"
+#include "newgrf.h"
+#include "newgrf_commons.h"
+
+/** Constructor of generic class
+ * @param offset end of original data for this entity. i.e: houses = 110
+ * @param maximum of entities this manager can deal with. i.e: houses = 512
+ * @param invalid is the ID used to identify an invalid entity id
+ */
+OverrideManagerBase::OverrideManagerBase(uint16 offset, uint16 maximum, uint16 invalid)
+{
+	max_offset = offset;
+	max_new_entities = maximum;
+	invalid_ID = invalid;
+
+	mapping_ID = CallocT<EntityIDMapping>(max_new_entities);
+	entity_overrides = MallocT<uint16>(max_offset);
+	memset(entity_overrides, invalid, sizeof(entity_overrides));
+}
+
+/** Destructor of the generic class.
+ * Frees allocated memory of constructor
+ */
+OverrideManagerBase::~OverrideManagerBase()
+{
+	free(mapping_ID);
+	free(entity_overrides);
+}
+
+/** Since the entity IDs defined by the GRF file does not necessarily correlate
+ * to those used by the game, the IDs used for overriding old entities must be
+ * translated when the entity spec is set.
+ * @param local_id id in grf file
+ * @param entity_type original entity type
+ */
+void OverrideManagerBase::Add(uint8 local_id, uint entity_type)
+{
+	assert(entity_type < max_offset);
+	entity_overrides[entity_type] = local_id;
+}
+
+/** Resets the mapping, which is used while initializing game */
+void OverrideManagerBase::ResetMapping()
+{
+	memset(mapping_ID, 0, (max_new_entities - 1) * sizeof(EntityIDMapping));
+}
+
+/** Resets the override, which is used while initializing game */
+void OverrideManagerBase::ResetOverride()
+{
+	for (uint16 i = 0; i < max_offset; i++) {
+		entity_overrides[i] = invalid_ID;
+	}
+}
+
+/** Return the ID (if ever available) of a previously inserted entity.
+ * @param grf_local_id ID of this enity withing the grfID
+ * @param grfid ID of the grf file
+ * @return the ID of the candidate, of the Invalid flag item ID
+ */
+uint16 OverrideManagerBase::GetID(uint8 grf_local_id, uint32 grfid)
+{
+	const EntityIDMapping *map;
+
+	for (uint16 id = max_offset; id < max_new_entities; id++) {
+		map = &mapping_ID[id];
+		if (map->entity_id == grf_local_id && map->grfid == grfid) {
+			return id;
+		}
+	}
+	return invalid_ID;
+}
+
+/** Reserves a place in the mapping array for an entity to be installed
+ * @param grf_local_id is an arbitrary id given by the grf's author.  Also known as setid
+ * @param grfid is the id of the grf file itself
+ * @param substitute_id is the original entity from which data is copied for the new one
+ * @return the proper usable slot id, or invalid marker if none is found
+ */
+uint16 OverrideManagerBase::AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id)
+{
+	uint16 id = this->GetID(grf_local_id, grfid);
+	EntityIDMapping *map;
+
+	/* Look to see if this entity has already been added. This is done
+	 * separately from the loop below in case a GRF has been deleted, and there
+	 * are any gaps in the array.
+	 */
+	if (id != invalid_ID) {
+		return id;
+	}
+
+	/* This entity hasn't been defined before, so give it an ID now. */
+	for (id = max_offset; id < max_new_entities; id++) {
+		map = &mapping_ID[id];
+
+		if (map->entity_id == 0 && map->grfid == 0) {
+			map->entity_id     = grf_local_id;
+			map->grfid         = grfid;
+			map->substitute_id = substitute_id;
+			return id;
+		}
+	}
+
+	return invalid_ID;
+}
+
+/** Gives the substitute of the entity, as specified by the grf file
+ * @param entity_id of the entity being queried
+ * @return mapped id
+ */
+uint16 OverrideManagerBase::GetSubstituteID(byte entity_id)
+{
+	return mapping_ID[entity_id].substitute_id;
+}
+
+/** Install the specs into the HouseSpecs array
+ * It will find itself the proper slot onwhich it will go
+ * @param hs HouseSpec read from the grf file, ready for inclusion
+ */
+void HouseOverrideManager::SetEntitySpec(const HouseSpec *hs)
+{
+	HouseID house_id = this->AddEntityID(hs->local_id, hs->grffile->grfid, hs->substitute_id);
+
+	if (house_id == invalid_ID) {
+		grfmsg(1, "House.SetEntitySpec: Too many houses allocated. Ignoring.");
+		return;
+	}
+
+	memcpy(&_house_specs[house_id], hs, sizeof(*hs));
+
+	/* Now add the overrides. */
+	for (int i = 0; i != max_offset; i++) {
+		HouseSpec *overridden_hs = GetHouseSpecs(i);
+
+		if (entity_overrides[i] != hs->local_id) continue;
+
+		overridden_hs->override = house_id;
+		entity_overrides[i] = invalid_ID;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/newgrf_commons.h	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,69 @@
+/* $Id$ */
+
+/** @file newgrf_commons.h This file simplyfies and embeds a common mechanism of
+ * loading/saving and mapping of grf entities.
+ */
+
+#ifndef NEWGRF_COMMONS_H
+#define NEWGRF_COMMONS_H
+
+/**
+ * Maps an entity id stored on the map to a GRF file.
+ * Entities are objects used ingame (houses, industries, industry tiles) for
+ * which we need to correlate the ids from the grf files with the ones in the
+ * the savegames themselves.
+ * An array of EntityIDMapping structs is saved with the savegame so
+ * that those GRFs can be loaded in a different order, or removed safely. The
+ * index in the array is the entity's ID stored on the map.
+ *
+ * The substitute ID is the ID of an original entity that should be used instead
+ * if the GRF containing the new entity is not available.
+ */
+struct EntityIDMapping {
+	uint32 grfid;          ///< The GRF ID of the file the entity belongs to
+	uint8  entity_id;      ///< The entity ID within the GRF file
+	uint8  substitute_id;  ///< The (original) entity ID to use if this GRF is not available
+};
+
+class OverrideManagerBase
+{
+protected:
+	uint16 *entity_overrides;
+
+	uint16 max_offset;       ///< what is the length of the original entity's array of specs
+	uint16 max_new_entities; ///< what is the amount of entities, old and new summed
+
+	uint16 invalid_ID;       ///< ID used to dected invalid entities;
+
+	virtual uint16 AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id);
+public:
+	EntityIDMapping *mapping_ID; ///< mapping of ids from grf files.  Public out of convenience
+
+	OverrideManagerBase(uint16 offset, uint16 maximum, uint16 invalid);
+	virtual ~OverrideManagerBase();
+
+	void ResetOverride();
+	void ResetMapping();
+
+	void Add(uint8 local_id, uint entity_type);
+
+	uint16 GetSubstituteID(byte entity_id);
+	uint16 GetID(uint8 grf_local_id, uint32 grfid);
+
+	inline uint16 GetMaxMapping() { return max_new_entities; };
+	inline uint16 GetMaxOffset() { return max_offset; };
+};
+
+
+struct HouseSpec;
+class HouseOverrideManager : public OverrideManagerBase
+{
+public:
+	HouseOverrideManager(uint16 offset, uint16 maximum, uint16 invalid) : OverrideManagerBase(offset, maximum, invalid) {};
+	void SetEntitySpec(const HouseSpec *hs);
+};
+
+
+extern HouseOverrideManager _house_mngr;
+
+#endif /* NEWGRF_COMMONS_H */
--- a/src/newgrf_config.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_config.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file newgfr_config.cpp */
+/** @file newgrf_config.cpp */
 
 #include "stdafx.h"
 #include "openttd.h"
@@ -35,14 +35,12 @@
 static bool CalcGRFMD5Sum(GRFConfig *config)
 {
 	FILE *f;
-	char filename[MAX_PATH];
 	md5_state_t md5state;
 	md5_byte_t buffer[1024];
 	size_t len;
 
 	/* open the file */
-	snprintf(filename, lengthof(filename), "%s%s", _paths.data_dir, config->filename);
-	f = fopen(filename, "rb");
+	f = fopen(config->full_path, "rb");
 	if (f == NULL) return false;
 
 	/* calculate md5sum */
@@ -61,11 +59,15 @@
 /* Find the GRFID and calculate the md5sum */
 bool FillGRFDetails(GRFConfig *config, bool is_static)
 {
-	if (!FioCheckFileExists(config->filename)) {
+	if (!FileExists(config->full_path)) {
 		config->status = GCS_NOT_FOUND;
 		return false;
 	}
 
+	if (config->filename == NULL) {
+		config->filename = strdup(strrchr(config->full_path, PATHSEPCHAR) + 1);
+	}
+
 	/* Find and load the Action 8 information */
 	/* 62 is the last file slot before sample.cat.
 	 * Should perhaps be some "don't care" value */
@@ -91,6 +93,7 @@
 	/* GCF_COPY as in NOT strdupped/alloced the filename, name and info */
 	if (!HASBIT((*config)->flags, GCF_COPY)) {
 		free((*config)->filename);
+		free((*config)->full_path);
 		free((*config)->name);
 		free((*config)->info);
 		free((*config)->error);
@@ -123,10 +126,11 @@
 	for (; src != NULL; src = src->next) {
 		GRFConfig *c = CallocT<GRFConfig>(1);
 		*c = *src;
-		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) {
+		if (src->filename  != NULL) c->filename  = strdup(src->filename);
+		if (src->full_path != NULL) c->full_path = strdup(src->full_path);
+		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));
 		}
@@ -183,7 +187,8 @@
 }
 
 /** Appends an element to a list of GRFs
- * @param dst the head of the list to add to */
+ * @param dst the head of the list to add to
+ * @param el the new tail to be */
 void AppendToGRFConfigList(GRFConfig **dst, GRFConfig *el)
 {
 	GRFConfig **tail = dst;
@@ -255,7 +260,9 @@
 			 * already a local one, so there is no need to replace it. */
 			if (!HASBIT(c->flags, GCF_COPY)) {
 				free(c->filename);
+				free(c->full_path);
 				c->filename = strdup(f->filename);
+				c->full_path = strdup(f->full_path);
 				memcpy(c->md5sum, f->md5sum, sizeof(c->md5sum));
 				if (c->name == NULL && f->name != NULL) c->name = strdup(f->name);
 				if (c->info == NULL && f->info != NULL) c->info = strdup(f->info);
@@ -278,7 +285,7 @@
 	struct dirent *dirent;
 	DIR *dir;
 
-	if ((dir = ttd_opendir(path)) == NULL) return 0;
+	if (path == NULL || (dir = ttd_opendir(path)) == NULL) return 0;
 
 	while ((dirent = readdir(dir)) != NULL) {
 		const char *d_name = FS2OTTD(dirent->d_name);
@@ -286,24 +293,25 @@
 
 		if (!FiosIsValidFile(path, dirent, &sb)) continue;
 
-		snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, d_name);
+		snprintf(filename, lengthof(filename), "%s%s", path, d_name);
 
 		if (sb.st_mode & S_IFDIR) {
 			/* Directory */
 			if (strcmp(d_name, ".") == 0 || strcmp(d_name, "..") == 0) continue;
+			AppendPathSeparator(filename, lengthof(filename));
 			num += ScanPath(filename);
 		} else if (sb.st_mode & S_IFREG) {
 			/* File */
 			char *ext = strrchr(filename, '.');
-			char *file = filename + strlen(_paths.data_dir) + 1; // Crop base path
 
 			/* If no extension or extension isn't .grf, skip the file */
 			if (ext == NULL) continue;
 			if (strcasecmp(ext, ".grf") != 0) continue;
 
 			GRFConfig *c = CallocT<GRFConfig>(1);
-			c->filename = strdup(file);
+			c->full_path = strdup(filename);
 
+			bool added = true;
 			if (FillGRFDetails(c, false)) {
 				if (_all_grfs == NULL) {
 					_all_grfs = c;
@@ -312,20 +320,28 @@
 					 * name, so the list is sorted as we go along */
 					GRFConfig **pd, *d;
 					for (pd = &_all_grfs; (d = *pd) != NULL; pd = &d->next) {
+						if (c->grfid == d->grfid && memcmp(c->md5sum, d->md5sum, sizeof(c->md5sum)) == 0) added = false;
 						if (strcasecmp(c->name, d->name) <= 0) break;
 					}
-					c->next = d;
-					*pd = c;
+					if (added) {
+						c->next = d;
+						*pd = c;
+					}
 				}
+			} else {
+				added = false;
+			}
 
-				num++;
-			} else {
+			if (!added) {
 				/* File couldn't be opened, or is either not a NewGRF or is a
-				 * 'system' NewGRF, so forget about it. */
+				 * 'system' NewGRF or it's already known, so forget about it. */
 				free(c->filename);
+				free(c->full_path);
 				free(c->name);
 				free(c->info);
 				free(c);
+			} else {
+				num++;
 			}
 		}
 	}
@@ -344,7 +360,8 @@
 	ClearGRFConfigList(&_all_grfs);
 
 	DEBUG(grf, 1, "Scanning for NewGRFs");
-	num = ScanPath(_paths.data_dir);
+	num  = ScanPath(_paths.data_dir);
+	num += ScanPath(_paths.second_data_dir);
 	DEBUG(grf, 1, "Scan complete, found %d files", num);
 }
 
--- a/src/newgrf_config.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_config.h	Sat Jun 02 19:59:29 2007 +0000
@@ -45,6 +45,7 @@
 
 struct GRFConfig : public GRFIdentifier {
 	char *filename;
+	char *full_path;
 	char *name;
 	char *info;
 	GRFError *error;
--- a/src/newgrf_engine.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_engine.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -64,22 +64,22 @@
 	memcpy(wo->train_id, train_id, trains);
 }
 
-static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine)
+const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine)
 {
 	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
-	int i;
 
 	/* XXX: This could turn out to be a timesink on profiles. We could
 	 * always just dedicate 65535 bytes for an [engine][train] trampoline
 	 * for O(1). Or O(logMlogN) and searching binary tree or smt. like
 	 * that. --pasky */
 
-	for (i = 0; i < wos->overrides_count; i++) {
+	for (int i = 0; i < wos->overrides_count; i++) {
 		const WagonOverride *wo = &wos->overrides[i];
-		int j;
 
-		for (j = 0; j < wo->trains; j++) {
-			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == CT_DEFAULT)) return wo->group;
+		if (wo->cargo != cargo && wo->cargo != CT_DEFAULT) continue;
+
+		for (int j = 0; j < wo->trains; j++) {
+			if (wo->train_id[j] == overriding_engine) return wo->group;
 		}
 	}
 	return NULL;
@@ -247,7 +247,7 @@
 {
 	const Station *st = GetStation(v->u.air.targetairport);
 	const AirportFTAClass *afc = st->Airport();
-	byte amdflag = afc->MovingData(v->u.air.pos)->flag;
+	uint16 amdflag = afc->MovingData(v->u.air.pos)->flag;
 
 	switch (v->u.air.state) {
 		case HANGAR:
@@ -318,7 +318,7 @@
 			}
 
 		case FLYING:
-			return AMS_TTDP_FLIGHT_TO_TOWER;
+			return amdflag & AMED_HOLD ? AMS_TTDP_FLIGHT_APPROACH : AMS_TTDP_FLIGHT_TO_TOWER;
 
 		case LANDING: // Descent
 			return AMS_TTDP_FLIGHT_DESCENT;
@@ -477,6 +477,22 @@
 }
 
 
+static uint8 LiveryHelper(EngineID engine, const Vehicle *v)
+{
+	const Livery *l;
+
+	if (v == NULL) {
+		l = GetEngineLivery(engine, _current_player, INVALID_ENGINE, NULL);
+	} else if (v->type == VEH_TRAIN) {
+		l = GetEngineLivery((v->u.rail.first_engine != INVALID_ENGINE && (IsArticulatedPart(v) || UsesWagonOverride(v))) ? v->u.rail.first_engine : v->engine_type, v->owner, v->u.rail.first_engine, v);
+	} else {
+		l = GetEngineLivery(v->engine_type, v->owner, INVALID_ENGINE, v);
+	}
+
+	return l->colour1 + l->colour2 * 16;
+}
+
+
 static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
 {
 	const Vehicle *v = GRV(object);
@@ -484,7 +500,7 @@
 	if (v == NULL) {
 		/* Vehicle does not exist, so we're in a purchase list */
 		switch (variable) {
-			case 0x43: return _current_player; // Owner information
+			case 0x43: return _current_player | (LiveryHelper(object->u.vehicle.self_type, NULL) << 24); // Owner information
 			case 0x46: return 0;               // Motion counter
 			case 0x48: return GetEngine(object->u.vehicle.self_type)->flags; // Vehicle Type Info
 			case 0xC4: return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year
@@ -553,7 +569,7 @@
 		}
 
 		case 0x43: // Player information
-			return v->owner;
+			return v->owner | (GetPlayer(v->owner)->is_ai ? 0x10000 : 0) | (LiveryHelper(v->engine_type, v) << 24);
 
 		case 0x44: // Aircraft information
 			if (v->type != VEH_AIRCRAFT) return UINT_MAX;
@@ -582,6 +598,25 @@
 				return (altitude << 8) | airporttype;
 			}
 
+		case 0x45: { // Curvature info
+			/* Format: xxxTxBxF
+			 * F - previous wagon to current wagon, 0 if vehicle is first
+			 * B - current wagon to next wagon, 0 if wagon is last
+			 * T - previous wagon to next wagon, 0 in an S-bend
+			 */
+			if (v->type != VEH_TRAIN) return 0;
+
+			const Vehicle *u_p = GetPrevVehicleInChain(v);
+			const Vehicle *u_n = v->next;
+			DirDiff f = (u_p == NULL) ?  DIRDIFF_SAME : DirDifference(u_p->direction, v->direction);
+			DirDiff b = (u_n == NULL) ?  DIRDIFF_SAME : DirDifference(v->direction, u_n->direction);
+			DirDiff t = ChangeDirDiff(f, b);
+
+			return ((t > DIRDIFF_REVERSE ? t | 8 : t) << 16) |
+			       ((b > DIRDIFF_REVERSE ? b | 8 : b) <<  8) |
+			       ( f > DIRDIFF_REVERSE ? f | 8 : f);
+		}
+
 		case 0x46: // Motion counter
 			return v->motion_counter;
 
@@ -744,6 +779,8 @@
 				case 0x66: return MapAircraftMovementAction(v); // Current movement action
 			}
 			break;
+
+		default: break;
 	}
 
 	DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type);
@@ -824,8 +861,7 @@
 		cargo = v->cargo_type;
 
 		if (v->type == VEH_TRAIN) {
-			group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
-
+			group = v->u.rail.cached_override;
 			if (group != NULL) return group;
 		}
 	}
@@ -886,7 +922,7 @@
 bool UsesWagonOverride(const Vehicle* v)
 {
 	assert(v->type == VEH_TRAIN);
-	return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL;
+	return v->u.rail.cached_override != NULL;
 }
 
 /**
@@ -895,7 +931,7 @@
  * @param param1   First parameter of the callback
  * @param param2   Second parameter of the callback
  * @param engine   Engine type of the vehicle to evaluate the callback for
- * @param vehicle  The vehicle to evaluate the callback for, or NULL if it doesnt exist yet
+ * @param v        The vehicle to evaluate the callback for, or NULL if it doesnt exist yet
  * @return The value the callback returned, or CALLBACK_FAILED if it failed
  */
 uint16 GetVehicleCallback(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v)
@@ -944,6 +980,26 @@
 	return group->g.callback.result;
 }
 
+
+/* Callback 36 handlers */
+uint GetVehicleProperty(const Vehicle *v, uint8 property, uint orig_value)
+{
+	uint16 callback = GetVehicleCallback(CBID_VEHICLE_MODIFY_PROPERTY, property, 0, v->engine_type, v);
+	if (callback != CALLBACK_FAILED) return callback;
+
+	return orig_value;
+}
+
+
+uint GetEngineProperty(EngineID engine, uint8 property, uint orig_value)
+{
+	uint16 callback = GetVehicleCallback(CBID_VEHICLE_MODIFY_PROPERTY, property, 0, engine, NULL);
+	if (callback != CALLBACK_FAILED) return callback;
+
+	return orig_value;
+}
+
+
 static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_random_bits, bool first)
 {
 	const SpriteGroup *group;
--- a/src/newgrf_engine.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_engine.h	Sat Jun 02 19:59:29 2007 +0000
@@ -14,6 +14,7 @@
 
 
 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const struct SpriteGroup *group, byte *train_id, int trains);
+const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine);
 void SetCustomEngineSprites(EngineID engine, byte cargo, const struct SpriteGroup *group);
 void SetRotorOverrideSprites(EngineID engine, const struct SpriteGroup *group);
 SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle* v, Direction direction);
@@ -35,6 +36,11 @@
 #define GetCustomVehicleSprite(v, direction) GetCustomEngineSprite(v->engine_type, v, direction)
 #define GetCustomVehicleIcon(et, direction) GetCustomEngineSprite(et, NULL, direction)
 
+/* Handler to Evaluate callback 36. If the callback fails (i.e. most of the
+ * time) orig_value is returned */
+uint GetVehicleProperty(const Vehicle *v, uint8 property, uint orig_value);
+uint GetEngineProperty(EngineID engine, uint8 property, uint orig_value);
+
 enum VehicleTrigger {
 	VEHICLE_TRIGGER_NEW_CARGO     = 1,
 	/* Externally triggered only for the first vehicle in chain */
--- a/src/newgrf_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -186,8 +186,9 @@
 						GRFConfig *c = CallocT<GRFConfig>(1);
 						*c = *src;
 						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->full_path != NULL) c->full_path = strdup(src->full_path);
+						if (src->name      != NULL) c->name      = strdup(src->name);
+						if (src->info      != NULL) c->info      = strdup(src->info);
 						c->next = NULL;
 
 						/* Append GRF config to configuration list */
@@ -296,7 +297,9 @@
 
 
 /** Callback function for the newgrf 'apply changes' confirmation window
- * @param yes_clicked boolean value, true when yes was clicked, false otherwise */
+ * @param w Window which is calling this callback
+ * @param confirmed boolean value, true when yes was clicked, false otherwise
+ */
 static void NewGRFConfirmationCallback(Window *w, bool confirmed)
 {
 	if (confirmed) {
--- a/src/newgrf_house.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_house.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -24,92 +24,12 @@
 #include "newgrf_callbacks.h"
 #include "newgrf_town.h"
 #include "newgrf_sound.h"
+#include "newgrf_commons.h"
 
 static BuildingCounts    _building_counts;
 static HouseClassMapping _class_mapping[HOUSE_CLASS_MAX];
-HouseIDMapping _house_id_mapping[HOUSE_MAX];
-
-/* Since the house IDs defined by the GRF file don't necessarily correlate
- * to those used by the game, the IDs used for overriding old houses must be
- * translated when the house spec is set. */
-static uint16 _house_overrides[NEW_HOUSE_OFFSET];
-
-void AddHouseOverride(uint8 local_id, uint house_type)
-{
-	assert(house_type < NEW_HOUSE_OFFSET);
-	_house_overrides[house_type] = local_id;
-}
-
-void ResetHouseOverrides()
-{
-	for (int i = 0; i != lengthof(_house_overrides); i++) {
-		_house_overrides[i] = INVALID_HOUSE_ID;
-	}
-}
-
-static HouseID GetHouseID(byte grf_local_id, uint32 grfid)
-{
-	const HouseIDMapping *map;
-
-	for (HouseID house_id = NEW_HOUSE_OFFSET; house_id != lengthof(_house_id_mapping); house_id++) {
-		map = &_house_id_mapping[house_id];
-		if (map->house_id == grf_local_id && map->grfid == grfid) return house_id;
-	}
-	return INVALID_HOUSE_ID;
-}
-
-static HouseID AddHouseID(byte grf_local_id, uint32 grfid, byte substitute_id)
-{
-	HouseID house_id;
-	HouseIDMapping *map;
 
-	/* Look to see if this house has already been added. This is done
-	 * separately from the loop below in case a GRF has been deleted, and there
-	 * are any gaps in the array. */
-	house_id = GetHouseID(grf_local_id, grfid);
-	if (house_id != INVALID_HOUSE_ID) return house_id;
-
-	/* This house hasn't been defined before, so give it an ID now. */
-	for (house_id = NEW_HOUSE_OFFSET; house_id != lengthof(_house_id_mapping); house_id++) {
-		map = &_house_id_mapping[house_id];
-
-		if (map->house_id == 0 && map->grfid == 0) {
-			map->house_id      = grf_local_id;
-			map->grfid         = grfid;
-			map->substitute_id = substitute_id;
-			return house_id;
-		}
-	}
-
-	return INVALID_HOUSE_ID;
-}
-
-void SetHouseSpec(const HouseSpec *hs)
-{
-	HouseID house_id = AddHouseID(hs->local_id, hs->grffile->grfid, hs->substitute_id);
-
-	if (house_id == INVALID_HOUSE_ID) {
-		grfmsg(1, "SetHouseSpec: Too many houses allocated. Ignoring.");
-		return;
-	}
-
-	memcpy(&_house_specs[house_id], hs, sizeof(*hs));
-
-	/* Now add the overrides. */
-	for (int i = 0; i != lengthof(_house_overrides); i++) {
-		HouseSpec *overridden_hs = GetHouseSpecs(i);
-
-		if (_house_overrides[i] != hs->local_id) continue;
-
-		overridden_hs->override = house_id;
-		_house_overrides[i] = INVALID_HOUSE_ID;
-	}
-}
-
-void ResetHouseIDMapping()
-{
-	memset(&_house_id_mapping, 0, sizeof(_house_id_mapping));
-}
+HouseOverrideManager _house_mngr(NEW_HOUSE_OFFSET, HOUSE_MAX, INVALID_HOUSE_ID);
 
 void CheckHouseIDs()
 {
@@ -122,7 +42,7 @@
 		if (!GetHouseSpecs(house_id)->enabled && house_id >= NEW_HOUSE_OFFSET) {
 			/* The specs for this type of house are not available any more, so
 			 * replace it with the substitute original house type. */
-			SetHouseType(t, _house_id_mapping[house_id].substitute_id);
+			SetHouseType(t, _house_mngr.GetSubstituteID(house_id));
 		}
 	}
 
@@ -163,7 +83,7 @@
 {
 	HouseClassID class_id = GetHouseSpecs(house_id)->class_id;
 
-	if (!_have_newhouses) return;
+	if (!HASBIT(_loaded_newgrf_features, GRFLOADED_NEWHOUSES)) return;
 
 	/* If there are 255 buildings of this type in this town, there are also
 	 * at least that many houses of the same class in the town, and
@@ -191,7 +111,7 @@
 {
 	HouseClassID class_id = GetHouseSpecs(house_id)->class_id;
 
-	if (!_have_newhouses) return;
+	if (!HASBIT(_loaded_newgrf_features, GRFLOADED_NEWHOUSES)) return;
 
 	if (t->building_counts.id_count[house_id] > 0) t->building_counts.id_count[house_id]--;
 	if (_building_counts.id_count[house_id] > 0)   _building_counts.id_count[house_id]--;
@@ -209,7 +129,7 @@
  */
 void AfterLoadCountBuildings()
 {
-	if (!_have_newhouses) return;
+	if (!HASBIT(_loaded_newgrf_features, GRFLOADED_NEWHOUSES)) return;
 
 	for (TileIndex t = 0; t < MapSize(); t++) {
 		if (!IsTileType(t, MP_HOUSE)) continue;
@@ -313,7 +233,7 @@
 			const HouseSpec *hs = GetHouseSpecs(house_id);
 			if (hs->grffile == NULL) return 0;
 
-			HouseID new_house = GetHouseID(parameter, hs->grffile->grfid);
+			HouseID new_house = _house_mngr.GetID(parameter, hs->grffile->grfid);
 			return new_house == INVALID_HOUSE_ID ? 0 : GetNumHouses(new_house, town);
 		}
 
@@ -374,7 +294,7 @@
 	res->reseed          = 0;
 }
 
-uint16 GetHouseCallback(uint16 callback, uint32 param1, HouseID house_id, Town *town, TileIndex tile)
+uint16 GetHouseCallback(uint16 callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile)
 {
 	ResolverObject object;
 	const SpriteGroup *group;
@@ -382,7 +302,7 @@
 	NewHouseResolver(&object, house_id, tile, town);
 	object.callback = callback;
 	object.callback_param1 = param1;
-	object.callback_param2 = 0;
+	object.callback_param2 = param2;
 
 	group = Resolve(GetHouseSpecs(house_id)->spritegroup, &object);
 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
@@ -406,14 +326,14 @@
 		image = dtss->image + stage;
 		pal   = dtss->pal;
 
-		if (!HASBIT(image, SPRITE_MODIFIER_OPAQUE) && ((_display_opt & DO_TRANS_BUILDINGS))) {
+		if (!HASBIT(image, SPRITE_MODIFIER_OPAQUE) && HASBIT(_transparent_opt, TO_HOUSES)) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
 		} else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
 			if (pal == 0) {
 				const HouseSpec *hs = GetHouseSpecs(house_id);
 				if (HASBIT(hs->callback_mask, CBM_BUILDING_COLOUR)) {
-					uint16 callback = GetHouseCallback(CBID_BUILDING_COLOUR, 0, house_id, GetTownByTile(ti->tile), ti->tile);
+					uint16 callback = GetHouseCallback(CBID_BUILDING_COLOUR, 0, 0, house_id, GetTownByTile(ti->tile), ti->tile);
 					if (callback != CALLBACK_FAILED) {
 						/* If bit 14 is set, we should use a 2cc colour map, else use the callback value. */
 						pal = HASBIT(callback, 14) ? GB(callback, 0, 8) + SPR_2CCMAP_BASE : callback;
@@ -468,7 +388,7 @@
 	bool frame_set_by_callback = false;
 
 	if (HASBIT(hs->callback_mask, CBM_ANIMATION_SPEED)) {
-		uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_SPEED, 0, GetHouseType(tile), GetTownByTile(tile), tile);
+		uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_SPEED, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		if (callback_res != CALLBACK_FAILED) animation_speed = clamp(callback_res & 0xFF, 2, 16);
 	}
 
@@ -483,7 +403,7 @@
 
 	if (HASBIT(hs->callback_mask, CBM_ANIMATION_NEXT_FRAME)) {
 		uint32 param = (hs->extra_flags & CALLBACK_1A_RANDOM_BITS) ? Random() : 0;
-		uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_NEXT_FRAME, param, GetHouseType(tile), GetTownByTile(tile), tile);
+		uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_NEXT_FRAME, param, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 
 		if (callback_res != CALLBACK_FAILED) {
 			frame_set_by_callback = true;
@@ -549,7 +469,7 @@
 			|| _current_player == OWNER_WATER || _current_player == OWNER_NONE) return true;
 
 	if (HASBIT(hs->callback_mask, CBM_HOUSE_DENY_DESTRUCTION)) {
-		uint16 callback_res = GetHouseCallback(CBID_HOUSE_DENY_DESTRUCTION, 0, GetHouseType(tile), GetTownByTile(tile), tile);
+		uint16 callback_res = GetHouseCallback(CBID_HOUSE_DENY_DESTRUCTION, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		return (callback_res == CALLBACK_FAILED || callback_res == 0);
 	} else {
 		return !(hs->extra_flags & BUILDING_IS_PROTECTED);
@@ -562,7 +482,7 @@
 
 	if (HASBIT(hs->callback_mask, CBM_ANIMATION_START_STOP)) {
 		uint32 param = (hs->extra_flags & SYNCHRONISED_CALLBACK_1B) ? (GB(Random(), 0, 16) | random_bits << 16) : Random();
-		uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_START_STOP, param, GetHouseType(tile), GetTownByTile(tile), tile);
+		uint16 callback_res = GetHouseCallback(CBID_HOUSE_ANIMATION_START_STOP, param, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 
 		if (callback_res != CALLBACK_FAILED) ChangeHouseAnimationFrame(tile, callback_res);
 	}
@@ -577,7 +497,11 @@
 		return true;
 	}
 
-	/* @todo: Magic with triggers goes here.  Got to implement that, one day. .. */
+	/* @todo: Magic with triggers goes here.  Got to implement that, one day. ..
+	 * Process randomizing of tiles following specs.
+	 * Once done, redraw the house
+	 * MarkTileDirtyByTile(tile);
+	 */
 
 	if (HASBIT(hs->callback_mask, CBM_ANIMATION_START_STOP)) {
 		/* If this house is marked as having a synchronised callback, all the
@@ -598,7 +522,7 @@
 
 	/* Check callback 21, which determines if a house should be destroyed. */
 	if (HASBIT(hs->callback_mask, CBM_HOUSE_DESTRUCTION)) {
-		uint16 callback_res = GetHouseCallback(CBID_HOUSE_DESTRUCTION, 0, GetHouseType(tile), GetTownByTile(tile), tile);
+		uint16 callback_res = GetHouseCallback(CBID_HOUSE_DESTRUCTION, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		if (callback_res != CALLBACK_FAILED && callback_res > 0) {
 			ClearTownHouse(GetTownByTile(tile), tile);
 			return false;
--- a/src/newgrf_house.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_house.h	Sat Jun 02 19:59:29 2007 +0000
@@ -41,15 +41,7 @@
 	uint8  class_id;  ////< The class id within the grf file
 };
 
-extern HouseIDMapping _house_id_mapping[HOUSE_MAX]; ///< Declared in newgrf_house.cpp
-
-void AddHouseOverride(uint8 local_id, uint house_type);
-void ResetHouseOverrides();
-
-void SetHouseSpec(const HouseSpec *hs);
-
 void CheckHouseIDs();
-void ResetHouseIDMapping();
 
 HouseClassID AllocateHouseClassID(byte grf_class_id, uint32 grfid);
 
@@ -62,7 +54,7 @@
 void AnimateNewHouseTile(TileIndex tile);
 void ChangeHouseAnimationFrame(TileIndex tile, uint16 callback_result);
 
-uint16 GetHouseCallback(uint16 callback, uint32 param1, HouseID house_id, Town *town, TileIndex tile);
+uint16 GetHouseCallback(uint16 callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile);
 
 bool CanDeleteHouse(TileIndex tile);
 
--- a/src/newgrf_spritegroup.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_spritegroup.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -76,6 +76,8 @@
 	_spritegroup_count = 0;
 }
 
+static uint32 _temp_store[0x110];
+
 
 static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
 {
@@ -96,6 +98,8 @@
 		case 0x1C: return object->last_value;
 		case 0x20: return _opt.landscape == LT_ARCTIC ? GetSnowLine() : 0xFF;
 
+		case 0x7D: return _temp_store[parameter];
+
 		/* Not a common variable, so evalute the feature specific variables */
 		default: return object->GetVariable(object, variable, parameter, available);
 	}
@@ -125,14 +129,18 @@
 		case DSGA_OP_SMAX: return max((S)last_value, (S)value);
 		case DSGA_OP_UMIN: return min((U)last_value, (U)value);
 		case DSGA_OP_UMAX: return max((U)last_value, (U)value);
-		case DSGA_OP_SDIV: return (S)last_value / (S)value;
-		case DSGA_OP_SMOD: return (S)last_value % (S)value;
-		case DSGA_OP_UDIV: return (U)last_value / (U)value;
-		case DSGA_OP_UMOD: return (U)last_value % (U)value;
+		case DSGA_OP_SDIV: return value == 0 ? (S)last_value : (S)last_value / (S)value;
+		case DSGA_OP_SMOD: return value == 0 ? (S)last_value : (S)last_value % (S)value;
+		case DSGA_OP_UDIV: return value == 0 ? (U)last_value : (U)last_value / (U)value;
+		case DSGA_OP_UMOD: return value == 0 ? (U)last_value : (U)last_value % (U)value;
 		case DSGA_OP_MUL:  return last_value * value;
 		case DSGA_OP_AND:  return last_value & value;
 		case DSGA_OP_OR:   return last_value | value;
 		case DSGA_OP_XOR:  return last_value ^ value;
+		case DSGA_OP_STO:
+			if (value < lengthof(_temp_store)) _temp_store[value] = last_value;
+			return last_value;
+		case DSGA_OP_RST:  return value;
 		default:           return value;
 	}
 }
--- a/src/newgrf_spritegroup.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_spritegroup.h	Sat Jun 02 19:59:29 2007 +0000
@@ -60,6 +60,8 @@
 	DSGA_OP_AND,  ///< a & b
 	DSGA_OP_OR,   ///< a | b
 	DSGA_OP_XOR,  ///< a ^ b
+	DSGA_OP_STO,  ///< store a into temporary storage, indexed by b. return a
+	DSGA_OP_RST,  ///< return b
 };
 
 
@@ -182,6 +184,9 @@
 		} vehicle;
 		struct {
 			TileIndex tile;
+		} canal;
+		struct {
+			TileIndex tile;
 			const struct Station *st;
 			const struct StationSpec *statspec;
 			CargoID cargo_type;
--- a/src/newgrf_station.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_station.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -61,7 +61,7 @@
 
 /**
  * Allocate a station class for the given class id.
- * @param classid A 32 bit value identifying the class.
+ * @param cls A 32 bit value identifying the class.
  * @return Index into station_classes of allocated class.
  */
 StationClassID AllocateStationClass(uint32 cls)
@@ -138,7 +138,7 @@
 
 /**
  * Tie a station spec to its station class.
- * @param spec The station spec.
+ * @param statspec The station spec.
  */
 void SetCustomStationSpec(StationSpec *statspec)
 {
@@ -184,7 +184,7 @@
 		for (j = 0; j < station_classes[i].stations; j++) {
 			const StationSpec *statspec = station_classes[i].spec[j];
 			if (statspec == NULL) continue;
-			if (statspec->grfid == grfid && statspec->localidx == localidx) return statspec;
+			if (statspec->grffile->grfid == grfid && statspec->localidx == localidx) return statspec;
 		}
 	}
 
@@ -307,7 +307,7 @@
 	uint i;
 
 	for (i = 0; i < lengthof(x_dir); i++, dir++, diagdir++) {
-		uint32 ts = GetTileTrackStatus(tile + TileOffsByDir(*dir), TRANSPORT_RAIL);
+		uint32 ts = GetTileTrackStatus(tile + TileOffsByDir(*dir), TRANSPORT_RAIL, 0);
 		if (ts != 0) {
 			/* If there is any track on the tile, set the bit in the second byte */
 			SETBIT(res, i + 8);
@@ -409,12 +409,7 @@
 		case 0x49: return GetPlatformInfoHelper(tile, false, true, false);
 
 		/* Variables which use the parameter */
-		case 0x60: return GB(st->goods[parameter].waiting_acceptance, 0, 12);
-		case 0x61: return st->goods[parameter].days_since_pickup;
-		case 0x62: return st->goods[parameter].rating;
-		case 0x63: return st->goods[parameter].enroute_time;
-		case 0x64: return st->goods[parameter].last_speed | (st->goods[parameter].last_age << 8);
-		case 0x65: return GB(st->goods[parameter].waiting_acceptance, 12, 4);
+		/* Variables 0x60 to 0x65 are handled separately below */
 
 		/* General station properties */
 		case 0x82: return 50;
@@ -430,6 +425,23 @@
 		case 0xFA: return max(st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0);
 	}
 
+	/* Handle cargo variables with parameter, 0x60 to 0x65 */
+	if (variable >= 0x60 && variable <= 0x65) {
+		CargoID c = GetCargoTranslation(parameter, object->u.station.statspec->grffile);
+
+		if (c == CT_INVALID) return 0;
+		const GoodsEntry *ge = &st->goods[c];
+
+		switch (variable) {
+			case 0x60: return GB(ge->waiting_acceptance, 0, 12);
+			case 0x61: return ge->days_since_pickup;
+			case 0x62: return ge->rating;
+			case 0x63: return ge->enroute_time;
+			case 0x64: return ge->last_speed | (ge->last_age << 8);
+			case 0x65: return GB(ge->waiting_acceptance, 12, 4);
+		}
+	}
+
 	/* Handle cargo variables (deprecated) */
 	if (variable >= 0x8C && variable <= 0xEC) {
 		const GoodsEntry *g = &st->goods[GB(variable - 0x8C, 3, 4)];
@@ -602,7 +614,7 @@
 
 /**
  * Allocate a StationSpec to a Station. This is called once per build operation.
- * @param spec StationSpec to allocate.
+ * @param statspec StationSpec to allocate.
  * @param st Station to allocate it to.
  * @param exec Whether to actually allocate the spec.
  * @return Index within the Station's spec list, or -1 if the allocation failed.
@@ -638,7 +650,7 @@
 		}
 
 		st->speclist[i].spec     = statspec;
-		st->speclist[i].grfid    = statspec->grfid;
+		st->speclist[i].grfid    = statspec->grffile->grfid;
 		st->speclist[i].localidx = statspec->localidx;
 	}
 
@@ -683,10 +695,12 @@
 }
 
 /** Draw representation of a station tile for GUI purposes.
- * @param x, y Position of image.
- * @param dir Direction.
+ * @param x Position x of image.
+ * @param y Position y of image.
+ * @param axis Axis.
  * @param railtype Rail type.
  * @param sclass, station Type of station.
+ * @param station station ID
  * @return True if the tile was drawn (allows for fallback to default graphic)
  */
 bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station)
--- a/src/newgrf_station.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_station.h	Sat Jun 02 19:59:29 2007 +0000
@@ -28,7 +28,7 @@
 typedef byte *StationLayout;
 
 struct StationSpec {
-	uint32 grfid; ///< ID of GRF file station belongs to.
+	const struct GRFFile *grffile; ///< ID of GRF file station belongs to.
 	int localidx; ///< Index within GRF file of station.
 
 	bool allocated; ///< Flag whether this station has been added to a station class list
--- a/src/newgrf_text.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_text.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -45,9 +45,11 @@
 	GRFLX_GERMAN      = 0x02,
 	GRFLX_FRENCH      = 0x03,
 	GRFLX_SPANISH     = 0x04,
+	GRFLX_ESPERANTO   = 0x05,
 	GRFLX_RUSSIAN     = 0x07,
 	GRFLX_CZECH       = 0x15,
 	GRFLX_SLOVAK      = 0x16,
+	GRFLX_BULGARIAN   = 0x18,
 	GRFLX_AFRIKAANS   = 0x1B,
 	GRFLX_GREEK       = 0x1E,
 	GRFLX_DUTCH       = 0x1F,
@@ -71,6 +73,8 @@
 	GRFLX_PORTUGUESE  = 0x36,
 	GRFLX_BRAZILIAN   = 0x37,
 	GRFLX_CROATIAN    = 0x38,
+	GRFLX_JAPANESE    = 0x39,
+	GRFLX_KOREAN      = 0x3A,
 	GRFLX_TURKISH     = 0x3E,
 	GRFLX_UNSPECIFIED = 0x7F,
 };
@@ -122,6 +126,10 @@
 	{"sv_SE", GRFLX_SWEDISH},
 	{"tr_TR", GRFLX_TURKISH},
 	{"uk_UA", GRFLX_UKRAINIAN},
+	{"eo_EO", GRFLX_ESPERANTO},
+	{"bg_BG", GRFLX_BULGARIAN},
+	{"ja_JP", GRFLX_JAPANESE},
+	{"ko_KR", GRFLX_KOREAN},
 	{"gen",   GRFLB_GENERIC}   ///< this is not iso code, but there has to be something...
 };
 
@@ -418,8 +426,8 @@
  * The array iso_codes will be used to find that match.
  * If not found, it will have to be standard english
  * This function is called after the user changed language,
- * from strings.c:ReadLanguagePack
- * @param iso code of current selection
+ * from strings.cpp:ReadLanguagePack
+ * @param iso_name iso code of current selection
  */
 void SetCurrentGrfLangID(const char *iso_name)
 {
--- a/src/newgrf_town.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/newgrf_town.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -4,6 +4,7 @@
 
 #include "stdafx.h"
 #include "openttd.h"
+#include "variables.h"
 #include "debug.h"
 #include "functions.h"
 #include "town.h"
@@ -18,7 +19,10 @@
 {
 	switch (variable) {
 		/* Larger towns */
-		case 0x40: return 1;
+		case 0x40:
+			if (_patches.larger_towns == 0) return 2;
+			if (t->larger_town) return 1;
+			return 0;
 
 		/* Town index */
 		case 0x41: return t->index;
--- a/src/news.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/news.h	Sat Jun 02 19:59:29 2007 +0000
@@ -24,7 +24,7 @@
 typedef void DrawNewsCallbackProc(Window *w);
 typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
 
-#define NEWS_FLAGS(mode,flag,type,cb) ((cb)<<24 | (type)<<16 | (flag)<<8 | (mode))
+#define NEWS_FLAGS(mode, flag, type, cb) ((cb) << 24 | (type) << 16 | (flag) << 8 | (mode))
 void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b);
 void NewsLoop();
 void DrawNewsBorder(const Window *w);
--- a/src/news_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/news_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -128,10 +128,11 @@
 					DrawStringMultiCenter(215, ni->display_mode == NM_NORMAL ? 76 : 56,
 						ni->string_id, w->width - 4);
 				} else {
-					byte bk = _display_opt;
-					_display_opt &= ~DO_TRANS_BUILDINGS;
+					/* Back up transparency options to draw news view */
+					byte to_backup = _transparent_opt;
+					_transparent_opt = 0;
 					DrawWindowViewport(w);
-					_display_opt = bk;
+					_transparent_opt = to_backup;
 
 					/* Shade the viewport into gray, or color*/
 					vp = w->viewport;
@@ -239,17 +240,17 @@
  * @param flags various control bits that will show various news-types. See macro NEWS_FLAGS()
  * @param data_a news-specific value based on news type
  * @param data_b news-specific value based on news type
- * @note flags exists of 4 byte-sized extra parameters.<br/>
- * 1.  0 -  7 display_mode, any of the NewsMode enums (NM_)<br/>
- * 2.  8 - 15 news flags, any of the NewsFlags enums (NF_) NF_INCOLOR are set automatically if needed<br/>
- * 3. 16 - 23 news category, any of the NewsType enums (NT_)<br/>
- * 4. 24 - 31 news callback function, any of the NewsCallback enums (DNC_)<br/>
+ * @note flags exists of 4 byte-sized extra parameters.
+ * 1.  0 -  7 display_mode, any of the NewsMode enums (NM_)
+ * 2.  8 - 15 news flags, any of the NewsFlags enums (NF_) NF_INCOLOR are set automatically if needed
+ * 3. 16 - 23 news category, any of the NewsType enums (NT_)
+ * 4. 24 - 31 news callback function, any of the NewsCallback enums (DNC_)
  * If the display mode is NM_CALLBACK special news is shown and parameter
- * stringid has a special meaning.<br/>
+ * stringid has a special meaning.
  * DNC_TRAINAVAIL, DNC_ROADAVAIL, DNC_SHIPAVAIL, DNC_AIRCRAFTAVAIL: StringID is
- * the index of the engine that is shown<br/>
+ * the index of the engine that is shown
  * DNC_BANKRUPCY: bytes 0-3 of StringID contains the player that is in trouble,
- * and 4-7 contains what kind of bankrupcy message is shown, NewsBankrupcy enum (NB_)<br/>
+ * and 4-7 contains what kind of bankrupcy message is shown, NewsBankrupcy enum (NB_)
  * @see NewsMode
  * @see NewsFlags
  * @see NewsType
@@ -426,7 +427,7 @@
 			w = AllocateWindowDesc(&_news_type13_desc);
 			if (ni->flags & NF_VIEWPORT)
 				AssignWindowViewport(w, 2, 58, 0x1AA, 0x6E,
-					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), 0);
+					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), ZOOM_LVL_NEWS);
 			break;
 		}
 
@@ -435,7 +436,7 @@
 			w = AllocateWindowDesc(&_news_type2_desc);
 			if (ni->flags & NF_VIEWPORT)
 				AssignWindowViewport(w, 2, 58, 0x1AA, 0x46,
-					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), 0);
+					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), ZOOM_LVL_NEWS);
 			break;
 		}
 
@@ -444,7 +445,7 @@
 			w = AllocateWindowDesc(&_news_type0_desc);
 			if (ni->flags & NF_VIEWPORT)
 				AssignWindowViewport(w, 3, 17, 0x112, 0x2F,
-					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), 0);
+					ni->data_a | (ni->flags & NF_VEHICLE ? 0x80000000 : 0), ZOOM_LVL_NEWS);
 			break;
 		}
 	}
@@ -619,15 +620,21 @@
 	 * from it such as big fonts, etc. */
 	ptr  = buffer;
 	dest = buffer2;
+	WChar c_last = '\0';
 	for (;;) {
 		WChar c = Utf8Consume(&ptr);
 		if (c == 0) break;
-		if (c == '\r') {
+		/* Make a space from a newline, but ignore multiple newlines */
+		if (c == '\n' && c_last != '\n') {
+			dest[0] = ' ';
+			dest++;
+		} else if (c == '\r') {
 			dest[0] = dest[1] = dest[2] = dest[3] = ' ';
 			dest += 4;
 		} else if (IsPrintable(c)) {
 			dest += Utf8Encode(dest, c);
 		}
+		c_last = c;
 	}
 
 	*dest = '\0';
--- a/src/npf.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/npf.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -7,6 +7,7 @@
 #include "bridge_map.h"
 #include "debug.h"
 #include "functions.h"
+#include "landscape.h"
 #include "npf.h"
 #include "aystar.h"
 #include "macros.h"
@@ -356,7 +357,7 @@
 				 * encounter, if it is red */
 
 				/* Is this a presignal exit or combo? */
-				SignalType sigtype = GetSignalType(tile);
+				SignalType sigtype = GetSignalType(tile, TrackdirToTrack(trackdir));
 				if (sigtype == SIGTYPE_EXIT || sigtype == SIGTYPE_COMBO) {
 					/* Penalise exit and combo signals differently (heavier) */
 					cost += _patches.npf_rail_firstred_exit_penalty;
@@ -522,6 +523,7 @@
 	uint32 ts;
 	TrackdirBits trackdirbits;
 	TransportType type = (TransportType)aystar->user_data[NPF_TYPE];
+	uint subtype = aystar->user_data[NPF_SUB_TYPE];
 	bool override_dst_check = false;
 	/* Initialize to 0, so we can jump out (return) somewhere an have no neighbours */
 	aystar->num_neighbours = 0;
@@ -621,7 +623,7 @@
 		 * the back */
 		ts = TrackdirToTrackdirBits(DiagdirToDiagTrackdir(ReverseDiagDir(exitdir)));
 	} else {
-		ts = GetTileTrackStatus(dst_tile, type);
+		ts = GetTileTrackStatus(dst_tile, type, subtype);
 	}
 	trackdirbits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK); /* Filter out signal status and the unused bits */
 
@@ -669,7 +671,7 @@
  * multiple targets that are spread around, we should perform a breadth first
  * search by specifiying CalcZero as our heuristic.
  */
-static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start2, NPFFindStationOrTileData* target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, TransportType type, Owner owner, RailTypeMask railtypes, uint reverse_penalty)
+static NPFFoundTargetData NPFRouteInternal(AyStarNode* start1, AyStarNode* start2, NPFFindStationOrTileData* target, AyStar_EndNodeCheck target_proc, AyStar_CalculateH heuristic_proc, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes, uint reverse_penalty)
 {
 	int r;
 	NPFFoundTargetData result;
@@ -708,6 +710,7 @@
 
 	/* Initialize user_data */
 	_npf_aystar.user_data[NPF_TYPE] = type;
+	_npf_aystar.user_data[NPF_SUB_TYPE] = sub_type;
 	_npf_aystar.user_data[NPF_OWNER] = owner;
 	_npf_aystar.user_data[NPF_RAILTYPES] = railtypes;
 
@@ -727,7 +730,7 @@
 	return result;
 }
 
-NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes)
+NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes)
 {
 	AyStarNode start1;
 	AyStarNode start2;
@@ -741,15 +744,15 @@
 	start2.direction = trackdir2;
 	start2.user_data[NPF_TRACKDIR_CHOICE] = INVALID_TRACKDIR;
 
-	return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, owner, railtypes, 0);
+	return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), target, NPFFindStationOrTile, NPFCalcStationOrTileHeuristic, type, sub_type, owner, railtypes, 0);
 }
 
-NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes)
+NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes)
 {
-	return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, target, type, owner, railtypes);
+	return NPFRouteToStationOrTileTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, target, type, sub_type, owner, railtypes);
 }
 
-NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, Owner owner, RailTypeMask railtypes, uint reverse_penalty)
+NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes, uint reverse_penalty)
 {
 	AyStarNode start1;
 	AyStarNode start2;
@@ -765,15 +768,15 @@
 
 	/* perform a breadth first search. Target is NULL,
 	 * since we are just looking for any depot...*/
-	return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), NULL, NPFFindDepot, NPFCalcZero, type, owner, railtypes, reverse_penalty);
+	return NPFRouteInternal(&start1, (IsValidTile(tile2) ? &start2 : NULL), NULL, NPFFindDepot, NPFCalcZero, type, sub_type, owner, railtypes, reverse_penalty);
 }
 
-NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes)
+NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes)
 {
-	return NPFRouteToDepotBreadthFirstTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, type, owner, railtypes, 0);
+	return NPFRouteToDepotBreadthFirstTwoWay(tile, trackdir, INVALID_TILE, INVALID_TRACKDIR, type, sub_type, owner, railtypes, 0);
 }
 
-NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes)
+NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes)
 {
 	/* Okay, what we're gonna do. First, we look at all depots, calculate
 	 * the manhatten distance to get to each depot. We then sort them by
@@ -822,6 +825,7 @@
 
 	/* Initialize user_data */
 	_npf_aystar.user_data[NPF_TYPE] = type;
+	_npf_aystar.user_data[NPF_SUB_TYPE] = sub_type;
 	_npf_aystar.user_data[NPF_OWNER] = owner;
 
 	/* Initialize Start Node */
--- a/src/npf.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/npf.h	Sat Jun 02 19:59:29 2007 +0000
@@ -46,6 +46,7 @@
 /* Indices into AyStar.userdata[] */
 enum {
 	NPF_TYPE = 0,  ///< Contains a TransportTypes value
+	NPF_SUB_TYPE,  ///< Contains the sub transport type
 	NPF_OWNER,     ///< Contains an Owner value
 	NPF_RAILTYPES, ///< Contains a bitmask the compatible RailTypes of the engine when NPF_TYPE == TRANSPORT_RAIL. Unused otherwise.
 };
@@ -76,28 +77,28 @@
 /* Will search from the given tile and direction, for a route to the given
  * station for the given transport type. See the declaration of
  * NPFFoundTargetData above for the meaning of the result. */
-NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes);
+NPFFoundTargetData NPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes);
 
 /* Will search as above, but with two start nodes, the second being the
  * reverse. Look at the NPF_FLAG_REVERSE flag in the result node to see which
  * direction was taken (NPFGetBit(result.node, NPF_FLAG_REVERSE)) */
-NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes);
+NPFFoundTargetData NPFRouteToStationOrTileTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes);
 
 /* Will search a route to the closest depot. */
 
 /* Search using breadth first. Good for little track choice and inaccurate
  * heuristic, such as railway/road.*/
-NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes);
+NPFFoundTargetData NPFRouteToDepotBreadthFirst(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes);
 /* Same as above but with two start nodes, the second being the reverse. Call
  * NPFGetBit(result.node, NPF_FLAG_REVERSE) to see from which node the path
  * orginated. All pathfs from the second node will have the given
  * reverse_penalty applied (NPF_TILE_LENGTH is the equivalent of one full
  * tile).
  */
-NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, Owner owner, RailTypeMask railtypes, uint reverse_penalty);
+NPFFoundTargetData NPFRouteToDepotBreadthFirstTwoWay(TileIndex tile1, Trackdir trackdir1, TileIndex tile2, Trackdir trackdir2, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes, uint reverse_penalty);
 /* Search by trying each depot in order of Manhattan Distance. Good for lots
  * of choices and accurate heuristics, such as water. */
-NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, Owner owner, RailTypeMask railtypes);
+NPFFoundTargetData NPFRouteToDepotTrialError(TileIndex tile, Trackdir trackdir, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes);
 
 void NPFFillWithOrderData(NPFFindStationOrTileData* fstd, Vehicle* v);
 
--- a/src/oldloader.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/oldloader.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -15,6 +15,10 @@
 #include "player.h"
 #include "engine.h"
 #include "vehicle.h"
+#include "aircraft.h"
+#include "roadveh.h"
+#include "ship.h"
+#include "train.h"
 #include "signs.h"
 #include "debug.h"
 #include "depot.h"
@@ -149,7 +153,7 @@
 	/* Old savegames have a nice compression algorithm (RLE)
 	which means that we have a chunk, which starts with a length
 	byte. If that byte is negative, we have to repeat the next byte
-	that many times (+1). Else, we need to read that amount of bytes.
+	that many times ( + 1). Else, we need to read that amount of bytes.
 	Works pretty good if you have many zero's behind eachother */
 
 	if (ls->chunk_size == 0) {
@@ -325,6 +329,9 @@
 	FOR_ALL_VEHICLES(v) {
 		Vehicle *u;
 
+		/* We haven't used this bit for stations for ages */
+		if (v->type == VEH_ROAD) CLRBIT(v->u.road.state, RVS_IS_STOPPING);
+
 		FOR_ALL_VEHICLES_FROM(u, v->index + 1) {
 			/* If a vehicle has the same orders, add the link to eachother
 			 * in both vehicles */
@@ -433,7 +440,7 @@
 	OCL_SVAR( OC_UINT16, Town, ratings[7] ),
 
 	/* XXX - This is pretty odd.. we read 32bit, but only write 8bit.. sure there is
-	nothing changed?? */
+	nothing changed ? ? */
 	OCL_SVAR( OC_FILE_U32 | OC_VAR_U8, Town, have_ratings ),
 	OCL_SVAR( OC_FILE_U32 | OC_VAR_U8, Town, statues ),
 	OCL_SVAR( OC_UINT16, Town, num_houses ),
@@ -617,12 +624,7 @@
 };
 static bool LoadOldStation(LoadgameState *ls, int num)
 {
-	Station *st;
-
-	if (!AddBlockIfNeeded(&_Station_pool, num))
-		error("Stations: failed loading savegame: too many stations");
-
-	st = GetStation(num);
+	Station *st = new (num) Station();
 	_current_station_id = num;
 
 	if (!LoadChunk(ls, st, station_chunk))
@@ -649,8 +651,7 @@
 	OCL_VAR ( OC_UINT32,   1, &_old_town_index ),
 	OCL_SVAR(  OC_UINT8, Industry, width ),
 	OCL_SVAR(  OC_UINT8, Industry, height ),
-	OCL_SVAR(  OC_UINT8, Industry, produced_cargo[0] ),
-	OCL_SVAR(  OC_UINT8, Industry, produced_cargo[1] ),
+	OCL_NULL( 2 ),  ///< used to be industry's produced_cargo
 
 	OCL_SVAR( OC_UINT16, Industry, cargo_waiting[0] ),
 	OCL_SVAR( OC_UINT16, Industry, cargo_waiting[1] ),
@@ -658,9 +659,7 @@
 	OCL_SVAR(  OC_UINT8, Industry, production_rate[0] ),
 	OCL_SVAR(  OC_UINT8, Industry, production_rate[1] ),
 
-	OCL_SVAR(  OC_UINT8, Industry, accepts_cargo[0] ),
-	OCL_SVAR(  OC_UINT8, Industry, accepts_cargo[1] ),
-	OCL_SVAR(  OC_UINT8, Industry, accepts_cargo[2] ),
+	OCL_NULL( 3 ),  ///< used to be industry's accepts_cargo
 
 	OCL_SVAR(  OC_UINT8, Industry, prod_level ),
 
@@ -1070,13 +1069,13 @@
 	 * Basically v->type -= 0x10; would suffice, but play safely */
 	switch (v->type) {
 		default: NOT_REACHED();
-		case 0x00 /*VEH_INVALID */: v->type = VEH_INVALID;  res = LoadChunk(ls, NULL,           vehicle_empty_chunk);    break;
-		case 0x10 /*VEH_TRAIN   */: v->type = VEH_TRAIN;    res = LoadChunk(ls, &v->u.rail,     vehicle_train_chunk);    break;
-		case 0x11 /*VEH_ROAD    */: v->type = VEH_ROAD;     res = LoadChunk(ls, &v->u.road,     vehicle_road_chunk);     break;
-		case 0x12 /*VEH_SHIP    */: v->type = VEH_SHIP;     res = LoadChunk(ls, &v->u.ship,     vehicle_ship_chunk);     break;
-		case 0x13 /*VEH_AIRCRAFT*/: v->type = VEH_AIRCRAFT; res = LoadChunk(ls, &v->u.air,      vehicle_air_chunk);      break;
-		case 0x14 /*VEH_SPECIAL */: v->type = VEH_SPECIAL;  res = LoadChunk(ls, &v->u.special,  vehicle_special_chunk);  break;
-		case 0x15 /*VEH_DISASTER*/: v->type = VEH_DISASTER; res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
+		case 0x00 /*VEH_INVALID */: v = new (v) InvalidVehicle();  res = LoadChunk(ls, NULL,           vehicle_empty_chunk);    break;
+		case 0x10 /*VEH_TRAIN   */: v = new (v) Train();           res = LoadChunk(ls, &v->u.rail,     vehicle_train_chunk);    break;
+		case 0x11 /*VEH_ROAD    */: v = new (v) RoadVehicle();     res = LoadChunk(ls, &v->u.road,     vehicle_road_chunk);     break;
+		case 0x12 /*VEH_SHIP    */: v = new (v) Ship();            res = LoadChunk(ls, &v->u.ship,     vehicle_ship_chunk);     break;
+		case 0x13 /*VEH_AIRCRAFT*/: v = new (v) Aircraft();        res = LoadChunk(ls, &v->u.air,      vehicle_air_chunk);      break;
+		case 0x14 /*VEH_SPECIAL */: v = new (v) SpecialVehicle();  res = LoadChunk(ls, &v->u.special,  vehicle_special_chunk);  break;
+		case 0x15 /*VEH_DISASTER*/: v = new (v) DisasterVehicle(); res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
 	}
 
 	/* This chunk size should always be 10 bytes */
@@ -1112,11 +1111,9 @@
 	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Vehicle, y_pos ),
 	OCL_SVAR(  OC_UINT8, Vehicle, z_pos ),
 	OCL_SVAR(  OC_UINT8, Vehicle, direction ),
-	OCL_SVAR(   OC_INT8, Vehicle, x_offs ),
-	OCL_SVAR(   OC_INT8, Vehicle, y_offs ),
-	OCL_SVAR(  OC_UINT8, Vehicle, sprite_width ),
-	OCL_SVAR(  OC_UINT8, Vehicle, sprite_height ),
-	OCL_SVAR(  OC_UINT8, Vehicle, z_height ),
+	OCL_NULL( 2 ),         ///< x_offs and y_offs, calculated automatically
+	OCL_NULL( 2 ),         ///< sprite_width and sprite_height, calculated automatically
+	OCL_NULL( 1 ),         ///< z_height, calculated automatically
 
 	OCL_SVAR(  OC_UINT8, Vehicle, owner ),
 	OCL_SVAR(   OC_TILE, Vehicle, tile ),
@@ -1219,8 +1216,8 @@
 
 static const OldChunks sign_chunk[] = {
 	OCL_SVAR( OC_UINT16, Sign, str ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,Sign, x ),
-	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32,Sign, y ),
+	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Sign, x ),
+	OCL_SVAR( OC_FILE_U16 | OC_VAR_I32, Sign, y ),
 	OCL_SVAR( OC_FILE_U16 | OC_VAR_I8, Sign, z ),
 
 	OCL_NULL( 6 ),         ///< Width of sign, no longer in use
@@ -1552,6 +1549,19 @@
 
 	for (i = 0; i < OLD_MAP_SIZE; i ++) {
 		switch (GetTileType(i)) {
+			case MP_STATION:
+				_m[i].m4 = 0; // We do not understand this TTDP station mapping (yet)
+				switch (_m[i].m5) {
+					/* We have drive through stops at a totally different place */
+					case 0x53: case 0x54: _m[i].m5 += GFX_BUS_BASE_EXT   - 0x53; break;
+					case 0x57: case 0x58: _m[i].m5 += GFX_TRUCK_BASE_EXT - 0x57; break;
+					case 0x55: case 0x56: // Bus tram stop
+					case 0x59: case 0x5A: // Truck tram stop
+						DEBUG(oldloader, 0, "Loading failed - we don't support trams (yet)");
+						return false;
+				}
+				break;
+
 			case MP_RAILWAY:
 				/* We save presignals different from TTDPatch, convert them */
 				if (GetRailTileType(i) == RAIL_TILE_SIGNALS) {
--- a/src/openttd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/openttd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -24,6 +24,7 @@
 #include "gfx.h"
 #include "gfxinit.h"
 #include "gui.h"
+#include "landscape.h"
 #include "station.h"
 #include "station_map.h"
 #include "town_map.h"
@@ -57,9 +58,12 @@
 #include "date.h"
 #include "clear_map.h"
 #include "fontcache.h"
+#include "newgrf.h"
 #include "newgrf_config.h"
 #include "newgrf_house.h"
+#include "newgrf_commons.h"
 #include "player_face.h"
+#include "group.h"
 
 #include "bridge_map.h"
 #include "clear_map.h"
@@ -291,6 +295,7 @@
 	CleanPool(&_Vehicle_pool);
 	CleanPool(&_Sign_pool);
 	CleanPool(&_Order_pool);
+	CleanPool(&_Group_pool);
 
 	free((void*)_town_sort);
 	free((void*)_industry_sort);
@@ -303,7 +308,10 @@
 	char filename[256];
 
 	_game_mode = GM_MENU;
-	CLRBITS(_display_opt, DO_TRANS_BUILDINGS); // don't make buildings transparent in intro
+
+	/* Clear transparency options */
+	_transparent_opt = 0;
+
 	_opt_ptr = &_opt_newgame;
 	ResetGRFConfig(false);
 
@@ -343,7 +351,7 @@
 	int i;
 	const char *optformat;
 	char musicdriver[32], sounddriver[32], videodriver[32];
-	int resolution[2] = {0,0};
+	int resolution[2] = {0, 0};
 	Year startyear = INVALID_YEAR;
 	uint generation_seed = GENERATE_NEW_SEED;
 	bool save_config = true;
@@ -374,7 +382,7 @@
 #endif
 	;
 
-	MyGetOptData mgo(argc-1, argv+1, optformat);
+	MyGetOptData mgo(argc - 1, argv + 1, optformat);
 
 	while ((i = MyGetOpt(&mgo)) != -1) {
 		switch (i) {
@@ -497,6 +505,8 @@
 	LoadDriver(MUSIC_DRIVER, _ini_musicdriver);
 	LoadDriver(VIDEO_DRIVER, _ini_videodriver); // load video last, to prevent an empty window while sound and music loads
 	_savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING;
+	/* Initialize the zoom level of the screen to normal */
+	_screen.zoom = ZOOM_LVL_NORMAL;
 
 	/* restore saved music volume */
 	_music_driver->set_volume(msf.music_vol);
@@ -680,7 +690,7 @@
 	_game_mode = GM_NORMAL;
 
 	ResetGRFConfig(true);
-	ResetHouseIDMapping();
+	_house_mngr.ResetMapping();
 
 	GenerateWorldSetCallback(&MakeNewGameDone);
 	GenerateWorld(from_heightmap ? GW_HEIGHTMAP : GW_NEWGAME, 1 << _patches.map_x, 1 << _patches.map_y);
@@ -981,8 +991,8 @@
 		Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
 		assert(w);
 
-		WP(w,vp_d).scrollpos_x += x << w->viewport->zoom;
-		WP(w,vp_d).scrollpos_y += y << w->viewport->zoom;
+		WP(w,vp_d).dest_scrollpos_x += ScaleByZoom(x, w->viewport->zoom);
+		WP(w,vp_d).dest_scrollpos_y += ScaleByZoom(y, w->viewport->zoom);
 	}
 }
 
@@ -1071,7 +1081,7 @@
 	StateGameLoop();
 #endif /* ENABLE_NETWORK */
 
-	if (!_pause_game && _display_opt & DO_FULL_ANIMATION) DoPaletteAnimations();
+	if (!_pause_game && HASBIT(_display_opt, DO_FULL_ANIMATION)) DoPaletteAnimations();
 
 	if (!_pause_game || _cheats.build_in_pause.value) MoveAllTextEffects();
 
@@ -1098,8 +1108,8 @@
 	for (tile = 0; tile != MapSize(); tile++) {
 		switch (GetTileType(tile)) {
 			case MP_STREET:
-				if (IsLevelCrossing(tile) && GetCrossingRoadOwner(tile) & 0x80) {
-					SetCrossingRoadOwner(tile, OWNER_TOWN);
+				if (GB(_m[tile].m5, 4, 2) == ROAD_TILE_CROSSING && HASBIT(_m[tile].m4, 7)) {
+					_m[tile].m4 = OWNER_TOWN;
 				}
 				/* FALLTHROUGH */
 
@@ -1274,11 +1284,13 @@
 
 	WP(w,vp_d).scrollpos_x = _saved_scrollpos_x;
 	WP(w,vp_d).scrollpos_y = _saved_scrollpos_y;
+	WP(w,vp_d).dest_scrollpos_x = _saved_scrollpos_x;
+	WP(w,vp_d).dest_scrollpos_y = _saved_scrollpos_y;
 
 	vp = w->viewport;
 	vp->zoom = _saved_scrollpos_zoom;
-	vp->virtual_width = vp->width << vp->zoom;
-	vp->virtual_height = vp->height << vp->zoom;
+	vp->virtual_width = ScaleByZoom(vp->width, vp->zoom);
+	vp->virtual_height = ScaleByZoom(vp->height, vp->zoom);
 
 	/* in version 4.1 of the savegame, is_active was introduced to determine
 	 * if a player does exist, rather then checking name_1 */
@@ -1290,8 +1302,8 @@
 	/* If Load Scenario / New (Scenario) Game is used,
 	 *  a player does not exist yet. So create one here.
 	 * 1 exeption: network-games. Those can have 0 players
-	 *   But this exeption is not true for network_servers! */
-	if (!_players[0].is_active && (!_networking || (_networking && _network_server)))
+	 *   But this exeption is not true for non dedicated network_servers! */
+	if (!_players[0].is_active && (!_networking || (_networking && _network_server && !_network_dedicated)))
 		DoStartupNewPlayer(false);
 
 	DoZoomInOutWindow(ZOOM_NONE, w); // update button status
@@ -1404,6 +1416,73 @@
 		}
 	}
 
+	if (CheckSavegameVersion(48)) {
+		for (TileIndex t = 0; t < map_size; t++) {
+			switch (GetTileType(t)) {
+				case MP_RAILWAY:
+					if (IsPlainRailTile(t)) {
+						/* Swap ground type and signal type for plain rail tiles, so the
+						 * ground type uses the same bits as for depots and waypoints. */
+						uint tmp = GB(_m[t].m4, 0, 4);
+						SB(_m[t].m4, 0, 4, GB(_m[t].m2, 0, 4));
+						SB(_m[t].m2, 0, 4, tmp);
+					} else if (HASBIT(_m[t].m5, 2)) {
+						/* Split waypoint and depot rail type and remove the subtype. */
+						CLRBIT(_m[t].m5, 2);
+						CLRBIT(_m[t].m5, 6);
+					}
+					break;
+
+				case MP_STREET:
+					/* Swap m3 and m4, so the track type for rail crossings is the
+					 * same as for normal rail. */
+					Swap(_m[t].m3, _m[t].m4);
+					break;
+
+				default: break;
+			}
+		}
+	}
+
+	if (CheckSavegameVersion(61)) {
+		/* Added the RoadType */
+		bool old_bridge = CheckSavegameVersion(42);
+		for (TileIndex t = 0; t < map_size; t++) {
+			switch(GetTileType(t)) {
+				case MP_STREET:
+					SB(_m[t].m5, 6, 2, GB(_m[t].m5, 4, 2));
+					switch (GetRoadTileType(t)) {
+						default: NOT_REACHED();
+						case ROAD_TILE_NORMAL:
+							SB(_m[t].m4, 0, 4, GB(_m[t].m5, 0, 4));
+							SB(_m[t].m4, 4, 4, 0);
+							SB(_m[t].m6, 2, 4, 0);
+							break;
+						case ROAD_TILE_CROSSING:
+							SB(_m[t].m4, 5, 2, GB(_m[t].m5, 2, 2));
+							break;
+						case ROAD_TILE_DEPOT:    break;
+					}
+					SetRoadTypes(t, ROADTYPES_ROAD);
+					break;
+
+				case MP_STATION:
+					if (IsRoadStop(t)) SetRoadTypes(t, ROADTYPES_ROAD);
+					break;
+
+				case MP_TUNNELBRIDGE:
+					/* Middle part of "old" bridges */
+					if (old_bridge && IsBridgeTile(t) && HASBIT(_m[t].m5, 6)) break;
+					if ((IsTunnel(t) ? GetTunnelTransportType(t) : (old_bridge ? (TransportType)GB(_m[t].m5, 1, 2) : GetBridgeTransportType(t))) == TRANSPORT_ROAD) {
+						SetRoadTypes(t, ROADTYPES_ROAD);
+					}
+					break;
+
+				default: break;
+			}
+		}
+	}
+
 	if (CheckSavegameVersion(42)) {
 		Vehicle* v;
 
@@ -1426,9 +1505,10 @@
 
 							MakeRoadNormal(
 								t,
-								GetTileOwner(t),
 								axis == AXIS_X ? ROAD_Y : ROAD_X,
-								town
+								ROADTYPES_ROAD,
+								town,
+								GetTileOwner(t), OWNER_NONE, OWNER_NONE
 							);
 						}
 					} else {
@@ -1476,34 +1556,6 @@
 		}
 	}
 
-	if (CheckSavegameVersion(48)) {
-		for (TileIndex t = 0; t < map_size; t++) {
-			switch (GetTileType(t)) {
-				case MP_RAILWAY:
-					if (IsPlainRailTile(t)) {
-						/* Swap ground type and signal type for plain rail tiles, so the
-						 * ground type uses the same bits as for depots and waypoints. */
-						uint tmp = GB(_m[t].m4, 0, 4);
-						SB(_m[t].m4, 0, 4, GB(_m[t].m2, 0, 4));
-						SB(_m[t].m2, 0, 4, tmp);
-					} else if (HASBIT(_m[t].m5, 2)) {
-						/* Split waypoint and depot rail type and remove the subtype. */
-						CLRBIT(_m[t].m5, 2);
-						CLRBIT(_m[t].m5, 6);
-					}
-					break;
-
-				case MP_STREET:
-					/* Swap m3 and m4, so the track type for rail crossings is the
-					 * same as for normal rail. */
-					Swap(_m[t].m3, _m[t].m4);
-					break;
-
-				default: break;
-			}
-		}
-	}
-
 	/* Elrails got added in rev 24 */
 	if (CheckSavegameVersion(24)) {
 		Vehicle *v;
@@ -1583,7 +1635,7 @@
 
 				if (statspec != NULL) {
 					wp->stat_id = _m[wp->xy].m4 + 1;
-					wp->grfid = statspec->grfid;
+					wp->grfid = statspec->grffile->grfid;
 					wp->localidx = statspec->localidx;
 				} else {
 					/* No custom graphics set, so set to default. */
@@ -1612,10 +1664,10 @@
 				case MP_RAILWAY:
 					if (HasSignals(t)) {
 						/* convert PBS signals to combo-signals */
-						if (HASBIT(_m[t].m2, 2)) SetSignalType(t, SIGTYPE_COMBO);
+						if (HASBIT(_m[t].m2, 2)) SetSignalType(t, TRACK_X, SIGTYPE_COMBO);
 
 						/* move the signal variant back */
-						SetSignalVariant(t, HASBIT(_m[t].m2, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC);
+						SetSignalVariant(t, TRACK_X, HASBIT(_m[t].m2, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC);
 						CLRBIT(_m[t].m2, 3);
 					}
 
@@ -1669,7 +1721,10 @@
 
 	if (CheckSavegameVersion(34)) FOR_ALL_PLAYERS(p) ResetPlayerLivery(p);
 
-	FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
+	FOR_ALL_PLAYERS(p) {
+		p->avail_railtypes = GetPlayerRailtypes(p->index);
+		p->avail_roadtypes = GetPlayerRoadtypes(p->index);
+	}
 
 	if (!CheckSavegameVersion(27)) AfterLoadStations();
 
@@ -1726,7 +1781,7 @@
 		FOR_ALL_INDUSTRIES(i) {
 			uint j;
 
-			if (i->type == IT_FARM || i->type == IT_FARM_2) {
+			if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_ON_BUILT) {
 				for (j = 0; j != 50; j++) PlantRandomFarmField(i);
 			}
 		}
@@ -1762,8 +1817,6 @@
 	 * space for newhouses grf features. A new byte, m7, was also added. */
 	if (CheckSavegameVersion(53)) {
 		for (TileIndex t = 0; t < map_size; t++) {
-			_me[t].m7 = 0;
-
 			if (IsTileType(t, MP_HOUSE)) {
 				if (GB(_m[t].m3, 6, 2) != TOWN_HOUSE_COMPLETED) {
 					/* Move the construction stage from m3[7..6] to m5[5..4].
@@ -1908,6 +1961,72 @@
 		}
 	}
 
+	/* A patch option containing the proportion of towns that grow twice as
+	 * fast was added in version 54. From version 56 this is now saved in the
+	 * town as cities can be built specifically in the scenario editor. */
+	if (CheckSavegameVersion(56)) {
+		Town *t;
+
+		FOR_ALL_TOWNS(t) {
+			if (_patches.larger_towns != 0 && (t->index % _patches.larger_towns) == 0) {
+				t->larger_town = true;
+			}
+		}
+	}
+
+	if (CheckSavegameVersion(57)) {
+		Vehicle *v;
+		/* Added a FIFO queue of vehicles loading at stations */
+		FOR_ALL_VEHICLES(v) {
+			if ((v->type != VEH_TRAIN || IsFrontEngine(v)) &&  // for all locs
+					!(v->vehstatus & (VS_STOPPED | VS_CRASHED)) && // not stopped or crashed
+					v->current_order.type == OT_LOADING) {         // loading
+				GetStation(v->last_station_visited)->loading_vehicles.push_back(v);
+
+				/* The loading finished flag is *only* set when actually completely
+				 * finished. Because the vehicle is loading, it is not finished. */
+				CLRBIT(v->vehicle_flags, VF_LOADING_FINISHED);
+			}
+		}
+	}
+
+	if (CheckSavegameVersion(58)) {
+		/* patch difficulty number_industries other then zero get bumped to +1
+		 * since a new option (very low at position1) has been added */
+		if (_opt.diff.number_industries > 0) {
+			_opt.diff.number_industries++;
+		}
+
+		/* Same goes for number of towns, although no test is needed, just an increment */
+		_opt.diff.number_towns++;
+	}
+
+	if (CheckSavegameVersion(64)) {
+		/* copy the signal type/variant and move signal states bits */
+		for (TileIndex t = 0; t < map_size; t++) {
+			if (IsTileType(t, MP_RAILWAY) && HasSignals(t)) {
+				SetSignalStates(t, GB(_m[t].m2, 4, 4));
+				SetSignalVariant(t, INVALID_TRACK, GetSignalVariant(t, TRACK_X));
+				SetSignalType(t, INVALID_TRACK, GetSignalType(t, TRACK_X));
+				CLRBIT(_m[t].m2, 7);
+			}
+		}
+	}
+
+	/* Recalculate */
+	Group *g;
+	FOR_ALL_GROUPS(g) {
+		const Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if (!IsEngineCountable(v)) continue;
+
+			if (v->group_id != g->index || v->type != g->vehicle_type || v->owner != g->owner) continue;
+
+			g->num_engines[v->engine_type]++;
+		}
+	}
+
+
 	return true;
 }
 
--- a/src/openttd.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/openttd.h	Sat Jun 02 19:59:29 2007 +0000
@@ -40,6 +40,7 @@
 struct NewsItem;
 struct Industry;
 struct DrawPixelInfo;
+struct Group;
 typedef byte VehicleOrderID;  ///< The index of an order within its current vehicle (not pool related)
 typedef byte CargoID;
 typedef byte LandscapeID;
@@ -63,6 +64,7 @@
 typedef uint16 WaypointID;
 typedef uint16 OrderID;
 typedef uint16 SignID;
+typedef uint16 GroupID;
 typedef uint16 EngineRenewID;
 typedef uint16 DestinationID;
 
@@ -171,14 +173,22 @@
 
 /* Display Options */
 enum {
-	DO_SHOW_TOWN_NAMES    = 1 << 0,
-	DO_SHOW_STATION_NAMES = 1 << 1,
-	DO_SHOW_SIGNS         = 1 << 2,
-	DO_FULL_ANIMATION     = 1 << 3,
-	DO_TRANS_BUILDINGS    = 1 << 4,
-	DO_FULL_DETAIL        = 1 << 5,
-	DO_WAYPOINTS          = 1 << 6,
-	DO_TRANS_SIGNS        = 1 << 7,
+	DO_SHOW_TOWN_NAMES    = 0,
+	DO_SHOW_STATION_NAMES = 1,
+	DO_SHOW_SIGNS         = 2,
+	DO_FULL_ANIMATION     = 3,
+	DO_FULL_DETAIL        = 5,
+	DO_WAYPOINTS          = 6,
+};
+
+enum {
+	TO_SIGNS,
+	TO_TREES,
+	TO_HOUSES,
+	TO_INDUSTRIES,
+	TO_BUILDINGS,
+	TO_BRIDGES,
+	TO_STRUCTURES,
 };
 
 /* Landscape types */
@@ -191,6 +201,24 @@
 	NUM_LANDSCAPE = 4,
 };
 
+/**
+ * Town Layouts
+ */
+enum TownLayout {
+	TL_NO_ROADS     = 0, ///< Build no more roads, but still build houses
+	TL_ORIGINAL,         ///< Original algorithm (min. 1 distance between roads)
+	TL_BETTER_ROADS,     ///< Extended original algorithm (min. 2 distance between roads)
+	TL_2X2_GRID,         ///< Geometric 2x2 grid algorithm
+	TL_3X3_GRID,         ///< Geometric 3x3 grid algorithm
+
+	NUM_TLS,             ///< Number of town layouts
+};
+
+/* It needs to be 8bits, because we save and load it as such */
+/** Define basic enum properties */
+template <> struct EnumPropsT<TownLayout> : MakeEnumPropsT<TownLayout, byte, TL_NO_ROADS, NUM_TLS, NUM_TLS> {};
+typedef TinyEnumT<TownLayout> TownLayoutByte; //typedefing-enumification of TownLayout
+
 enum {
 	NUM_PRICES = 49,
 };
@@ -281,13 +309,13 @@
 	CT_IRON_ORE     =  8,
 	CT_STEEL        =  9,
 	CT_VALUABLES    = 10,
-	CT_FOOD         = 11,
 
 	// Arctic
 	CT_WHEAT        =  6,
 	CT_HILLY_UNUSED =  8,
 	CT_PAPER        =  9,
 	CT_GOLD         = 10,
+	CT_FOOD         = 11,
 
 	// Tropic
 	CT_RUBBER       =  1,
@@ -309,7 +337,7 @@
 	CT_PLASTIC      = 10,
 	CT_FIZZY_DRINKS = 11,
 
-	NUM_CARGO       = 12,
+	NUM_CARGO       = 32,
 
 	CT_NO_REFIT     = 0xFE,
 	CT_INVALID      = 0xFF
@@ -336,7 +364,8 @@
 typedef int32 ClearTileProc(TileIndex tile, byte flags);
 typedef void GetAcceptedCargoProc(TileIndex tile, AcceptedCargo res);
 typedef void GetTileDescProc(TileIndex tile, TileDesc *td);
-/* GetTileTrackStatusProcs return a value that contains the possible tracks
+/**
+ * GetTileTrackStatusProcs return a value that contains the possible tracks
  * that can be taken on a given tile by a given transport. The return value is
  * composed as follows: 0xaabbccdd. ccdd and aabb are bitmasks of trackdirs,
  * where bit n corresponds to trackdir n. ccdd are the trackdirs that are
@@ -354,8 +383,12 @@
  * are a track, the fourth bit is the direction. these give 12 (or 14)
  * possible options: 0-5 and 8-13, so we need 14 bits for a trackdir bitmask
  * above.
+ * @param tile     the tile to get the track status from
+ * @param mode     the mode of transportation
+ * @param sub_mode used to differentiate between different kinds within the mode
+ * @return the above mentions track status information
  */
-typedef uint32 GetTileTrackStatusProc(TileIndex tile, TransportType mode);
+typedef uint32 GetTileTrackStatusProc(TileIndex tile, TransportType mode, uint sub_mode);
 typedef void GetProducedCargoProc(TileIndex tile, CargoID *b);
 typedef void ClickTileProc(TileIndex tile);
 typedef void AnimateTileProc(TileIndex tile);
@@ -461,10 +494,11 @@
 	WC_GENERATE_LANDSCAPE,
 	WC_GENERATE_PROGRESS_WINDOW,
 	WC_CONFIRM_POPUP_QUERY,
+	WC_TRANSPARENCY_TOOLBAR,
 };
 
 
-enum {
+enum ExpensesType {
 	EXPENSES_CONSTRUCTION =  0,
 	EXPENSES_NEW_VEHICLES =  1,
 	EXPENSES_TRAIN_RUN    =  2,
--- a/src/order_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/order_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -6,10 +6,10 @@
 #include "openttd.h"
 #include "order.h"
 #include "airport.h"
+#include "vehicle.h"
 #include "depot.h"
 #include "functions.h"
 #include "table/strings.h"
-#include "vehicle.h"
 #include "waypoint.h"
 #include "command.h"
 #include "station.h"
@@ -182,6 +182,7 @@
 
 /** Add an order to the orderlist of a vehicle.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 various bitstuffed elements
  * - p1 = (bit  0 - 15) - ID of the vehicle
  * - p1 = (bit 16 - 31) - the selected order (if any). If the last order is given,
@@ -478,6 +479,7 @@
 
 /** Delete an order from the orderlist of a vehicle.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 the ID of the vehicle
  * @param p2 the order to delete (max 255)
  */
@@ -557,6 +559,7 @@
 
 /** Goto next order of order-list.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 The ID of the vehicle which order is skipped
  * @param p2 unused
  */
@@ -578,14 +581,14 @@
 
 		v->cur_order_index = b;
 
-		if (v->type == VEH_TRAIN) v->u.rail.days_since_order_progr = 0;
-
 		if (v->type == VEH_ROAD) ClearSlot(v);
 
-		/* NON-stop flag is misused to see if a train is in a station that is
-		 * on his order list or not */
-		if (v->current_order.type == OT_LOADING && HASBIT(v->current_order.flags, OFB_NON_STOP))
-			v->current_order.flags = 0;
+		if (v->current_order.type == OT_LOADING) {
+			v->LeaveStation();
+			/* NON-stop flag is misused to see if a train is in a station that is
+			 * on his order list or not */
+			if (HASBIT(v->current_order.flags, OFB_NON_STOP)) v->current_order.flags = 0;
+		}
 
 		InvalidateVehicleOrder(v);
 	}
@@ -600,6 +603,7 @@
 
 /** Modify an order in the orderlist of a vehicle.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 various bitstuffed elements
  * - p1 = (bit  0 - 15) - ID of the vehicle
  * - p1 = (bit 16 - 31) - the selected order (if any). If the last order is given,
@@ -680,6 +684,8 @@
 }
 
 /** Clone/share/copy an order-list of an other vehicle.
+ * @param tile unused
+ * @param flags operation to perform
  * @param p1 various bitstuffed elements
  * - p1 = (bit  0-15) - destination vehicle to clone orders to (p1 & 0xFFFF)
  * - p1 = (bit 16-31) - source vehicle to clone orders from, if any (none for CO_UNSHARE)
@@ -812,6 +818,7 @@
 
 /** Add/remove refit orders from an order
  * @param tile Not used
+ * @param flags operation to perform
  * @param p1 VehicleIndex of the vehicle having the order
  * @param p2 bitmask
  *   - bit 0-7 CargoID
@@ -937,6 +944,7 @@
 
 /** Restore the current order-index of a vehicle and sets service-interval.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 the ID of the vehicle
  * @param p2 various bistuffed elements
  * - p2 = (bit  0-15) - current order-index (p2 & 0xFFFF)
--- a/src/order_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/order_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -320,9 +320,9 @@
 {
 	if (u->type != v->type) return false;
 
-	if (u->type == VEH_TRAIN && !IsFrontEngine(u)) {
+	if (u->HasFront() && !u->IsPrimaryVehicle()) {
 		u = GetFirstVehicleInChain(u);
-		if (!IsFrontEngine(u)) return false;
+		if (!u->IsPrimaryVehicle()) return false;
 	}
 
 	// v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet
@@ -478,7 +478,7 @@
 			if (sel == WP(w,order_d).sel) sel = -1;
 			WP(w,order_d).sel = sel;
 			SetWindowDirty(w);
-		}	break;
+		} break;
 
 		case ORDER_WIDGET_SKIP:
 			OrderClick_Skip(w, v);
--- a/src/os2.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/os2.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -169,7 +169,7 @@
  * Insert a chunk of text from the clipboard onto the textbuffer. Get TEXT clipboard
  * and append this up to the maximum length (either absolute or screenlength). If maxlength
  * is zero, we don't care about the screenlength but only about the physical length of the string
- * @param tb @Textbuf type to be changed
+ * @param tb Textbuf type to be changed
  * @return Return true on successfull change of Textbuf, or false otherwise
  */
 bool InsertTextBufferClipboard(Textbuf *tb)
@@ -222,7 +222,7 @@
 void CSleep(int milliseconds)
 {
 #ifndef __INNOTEK_LIBC__
- 	delay(milliseconds);
+	delay(milliseconds);
 #else
 	usleep(milliseconds * 1000);
 #endif
--- a/src/pathfind.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/pathfind.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -8,6 +8,7 @@
 #include "station_map.h"
 #include "depot.h"
 #include "functions.h"
+#include "landscape.h"
 #include "map.h"
 #include "tile.h"
 #include "pathfind.h"
@@ -152,7 +153,7 @@
 	if (++tpf->rd.cur_length > 50)
 		return;
 
-	bits = GetTileTrackStatus(tile, tpf->tracktype);
+	bits = GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type);
 	bits = (byte)((bits | (bits >> 8)) & _bits_mask[direction]);
 	if (bits == 0)
 		return;
@@ -321,7 +322,7 @@
 
 	tpf->rd.cur_length++;
 
-	bits = GetTileTrackStatus(tile, tpf->tracktype);
+	bits = GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type);
 
 	if ((byte)bits != tpf->var2) {
 		bits &= _tpfmode1_and[direction];
@@ -362,7 +363,7 @@
 	direction = ReverseDiagDir(direction);
 	tile += TileOffsByDiagDir(direction);
 
-	bits = GetTileTrackStatus(tile, tpf->tracktype);
+	bits = GetTileTrackStatus(tile, tpf->tracktype, tpf->sub_type);
 	bits |= (bits >> 8);
 
 	if ( (byte)bits != tpf->var2) {
@@ -387,7 +388,7 @@
 	} while (bits != 0);
 }
 
-void FollowTrack(TileIndex tile, uint16 flags, DiagDirection direction, TPFEnumProc *enum_proc, TPFAfterProc *after_proc, void *data)
+void FollowTrack(TileIndex tile, uint16 flags, uint sub_type, DiagDirection direction, TPFEnumProc *enum_proc, TPFAfterProc *after_proc, void *data)
 {
 	TrackPathFinder tpf;
 
@@ -410,6 +411,7 @@
 
 
 	tpf.tracktype = (TransportType)(flags & 0xFF);
+	tpf.sub_type = sub_type;
 
 	if (HASBIT(flags, 11)) {
 		tpf.rd.pft_var6 = 0xFF;
@@ -782,7 +784,7 @@
 			if (!IsTileType(tile, MP_RAILWAY) || !IsPlainRailTile(tile)) {
 				/* We found a tile which is not a normal railway tile.
 				 * Determine which tracks that exist on this tile. */
-				uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _tpfmode1_and[direction];
+				uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _tpfmode1_and[direction];
 				bits = TrackdirBitsToTrackBits((TrackdirBits)(ts & TRACKDIR_BIT_MASK));
 
 				/* Check that the tile contains exactly one track */
@@ -820,7 +822,7 @@
 			}
 
 			/* If we reach here, the tile has exactly one track, and this
-			 track is reachable => Rail segment continues */
+			 track is reachable = > Rail segment continues */
 
 			track = _new_trackdir[FIND_FIRST_BIT(bits)][direction];
 			assert(track != INVALID_TRACKDIR);
--- a/src/pathfind.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/pathfind.h	Sat Jun 02 19:59:29 2007 +0000
@@ -57,6 +57,8 @@
 	TrackdirByte the_dir;
 
 	TransportTypeByte tracktype;
+	uint sub_type;
+
 	byte var2;
 	bool disable_tile_hash;
 	bool hasbit_13;
@@ -67,7 +69,7 @@
 	TrackPathFinderLink links[0x400]; ///< hopefully, this is enough.
 };
 
-void FollowTrack(TileIndex tile, uint16 flags, DiagDirection direction, TPFEnumProc* enum_proc, TPFAfterProc* after_proc, void* data);
+void FollowTrack(TileIndex tile, uint16 flags, uint sub_type, DiagDirection direction, TPFEnumProc* enum_proc, TPFAfterProc* after_proc, void* data);
 
 struct FindLengthOfTunnelResult {
 	TileIndex tile;
--- a/src/player.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/player.h	Sat Jun 02 19:59:29 2007 +0000
@@ -168,6 +168,7 @@
 	Livery livery[LS_END];
 	byte player_money_fraction;
 	byte avail_railtypes;
+	byte avail_roadtypes;
 	byte block_preview;
 	PlayerByte index;
 
@@ -248,6 +249,7 @@
 }
 
 byte GetPlayerRailtypes(PlayerID p);
+byte GetPlayerRoadtypes(PlayerID p);
 
 /** Finds out if a Player has a certain railtype available */
 static inline bool HasRailtypeAvail(const Player *p, RailType Railtype)
@@ -311,7 +313,7 @@
  * @return The engine type to replace with, or INVALID_ENGINE if no
  * replacement is in the list.
  */
-static inline EngineID EngineReplacementForPlayer(const Player *p, EngineID engine) { return EngineReplacement(p->engine_renew_list, engine); }
+static inline EngineID EngineReplacementForPlayer(const Player *p, EngineID engine, GroupID group) { return EngineReplacement(p->engine_renew_list, engine, group); }
 
 /**
  * Check if a player has a replacement set up for the given engine.
@@ -319,7 +321,7 @@
  * @param  engine Engine type to be replaced.
  * @return true if a replacement was set up, false otherwise.
  */
-static inline bool EngineHasReplacementForPlayer(const Player *p, EngineID engine) { return EngineReplacementForPlayer(p, engine) != INVALID_ENGINE; }
+static inline bool EngineHasReplacementForPlayer(const Player *p, EngineID engine, GroupID group) { return EngineReplacementForPlayer(p, engine, group) != INVALID_ENGINE; }
 
 /**
  * Add an engine replacement for the player.
@@ -329,7 +331,7 @@
  * @param flags The calling command flags.
  * @return 0 on success, CMD_ERROR on failure.
  */
-static inline int32 AddEngineReplacementForPlayer(Player *p, EngineID old_engine, EngineID new_engine, uint32 flags) { return AddEngineReplacement(&p->engine_renew_list, old_engine, new_engine, flags); }
+static inline int32 AddEngineReplacementForPlayer(Player *p, EngineID old_engine, EngineID new_engine, GroupID group, uint32 flags) { return AddEngineReplacement(&p->engine_renew_list, old_engine, new_engine, group, flags); }
 
 /**
  * Remove an engine replacement for the player.
@@ -338,7 +340,7 @@
  * @param flags The calling command flags.
  * @return 0 on success, CMD_ERROR on failure.
  */
-static inline int32 RemoveEngineReplacementForPlayer(Player *p, EngineID engine, uint32 flags) {return RemoveEngineReplacement(&p->engine_renew_list, engine, flags); }
+static inline int32 RemoveEngineReplacementForPlayer(Player *p, EngineID engine, GroupID group, uint32 flags) {return RemoveEngineReplacement(&p->engine_renew_list, engine, group, flags); }
 
 /**
  * Reset the livery schemes to the player's primary colour.
--- a/src/player_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/player_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -29,7 +29,7 @@
 
 static void DrawPlayerEconomyStats(const Player *p, byte mode)
 {
-	int x,y,i,j,year;
+	int x, y, i, j, year;
 	const int64 (*tbl)[13];
 	int64 sum, cost;
 	StringID str;
@@ -38,8 +38,8 @@
 		/* draw categories */
 		DrawStringCenterUnderline(61, 15, STR_700F_EXPENDITURE_INCOME, 0);
 		for (i = 0; i != 13; i++)
-			DrawString(2, 27 + i*10, STR_7011_CONSTRUCTION + i, 0);
-		DrawStringRightAligned(111, 27 + 10*13 + 2, STR_7020_TOTAL, 0);
+			DrawString(2, 27 + i * 10, STR_7011_CONSTRUCTION + i, 0);
+		DrawStringRightAligned(111, 27 + 10 * 13 + 2, STR_7020_TOTAL, 0);
 
 		/* draw the price columns */
 		year = _cur_year - 2;
@@ -60,16 +60,16 @@
 						str = STR_701E;
 						if (cost < 0) { cost = -cost; str++; }
 						SetDParam64(0, cost);
-						DrawStringRightAligned(x, 27+i*10, str, 0);
+						DrawStringRightAligned(x, 27 + i * 10, str, 0);
 					}
 				}
 
 				str = STR_701E;
 				if (sum < 0) { sum = -sum; str++; }
 				SetDParam64(0, sum);
-				DrawStringRightAligned(x, 27 + 13*10 + 2, str, 0);
+				DrawStringRightAligned(x, 27 + 13 * 10 + 2, str, 0);
 
-				GfxFillRect(x - 75, 27 + 10*13, x, 27 + 10*13, 215);
+				GfxFillRect(x - 75, 27 + 10 * 13, x, 27 + 10 * 13, 215);
 				x += 95;
 			}
 			year++;
@@ -80,7 +80,7 @@
 
 		/* draw max loan aligned to loan below (y += 10) */
 		SetDParam64(0, (uint64)_economy.max_loan);
-		DrawString(202, y+10, STR_MAX_LOAN, 0);
+		DrawString(202, y + 10, STR_MAX_LOAN, 0);
 	} else {
 		y = 15;
 	}
@@ -97,7 +97,7 @@
 
 	y += 12;
 
-	GfxFillRect(182 - 75, y-2, 182, y-2, 215);
+	GfxFillRect(182 - 75, y - 2, 182, y - 2, 215);
 
 	SetDParam64(0, p->money64 - p->current_loan);
 	DrawStringRightAligned(182, y, STR_7028, 0);
@@ -166,13 +166,13 @@
 		SetDParam(4, 10000);
 		DrawWindowWidgets(w);
 
-		DrawPlayerEconomyStats(p, (byte)WP(w,def_d).data_1);
+		DrawPlayerEconomyStats(p, (byte)WP(w, def_d).data_1);
 	} break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
 		case 2: {/* toggle size */
-			byte mode = (byte)WP(w,def_d).data_1;
+			byte mode = (byte)WP(w, def_d).data_1;
 			bool stickied = !!(w->flags4 & WF_STICKY);
 			PlayerID player = (PlayerID)w->window_number;
 			DeleteWindow(w);
@@ -239,7 +239,7 @@
 	w = AllocateWindowDescFront(desc_table[mode], player);
 	if (w != NULL) {
 		w->caption_color = w->window_number;
-		WP(w,def_d).data_1 = mode;
+		WP(w, def_d).data_1 = mode;
 		if (show_stickied) w->flags4 |= WF_STICKY;
 	}
 }
@@ -277,13 +277,14 @@
 	LC_ROAD, LC_ROAD,
 	LC_SHIP, LC_SHIP,
 	LC_AIRCRAFT, LC_AIRCRAFT, LC_AIRCRAFT,
+	LC_ROAD, LC_ROAD,
 };
 
 /* Number of liveries in each class, used to determine the height of the livery window */
 static const byte livery_height[] = {
 	1,
 	11,
-	2,
+	4,
 	2,
 	3,
 };
@@ -323,7 +324,7 @@
 	switch (e->event) {
 		case WE_CREATE:
 			LowerWindowWidget(w, WP(w, livery_d).livery_class + 2);
-			if (!_have_2cc) {
+			if (!HASBIT(_loaded_newgrf_features, GRFLOADED_2CC)) {
 				HideWindowWidget(w, 11);
 				HideWindowWidget(w, 12);
 			}
@@ -365,7 +366,7 @@
 					DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOR(p->livery[scheme].colour1), 152, y);
 					DrawString(165, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour1, sel ? 0xC : 2);
 
-					if (_have_2cc) {
+					if (HASBIT(_loaded_newgrf_features, GRFLOADED_2CC)) {
 						DrawSprite(SPR_SQUARE, GENERAL_SPRITE_COLOR(p->livery[scheme].colour2), 277, y);
 						DrawString(290, y, STR_00D1_DARK_BLUE + p->livery[scheme].colour2, sel ? 0xC : 2);
 					}
@@ -554,14 +555,14 @@
 		LowerWindowWidget(w, WP(w, facesel_d).gender + 5);
 		DrawWindowWidgets(w);
 		p = GetPlayer((PlayerID)w->window_number);
-		DrawPlayerFace(WP(w,facesel_d).face, p->player_color, 2, 16);
+		DrawPlayerFace(WP(w, facesel_d).face, p->player_color, 2, 16);
 	} break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
 		case 3: DeleteWindow(w); break;
 		case 4: /* ok click */
-			DoCommandP(0, 0, WP(w,facesel_d).face, NULL, CMD_SET_PLAYER_FACE);
+			DoCommandP(0, 0, WP(w, facesel_d).face, NULL, CMD_SET_PLAYER_FACE);
 			DeleteWindow(w);
 			break;
 		case 5: /* male click */
@@ -572,7 +573,7 @@
 			SetWindowDirty(w);
 			break;
 		case 7:
-			WP(w,facesel_d).face = ConvertFromOldPlayerFace((WP(w, facesel_d).gender << 31) + GB(InteractiveRandom(), 0, 31));
+			WP(w, facesel_d).face = ConvertFromOldPlayerFace((WP(w, facesel_d).gender << 31) + GB(InteractiveRandom(), 0, 31));
 			SetWindowDirty(w);
 			break;
 		}
@@ -656,8 +657,8 @@
 		}
 	}
 
-	if (train+road+air+ship == 0) {
-		DrawString(x+70, y, STR_7042_NONE, 0);
+	if (train + road + air + ship == 0) {
+		DrawString(x + 70, y, STR_7042_NONE, 0);
 	} else {
 		if (train != 0) {
 			SetDParam(0, train);
@@ -762,7 +763,7 @@
 
 			DrawPlayerVehiclesAmount((PlayerID)w->window_number);
 
-			DrawString(110,48, STR_7006_COLOR_SCHEME, 0);
+			DrawString(110, 48, STR_7006_COLOR_SCHEME, 0);
 			/* Draw company-colour bus */
 			DrawSprite(SPR_VEH_BUS_SW_VIEW, PLAYER_SPRITE_COLOR(p->index), 215, 49);
 
@@ -786,18 +787,18 @@
 					Window *wf = AllocateWindowDescFront(&_select_player_face_desc, w->window_number);
 					if (wf != NULL) {
 						wf->caption_color = w->window_number;
-						WP(wf,facesel_d).face = GetPlayer((PlayerID)wf->window_number)->face;
-						WP(wf,facesel_d).gender = 0;
+						WP(wf, facesel_d).face = GetPlayer((PlayerID)wf->window_number)->face;
+						WP(wf, facesel_d).gender = 0;
 					}
 					break;
 				}
 
 				case PCW_WIDGET_COLOR_SCHEME: {
-					Window *wf = AllocateWindowDescFront(_have_2cc ? &_select_player_livery_2cc_desc : &_select_player_livery_desc, w->window_number);
+					Window *wf = AllocateWindowDescFront(HASBIT(_loaded_newgrf_features, GRFLOADED_2CC) ? &_select_player_livery_2cc_desc : &_select_player_livery_desc, w->window_number);
 					if (wf != NULL) {
 						wf->caption_color = wf->window_number;
-						WP(wf,livery_d).livery_class = LC_OTHER;
-						WP(wf,livery_d).sel = 1;
+						WP(wf, livery_d).livery_class = LC_OTHER;
+						WP(wf, livery_d).sel = 1;
 						LowerWindowWidget(wf, 2);
 					}
 					break;
@@ -813,7 +814,7 @@
 
 				case PCW_WIDGET_COMPANY_NAME: {
 					Player *p = GetPlayer((PlayerID)w->window_number);
-					WP(w,def_d).byte_1 = 1;
+					WP(w, def_d).byte_1 = 1;
 					SetDParam(0, p->name_2);
 					ShowQueryString(p->name_1, STR_700A_COMPANY_NAME, 31, 150, w, CS_ALPHANUMERAL);
 					break;
@@ -852,7 +853,7 @@
 				#ifdef ENABLE_NETWORK
 				case PCW_WIDGET_COMPANY_PASSWORD:
 					if (w->window_number == _local_player) {
-						WP(w,def_d).byte_1 = 2;
+						WP(w, def_d).byte_1 = 2;
 						ShowQueryString(BindCString(_network_player_info[_local_player].password),
 							STR_SET_COMPANY_PASSWORD, sizeof(_network_player_info[_local_player].password), 250, w, CS_ALPHANUMERAL);
 					}
@@ -885,10 +886,10 @@
 			char *b = e->we.edittext.str;
 
 			/* empty string is allowed for password */
-			if (*b == '\0' && WP(w,def_d).byte_1 != 2) return;
+			if (*b == '\0' && WP(w, def_d).byte_1 != 2) return;
 
 			_cmd_text = b;
-			switch (WP(w,def_d).byte_1) {
+			switch (WP(w, def_d).byte_1) {
 				case 0: /* Change president name */
 					DoCommandP(0, 0, 0, NULL, CMD_CHANGE_PRESIDENT_NAME | CMD_MSG(STR_700D_CAN_T_CHANGE_PRESIDENT));
 					break;
--- a/src/players.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/players.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -27,6 +27,7 @@
 #include "date.h"
 #include "window.h"
 #include "player_face.h"
+#include "group.h"
 
 /**
  * Sets the local player and updates the patch settings that are set on a
@@ -471,6 +472,7 @@
 	p->share_owners[0] = p->share_owners[1] = p->share_owners[2] = p->share_owners[3] = PLAYER_SPECTATOR;
 
 	p->avail_railtypes = GetPlayerRailtypes(p->index);
+	p->avail_roadtypes = GetPlayerRoadtypes(p->index);
 	p->inaugurated_year = _cur_year;
 	p->face = ConvertFromOldPlayerFace(Random());
 
@@ -608,6 +610,24 @@
 	return rt;
 }
 
+byte GetPlayerRoadtypes(PlayerID p)
+{
+	byte rt = 0;
+	EngineID i;
+
+	for (i = 0; i != TOTAL_NUM_ENGINES; i++) {
+		const Engine* e = GetEngine(i);
+		const EngineInfo *ei = EngInfo(i);
+
+		if (e->type == VEH_ROAD && HASBIT(ei->climates, _opt.landscape) &&
+				(HASBIT(e->player_avail, p) || _date >= e->intro_date + 365)) {
+			SETBIT(rt, HASBIT(ei->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
+		}
+	}
+
+	return rt;
+}
+
 static void DeletePlayerStuff(PlayerID pi)
 {
 	Player *p;
@@ -622,6 +642,7 @@
 
 /** Change engine renewal parameters
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 bits 0-3 command
  * - p1 = 0 - change auto renew bool
  * - p1 = 1 - change auto renew months
@@ -637,6 +658,7 @@
  * if p1 = 2, then
  * - p2 = minimum amount of money available
  * if p1 = 3, then:
+ * - p1 bits  8-15 = engine group
  * - p2 bits  0-15 = old engine type
  * - p2 bits 16-31 = new engine type
  * if p1 = 4, then:
@@ -692,8 +714,10 @@
 		case 3: {
 			EngineID old_engine_type = GB(p2, 0, 16);
 			EngineID new_engine_type = GB(p2, 16, 16);
+			GroupID id_g = GB(p1, 16, 16);
 			int32 cost;
 
+			if (!IsValidGroupID(id_g) && !IsDefaultGroupID(id_g)) return CMD_ERROR;
 			if (new_engine_type != INVALID_ENGINE) {
 				/* First we make sure that it's a valid type the user requested
 				 * check that it's an engine that is in the engine array */
@@ -713,9 +737,9 @@
 				if (!HASBIT(GetEngine(new_engine_type)->player_avail, _current_player))
 					return CMD_ERROR;
 
-				cost = AddEngineReplacementForPlayer(p, old_engine_type, new_engine_type, flags);
+				cost = AddEngineReplacementForPlayer(p, old_engine_type, new_engine_type, id_g, flags);
 			} else {
-				cost = RemoveEngineReplacementForPlayer(p, old_engine_type, flags);
+				cost = RemoveEngineReplacementForPlayer(p, old_engine_type,id_g, flags);
 			}
 
 			if (IsLocalPlayer()) InvalidateAutoreplaceWindow(old_engine_type);
@@ -755,6 +779,7 @@
 
 /** Control the players: add, delete, etc.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 various functionality
  * - p1 = 0 - create a new player, Which player (network) it will be is in p2
  * - p1 = 1 - create a new AI player
@@ -821,8 +846,8 @@
 		}
 
 		/* This is the joining client who wants a new company */
-		if (_local_player != _network_playas) {
-			assert(_local_player == PLAYER_SPECTATOR && _network_playas == p->index);
+		if (_local_player != _network_playas && _network_playas == p->index) {
+			assert(_local_player == PLAYER_SPECTATOR);
 			SetLocalPlayer(p->index);
 			MarkWholeScreenDirty();
 		}
@@ -899,6 +924,7 @@
 			p->is_active = false;
 		}
 		RemoveAllEngineReplacementForPlayer(p);
+		RemoveAllGroupsForPlayer(p);
 
 	} break;
 
@@ -1107,7 +1133,7 @@
 
 	    SLE_VAR(Player, player_color,          SLE_UINT8),
 	    SLE_VAR(Player, player_money_fraction, SLE_UINT8),
-	    SLE_VAR(Player, avail_railtypes,       SLE_UINT8),
+	SLE_CONDVAR(Player, avail_railtypes,       SLE_UINT8,                   0, 57),
 	    SLE_VAR(Player, block_preview,         SLE_UINT8),
 
 	    SLE_VAR(Player, cargo_types,           SLE_UINT16),
@@ -1253,9 +1279,16 @@
 	}
 
 	/* Write each livery entry. */
-	for (i = 0; i < LS_END; i++) {
+	int num_liveries = CheckSavegameVersion(63) ? LS_END - 2 : LS_END;
+	for (i = 0; i < num_liveries; i++) {
 		SlObject(&p->livery[i], _player_livery_desc);
 	}
+
+	if (num_liveries == LS_END - 2) {
+		/* Copy bus/truck liveries over to trams */
+		p->livery[LS_PASSENGER_TRAM] = p->livery[LS_BUS];
+		p->livery[LS_FREIGHT_TRAM]   = p->livery[LS_TRUCK];
+	}
 }
 
 static void Save_PLYR()
--- a/src/rail.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/rail.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file rail.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
@@ -11,21 +13,21 @@
 /* Maps a trackdir to the bit that stores its status in the map arrays, in the
  * direction along with the trackdir */
 extern const byte _signal_along_trackdir[] = {
-	0x80, 0x80, 0x80, 0x20, 0x40, 0x10, 0, 0,
-	0x40, 0x40, 0x40, 0x10, 0x80, 0x20
+	0x8, 0x8, 0x8, 0x2, 0x4, 0x1, 0, 0,
+	0x4, 0x4, 0x4, 0x1, 0x8, 0x2
 };
 
 /* Maps a trackdir to the bit that stores its status in the map arrays, in the
  * direction against the trackdir */
 extern const byte _signal_against_trackdir[] = {
-	0x40, 0x40, 0x40, 0x10, 0x80, 0x20, 0, 0,
-	0x80, 0x80, 0x80, 0x20, 0x40, 0x10
+	0x4, 0x4, 0x4, 0x1, 0x8, 0x2, 0, 0,
+	0x8, 0x8, 0x8, 0x2, 0x4, 0x1
 };
 
 /* Maps a Track to the bits that store the status of the two signals that can
  * be present on the given track */
 extern const byte _signal_on_track[] = {
-	0xC0, 0xC0, 0xC0, 0x30, 0xC0, 0x30
+	0xC, 0xC, 0xC, 0x3, 0xC, 0x3
 };
 
 /* Maps a diagonal direction to the all trackdirs that are connected to any
@@ -66,8 +68,8 @@
 /* Maps a trackdir to the (4-way) direction the tile is exited when following
  * that trackdir */
 extern const DiagDirection _trackdir_to_exitdir[] = {
-	DIAGDIR_NE,DIAGDIR_SE,DIAGDIR_NE,DIAGDIR_SE,DIAGDIR_SW,DIAGDIR_SE, DIAGDIR_NE,DIAGDIR_NE,
-	DIAGDIR_SW,DIAGDIR_NW,DIAGDIR_NW,DIAGDIR_SW,DIAGDIR_NW,DIAGDIR_NE,
+	DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_NE,
+	DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE,
 };
 
 extern const Trackdir _track_exitdir_to_trackdir[][DIAGDIR_END] = {
@@ -79,7 +81,7 @@
 	{TRACKDIR_RIGHT_N,  TRACKDIR_RIGHT_S,  INVALID_TRACKDIR,  INVALID_TRACKDIR}
 };
 
-extern const Trackdir _track_enterdir_to_trackdir[][DIAGDIR_END] = { // TODO: replace magic with enums
+extern const Trackdir _track_enterdir_to_trackdir[][DIAGDIR_END] = {
 	{TRACKDIR_X_NE,     INVALID_TRACKDIR,  TRACKDIR_X_SW,     INVALID_TRACKDIR},
 	{INVALID_TRACKDIR,  TRACKDIR_Y_SE,     INVALID_TRACKDIR,  TRACKDIR_Y_NW},
 	{INVALID_TRACKDIR,  TRACKDIR_UPPER_E,  TRACKDIR_UPPER_W,  INVALID_TRACKDIR},
--- a/src/rail.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/rail.h	Sat Jun 02 19:59:29 2007 +0000
@@ -223,7 +223,7 @@
 	 * 1) All the sprites in a railset MUST be in the same order. This order
 	 *    is determined by normal rail. Check sprites 1005 and following for this order<p>
 	 * 2) The position where the railtype is loaded must always be the same, otherwise
-	 *    the offset will fail.<p>
+	 *    the offset will fail.
 	 * @note: Something more flexible might be desirable in the future.
 	 */
 	SpriteID total_offset;
@@ -240,10 +240,10 @@
 };
 
 
-// these are the maximums used for updating signal blocks, and checking if a depot is in a pbs block
+/** these are the maximums used for updating signal blocks, and checking if a depot is in a pbs block */
 enum {
-	NUM_SSD_ENTRY = 256, // max amount of blocks
-	NUM_SSD_STACK =  32, // max amount of blocks to check recursively
+	NUM_SSD_ENTRY = 256, ///< max amount of blocks
+	NUM_SSD_STACK =  32, ///< max amount of blocks to check recursively
 };
 
 /**
--- a/src/rail_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/rail_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file rail_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
@@ -77,8 +79,8 @@
 
 static bool CheckTrackCombination(TileIndex tile, TrackBits to_build, uint flags)
 {
-	TrackBits current; /* The current track layout */
-	TrackBits future; /* The track layout we want to build */
+	TrackBits current; // The current track layout
+	TrackBits future;  // The track layout we want to build
 	_error_message = STR_1001_IMPOSSIBLE_TRACK_COMBINATION;
 
 	if (!IsPlainRailTile(tile)) return false;
@@ -109,7 +111,7 @@
 
 static const TrackBits _valid_tileh_slopes[][15] = {
 
-// set of normal ones
+/* set of normal ones */
 {
 	TRACK_BIT_ALL,
 	TRACK_BIT_RIGHT,
@@ -131,7 +133,7 @@
 	TRACK_BIT_RIGHT,
 },
 
-// allowed rail for an evenly raised platform
+/* allowed rail for an evenly raised platform */
 {
 	TRACK_BIT_NONE,
 	TRACK_BIT_LEFT,
@@ -190,20 +192,20 @@
 static uint32 CheckRailSlope(Slope tileh, TrackBits rail_bits, TrackBits existing, TileIndex tile)
 {
 	if (IsSteepSlope(tileh)) {
-		if (existing == 0) {
+		if (_patches.build_on_slopes && existing == 0) {
 			TrackBits valid = TRACK_BIT_CROSS | (HASBIT(1 << SLOPE_STEEP_W | 1 << SLOPE_STEEP_E, tileh) ? TRACK_BIT_VERT : TRACK_BIT_HORZ);
 			if (valid & rail_bits) return _price.terraform;
 		}
 	} else {
 		rail_bits |= existing;
 
-		// don't allow building on the lower side of a coast
+		/* don't allow building on the lower side of a coast */
 		if (IsTileType(tile, MP_WATER) &&
 				~_valid_tileh_slopes[1][tileh] & rail_bits) {
 			return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
 		}
 
-		// no special foundation
+		/* no special foundation */
 		if ((~_valid_tileh_slopes[0][tileh] & rail_bits) == 0)
 			return 0;
 
@@ -228,6 +230,7 @@
 
 /** Build a single piece of rail
  * @param tile tile  to build on
+ * @param flags operation to perform
  * @param p1 railtype of being built piece (normal, mono, maglev)
  * @param p2 rail track to build
  */
@@ -252,12 +255,12 @@
 	switch (GetTileType(tile)) {
 		case MP_RAILWAY:
 			if (!CheckTrackCombination(tile, trackbit, flags) ||
-					!EnsureNoVehicle(tile)) {
+					!EnsureNoVehicleOnGround(tile)) {
 				return CMD_ERROR;
 			}
 			if (!IsTileOwner(tile, _current_player) ||
 					!IsCompatibleRail(GetRailType(tile), railtype)) {
-				// Get detailed error message
+				/* Get detailed error message */
 				return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 			}
 
@@ -287,15 +290,36 @@
 			}
 #undef M
 
-			if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 			if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
 				if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
 
-				if ((track == TRACK_X && GetRoadBits(tile) == ROAD_Y) ||
-						(track == TRACK_Y && GetRoadBits(tile) == ROAD_X)) {
+				RoadTypes roadtypes = GetRoadTypes(tile);
+				RoadBits road = GetRoadBits(tile, ROADTYPE_ROAD);
+				RoadBits tram = GetRoadBits(tile, ROADTYPE_TRAM);
+				switch (roadtypes) {
+					default: break;
+					case ROADTYPES_TRAM:
+						/* Tram crossings must always have road. */
+						SetRoadOwner(tile, ROADTYPE_ROAD, _current_player);
+						roadtypes |= ROADTYPES_ROAD;
+						break;
+
+					case ROADTYPES_ROADTRAM: if (road == tram) break;
+						/* FALL THROUGH */
+					case ROADTYPES_ROADHWAY: // Road and highway are incompatible in this case
+					case ROADTYPES_TRAMHWAY: // Tram and highway are incompatible in this case
+					case ROADTYPES_ALL:      // Also incompatible
+						return CMD_ERROR;
+				}
+
+				road |= tram | GetRoadBits(tile, ROADTYPE_HWAY);
+
+				if ((track == TRACK_X && road == ROAD_Y) ||
+						(track == TRACK_Y && road == ROAD_X)) {
 					if (flags & DC_EXEC) {
-						MakeRoadCrossing(tile, GetTileOwner(tile), _current_player, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, GetTownIndex(tile));
+						MakeRoadCrossing(tile, GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY), _current_player, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtypes, GetTownIndex(tile));
 					}
 					break;
 				}
@@ -330,6 +354,7 @@
 
 /** Remove a single piece of track
  * @param tile tile to remove track from
+ * @param flags operation to perform
  * @param p1 unused
  * @param p2 rail orientation
  */
@@ -350,12 +375,12 @@
 			if (!IsLevelCrossing(tile) ||
 					GetCrossingRailBits(tile) != trackbit ||
 					(_current_player != OWNER_WATER && !CheckTileOwnership(tile)) ||
-					!EnsureNoVehicle(tile)) {
+					!EnsureNoVehicleOnGround(tile)) {
 				return CMD_ERROR;
 			}
 
 			if (flags & DC_EXEC) {
-				MakeRoadNormal(tile, GetCrossingRoadOwner(tile), GetCrossingRoadBits(tile), GetTownIndex(tile));
+				MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY));
 			}
 			break;
 		}
@@ -365,7 +390,7 @@
 
 			if (!IsPlainRailTile(tile) ||
 					(_current_player != OWNER_WATER && !CheckTileOwnership(tile)) ||
-					!EnsureNoVehicle(tile)) {
+					!EnsureNoVehicleOnGround(tile)) {
 				return CMD_ERROR;
 			}
 
@@ -432,11 +457,11 @@
 
 	if (!ValParamTrackOrientation(TrackdirToTrack(*trackdir))) return CMD_ERROR;
 
-	// calculate delta x,y from start to end tile
+	/* calculate delta x,y from start to end tile */
 	dx = ex - x;
 	dy = ey - y;
 
-	// calculate delta x,y for the first direction
+	/* calculate delta x,y for the first direction */
 	trdx = _trackdelta[*trackdir].x;
 	trdy = _trackdelta[*trackdir].y;
 
@@ -445,7 +470,7 @@
 		trdy += _trackdelta[*trackdir ^ 1].y;
 	}
 
-	// validate the direction
+	/* validate the direction */
 	while (
 		(trdx <= 0 && dx > 0) ||
 		(trdx >= 0 && dx < 0) ||
@@ -461,8 +486,8 @@
 		}
 	}
 
-	// (for diagonal tracks, this is already made sure of by above test), but:
-	// for non-diagonal tracks, check if the start and end tile are on 1 line
+	/* (for diagonal tracks, this is already made sure of by above test), but:
+	 * for non-diagonal tracks, check if the start and end tile are on 1 line */
 	if (!IsDiagonalTrackdir(*trackdir)) {
 		trdx = _trackdelta[*trackdir].x;
 		trdy = _trackdelta[*trackdir].y;
@@ -475,6 +500,7 @@
 
 /** Build a stretch of railroad tracks.
  * @param tile start tile of drag
+ * @param flags operation to perform
  * @param p1 end tile of drag
  * @param p2 various bitstuffed elements
  * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev)
@@ -515,7 +541,7 @@
 
 		tile += ToTileIndexDiff(_trackdelta[trackdir]);
 
-		// toggle railbit for the non-diagonal tracks
+		/* toggle railbit for the non-diagonal tracks */
 		if (!IsDiagonalTrackdir(trackdir)) ToggleBitT(trackdir, 0);
 	}
 
@@ -524,6 +550,13 @@
 
 /** Build rail on a stretch of track.
  * Stub for the unified rail builder/remover
+ * @param tile start tile of drag
+ * @param flags operation to perform
+ * @param p1 end tile of drag
+ * @param p2 various bitstuffed elements
+ * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev)
+ * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum)
+ * - p2 = (bit 7)   - 0 = build, 1 = remove tracks
  * @see CmdRailTrackHelper
  */
 int32 CmdBuildRailroadTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -533,6 +566,13 @@
 
 /** Build rail on a stretch of track.
  * Stub for the unified rail builder/remover
+ * @param tile start tile of drag
+ * @param flags operation to perform
+ * @param p1 end tile of drag
+ * @param p2 various bitstuffed elements
+ * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev)
+ * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum)
+ * - p2 = (bit 7)   - 0 = build, 1 = remove tracks
  * @see CmdRailTrackHelper
  */
 int32 CmdRemoveRailroadTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -542,6 +582,7 @@
 
 /** Build a train depot
  * @param tile position of the train depot
+ * @param flags operation to perform
  * @param p1 rail type
  * @param p2 bit 0..1 entrance direction (DiagDirection)
  *
@@ -607,6 +648,7 @@
  * pre/exit/combo-signals, and what-else not. If the rail piece does not
  * have any signals, bit 4 (cycle signal-type) is ignored
  * @param tile tile where to build the signals
+ * @param flags operation to perform
  * @param p1 various bitstuffed elements
  * - p1 = (bit 0-2) - track-orientation, valid values: 0-5 (Track enum)
  * - p1 = (bit 3)   - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
@@ -621,7 +663,7 @@
 	SignalVariant sigvar = (pre_signal ^ HASBIT(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC;
 	int32 cost;
 
-	if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoVehicle(tile))
+	if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoVehicleOnGround(tile))
 		return CMD_ERROR;
 
 	/* Protect against invalid signal copying */
@@ -647,38 +689,40 @@
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	if (!HasSignalOnTrack(tile, track)) {
-		// build new signals
+		/* build new signals */
 		cost = _price.build_signals;
 	} else {
-		if (p2 != 0 && sigvar != GetSignalVariant(tile)) {
-			// convert signals <-> semaphores
+		if (p2 != 0 && sigvar != GetSignalVariant(tile, track)) {
+			/* convert signals <-> semaphores */
 			cost = _price.build_signals + _price.remove_signals;
 		} else {
-			// it is free to change orientation/pre-exit-combo signals
+			/* it is free to change orientation/pre-exit-combo signals */
 			cost = 0;
 		}
 	}
 
 	if (flags & DC_EXEC) {
 		if (!HasSignals(tile)) {
-			// there are no signals at all on this tile yet
+			/* there are no signals at all on this tile yet */
 			SetHasSignals(tile, true);
-			_m[tile].m2 |= 0xF0;              // all signals are on
-			_m[tile].m3 &= ~0xF0;          // no signals built by default
-			SetSignalType(tile, SIGTYPE_NORMAL);
-			SetSignalVariant(tile, sigvar);
+			SetSignalStates(tile, 0xF); // all signals are on
+			SetPresentSignals(tile, 0); // no signals built by default
+			SetSignalType(tile, track, SIGTYPE_NORMAL);
+			SetSignalVariant(tile, track, sigvar);
 		}
 
 		if (p2 == 0) {
 			if (!HasSignalOnTrack(tile, track)) {
-				// build new signals
-				_m[tile].m3 |= SignalOnTrack(track);
+				/* build new signals */
+				SetPresentSignals(tile, GetPresentSignals(tile) | SignalOnTrack(track));
+				SetSignalType(tile, track, SIGTYPE_NORMAL);
+				SetSignalVariant(tile, track, sigvar);
 			} else {
 				if (pre_signal) {
-					// cycle between normal -> pre -> exit -> combo -> ...
-					SignalType type = GetSignalType(tile);
+					/* cycle between normal -> pre -> exit -> combo -> ... */
+					SignalType type = GetSignalType(tile, track);
 
-					SetSignalType(tile, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(type + 1));
+					SetSignalType(tile, track, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(type + 1));
 				} else {
 					CycleSignalSide(tile, track);
 				}
@@ -686,9 +730,8 @@
 		} else {
 			/* If CmdBuildManySignals is called with copying signals, just copy the
 			 * direction of the first signal given as parameter by CmdBuildManySignals */
-			_m[tile].m3 &= ~SignalOnTrack(track);
-			_m[tile].m3 |= p2 & SignalOnTrack(track);
-			SetSignalVariant(tile, sigvar);
+			SetPresentSignals(tile, (GetPresentSignals(tile) & ~SignalOnTrack(track)) | (p2 & SignalOnTrack(track)));
+			SetSignalVariant(tile, track, sigvar);
 		}
 
 		MarkTileDirtyByTile(tile);
@@ -701,6 +744,7 @@
 
 /** Build many signals by dragging; AutoSignals
  * @param tile start tile of drag
+ * @param flags operation to perform
  * @param p1  end tile of drag
  * @param p2 various bitstuffed elements
  * - p2 = (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
@@ -739,13 +783,13 @@
 
 	track = TrackdirToTrack(trackdir); /* trackdir might have changed, keep track in sync */
 
-	// copy the signal-style of the first rail-piece if existing
+	/* copy the signal-style of the first rail-piece if existing */
 	if (HasSignals(tile)) {
-		signals = _m[tile].m3 & SignalOnTrack(track);
+		signals = GetPresentSignals(tile) & SignalOnTrack(track);
 		if (signals == 0) signals = SignalOnTrack(track); /* Can this actually occur? */
 
-		// copy signal/semaphores style (independent of CTRL)
-		semaphores = GetSignalVariant(tile) != SIG_ELECTRIC;
+		/* copy signal/semaphores style (independent of CTRL) */
+		semaphores = GetSignalVariant(tile, track) != SIG_ELECTRIC;
 	} else { // no signals exist, drag a two-way signal stretch
 		signals = SignalOnTrack(track);
 	}
@@ -760,7 +804,7 @@
 	 * remove     - 1 remove signals, 0 build signals */
 	signal_ctr = total_cost = 0;
 	for (;;) {
-		// only build/remove signals with the specified density
+		/* only build/remove signals with the specified density */
 		if (signal_ctr % signal_density == 0) {
 			uint32 p1 = GB(TrackdirToTrack(trackdir), 0, 3);
 			SB(p1, 3, 1, mode);
@@ -779,7 +823,7 @@
 		tile += ToTileIndexDiff(_trackdelta[trackdir]);
 		signal_ctr++;
 
-		// toggle railbit for the non-diagonal tracks (|, -- tracks)
+		/* toggle railbit for the non-diagonal tracks (|, -- tracks) */
 		if (!IsDiagonalTrackdir(trackdir)) ToggleBitT(trackdir, 0);
 	}
 
@@ -788,6 +832,15 @@
 
 /** Build signals on a stretch of track.
  * Stub for the unified signal builder/remover
+ * @param tile start tile of drag
+ * @param flags operation to perform
+ * @param p1  end tile of drag
+ * @param p2 various bitstuffed elements
+ * - p2 = (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
+ * - p2 = (bit  3)    - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ * - p2 = (bit  4)    - 0 = signals, 1 = semaphores
+ * - p2 = (bit  5)    - 0 = build, 1 = remove signals
+ * - p2 = (bit 24-31) - user defined signals_density
  * @see CmdSignalTrackHelper
  */
 int32 CmdBuildSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -797,10 +850,12 @@
 
 /** Remove signals
  * @param tile coordinates where signal is being deleted from
- * @param various bitstuffed elements, only track information is used
- * - p1 = (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
- * - p1 = (bit  3)    - override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
- * - p1 = (bit  4)    - 0 = signals, 1 = semaphores
+ * @param flags operation to perform
+ * @param p1 various bitstuffed elements, only track information is used
+ *           - (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
+ *           - (bit  3)    - override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ *           - (bit  4)    - 0 = signals, 1 = semaphores
+ * @param p2 unused
  */
 int32 CmdRemoveSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -808,7 +863,7 @@
 
 	if (!ValParamTrackOrientation(track) ||
 			!IsTileType(tile, MP_RAILWAY) ||
-			!EnsureNoVehicle(tile) ||
+			!EnsureNoVehicleOnGround(tile) ||
 			!HasSignalOnTrack(tile, track)) {
 		return CMD_ERROR;
 	}
@@ -820,13 +875,13 @@
 
 	/* Do it? */
 	if (flags & DC_EXEC) {
-		_m[tile].m3 &= ~SignalOnTrack(track);
+		SetPresentSignals(tile, GetPresentSignals(tile) & ~SignalOnTrack(track));
 
 		/* removed last signal from tile? */
-		if (GB(_m[tile].m3, 4, 4) == 0) {
-			SB(_m[tile].m2, 4, 4, 0);
+		if (GetPresentSignals(tile) == 0) {
+			SetSignalStates(tile, 0);
 			SetHasSignals(tile, false);
-			SetSignalVariant(tile, SIG_ELECTRIC); // remove any possible semaphores
+			SetSignalVariant(tile, INVALID_TRACK, SIG_ELECTRIC); // remove any possible semaphores
 		}
 
 		SetSignalsOnBothDir(tile, track);
@@ -840,6 +895,15 @@
 
 /** Remove signals on a stretch of track.
  * Stub for the unified signal builder/remover
+ * @param tile start tile of drag
+ * @param flags operation to perform
+ * @param p1  end tile of drag
+ * @param p2 various bitstuffed elements
+ * - p2 = (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
+ * - p2 = (bit  3)    - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ * - p2 = (bit  4)    - 0 = signals, 1 = semaphores
+ * - p2 = (bit  5)    - 0 = build, 1 = remove signals
+ * - p2 = (bit 24-31) - user defined signals_density
  * @see CmdSignalTrackHelper
  */
 int32 CmdRemoveSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -865,17 +929,17 @@
 
 	if (GetRailType(tile) == totype) return CMD_ERROR;
 
-	if (!EnsureNoVehicle(tile) && (!IsCompatibleRail(GetRailType(tile), totype) || IsPlainRailTile(tile))) return CMD_ERROR;
+	if (!EnsureNoVehicleOnGround(tile) && (!IsCompatibleRail(GetRailType(tile), totype) || IsPlainRailTile(tile))) return CMD_ERROR;
 
-	// 'hidden' elrails can't be downgraded to normal rail when elrails are disabled
+	/* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
 	if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
 
-	// change type.
+	/* change type. */
 	if (exec) {
 		SetRailType(tile, totype);
 		MarkTileDirtyByTile(tile);
 
-		// notify YAPF about the track layout change
+		/* notify YAPF about the track layout change */
 		TrackBits tracks = GetTrackBits(tile);
 		while (tracks != TRACK_BIT_NONE) {
 			YapfNotifyTrackLayoutChange(tile, RemoveFirstTrack(&tracks));
@@ -906,6 +970,7 @@
 /** Convert one rail type to the other. You can convert normal rail to
  * monorail/maglev easily or vice-versa.
  * @param tile end tile of rail conversion drag
+ * @param flags operation to perform
  * @param p1 start tile of drag
  * @param p2 new railtype to convert to
  */
@@ -921,7 +986,7 @@
 	if (!ValParamRailtype(p2)) return CMD_ERROR;
 	if (p1 >= MapSize()) return CMD_ERROR;
 
-	// 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);
@@ -969,7 +1034,7 @@
 	if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER)
 		return CMD_ERROR;
 
-	if (!EnsureNoVehicle(tile))
+	if (!EnsureNoVehicleOnGround(tile))
 		return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
@@ -1027,7 +1092,7 @@
 
 #include "table/track_land.h"
 
-static void DrawSingleSignal(TileIndex tile, byte condition, uint image, uint pos)
+static void DrawSingleSignal(TileIndex tile, Track track, byte condition, uint image, uint pos)
 {
 	bool side = (_opt.road_side != 0) && _patches.signal_side;
 	static const Point SignalPositions[2][12] = {
@@ -1064,10 +1129,10 @@
 	/* _signal_base is set by our NewGRF Action 5 loader. If it is 0 then we
 	 * just draw the standard signals, else we get the offset from _signal_base
 	 * and draw that sprite. All the signal sprites are loaded sequentially. */
-	if (_signal_base == 0 || (GetSignalType(tile) == 0 && GetSignalVariant(tile) == SIG_ELECTRIC)) {
-		sprite = SignalBase[side][GetSignalVariant(tile)][GetSignalType(tile)] + image + condition;
+	if (_signal_base == 0 || (GetSignalType(tile, track) == SIGTYPE_NORMAL && GetSignalVariant(tile, track) == SIG_ELECTRIC)) {
+		sprite = SignalBase[side][GetSignalVariant(tile, track)][GetSignalType(tile, track)] + image + condition;
 	} else {
-		sprite = _signal_base + (GetSignalType(tile) - 1) * 16 + GetSignalVariant(tile) * 64 + image + condition;
+		sprite = _signal_base + (GetSignalType(tile, track) - 1) * 16 + GetSignalVariant(tile, track) * 64 + image + condition;
 	}
 
 	AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, 10, GetSlopeZ(x,y));
@@ -1175,9 +1240,6 @@
  * Draw ground sprite and track bits
  * @param ti TileInfo
  * @param track TrackBits to draw
- * @param earth Draw as earth
- * @param snow Draw as snow
- * @param flat Always draw foundation
  */
 static void DrawTrackBits(TileInfo* ti, TrackBits track)
 {
@@ -1186,7 +1248,7 @@
 	SpriteID pal = PAL_NONE;
 	bool junction = false;
 
-	// Select the sprite to use.
+	/* Select the sprite to use. */
 	(image = rti->base_sprites.track_y, track == TRACK_BIT_Y) ||
 	(image++,                           track == TRACK_BIT_X) ||
 	(image++,                           track == TRACK_BIT_UPPER) ||
@@ -1210,8 +1272,8 @@
 
 		if (foundation != 0) DrawFoundation(ti, foundation);
 
-		// DrawFoundation() modifies ti.
-		// Default sloped sprites..
+		/* DrawFoundation() modifies it.
+		 * Default sloped sprites.. */
 		if (ti->tileh != SLOPE_FLAT)
 			image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
 	}
@@ -1224,7 +1286,7 @@
 
 	DrawGroundSprite(image, pal);
 
-	// Draw track pieces individually for junction tiles
+	/* Draw track pieces individually for junction tiles */
 	if (junction) {
 		if (track & TRACK_BIT_X)     DrawGroundSprite(rti->base_sprites.single_y, PAL_NONE);
 		if (track & TRACK_BIT_Y)     DrawGroundSprite(rti->base_sprites.single_x, PAL_NONE);
@@ -1240,33 +1302,33 @@
 
 static void DrawSignals(TileIndex tile, TrackBits rails)
 {
-#define MAYBE_DRAW_SIGNAL(x,y,z) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, GetSingleSignalState(tile, x), y - 0x4FB, z)
+#define MAYBE_DRAW_SIGNAL(x,y,z,t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, t, GetSingleSignalState(tile, x), y - 0x4FB, z)
 
 	if (!(rails & TRACK_BIT_Y)) {
 		if (!(rails & TRACK_BIT_X)) {
 			if (rails & TRACK_BIT_LEFT) {
-				MAYBE_DRAW_SIGNAL(2, 0x509, 0);
-				MAYBE_DRAW_SIGNAL(3, 0x507, 1);
+				MAYBE_DRAW_SIGNAL(2, 0x509, 0, TRACK_LEFT);
+				MAYBE_DRAW_SIGNAL(3, 0x507, 1, TRACK_LEFT);
 			}
 			if (rails & TRACK_BIT_RIGHT) {
-				MAYBE_DRAW_SIGNAL(0, 0x509, 2);
-				MAYBE_DRAW_SIGNAL(1, 0x507, 3);
+				MAYBE_DRAW_SIGNAL(0, 0x509, 2, TRACK_RIGHT);
+				MAYBE_DRAW_SIGNAL(1, 0x507, 3, TRACK_RIGHT);
 			}
 			if (rails & TRACK_BIT_UPPER) {
-				MAYBE_DRAW_SIGNAL(3, 0x505, 4);
-				MAYBE_DRAW_SIGNAL(2, 0x503, 5);
+				MAYBE_DRAW_SIGNAL(3, 0x505, 4, TRACK_UPPER);
+				MAYBE_DRAW_SIGNAL(2, 0x503, 5, TRACK_UPPER);
 			}
 			if (rails & TRACK_BIT_LOWER) {
-				MAYBE_DRAW_SIGNAL(1, 0x505, 6);
-				MAYBE_DRAW_SIGNAL(0, 0x503, 7);
+				MAYBE_DRAW_SIGNAL(1, 0x505, 6, TRACK_LOWER);
+				MAYBE_DRAW_SIGNAL(0, 0x503, 7, TRACK_LOWER);
 			}
 		} else {
-			MAYBE_DRAW_SIGNAL(3, 0x4FB, 8);
-			MAYBE_DRAW_SIGNAL(2, 0x4FD, 9);
+			MAYBE_DRAW_SIGNAL(3, 0x4FB, 8, TRACK_X);
+			MAYBE_DRAW_SIGNAL(2, 0x4FD, 9, TRACK_X);
 		}
 	} else {
-		MAYBE_DRAW_SIGNAL(3, 0x4FF, 10);
-		MAYBE_DRAW_SIGNAL(2, 0x501, 11);
+		MAYBE_DRAW_SIGNAL(3, 0x4FF, 10, TRACK_Y);
+		MAYBE_DRAW_SIGNAL(2, 0x501, 11, TRACK_Y);
 	}
 }
 
@@ -1282,11 +1344,11 @@
 
 		DrawTrackBits(ti, rails);
 
-		if (_display_opt & DO_FULL_DETAIL) DrawTrackDetails(ti);
+		if (HASBIT(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti);
 
 		if (HasSignals(ti->tile)) DrawSignals(ti->tile, rails);
 	} else {
-		// draw depot/waypoint
+		/* draw depot/waypoint */
 		const DrawTileSprites* dts;
 		const DrawTileSeqStruct* dtss;
 		uint32 relocation;
@@ -1301,8 +1363,8 @@
 			image = dts->ground_sprite;
 			if (image != SPR_FLAT_GRASS_TILE) image += rti->total_offset;
 
-			// adjust ground tile for desert
-			// don't adjust for snow, because snow in depots looks weird
+			/* adjust ground tile for desert
+			 * don't adjust for snow, because snow in depots looks weird */
 			if (IsSnowRailGround(ti->tile) && _opt.landscape == LT_TROPIC) {
 				if (image != SPR_FLAT_GRASS_TILE) {
 					image += rti->snow_offset; // tile with tracks
@@ -1311,12 +1373,12 @@
 				}
 			}
 		} else {
-			// look for customization
+			/* look for customization */
 			byte stat_id = GetWaypointByTile(ti->tile)->stat_id;
 			const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, stat_id);
 
 			if (statspec != NULL) {
-				// emulate station tile - open with building
+				/* emulate station tile - open with building */
 				const Station* st = ComposeWaypointStation(ti->tile);
 				uint gfx = 2;
 
@@ -1346,7 +1408,7 @@
 				}
 			} else {
 default_waypoint:
-				// There is no custom layout, fall back to the default graphics
+				/* There is no custom layout, fall back to the default graphics */
 				dts = &_waypoint_gfx_table[GetWaypointAxis(ti->tile)];
 				relocation = 0;
 				image = dts->ground_sprite + rti->total_offset;
@@ -1371,7 +1433,7 @@
 				image += relocation;
 			}
 
-			if (_display_opt & DO_TRANS_BUILDINGS) {
+			if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
 				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 				pal = PALETTE_TO_TRANSPARENT;
 			} else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
@@ -1433,15 +1495,15 @@
 	bool stop;
 	bool has_presignal;
 
-	// presignal info
+	/* presignal info */
 	int presignal_exits;
 	int presignal_exits_free;
 
-	// these are used to keep track of the signals that change.
+	/* these are used to keep track of the signals that change. */
 	TrackdirByte bit[NUM_SSD_ENTRY];
 	TileIndex tile[NUM_SSD_ENTRY];
 
-	// these are used to keep track of the stack that modifies presignals recursively
+	/* these are used to keep track of the stack that modifies presignals recursively */
 	TileIndex next_tile[NUM_SSD_STACK];
 	DiagDirectionByte next_dir[NUM_SSD_STACK];
 
@@ -1450,25 +1512,26 @@
 static bool SetSignalsEnumProc(TileIndex tile, void* data, Trackdir trackdir, uint length, byte* state)
 {
 	SetSignalsData* ssd = (SetSignalsData*)data;
+	Track track = TrackdirToTrack(trackdir);
 
 	if (!IsTileType(tile, MP_RAILWAY)) return false;
 
-	// the tile has signals?
-	if (HasSignalOnTrack(tile, TrackdirToTrack(trackdir))) {
+	/* the tile has signals? */
+	if (HasSignalOnTrack(tile, track)) {
 		if (HasSignalOnTrackdir(tile, ReverseTrackdir(trackdir))) {
-			// yes, add the signal to the list of signals
+			/* yes, add the signal to the list of signals */
 			if (ssd->cur != NUM_SSD_ENTRY) {
 				ssd->tile[ssd->cur] = tile; // remember the tile index
 				ssd->bit[ssd->cur] = trackdir; // and the controlling bit number
 				ssd->cur++;
 			}
 
-			// remember if this block has a presignal.
-			ssd->has_presignal |= IsPresignalEntry(tile);
+			/* remember if this block has a presignal. */
+			ssd->has_presignal |= IsPresignalEntry(tile, track);
 		}
 
-		if (HasSignalOnTrackdir(tile, trackdir) && IsPresignalExit(tile)) {
-			// this is an exit signal that points out from the segment
+		if (HasSignalOnTrackdir(tile, trackdir) && IsPresignalExit(tile, track)) {
+			/* this is an exit signal that points out from the segment */
 			ssd->presignal_exits++;
 			if (GetSignalStateByTrackdir(tile, trackdir) != SIGNAL_STATE_RED)
 				ssd->presignal_exits_free++;
@@ -1526,21 +1589,21 @@
 
 		dest.track = 1 << (direction & 1); // get the trackbit the vehicle would have if it has not entered the tunnel yet (ie is still visible)
 
-		// check for a vehicle with that trackdir on the start tile of the tunnel
+		/* check for a vehicle with that trackdir on the start tile of the tunnel */
 		if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL) return true;
 
-		// check for a vehicle with that trackdir on the end tile of the tunnel
+		/* check for a vehicle with that trackdir on the end tile of the tunnel */
 		if (VehicleFromPos(end, &dest, SignalVehicleCheckProc) != NULL) return true;
 
-		// now check all tiles from start to end for a warping vehicle
-		// NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile?
+		/* now check all tiles from start to end for a warping vehicle
+		 * NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile? */
 		dest.track = 0x40;   //Vehicle inside a tunnel or on a bridge
 		for (; tile != end; tile += TileOffsByDiagDir(direction)) {
 			if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
 				return true;
 		}
 
-		// no vehicle found
+		/* no vehicle found */
 		return false;
 	}
 
@@ -1595,44 +1658,45 @@
 {
 	int i;
 
-	// thinking about presignals...
-	// the presignal is green if,
-	//   if no train is in the segment AND
-	//   there is at least one green exit signal OR
-	//   there are no exit signals in the segment
+	/* thinking about presignals...
+	 * the presignal is green if,
+	 *   if no train is in the segment AND
+	 *   there is at least one green exit signal OR
+	 *   there are no exit signals in the segment */
 
-	// then mark the signals in the segment accordingly
+	/* then mark the signals in the segment accordingly */
 	for (i = 0; i != ssd->cur; i++) {
 		TileIndex tile = ssd->tile[i];
 		byte bit = SignalAgainstTrackdir(ssd->bit[i]);
-		uint16 m2 = _m[tile].m2;
+		uint signals = GetSignalStates(tile);
+		Track track = TrackdirToTrack(ssd->bit[i]);
 
-		// presignals don't turn green if there is at least one presignal exit and none are free
-		if (IsPresignalEntry(tile)) {
+		/* presignals don't turn green if there is at least one presignal exit and none are free */
+		if (IsPresignalEntry(tile, track)) {
 			int ex = ssd->presignal_exits, exfree = ssd->presignal_exits_free;
 
-			// subtract for dual combo signals so they don't count themselves
-			if (IsPresignalExit(tile) && HasSignalOnTrackdir(tile, ssd->bit[i])) {
+			/* subtract for dual combo signals so they don't count themselves */
+			if (IsPresignalExit(tile, track) && HasSignalOnTrackdir(tile, ssd->bit[i])) {
 				ex--;
 				if (GetSignalStateByTrackdir(tile, ssd->bit[i]) != SIGNAL_STATE_RED) exfree--;
 			}
 
-			// if we have exits and none are free, make red.
+			/* if we have exits and none are free, make red. */
 			if (ex && !exfree) goto make_red;
 		}
 
-		// check if the signal is unaffected.
+		/* check if the signal is unaffected. */
 		if (ssd->stop) {
 make_red:
-			// turn red
-			if ((bit & m2) == 0) continue;
+			/* turn red */
+			if ((bit & signals) == 0) continue;
 		} else {
-			// turn green
-			if ((bit & m2) != 0) continue;
+			/* turn green */
+			if ((bit & signals) != 0) continue;
 		}
 
 		/* Update signals on the other side of this exit-combo signal; it changed. */
-		if (IsPresignalExit(tile)) {
+		if (IsPresignalExit(tile, track)) {
 			if (ssd->cur_stack != NUM_SSD_STACK) {
 				ssd->next_tile[ssd->cur_stack] = tile;
 				ssd->next_dir[ssd->cur_stack] = _dir_from_track[ssd->bit[i]];
@@ -1642,8 +1706,8 @@
 			}
 		}
 
-		// it changed, so toggle it
-		_m[tile].m2 = m2 ^ bit;
+		/* it changed, so toggle it */
+		SetSignalStates(tile, signals ^ bit);
 		MarkTileDirtyByTile(tile);
 	}
 }
@@ -1657,23 +1721,23 @@
 	ssd.cur_stack = 0;
 
 	for (;;) {
-		// go through one segment and update all signals pointing into that segment.
+		/* go through one segment and update all signals pointing into that segment. */
 		ssd.cur = ssd.presignal_exits = ssd.presignal_exits_free = 0;
 		ssd.has_presignal = false;
 
-		FollowTrack(tile, 0xC000 | TRANSPORT_RAIL, direction, SetSignalsEnumProc, SetSignalsAfterProc, &ssd);
+		FollowTrack(tile, 0xC000 | TRANSPORT_RAIL, 0, direction, SetSignalsEnumProc, SetSignalsAfterProc, &ssd);
 		ChangeSignalStates(&ssd);
 
-		// remember the result only for the first iteration.
+		/* remember the result only for the first iteration. */
 		if (result < 0) {
-			// stay in depot while segment is occupied or while all presignal exits are blocked
+			/* stay in depot while segment is occupied or while all presignal exits are blocked */
 			result = ssd.stop || (ssd.presignal_exits > 0 && ssd.presignal_exits_free == 0);
 		}
 
-		// if any exit signals were changed, we need to keep going to modify the stuff behind those.
+		/* if any exit signals were changed, we need to keep going to modify the stuff behind those. */
 		if (ssd.cur_stack == 0) break;
 
-		// one or more exit signals were changed, so we need to update another segment too.
+		/* one or more exit signals were changed, so we need to update another segment too. */
 		tile = ssd.next_tile[--ssd.cur_stack];
 		direction = ssd.next_dir[ssd.cur_stack];
 	}
@@ -1766,7 +1830,7 @@
 
 	new_ground = RAIL_GROUND_GRASS;
 
-	if (old_ground != RAIL_GROUND_BARREN) { /* wait until bottom is green */
+	if (old_ground != RAIL_GROUND_BARREN) { // wait until bottom is green
 		/* determine direction of fence */
 		TrackBits rail = GetTrackBits(tile);
 
@@ -1853,7 +1917,7 @@
 }
 
 
-static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	if (mode != TRANSPORT_RAIL) return 0;
 
@@ -1867,11 +1931,8 @@
 
 		case RAIL_TILE_SIGNALS: {
 			uint32 ret = GetTrackBits(tile) * 0x101;
-			byte a;
-			uint16 b;
-
-			a = _m[tile].m3;
-			b = _m[tile].m2;
+			byte a = GetPresentSignals(tile);
+			uint b = GetSignalStates(tile);
 
 			b &= a;
 
@@ -1879,13 +1940,13 @@
 			 * direction), we pretend them to be green. (So if
 			 * signals are only one way, the other way will
 			 * implicitely become `red' */
-			if ((a & 0xC0) == 0) b |= 0xC0;
-			if ((a & 0x30) == 0) b |= 0x30;
+			if ((a & 0xC) == 0) b |= 0xC;
+			if ((a & 0x3) == 0) b |= 0x3;
 
-			if ((b & 0x80) == 0) ret |= 0x10070000;
-			if ((b & 0x40) == 0) ret |= 0x07100000;
-			if ((b & 0x20) == 0) ret |= 0x20080000;
-			if ((b & 0x10) == 0) ret |= 0x08200000;
+			if ((b & 0x8) == 0) ret |= 0x10070000;
+			if ((b & 0x4) == 0) ret |= 0x07100000;
+			if ((b & 0x2) == 0) ret |= 0x20080000;
+			if ((b & 0x1) == 0) ret |= 0x08200000;
 
 			return ret;
 		}
@@ -1913,14 +1974,34 @@
 			break;
 
 		case RAIL_TILE_SIGNALS: {
-			const StringID signal_type[] = {
-				STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS,
-				STR_RAILROAD_TRACK_WITH_PRESIGNALS,
-				STR_RAILROAD_TRACK_WITH_EXITSIGNALS,
-				STR_RAILROAD_TRACK_WITH_COMBOSIGNALS
+			const StringID signal_type[4][4] = {
+				{
+					STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS,
+					STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS,
+					STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS,
+					STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS
+				},
+				{
+					STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS,
+					STR_RAILROAD_TRACK_WITH_PRESIGNALS,
+					STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS,
+					STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS
+				},
+				{
+					STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS,
+					STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS,
+					STR_RAILROAD_TRACK_WITH_EXITSIGNALS,
+					STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS
+				},
+				{
+					STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS,
+					STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS,
+					STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS,
+					STR_RAILROAD_TRACK_WITH_COMBOSIGNALS
+				}
 			};
 
-			td->str = signal_type[GetSignalType(tile)];
+			td->str = signal_type[GetSignalType(tile, TRACK_UPPER)][GetSignalType(tile, TRACK_LOWER)];
 			break;
 		}
 
@@ -1960,7 +2041,7 @@
 	DiagDirection dir;
 	int length;
 
-	// this routine applies only to trains in depot tiles
+	/* this routine applies only to trains in depot tiles */
 	if (v->type != VEH_TRAIN || !IsTileDepotType(tile, TRANSPORT_RAIL)) return VETSB_CONTINUE;
 
 	/* depot direction */
--- a/src/rail_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/rail_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -7,6 +7,7 @@
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "functions.h"
+#include "landscape.h"
 #include "date.h"
 #include "map.h"
 #include "tile.h"
@@ -71,7 +72,7 @@
 
 static void PlaceRail_NE(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_FIX_Y);
+	VpStartPlaceSizing(tile, VPM_FIX_Y, DDSP_PLACE_RAIL_NE);
 }
 
 static void PlaceRail_E(TileIndex tile)
@@ -82,12 +83,12 @@
 
 static void PlaceRail_NW(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_FIX_X);
+	VpStartPlaceSizing(tile, VPM_FIX_X, DDSP_PLACE_RAIL_NW);
 }
 
 static void PlaceRail_AutoRail(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_RAILDIRS);
+	VpStartPlaceSizing(tile, VPM_RAILDIRS, DDSP_PLACE_AUTORAIL);
 }
 
 static void PlaceExtraDepotRail(TileIndex tile, uint16 extra)
@@ -150,13 +151,13 @@
 static void PlaceRail_Station(TileIndex tile)
 {
 	if (_remove_button_clicked) {
-		DoCommandP(tile, 0, 0, CcPlaySound1E, CMD_REMOVE_FROM_RAILROAD_STATION | CMD_MSG(STR_CANT_REMOVE_PART_OF_STATION));
+		VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_REMOVE_STATION);
 	} else if (_railstation.dragdrop) {
-		VpStartPlaceSizing(tile, VPM_X_AND_Y_LIMITED);
+		VpStartPlaceSizing(tile, VPM_X_AND_Y_LIMITED, DDSP_BUILD_STATION);
 		VpSetPlaceSizingLimit(_patches.station_spread);
 	} else {
 		DoCommandP(tile,
-				_railstation.orientation | (_railstation.numtracks << 8) | (_railstation.platlength << 16),
+				_railstation.orientation | (_railstation.numtracks << 8) | (_railstation.platlength << 16) | (_ctrl_pressed << 24),
 				_cur_railtype | (_railstation.station_class << 8) | (_railstation.station_type << 16), CcStation,
 				CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_AUTO | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
 	}
@@ -167,7 +168,7 @@
 	byte trackstat;
 	uint i;
 
-	trackstat = (byte)GetTileTrackStatus(tile, TRANSPORT_RAIL);
+	trackstat = (byte)GetTileTrackStatus(tile, TRANSPORT_RAIL, 0);
 
 	if (trackstat & TRACK_BIT_VERT) // N-S direction
 		trackstat = (_tile_fract_coords.x <= _tile_fract_coords.y) ? TRACK_BIT_RIGHT : TRACK_BIT_LEFT;
@@ -196,7 +197,7 @@
 
 static void PlaceRail_Bridge(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_OR_Y);
+	VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_BUILD_BRIDGE);
 }
 
 void CcBuildRailTunnel(bool success, TileIndex tile, uint32 p1, uint32 p2)
@@ -222,12 +223,12 @@
 
 static void PlaceRail_ConvertRail(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_ConvertRailArea);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CONVERT_RAIL);
 }
 
 static void PlaceRail_AutoSignals(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_SIGNALDIRS);
+	VpStartPlaceSizing(tile, VPM_SIGNALDIRS, DDSP_BUILD_SIGNALS);
 }
 
 
@@ -491,7 +492,7 @@
 		return;
 
 	case WE_PLACE_DRAG: {
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata & 0xF);
+		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		return;
 	}
 
@@ -500,25 +501,44 @@
 			TileIndex start_tile = e->we.place.starttile;
 			TileIndex end_tile = e->we.place.tile;
 
-			if (e->we.place.userdata == VPM_X_OR_Y) {
-				ResetObjectToPlace();
-				ShowBuildBridgeWindow(start_tile, end_tile, _cur_railtype);
-			} else if (e->we.place.userdata == VPM_RAILDIRS) {
-				bool old = _remove_button_clicked;
-				if (_ctrl_pressed) _remove_button_clicked = true;
-				HandleAutodirPlacement();
-				_remove_button_clicked = old;
-			} else if (e->we.place.userdata == VPM_SIGNALDIRS) {
-				HandleAutoSignalPlacement();
-			} else if ((e->we.place.userdata & 0xF) == VPM_X_AND_Y) {
-				if (GUIPlaceProcDragXY(e)) break;
+			switch (e->we.place.select_proc) {
+				case DDSP_BUILD_BRIDGE:
+					ResetObjectToPlace();
+					ShowBuildBridgeWindow(start_tile, end_tile, _cur_railtype);
+					break;
 
-				if ((e->we.place.userdata >> 4) == GUI_PlaceProc_ConvertRailArea >> 4)
+				case DDSP_PLACE_AUTORAIL: {
+					bool old = _remove_button_clicked;
+					if (_ctrl_pressed) _remove_button_clicked = true;
+					HandleAutodirPlacement();
+					_remove_button_clicked = old;
+					break;
+				}
+
+				case DDSP_BUILD_SIGNALS:
+					HandleAutoSignalPlacement();
+					break;
+
+				case DDSP_DEMOLISH_AREA:
+					GUIPlaceProcDragXY(e);
+					break;
+
+				case DDSP_REMOVE_STATION:
+					DoCommandP(end_tile, start_tile, 0, CcPlaySound1E, CMD_REMOVE_FROM_RAILROAD_STATION | CMD_MSG(STR_CANT_REMOVE_PART_OF_STATION));
+					break;
+
+				case DDSP_CONVERT_RAIL:
 					DoCommandP(end_tile, start_tile, _cur_railtype, CcPlaySound10, CMD_CONVERT_RAIL | CMD_MSG(STR_CANT_CONVERT_RAIL));
-			} else if (e->we.place.userdata == VPM_X_AND_Y_LIMITED) {
-				HandleStationPlacement(start_tile, end_tile);
-			} else {
-				DoRailroadTrack(e->we.place.userdata & 1);
+					break;
+
+				case DDSP_BUILD_STATION:
+					HandleStationPlacement(start_tile, end_tile);
+					break;
+
+				case DDSP_PLACE_RAIL_NE:
+				case DDSP_PLACE_RAIL_NW:
+					DoRailroadTrack(e->we.place.select_proc == DDSP_PLACE_RAIL_NE ? TRACK_X : TRACK_Y);
+					break;
 			}
 		}
 		break;
@@ -645,7 +665,7 @@
 	if (!_railstation.orientation) Swap(w, h);
 
 	DoCommandP(TileXY(sx, sy),
-			_railstation.orientation | (w << 8) | (h << 16),
+			_railstation.orientation | (w << 8) | (h << 16) | (_ctrl_pressed << 24),
 			_cur_railtype | (_railstation.station_class << 8) | (_railstation.station_type << 16), CcStation,
 			CMD_BUILD_RAILROAD_STATION | CMD_NO_WATER | CMD_AUTO | CMD_MSG(STR_100F_CAN_T_BUILD_RAILROAD_STATION));
 }
@@ -737,7 +757,7 @@
 			old_dpi = _cur_dpi;
 			_cur_dpi = &tmp_dpi;
 			if (!DrawStationTile(32, 16, _cur_railtype, AXIS_X, _railstation.station_class, _railstation.station_type)) {
-				StationPickerDrawSprite(32, 16, _cur_railtype, 2);
+				StationPickerDrawSprite(32, 16, _cur_railtype, INVALID_ROADTYPE, 2);
 			}
 			_cur_dpi = old_dpi;
 		}
@@ -747,7 +767,7 @@
 			old_dpi = _cur_dpi;
 			_cur_dpi = &tmp_dpi;
 			if (!DrawStationTile(32, 16, _cur_railtype, AXIS_Y, _railstation.station_class, _railstation.station_type)) {
-				StationPickerDrawSprite(32, 16, _cur_railtype, 3);
+				StationPickerDrawSprite(32, 16, _cur_railtype, INVALID_ROADTYPE, 3);
 			}
 			_cur_dpi = old_dpi;
 		}
--- a/src/rail_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/rail_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file rail_map.h Hides the direct accesses to the map array with map accessors */
+
 #ifndef RAIL_MAP_H
 #define RAIL_MAP_H
 
@@ -8,13 +10,21 @@
 #include "tile.h"
 
 
+/** Different types of Rail-related tiles */
 enum RailTileType {
-	RAIL_TILE_NORMAL   = 0,
-	RAIL_TILE_SIGNALS  = 1,
-	RAIL_TILE_WAYPOINT = 2,
-	RAIL_TILE_DEPOT    = 3,
+	RAIL_TILE_NORMAL   = 0, ///< Normal rail tile without signals
+	RAIL_TILE_SIGNALS  = 1, ///< Normal rail tile with signals
+	RAIL_TILE_WAYPOINT = 2, ///< Waypoint (X or Y direction)
+	RAIL_TILE_DEPOT    = 3, ///< Depot (one entrance)
 };
 
+/**
+ * Returns the RailTileType (normal with or without signals,
+ * waypoint or depot).
+ * @param t the tile to get the information from
+ * @pre IsTileType(t, MP_RAILWAY)
+ * @return the RailTileType
+ */
 static inline RailTileType GetRailTileType(TileIndex t)
 {
 	assert(IsTileType(t, MP_RAILWAY));
@@ -24,23 +34,32 @@
 /**
  * Returns whether this is plain rails, with or without signals. Iow, if this
  * tiles RailTileType is RAIL_TILE_NORMAL or RAIL_TILE_SIGNALS.
+ * @param t the tile to get the information from
+ * @pre IsTileType(t, MP_RAILWAY)
+ * @return true if and only if the tile is normal rail (with or without signals)
  */
-static inline bool IsPlainRailTile(TileIndex tile)
+static inline bool IsPlainRailTile(TileIndex t)
 {
-	RailTileType rtt = GetRailTileType(tile);
+	RailTileType rtt = GetRailTileType(t);
 	return rtt == RAIL_TILE_NORMAL || rtt == RAIL_TILE_SIGNALS;
 }
 
 /**
  * Checks if a rail tile has signals.
+ * @param t the tile to get the information from
+ * @pre IsTileType(t, MP_RAILWAY)
+ * @return true if and only if the tile has signals
  */
-static inline bool HasSignals(TileIndex tile)
+static inline bool HasSignals(TileIndex t)
 {
-	return GetRailTileType(tile) == RAIL_TILE_SIGNALS;
+	return GetRailTileType(t) == RAIL_TILE_SIGNALS;
 }
 
 /**
  * Add/remove the 'has signal' bit from the RailTileType
+ * @param tile the tile to add/remove the signals to/from
+ * @param signals whether the rail tile should have signals or not
+ * @pre IsPlainRailTile(tile)
  */
 static inline void SetHasSignals(TileIndex tile, bool signals)
 {
@@ -48,135 +67,198 @@
 	SB(_m[tile].m5, 6, 1, signals);
 }
 
-
+/**
+ * Is this tile a rail depot?
+ * @param t the tile to get the information from
+ * @pre IsTileType(t, MP_RAILWAY)
+ * @return true if and only if the tile is a rail depot
+ */
 static inline bool IsRailDepot(TileIndex t)
 {
 	return GetRailTileType(t) == RAIL_TILE_DEPOT;
 }
 
-
+/**
+ * Is this tile a rail waypoint?
+ * @param t the tile to get the information from
+ * @pre IsTileType(t, MP_RAILWAY)
+ * @return true if and only if the tile is a rail waypoint
+ */
 static inline bool IsRailWaypoint(TileIndex t)
 {
 	return GetRailTileType(t) == RAIL_TILE_WAYPOINT;
 }
 
 
+/**
+ * Gets the rail type of the given tile
+ * @param t the tile to get the rail type from
+ * @return the rail type of the tile
+ */
 static inline RailType GetRailType(TileIndex t)
 {
 	return (RailType)GB(_m[t].m3, 0, 4);
 }
 
+/**
+ * Sets the track bits of the given tile
+ * @param t the tile to set the track bits of
+ * @param r the new track bits for the tile
+ */
 static inline void SetRailType(TileIndex t, RailType r)
 {
 	SB(_m[t].m3, 0, 4, r);
 }
 
 
+/**
+ * Gets the rail type of the given tile
+ * @param t the tile to get the rail type from
+ * @return the rail type of the tile
+ */
 static inline TrackBits GetTrackBits(TileIndex tile)
 {
 	return (TrackBits)GB(_m[tile].m5, 0, 6);
 }
 
+/**
+ * Sets the track bits of the given tile
+ * @param t the tile to set the track bits of
+ * @param b the new track bits for the tile
+ */
 static inline void SetTrackBits(TileIndex t, TrackBits b)
 {
 	SB(_m[t].m5, 0, 6, b);
 }
 
 /**
- * Returns whether the given track is present on the given tile. Tile must be
- * a plain rail tile (IsPlainRailTile()).
+ * Returns whether the given track is present on the given tile.
+ * @param tile  the tile to check the track presence of
+ * @param track the track to search for on the tile
+ * @pre IsPlainRailTile(tile)
+ * @return true if and only if the given track exists on the tile
  */
 static inline bool HasTrack(TileIndex tile, Track track)
 {
 	return HASBIT(GetTrackBits(tile), track);
 }
 
-
+/**
+ * Returns the direction the depot is facing to
+ * @param t the tile to get the depot facing from
+ * @pre IsRailDepotTile(t)
+ * @return the direction the depot is facing
+ */
 static inline DiagDirection GetRailDepotDirection(TileIndex t)
 {
 	return (DiagDirection)GB(_m[t].m5, 0, 2);
 }
 
 
+/**
+ * Returns the axis of the waypoint
+ * @param t the tile to get the waypoint axis from
+ * @pre IsRailWaypointTile(t)
+ * @return the axis of the waypoint
+ */
 static inline Axis GetWaypointAxis(TileIndex t)
 {
 	return (Axis)GB(_m[t].m5, 0, 1);
 }
 
+/**
+ * Returns the track of the waypoint
+ * @param t the tile to get the waypoint track from
+ * @pre IsRailWaypointTile(t)
+ * @return the track of the waypoint
+ */
 static inline Track GetRailWaypointTrack(TileIndex t)
 {
 	return AxisToTrack(GetWaypointAxis(t));
 }
 
+/**
+ * Returns the track bits of the waypoint
+ * @param t the tile to get the waypoint track bits from
+ * @pre IsRailWaypointTile(t)
+ * @return the track bits of the waypoint
+ */
 static inline TrackBits GetRailWaypointBits(TileIndex t)
 {
 	return TrackToTrackBits(GetRailWaypointTrack(t));
 }
 
+/**
+ * Returns waypoint index (for the waypoint pool)
+ * @param t the tile to get the waypoint index from
+ * @pre IsRailWaypointTile(t)
+ * @return the waypoint index
+ */
 static inline WaypointID GetWaypointIndex(TileIndex t)
 {
 	return (WaypointID)_m[t].m2;
 }
 
+/** Type of signal, i.e. how does the signal behave? */
 enum SignalType {
-	SIGTYPE_NORMAL  = 0, // normal signal
-	SIGTYPE_ENTRY   = 1, // presignal block entry
-	SIGTYPE_EXIT    = 2, // presignal block exit
-	SIGTYPE_COMBO   = 3  // presignal inter-block
+	SIGTYPE_NORMAL  = 0, ///< normal signal
+	SIGTYPE_ENTRY   = 1, ///< presignal block entry
+	SIGTYPE_EXIT    = 2, ///< presignal block exit
+	SIGTYPE_COMBO   = 3  ///< presignal inter-block
 };
 
-static inline SignalType GetSignalType(TileIndex t)
+static inline SignalType GetSignalType(TileIndex t, Track track)
 {
 	assert(GetRailTileType(t) == RAIL_TILE_SIGNALS);
-	return (SignalType)GB(_m[t].m2, 0, 2);
+	byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0;
+	return (SignalType)GB(_m[t].m2, pos, 2);
 }
 
-static inline void SetSignalType(TileIndex t, SignalType s)
+static inline void SetSignalType(TileIndex t, Track track, SignalType s)
 {
 	assert(GetRailTileType(t) == RAIL_TILE_SIGNALS);
-	SB(_m[t].m2, 0, 2, s);
+	byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0;
+	SB(_m[t].m2, pos, 2, s);
+	if (track == INVALID_TRACK) SB(_m[t].m2, 4, 2, s);
 }
 
-static inline bool IsPresignalEntry(TileIndex t)
+static inline bool IsPresignalEntry(TileIndex t, Track track)
 {
-	return GetSignalType(t) == SIGTYPE_ENTRY || GetSignalType(t) == SIGTYPE_COMBO;
+	return GetSignalType(t, track) == SIGTYPE_ENTRY || GetSignalType(t, track) == SIGTYPE_COMBO;
 }
 
-static inline bool IsPresignalExit(TileIndex t)
+static inline bool IsPresignalExit(TileIndex t, Track track)
 {
-	return GetSignalType(t) == SIGTYPE_EXIT || GetSignalType(t) == SIGTYPE_COMBO;
+	return GetSignalType(t, track) == SIGTYPE_EXIT || GetSignalType(t, track) == SIGTYPE_COMBO;
 }
 
 static inline void CycleSignalSide(TileIndex t, Track track)
 {
 	byte sig;
-	byte pos = 6;
-	if (track == TRACK_LOWER || track == TRACK_RIGHT) pos = 4;
+	byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 6;
 
 	sig = GB(_m[t].m3, pos, 2);
 	if (--sig == 0) sig = 3;
 	SB(_m[t].m3, pos, 2, sig);
 }
 
-
+/** Variant of the signal, i.e. how does the signal look? */
 enum SignalVariant {
-	SIG_ELECTRIC  = 0,
-	SIG_SEMAPHORE = 1
+	SIG_ELECTRIC  = 0, ///< Light signal
+	SIG_SEMAPHORE = 1  ///< Old-fashioned semaphore signal
 };
 
-static inline SignalVariant GetSignalVariant(TileIndex t)
+static inline SignalVariant GetSignalVariant(TileIndex t, Track track)
 {
-	return (SignalVariant)GB(_m[t].m2, 2, 1);
+	byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2;
+	return (SignalVariant)GB(_m[t].m2, pos, 1);
 }
 
-static inline void SetSignalVariant(TileIndex t, SignalVariant v)
+static inline void SetSignalVariant(TileIndex t, Track track, SignalVariant v)
 {
-	SB(_m[t].m2, 2, 1, v);
-}
-
-static inline bool IsSignalPresent(TileIndex t, byte signalbit)
-{
-	return HASBIT(_m[t].m3, signalbit + 4);
+	byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2;
+	SB(_m[t].m2, pos, 1, v);
+	if (track == INVALID_TRACK) SB(_m[t].m2, 6, 1, v);
 }
 
 /** These are states in which a signal can be. Currently these are only two, so
@@ -184,15 +266,71 @@
  * normal boolean evaluation, since that will make future additions easier.
  */
 enum SignalState {
-	SIGNAL_STATE_RED   = 0,
-	SIGNAL_STATE_GREEN = 1,
+	SIGNAL_STATE_RED   = 0, ///< The signal is red
+	SIGNAL_STATE_GREEN = 1, ///< The signal is green
 };
 
+/**
+ * Set the states of the signals (Along/AgainstTrackDir)
+ * @param tile  the tile to set the states for
+ * @param state the new state
+ */
+static inline void SetSignalStates(TileIndex tile, uint state)
+{
+	SB(_m[tile].m4, 4, 4, state);
+}
+
+/**
+ * Set the states of the signals (Along/AgainstTrackDir)
+ * @param tile  the tile to set the states for
+ * @param state the new state
+ */
+static inline uint GetSignalStates(TileIndex tile)
+{
+	return GB(_m[tile].m4, 4, 4);
+}
+
+/**
+ * Get the state of a single signal
+ * @param t         the tile to get the signal state for
+ * @param signalbit the signal
+ * @return the state of the signal
+ */
 static inline SignalState GetSingleSignalState(TileIndex t, byte signalbit)
 {
-	return (SignalState)HASBIT(_m[t].m2, signalbit + 4);
+	return (SignalState)HASBIT(GetSignalStates(t), signalbit);
 }
 
+/**
+ * Set whether the given signals are present (Along/AgainstTrackDir)
+ * @param tile    the tile to set the present signals for
+ * @param signals the signals that have to be present
+ */
+static inline void SetPresentSignals(TileIndex tile, uint signals)
+{
+	SB(_m[tile].m3, 4, 4, signals);
+}
+
+/**
+ * Get whether the given signals are present (Along/AgainstTrackDir)
+ * @param tile the tile to get the present signals for
+ * @return the signals that are present
+ */
+static inline uint GetPresentSignals(TileIndex tile)
+{
+	return GB(_m[tile].m3, 4, 4);
+}
+
+/**
+ * Checks whether the given signals is present
+ * @param t         the tile to check on
+ * @param signalbit the signal
+ * @return true if and only if the signal is present
+ */
+static inline bool IsSignalPresent(TileIndex t, byte signalbit)
+{
+	return HASBIT(GetPresentSignals(t), signalbit);
+}
 
 /**
  * Checks for the presence of signals (either way) on the given track on the
@@ -203,7 +341,7 @@
 	assert(IsValidTrack(track));
 	return
 		GetRailTileType(tile) == RAIL_TILE_SIGNALS &&
-		(_m[tile].m3 & SignalOnTrack(track)) != 0;
+		(GetPresentSignals(tile) & SignalOnTrack(track)) != 0;
 }
 
 /**
@@ -218,7 +356,7 @@
 	assert (IsValidTrackdir(trackdir));
 	return
 		GetRailTileType(tile) == RAIL_TILE_SIGNALS &&
-		_m[tile].m3 & SignalAlongTrackdir(trackdir);
+		GetPresentSignals(tile) & SignalAlongTrackdir(trackdir);
 }
 
 /**
@@ -231,7 +369,7 @@
 {
 	assert(IsValidTrackdir(trackdir));
 	assert(HasSignalOnTrack(tile, TrackdirToTrack(trackdir)));
-	return _m[tile].m2 & SignalAlongTrackdir(trackdir) ?
+	return GetSignalStates(tile) & SignalAlongTrackdir(trackdir) ?
 		SIGNAL_STATE_GREEN : SIGNAL_STATE_RED;
 }
 
@@ -241,21 +379,21 @@
  */
 RailType GetTileRailType(TileIndex tile);
 
-
+/** The ground 'under' the rail */
 enum RailGroundType {
-	RAIL_GROUND_BARREN       =  0,
-	RAIL_GROUND_GRASS        =  1,
-	RAIL_GROUND_FENCE_NW     =  2,
-	RAIL_GROUND_FENCE_SE     =  3,
-	RAIL_GROUND_FENCE_SENW   =  4,
-	RAIL_GROUND_FENCE_NE     =  5,
-	RAIL_GROUND_FENCE_SW     =  6,
-	RAIL_GROUND_FENCE_NESW   =  7,
-	RAIL_GROUND_FENCE_VERT1  =  8,
-	RAIL_GROUND_FENCE_VERT2  =  9,
-	RAIL_GROUND_FENCE_HORIZ1 = 10,
-	RAIL_GROUND_FENCE_HORIZ2 = 11,
-	RAIL_GROUND_ICE_DESERT   = 12,
+	RAIL_GROUND_BARREN       =  0, ///< Nothing (dirt)
+	RAIL_GROUND_GRASS        =  1, ///< Grassy
+	RAIL_GROUND_FENCE_NW     =  2, ///< Grass with a fence at the NW edge
+	RAIL_GROUND_FENCE_SE     =  3, ///< Grass with a fence at the SE edge
+	RAIL_GROUND_FENCE_SENW   =  4, ///< Grass with a fence at the NW and SE edges
+	RAIL_GROUND_FENCE_NE     =  5, ///< Grass with a fence at the NE edge
+	RAIL_GROUND_FENCE_SW     =  6, ///< Grass with a fence at the SW edge
+	RAIL_GROUND_FENCE_NESW   =  7, ///< Grass with a fence at the NE and SW edges
+	RAIL_GROUND_FENCE_VERT1  =  8, ///< Grass with a fence at the western side
+	RAIL_GROUND_FENCE_VERT2  =  9, ///< Grass with a fence at the eastern side
+	RAIL_GROUND_FENCE_HORIZ1 = 10, ///< Grass with a fence at the southern side
+	RAIL_GROUND_FENCE_HORIZ2 = 11, ///< Grass with a fence at the northern side
+	RAIL_GROUND_ICE_DESERT   = 12, ///< Icy or sandy
 };
 
 static inline void SetRailGroundType(TileIndex t, RailGroundType rgt)
--- a/src/railtypes.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/railtypes.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,12 +1,12 @@
 /* $Id$ */
 
-#ifndef RAILTYPES_H
-#define RAILTYPES_H
-
 /** @file railtypes.h
  * All the railtype-specific information is stored here.
  */
 
+#ifndef RAILTYPES_H
+#define RAILTYPES_H
+
 /** Global Railtype definition
  */
 RailtypeInfo _railtypes[] = {
--- a/src/resource.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/resource.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file resource.h */
+
 //{{NO_DEPENDENCIES}}
 // Microsoft Developer Studio generated include file.
 // Used by ttd.rc
--- a/src/road.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/road.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,74 @@
 /* $Id$ */
 
+/** @file road.h */
+
 #ifndef ROAD_H
 #define ROAD_H
 
 #include "helpers.hpp"
 
+/**
+ * The different roadtypes we support
+ * @note currently only ROADTYPE_ROAD is supported.
+ */
+enum RoadType {
+	ROADTYPE_ROAD = 0,
+	ROADTYPE_TRAM = 1,
+	ROADTYPE_HWAY = 2, ///< Only a placeholder. Not sure what we are going to do with this road type.
+	ROADTYPE_END,
+	INVALID_ROADTYPE = 0xFF
+};
+DECLARE_POSTFIX_INCREMENT(RoadType);
+
+/**
+ * The different roadtypes we support, but then a bitmask of them
+ * @note currently only ROADTYPES_ROAD is supported.
+ */
+enum RoadTypes {
+	ROADTYPES_NONE     = 0,
+	ROADTYPES_ROAD     = 1 << ROADTYPE_ROAD,
+	ROADTYPES_TRAM     = 1 << ROADTYPE_TRAM,
+	ROADTYPES_HWAY     = 1 << ROADTYPE_HWAY,
+	ROADTYPES_ROADTRAM = ROADTYPES_ROAD | ROADTYPES_TRAM,
+	ROADTYPES_ROADHWAY = ROADTYPES_ROAD | ROADTYPES_HWAY,
+	ROADTYPES_TRAMHWAY = ROADTYPES_TRAM | ROADTYPES_HWAY,
+	ROADTYPES_ALL      = ROADTYPES_ROAD | ROADTYPES_TRAM | ROADTYPES_HWAY,
+};
+DECLARE_ENUM_AS_BIT_SET(RoadTypes);
+
+/**
+ * Whether the given roadtype is valid.
+ * @param rt the roadtype to check for validness
+ * @return true if and only if valid
+ */
+static inline bool IsValidRoadType(RoadType rt)
+{
+	return rt == ROADTYPE_ROAD || rt == ROADTYPE_TRAM;
+}
+
+/**
+ * Are the given bits pointing to valid roadtypes?
+ * @param rts the roadtypes to check for validness
+ * @return true if and only if valid
+ */
+static inline bool AreValidRoadTypes(RoadTypes rts)
+{
+	return HASBIT(rts, ROADTYPE_ROAD) || HASBIT(rts, ROADTYPE_TRAM);
+}
+
+/**
+ * Maps a RoadType to the corresponding RoadTypes value
+ */
+static inline RoadTypes RoadTypeToRoadTypes(RoadType rt)
+{
+	return (RoadTypes)(1 << rt);
+}
+
+static inline RoadTypes ComplementRoadTypes(RoadTypes r)
+{
+	return (RoadTypes)(ROADTYPES_ALL ^ r);
+}
+
 enum RoadBits {
 	ROAD_NONE = 0U,
 	ROAD_NW  = 1U,
@@ -46,8 +110,11 @@
  * @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?
+ * @param rt        the road type to remove the bits from
  * @return true when it is allowed to remove the road bits
  */
-bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road);
+bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt);
+
+void DrawTramCatenary(TileInfo *ti, RoadBits tram);
 
 #endif /* ROAD_H */
--- a/src/road_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/road_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file road_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
@@ -24,6 +26,9 @@
 #include "sound.h"
 #include "yapf/yapf.h"
 #include "depot.h"
+#include "newgrf.h"
+#include "station_map.h"
+#include "tunnel_map.h"
 
 
 static uint CountRoadBits(RoadBits r)
@@ -38,37 +43,40 @@
 }
 
 
-bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road)
+bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt)
 {
 	RoadBits present;
 	RoadBits n;
 	*edge_road = true;
 
-	if (_game_mode == GM_EDITOR) return true;
+	if (_game_mode == GM_EDITOR || remove == ROAD_NONE) return true;
 
-	// Only do the special processing for actual players.
-	if (!IsValidPlayer(_current_player)) return true;
+	/* Water can always flood and towns can always remove "normal" road pieces.
+	 * Towns are not be allowed to remove non "normal" road pieces, like tram
+	 * tracks as that would result in trams that cannot turn. */
+	if (_current_player == OWNER_WATER ||
+			(rt == ROADTYPE_ROAD && !IsValidPlayer(_current_player))) return true;
 
-	// Only do the special processing if the road is owned
-	// by a town
+	/* Only do the special processing if the road is owned
+	 * by a town */
 	if (owner != OWNER_TOWN) return (owner == OWNER_NONE) || CheckOwnership(owner);
 
 	if (_cheats.magic_bulldozer.value) return true;
 
-	// Get a bitmask of which neighbouring roads has a tile
+	/* Get a bitmask of which neighbouring roads has a tile */
 	n = ROAD_NONE;
-	present = GetAnyRoadBits(tile);
-	if (present & ROAD_NE && GetAnyRoadBits(TILE_ADDXY(tile,-1, 0)) & ROAD_SW) n |= ROAD_NE;
-	if (present & ROAD_SE && GetAnyRoadBits(TILE_ADDXY(tile, 0, 1)) & ROAD_NW) n |= ROAD_SE;
-	if (present & ROAD_SW && GetAnyRoadBits(TILE_ADDXY(tile, 1, 0)) & ROAD_NE) n |= ROAD_SW;
-	if (present & ROAD_NW && GetAnyRoadBits(TILE_ADDXY(tile, 0,-1)) & ROAD_SE) n |= ROAD_NW;
+	present = GetAnyRoadBits(tile, rt);
+	if (present & ROAD_NE && GetAnyRoadBits(TILE_ADDXY(tile, -1,  0), rt) & ROAD_SW) n |= ROAD_NE;
+	if (present & ROAD_SE && GetAnyRoadBits(TILE_ADDXY(tile,  0,  1), rt) & ROAD_NW) n |= ROAD_SE;
+	if (present & ROAD_SW && GetAnyRoadBits(TILE_ADDXY(tile,  1,  0), rt) & ROAD_NE) n |= ROAD_SW;
+	if (present & ROAD_NW && GetAnyRoadBits(TILE_ADDXY(tile,  0, -1), rt) & ROAD_SE) n |= ROAD_NW;
 
-	// If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
-	// then allow it
+	/* If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
+	 * then allow it */
 	if ((n & (n - 1)) != 0 && (n & remove) != 0) {
 		Town *t;
 		*edge_road = false;
-		// you can remove all kind of roads with extra dynamite
+		/* you can remove all kind of roads with extra dynamite */
 		if (_patches.extra_dynamite) return true;
 
 		t = ClosestTownFromTile(tile, (uint)-1);
@@ -81,22 +89,23 @@
 	return true;
 }
 
-static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool *edge_road)
+static bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, bool *edge_road, RoadType rt)
 {
-	return CheckAllowRemoveRoad(tile, remove, IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile), edge_road);
+	return CheckAllowRemoveRoad(tile, remove, GetRoadOwner(tile, rt), edge_road, rt);
 }
 
 /** Delete a piece of road.
  * @param tile tile where to remove road from
+ * @param flags operation to perform
  * @param p1 bit 0..3 road pieces to remove (RoadBits)
+ *           bit 4..5 road type
  * @param p2 unused
  */
 int32 CmdRemoveRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
-	// cost for removing inner/edge -roads
+	/* cost for removing inner/edge -roads */
 	static const uint16 road_remove_cost[2] = {50, 18};
 
-	Owner owner;
 	Town *t;
 	/* true if the roadpiece was always removeable,
 	 * false if it was a center piece. Affects town ratings drop */
@@ -104,9 +113,29 @@
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	if (!IsTileType(tile, MP_STREET)) return CMD_ERROR;
+	RoadType rt = (RoadType)GB(p1, 4, 2);
+	if (!IsValidRoadType(rt)) return CMD_ERROR;
 
-	owner = IsLevelCrossingTile(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile);
+	Owner owner;
+	switch (GetTileType(tile)) {
+		case MP_STREET:
+			owner = GetRoadOwner(tile, rt);
+			break;
+
+		case MP_STATION:
+			if (!IsDriveThroughStopTile(tile)) return CMD_ERROR;
+			owner = GetTileOwner(tile);
+			break;
+
+		case MP_TUNNELBRIDGE:
+			if ((IsTunnel(tile) && GetTunnelTransportType(tile) != TRANSPORT_ROAD) ||
+					(IsBridge(tile) && GetBridgeTransportType(tile) != TRANSPORT_ROAD)) return CMD_ERROR;
+			owner = GetTileOwner(tile);
+			break;
+
+		default:
+			return CMD_ERROR;
+	}
 
 	if (owner == OWNER_TOWN && _game_mode != GM_EDITOR) {
 		t = GetTownByTile(tile);
@@ -115,18 +144,53 @@
 	}
 
 	RoadBits pieces = Extract<RoadBits, 0>(p1);
-
-	if (!CheckAllowRemoveRoad(tile, pieces, &edge_road)) return CMD_ERROR;
+	RoadTypes rts = GetRoadTypes(tile);
+	/* The tile doesn't have the given road type */
+	if (!HASBIT(rts, rt)) return CMD_ERROR;
 
-	if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+	if (!CheckAllowRemoveRoad(tile, pieces, &edge_road, rt)) return CMD_ERROR;
 
-	// check if you're allowed to remove the street owned by a town
-	// removal allowance depends on difficulty setting
+	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+
+	/* check if you're allowed to remove the street owned by a town
+	 * removal allowance depends on difficulty setting */
 	if (!CheckforTownRating(flags, t, ROAD_REMOVE)) return CMD_ERROR;
 
+	if (!IsTileType(tile, MP_STREET)) {
+		/* If it's the last roadtype, just clear the whole tile */
+		if (rts == RoadTypeToRoadTypes(rt)) return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
+
+		int32 cost;
+		if (IsTileType(tile, MP_TUNNELBRIDGE)) {
+			TileIndex other_end = IsTunnel(tile) ? GetOtherTunnelEnd(tile) : GetOtherBridgeEnd(tile);
+			/* Pay for *every* tile of the bridge or tunnel */
+			cost = (DistanceManhattan(IsTunnel(tile) ? GetOtherTunnelEnd(tile) : GetOtherBridgeEnd(tile), tile) + 1) * _price.remove_road;
+			if (flags & DC_EXEC) {
+				SetRoadTypes(other_end, GetRoadTypes(other_end) & ~RoadTypeToRoadTypes(rt));
+				SetRoadTypes(tile, GetRoadTypes(tile) & ~RoadTypeToRoadTypes(rt));
+
+				/* Mark tiles diry that have been repaved */
+				MarkTileDirtyByTile(tile);
+				MarkTileDirtyByTile(other_end);
+				if (IsBridge(tile)) {
+					TileIndexDiff delta = TileOffsByDiagDir(GetBridgeRampDirection(tile));
+
+					for (TileIndex t = tile + delta; t != other_end; t += delta) MarkTileDirtyByTile(t);
+				}
+			}
+		} else {
+			cost = _price.remove_road;
+			if (flags & DC_EXEC) {
+				SetRoadTypes(tile, GetRoadTypes(tile) & ~RoadTypeToRoadTypes(rt));
+				MarkTileDirtyByTile(tile);
+			}
+		}
+		return cost;
+	}
+
 	switch (GetRoadTileType(tile)) {
 		case ROAD_TILE_NORMAL: {
-			RoadBits present = GetRoadBits(tile);
+			RoadBits present = GetRoadBits(tile, rt);
 			RoadBits c = pieces;
 
 			if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
@@ -137,18 +201,28 @@
 				c |= (RoadBits)((c & 0x3) << 2);
 			}
 
-			// limit the bits to delete to the existing bits.
+			/* limit the bits to delete to the existing bits. */
 			c &= present;
-			if (c == 0) return CMD_ERROR;
+			if (c == ROAD_NONE) return CMD_ERROR;
 
 			if (flags & DC_EXEC) {
 				ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
 
 				present ^= c;
-				if (present == 0) {
-					DoClearSquare(tile);
+				if (present == ROAD_NONE) {
+					RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
+					if (rts == ROADTYPES_NONE) {
+						DoClearSquare(tile);
+					} else {
+						SetRoadBits(tile, ROAD_NONE, rt);
+						SetRoadTypes(tile, rts);
+					}
 				} else {
-					SetRoadBits(tile, present);
+					/* When bits are removed, you *always* end up with something that
+					 * is not a complete straight road tile. However, trams do not have
+					 * onewayness, so they cannot remove it either. */
+					if (rt != ROADTYPE_TRAM) SetDisallowedRoadDirections(tile, DRD_NONE);
+					SetRoadBits(tile, present, rt);
 					MarkTileDirtyByTile(tile);
 				}
 			}
@@ -160,10 +234,21 @@
 				return CMD_ERROR;
 			}
 
+			/* Don't allow road to be removed from the crossing when there is tram;
+			 * we can't draw the crossing without trambits ;) */
+			if (rt == ROADTYPE_ROAD && HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM)) return CMD_ERROR;
+
 			if (flags & DC_EXEC) {
-				ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
+				if (rt == ROADTYPE_ROAD) {
+					ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
+				}
 
-				MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GetRailType(tile));
+				RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
+				if (rts == ROADTYPES_NONE) {
+					MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GetRailType(tile));
+				} else {
+					SetRoadTypes(tile, rts);
+				}
 				MarkTileDirtyByTile(tile);
 				YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetTrackBits(tile)));
 			}
@@ -178,7 +263,7 @@
 
 
 static const RoadBits _valid_tileh_slopes_road[][15] = {
-	// set of normal ones
+	/* set of normal ones */
 	{
 		ROAD_ALL, ROAD_NONE, ROAD_NONE,
 		ROAD_X,   ROAD_NONE, ROAD_NONE,  // 3, 4, 5
@@ -186,7 +271,7 @@
 		ROAD_Y,   ROAD_NONE, ROAD_NONE,  // 9, 10, 11
 		ROAD_X,   ROAD_NONE, ROAD_NONE
 	},
-	// allowed road for an evenly raised platform
+	/* allowed road for an evenly raised platform */
 	{
 		ROAD_NONE,
 		ROAD_SW | ROAD_NW,
@@ -216,7 +301,7 @@
 
 	if (IsSteepSlope(tileh)) {
 		if (existing == 0) {
-			// force full pieces.
+			/* force full pieces. */
 			*pieces |= (RoadBits)((*pieces & 0xC) >> 2);
 			*pieces |= (RoadBits)((*pieces & 0x3) << 2);
 			if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
@@ -225,21 +310,21 @@
 	}
 	road_bits = *pieces | existing;
 
-	// no special foundation
+	/* no special foundation */
 	if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == 0) {
-		// force that all bits are set when we have slopes
+		/* force that all bits are set when we have slopes */
 		if (tileh != SLOPE_FLAT) *pieces |= _valid_tileh_slopes_road[0][tileh];
 		return 0; // no extra cost
 	}
 
-	// foundation is used. Whole tile is leveled up
+	/* foundation is used. Whole tile is leveled up */
 	if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == 0) {
 		return existing != 0 ? 0 : _price.terraform;
 	}
 
-	// partly leveled up tile, only if there's no road on that tile
+	/* partly leveled up tile, only if there's no road on that tile */
 	if (existing == 0 && (tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)) {
-		// force full pieces.
+		/* force full pieces. */
 		*pieces |= (RoadBits)((*pieces & 0xC) >> 2);
 		*pieces |= (RoadBits)((*pieces & 0x3) << 2);
 		if (*pieces == ROAD_X || *pieces == ROAD_Y) return _price.terraform;
@@ -249,7 +334,10 @@
 
 /** Build a piece of road.
  * @param tile tile where to build road
+ * @param flags operation to perform
  * @param p1 bit 0..3 road pieces to build (RoadBits)
+ *           bit 4..5 road type
+ *           bit 6..7 disallowed directions to toggle
  * @param p2 the town that is building the road (0 if not applicable)
  */
 int32 CmdBuildRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -257,6 +345,7 @@
 	int32 cost = 0;
 	int32 ret;
 	RoadBits existing = ROAD_NONE;
+	RoadBits all_bits = ROAD_NONE;
 	Slope tileh;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
@@ -267,26 +356,51 @@
 
 	RoadBits pieces = Extract<RoadBits, 0>(p1);
 
+	RoadType rt = (RoadType)GB(p1, 4, 2);
+	if (!IsValidRoadType(rt)) return CMD_ERROR;
+
+	DisallowedRoadDirections toggle_drd = (DisallowedRoadDirections)GB(p1, 6, 2);
+
 	tileh = GetTileSlope(tile, NULL);
 
 	switch (GetTileType(tile)) {
 		case MP_STREET:
 			switch (GetRoadTileType(tile)) {
-				case ROAD_TILE_NORMAL:
+				case ROAD_TILE_NORMAL: {
 					if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
+					if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
-					existing = GetRoadBits(tile);
+					all_bits = GetAllRoadBits(tile);
+					if (!HASBIT(GetRoadTypes(tile), rt)) break;
+
+					existing = GetRoadBits(tile, rt);
+					RoadBits merged = existing | pieces;
+					bool crossing = (merged != ROAD_X && merged != ROAD_Y);
+					if (rt != ROADTYPE_TRAM && (GetDisallowedRoadDirections(tile) != DRD_NONE || toggle_drd != DRD_NONE) && crossing) {
+						/* Junctions cannot be one-way */
+						return_cmd_error(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION);
+					}
 					if ((existing & pieces) == pieces) {
+						/* We only want to set the (dis)allowed road directions */
+						if (toggle_drd != DRD_NONE && rt != ROADTYPE_TRAM && GetRoadOwner(tile, ROADTYPE_ROAD) == _current_player) {
+							if (crossing) return_cmd_error(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION);
+
+							/* Ignore half built tiles */
+							if (flags & DC_EXEC && rt != ROADTYPE_TRAM && (existing == ROAD_X || existing == ROAD_Y)) {
+								SetDisallowedRoadDirections(tile, GetDisallowedRoadDirections(tile) ^ toggle_drd);
+								MarkTileDirtyByTile(tile);
+							}
+							return 0;
+						}
 						return_cmd_error(STR_1007_ALREADY_BUILT);
 					}
-					if (!EnsureNoVehicle(tile)) return CMD_ERROR;
-					break;
+				} break;
 
 				case ROAD_TILE_CROSSING:
-					if (pieces != GetCrossingRoadBits(tile)) { // XXX is this correct?
-						return_cmd_error(STR_1007_ALREADY_BUILT);
-					}
-					goto do_clear;
+					if (HASBIT(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+					all_bits = GetCrossingRoadBits(tile);
+					if (pieces & ComplementRoadBits(all_bits)) goto do_clear;
+					break;
 
 				default:
 				case ROAD_TILE_DEPOT:
@@ -323,16 +437,32 @@
 				default: goto do_clear;
 			}
 
-			if (!EnsureNoVehicle(tile)) return CMD_ERROR;
+			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 			if (flags & DC_EXEC) {
 				YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetTrackBits(tile)));
-				MakeRoadCrossing(tile, _current_player, GetTileOwner(tile), roaddir, GetRailType(tile), p2);
+				/* Always add road to the roadtypes (can't draw without it) */
+				MakeRoadCrossing(tile, _current_player, _current_player, _current_player, GetTileOwner(tile), roaddir, GetRailType(tile), RoadTypeToRoadTypes(rt) | ROADTYPES_ROAD, p2);
 				MarkTileDirtyByTile(tile);
 			}
-			return _price.build_road * 2;
+			return _price.build_road * (rt == ROADTYPE_ROAD ? 2 : 4);
 		}
 
+		case MP_STATION:
+			if (!IsDriveThroughStopTile(tile)) return CMD_ERROR;
+			if (HASBIT(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+			/* Don't allow "upgrading" the roadstop when vehicles are already driving on it */
+			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+			break;
+
+		case MP_TUNNELBRIDGE:
+			if ((IsTunnel(tile) && GetTunnelTransportType(tile) != TRANSPORT_ROAD) ||
+					(IsBridge(tile) && GetBridgeTransportType(tile) != TRANSPORT_ROAD)) return CMD_ERROR;
+			if (HASBIT(GetRoadTypes(tile), rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
+			/* Don't allow "upgrading" the bridge/tunnel when vehicles are already driving on it */
+			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+			break;
+
 		default:
 do_clear:;
 			ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@@ -340,26 +470,68 @@
 			cost += ret;
 	}
 
-	ret = CheckRoadSlope(tileh, &pieces, existing);
-	/* Return an error if we need to build a foundation (ret != 0) but the
-	 * current patch-setting is turned off (or stupid AI@work) */
-	if (CmdFailed(ret) || (ret != 0 && (!_patches.build_on_slopes || _is_old_ai_player)))
-		return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
-
-	cost += ret;
+	if (all_bits != pieces) {
+		/* Check the foundation/slopes when adding road/tram bits */
+		ret = CheckRoadSlope(tileh, &pieces, all_bits | existing);
+		/* Return an error if we need to build a foundation (ret != 0) but the
+		 * current patch-setting is turned off (or stupid AI@work) */
+		if (CmdFailed(ret) || (ret != 0 && (!_patches.build_on_slopes || _is_old_ai_player))) {
+			return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
+		}
+		cost += ret;
+	}
 
 	if (IsTileType(tile, MP_STREET)) {
-		// Don't put the pieces that already exist
+		/* Don't put the pieces that already exist */
 		pieces &= ComplementRoadBits(existing);
 	}
 
 	cost += CountRoadBits(pieces) * _price.build_road;
+	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
+		/* Pay for *every* tile of the bridge or tunnel */
+		cost *= DistanceManhattan(IsTunnel(tile) ? GetOtherTunnelEnd(tile) : GetOtherBridgeEnd(tile), tile);
+	}
 
 	if (flags & DC_EXEC) {
-		if (IsTileType(tile, MP_STREET)) {
-			SetRoadBits(tile, existing | pieces);
-		} else {
-			MakeRoadNormal(tile, _current_player, pieces, p2);
+		switch (GetTileType(tile)) {
+			case MP_STREET: {
+				RoadTileType rtt = GetRoadTileType(tile);
+				if (existing == ROAD_NONE || rtt == ROAD_TILE_CROSSING) {
+					SetRoadTypes(tile, GetRoadTypes(tile) | RoadTypeToRoadTypes(rt));
+					SetRoadOwner(tile, rt, _current_player);
+				}
+				if (rtt != ROAD_TILE_CROSSING) SetRoadBits(tile, existing | pieces, rt);
+			} break;
+
+			case MP_TUNNELBRIDGE: {
+				TileIndex other_end = IsTunnel(tile) ? GetOtherTunnelEnd(tile) : GetOtherBridgeEnd(tile);
+
+				SetRoadTypes(other_end, GetRoadTypes(other_end) | RoadTypeToRoadTypes(rt));
+				SetRoadTypes(tile, GetRoadTypes(tile) | RoadTypeToRoadTypes(rt));
+
+				/* Mark tiles diry that have been repaved */
+				MarkTileDirtyByTile(other_end);
+				MarkTileDirtyByTile(tile);
+				if (IsBridge(tile)) {
+					TileIndexDiff delta = TileOffsByDiagDir(GetBridgeRampDirection(tile));
+
+					for (TileIndex t = tile + delta; t != other_end; t += delta) MarkTileDirtyByTile(t);
+				}
+			} break;
+
+			case MP_STATION:
+				SetRoadTypes(tile, GetRoadTypes(tile) | RoadTypeToRoadTypes(rt));
+				break;
+
+			default:
+				MakeRoadNormal(tile, pieces, RoadTypeToRoadTypes(rt), p2, _current_player, _current_player, _current_player);
+				break;
+		}
+
+		if (rt != ROADTYPE_TRAM && IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
+			existing |= pieces;
+			SetDisallowedRoadDirections(tile, (existing == ROAD_X || existing == ROAD_Y) ?
+					GetDisallowedRoadDirections(tile) ^ toggle_drd : DRD_NONE);
 		}
 
 		MarkTileDirtyByTile(tile);
@@ -377,15 +549,15 @@
  */
 int32 DoConvertStreetRail(TileIndex tile, RailType totype, bool exec)
 {
-	// not a railroad crossing?
+	/* not a railroad crossing? */
 	if (!IsLevelCrossing(tile)) return CMD_ERROR;
 
-	// not owned by me?
-	if (!CheckTileOwnership(tile) || !EnsureNoVehicle(tile)) return CMD_ERROR;
+	/* not owned by me? */
+	if (!CheckTileOwnership(tile) || !EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
 
 	if (GetRailType(tile) == totype) return CMD_ERROR;
 
-	// 'hidden' elrails can't be downgraded to normal rail when elrails are disabled
+	/* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
 	if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
 
 	if (exec) {
@@ -400,22 +572,30 @@
 
 /** Build a long piece of road.
  * @param end_tile end tile of drag
+ * @param flags operation to perform
  * @param p1 start tile of drag
  * @param p2 various bitstuffed elements
  * - p2 = (bit 0) - start tile starts in the 2nd half of tile (p2 & 1)
  * - p2 = (bit 1) - end tile starts in the 2nd half of tile (p2 & 2)
  * - p2 = (bit 2) - direction: 0 = along x-axis, 1 = along y-axis (p2 & 4)
+ * - p2 = (bit 3 + 4) - road type
+ * - p2 = (bit 5) - set road direction
  */
 int32 CmdBuildLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	TileIndex start_tile, tile;
 	int32 cost, ret;
+	bool had_bridge = false;
+	bool had_success = false;
+	DisallowedRoadDirections drd = DRD_NORTHBOUND;
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	if (p1 >= MapSize()) return CMD_ERROR;
 
 	start_tile = p1;
+	RoadType rt = (RoadType)GB(p2, 3, 2);
+	if (!IsValidRoadType(rt)) return CMD_ERROR;
 
 	/* Only drag in X or Y direction dictated by the direction variable */
 	if (!HASBIT(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
@@ -426,24 +606,41 @@
 		TileIndex t = start_tile;
 		start_tile = end_tile;
 		end_tile = t;
-		p2 ^= IS_INT_INSIDE(p2&3, 1, 3) ? 3 : 0;
+		p2 ^= IS_INT_INSIDE(p2 & 3, 1, 3) ? 3 : 0;
+		drd = DRD_SOUTHBOUND;
 	}
 
+	/* On the X-axis, we have to swap the initial bits, so they
+	 * will be interpreted correctly in the GTTS. Futhermore
+	 * when you just 'click' on one tile to build them. */
+	if (HASBIT(p2, 2) == (start_tile == end_tile)) drd ^= DRD_BOTH;
+	/* No disallowed direction bits have to be toggled */
+	if (!HASBIT(p2, 5)) drd = DRD_NONE;
+
 	cost = 0;
 	tile = start_tile;
-	// Start tile is the small number.
+	/* Start tile is the small number. */
 	for (;;) {
 		RoadBits bits = HASBIT(p2, 2) ? ROAD_Y : ROAD_X;
 
 		if (tile == end_tile && !HASBIT(p2, 1)) bits &= ROAD_NW | ROAD_NE;
 		if (tile == start_tile && HASBIT(p2, 0)) bits &= ROAD_SE | ROAD_SW;
 
-		ret = DoCommand(tile, bits, 0, flags, CMD_BUILD_ROAD);
+		ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD);
 		if (CmdFailed(ret)) {
 			if (_error_message != STR_1007_ALREADY_BUILT) return CMD_ERROR;
 			_error_message = INVALID_STRING_ID;
 		} else {
-			cost += ret;
+			had_success = true;
+			/* Only pay for the upgrade on one side of the bridge */
+			if (IsBridgeTile(tile)) {
+				if ((!had_bridge || GetBridgeRampDirection(tile) == DIAGDIR_SE || GetBridgeRampDirection(tile) == DIAGDIR_SW)) {
+					cost += ret;
+				}
+				had_bridge = true;
+			} else {
+				cost += ret;
+			}
 		}
 
 		if (tile == end_tile) break;
@@ -451,16 +648,18 @@
 		tile += HASBIT(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
 	}
 
-	return (cost == 0) ? CMD_ERROR : cost;
+	return !had_success ? CMD_ERROR : cost;
 }
 
 /** Remove a long piece of road.
  * @param end_tile end tile of drag
+ * @param flags operation to perform
  * @param p1 start tile of drag
  * @param p2 various bitstuffed elements
  * - p2 = (bit 0) - start tile starts in the 2nd half of tile (p2 & 1)
  * - p2 = (bit 1) - end tile starts in the 2nd half of tile (p2 & 2)
  * - p2 = (bit 2) - direction: 0 = along x-axis, 1 = along y-axis (p2 & 4)
+ * - p2 = (bit 3 + 4) - road type
  */
 int32 CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -472,6 +671,8 @@
 	if (p1 >= MapSize()) return CMD_ERROR;
 
 	start_tile = p1;
+	RoadType rt = (RoadType)GB(p2, 3, 2);
+	if (!IsValidRoadType(rt)) return CMD_ERROR;
 
 	/* Only drag in X or Y direction dictated by the direction variable */
 	if (!HASBIT(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
@@ -487,16 +688,16 @@
 
 	cost = 0;
 	tile = start_tile;
-	// Start tile is the small number.
+	/* Start tile is the small number. */
 	for (;;) {
 		RoadBits bits = HASBIT(p2, 2) ? ROAD_Y : ROAD_X;
 
 		if (tile == end_tile && !HASBIT(p2, 1)) bits &= ROAD_NW | ROAD_NE;
 		if (tile == start_tile && HASBIT(p2, 0)) bits &= ROAD_SE | ROAD_SW;
 
-		// try to remove the halves.
+		/* try to remove the halves. */
 		if (bits != 0) {
-			ret = DoCommand(tile, bits, 0, flags, CMD_REMOVE_ROAD);
+			ret = DoCommand(tile, rt << 4 | bits, 0, flags, CMD_REMOVE_ROAD);
 			if (!CmdFailed(ret)) cost += ret;
 		}
 
@@ -510,7 +711,9 @@
 
 /** Build a road depot.
  * @param tile tile where to build the depot
+ * @param flags operation to perform
  * @param p1 bit 0..1 entrance direction (DiagDirection)
+ *           bit 2..3 road type
  * @param p2 unused
  *
  * @todo When checking for the tile slope,
@@ -525,6 +728,9 @@
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
 	DiagDirection dir = Extract<DiagDirection, 0>(p1);
+	RoadType rt = (RoadType)GB(p1, 2, 2);
+
+	if (!IsValidRoadType(rt)) return CMD_ERROR;
 
 	tileh = GetTileSlope(tile, NULL);
 	if (tileh != SLOPE_FLAT && (
@@ -547,7 +753,7 @@
 		dep->xy = tile;
 		dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
 
-		MakeRoadDepot(tile, _current_player, dir);
+		MakeRoadDepot(tile, _current_player, dir, rt);
 		MarkTileDirtyByTile(tile);
 	}
 	return cost + _price.build_road_depot;
@@ -569,7 +775,7 @@
 {
 	switch (GetRoadTileType(tile)) {
 		case ROAD_TILE_NORMAL: {
-			RoadBits b = GetRoadBits(tile);
+			RoadBits b = GetAllRoadBits(tile);
 
 #define M(x) (1 << (x))
 			/* Clear the road if only one piece is on the tile OR the AI tries
@@ -578,7 +784,16 @@
 			    ((flags & DC_AI_BUILDING) && IsTileOwner(tile, OWNER_TOWN)) ||
 			    !(flags & DC_AUTO)
 				) {
-				return DoCommand(tile, b, 0, flags, CMD_REMOVE_ROAD);
+				RoadTypes rts = GetRoadTypes(tile);
+				int32 ret = 0;
+				for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
+					if (HASBIT(rts, rt)) {
+						int32 tmp_ret = DoCommand(tile, rt << 4 | GetRoadBits(tile, rt), 0, flags, CMD_REMOVE_ROAD);
+						if (CmdFailed(tmp_ret)) return tmp_ret;
+						ret += tmp_ret;
+					}
+				}
+				return ret;
 			}
 			return_cmd_error(STR_1801_MUST_REMOVE_ROAD_FIRST);
 		}
@@ -621,13 +836,13 @@
 {
 	uint i;
 
-	// normal level sloped building
+	/* normal level sloped building */
 	if (!IsSteepSlope(tileh) &&
 			(~_valid_tileh_slopes_road[1][tileh] & bits) == 0) {
 		return tileh;
 	}
 
-	// inclined sloped building
+	/* inclined sloped building */
 	switch (bits) {
 		case ROAD_X: i = 0; break;
 		case ROAD_Y: i = 1; break;
@@ -655,33 +870,104 @@
 };
 
 /**
+ * Whether to draw unpaved roads regardless of the town zone.
+ * By default, OpenTTD always draws roads as unpaved if they are on a desert
+ * tile or above the snowline. Newgrf files, however, can set a bit that allows
+ * paved roads to be built on desert tiles as they would be on grassy tiles.
+ *
+ * @param tile The tile the road is on
+ * @param roadside What sort of road this is
+ * @return True if the road should be drawn unpaved regardless of the roadside.
+ */
+static bool AlwaysDrawUnpavedRoads(TileIndex tile, Roadside roadside)
+{
+	return (IsOnSnow(tile) &&
+			!(_opt.landscape == LT_TROPIC && HasGrfMiscBit(GMB_DESERT_PAVED_ROADS) &&
+				roadside != ROADSIDE_BARREN && roadside != ROADSIDE_GRASS && roadside != ROADSIDE_GRASS_ROAD_WORKS));
+}
+
+/**
+ * Draws the catenary for the given tile
+ * @param ti   information about the tile (slopes, height etc)
+ * @param tram the roadbits for the tram
+ */
+void DrawTramCatenary(TileInfo *ti, RoadBits tram)
+{
+	/* Don't draw the catenary under a low bridge */
+	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !HASBIT(_transparent_opt, TO_BUILDINGS)) {
+		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
+
+		if (height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) return;
+	}
+
+	SpriteID front;
+	SpriteID back;
+
+	if (ti->tileh != SLOPE_FLAT) {
+		back  = SPR_TRAMWAY_BACK_WIRES_SLOPED  + _road_sloped_sprites[ti->tileh - 1];
+		front = SPR_TRAMWAY_FRONT_WIRES_SLOPED + _road_sloped_sprites[ti->tileh - 1];
+	} else {
+		back  = SPR_TRAMWAY_BASE + _road_backpole_sprites_1[tram];
+		front = SPR_TRAMWAY_BASE + _road_frontwire_sprites_1[tram];
+	}
+
+	SpriteID pal = PAL_NONE;
+	if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
+		SETBIT(front, PALETTE_MODIFIER_TRANSPARENT);
+		SETBIT(back,  PALETTE_MODIFIER_TRANSPARENT);
+		pal = PALETTE_TO_TRANSPARENT;
+	}
+
+	AddSortableSpriteToDraw(back,  pal, ti->x, ti->y, 16, 16, 0x1F, ti->z);
+	AddSortableSpriteToDraw(front, pal, ti->x, ti->y, 16, 16, 0x1F, ti->z);
+}
+
+/**
+ * Draws details on/around the road
+ * @param img the sprite to draw
+ * @param ti  the tile to draw on
+ * @param dx  the offset from the top of the BB of the tile
+ * @param dy  the offset from the top of the BB of the tile
+ * @param h   the height of the sprite to draw
+ */
+static void DrawRoadDetail(SpriteID img, TileInfo *ti, int dx, int dy, int h)
+{
+	int x = ti->x | dx;
+	int y = ti->y | dy;
+	byte z = ti->z;
+	if (ti->tileh != SLOPE_FLAT) z = GetSlopeZ(x, y);
+	AddSortableSpriteToDraw(img, PAL_NONE, x, y, 2, 2, h, z);
+}
+
+/**
  * Draw ground sprite and road pieces
  * @param ti TileInfo
- * @param road RoadBits to draw
  */
 static void DrawRoadBits(TileInfo* ti)
 {
-	RoadBits road = GetRoadBits(ti->tile);
+	RoadBits road = GetRoadBits(ti->tile, ROADTYPE_ROAD);
+	RoadBits tram = GetRoadBits(ti->tile, ROADTYPE_TRAM);
+
 	const DrawRoadTileStruct *drts;
 	SpriteID image = 0;
 	SpriteID pal = PAL_NONE;
 	Roadside roadside;
 
 	if (ti->tileh != SLOPE_FLAT) {
-		int foundation = GetRoadFoundation(ti->tileh, road);
+		int foundation = GetRoadFoundation(ti->tileh, road | tram);
 
 		if (foundation != 0) DrawFoundation(ti, foundation);
 
-		// DrawFoundation() modifies ti.
-		// Default sloped sprites..
+		/* DrawFoundation() modifies ti.
+		 * Default sloped sprites.. */
 		if (ti->tileh != SLOPE_FLAT) image = _road_sloped_sprites[ti->tileh - 1] + 0x53F;
 	}
 
-	if (image == 0) image = _road_tile_sprites_1[road];
+	if (image == 0) image = _road_tile_sprites_1[road != ROAD_NONE ? road : tram];
 
 	roadside = GetRoadside(ti->tile);
 
-	if (IsOnSnow(ti->tile)) {
+	if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) {
 		image += 19;
 	} else {
 		switch (roadside) {
@@ -694,22 +980,40 @@
 
 	DrawGroundSprite(image, pal);
 
+	if (road != ROAD_NONE) {
+		DisallowedRoadDirections drd = GetDisallowedRoadDirections(ti->tile);
+		if (drd != DRD_NONE) {
+			DrawRoadDetail(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), ti, 8, 8, 0);
+		}
+	}
+
+	/* For tram we overlay the road graphics with either tram tracks only
+	 * (when there is actual road beneath the trams) or with tram tracks
+	 * and some dirts which hides the road graphics */
+	if (tram != ROAD_NONE) {
+		if (ti->tileh != SLOPE_FLAT) {
+			image = _road_sloped_sprites[ti->tileh - 1] + SPR_TRAMWAY_SLOPED_OFFSET;
+		} else {
+			image = _road_tile_sprites_1[tram] - SPR_ROAD_Y;
+		}
+		image += (road == ROAD_NONE) ? SPR_TRAMWAY_TRAM : SPR_TRAMWAY_OVERLAY;
+		DrawGroundSprite(image, pal);
+	}
+
 	if (HasRoadWorks(ti->tile)) {
-		// Road works
-		DrawGroundSprite(road & ROAD_X ? SPR_EXCAVATION_X : SPR_EXCAVATION_Y, PAL_NONE);
+		/* Road works */
+		DrawGroundSprite((road | tram) & ROAD_X ? SPR_EXCAVATION_X : SPR_EXCAVATION_Y, PAL_NONE);
 		return;
 	}
 
-	// Return if full detail is disabled, or we are zoomed fully out.
-	if (!(_display_opt & DO_FULL_DETAIL) || _cur_dpi->zoom == 2) return;
+	if (tram != ROAD_NONE) DrawTramCatenary(ti, tram);
 
-	// Draw extra details.
+	/* Return if full detail is disabled, or we are zoomed fully out. */
+	if (!HASBIT(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZOOM_LVL_DETAIL) return;
+
+	/* Draw extra details. */
 	for (drts = _road_display_table[roadside][road]; drts->image != 0; drts++) {
-		int x = ti->x | drts->subcoord_x;
-		int y = ti->y | drts->subcoord_y;
-		byte z = ti->z;
-		if (ti->tileh != SLOPE_FLAT) z = GetSlopeZ(x, y);
-		AddSortableSpriteToDraw(drts->image, PAL_NONE, x, y, 2, 2, 0x10, z);
+		DrawRoadDetail(drts->image, ti, drts->subcoord_x, drts->subcoord_y, 0x10);
 	}
 }
 
@@ -723,6 +1027,7 @@
 		case ROAD_TILE_CROSSING: {
 			SpriteID image;
 			SpriteID pal = PAL_NONE;
+			Roadside roadside = GetRoadside(ti->tile);
 
 			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh);
 
@@ -731,10 +1036,10 @@
 			if (GetCrossingRoadAxis(ti->tile) == AXIS_X) image++;
 			if (IsCrossingBarred(ti->tile)) image += 2;
 
-			if (IsOnSnow(ti->tile)) {
+			if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) {
 				image += 8;
 			} else {
-				switch (GetRoadside(ti->tile)) {
+				switch (roadside) {
 					case ROADSIDE_BARREN: pal = PALETTE_TO_BARE_LAND; break;
 					case ROADSIDE_GRASS:  break;
 					default:              image += 4; break; // Paved
@@ -742,6 +1047,10 @@
 			}
 
 			DrawGroundSprite(image, pal);
+			if (HASBIT(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
+				DrawGroundSprite(SPR_TRAMWAY_OVERLAY + (GetCrossingRoadAxis(ti->tile) ^ 1), pal);
+				DrawTramCatenary(ti, GetCrossingRoadBits(ti->tile));
+			}
 			if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
 			break;
 		}
@@ -756,14 +1065,19 @@
 
 			palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
 
-			dts =  &_road_depot[GetRoadDepotDirection(ti->tile)];
+			if (HASBIT(GetRoadTypes(ti->tile), ROADTYPE_TRAM)) {
+				dts =  &_tram_depot[GetRoadDepotDirection(ti->tile)];
+			} else {
+				dts =  &_road_depot[GetRoadDepotDirection(ti->tile)];
+			}
+
 			DrawGroundSprite(dts->ground_sprite, PAL_NONE);
 
 			for (dtss = dts->seq; dtss->image != 0; dtss++) {
 				SpriteID image = dtss->image;
 				SpriteID pal;
 
-				if (_display_opt & DO_TRANS_BUILDINGS) {
+				if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
 					SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 					pal = PALETTE_TO_TRANSPARENT;
 				} else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
@@ -785,10 +1099,10 @@
 	DrawBridgeMiddle(ti);
 }
 
-void DrawRoadDepotSprite(int x, int y, DiagDirection dir)
+void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt)
 {
 	SpriteID palette = PLAYER_SPRITE_COLOR(_local_player);
-	const DrawTileSprites* dts =  &_road_depot[dir];
+	const DrawTileSprites* dts = (rt == ROADTYPE_TRAM) ? &_tram_depot[dir] : &_road_depot[dir];
 	const DrawTileSeqStruct* dtss;
 
 	x += 33;
@@ -811,7 +1125,7 @@
 
 	if (tileh == SLOPE_FLAT) return z;
 	if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
-		uint f = GetRoadFoundation(tileh, GetRoadBits(tile));
+		uint f = GetRoadFoundation(tileh, GetAllRoadBits(tile));
 
 		if (f != 0) {
 			if (IsSteepSlope(tileh)) {
@@ -831,7 +1145,7 @@
 {
 	if (tileh == SLOPE_FLAT) return SLOPE_FLAT;
 	if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
-		uint f = GetRoadFoundation(tileh, GetRoadBits(tile));
+		uint f = GetRoadFoundation(tileh, GetAllRoadBits(tile));
 
 		if (f == 0) return tileh;
 		if (f < 15) return SLOPE_FLAT; // leveled foundation
@@ -896,11 +1210,11 @@
 		if (t != NULL) {
 			grp = GetTownRadiusGroup(t, tile);
 
-			// Show an animation to indicate road work
+			/* Show an animation to indicate road work */
 			if (t->road_build_months != 0 &&
 					(DistanceManhattan(t->xy, tile) < 8 || grp != 0) &&
-					GetRoadTileType(tile) == ROAD_TILE_NORMAL && (GetRoadBits(tile) == ROAD_X || GetRoadBits(tile) == ROAD_Y)) {
-				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicle(tile) && CHANCE16(1, 20)) {
+					GetRoadTileType(tile) == ROAD_TILE_NORMAL && (GetAllRoadBits(tile) == ROAD_X || GetAllRoadBits(tile) == ROAD_Y)) {
+				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && CHANCE16(1, 20)) {
 					StartRoadWorks(tile);
 
 					SndPlayTileFx(SND_21_JACKHAMMER, tile);
@@ -951,17 +1265,23 @@
 	0x0, 0x0, 0x0, 0x10, 0x0, 0x2, 0x8, 0x1A, 0x0, 0x4, 0x1, 0x15, 0x20, 0x26, 0x29, 0x3F,
 };
 
-static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode)
 {
+
 	switch (mode) {
 		case TRANSPORT_RAIL:
 			if (!IsLevelCrossing(tile)) return 0;
 			return GetCrossingRailBits(tile) * 0x101;
 
 		case TRANSPORT_ROAD:
+			if ((GetRoadTypes(tile) & sub_mode) == 0) return 0;
 			switch (GetRoadTileType(tile)) {
-				case ROAD_TILE_NORMAL:
-					return HasRoadWorks(tile) ? 0 : _road_trackbits[GetRoadBits(tile)] * 0x101;
+				case ROAD_TILE_NORMAL: {
+					RoadType rt = (RoadType)FindFirstBit(sub_mode);
+					const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 };
+					uint multiplier = drd_to_multiplier[rt == ROADTYPE_TRAM ? DRD_NONE : GetDisallowedRoadDirections(tile)];
+					return HasRoadWorks(tile) ? 0 : _road_trackbits[GetRoadBits(tile, rt)] * multiplier;
+				}
 
 				case ROAD_TILE_CROSSING: {
 					uint32 r = AxisToTrackBits(GetCrossingRoadAxis(tile)) * 0x101;
@@ -1002,8 +1322,12 @@
 	}
 }
 
-static const byte _roadveh_enter_depot_unk0[4] = {
-	8, 9, 0, 1
+/**
+ * Given the direction the road depot is pointing, this is the direction the
+ * vehicle should be travelling in in order to enter the depot.
+ */
+static const byte _roadveh_enter_depot_dir[4] = {
+	TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_X_NE, TRACKDIR_Y_SE
 };
 
 static uint32 VehicleEnter_Road(Vehicle *v, TileIndex tile, int x, int y)
@@ -1021,7 +1345,7 @@
 		case ROAD_TILE_DEPOT:
 			if (v->type == VEH_ROAD &&
 					v->u.road.frame == 11 &&
-					_roadveh_enter_depot_unk0[GetRoadDepotDirection(tile)] == v->u.road.state) {
+					_roadveh_enter_depot_dir[GetRoadDepotDirection(tile)] == v->u.road.state) {
 				VehicleEnterDepot(v);
 				return VETSB_ENTERED_WORMHOLE;
 			}
@@ -1035,28 +1359,32 @@
 
 static void ChangeTileOwner_Road(TileIndex tile, PlayerID old_player, PlayerID new_player)
 {
-	if (IsLevelCrossing(tile) && GetCrossingRoadOwner(tile) == old_player) {
-		SetCrossingRoadOwner(tile, new_player == PLAYER_SPECTATOR ? OWNER_NONE : new_player);
+	if (GetRoadTileType(tile) == ROAD_TILE_DEPOT) {
+		if (GetTileOwner(tile) == old_player) {
+			if (new_player == PLAYER_SPECTATOR) {
+				DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+			} else {
+				SetTileOwner(tile, new_player);
+			}
+		}
+		return;
 	}
 
-	if (!IsTileOwner(tile, old_player)) return;
+	for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
+		if (!HASBIT(GetRoadTypes(tile), rt)) continue;
 
-	if (new_player != PLAYER_SPECTATOR) {
-		SetTileOwner(tile, new_player);
-	} else {
-		switch (GetRoadTileType(tile)) {
-			case ROAD_TILE_NORMAL:
-				SetTileOwner(tile, OWNER_NONE);
-				break;
+		if (GetRoadOwner(tile, rt) == old_player) {
+			SetRoadOwner(tile, rt, new_player == PLAYER_SPECTATOR ? OWNER_NONE : new_player);
+		}
+	}
 
-			case ROAD_TILE_CROSSING:
-				MakeRoadNormal(tile, GetCrossingRoadOwner(tile), GetCrossingRoadBits(tile), GetTownIndex(tile));
-				break;
-
-			default:
-			case ROAD_TILE_DEPOT:
-				DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
-				break;
+	if (IsLevelCrossing(tile)) {
+		if (GetTileOwner(tile) == old_player) {
+			if (new_player == PLAYER_SPECTATOR) {
+				MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY));
+			} else {
+				SetTileOwner(tile, new_player);
+			}
 		}
 	}
 }
--- a/src/road_cmd.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/road_cmd.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,12 @@
 /* $Id$ */
 
+/** @file road_cmd.h */
+
 #ifndef ROAD_CMD_H
 #define ROAD_CMD_H
 
 #include "direction.h"
 
-void DrawRoadDepotSprite(int x, int y, DiagDirection dir);
+void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt);
 
 #endif /* ROAD_CMD_H */
--- a/src/road_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/road_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,9 +1,9 @@
 /* $Id$ */
 
+/** @file road_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
-#include "road_cmd.h"
-#include "road_map.h"
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "functions.h"
@@ -16,19 +16,23 @@
 #include "sound.h"
 #include "command.h"
 #include "variables.h"
+#include "road.h"
+#include "road_cmd.h"
+#include "road_map.h"
 #include "station_map.h"
 //needed for catchments
 #include "station.h"
 
 
-static void ShowBusStationPicker();
-static void ShowTruckStationPicker();
+static void ShowRVStationPicker(RoadStop::Type rs);
 static void ShowRoadDepotPicker();
 
 static bool _remove_button_clicked;
 
 static byte _place_road_flag;
 
+static RoadType _cur_roadtype;
+
 static DiagDirection _road_depot_orientation;
 static DiagDirection _road_station_picker_orientation;
 
@@ -40,18 +44,18 @@
 static void PlaceRoad_NE(TileIndex tile)
 {
 	_place_road_flag = (_tile_fract_coords.y >= 8) + 4;
-	VpStartPlaceSizing(tile, VPM_FIX_X);
+	VpStartPlaceSizing(tile, VPM_FIX_X, DDSP_PLACE_ROAD_NE);
 }
 
 static void PlaceRoad_NW(TileIndex tile)
 {
 	_place_road_flag = (_tile_fract_coords.x >= 8) + 0;
-	VpStartPlaceSizing(tile, VPM_FIX_Y);
+	VpStartPlaceSizing(tile, VPM_FIX_Y, DDSP_PLACE_ROAD_NW);
 }
 
 static void PlaceRoad_Bridge(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_OR_Y);
+	VpStartPlaceSizing(tile, VPM_X_OR_Y, DDSP_BUILD_BRIDGE);
 }
 
 
@@ -65,9 +69,52 @@
 	}
 }
 
+/** Structure holding information per roadtype for several functions */
+struct RoadTypeInfo {
+	StringID err_build_road;        ///< Building a normal piece of road
+	StringID err_remove_road;       ///< Removing a normal piece of road
+	StringID err_depot;             ///< Building a depot
+	StringID err_build_station[2];  ///< Building a bus or truck station
+	StringID err_remove_station[2]; ///< Removing of a bus or truck station
+
+	StringID picker_title[2];       ///< Title for the station picker for bus or truck stations
+	StringID picker_tooltip[2];     ///< Tooltip for the station picker for bus or truck stations
+
+	SpriteID cursor_nesw;           ///< Cursor for building NE and SW bits
+	SpriteID cursor_nwse;           ///< Cursor for building NW and SE bits
+};
+
+/** What errors/cursors must be shown for several types of roads */
+static const RoadTypeInfo _road_type_infos[] = {
+	{
+		STR_1804_CAN_T_BUILD_ROAD_HERE,
+		STR_1805_CAN_T_REMOVE_ROAD_FROM,
+		STR_1807_CAN_T_BUILD_ROAD_VEHICLE,
+		{ STR_1808_CAN_T_BUILD_BUS_STATION,        STR_1809_CAN_T_BUILD_TRUCK_STATION },
+		{ STR_CAN_T_REMOVE_BUS_STATION,            STR_CAN_T_REMOVE_TRUCK_STATION     },
+		{ STR_3042_BUS_STATION_ORIENTATION,        STR_3043_TRUCK_STATION_ORIENT      },
+		{ STR_3051_SELECT_BUS_STATION_ORIENTATION, STR_3052_SELECT_TRUCK_LOADING_BAY  },
+
+		SPR_CURSOR_ROAD_NESW,
+		SPR_CURSOR_ROAD_NWSE,
+	},
+	{
+		STR_1804_CAN_T_BUILD_TRAMWAY_HERE,
+		STR_1805_CAN_T_REMOVE_TRAMWAY_FROM,
+		STR_1807_CAN_T_BUILD_TRAM_VEHICLE,
+		{ STR_1808_CAN_T_BUILD_PASSENGER_TRAM_STATION,        STR_1809_CAN_T_BUILD_CARGO_TRAM_STATION        },
+		{ STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION,            STR_CAN_T_REMOVE_CARGO_TRAM_STATION            },
+		{ STR_3042_PASSENGER_TRAM_STATION_ORIENTATION,        STR_3043_CARGO_TRAM_STATION_ORIENT             },
+		{ STR_3051_SELECT_PASSENGER_TRAM_STATION_ORIENTATION, STR_3052_SELECT_CARGO_TRAM_STATION_ORIENTATION },
+
+		SPR_CURSOR_TRAMWAY_NESW,
+		SPR_CURSOR_TRAMWAY_NWSE,
+	},
+};
+
 static void PlaceRoad_Tunnel(TileIndex tile)
 {
-	DoCommandP(tile, 0x200, 0, CcBuildRoadTunnel, CMD_BUILD_TUNNEL | CMD_AUTO | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
+	DoCommandP(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 0, CcBuildRoadTunnel, CMD_BUILD_TUNNEL | CMD_AUTO | CMD_MSG(STR_5016_CAN_T_BUILD_TUNNEL_HERE));
 }
 
 static void BuildRoadOutsideStation(TileIndex tile, DiagDirection direction)
@@ -75,24 +122,27 @@
 	tile += TileOffsByDiagDir(direction);
 	// if there is a roadpiece just outside of the station entrance, build a connecting route
 	if (IsTileType(tile, MP_STREET) && GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
-		DoCommandP(tile, DiagDirToRoadBits(ReverseDiagDir(direction)), 0, NULL, CMD_BUILD_ROAD);
+		if (GetRoadBits(tile, _cur_roadtype) != ROAD_NONE) {
+			DoCommandP(tile, _cur_roadtype << 4 | DiagDirToRoadBits(ReverseDiagDir(direction)), 0, NULL, CMD_BUILD_ROAD);
+		}
 	}
 }
 
 void CcRoadDepot(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
 	if (success) {
+		DiagDirection dir = (DiagDirection)GB(p1, 0, 2);
 		SndPlayTileFx(SND_1F_SPLAT, tile);
 		ResetObjectToPlace();
-		BuildRoadOutsideStation(tile, (DiagDirection)p1);
+		BuildRoadOutsideStation(tile, dir);
 		/* For a drive-through road stop build connecting road for other entrance */
-		if (HASBIT(p2, 1)) BuildRoadOutsideStation(tile, ReverseDiagDir((DiagDirection)p1));
+		if (HASBIT(p2, 1)) BuildRoadOutsideStation(tile, ReverseDiagDir(dir));
 	}
 }
 
 static void PlaceRoad_Depot(TileIndex tile)
 {
-	DoCommandP(tile, _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1807_CAN_T_BUILD_ROAD_VEHICLE));
+	DoCommandP(tile, _cur_roadtype << 2 | _road_depot_orientation, 0, CcRoadDepot, CMD_BUILD_ROAD_DEPOT | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_depot));
 }
 
 static void PlaceRoadStop(TileIndex tile, uint32 p2, uint32 cmd)
@@ -109,24 +159,24 @@
 static void PlaceRoad_BusStation(TileIndex tile)
 {
 	if (_remove_button_clicked) {
-		DoCommandP(tile, 0, RoadStop::BUS, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(STR_CAN_T_REMOVE_BUS_STATION));
+		DoCommandP(tile, 0, RoadStop::BUS, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_station[RoadStop::BUS]));
 	} else {
-		PlaceRoadStop(tile, RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1808_CAN_T_BUILD_BUS_STATION));
+		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::BUS, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::BUS]));
 	}
 }
 
 static void PlaceRoad_TruckStation(TileIndex tile)
 {
 	if (_remove_button_clicked) {
-		DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(STR_CAN_T_REMOVE_TRUCK_STATION));
+		DoCommandP(tile, 0, RoadStop::TRUCK, CcPlaySound1D, CMD_REMOVE_ROAD_STOP | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK]));
 	} else {
-		PlaceRoadStop(tile, RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1809_CAN_T_BUILD_TRUCK_STATION));
+		PlaceRoadStop(tile, (_ctrl_pressed << 5) | RoadTypeToRoadTypes(_cur_roadtype) << 2 | RoadStop::TRUCK, CMD_BUILD_ROAD_STOP | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_station[RoadStop::TRUCK]));
 	}
 }
 
 static void PlaceRoad_DemolishArea(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, 4);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_DEMOLISH_AREA);
 }
 
 
@@ -147,12 +197,12 @@
 
 static void BuildRoadClick_NE(Window *w)
 {
-	HandlePlacePushButton(w, RTW_ROAD_X, SPR_CURSOR_ROAD_NESW, 1, PlaceRoad_NE);
+	HandlePlacePushButton(w, RTW_ROAD_X, _road_type_infos[_cur_roadtype].cursor_nesw, 1, PlaceRoad_NE);
 }
 
 static void BuildRoadClick_NW(Window *w)
 {
-	HandlePlacePushButton(w, RTW_ROAD_Y, SPR_CURSOR_ROAD_NWSE, 1, PlaceRoad_NW);
+	HandlePlacePushButton(w, RTW_ROAD_Y, _road_type_infos[_cur_roadtype].cursor_nwse, 1, PlaceRoad_NW);
 }
 
 
@@ -170,13 +220,13 @@
 static void BuildRoadClick_BusStation(Window *w)
 {
 	if (_game_mode == GM_EDITOR) return;
-	if (HandlePlacePushButton(w, RTW_BUS_STATION, SPR_CURSOR_BUS_STATION, 1, PlaceRoad_BusStation)) ShowBusStationPicker();
+	if (HandlePlacePushButton(w, RTW_BUS_STATION, SPR_CURSOR_BUS_STATION, 1, PlaceRoad_BusStation)) ShowRVStationPicker(RoadStop::BUS);
 }
 
 static void BuildRoadClick_TruckStation(Window *w)
 {
 	if (_game_mode == GM_EDITOR) return;
-	if (HandlePlacePushButton(w, RTW_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, 1, PlaceRoad_TruckStation)) ShowTruckStationPicker();
+	if (HandlePlacePushButton(w, RTW_TRUCK_STATION, SPR_CURSOR_TRUCK_STATION, 1, PlaceRoad_TruckStation)) ShowRVStationPicker(RoadStop::TRUCK);
 }
 
 static void BuildRoadClick_Bridge(Window *w)
@@ -225,7 +275,7 @@
 
 	case WE_CLICK: {
 		if (e->we.click.widget >= 3) _build_road_button_proc[e->we.click.widget - 3](w);
-	}	break;
+	} break;
 
 	case WE_KEYPRESS:
 		switch (e->we.keypress.keycode) {
@@ -255,54 +305,49 @@
 		InvalidateWidget(w, RTW_REMOVE);
 
 		w = FindWindowById(WC_BUS_STATION, 0);
-		if (w != NULL) WP(w,def_d).close = true;
+		if (w != NULL) WP(w, def_d).close = true;
 		w = FindWindowById(WC_TRUCK_STATION, 0);
-		if (w != NULL) WP(w,def_d).close = true;
+		if (w != NULL) WP(w, def_d).close = true;
 		w = FindWindowById(WC_BUILD_DEPOT, 0);
-		if (w != NULL) WP(w,def_d).close = true;
+		if (w != NULL) WP(w, def_d).close = true;
 		break;
 
-	case WE_PLACE_DRAG: {
-		int sel_method;
-		switch (e->we.place.userdata) {
-			case 1:
-				sel_method = VPM_FIX_X;
+	case WE_PLACE_DRAG:
+		switch (e->we.place.select_proc) {
+			case DDSP_PLACE_ROAD_NE:
 				_place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.y & 8) >> 2);
 				break;
 
-			case 2:
-				sel_method = VPM_FIX_Y;
+			case DDSP_PLACE_ROAD_NW:
 				_place_road_flag = (_place_road_flag & ~2) | ((e->we.place.pt.x & 8) >> 2);
 				break;
-
-			case 4:
-				sel_method = VPM_X_AND_Y;
-				break;
-
-			default:
-				sel_method = VPM_X_OR_Y;
-				break;
 		}
 
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, sel_method);
+		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		return;
-	}
 
 	case WE_PLACE_MOUSEUP:
 		if (e->we.place.pt.x != -1) {
 			TileIndex start_tile = e->we.place.starttile;
 			TileIndex end_tile = e->we.place.tile;
 
-			if (e->we.place.userdata == 0) {
-				ResetObjectToPlace();
-				ShowBuildBridgeWindow(start_tile, end_tile, 0x80);
-			} else if (e->we.place.userdata != 4) {
-				DoCommandP(end_tile, start_tile, _place_road_flag, CcPlaySound1D,
-					_remove_button_clicked ?
-					CMD_REMOVE_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1805_CAN_T_REMOVE_ROAD_FROM) :
-					CMD_BUILD_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(STR_1804_CAN_T_BUILD_ROAD_HERE));
-			} else {
-				DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
+			switch (e->we.place.select_proc) {
+				case DDSP_BUILD_BRIDGE:
+					ResetObjectToPlace();
+					ShowBuildBridgeWindow(start_tile, end_tile, 0x80 | RoadTypeToRoadTypes(_cur_roadtype));
+					break;
+
+				case DDSP_DEMOLISH_AREA:
+					DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
+					break;
+
+				case DDSP_PLACE_ROAD_NE:
+				case DDSP_PLACE_ROAD_NW:
+					DoCommandP(end_tile, start_tile, _place_road_flag | (_cur_roadtype << 3) | _ctrl_pressed << 5, CcPlaySound1D,
+						_remove_button_clicked ?
+						CMD_REMOVE_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_remove_road) :
+						CMD_BUILD_LONG_ROAD | CMD_AUTO | CMD_NO_WATER | CMD_MSG(_road_type_infos[_cur_roadtype].err_build_road));
+					break;
 			}
 		}
 		break;
@@ -310,7 +355,7 @@
 	case WE_PLACE_PRESIZE: {
 		TileIndex tile = e->we.place.tile;
 
-		DoCommand(tile, 0x200, 0, DC_AUTO, CMD_BUILD_TUNNEL);
+		DoCommand(tile, 0x200 | RoadTypeToRoadTypes(_cur_roadtype), 0, DC_AUTO, CMD_BUILD_TUNNEL);
 		VpSetPresizeRange(tile, _build_tunnel_endtile == 0 ? tile : _build_tunnel_endtile);
 		break;
 	}
@@ -346,12 +391,39 @@
 	BuildRoadToolbWndProc
 };
 
-void ShowBuildRoadToolbar()
+static const Widget _build_tramway_widgets[] = {
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                   STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   205,     0,    13, STR_1802_TRAMWAY_CONSTRUCTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{  WWT_STICKYBOX,   RESIZE_NONE,     7,   206,   217,     0,    13, 0x0,                        STR_STICKY_BUTTON},
+
+{     WWT_IMGBTN,   RESIZE_NONE,     7,     0,    21,    14,    35, SPR_IMG_TRAMWAY_NW,         STR_180B_BUILD_TRAMWAY_SECTION},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    22,    43,    14,    35, SPR_IMG_TRAMWAY_NE,         STR_180B_BUILD_TRAMWAY_SECTION},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    44,    65,    14,    35, SPR_IMG_DYNAMITE,           STR_018D_DEMOLISH_BUILDINGS_ETC},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    66,    87,    14,    35, SPR_IMG_ROAD_DEPOT,         STR_180C_BUILD_TRAM_VEHICLE_DEPOT},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,    88,   109,    14,    35, SPR_IMG_BUS_STATION,        STR_180D_BUILD_PASSENGER_TRAM_STATION},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   110,   131,    14,    35, SPR_IMG_TRUCK_BAY,          STR_180E_BUILD_CARGO_TRAM_STATION},
+
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   132,   173,    14,    35, SPR_IMG_BRIDGE,             STR_180F_BUILD_TRAMWAY_BRIDGE},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   174,   195,    14,    35, SPR_IMG_ROAD_TUNNEL,        STR_1810_BUILD_TRAMWAY_TUNNEL},
+{     WWT_IMGBTN,   RESIZE_NONE,     7,   196,   217,    14,    35, SPR_IMG_REMOVE,             STR_1811_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS},
+{   WIDGETS_END},
+};
+
+static const WindowDesc _build_tramway_desc = {
+	WDP_ALIGN_TBR, 22, 218, 36,
+	WC_BUILD_TOOLBAR, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
+	_build_tramway_widgets,
+	BuildRoadToolbWndProc
+};
+
+void ShowBuildRoadToolbar(RoadType roadtype)
 {
 	if (!IsValidPlayer(_current_player)) return;
+	_cur_roadtype = roadtype;
 
 	DeleteWindowById(WC_BUILD_TOOLBAR, 0);
-	Window *w = AllocateWindowDesc(&_build_road_desc);
+	Window *w = AllocateWindowDesc(roadtype == ROADTYPE_ROAD ? &_build_road_desc : &_build_tramway_desc);
 	if (_patches.link_terraform_toolbar) ShowTerraformToolbar(w);
 }
 
@@ -382,6 +454,7 @@
 
 void ShowBuildRoadScenToolbar()
 {
+	_cur_roadtype = ROADTYPE_ROAD;
 	AllocateWindowDescFront(&_build_road_scen_desc, 0);
 }
 
@@ -393,10 +466,10 @@
 	case WE_PAINT:
 		DrawWindowWidgets(w);
 
-		DrawRoadDepotSprite(70, 17, DIAGDIR_NE);
-		DrawRoadDepotSprite(70, 69, DIAGDIR_SE);
-		DrawRoadDepotSprite( 2, 69, DIAGDIR_SW);
-		DrawRoadDepotSprite( 2, 17, DIAGDIR_NW);
+		DrawRoadDepotSprite(70, 17, DIAGDIR_NE, _cur_roadtype);
+		DrawRoadDepotSprite(70, 69, DIAGDIR_SE, _cur_roadtype);
+		DrawRoadDepotSprite( 2, 69, DIAGDIR_SW, _cur_roadtype);
+		DrawRoadDepotSprite( 2, 17, DIAGDIR_NW, _cur_roadtype);
 		break;
 
 	case WE_CLICK: {
@@ -409,14 +482,14 @@
 			SetWindowDirty(w);
 			break;
 		}
-	}	break;
+	} break;
 
 	case WE_MOUSELOOP:
-		if (WP(w,def_d).close) DeleteWindow(w);
+		if (WP(w, def_d).close) DeleteWindow(w);
 		break;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
@@ -432,6 +505,17 @@
 {   WIDGETS_END},
 };
 
+static const Widget _build_tram_depot_widgets[] = {
+{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                        STR_018B_CLOSE_WINDOW},
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   139,     0,    13, STR_1806_TRAM_DEPOT_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{      WWT_PANEL,   RESIZE_NONE,     7,     0,   139,    14,   121, 0x0,                             STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                             STR_1813_SELECT_TRAM_VEHICLE_DEPOT},
+{   WIDGETS_END},
+};
+
 static const WindowDesc _build_road_depot_desc = {
 	WDP_AUTO, WDP_AUTO, 140, 122,
 	WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
@@ -440,15 +524,29 @@
 	BuildRoadDepotWndProc
 };
 
+static const WindowDesc _build_tram_depot_desc = {
+	WDP_AUTO, WDP_AUTO, 140, 122,
+	WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
+	_build_tram_depot_widgets,
+	BuildRoadDepotWndProc
+};
+
 static void ShowRoadDepotPicker()
 {
-	AllocateWindowDesc(&_build_road_depot_desc);
+	AllocateWindowDesc(_cur_roadtype == ROADTYPE_ROAD ? &_build_road_depot_desc : &_build_tram_depot_desc);
 }
 
 static void RoadStationPickerWndProc(Window *w, WindowEvent *e)
 {
 	switch (e->event) {
 	case WE_CREATE:
+		/* Trams don't have non-drivethrough stations */
+		if (_cur_roadtype == ROADTYPE_TRAM && _road_station_picker_orientation < DIAGDIR_END) {
+			_road_station_picker_orientation = DIAGDIR_END;
+		}
+		SetWindowWidgetsDisabledState(w, _cur_roadtype == ROADTYPE_TRAM, 3, 4, 5, 6, WIDGET_LIST_END);
+
 		LowerWindowWidget(w, _road_station_picker_orientation + 3);
 		LowerWindowWidget(w, _station_show_coverage + 9);
 		break;
@@ -456,7 +554,7 @@
 	case WE_PAINT: {
 		int image;
 
-		if (WP(w,def_d).close) return;
+		if (WP(w, def_d).close) return;
 
 		DrawWindowWidgets(w);
 
@@ -471,18 +569,18 @@
 
 		image = (w->window_class == WC_BUS_STATION) ? GFX_BUS_BASE : GFX_TRUCK_BASE;
 
-		StationPickerDrawSprite(103, 35, RAILTYPE_BEGIN, image);
-		StationPickerDrawSprite(103, 85, RAILTYPE_BEGIN, image+1);
-		StationPickerDrawSprite(35, 85, RAILTYPE_BEGIN, image+2);
-		StationPickerDrawSprite(35, 35, RAILTYPE_BEGIN, image+3);
+		StationPickerDrawSprite(103, 35, RAILTYPE_BEGIN, ROADTYPE_ROAD, image);
+		StationPickerDrawSprite(103, 85, RAILTYPE_BEGIN, ROADTYPE_ROAD, image + 1);
+		StationPickerDrawSprite(35, 85, RAILTYPE_BEGIN, ROADTYPE_ROAD, image + 2);
+		StationPickerDrawSprite(35, 35, RAILTYPE_BEGIN, ROADTYPE_ROAD, image + 3);
 
 		image = (w->window_class == WC_BUS_STATION) ? GFX_BUS_BASE_EXT : GFX_TRUCK_BASE_EXT;
 
-		StationPickerDrawSprite(171, 35, RAILTYPE_BEGIN, image);
-		StationPickerDrawSprite(171, 85, RAILTYPE_BEGIN, image + 1);
+		StationPickerDrawSprite(171, 35, RAILTYPE_BEGIN, _cur_roadtype, image);
+		StationPickerDrawSprite(171, 85, RAILTYPE_BEGIN, _cur_roadtype, image + 1);
 
 		DrawStationCoverageAreaText(2, 146,
-			((w->window_class == WC_BUS_STATION) ? (1<<CT_PASSENGERS) : ~(1<<CT_PASSENGERS)),
+			((w->window_class == WC_BUS_STATION) ? (1 << CT_PASSENGERS) : ~(1 << CT_PASSENGERS)),
 			3);
 
 	} break;
@@ -507,7 +605,7 @@
 	} break;
 
 	case WE_MOUSELOOP: {
-		if (WP(w,def_d).close) {
+		if (WP(w, def_d).close) {
 			DeleteWindow(w);
 			return;
 		}
@@ -516,67 +614,43 @@
 	} break;
 
 	case WE_DESTROY:
-		if (!WP(w,def_d).close) ResetObjectToPlace();
+		if (!WP(w, def_d).close) ResetObjectToPlace();
 		break;
 	}
 }
 
-static const Widget _bus_station_picker_widgets[] = {
+static const Widget _rv_station_picker_widgets[] = {
 {   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   206,     0,    13, STR_3042_BUS_STATION_ORIENTATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   206,     0,    13, STR_NULL,                         STR_018C_WINDOW_TITLE_DRAG_THIS},
 {      WWT_PANEL,   RESIZE_NONE,     7,     0,   206,    14,   176, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                              STR_3051_SELECT_BUS_STATION_ORIENTATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                              STR_3051_SELECT_BUS_STATION_ORIENTATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                              STR_3051_SELECT_BUS_STATION_ORIENTATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                              STR_3051_SELECT_BUS_STATION_ORIENTATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    17,    66, 0x0,                              STR_3051_SELECT_BUS_STATION_ORIENTATION},
-{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    69,   118, 0x0,                              STR_3051_SELECT_BUS_STATION_ORIENTATION},
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                              STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                              STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                              STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                              STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    17,    66, 0x0,                              STR_NULL},
+{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    69,   118, 0x0,                              STR_NULL},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,    10,    69,   133,   144, STR_02DB_OFF,                     STR_3065_DON_T_HIGHLIGHT_COVERAGE},
 {    WWT_TEXTBTN,   RESIZE_NONE,    14,    70,   129,   133,   144, STR_02DA_ON,                      STR_3064_HIGHLIGHT_COVERAGE_AREA},
 {      WWT_LABEL,   RESIZE_NONE,     7,     0,   139,   120,   133, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},
 {   WIDGETS_END},
 };
 
-static const WindowDesc _bus_station_picker_desc = {
+static const WindowDesc _rv_station_picker_desc = {
 	WDP_AUTO, WDP_AUTO, 207, 177,
 	WC_BUS_STATION, WC_BUILD_TOOLBAR,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
-	_bus_station_picker_widgets,
+	_rv_station_picker_widgets,
 	RoadStationPickerWndProc
 };
 
-static void ShowBusStationPicker()
+static void ShowRVStationPicker(RoadStop::Type rs)
 {
-	AllocateWindowDesc(&_bus_station_picker_desc);
-}
+	Window *w = AllocateWindowDesc(&_rv_station_picker_desc);
+	if (w == NULL) return;
 
-static const Widget _truck_station_picker_widgets[] = {
-{   WWT_CLOSEBOX,   RESIZE_NONE,     7,     0,    10,     0,    13, STR_00C5,                         STR_018B_CLOSE_WINDOW},
-{    WWT_CAPTION,   RESIZE_NONE,     7,    11,   206,     0,    13, STR_3043_TRUCK_STATION_ORIENT,    STR_018C_WINDOW_TITLE_DRAG_THIS},
-{      WWT_PANEL,   RESIZE_NONE,     7,     0,   206,    14,   176, 0x0,                              STR_NULL},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    17,    66, 0x0,                              STR_3052_SELECT_TRUCK_LOADING_BAY},
-{      WWT_PANEL,   RESIZE_NONE,    14,    71,   136,    69,   118, 0x0,                              STR_3052_SELECT_TRUCK_LOADING_BAY},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    69,   118, 0x0,                              STR_3052_SELECT_TRUCK_LOADING_BAY},
-{      WWT_PANEL,   RESIZE_NONE,    14,     3,    68,    17,    66, 0x0,                              STR_3052_SELECT_TRUCK_LOADING_BAY},
-{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    17,    66, 0x0,                              STR_3052_SELECT_TRUCK_LOADING_BAY},
-{      WWT_PANEL,   RESIZE_NONE,    14,   139,   204,    69,   118, 0x0,                              STR_3052_SELECT_TRUCK_LOADING_BAY},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    10,    69,   133,   144, STR_02DB_OFF,                     STR_3065_DON_T_HIGHLIGHT_COVERAGE},
-{    WWT_TEXTBTN,   RESIZE_NONE,    14,    70,   129,   133,   144, STR_02DA_ON,                      STR_3064_HIGHLIGHT_COVERAGE_AREA},
-{      WWT_LABEL,   RESIZE_NONE,     7,     0,   139,   120,   133, STR_3066_COVERAGE_AREA_HIGHLIGHT, STR_NULL},
-{   WIDGETS_END},
-};
-
-static const WindowDesc _truck_station_picker_desc = {
-	WDP_AUTO, WDP_AUTO, 207, 177,
-	WC_TRUCK_STATION, WC_BUILD_TOOLBAR,
-	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
-	_truck_station_picker_widgets,
-	RoadStationPickerWndProc
-};
-
-static void ShowTruckStationPicker()
-{
-	AllocateWindowDesc(&_truck_station_picker_desc);
+	w->window_class = (rs == RoadStop::BUS) ? WC_BUS_STATION : WC_TRUCK_STATION;
+	w->widget[1].data = _road_type_infos[_cur_roadtype].picker_title[rs];
+	for (uint i = 3; i < 9; i++) w->widget[i].tooltips = _road_type_infos[_cur_roadtype].picker_tooltip[rs];
 }
 
 void InitializeRoadGui()
--- a/src/road_map.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/road_map.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,9 +1,12 @@
 /* $Id$ */
 
+/** @file road_map.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
 #include "functions.h"
+#include "landscape.h"
 #include "road_map.h"
 #include "station.h"
 #include "tunnel_map.h"
@@ -11,13 +14,15 @@
 #include "depot.h"
 
 
-RoadBits GetAnyRoadBits(TileIndex tile)
+RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt)
 {
+	if (!HASBIT(GetRoadTypes(tile), rt)) return ROAD_NONE;
+
 	switch (GetTileType(tile)) {
 		case MP_STREET:
 			switch (GetRoadTileType(tile)) {
 				default:
-				case ROAD_TILE_NORMAL:   return GetRoadBits(tile);
+				case ROAD_TILE_NORMAL:   return GetRoadBits(tile, rt);
 				case ROAD_TILE_CROSSING: return GetCrossingRoadBits(tile);
 				case ROAD_TILE_DEPOT:    return DiagDirToRoadBits(GetRoadDepotDirection(tile));
 			}
@@ -41,15 +46,16 @@
 }
 
 
-TrackBits GetAnyRoadTrackBits(TileIndex tile)
+TrackBits GetAnyRoadTrackBits(TileIndex tile, RoadType rt)
 {
 	uint32 r;
 
-	// Don't allow local authorities to build roads through road depots or road stops.
-	if ((IsTileType(tile, MP_STREET) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile))) {
+	/* Don't allow local authorities to build roads through road depots or road stops. */
+	if ((IsTileType(tile, MP_STREET) && IsTileDepotType(tile, TRANSPORT_ROAD)) || (IsTileType(tile, MP_STATION) && !IsDriveThroughStopTile(tile)) || !HASBIT(GetRoadTypes(tile), rt)) {
 		return TRACK_BIT_NONE;
 	}
 
-	r = GetTileTrackStatus(tile, TRANSPORT_ROAD);
+	r = GetTileTrackStatus(tile, TRANSPORT_ROAD, RoadTypeToRoadTypes(rt));
+
 	return (TrackBits)(byte)(r | (r >> 8));
 }
--- a/src/road_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/road_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file road_map.h */
+
 #ifndef ROAD_MAP_H
 #define ROAD_MAP_H
 
@@ -16,9 +18,9 @@
 };
 
 static inline RoadTileType GetRoadTileType(TileIndex t)
-{
+	{
 	assert(IsTileType(t, MP_STREET));
-	return (RoadTileType)GB(_m[t].m5, 4, 4);
+	return (RoadTileType)GB(_m[t].m5, 6, 2);
 }
 
 static inline bool IsLevelCrossing(TileIndex t)
@@ -31,23 +33,151 @@
 	return IsTileType(t, MP_STREET) && IsLevelCrossing(t);
 }
 
-static inline RoadBits GetRoadBits(TileIndex t)
+static inline RoadBits GetRoadBits(TileIndex t, RoadType rt)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
-	return (RoadBits)GB(_m[t].m5, 0, 4);
+	switch (rt) {
+		default: NOT_REACHED();
+		case ROADTYPE_ROAD: return (RoadBits)GB(_m[t].m4, 0, 4);
+		case ROADTYPE_TRAM: return (RoadBits)GB(_m[t].m4, 4, 4);
+		case ROADTYPE_HWAY: return (RoadBits)GB(_m[t].m6, 2, 4);
+	}
 }
 
-static inline void SetRoadBits(TileIndex t, RoadBits r)
+static inline RoadBits GetAllRoadBits(TileIndex tile)
+{
+	return GetRoadBits(tile, ROADTYPE_ROAD) | GetRoadBits(tile, ROADTYPE_TRAM) | GetRoadBits(tile, ROADTYPE_HWAY);
+}
+
+static inline void SetRoadBits(TileIndex t, RoadBits r, RoadType rt)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL); // XXX incomplete
-	SB(_m[t].m5, 0, 4, r);
+	switch (rt) {
+		default: NOT_REACHED();
+		case ROADTYPE_ROAD: SB(_m[t].m4, 0, 4, r); break;
+		case ROADTYPE_TRAM: SB(_m[t].m4, 4, 4, r); break;
+		case ROADTYPE_HWAY: SB(_m[t].m6, 2, 4, r); break;
+	}
 }
 
+static inline RoadTypes GetRoadTypes(TileIndex t)
+{
+	if (IsTileType(t, MP_STREET)) {
+		return (RoadTypes)GB(_me[t].m7, 5, 3);
+	} else {
+		return (RoadTypes)GB(_m[t].m3, 0, 3);
+	}
+}
+
+static inline void SetRoadTypes(TileIndex t, RoadTypes rt)
+{
+	if (IsTileType(t, MP_STREET)) {
+		SB(_me[t].m7, 5, 3, rt);
+	} else {
+		assert(IsTileType(t, MP_STATION) || IsTileType(t, MP_TUNNELBRIDGE));
+		SB(_m[t].m3, 0, 2, rt);
+	}
+}
+
+static inline Owner GetRoadOwner(TileIndex t, RoadType rt)
+{
+	if (!IsTileType(t, MP_STREET)) return GetTileOwner(t);
+
+	switch (GetRoadTileType(t)) {
+		default: NOT_REACHED();
+		case ROAD_TILE_NORMAL:
+			switch (rt) {
+				default: NOT_REACHED();
+				case ROADTYPE_ROAD: return (Owner)GB( _m[t].m1, 0, 5);
+				case ROADTYPE_TRAM: {
+					/* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
+					 * to OWNER_TOWN makes it use one bit less */
+					Owner o = (Owner)GB( _m[t].m5, 0, 4);
+					return o == OWNER_TOWN ? OWNER_NONE : o;
+				}
+				case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
+			}
+		case ROAD_TILE_CROSSING:
+			switch (rt) {
+				default: NOT_REACHED();
+				case ROADTYPE_ROAD: return (Owner)GB( _m[t].m4, 0, 5);
+				case ROADTYPE_TRAM: {
+					/* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
+					 * to OWNER_TOWN makes it use one bit less */
+					Owner o = (Owner)GB( _m[t].m5, 0, 4);
+					return o == OWNER_TOWN ? OWNER_NONE : o;
+				}
+				case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
+			}
+		case ROAD_TILE_DEPOT: return GetTileOwner(t);
+	}
+}
+
+static inline void SetRoadOwner(TileIndex t, RoadType rt, Owner o)
+{
+	if (!IsTileType(t, MP_STREET)) return SetTileOwner(t, o);
+
+	switch (GetRoadTileType(t)) {
+		default: NOT_REACHED();
+		case ROAD_TILE_NORMAL:
+			switch (rt) {
+				default: NOT_REACHED();
+				case ROADTYPE_ROAD: SB( _m[t].m1, 0, 5, o); break;
+				case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
+				case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
+			}
+			break;
+		case ROAD_TILE_CROSSING:
+			switch (rt) {
+				default: NOT_REACHED();
+				case ROADTYPE_ROAD: SB( _m[t].m4, 0, 5, o); break;
+				/* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
+				 * to OWNER_TOWN makes it use one bit less */
+				case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
+				case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
+			}
+			break;
+		case ROAD_TILE_DEPOT: return SetTileOwner(t, o);
+	}
+}
+
+/** Which directions are disallowed ? */
+enum DisallowedRoadDirections {
+	DRD_NONE,       ///< None of the directions are disallowed
+	DRD_SOUTHBOUND, ///< All southbound traffic is disallowed
+	DRD_NORTHBOUND, ///< All northbound traffic is disallowed
+	DRD_BOTH,       ///< All directions are disallowed
+	DRD_END
+};
+DECLARE_ENUM_AS_BIT_SET(DisallowedRoadDirections);
+
+/**
+ * Gets the disallowed directions
+ * @param t the tile to get the directions from
+ * @return the disallowed directions
+ */
+static inline DisallowedRoadDirections GetDisallowedRoadDirections(TileIndex t)
+{
+	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
+	return (DisallowedRoadDirections)GB(_m[t].m5, 4, 2);
+}
+
+/**
+ * Sets the disallowed directions
+ * @param t   the tile to set the directions for
+ * @param drd the disallowed directions
+ */
+static inline void SetDisallowedRoadDirections(TileIndex t, DisallowedRoadDirections drd)
+{
+	assert(GetRoadTileType(t) == ROAD_TILE_NORMAL);
+	assert(drd < DRD_END);
+	SB(_m[t].m5, 4, 2, drd);
+}
 
 static inline Axis GetCrossingRoadAxis(TileIndex t)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	return (Axis)GB(_m[t].m5, 3, 1);
+	return (Axis)GB(_m[t].m4, 6, 1);
 }
 
 static inline RoadBits GetCrossingRoadBits(TileIndex tile)
@@ -61,35 +191,22 @@
 }
 
 
-// TODO swap owner of road and rail
-static inline Owner GetCrossingRoadOwner(TileIndex t)
-{
-	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	return (Owner)_m[t].m4;
-}
-
-static inline void SetCrossingRoadOwner(TileIndex t, Owner o)
-{
-	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	_m[t].m4 = o;
-}
-
 static inline void UnbarCrossing(TileIndex t)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	CLRBIT(_m[t].m5, 2);
+	CLRBIT(_m[t].m4, 5);
 }
 
 static inline void BarCrossing(TileIndex t)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	SETBIT(_m[t].m5, 2);
+	SETBIT(_m[t].m4, 5);
 }
 
 static inline bool IsCrossingBarred(TileIndex t)
 {
 	assert(GetRoadTileType(t) == ROAD_TILE_CROSSING);
-	return HASBIT(_m[t].m5, 2);
+	return HASBIT(_m[t].m4, 5);
 }
 
 #define IsOnDesert IsOnSnow
@@ -166,48 +283,66 @@
 
 /**
  * Returns the RoadBits on an arbitrary tile
- * Special behavior:
+ * Special behaviour:
  * - road depots: entrance is treated as road piece
  * - road tunnels: entrance is treated as road piece
  * - bridge ramps: start of the ramp is treated as road piece
  * - bridge middle parts: bridge itself is ignored
+ * @param tile the tile to get the road bits for
+ * @param rt   the road type to get the road bits form
+ * @return the road bits of the given tile
  */
-RoadBits GetAnyRoadBits(TileIndex);
+RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt);
 
-
-TrackBits GetAnyRoadTrackBits(TileIndex tile);
+/**
+ * Get the accessible track bits for the given tile.
+ * Special behaviour:
+ *  - road depots: no track bits
+ *  - non-drive-through stations: no track bits
+ * @param tile the tile to get the track bits for
+ * @return the track bits for the given tile
+ */
+TrackBits GetAnyRoadTrackBits(TileIndex tile, RoadType rt);
 
 
-static inline void MakeRoadNormal(TileIndex t, Owner owner, RoadBits bits, TownID town)
+static inline void MakeRoadNormal(TileIndex t, RoadBits bits, RoadTypes rot, TownID town, Owner road, Owner tram, Owner hway)
 {
 	SetTileType(t, MP_STREET);
-	SetTileOwner(t, owner);
+	SetTileOwner(t, road);
 	_m[t].m2 = town;
-	_m[t].m3 = 0 << 7 | 0 << 4 | 0;
-	_m[t].m4 = 0;
-	_m[t].m5 = ROAD_TILE_NORMAL << 4 | bits;
+	_m[t].m3 = 0;
+	_m[t].m4 = (HASBIT(rot, ROADTYPE_TRAM) ? bits : 0) << 4 | (HASBIT(rot, ROADTYPE_ROAD) ? bits : 0);
+	_m[t].m5 = ROAD_TILE_NORMAL << 6;
+	SetRoadOwner(t, ROADTYPE_TRAM, tram);
+	SB(_m[t].m6, 2, 4, HASBIT(rot, ROADTYPE_HWAY) ? bits : 0);
+	_me[t].m7 = rot << 5 | hway;
 }
 
 
-static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner rail, Axis roaddir, RailType rt, uint town)
+static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner tram, Owner hway, Owner rail, Axis roaddir, RailType rat, RoadTypes rot, uint town)
 {
 	SetTileType(t, MP_STREET);
 	SetTileOwner(t, rail);
 	_m[t].m2 = town;
-	_m[t].m3 = 0 << 7 | 0 << 4 | rt;
-	_m[t].m4 = road;
-	_m[t].m5 = ROAD_TILE_CROSSING << 4 | roaddir << 3 | 0 << 2;
+	_m[t].m3 = rat;
+	_m[t].m4 = roaddir << 6 | road;
+	_m[t].m5 = ROAD_TILE_CROSSING << 6;
+	SetRoadOwner(t, ROADTYPE_TRAM, tram);
+	SB(_m[t].m6, 2, 4, 0);
+	_me[t].m7 = rot << 5 | hway;
 }
 
 
-static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir)
+static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir, RoadType rt)
 {
 	SetTileType(t, MP_STREET);
 	SetTileOwner(t, owner);
 	_m[t].m2 = 0;
 	_m[t].m3 = 0;
 	_m[t].m4 = 0;
-	_m[t].m5 = ROAD_TILE_DEPOT << 4 | dir;
+	_m[t].m5 = ROAD_TILE_DEPOT << 6 | dir;
+	SB(_m[t].m6, 2, 4, 0);
+	_me[t].m7 = RoadTypeToRoadTypes(rt) << 5;
 }
 
 #endif /* ROAD_MAP_H */
--- a/src/roadveh.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/roadveh.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file src/roadveh.h Road vehicle states */
+
 #ifndef ROADVEH_H
 #define ROADVEH_H
 
@@ -20,4 +22,28 @@
 void CcBuildRoadVeh(bool success, TileIndex tile, uint32 p1, uint32 p2);
 void CcCloneRoadVeh(bool success, TileIndex tile, uint32 p1, uint32 p2);
 
+
+/**
+ * This class 'wraps' Vehicle; you do not actually instantiate this class.
+ * You create a Vehicle using AllocateVehicle, so it is added to the pool
+ * and you reinitialize that to a Train using:
+ *   v = new (v) RoadVehicle();
+ *
+ * As side-effect the vehicle type is set correctly.
+ */
+struct RoadVehicle : public Vehicle {
+	/** Initializes the Vehicle to a road vehicle */
+	RoadVehicle() { this->type = VEH_ROAD; }
+
+	/** We want to 'destruct' the right class. */
+	virtual ~RoadVehicle() {}
+
+	const char *GetTypeString() const { return "road vehicle"; }
+	void MarkDirty();
+	void UpdateDeltaXY(Direction direction);
+	ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_ROADVEH_INC : EXPENSES_ROADVEH_RUN; }
+	WindowClass GetVehicleListWindowClass() const { return WC_ROADVEH_LIST; }
+	bool IsPrimaryVehicle() const { return true; }
+};
+
 #endif /* ROADVEH_H */
--- a/src/roadveh_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/roadveh_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,9 +1,12 @@
 /* $Id$ */
 
+/** @file roadveh_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
 #include "functions.h"
+#include "landscape.h"
 #include "road_map.h"
 #include "roadveh.h"
 #include "station_map.h"
@@ -114,11 +117,12 @@
 
 static int32 EstimateRoadVehCost(EngineID engine_type)
 {
-	return ((_price.roadveh_base >> 3) * RoadVehInfo(engine_type)->base_cost) >> 5;
+	return ((_price.roadveh_base >> 3) * GetEngineProperty(engine_type, 0x11, RoadVehInfo(engine_type)->base_cost)) >> 5;
 }
 
 /** Build a road vehicle.
  * @param tile tile of depot where road vehicle is built
+ * @param flags operation to perform
  * @param p1 bus/truck type being built (engine)
  * @param p2 bit 0 when set, the unitnumber will be 0, otherwise it will be a free number
  */
@@ -129,7 +133,7 @@
 	UnitID unit_num;
 	Engine *e;
 
-	if (!IsEngineBuildable(p1, VEH_ROAD, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
+	if (!IsEngineBuildable(p1, VEH_ROAD, _current_player)) return_cmd_error(STR_ROAD_VEHICLE_NOT_AVAILABLE);
 
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
@@ -141,6 +145,8 @@
 	if (!IsTileDepotType(tile, TRANSPORT_ROAD)) return CMD_ERROR;
 	if (!IsTileOwner(tile, _current_player)) return CMD_ERROR;
 
+	if (HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) != HASBIT(EngInfo(p1)->misc_flags, EF_ROAD_TRAM)) return_cmd_error(STR_DEPOT_WRONG_DEPOT_TYPE);
+
 	v = AllocateVehicle();
 	if (v == NULL) return_cmd_error(STR_00E1_TOO_MANY_VEHICLES_IN_GAME);
 
@@ -164,11 +170,10 @@
 		y = TileY(tile) * TILE_SIZE + TILE_SIZE / 2;
 		v->x_pos = x;
 		v->y_pos = y;
-		v->z_pos = GetSlopeZ(x,y);
-		v->z_height = 6;
+		v->z_pos = GetSlopeZ(x, y);
 
 		v->u.road.state = RVSB_IN_DEPOT;
-		v->vehstatus = VS_HIDDEN|VS_STOPPED|VS_DEFPAL;
+		v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
 
 		v->spritenum = rvi->image_index;
 		v->cargo_type = rvi->cargo_type;
@@ -188,6 +193,9 @@
 		v->max_speed = rvi->max_speed;
 		v->engine_type = (byte)p1;
 
+		v->u.road.roadtype = HASBIT(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD;
+		v->u.road.compatible_roadtypes = RoadTypeToRoadTypes(v->u.road.roadtype);
+
 		e = GetEngine(p1);
 		v->reliability = e->reliability;
 		v->reliability_spd_dec = e->reliability_spd_dec;
@@ -201,13 +209,15 @@
 		v->date_of_last_service = _date;
 		v->build_year = _cur_year;
 
-		v->type = VEH_ROAD;
+		v = new (v) RoadVehicle();
 		v->cur_image = 0xC15;
 		v->random_bits = VehicleRandomBits();
 
 		v->vehicle_flags = 0;
 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
+		v->cargo_cap = GetVehicleProperty(v, 0x0F, rvi->capacity);
+
 		VehiclePositionChanged(v);
 
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
@@ -224,6 +234,7 @@
 
 /** Start/Stop a road vehicle.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 road vehicle ID to start/stop
  * @param p2 unused
  */
@@ -252,6 +263,7 @@
 		}
 
 		v->vehstatus ^= VS_STOPPED;
+		v->cur_speed = 0;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 	}
@@ -275,6 +287,7 @@
 
 /** Sell a road vehicle.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 vehicle ID to be sold
  * @param p2 unused
  */
@@ -346,7 +359,7 @@
 		/* See where we are now */
 		Trackdir trackdir = GetVehicleTrackdir(v);
 
-		ftd = NPFRouteToDepotBreadthFirst(v->tile, trackdir, TRANSPORT_ROAD, v->owner, INVALID_RAILTYPE);
+		ftd = NPFRouteToDepotBreadthFirst(v->tile, trackdir, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPE);
 		if (ftd.best_bird_dist == 0) {
 			return GetDepotByTile(ftd.node.tile); /* Target found */
 		} else {
@@ -361,7 +374,7 @@
 
 		/* search in all directions */
 		for (DiagDirection i = DIAGDIR_BEGIN; i != DIAGDIR_END; i++) {
-			FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, i, EnumRoadSignalFindDepot, NULL, &rfdd);
+			FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, v->u.road.compatible_roadtypes, i, EnumRoadSignalFindDepot, NULL, &rfdd);
 		}
 
 		if (rfdd.best_length == (uint)-1) return NULL;
@@ -372,6 +385,7 @@
 
 /** Send a road vehicle to the depot.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 vehicle ID to send to the depot
  * @param p2 various bitmasked elements
  * - p2 bit 0-3 - DEPOT_ flags (see vehicle.h)
@@ -429,6 +443,8 @@
 	if (dep == NULL) return_cmd_error(STR_9019_UNABLE_TO_FIND_LOCAL_DEPOT);
 
 	if (flags & DC_EXEC) {
+		if (v->current_order.type == OT_LOADING) v->LeaveStation();
+
 		ClearSlot(v);
 		v->current_order.type = OT_GOTO_DEPOT;
 		v->current_order.flags = OF_NON_STOP;
@@ -444,6 +460,7 @@
 
 /** Turn a roadvehicle around.
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 vehicle ID to turn
  * @param p2 unused
  */
@@ -458,6 +475,7 @@
 	if (v->type != VEH_ROAD || !CheckOwnership(v->owner)) return CMD_ERROR;
 
 	if (v->vehstatus & VS_STOPPED ||
+			v->u.road.roadtype == ROADTYPE_TRAM ||
 			v->u.road.crashed_ctr != 0 ||
 			v->breakdown_ctr != 0 ||
 			v->u.road.overtaking != 0 ||
@@ -467,6 +485,8 @@
 		return CMD_ERROR;
 	}
 
+	if (IsTileType(v->tile, MP_STREET) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) return CMD_ERROR;
+
 	if (IsTunnelTile(v->tile) && DirToDiagDir(v->direction) == GetTunnelDirection(v->tile)) return CMD_ERROR;
 	if (IsBridgeTile(v->tile) && DirToDiagDir(v->direction) == GetBridgeRampDirection(v->tile)) return CMD_ERROR;
 
@@ -476,15 +496,15 @@
 }
 
 
-static void MarkRoadVehDirty(Vehicle *v)
+void RoadVehicle::MarkDirty()
 {
-	v->cur_image = GetRoadVehImage(v, v->direction);
-	MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1);
+	this->cur_image = GetRoadVehImage(this, this->direction);
+	MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1);
 }
 
-static void UpdateRoadVehDeltaXY(Vehicle *v)
+void RoadVehicle::UpdateDeltaXY(Direction direction)
 {
-#define MKIT(a,b,c,d) ((a&0xFF)<<24) | ((b&0xFF)<<16) | ((c&0xFF)<<8) | ((d&0xFF)<<0)
+#define MKIT(a, b, c, d) ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | ((d & 0xFF) << 0)
 	static const uint32 _delta_xy_table[8] = {
 		MKIT(3, 3, -1, -1),
 		MKIT(3, 7, -1, -3),
@@ -496,11 +516,13 @@
 		MKIT(7, 3, -3, -1),
 	};
 #undef MKIT
-	uint32 x = _delta_xy_table[v->direction];
-	v->x_offs        = GB(x,  0, 8);
-	v->y_offs        = GB(x,  8, 8);
-	v->sprite_width  = GB(x, 16, 8);
-	v->sprite_height = GB(x, 24, 8);
+
+	uint32 x = _delta_xy_table[direction];
+	this->x_offs        = GB(x,  0, 8);
+	this->y_offs        = GB(x,  8, 8);
+	this->sprite_width  = GB(x, 16, 8);
+	this->sprite_height = GB(x, 24, 8);
+	this->z_height      = 6;
 }
 
 static void ClearCrashedStation(Vehicle *v)
@@ -533,7 +555,7 @@
 {
 	byte new_z, old_z;
 
-	// need this hint so it returns the right z coordinate on bridges.
+	/* need this hint so it returns the right z coordinate on bridges. */
 	v->x_pos = x;
 	v->y_pos = y;
 	new_z = GetSlopeZ(x, y);
@@ -556,7 +578,7 @@
 
 	v->direction = ChangeDir(v->direction, delta[r & 3]);
 	BeginVehicleMove(v);
-	UpdateRoadVehDeltaXY(v);
+	v->UpdateDeltaXY(v->direction);
 	v->cur_image = GetRoadVehImage(v, v->direction);
 	SetRoadVehPosition(v, v->x_pos, v->y_pos);
 }
@@ -663,7 +685,7 @@
 
 	switch (v->current_order.type) {
 		case OT_GOTO_DEPOT:
-			// Let a depot order in the orderlist interrupt.
+			/* Let a depot order in the orderlist interrupt. */
 			if (!(v->current_order.flags & OF_PART_OF_ORDERS)) return;
 			if (v->current_order.flags & OF_SERVICE_IF_NEEDED &&
 					!VehicleNeedsService(v)) {
@@ -709,11 +731,14 @@
 				IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK
 			);
 
+			TileIndex dest = INVALID_TILE;
 			if (rs != NULL) {
-				TileIndex dest = rs->xy;
-				uint mindist = DistanceManhattan(v->tile, rs->xy);
+				uint mindist = MAX_UVALUE(uint);
 
-				for (rs = rs->next; rs != NULL; rs = rs->next) {
+				for (; rs != NULL; rs = rs->next) {
+					/* The vehicle cannot go to this roadstop */
+					if ((GetRoadTypes(rs->xy) & v->u.road.compatible_roadtypes) == ROADTYPES_NONE) continue;
+
 					uint dist = DistanceManhattan(v->tile, rs->xy);
 
 					if (dist < mindist) {
@@ -721,9 +746,12 @@
 						dest = rs->xy;
 					}
 				}
-				v->dest_tile = dest;
+			}
+
+			if (dest != INVALID_TILE) {
+					v->dest_tile = dest;
 			} else {
-				// There is no stop left at the station, so don't even TRY to go there
+				/* There is no stop left at the station, so don't even TRY to go there */
 				v->cur_order_index++;
 				v->dest_tile = 0;
 			}
@@ -742,39 +770,6 @@
 	InvalidateVehicleOrder(v);
 }
 
-static void HandleRoadVehLoading(Vehicle *v)
-{
-	switch (v->current_order.type) {
-		case OT_LOADING: {
-			Order b;
-
-			if (--v->load_unload_time_rem != 0) return;
-
-			if (CanFillVehicle(v) && (v->current_order.flags & OF_FULL_LOAD ||
-					(_patches.gradual_loading && !HASBIT(v->vehicle_flags, VF_LOADING_FINISHED)))) {
-				SET_EXPENSES_TYPE(EXPENSES_ROADVEH_INC);
-				if (LoadUnloadVehicle(v, false)) {
-					InvalidateWindow(WC_ROADVEH_LIST, v->owner);
-					MarkRoadVehDirty(v);
-				}
-				return;
-			}
-
-			b = v->current_order;
-			v->LeaveStation();
-			if (!(b.flags & OF_NON_STOP)) return;
-			break;
-		}
-
-		case OT_DUMMY: break;
-
-		default: return;
-	}
-
-	v->cur_order_index++;
-	InvalidateVehicleOrder(v);
-}
-
 static void StartRoadVehSound(const Vehicle* v)
 {
 	if (!PlayVehicleSound(v, VSE_START)) {
@@ -828,10 +823,10 @@
 	rvf.veh = v;
 	u = (Vehicle*)VehicleFromPos(TileVirtXY(x, y), &rvf, EnumCheckRoadVehClose);
 
-	// This code protects a roadvehicle from being blocked for ever
-	//  If more than 1480 / 74 days a road vehicle is blocked, it will
-	//  drive just through it. The ultimate backup-code of TTD.
-	// It can be disabled.
+	/* This code protects a roadvehicle from being blocked for ever
+	 * If more than 1480 / 74 days a road vehicle is blocked, it will
+	 * drive just through it. The ultimate backup-code of TTD.
+	 * It can be disabled. */
 	if (u == NULL) {
 		v->u.road.blocked_ctr = 0;
 		return NULL;
@@ -853,7 +848,7 @@
 			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);
 			AddNewsItem(
-				STR_902F_CITIZENS_CELEBRATE_FIRST,
+				v->u.road.roadtype == ROADTYPE_ROAD ? STR_902F_CITIZENS_CELEBRATE_FIRST : STR_902F_CITIZENS_CELEBRATE_FIRST_TRAM,
 				flags,
 				v->index,
 				0);
@@ -867,7 +862,7 @@
 			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);
 			AddNewsItem(
-				STR_9030_CITIZENS_CELEBRATE_FIRST,
+				v->u.road.roadtype == ROADTYPE_ROAD ? STR_9030_CITIZENS_CELEBRATE_FIRST : STR_9030_CITIZENS_CELEBRATE_FIRST_TRAM,
 				flags,
 				v->index,
 				0
@@ -881,13 +876,13 @@
 	uint spd = v->cur_speed + 1 + (v->u.road.overtaking != 0 ? 1 : 0);
 	byte t;
 
-	// Clamp
+	/* Clamp */
 	spd = min(spd, v->max_speed);
 	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
+	/* updates statusbar only if speed have changed to save CPU time */
 	if (spd != v->cur_speed) {
 		v->cur_speed = spd;
 		if (_patches.vehicle_speed) {
@@ -895,7 +890,7 @@
 		}
 	}
 
-	// Decrease somewhat when turning
+	/* Decrease somewhat when turning */
 	if (!(v->direction & 1)) spd = spd * 3 >> 2;
 
 	if (spd == 0) return false;
@@ -953,7 +948,7 @@
 {
 	uint32 bits;
 
-	bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD) & 0x3F;
+	bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes) & 0x3F;
 
 	if (!(od->tilebits & bits) || (bits & 0x3C) || (bits & 0x3F3F0000))
 		return true;
@@ -974,12 +969,15 @@
 		return;
 	}
 
+	/* Trams can't overtake other trams */
+	if (v->u.road.roadtype == ROADTYPE_TRAM) return;
+
 	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 >= RVSB_IN_ROAD_STOP || !IsStraightRoadTrackdir((Trackdir)(v->u.road.state & RVSB_TRACKDIR_MASK))) return;
 
-	tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD) & 0x3F;
+	tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes) & 0x3F;
 	if ((tt & 3) == 0) return;
 	if ((tt & 0x3C) != 0) return;
 
@@ -1050,11 +1048,11 @@
 	return false;
 }
 
-static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, Owner owner, RailTypeMask railtypes)
+static inline NPFFoundTargetData PerfNPFRouteToStationOrTile(TileIndex tile, Trackdir trackdir, NPFFindStationOrTileData* target, TransportType type, uint sub_type, Owner owner, RailTypeMask railtypes)
 {
 
 	void* perf = NpfBeginInterval();
-	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, target, type, owner, railtypes);
+	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, target, type, sub_type, owner, railtypes);
 	int t = NpfEndInterval(perf);
 	DEBUG(yapf, 4, "[NPFR] %d us - %d rounds - %d open - %d closed -- ", t, 0, _aystar_stats_open_size, _aystar_stats_closed_size);
 	return ret;
@@ -1063,10 +1061,10 @@
 /**
  * Returns direction to for a road vehicle to take or
  * INVALID_TRACKDIR if the direction is currently blocked
- * @param v        the vehicle to do the pathfinding for
+ * @param v        the Vehicle to do the pathfinding for
  * @param tile     the where to start the pathfinding
  * @param enterdir the direction the vehicle enters the tile from
- * @return the trackdir to take
+ * @return the Trackdir to take
  */
 static Trackdir RoadFindPathToDest(Vehicle* v, TileIndex tile, DiagDirection enterdir)
 {
@@ -1076,12 +1074,12 @@
 	FindRoadToChooseData frd;
 	Trackdir best_track;
 
-	uint32 r  = GetTileTrackStatus(tile, TRANSPORT_ROAD);
+	uint32 r  = GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
 	TrackdirBits signal    = (TrackdirBits)GB(r, 16, 16);
 	TrackdirBits trackdirs = (TrackdirBits)GB(r,  0, 16);
 
 	if (IsTileType(tile, MP_STREET)) {
-		if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && (!IsTileOwner(tile, v->owner) || GetRoadDepotDirection(tile) == enterdir)) {
+		if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && (!IsTileOwner(tile, v->owner) || GetRoadDepotDirection(tile) == enterdir || (GetRoadTypes(tile) & v->u.road.compatible_roadtypes) == 0)) {
 			/* Road depot owned by another player or with the wrong orientation */
 			trackdirs = TRACKDIR_BIT_NONE;
 		}
@@ -1151,11 +1149,11 @@
 		trackdir = DiagdirToDiagTrackdir(enterdir);
 		//debug("Finding path. Enterdir: %d, Trackdir: %d", enterdir, trackdir);
 
-		ftd = PerfNPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, &fstd, TRANSPORT_ROAD, v->owner, INVALID_RAILTYPE);
+		ftd = PerfNPFRouteToStationOrTile(tile - TileOffsByDiagDir(enterdir), trackdir, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPE);
 		if (ftd.best_trackdir == INVALID_TRACKDIR) {
-			/* We are already at our target. Just do something */
-			//TODO: maybe display error?
-			//TODO: go straight ahead if possible?
+			/* We are already at our target. Just do something
+			 * @todo: maybe display error?
+			 * @todo: go straight ahead if possible? */
 			return_track(FindFirstBit2x64(trackdirs));
 		} else {
 			/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
@@ -1201,7 +1199,7 @@
 				if (best_track == INVALID_TRACKDIR) best_track = (Trackdir)i; // in case we don't find the path, just pick a track
 				frd.maxtracklen = (uint)-1;
 				frd.mindist = (uint)-1;
-				FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
+				FollowTrack(tile, 0x2000 | TRANSPORT_ROAD, v->u.road.compatible_roadtypes, _road_pf_directions[i], EnumRoadTrackFindDist, NULL, &frd);
 
 				if (frd.mindist < best_dist || (frd.mindist == best_dist && frd.maxtracklen < best_maxlen)) {
 					best_dist = frd.mindist;
@@ -1223,10 +1221,10 @@
 {
 	uint dist;
 	if (_patches.yapf.road_use_yapf) {
-		// use YAPF
+		/* use YAPF */
 		dist = YapfRoadVehDistanceToTile(v, tile);
 	} else {
-		// use NPF
+		/* use NPF */
 		NPFFindStationOrTileData fstd;
 		Trackdir trackdir = GetVehicleTrackdir(v);
 		assert(trackdir != INVALID_TRACKDIR);
@@ -1234,8 +1232,8 @@
 		fstd.dest_coords = tile;
 		fstd.station_index = INVALID_STATION; // indicates that the destination is a tile, not a station
 
-		dist = NPFRouteToStationOrTile(v->tile, trackdir, &fstd, TRANSPORT_ROAD, v->owner, INVALID_RAILTYPE).best_path_dist;
-		// change units from NPF_TILE_LENGTH to # of tiles
+		dist = NPFRouteToStationOrTile(v->tile, trackdir, &fstd, TRANSPORT_ROAD, v->u.road.compatible_roadtypes, v->owner, INVALID_RAILTYPE).best_path_dist;
+		/* change units from NPF_TILE_LENGTH to # of tiles */
 		if (dist != UINT_MAX)
 			dist = (dist + NPF_TILE_LENGTH - 1) / NPF_TILE_LENGTH;
 	}
@@ -1277,11 +1275,11 @@
 	int x,y;
 	uint32 r;
 
-	// decrease counters
+	/* decrease counters */
 	v->tick_counter++;
 	if (v->u.road.reverse_ctr != 0) v->u.road.reverse_ctr--;
 
-	// handle crashed
+	/* handle crashed */
 	if (v->u.road.crashed_ctr != 0) {
 		RoadVehIsCrashed(v);
 		return;
@@ -1289,7 +1287,7 @@
 
 	RoadVehCheckTrainCrash(v);
 
-	// road vehicle has broken down?
+	/* road vehicle has broken down? */
 	if (v->breakdown_ctr != 0) {
 		if (v->breakdown_ctr <= 2) {
 			HandleBrokenRoadVeh(v);
@@ -1301,7 +1299,7 @@
 	if (v->vehstatus & VS_STOPPED) return;
 
 	ProcessRoadVehOrder(v);
-	HandleRoadVehLoading(v);
+	v->HandleLoading();
 
 	if (v->current_order.type == OT_LOADING) return;
 
@@ -1317,7 +1315,7 @@
 		v->direction = DiagDirToDir(dir);
 
 		tdir = _roadveh_depot_exit_trackdir[dir];
-		rdp = _road_drive_data[(_opt.road_side << RVS_DRIVE_SIDE) + tdir];
+		rdp = _road_drive_data[v->u.road.roadtype][(_opt.road_side << RVS_DRIVE_SIDE) + tdir];
 
 		x = TileX(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].x & 0xF);
 		y = TileY(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].y & 0xF);
@@ -1335,7 +1333,7 @@
 		v->u.road.frame = RVC_DEPOT_START_FRAME;
 
 		v->cur_image = GetRoadVehImage(v, v->direction);
-		UpdateRoadVehDeltaXY(v);
+		v->UpdateDeltaXY(v->direction);
 		SetRoadVehPosition(v,x,y);
 
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
@@ -1371,7 +1369,7 @@
 		if ((IsTunnelTile(gp.new_tile) || IsBridgeTile(gp.new_tile)) && HASBIT(VehicleEnterTile(v, gp.new_tile, gp.x, gp.y), VETS_ENTERED_WORMHOLE)) {
 			/* Vehicle has just entered a bridge or tunnel */
 			v->cur_image = GetRoadVehImage(v, v->direction);
-			UpdateRoadVehDeltaXY(v);
+			v->UpdateDeltaXY(v->direction);
 			SetRoadVehPosition(v,gp.x,gp.y);
 			return;
 		}
@@ -1386,7 +1384,7 @@
 	/* Get move position data for next frame.
 	 * For a drive-through road stop use 'straight road' move data.
 	 * In this case v->u.road.state is masked to give the road stop entry direction. */
-	rd = _road_drive_data[(
+	rd = _road_drive_data[v->u.road.roadtype][(
 		(HASBIT(v->u.road.state, RVS_IN_DT_ROAD_STOP) ? v->u.road.state & RVSB_ROAD_STOP_TRACKDIR_MASK : v->u.road.state) +
 		(_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking][v->u.road.frame + 1];
 
@@ -1405,11 +1403,30 @@
 again:
 		if (IsReversingRoadTrackdir(dir)) {
 			/* Turning around */
-			tile = v->tile;
+			if (v->u.road.roadtype == ROADTYPE_TRAM) {
+				RoadBits needed; // The road bits the tram needs to be able to turn around
+				switch (dir) {
+					default: NOT_REACHED();
+					case TRACKDIR_RVREV_NE: needed = ROAD_SW; break;
+					case TRACKDIR_RVREV_SE: needed = ROAD_NW; break;
+					case TRACKDIR_RVREV_SW: needed = ROAD_NE; break;
+					case TRACKDIR_RVREV_NW: needed = ROAD_SE; break;
+				}
+				if (!IsTileType(tile, MP_STREET) || GetRoadTileType(tile) != ROAD_TILE_NORMAL || (needed & GetRoadBits(tile, ROADTYPE_TRAM)) == ROAD_NONE) {
+					/* The tram cannot turn here */
+					v->cur_speed = 0;
+					return;
+				}
+			} else if (IsTileType(v->tile, MP_STREET) && GetRoadTileType(v->tile) == ROAD_TILE_NORMAL && GetDisallowedRoadDirections(v->tile) != DRD_NONE) {
+				v->cur_speed = 0;
+				return;
+			} else {
+				tile = v->tile;
+			}
 		}
 
 		/* Get position data for first frame on the new tile */
-		rdp = _road_drive_data[(dir + (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking];
+		rdp = _road_drive_data[v->u.road.roadtype][(dir + (_opt.road_side << RVS_DRIVE_SIDE)) ^ v->u.road.overtaking];
 
 		x = TileX(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].x;
 		y = TileY(tile) * TILE_SIZE + rdp[RVC_DEFAULT_START_FRAME].y;
@@ -1459,7 +1476,7 @@
 		}
 
 		v->cur_image = GetRoadVehImage(v, newdir);
-		UpdateRoadVehDeltaXY(v);
+		v->UpdateDeltaXY(v->direction);
 		RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
 		return;
 	}
@@ -1476,7 +1493,7 @@
 			return;
 		}
 
-		rdp = _road_drive_data[(_opt.road_side << RVS_DRIVE_SIDE) + dir];
+		rdp = _road_drive_data[v->u.road.roadtype][(_opt.road_side << RVS_DRIVE_SIDE) + dir];
 
 		x = TileX(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].x;
 		y = TileY(v->tile) * TILE_SIZE + rdp[RVC_TURN_AROUND_START_FRAME].y;
@@ -1499,7 +1516,7 @@
 		}
 
 		v->cur_image = GetRoadVehImage(v, newdir);
-		UpdateRoadVehDeltaXY(v);
+		v->UpdateDeltaXY(v->direction);
 		RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
 		return;
 	}
@@ -1516,6 +1533,7 @@
 		Vehicle* u = RoadVehFindCloseTo(v, x, y, new_dir);
 
 		if (u != NULL) {
+			v->cur_speed = u->cur_speed;
 			/* There is a vehicle in front overtake it if possible */
 			if (v->u.road.overtaking == 0) RoadVehCheckOvertake(v, u);
 			return;
@@ -1529,7 +1547,7 @@
 		if (old_dir != v->u.road.state) {
 			/* The vehicle is in a road stop */
 			v->cur_image = GetRoadVehImage(v, new_dir);
-			UpdateRoadVehDeltaXY(v);
+			v->UpdateDeltaXY(v->direction);
 			SetRoadVehPosition(v, v->x_pos, v->y_pos);
 			/* Note, return here means that the frame counter is not incremented
 			 * for vehicles changing direction in a road stop. This causes frames to
@@ -1559,14 +1577,11 @@
 		if (v->current_order.type != OT_LEAVESTATION &&
 				v->current_order.type != OT_GOTO_DEPOT) {
 			/* Vehicle has arrived at a bay in a road stop */
-			Order old_order;
 
 			if (IsDriveThroughStopTile(v->tile)) {
 				TileIndex next_tile = TILE_ADD(v->tile, TileOffsByDir(v->direction));
 				RoadStop::Type type = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK;
 
-				assert(HASBIT(v->u.road.state, RVS_IS_STOPPING));
-
 				/* Check if next inline bay is free */
 				if (IsDriveThroughStopTile(next_tile) && (GetRoadStopType(next_tile) == type)) {
 					RoadStop *rs_n = GetRoadStopByTile(next_tile, type);
@@ -1591,23 +1606,8 @@
 			v->last_station_visited = GetStationIndex(v->tile);
 
 			RoadVehArrivesAt(v, st);
-
-			old_order = v->current_order;
 			v->BeginLoading();
-			v->current_order.flags = 0;
 
-			if (old_order.type == OT_GOTO_STATION &&
-					v->current_order.dest == v->last_station_visited) {
-				v->current_order.flags =
-					(old_order.flags & (OF_FULL_LOAD | OF_UNLOAD | OF_TRANSFER)) | OF_NON_STOP;
-			}
-
-			SET_EXPENSES_TYPE(EXPENSES_ROADVEH_INC);
-			if (LoadUnloadVehicle(v, true)) {
-				InvalidateWindow(WC_ROADVEH_LIST, v->owner);
-				MarkRoadVehDirty(v);
-			}
-			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 			return;
 		}
 
@@ -1628,9 +1628,9 @@
 			/* We are leaving the correct station */
 			ClearSlot(v);
 		} else if (v->u.road.slot != NULL) {
-			/* We are leaving the wrong station */
-			//XXX The question is .. what to do? Actually we shouldn't be here
-			//but I guess we need to clear the slot
+			/* We are leaving the wrong station
+			 * XXX The question is .. what to do? Actually we shouldn't be here
+			 * but I guess we need to clear the slot */
 			DEBUG(ms, 0, "Vehicle %d (index %d) arrived at wrong stop", v->unitnumber, v->index);
 			if (v->tile != v->dest_tile) {
 				DEBUG(ms, 2, " current tile 0x%X is not destination tile 0x%X. Route problem", v->tile, v->dest_tile);
@@ -1667,7 +1667,7 @@
 	if (!HASBIT(r, VETS_ENTERED_WORMHOLE)) v->u.road.frame++;
 
 	v->cur_image = GetRoadVehImage(v, v->direction);
-	UpdateRoadVehDeltaXY(v);
+	v->UpdateDeltaXY(v->direction);
 	RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y));
 }
 
@@ -1692,13 +1692,13 @@
 	if (v->vehstatus & VS_STOPPED) return;
 	if (_patches.gotodepot && VehicleHasDepotOrders(v)) return;
 
-	// Don't interfere with a depot visit scheduled by the user, or a
-	// depot visit by the order list.
+	/* Don't interfere with a depot visit scheduled by the user, or a
+	 * depot visit by the order list. */
 	if (v->current_order.type == OT_GOTO_DEPOT &&
 			(v->current_order.flags & (OF_HALT_IN_DEPOT | OF_PART_OF_ORDERS)) != 0)
 		return;
 
-	// If we already got a slot at a stop, use that FIRST, and go to a depot later
+	/* If we already got a slot at a stop, use that FIRST, and go to a depot later */
 	if (v->u.road.slot != NULL) return;
 
 	if (IsRoadVehInDepot(v)) {
@@ -1706,7 +1706,7 @@
 		return;
 	}
 
-	// XXX If we already have a depot order, WHY do we search over and over?
+	/* XXX If we already have a depot order, WHY do we search over and over? */
 	depot = FindClosestRoadDepot(v);
 
 	if (depot == NULL || DistanceManhattan(v->tile, depot->xy) > 12) {
@@ -1724,6 +1724,9 @@
 		return;
 	}
 
+	if (v->current_order.type == OT_LOADING) v->LeaveStation();
+	ClearSlot(v);
+
 	v->current_order.type = OT_GOTO_DEPOT;
 	v->current_order.flags = OF_NON_STOP;
 	v->current_order.dest = depot->index;
@@ -1743,7 +1746,7 @@
 
 	CheckOrders(v);
 
-	//Current slot has expired
+	/* Current slot has expired */
 	if (v->current_order.type == OT_GOTO_STATION && v->u.road.slot != NULL && v->u.road.slot_age-- == 0) {
 		DEBUG(ms, 3, "Slot expired for vehicle %d (index %d) at stop 0x%X",
 			v->unitnumber, v->index, v->u.road.slot->xy);
@@ -1838,10 +1841,13 @@
 
 /** Refit a road vehicle to the specified cargo type
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 Vehicle ID of the vehicle to refit
  * @param p2 Bitstuffed elements
  * - p2 = (bit 0-7) - the new cargo type to refit to
  * - p2 = (bit 8-15) - the new cargo subtype to refit to
+ * - p2 = (bit 16) - refit only this vehicle (ignored)
+ * @return cost of refit or error
  */
 int32 CmdRefitRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -1886,7 +1892,7 @@
 		 * carry twice as much mail/goods as normal cargo, and four times as
 		 * many passengers
 		 */
-		capacity = rvi->capacity;
+		capacity = GetVehicleProperty(v, 0x0F, rvi->capacity);
 		switch (old_cid) {
 			case CT_PASSENGERS: break;
 			case CT_MAIL:
--- a/src/roadveh_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/roadveh_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file roadveh_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -34,7 +36,7 @@
 		StringID str;
 
 		SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-		// disable service-scroller when interval is set to disabled
+		/* disable service-scroller when interval is set to disabled */
 		SetWindowWidgetDisabledState(w, 5, !_patches.servint_roadveh);
 		SetWindowWidgetDisabledState(w, 6, !_patches.servint_roadveh);
 
@@ -190,7 +192,7 @@
 		bool is_localplayer = v->owner == _local_player;
 
 		SetWindowWidgetDisabledState(w,  7, !is_localplayer);
-		SetWindowWidgetDisabledState(w,  8, !is_localplayer);
+		SetWindowWidgetDisabledState(w,  8, !is_localplayer || v->u.road.roadtype == ROADTYPE_TRAM);
 		SetWindowWidgetDisabledState(w, 11, !is_localplayer);
 		/* Disable refit button if vehicle not refittable */
 		SetWindowWidgetDisabledState(w, 12, !is_localplayer ||
@@ -344,7 +346,7 @@
 
 	if (w != NULL) {
 		w->caption_color = v->owner;
-		AssignWindowViewport(w, 3, 17, 0xE2, 0x54, w->window_number | (1 << 31), 0);
+		AssignWindowViewport(w, 3, 17, 0xE2, 0x54, w->window_number | (1 << 31), ZOOM_LVL_ROADVEH);
 	}
 }
 
--- a/src/saveload.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/saveload.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -27,8 +27,9 @@
 #include "network/network.h"
 #include "variables.h"
 #include <setjmp.h>
+#include <list>
 
-extern const uint16 SAVEGAME_VERSION = 53;
+extern const uint16 SAVEGAME_VERSION = 64;
 uint16 _sl_version;       ///< the major savegame version identifier
 byte   _sl_minor_version; ///< the minor savegame version, DO NOT USE!
 
@@ -251,14 +252,14 @@
 		if (i >= (1 << 14)) {
 			if (i >= (1 << 21)) {
 				assert(i < (1 << 28));
-				SlWriteByte((byte)0xE0 | (i>>24));
-				SlWriteByte((byte)(i>>16));
+				SlWriteByte((byte)0xE0 | (i >> 24));
+				SlWriteByte((byte)(i >> 16));
 			} else {
-				SlWriteByte((byte)0xC0 | (i>>16));
+				SlWriteByte((byte)0xC0 | (i >> 16));
 			}
-			SlWriteByte((byte)(i>>8));
+			SlWriteByte((byte)(i >> 8));
 		} else {
-			SlWriteByte((byte)(0x80 | (i>>8)));
+			SlWriteByte((byte)(0x80 | (i >> 8)));
 		}
 	}
 	SlWriteByte(i);
@@ -412,8 +413,8 @@
 /** Write the value of a setting
  * @param ptr pointer to the variable
  * @param conv type of variable, can be a non-clean type, eg
- * with other flags. It is parsed upon read
- * @param var the new value being given to the variable */
+ *             with other flags. It is parsed upon read
+ * @param val the new value being given to the variable */
 void WriteValue(void *ptr, VarType conv, int64 val)
 {
 	switch (GetVarMemType(conv)) {
@@ -498,6 +499,7 @@
  * by SlCalcNetStringLen and the length that the index will occupy.
  * @param ptr pointer to the stringbuffer
  * @param length maximum length of the string (buffer size, etc.)
+ * @param conv type of data been used
  * @return return the gross length of the string */
 static inline size_t SlCalcStringLen(const void *ptr, size_t length, VarType conv)
 {
@@ -525,7 +527,7 @@
 /**
  * Save/Load a string.
  * @param ptr the string being manipulated
- * @param the length of the string (full length)
+ * @param length of the string (full length)
  * @param conv must be SLE_FILE_STRING */
 static void SlString(void *ptr, size_t length, VarType conv)
 {
@@ -626,6 +628,61 @@
 	}
 }
 
+
+static uint ReferenceToInt(const void* obj, SLRefType rt);
+static void* IntToReference(uint index, SLRefType rt);
+
+
+/**
+ * Return the size in bytes of a list
+ * @param list The std::list to find the size of
+ */
+static inline size_t SlCalcListLen(const void *list)
+{
+	std::list<void *> *l = (std::list<void *> *) list;
+
+	/* Each entry is saved as 2 bytes, plus 2 bytes are used for the length
+	 * of the list */
+	return l->size() * 2 + 2;
+}
+
+
+/**
+ * Save/Load a list.
+ * @param list The list being manipulated
+ * @param conv SLRefType type of the list (Vehicle *, Station *, etc)
+ */
+void SlList(void *list, SLRefType conv)
+{
+	/* Automatically calculate the length? */
+	if (_sl.need_length != NL_NONE) {
+		SlSetLength(SlCalcListLen(list));
+		/* Determine length only? */
+		if (_sl.need_length == NL_CALCLENGTH) return;
+	}
+
+	std::list<void *> *l = (std::list<void *> *) list;
+
+	if (_sl.save) {
+		SlWriteUint16(l->size());
+
+		std::list<void *>::iterator iter;
+		for (iter = l->begin(); iter != l->end(); ++iter) {
+			void *ptr = *iter;
+			SlWriteUint16(ReferenceToInt(ptr, conv));
+		}
+	} else {
+		uint length = SlReadUint16();
+
+		/* Load each reference and push to the end of the list */
+		for (uint i = 0; i < length; i++) {
+			void *ptr = IntToReference(SlReadUint16(), conv);
+			l->push_back(ptr);
+		}
+	}
+}
+
+
 /** Are we going to save this object or not? */
 static inline bool SlIsObjectValidInSavegame(const SaveLoad *sld)
 {
@@ -650,7 +707,9 @@
 
 /**
  * Calculate the size of an object.
+ * @param object to be measured
  * @param sld The SaveLoad description of the object so we know how to manipulate it
+ * @return size of given objetc
  */
 static size_t SlCalcObjLength(const void *object, const SaveLoad *sld)
 {
@@ -672,6 +731,7 @@
 		case SL_REF:
 		case SL_ARR:
 		case SL_STR:
+		case SL_LST:
 			/* CONDITIONAL saveload types depend on the savegame version */
 			if (!SlIsObjectValidInSavegame(sld)) break;
 
@@ -680,6 +740,7 @@
 			case SL_REF: return SlCalcRefLen();
 			case SL_ARR: return SlCalcArrayLen(sld->length, sld->conv);
 			case SL_STR: return SlCalcStringLen(GetVariableAddress(object, sld), sld->length, sld->conv);
+			case SL_LST: return SlCalcListLen(GetVariableAddress(object, sld));
 			default: NOT_REACHED();
 			}
 			break;
@@ -691,10 +752,6 @@
 }
 
 
-static uint ReferenceToInt(const void* obj, SLRefType rt);
-static void* IntToReference(uint index, SLRefType rt);
-
-
 bool SlObjectMember(void *ptr, const SaveLoad *sld)
 {
 	VarType conv = GB(sld->conv, 0, 8);
@@ -703,6 +760,7 @@
 	case SL_REF:
 	case SL_ARR:
 	case SL_STR:
+	case SL_LST:
 		/* CONDITIONAL saveload types depend on the savegame version */
 		if (!SlIsObjectValidInSavegame(sld)) return false;
 		if (SlSkipVariableOnLoad(sld)) return false;
@@ -719,6 +777,7 @@
 			break;
 		case SL_ARR: SlArray(ptr, sld->length, conv); break;
 		case SL_STR: SlString(ptr, sld->length, conv); break;
+		case SL_LST: SlList(ptr, (SLRefType)conv); break;
 		default: NOT_REACHED();
 		}
 		break;
@@ -768,7 +827,7 @@
 
 /**
  * Save or Load (a list of) global variables
- * @param desc The global variable that is being loaded or saved
+ * @param sldg The global variable that is being loaded or saved
  */
 void SlGlobList(const SaveLoadGlobVarList *sldg)
 {
@@ -922,7 +981,7 @@
 {
 	const ChunkHandler *ch;
 	const ChunkHandler *const *chsc;
-	for (chsc = _sl.chs; (ch=*chsc++) != NULL;) {
+	for (chsc = _sl.chs; (ch = *chsc++) != NULL;) {
 		for (;;) {
 			if (ch->id == id) return ch;
 			if (ch->flags & CH_LAST) break;
@@ -1027,7 +1086,7 @@
 static bool InitNoComp()
 {
 	_sl.bufsize = LZO_SIZE;
-	_sl.buf = _sl.buf_ori =(byte*)malloc(LZO_SIZE);
+	_sl.buf = _sl.buf_ori = (byte*)malloc(LZO_SIZE);
 	return true;
 }
 
@@ -1198,6 +1257,7 @@
 extern const ChunkHandler _economy_chunk_handlers[];
 extern const ChunkHandler _animated_tile_chunk_handlers[];
 extern const ChunkHandler _newgrf_chunk_handlers[];
+extern const ChunkHandler _group_chunk_handlers[];
 
 static const ChunkHandler * const _chunk_handlers[] = {
 	_misc_chunk_handlers,
@@ -1215,6 +1275,7 @@
 	_player_chunk_handlers,
 	_animated_tile_chunk_handlers,
 	_newgrf_chunk_handlers,
+	_group_chunk_handlers,
 	NULL,
 };
 
--- a/src/saveload.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/saveload.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file saveload.h */
+
 #ifndef SAVELOAD_H
 #define SAVELOAD_H
 
@@ -10,9 +12,9 @@
 #define SIZE_MAX ((size_t)-1)
 
 enum SaveOrLoadResult {
-	SL_OK     = 0, // completed successfully
-	SL_ERROR  = 1, // error that was caught before internal structures were modified
-	SL_REINIT = 2, // error that was caught in the middle of updating game state, need to clear it. (can only happen during load)
+	SL_OK     = 0, ///< completed successfully
+	SL_ERROR  = 1, ///< error that was caught before internal structures were modified
+	SL_REINIT = 2, ///< error that was caught in the middle of updating game state, need to clear it. (can only happen during load)
 };
 
 enum SaveOrLoadMode {
@@ -157,6 +159,7 @@
 	SL_REF       =  1,
 	SL_ARR       =  2,
 	SL_STR       =  3,
+	SL_LST       =  4,
 	// non-normal save-load types
 	SL_WRITEBYTE =  8,
 	SL_INCLUDE   =  9,
@@ -188,11 +191,13 @@
 #define SLE_CONDREF(base, variable, type, from, to) SLE_GENERAL(SL_REF, base, variable, type, 0, from, to)
 #define SLE_CONDARR(base, variable, type, length, from, to) SLE_GENERAL(SL_ARR, base, variable, type, length, from, to)
 #define SLE_CONDSTR(base, variable, type, length, from, to) SLE_GENERAL(SL_STR, base, variable, type, length, from, to)
+#define SLE_CONDLST(base, variable, type, from, to) SLE_GENERAL(SL_LST, base, variable, type, 0, from, to)
 
 #define SLE_VAR(base, variable, type) SLE_CONDVAR(base, variable, type, 0, SL_MAX_VERSION)
 #define SLE_REF(base, variable, type) SLE_CONDREF(base, variable, type, 0, SL_MAX_VERSION)
 #define SLE_ARR(base, variable, type, length) SLE_CONDARR(base, variable, type, length, 0, SL_MAX_VERSION)
 #define SLE_STR(base, variable, type, length) SLE_CONDSTR(base, variable, type, length, 0, SL_MAX_VERSION)
+#define SLE_LST(base, variable, type) SLE_CONDLST(base, variable, type, 0, SL_MAX_VERSION)
 
 #define SLE_CONDNULL(length, from, to) SLE_CONDARR(NullStruct, null, SLE_FILE_U8 | SLE_VAR_NULL | SLF_CONFIG_NO, length, from, to)
 
@@ -222,11 +227,13 @@
 #define SLEG_CONDREF(variable, type, from, to) SLEG_GENERAL(SL_REF, variable, type, 0, from, to)
 #define SLEG_CONDARR(variable, type, length, from, to) SLEG_GENERAL(SL_ARR, variable, type, length, from, to)
 #define SLEG_CONDSTR(variable, type, length, from, to) SLEG_GENERAL(SL_STR, variable, type, length, from, to)
+#define SLEG_CONDLST(variable, type, from, to) SLEG_GENERAL(SL_LST, variable, type, 0, from, to)
 
 #define SLEG_VAR(variable, type) SLEG_CONDVAR(variable, type, 0, SL_MAX_VERSION)
 #define SLEG_REF(variable, type) SLEG_CONDREF(variable, type, 0, SL_MAX_VERSION)
 #define SLEG_ARR(variable, type) SLEG_CONDARR(variable, type, lengthof(variable), 0, SL_MAX_VERSION)
 #define SLEG_STR(variable, type) SLEG_CONDSTR(variable, type, lengthof(variable), 0, SL_MAX_VERSION)
+#define SLEG_LST(variable, type) SLEG_CONDLST(variable, type, 0, SL_MAX_VERSION)
 
 #define SLEG_CONDNULL(length, from, to) {SL_ARR, SLE_FILE_U8 | SLE_VAR_NULL | SLF_CONFIG_NO, length, from, to, (void*)NULL}
 
--- a/src/screenshot.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/screenshot.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -20,7 +20,7 @@
 uint _cur_screenshot_format;
 ScreenshotType current_screenshot_type;
 
-// called by the ScreenShot proc to generate screenshot lines.
+/* called by the ScreenShot proc to generate screenshot lines. */
 typedef void ScreenshotCallback(void *userdata, Pixel *buf, uint y, uint pitch, uint n);
 typedef bool ScreenshotHandlerProc(const char *name, ScreenshotCallback *callb, void *userdata, uint w, uint h, int pixelformat, const Colour *palette);
 
@@ -62,7 +62,7 @@
 };
 assert_compile(sizeof(RgbQuad) == 4);
 
-// generic .BMP writer
+/* generic .BMP writer */
 static bool MakeBmpImage(const char *name, ScreenshotCallback *callb, void *userdata, uint w, uint h, int pixelformat, const Colour *palette)
 {
 	BitmapFileHeader bfh;
@@ -72,23 +72,23 @@
 	uint i, padw;
 	uint n, maxlines;
 
-	// only implemented for 8bit images so far.
+	/* only implemented for 8bit images so far. */
 	if (pixelformat != 8)
 		return false;
 
 	f = fopen(name, "wb");
 	if (f == NULL) return false;
 
-	// each scanline must be aligned on a 32bit boundary
+	/* each scanline must be aligned on a 32bit boundary */
 	padw = ALIGN(w, 4);
 
-	// setup the file header
+	/* setup the file header */
 	bfh.type = TO_LE16('MB');
 	bfh.size = TO_LE32(sizeof(bfh) + sizeof(bih) + sizeof(RgbQuad) * 256 + padw * h);
 	bfh.reserved = 0;
 	bfh.off_bits = TO_LE32(sizeof(bfh) + sizeof(bih) + sizeof(RgbQuad) * 256);
 
-	// setup the info header
+	/* setup the info header */
 	bih.size = TO_LE32(sizeof(BitmapInfoHeader));
 	bih.width = TO_LE32(w);
 	bih.height = TO_LE32(h);
@@ -101,7 +101,7 @@
 	bih.clrused = 0;
 	bih.clrimp = 0;
 
-	// convert the palette to the windows format
+	/* convert the palette to the windows format */
 	for (i = 0; i != 256; i++) {
 		rq[i].red   = palette[i].r;
 		rq[i].green = palette[i].g;
@@ -109,15 +109,15 @@
 		rq[i].reserved = 0;
 	}
 
-	// write file header and info header and palette
+	/* write file header and info header and palette */
 	if (fwrite(&bfh, sizeof(bfh), 1, f) != 1) return false;
 	if (fwrite(&bih, sizeof(bih), 1, f) != 1) return false;
 	if (fwrite(rq, sizeof(rq), 1, f) != 1) return false;
 
-	// use by default 64k temp memory
+	/* use by default 64k temp memory */
 	maxlines = clamp(65536 / padw, 16, 128);
 
-	// now generate the bitmap bits
+	/* now generate the bitmap bits */
 	Pixel *buff = MallocT<Pixel>(padw * maxlines); // by default generate 128 lines at a time.
 	if (buff == NULL) {
 		fclose(f);
@@ -125,16 +125,16 @@
 	}
 	memset(buff, 0, padw * maxlines); // zero the buffer to have the padding bytes set to 0
 
-	// start at the bottom, since bitmaps are stored bottom up.
+	/* start at the bottom, since bitmaps are stored bottom up. */
 	do {
-		// determine # lines
+		/* determine # lines */
 		n = min(h, maxlines);
 		h -= n;
 
-		// render the pixels
+		/* render the pixels */
 		callb(userdata, buff, h, padw, n);
 
-		// write each line
+		/* write each line */
 		while (n)
 			if (fwrite(buff + (--n) * padw, padw, 1, f) != 1) {
 				free(buff);
@@ -175,7 +175,7 @@
 	png_structp png_ptr;
 	png_infop info_ptr;
 
-	// only implemented for 8bit images so far.
+	/* only implemented for 8bit images so far. */
 	if (pixelformat != 8)
 		return false;
 
@@ -209,7 +209,7 @@
 	png_set_IHDR(png_ptr, info_ptr, w, h, pixelformat, PNG_COLOR_TYPE_PALETTE,
 		PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
 
-	// convert the palette to the .PNG format.
+	/* convert the palette to the .PNG format. */
 	for (i = 0; i != 256; i++) {
 		rq[i].red   = palette[i].r;
 		rq[i].green = palette[i].g;
@@ -220,10 +220,10 @@
 	png_write_info(png_ptr, info_ptr);
 	png_set_flush(png_ptr, 512);
 
-	// use by default 64k temp memory
+	/* use by default 64k temp memory */
 	maxlines = clamp(65536 / w, 16, 128);
 
-	// now generate the bitmap bits
+	/* now generate the bitmap bits */
 	Pixel *buff = MallocT<Pixel>(w * maxlines); // by default generate 128 lines at a time.
 	if (buff == NULL) {
 		png_destroy_write_struct(&png_ptr, &info_ptr);
@@ -234,14 +234,14 @@
 
 	y = 0;
 	do {
-		// determine # lines to write
+		/* determine # lines to write */
 		n = min(h - y, maxlines);
 
-		// render the pixels into the buffer
+		/* render the pixels into the buffer */
 		callb(userdata, buff, y, w, n);
 		y += n;
 
-		// write them to png
+		/* write them to png */
 		for (i = 0; i != n; i++)
 			png_write_row(png_ptr, buff + i * w);
 	} while (y != h);
@@ -268,7 +268,7 @@
 	uint32 unused;
 	uint16 xmax, ymax;
 	uint16 hdpi, vdpi;
-	byte pal_small[16*3];
+	byte pal_small[16 * 3];
 	byte reserved;
 	byte planes;
 	uint16 pitch;
@@ -295,7 +295,7 @@
 
 	memset(&pcx, 0, sizeof(pcx));
 
-	// setup pcx header
+	/* setup pcx header */
 	pcx.manufacturer = 10;
 	pcx.version = 5;
 	pcx.rle = 1;
@@ -310,16 +310,16 @@
 	pcx.width = pcx.pitch = TO_LE16(w);
 	pcx.height = TO_LE16(h);
 
-	// write pcx header
+	/* write pcx header */
 	if (fwrite(&pcx, sizeof(pcx), 1, f) != 1) {
 		fclose(f);
 		return false;
 	}
 
-	// use by default 64k temp memory
+	/* use by default 64k temp memory */
 	maxlines = clamp(65536 / w, 16, 128);
 
-	// now generate the bitmap bits
+	/* now generate the bitmap bits */
 	Pixel *buff = MallocT<Pixel>(w * maxlines); // by default generate 128 lines at a time.
 	if (buff == NULL) {
 		fclose(f);
@@ -329,22 +329,22 @@
 
 	y = 0;
 	do {
-		// determine # lines to write
+		/* determine # lines to write */
 		uint n = min(h - y, maxlines);
 		uint i;
 
-		// render the pixels into the buffer
+		/* render the pixels into the buffer */
 		callb(userdata, buff, y, w, n);
 		y += n;
 
-		// write them to pcx
+		/* write them to pcx */
 		for (i = 0; i != n; i++) {
 			const Pixel* bufp = buff + i * w;
 			byte runchar = bufp[0];
 			uint runcount = 1;
 			uint j;
 
-			// for each pixel...
+			/* for each pixel... */
 			for (j = 1; j < w; j++) {
 				Pixel ch = bufp[j];
 
@@ -366,7 +366,7 @@
 				runcount++;
 			}
 
-			// write remaining bytes..
+			/* write remaining bytes.. */
 			if (runcount > 1 || (runchar & 0xC0) == 0xC0)
 				if (fputc(0xC0 | runcount, f) == EOF) {
 					free(buff);
@@ -383,7 +383,7 @@
 
 	free(buff);
 
-	// write 8-bit color palette
+	/* write 8-bit color palette */
 	if (fputc(12, f) == EOF) {
 		fclose(f);
 		return false;
@@ -445,17 +445,17 @@
 	strcpy(_screenshot_format_name, _screenshot_formats[i].extension);
 }
 
-// screenshot generator that dumps the current video buffer
+/* screenshot generator that dumps the current video buffer */
 static void CurrentScreenCallback(void *userdata, Pixel *buf, uint y, uint pitch, uint n)
 {
 	for (; n > 0; --n) {
-		memcpy(buf, _screen.dst_ptr + y * _screen.pitch, _screen.width);
+		memcpy(buf, _screen.dst_ptr + y * _screen.pitch, _screen.width * sizeof(Pixel));
 		++y;
 		buf += pitch;
 	}
 }
 
-// generate a large piece of the world
+/* generate a large piece of the world */
 static void LargeWorldCallback(void *userdata, Pixel *buf, uint y, uint pitch, uint n)
 {
 	ViewPort *vp = (ViewPort *)userdata;
@@ -469,7 +469,7 @@
 	dpi.height = n;
 	dpi.width = vp->width;
 	dpi.pitch = pitch;
-	dpi.zoom = 0;
+	dpi.zoom = ZOOM_LVL_WORLD_SCREENSHOT;
 	dpi.left = 0;
 	dpi.top = y;
 
@@ -479,10 +479,10 @@
 		left += wx;
 
 		ViewportDoDraw(vp,
-			((left - wx - vp->left) << vp->zoom) + vp->virtual_left,
-			((y - vp->top) << vp->zoom) + vp->virtual_top,
-			((left - vp->left) << vp->zoom) + vp->virtual_left,
-			(((y + n) - vp->top) << vp->zoom) + vp->virtual_top
+			ScaleByZoom(left - wx - vp->left, vp->zoom) + vp->virtual_left,
+			ScaleByZoom(y - vp->top, vp->zoom) + vp->virtual_top,
+			ScaleByZoom(left - vp->left, vp->zoom) + vp->virtual_left,
+			ScaleByZoom((y + n) - vp->top, vp->zoom) + vp->virtual_top
 		);
 	}
 
@@ -540,7 +540,7 @@
 	ViewPort vp;
 	const ScreenshotFormat *sf;
 
-	vp.zoom = 0;
+	vp.zoom = ZOOM_LVL_WORLD_SCREENSHOT;
 	vp.left = 0;
 	vp.top = 0;
 	vp.virtual_left = -(int)MapMaxX() * TILE_PIXELS;
--- a/src/screenshot.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/screenshot.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file screenshot.h */
+
 #ifndef SCREENSHOT_H
 #define SCREENSHOT_H
 
--- a/src/sdl.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/sdl.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file sdl.cpp */
+
 #include "stdafx.h"
 
 #ifdef WITH_SDL
--- a/src/sdl.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/sdl.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file sdl.h */
+
 #ifndef SDL_H
 #define SDL_H
 
--- a/src/settings.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/settings.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,6 +1,6 @@
 /* $Id$ */
 
-/** @file
+/** @file settings.cpp
  * All actions handling saving and loading of the settings/configuration goes on in this file.
  * The file consists of four parts:
  * <ol>
@@ -95,10 +95,10 @@
 
 	size = ALIGN(size, sizeof(void*));
 
-	// first check if there's memory in the next pool
+	/* first check if there's memory in the next pool */
 	if (p->next && p->next->pos + size <= p->next->size) {
 		p = p->next;
-	// then check if there's not memory in the cur pool
+	/* then check if there's not memory in the cur pool */
 	} else if (p->pos + size > p->size) {
 		SettingsMemoryPool *n = pool_new(size);
 		*pool = n;
@@ -130,7 +130,7 @@
 	}
 }
 
-// structs describing the ini format.
+/** structs describing the ini format. */
 struct IniItem {
 	char *name;
 	char *value;
@@ -139,21 +139,21 @@
 };
 
 struct IniGroup {
-	char *name; // name of group
-	char *comment; //comment for group
+	char *name;        ///< name of group
+	char *comment;     ///<comment for group
 	IniItem *item, **last_item;
 	IniGroup *next;
 	IniFile *ini;
-	IniGroupType type; // type of group
+	IniGroupType type; ///< type of group
 };
 
 struct IniFile {
 	SettingsMemoryPool *pool;
 	IniGroup *group, **last_group;
-	char *comment; // last comment in file
+	char *comment;     ///< last comment in file
 };
 
-// allocate an inifile object
+/** allocate an inifile object */
 static IniFile *ini_alloc()
 {
 	IniFile *ini;
@@ -167,7 +167,7 @@
 	return ini;
 }
 
-// allocate an ini group object
+/** allocate an ini group object */
 static IniGroup *ini_group_alloc(IniFile *ini, const char *grpt, int len)
 {
 	IniGroup *grp = (IniGroup*)pool_alloc(&ini->pool, sizeof(IniGroup));
@@ -199,7 +199,7 @@
 	return item;
 }
 
-// load an ini file into the "abstract" format
+/** load an ini file into the "abstract" format */
 static IniFile *ini_load(const char *filename)
 {
 	char buffer[1024], c, *s, *t, *e;
@@ -217,23 +217,23 @@
 	in = fopen(filename, "r");
 	if (in == NULL) return ini;
 
-	// for each line in the file
+	/* for each line in the file */
 	while (fgets(buffer, sizeof(buffer), in)) {
 
-		// trim whitespace from the left side
+		/* trim whitespace from the left side */
 		for (s = buffer; *s == ' ' || *s == '\t'; s++);
 
-		// trim whitespace from right side.
+		/* trim whitespace from right side. */
 		e = s + strlen(s);
 		while (e > s && ((c=e[-1]) == '\n' || c == '\r' || c == ' ' || c == '\t')) e--;
 		*e = '\0';
 
-		// skip comments and empty lines
+		/* skip comments and empty lines */
 		if (*s == '#' || *s == ';' || *s == '\0') {
 			uint ns = comment_size + (e - s + 1);
 			uint a = comment_alloc;
 			uint pos;
-			// add to comment
+			/* add to comment */
 			if (ns > a) {
 				a = max(a, 128U);
 				do a*=2; while (a < ns);
@@ -246,7 +246,7 @@
 			continue;
 		}
 
-		// it's a group?
+		/* it's a group? */
 		if (s[0] == '[') {
 			if (e[-1] != ']') {
 				ShowInfoF("ini: invalid group name '%s'", buffer);
@@ -260,30 +260,36 @@
 				comment_size = 0;
 			}
 		} else if (group) {
-			// find end of keyname
-			for (t = s; *t != '\0' && *t != '=' && *t != '\t' && *t != ' '; t++);
+			/* find end of keyname */
+			if (*s == '\"') {
+				s++;
+				for (t = s; *t != '\0' && *t != '\"'; t++);
+				if (*t == '\"') *t = ' ';
+			} else {
+				for (t = s; *t != '\0' && *t != '=' && *t != '\t' && *t != ' '; t++);
+			}
 
-			// it's an item in an existing group
+			/* it's an item in an existing group */
 			item = ini_item_alloc(group, s, t-s);
 			if (comment_size) {
 				item->comment = (char*)pool_strdup(&ini->pool, comment, comment_size);
 				comment_size = 0;
 			}
 
-			// find start of parameter
+			/* find start of parameter */
 			while (*t == '=' || *t == ' ' || *t == '\t') t++;
 
 
-			// remove starting quotation marks
+			/* remove starting quotation marks */
 			if (*t == '\"') t++;
-			// remove ending quotation marks
+			/* remove ending quotation marks */
 			e = t + strlen(t);
 			if (e > t && e[-1] == '\"') e--;
 			*e = '\0';
 
 			item->value = (char*)pool_strdup(&ini->pool, t, e - t);
 		} else {
-			// it's an orphan item
+			/* it's an orphan item */
 			ShowInfoF("ini: '%s' outside of group", buffer);
 		}
 	}
@@ -299,25 +305,25 @@
 	return ini;
 }
 
-// lookup a group or make a new one
+/** lookup a group or make a new one */
 static IniGroup *ini_getgroup(IniFile *ini, const char *name, int len)
 {
 	IniGroup *group;
 
 	if (len == -1) len = strlen(name);
 
-	// does it exist already?
+	/* does it exist already? */
 	for (group = ini->group; group; group = group->next)
 		if (!memcmp(group->name, name, len) && group->name[len] == 0)
 			return group;
 
-	// otherwise make a new one
+	/* otherwise make a new one */
 	group = ini_group_alloc(ini, name, len);
 	group->comment = (char*)pool_strdup(&ini->pool, "\n", 1);
 	return group;
 }
 
-// lookup an item or make a new one
+/** lookup an item or make a new one */
 static IniItem *ini_getitem(IniGroup *group, const char *name, bool create)
 {
 	IniItem *item;
@@ -328,11 +334,11 @@
 
 	if (!create) return NULL;
 
-	// otherwise make a new one
+	/* otherwise make a new one */
 	return ini_item_alloc(group, name, len);
 }
 
-// save ini file from the "abstract" format.
+/** save ini file from the "abstract" format. */
 static bool ini_save(const char *filename, IniFile *ini)
 {
 	FILE *f;
@@ -349,11 +355,18 @@
 			assert(item->value != NULL);
 			if (item->comment != NULL) fputs(item->comment, f);
 
+			/* protect item->name with quotes if needed */
+			if (strchr(item->name, ' ') != NULL) {
+				fprintf(f, "\"%s\"", item->name);
+			} else {
+				fprintf(f, "%s", item->name);
+			}
+
 			/* Don't give an equal sign to list items that don't have a parameter */
 			if (group->type == IGT_LIST && *item->value == '\0') {
-				fprintf(f, "%s\n", item->name);
+				fprintf(f, "\n");
 			} else {
-				fprintf(f, "%s = %s\n", item->name, item->value);
+				fprintf(f, " = %s\n", item->value);
 			}
 		}
 	}
@@ -380,13 +393,13 @@
 
 	if (onelen == -1) onelen = strlen(one);
 
-	// check if it's an integer
+	/* check if it's an integer */
 	if (*one >= '0' && *one <= '9')
 		return strtoul(one, NULL, 0);
 
 	idx = 0;
 	for (;;) {
-		// find end of item
+		/* find end of item */
 		s = many;
 		while (*s != '|' && *s != 0) s++;
 		if (s - many == onelen && !memcmp(one, many, onelen)) return idx;
@@ -399,7 +412,7 @@
 /** Find the set-integer value MANYofMANY type in a string
  * @param many full domain of values the MANYofMANY setting can have
  * @param str the current string value of the setting, each individual
- * of seperated by a whitespace\tab or | character
+ * of seperated by a whitespace,tab or | character
  * @return the 'fully' set integer, or -1 if a set is not found */
 static uint32 lookup_manyofmany(const char *many, const char *str)
 {
@@ -408,7 +421,7 @@
 	uint32 res = 0;
 
 	for (;;) {
-		// skip "whitespace"
+		/* skip "whitespace" */
 		while (*str == ' ' || *str == '\t' || *str == '|') str++;
 		if (*str == 0) break;
 
@@ -522,7 +535,7 @@
 {
 	int orig_id = id;
 
-	// Look for the id'th element
+	/* Look for the id'th element */
 	while (--id >= 0) {
 		for (; *many != '|'; many++) {
 			if (*many == '\0') { // not found
@@ -533,7 +546,7 @@
 		many++; // pass the |-character
 	}
 
-	// copy string until next item (|) or the end of the list if this is the last one
+	/* copy string until next item (|) or the end of the list if this is the last one */
 	while (*many != '\0' && *many != '|') *buf++ = *many++;
 	*buf = '\0';
 }
@@ -669,7 +682,8 @@
  * @param ini pointer to IniFile structure that holds administrative information
  * @param sd pointer to SettingDesc structure whose internally pointed variables will
  *        be given values
- * @param grpname the group of the IniFile to search in for the new values */
+ * @param grpname the group of the IniFile to search in for the new values
+ * @param object pointer to the object been loaded */
 static void ini_load_settings(IniFile *ini, const SettingDesc *sd, const char *grpname, void *object)
 {
 	IniGroup *group;
@@ -685,7 +699,7 @@
 
 		if (!SlIsObjectCurrentlyValid(sld->version_from, sld->version_to)) continue;
 
-		// XXX - wtf is this?? (group override?)
+		/* XXX - wtf is this?? (group override?) */
 		s = strchr(sdb->name, '.');
 		if (s != NULL) {
 			group = ini_getgroup(ini, sdb->name, s - sdb->name);
@@ -739,6 +753,7 @@
  * @param sd read-only SettingDesc structure which contains the unmodified,
  *        loaded values of the configuration file and various information about it
  * @param grpname holds the name of the group (eg. [network]) where these will be saved
+ * @param object pointer to the object been saved
  * The function works as follows: for each item in the SettingDesc structure we
  * have a look if the value has changed since we started the game (the original
  * values are reloaded when saving). If settings indeed have changed, we get
@@ -761,7 +776,7 @@
 		if (!SlIsObjectCurrentlyValid(sld->version_from, sld->version_to)) continue;
 		if (sld->conv & SLF_CONFIG_NO) continue;
 
-		// XXX - wtf is this?? (group override?)
+		/* XXX - wtf is this?? (group override?) */
 		s = strchr(sdb->name, '.');
 		if (s != NULL) {
 			group = ini_getgroup(ini, sdb->name, s - sdb->name);
@@ -776,7 +791,7 @@
 		ptr = GetVariableAddress(object, sld);
 
 		if (item->value != NULL) {
-			// check if the value is the same as the old value
+			/* check if the value is the same as the old value */
 			const void *p = string_to_val(sdb, item->value);
 
 			/* The main type of a variable/setting is in bytes 8-15
@@ -852,7 +867,7 @@
  * The list parameter can be a NULL pointer, in this case nothing will be
  * saved and a callback function should be defined that will take over the
  * list-handling and store the data itself somewhere.
- * @param IniFile handle to the ini file with the source data
+ * @param ini IniFile handle to the ini file with the source data
  * @param grpname character string identifying the section-header of the ini
  * file that will be parsed
  * @param list pointer to an string(pointer) array that will store the parsed
@@ -882,10 +897,10 @@
 /** Saves all items from a list into the 'grpname' section
  * The list parameter can be a NULL pointer, in this case a callback function
  * should be defined that will provide the source data to be saved.
- * @param IniFile handle to the ini file where the destination data is saved
+ * @param ini IniFile handle to the ini file where the destination data is saved
  * @param grpname character string identifying the section-header of the ini file
  * @param list pointer to an string(pointer) array that will be used as the
- * source to be saved into the relevant ini section
+ *             source to be saved into the relevant ini section
  * @param len the maximum number of items available for the above list
  * @param proc callback function that can will provide the source data if defined */
 static void ini_save_setting_list(IniFile *ini, const char *grpname, char **list, uint len, SettingListCallbackProc proc)
@@ -929,7 +944,8 @@
  * 2. SDT_something
  * The 'G' stands for global, so this is the one you will use for a
  * SettingDescGlobVarList section meaning global variables. The other uses a
- * Base/Offset and runtime variable selection mechanism, known from the saveload * convention (it also has global so it should not be hard).
+ * Base/Offset and runtime variable selection mechanism, known from the saveload
+ * convention (it also has global so it should not be hard).
  * Of each type there are again two versions, the normal one and one prefixed
  * with 'COND'.
  * COND means that the setting is only valid in certain savegame versions
@@ -988,7 +1004,7 @@
 #define SDTG_CONDOMANY(name, type, flags, guiflags, var, def, max, full, str, proc, from, to)\
 	SDTG_GENERAL(name, SDT_ONEOFMANY, SL_VAR, type, flags, guiflags, var, 0, def, 0, max, 0, full, str, proc, from, to)
 #define SDTG_OMANY(name, type, flags, guiflags, var, def, max, full, str, proc)\
-	SDTG_CONDOMANY(name, type, flags, guiflags, var, def, max full, str, proc, 0, SL_MAX_VERSION)
+	SDTG_CONDOMANY(name, type, flags, guiflags, var, def, max, full, str, proc, 0, SL_MAX_VERSION)
 
 #define SDTG_CONDMMANY(name, type, flags, guiflags, var, def, full, str, proc, from, to)\
 	SDTG_GENERAL(name, SDT_MANYOFMANY, SL_VAR, type, flags, guiflags, var, 0, def, 0, 0, 0, full, str, proc, from, to)
@@ -1052,7 +1068,6 @@
 /* Shortcuts for macros below. Logically if we don't save the value
  * we also don't sync it in a network game */
 #define S SLF_SAVE_NO | SLF_NETWORK_NO
-#define NS SLF_SAVE_NO
 #define C SLF_CONFIG_NO
 #define N SLF_NETWORK_NO
 
@@ -1069,7 +1084,7 @@
 #include "gui.h"
 #include "town.h"
 #include "gfx.h"
-// virtual PositionMainToolbar function, calls the right one.
+/* virtual PositionMainToolbar function, calls the right one.*/
 static int32 v_PositionMainToolbar(int32 p1)
 {
 	if (_game_mode != GM_MENU) PositionMainToolbar(NULL);
@@ -1125,15 +1140,15 @@
 	const Patches *ptc = (_game_mode == GM_MENU) ? &_patches_newgame : &_patches;
 
 	if (p1) {
-		warning = ( (IS_INT_INSIDE(ptc->servint_trains,   5, 90+1) || ptc->servint_trains   == 0) &&
-								(IS_INT_INSIDE(ptc->servint_roadveh,  5, 90+1) || ptc->servint_roadveh  == 0) &&
-								(IS_INT_INSIDE(ptc->servint_aircraft, 5, 90+1) || ptc->servint_aircraft == 0) &&
-								(IS_INT_INSIDE(ptc->servint_ships,    5, 90+1) || ptc->servint_ships    == 0) );
+		warning = ( (IS_INT_INSIDE(ptc->servint_trains,   5, 90 + 1) || ptc->servint_trains   == 0) &&
+								(IS_INT_INSIDE(ptc->servint_roadveh,  5, 90 + 1) || ptc->servint_roadveh  == 0) &&
+								(IS_INT_INSIDE(ptc->servint_aircraft, 5, 90 + 1) || ptc->servint_aircraft == 0) &&
+								(IS_INT_INSIDE(ptc->servint_ships,    5, 90 + 1) || ptc->servint_ships    == 0) );
 	} else {
-		warning = ( (IS_INT_INSIDE(ptc->servint_trains,   30, 800+1) || ptc->servint_trains   == 0) &&
-								(IS_INT_INSIDE(ptc->servint_roadveh,  30, 800+1) || ptc->servint_roadveh  == 0) &&
-								(IS_INT_INSIDE(ptc->servint_aircraft, 30, 800+1) || ptc->servint_aircraft == 0) &&
-								(IS_INT_INSIDE(ptc->servint_ships,    30, 800+1) || ptc->servint_ships    == 0) );
+		warning = ( (IS_INT_INSIDE(ptc->servint_trains,   30, 800 + 1) || ptc->servint_trains   == 0) &&
+								(IS_INT_INSIDE(ptc->servint_roadveh,  30, 800 + 1) || ptc->servint_roadveh  == 0) &&
+								(IS_INT_INSIDE(ptc->servint_aircraft, 30, 800 + 1) || ptc->servint_aircraft == 0) &&
+								(IS_INT_INSIDE(ptc->servint_ships,    30, 800 + 1) || ptc->servint_ships    == 0) );
 	}
 
 	if (!warning)
@@ -1159,6 +1174,24 @@
 	DoCommandP(0, 2, _patches.autorenew_money, NULL, CMD_SET_AUTOREPLACE);
 	return 0;
 }
+
+/**
+ * Check for right TownLayout usage in editor mode.
+ * The No Road mode is not desirable since towns have to be
+ * able to grow. If a user desires to have a town with no road,
+ * he can easily remove them himself. This would create less confusion
+ * @param p1 unused
+ * @return always 0
+ */
+static int32 CheckTownLayout(int32 p1)
+{
+	if (_patches.town_layout == TL_NO_ROADS && _game_mode == GM_EDITOR) {
+		ShowErrorMessage(INVALID_STRING_ID, STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID, 0, 0);
+		_patches.town_layout = TL_ORIGINAL;
+	}
+	return 0;
+}
+
 /** Conversion callback for _gameopt_settings.landscape
  * It converts (or try) between old values and the new ones,
  * without loosing initial setting  of the user
@@ -1205,7 +1238,7 @@
 #endif /* WIN32 */
 
 static const SettingDescGlobVarList _misc_settings[] = {
-	SDTG_MMANY("display_opt",     SLE_UINT8, S, 0, _display_opt,       (DO_SHOW_TOWN_NAMES|DO_SHOW_STATION_NAMES|DO_SHOW_SIGNS|DO_FULL_ANIMATION|DO_FULL_DETAIL|DO_TRANS_BUILDINGS|DO_WAYPOINTS), "SHOW_TOWN_NAMES|SHOW_STATION_NAMES|SHOW_SIGNS|FULL_ANIMATION|TRANS_BUILDINGS|FULL_DETAIL|WAYPOINTS", STR_NULL, NULL),
+	SDTG_MMANY("display_opt",     SLE_UINT8, S, 0, _display_opt,       (1 << DO_SHOW_TOWN_NAMES | 1 << DO_SHOW_STATION_NAMES | 1 << DO_SHOW_SIGNS | 1 << DO_FULL_ANIMATION | 1 << DO_FULL_DETAIL | 1 << DO_WAYPOINTS), "SHOW_TOWN_NAMES|SHOW_STATION_NAMES|SHOW_SIGNS|FULL_ANIMATION||FULL_DETAIL|WAYPOINTS", STR_NULL, NULL),
 	 SDTG_BOOL("news_ticker_sound",          S, 0, _news_ticker_sound,     true,    STR_NULL, NULL),
 	 SDTG_BOOL("fullscreen",                 S, 0, _fullscreen,           false,    STR_NULL, NULL),
 	  SDTG_STR("videodriver",      SLE_STRB,C|S,0, _ini_videodriver,       NULL,    STR_NULL, NULL),
@@ -1229,29 +1262,30 @@
 
 #ifdef ENABLE_NETWORK
 static const SettingDescGlobVarList _network_settings[] = {
-	 SDTG_VAR("sync_freq",           SLE_UINT16,C|S,0, _network_sync_freq,            100, 0,   100,   0, STR_NULL, NULL),
-	 SDTG_VAR("frame_freq",           SLE_UINT8,C|S,0, _network_frame_freq,             0, 0,   100,   0, STR_NULL, NULL),
-	 SDTG_VAR("max_join_time",       SLE_UINT16, S, 0, _network_max_join_time,        500, 0, 32000,   0, STR_NULL, NULL),
-	SDTG_BOOL("pause_on_join",                   S, 0, _network_pause_on_join,        true,               STR_NULL, NULL),
-	 SDTG_STR("server_bind_ip",        SLE_STRB, S, 0, _network_server_bind_ip_host,  "0.0.0.0",          STR_NULL, NULL),
-	 SDTG_VAR("server_port",         SLE_UINT16, S, 0, _network_server_port,          NETWORK_DEFAULT_PORT, 0, 65535, 0, STR_NULL, NULL),
-	SDTG_BOOL("server_advertise",                S, 0, _network_advertise,            false,              STR_NULL, NULL),
-	 SDTG_VAR("lan_internet",         SLE_UINT8, S, 0, _network_lan_internet,           0, 0,     1,   0, STR_NULL, NULL),
-	 SDTG_STR("player_name",           SLE_STRB, S, 0, _network_player_name,          NULL,               STR_NULL, NULL),
-	 SDTG_STR("server_password",       SLE_STRB, S, 0, _network_server_password,      NULL,               STR_NULL, NULL),
-	 SDTG_STR("rcon_password",         SLE_STRB, S, 0, _network_rcon_password,        NULL,               STR_NULL, NULL),
-	 SDTG_STR("server_name",           SLE_STRB, S, 0, _network_server_name,          NULL,               STR_NULL, NULL),
-	 SDTG_STR("connect_to_ip",         SLE_STRB, S, 0, _network_default_ip,           NULL,               STR_NULL, NULL),
-	 SDTG_STR("network_id",            SLE_STRB, S, 0, _network_unique_id,            NULL,               STR_NULL, NULL),
-	SDTG_BOOL("autoclean_companies",             S, 0, _network_autoclean_companies,  false,              STR_NULL, NULL),
-	 SDTG_VAR("autoclean_unprotected",SLE_UINT8, S, 0, _network_autoclean_unprotected,12, 0,     60,   0, STR_NULL, NULL),
-	 SDTG_VAR("autoclean_protected",  SLE_UINT8, S, 0, _network_autoclean_protected,  36, 0,    180,   0, STR_NULL, NULL),
-	 SDTG_VAR("max_companies",        SLE_UINT8, S, 0, _network_game_info.companies_max,   8, 0,  8,   0, STR_NULL, NULL),
-	 SDTG_VAR("max_clients",          SLE_UINT8, S, 0, _network_game_info.clients_max,    10, 0, 10,   0, STR_NULL, NULL),
-	 SDTG_VAR("max_spectators",       SLE_UINT8, S, 0, _network_game_info.spectators_max, 10, 0, 10,   0, STR_NULL, NULL),
-	 SDTG_VAR("restart_game_year",    SLE_INT32, S,D0, _network_restart_game_year,    0, MIN_YEAR, MAX_YEAR, 1, STR_NULL, NULL),
-	 SDTG_VAR("min_players",          SLE_UINT8, S, 0, _network_min_players,               0, 0, 10,   0, STR_NULL, NULL),
-	 SDTG_END()
+	  SDTG_VAR("sync_freq",           SLE_UINT16,C|S,0, _network_sync_freq,            100, 0,   100,   0, STR_NULL, NULL),
+	  SDTG_VAR("frame_freq",           SLE_UINT8,C|S,0, _network_frame_freq,             0, 0,   100,   0, STR_NULL, NULL),
+	  SDTG_VAR("max_join_time",       SLE_UINT16, S, 0, _network_max_join_time,        500, 0, 32000,   0, STR_NULL, NULL),
+	 SDTG_BOOL("pause_on_join",                   S, 0, _network_pause_on_join,        true,               STR_NULL, NULL),
+	  SDTG_STR("server_bind_ip",        SLE_STRB, S, 0, _network_server_bind_ip_host,  "0.0.0.0",          STR_NULL, NULL),
+	  SDTG_VAR("server_port",         SLE_UINT16, S, 0, _network_server_port,          NETWORK_DEFAULT_PORT, 0, 65535, 0, STR_NULL, NULL),
+	 SDTG_BOOL("server_advertise",                S, 0, _network_advertise,            false,              STR_NULL, NULL),
+	  SDTG_VAR("lan_internet",         SLE_UINT8, S, 0, _network_lan_internet,           0, 0,     1,   0, STR_NULL, NULL),
+	  SDTG_STR("player_name",           SLE_STRB, S, 0, _network_player_name,          NULL,               STR_NULL, NULL),
+	  SDTG_STR("server_password",       SLE_STRB, S, 0, _network_server_password,      NULL,               STR_NULL, NULL),
+	  SDTG_STR("rcon_password",         SLE_STRB, S, 0, _network_rcon_password,        NULL,               STR_NULL, NULL),
+	  SDTG_STR("server_name",           SLE_STRB, S, 0, _network_server_name,          NULL,               STR_NULL, NULL),
+	  SDTG_STR("connect_to_ip",         SLE_STRB, S, 0, _network_default_ip,           NULL,               STR_NULL, NULL),
+	  SDTG_STR("network_id",            SLE_STRB, S, 0, _network_unique_id,            NULL,               STR_NULL, NULL),
+	 SDTG_BOOL("autoclean_companies",             S, 0, _network_autoclean_companies,  false,              STR_NULL, NULL),
+	  SDTG_VAR("autoclean_unprotected",SLE_UINT8, S, 0, _network_autoclean_unprotected,12, 0,     60,   0, STR_NULL, NULL),
+	  SDTG_VAR("autoclean_protected",  SLE_UINT8, S, 0, _network_autoclean_protected,  36, 0,    180,   0, STR_NULL, NULL),
+	  SDTG_VAR("max_companies",        SLE_UINT8, S, 0, _network_game_info.companies_max,   8, 0,  8,   0, STR_NULL, NULL),
+	  SDTG_VAR("max_clients",          SLE_UINT8, S, 0, _network_game_info.clients_max,    10, 0, 10,   0, STR_NULL, NULL),
+	  SDTG_VAR("max_spectators",       SLE_UINT8, S, 0, _network_game_info.spectators_max, 10, 0, 10,   0, STR_NULL, NULL),
+	  SDTG_VAR("restart_game_year",    SLE_INT32, S,D0, _network_restart_game_year,    0, MIN_YEAR, MAX_YEAR, 1, STR_NULL, NULL),
+	  SDTG_VAR("min_players",          SLE_UINT8, S, 0, _network_min_players,               0, 0, 10,   0, STR_NULL, NULL),
+	SDTG_OMANY("server_lang",          SLE_UINT8, S, 0, _network_game_info.server_lang,     0, 28, "ANY|ENGLISH|GERMAN|FRENCH|BRAZILIAN|BULGARIAN|CHINESE|CZECH|DANISH|DUTCH|ESPERANTO|FINNISH|HUNGARIAN|ICELANDIC|ITALIAN|JAPANESE|KOREAN|LITHUANIAN|NORWEGIAN|POLISH|PORTUGUESE|ROMANIAN|RUSSIAN|SLOVAK|SLOVENIAN|SPANISH|SWEDISH|TURKISH|UKRAINIAN", STR_NULL, NULL),
+	  SDTG_END()
 };
 #endif /* ENABLE_NETWORK */
 
@@ -1265,7 +1299,7 @@
 	 * and why not byte for example? */
 	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, (SLE_FILE_I16 | SLE_VAR_I32), 0, 0, GameOptions, diff, 17, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 0, 3),
 	SDT_GENERAL("diff_custom", SDT_INTLIST, SL_ARR, (SLE_FILE_I16 | SLE_VAR_I32), 0, 0, GameOptions, diff, 18, 0, 0, 0, 0, NULL, STR_NULL, NULL, NULL, 4, SL_MAX_VERSION),
-	    SDT_VAR(GameOptions, diff_level,SLE_UINT8, 0, 0, 0, 0,  3, 0, STR_NULL, NULL),
+	    SDT_VAR(GameOptions, diff_level, SLE_UINT8, 0, 0, 0, 0,  3, 0, STR_NULL, NULL),
 	  SDT_OMANY(GameOptions, currency,  SLE_UINT8, N, 0, 0, CUSTOM_CURRENCY_ID, "GBP|USD|EUR|YEN|ATS|BEF|CHF|CZK|DEM|DKK|ESP|FIM|FRF|GRD|HUF|ISK|ITL|NLG|NOK|PLN|ROL|RUR|SIT|SEK|YTL|SKK|BRR|custom", STR_NULL, NULL, NULL),
 	  SDT_OMANY(GameOptions, units,     SLE_UINT8, N, 0, 1,     2, "imperial|metric|si", STR_NULL, NULL, NULL),
 	  SDT_OMANY(GameOptions, town_name, SLE_UINT8, 0, 0, 0,    20, "english|french|german|american|latin|silly|swedish|dutch|finnish|polish|slovakish|norwegian|hungarian|austrian|romanian|czech|swiss|danish|turkish|italian|catalan", STR_NULL, NULL, NULL),
@@ -1294,6 +1328,7 @@
 	SDT_BOOL(Patches, show_finances,                 S, 0,  true,        STR_CONFIG_PATCHES_SHOWFINANCES,          NULL),
 	SDT_BOOL(Patches, autoscroll,                    S, 0, false,        STR_CONFIG_PATCHES_AUTOSCROLL,            NULL),
 	SDT_BOOL(Patches, reverse_scroll,                S, 0, false,        STR_CONFIG_PATCHES_REVERSE_SCROLLING,     NULL),
+	SDT_BOOL(Patches, smooth_scroll,                 S, 0, false,        STR_CONFIG_PATCHES_SMOOTH_SCROLLING,      NULL),
 	SDT_BOOL(Patches, measure_tooltip,               S, 0, false,        STR_CONFIG_PATCHES_MEASURE_TOOLTIP,       NULL),
 	 SDT_VAR(Patches, errmsg_duration,    SLE_UINT8, S, 0,  5, 0, 20, 0, STR_CONFIG_PATCHES_ERRMSG_DURATION,       NULL),
 	 SDT_VAR(Patches, toolbar_pos,        SLE_UINT8, S,MS,  0, 0,  2, 0, STR_CONFIG_PATCHES_TOOLBAR_POS,           v_PositionMainToolbar),
@@ -1307,6 +1342,8 @@
 	SDT_BOOL(Patches, prefer_teamchat,               S, 0, false,        STR_CONFIG_PATCHES_PREFER_TEAMCHAT,       NULL),
 	SDT_VAR(Patches, scrollwheel_scrolling,SLE_UINT8,S,MS, 0,  0,  2, 0, STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING, NULL),
 	SDT_VAR(Patches,scrollwheel_multiplier,SLE_UINT8,S, 0, 5,  1, 15, 1, STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER,NULL),
+	SDT_BOOL(Patches, pause_on_newgame,              S, 0, false,        STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME,     NULL),
+	SDT_BOOL(Patches, advanced_vehicle_list,         S, 0, true,        STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS,     NULL),
 
 	/***************************************************************************/
 	/* Construction section of the GUI-configure patches window */
@@ -1317,6 +1354,7 @@
 	SDT_BOOL(Patches, always_small_airport,          0, 0, false,        STR_CONFIG_PATCHES_SMALL_AIRPORTS,      NULL),
 	 SDT_VAR(Patches, drag_signals_density,SLE_UINT8,S, 0,  4, 1, 20, 0, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY,NULL),
 	 SDT_VAR(Patches, semaphore_build_before,SLE_INT32, S, NC, 1975, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE, NULL),
+	SDT_CONDVAR(Patches, town_layout, SLE_UINT8, 59, SL_MAX_VERSION, 0, MS, TL_ORIGINAL, TL_NO_ROADS, NUM_TLS - 1, 1, STR_CONFIG_PATCHES_TOWN_LAYOUT, CheckTownLayout),
 
 	/***************************************************************************/
 	/* Vehicle section of the GUI-configure patches window */
@@ -1365,6 +1403,7 @@
 	SDT_BOOL(Patches, modified_catchment,      0, 0,  true,        STR_CONFIG_PATCHES_CATCHMENT,          NULL),
 	SDT_CONDBOOL(Patches, gradual_loading, 40, SL_MAX_VERSION, 0, 0,  true, STR_CONFIG_PATCHES_GRADUAL_LOADING,    NULL),
 	SDT_CONDBOOL(Patches, road_stop_on_town_road, 47, SL_MAX_VERSION, 0, 0, false, STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD, NULL),
+	SDT_CONDBOOL(Patches, adjacent_stations,      62, SL_MAX_VERSION, 0, 0, true,  STR_CONFIG_PATCHES_ADJACENT_STATIONS, NULL),
 
 	/***************************************************************************/
 	/* Economy section of the GUI-configure patches window */
@@ -1379,6 +1418,9 @@
 	 SDT_VAR(Patches, ending_year,      SLE_INT32,0,NC|NO,2051, MIN_YEAR, MAX_YEAR, 1, STR_CONFIG_PATCHES_ENDING_YEAR,  NULL),
 	SDT_BOOL(Patches, smooth_economy,             0, 0,  true,            STR_CONFIG_PATCHES_SMOOTH_ECONOMY,   NULL),
 	SDT_BOOL(Patches, allow_shares,               0, 0, false,            STR_CONFIG_PATCHES_ALLOW_SHARES,     NULL),
+	SDT_CONDVAR(Patches, town_growth_rate,  SLE_UINT8, 54, SL_MAX_VERSION, 0, MS, 2, 0,   4, 0, STR_CONFIG_PATCHES_TOWN_GROWTH,          NULL),
+	SDT_CONDVAR(Patches, larger_towns,      SLE_UINT8, 54, SL_MAX_VERSION, 0, D0, 4, 0, 255, 1, STR_CONFIG_PATCHES_LARGER_TOWNS,         NULL),
+	SDT_CONDVAR(Patches, initial_city_size, SLE_UINT8, 56, SL_MAX_VERSION, 0, 0,  2, 1,  10, 1, STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER, NULL),
 
 	/***************************************************************************/
 	/* AI section of the GUI-configure patches window */
@@ -1460,7 +1502,7 @@
 	SDT_CONDVAR (Patches, npf_road_drive_through_penalty, SLE_UINT, 47, SL_MAX_VERSION, 0, 0,  8 * NPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
 
 
-	// The maximum number of nodes to search
+	/* The maximum number of nodes to search */
 	SDT_CONDBOOL(Patches, yapf.disable_node_optimization  ,           28, SL_MAX_VERSION, 0, 0, false                   ,                       STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.max_search_nodes           , SLE_UINT, 28, SL_MAX_VERSION, 0, 0, 10000                   ,      500, 1000000, 0, STR_NULL, NULL),
 	SDT_CONDBOOL(Patches, yapf.rail_firstred_twoway_eol   ,           28, SL_MAX_VERSION, 0, 0,  true                   ,                       STR_NULL, NULL),
@@ -1472,22 +1514,22 @@
 	SDT_CONDVAR (Patches, yapf.rail_slope_penalty         , SLE_UINT, 28, SL_MAX_VERSION, 0, 0,     2 * YAPF_TILE_LENGTH,        0, 1000000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.rail_curve45_penalty       , SLE_UINT, 28, SL_MAX_VERSION, 0, 0,     1 * YAPF_TILE_LENGTH,        0, 1000000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.rail_curve90_penalty       , SLE_UINT, 28, SL_MAX_VERSION, 0, 0,     6 * YAPF_TILE_LENGTH,        0, 1000000, 0, STR_NULL, NULL),
-	// This penalty is applied when a train reverses inside a depot
+	/* This penalty is applied when a train reverses inside a depot */
 	SDT_CONDVAR (Patches, yapf.rail_depot_reverse_penalty , SLE_UINT, 28, SL_MAX_VERSION, 0, 0,    50 * YAPF_TILE_LENGTH,        0, 1000000, 0, STR_NULL, NULL),
-	// This is the penalty for level crossings (for trains only)
+	/* This is the penalty for level crossings (for trains only) */
 	SDT_CONDVAR (Patches, yapf.rail_crossing_penalty      , SLE_UINT, 28, SL_MAX_VERSION, 0, 0,     3 * YAPF_TILE_LENGTH,        0, 1000000, 0, STR_NULL, NULL),
-	// look-ahead how many signals are checked
+	/* look-ahead how many signals are checked */
 	SDT_CONDVAR (Patches, yapf.rail_look_ahead_max_signals, SLE_UINT, 28, SL_MAX_VERSION, 0, 0,    10                   ,        1,     100, 0, STR_NULL, NULL),
-	// look-ahead n-th red signal penalty polynomial: penalty = p2 * n^2 + p1 * n + p0
+	/* look-ahead n-th red signal penalty polynomial: penalty = p2 * n^2 + p1 * n + p0 */
 	SDT_CONDVAR (Patches, yapf.rail_look_ahead_signal_p0  , SLE_INT , 28, SL_MAX_VERSION, 0, 0,   500                   , -1000000, 1000000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.rail_look_ahead_signal_p1  , SLE_INT , 28, SL_MAX_VERSION, 0, 0,  -100                   , -1000000, 1000000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.rail_look_ahead_signal_p2  , SLE_INT , 28, SL_MAX_VERSION, 0, 0,     5                   , -1000000, 1000000, 0, STR_NULL, NULL),
-	// penalties for too long or too short station platforms
+	/* penalties for too long or too short station platforms */
 	SDT_CONDVAR (Patches, yapf.rail_longer_platform_penalty,           SLE_UINT, 33, SL_MAX_VERSION, 0, 0,  8 * YAPF_TILE_LENGTH, 0,   20000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.rail_longer_platform_per_tile_penalty,  SLE_UINT, 33, SL_MAX_VERSION, 0, 0,  0 * YAPF_TILE_LENGTH, 0,   20000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.rail_shorter_platform_penalty,          SLE_UINT, 33, SL_MAX_VERSION, 0, 0, 40 * YAPF_TILE_LENGTH, 0,   20000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.rail_shorter_platform_per_tile_penalty, SLE_UINT, 33, SL_MAX_VERSION, 0, 0,  0 * YAPF_TILE_LENGTH, 0,   20000, 0, STR_NULL, NULL),
-	// road vehicles - penalties
+	/* road vehicles - penalties */
 	SDT_CONDVAR (Patches, yapf.road_slope_penalty                    , SLE_UINT, 33, SL_MAX_VERSION, 0, 0,  2 * YAPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.road_curve_penalty                    , SLE_UINT, 33, SL_MAX_VERSION, 0, 0,  1 * YAPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
 	SDT_CONDVAR (Patches, yapf.road_crossing_penalty                 , SLE_UINT, 33, SL_MAX_VERSION, 0, 0,  3 * YAPF_TILE_LENGTH, 0, 1000000, 0, STR_NULL, NULL),
@@ -1509,7 +1551,7 @@
 static const SettingDesc _currency_settings[] = {
 	SDT_VAR(CurrencySpec, rate,    SLE_UINT16, S, 0,  1, 0, 100, 0, STR_NULL, NULL),
 	SDT_CHR(CurrencySpec, separator,           S, 0,        ".",    STR_NULL, NULL),
-	SDT_VAR(CurrencySpec, to_euro,  SLE_INT32, S, 0,  0, 0,3000, 0, STR_NULL, NULL),
+	SDT_VAR(CurrencySpec, to_euro,  SLE_INT32, S, 0,  0, 0, 3000, 0, STR_NULL, NULL),
 	SDT_STR(CurrencySpec, prefix,   SLE_STRBQ, S, 0,       NULL,    STR_NULL, NULL),
 	SDT_STR(CurrencySpec, suffix,   SLE_STRBQ, S, 0, " credits",    STR_NULL, NULL),
 	SDT_END()
@@ -1576,7 +1618,7 @@
 
 	for (item = group->item; item != NULL; item = item->next) {
 		GRFConfig *c = CallocT<GRFConfig>(1);
-		c->filename = strdup(item->name);
+		c->full_path = strdup(item->name);
 
 		/* Parse parameters */
 		if (*item->value != '\0') {
@@ -1653,7 +1695,7 @@
 		char params[512];
 		GRFBuildParamList(params, c, lastof(params));
 
-		*item = ini_item_alloc(group, c->filename, strlen(c->filename));
+		*item = ini_item_alloc(group, c->full_path, strlen(c->full_path));
 		(*item)->value = (char*)pool_strdup(&ini->pool, params, strlen(params));
 		item = &(*item)->next;
 	}
@@ -1713,6 +1755,8 @@
 }
 
 /** Network-safe changing of patch-settings (server-only).
+ * @param tile unused
+ * @param flags operation to perform
  * @param p1 the index of the patch in the SettingDesc array which identifies it
  * @param p2 the new value for the patch
  * The new value is properly clamped to its minimum/maximum when setting
@@ -1829,6 +1873,25 @@
 		name, value, (sd->desc.flags & SGF_0ISDISABLED) ? "(0) " : "", sd->desc.min, sd->desc.max);
 }
 
+void IConsoleListPatches()
+{
+	IConsolePrintF(_icolour_warn, "All patches with their current value:");
+
+	for (const SettingDesc *sd = _patch_settings; sd->save.cmd != SL_END; sd++) {
+		char value[80];
+		const void *ptr = GetVariableAddress((_game_mode == GM_MENU) ? &_patches_newgame : &_patches, &sd->save);
+
+		if (sd->desc.cmd == SDT_BOOLX) {
+			snprintf(value, lengthof(value), (*(bool*)ptr == 1) ? "on" : "off");
+		} else {
+			snprintf(value, lengthof(value), "%d", (uint32)ReadValue(ptr, sd->save.conv));
+		}
+		IConsolePrintF(_icolour_def, "%s = %s", sd->desc.name, value);
+	}
+
+	IConsolePrintF(_icolour_warn, "Use 'patch' command to change a value");
+}
+
 /** Save and load handler for patches/settings
  * @param osd SettingDesc struct containing all information
  * @param object can be either NULL in which case we load global variables or
@@ -1844,6 +1907,7 @@
 }
 
 /** Loadhandler for a list of global variables
+ * @param sdg pointer for the global variable list SettingDescGlobVarList
  * @note this is actually a stub for LoadSettings with the
  * object pointer set to NULL */
 static inline void LoadSettingsGlobList(const SettingDescGlobVarList *sdg)
@@ -1852,7 +1916,7 @@
 }
 
 /** Save and load handler for patches/settings
- * @param osd SettingDesc struct containing all information
+ * @param sd SettingDesc struct containing all information
  * @param object can be either NULL in which case we load global variables or
  * a pointer to a struct which is getting saved */
 static void SaveSettings(const SettingDesc *sd, void *object)
--- a/src/settings.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/settings.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file settings.h */
+
 #ifndef SETTINGS_H
 #define SETTINGS_H
 
@@ -12,12 +14,12 @@
 enum SettingDescTypeLong {
 	/* 4 bytes allocated a maximum of 16 types for GenericType */
 	SDT_BEGIN       = 0,
-	SDT_NUMX        = 0, // any number-type
-	SDT_BOOLX       = 1, // a boolean number
-	SDT_ONEOFMANY   = 2, // bitmasked number where only ONE bit may be set
-	SDT_MANYOFMANY  = 3, // bitmasked number where MULTIPLE bits may be set
-	SDT_INTLIST     = 4, // list of integers seperated by a comma ','
-	SDT_STRING      = 5, // string with a pre-allocated buffer
+	SDT_NUMX        = 0, ///< any number-type
+	SDT_BOOLX       = 1, ///< a boolean number
+	SDT_ONEOFMANY   = 2, ///< bitmasked number where only ONE bit may be set
+	SDT_MANYOFMANY  = 3, ///< bitmasked number where MULTIPLE bits may be set
+	SDT_INTLIST     = 4, ///< list of integers seperated by a comma ','
+	SDT_STRING      = 5, ///< string with a pre-allocated buffer
 	SDT_END,
 	/* 10 more possible primitives */
 };
@@ -84,6 +86,7 @@
 
 bool IConsoleSetPatchSetting(const char *name, int32 value);
 void IConsoleGetPatchSetting(const char *name);
+void IConsoleListPatches();
 const SettingDesc *GetPatchFromName(const char *name, uint *i);
 bool SetPatchValue(uint index, const Patches *object, int32 value);
 
--- a/src/settings_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/settings_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file settings_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "currency.h"
@@ -113,7 +115,7 @@
 
 		DrawWindowWidgets(w);
 		DrawString(20, 175, STR_OPTIONS_FULLSCREEN, 0); // fullscreen
-	}	break;
+	} break;
 
 	case WE_CLICK:
 		switch (e->we.click.widget) {
@@ -201,6 +203,7 @@
 			break;
 		case 24: /* Change interface language */
 			ReadLanguagePack(e->we.dropdown.index);
+			UpdateAllStationVirtCoord();
 			MarkWholeScreenDirty();
 			break;
 		case 27: /* Change resolution */
@@ -223,6 +226,7 @@
 
 /** Change the side of the road vehicles drive on (server only).
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 the side of the road; 0 = left side and 1 = right side
  * @param p2 unused
  */
@@ -305,8 +309,8 @@
 static const GameSettingData _game_setting_info[] = {
 	{  0,   7,  1, STR_NULL},
 	{  0,   3,  1, STR_6830_IMMEDIATE},
-	{  0,   2,  1, STR_6816_LOW},
-	{  0,   3,  1, STR_26816_NONE},
+	{  0,   3,  1, STR_NUM_VERY_LOW},
+	{  0,   4,  1, STR_26816_NONE},
 	{100, 500, 50, STR_NULL},
 	{  2,   4,  1, STR_NULL},
 	{  0,   2,  1, STR_6820_LOW},
@@ -323,18 +327,11 @@
 	{  0,   2,  1, STR_6839_PERMISSIVE},
 };
 
-static inline bool GetBitAndShift(uint32 *b)
-{
-	uint32 x = *b;
-	*b >>= 1;
-	return HASBIT(x, 0);
-}
-
 /*
  * A: competitors
  * B: start time in months / 3
- * C: town count (2 = high, 0 = low)
- * D: industry count (3 = high, 0 = none)
+ * C: town count (2 = high, 0 = very low)
+ * D: industry count (4 = high, 0 = none)
  * E: inital loan / 1000 (in GBP)
  * F: interest rate
  * G: running costs (0 = low, 2 = high)
@@ -352,9 +349,9 @@
  */
 static const int16 _default_game_diff[3][GAME_DIFFICULTY_NUM] = { /*
 	 A, B, C, D,   E, F, G, H, I, J, K, L, M, N, O, P, Q, R*/
-	{2, 2, 1, 3, 300, 2, 0, 2, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0}, //easy
-	{4, 1, 1, 2, 150, 3, 1, 3, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1}, //medium
-	{7, 0, 2, 2, 100, 4, 1, 3, 2, 2, 0, 2, 3, 2, 1, 1, 1, 2}, //hard
+	{2, 2, 1, 4, 300, 2, 0, 2, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0}, ///< easy
+	{4, 1, 1, 3, 150, 3, 1, 3, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1}, ///< medium
+	{7, 0, 0, 2, 100, 4, 1, 3, 2, 2, 0, 2, 3, 2, 1, 1, 1, 2}, ///< hard
 };
 
 void SetDifficultyLevel(int mode, GameOptions *gm_opt)
@@ -393,7 +390,7 @@
 	GAMEDIFF_WND_ROWSIZE    = 9
 };
 
-// Temporary holding place of values in the difficulty window until 'Save' is clicked
+/* Temporary holding place of values in the difficulty window until 'Save' is clicked */
 static GameOptions _opt_mod_temp;
 // 0x383E = (1 << 13) | (1 << 12) | (1 << 11) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2) | (1 << 1)
 #define DIFF_INGAME_DISABLED_BUTTONS 0x383E
@@ -428,9 +425,9 @@
 
 		y = GAMEDIFF_WND_TOP_OFFSET;
 		for (i = 0; i != GAME_DIFFICULTY_NUM; i++) {
-			DrawFrameRect( 5, y,  5 + 8, y + 8, 3, GetBitAndShift(&click_a) ? FR_LOWERED : FR_NONE);
-			DrawFrameRect(15, y, 15 + 8, y + 8, 3, GetBitAndShift(&click_b) ? FR_LOWERED : FR_NONE);
-			if (GetBitAndShift(&disabled) || (_networking && !_network_server)) {
+			DrawFrameRect( 5, y,  5 + 8, y + 8, 3, HASBIT(click_a, i) ? FR_LOWERED : FR_NONE);
+			DrawFrameRect(15, y, 15 + 8, y + 8, 3, HASBIT(click_b, i) ? FR_LOWERED : FR_NONE);
+			if (HASBIT(disabled, i) || (_networking && !_network_server)) {
 				int color = (1 << PALETTE_MODIFIER_GREYOUT) | _colour_gradient[COLOUR_YELLOW][2];
 				GfxFillRect( 6, y + 1,  6 + 8, y + 8, color);
 				GfxFillRect(16, y + 1, 16 + 8, y + 8, color);
@@ -457,7 +454,7 @@
 			uint btn, dis;
 			int16 val;
 
-			// Don't allow clients to make any changes
+			/* Don't allow clients to make any changes */
 			if  (_networking && !_network_server)
 				return;
 
@@ -469,12 +466,12 @@
 			if (y < 0)
 				return;
 
-			// Get button from Y coord.
+			/* Get button from Y coord. */
 			btn = y / (GAMEDIFF_WND_ROWSIZE + 2);
 			if (btn >= GAME_DIFFICULTY_NUM || y % (GAMEDIFF_WND_ROWSIZE + 2) >= 9)
 				return;
 
-			// Clicked disabled button?
+			/* Clicked disabled button? */
 			dis = (_game_mode == GM_NORMAL) ? DIFF_INGAME_DISABLED_BUTTONS : 0;
 
 			if (HASBIT(dis, btn))
@@ -498,9 +495,11 @@
 
 			// save value in temporary variable
 			((int*)&_opt_mod_temp.diff)[btn] = val;
+			RaiseWindowWidget(w, _opt_mod_temp.diff_level + 3);
 			SetDifficultyLevel(3, &_opt_mod_temp); // set difficulty level to custom
+			LowerWindowWidget(w, _opt_mod_temp.diff_level + 3);
 			SetWindowDirty(w);
-		}	break;
+		} break;
 		case 3: case 4: case 5: case 6: /* Easy / Medium / Hard / Custom */
 			// temporarily change difficulty level
 			RaiseWindowWidget(w, _opt_mod_temp.diff_level + 3);
@@ -584,6 +583,7 @@
 	"show_finances",
 	"autoscroll",
 	"reverse_scroll",
+	"smooth_scroll",
 	"errmsg_duration",
 	"toolbar_pos",
 	"measure_tooltip",
@@ -598,6 +598,8 @@
 	 *  Since it's also able to completely disable the scrollwheel will we display it on all platforms anyway */
 	"scrollwheel_scrolling",
 	"scrollwheel_multiplier",
+	"pause_on_newgame",
+	"advanced_vehicle_list",
 };
 
 static const char *_patches_construction[] = {
@@ -609,6 +611,7 @@
 	"drag_signals_density",
 	"oil_refinery_limit",
 	"semaphore_build_before",
+	"town_layout",
 };
 
 static const char *_patches_stations[] = {
@@ -623,6 +626,7 @@
 	"modified_catchment",
 	"gradual_loading",
 	"road_stop_on_town_road",
+	"adjacent_stations",
 };
 
 static const char *_patches_economy[] = {
@@ -635,6 +639,9 @@
 	"ending_year",
 	"smooth_economy",
 	"allow_shares",
+	"town_growth_rate",
+	"larger_towns",
+	"initial_city_size",
 };
 
 static const char *_patches_ai[] = {
--- a/src/ship.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ship.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file ship.h */
+
 #ifndef SHIP_H
 #define SHIP_H
 
@@ -21,4 +23,29 @@
 	return IsShipInDepot(v) && v->vehstatus & VS_STOPPED;
 }
 
+
+/**
+ * This class 'wraps' Vehicle; you do not actually instantiate this class.
+ * You create a Vehicle using AllocateVehicle, so it is added to the pool
+ * and you reinitialize that to a Train using:
+ *   v = new (v) Ship();
+ *
+ * As side-effect the vehicle type is set correctly.
+ */
+struct Ship: public Vehicle {
+	/** Initializes the Vehicle to a ship */
+	Ship() { this->type = VEH_SHIP; }
+
+	/** We want to 'destruct' the right class. */
+	virtual ~Ship() {}
+
+	const char *GetTypeString() const { return "ship"; }
+	void MarkDirty();
+	void UpdateDeltaXY(Direction direction);
+	ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_SHIP_INC : EXPENSES_SHIP_RUN; }
+	WindowClass GetVehicleListWindowClass() const { return WC_SHIPS_LIST; }
+	void PlayLeaveStationSound() const;
+	bool IsPrimaryVehicle() const { return true; }
+};
+
 #endif /* SHIP_H */
--- a/src/ship_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ship_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,13 @@
 /* $Id$ */
 
+/** @file ship_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "ship.h"
 #include "table/strings.h"
 #include "functions.h"
+#include "landscape.h"
 #include "map.h"
 #include "tile.h"
 #include "vehicle.h"
@@ -40,7 +43,7 @@
 
 static TrackBits GetTileShipTrackStatus(TileIndex tile)
 {
-	uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER);
+	uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER, 0);
 	return TrackdirBitsToTrackBits((TrackdirBits)(TRACKDIR_BIT_MASK & (r | r >> 8)));
 }
 
@@ -62,8 +65,8 @@
 
 /** Get the size of the sprite of a ship sprite heading west (used for lists)
  * @param engine The engine to get the sprite from
- * @param &width The width of the sprite
- * @param &height The height of the sprite
+ * @param width The width of the sprite
+ * @param height The height of the sprite
  */
 void GetShipSpriteSize(EngineID engine, uint &width, uint &height)
 {
@@ -111,7 +114,7 @@
 	if (_patches.new_pathfinding_all) {
 		NPFFoundTargetData ftd;
 		Trackdir trackdir = GetVehicleTrackdir(v);
-		ftd = NPFRouteToDepotTrialError(v->tile, trackdir, TRANSPORT_WATER, v->owner, INVALID_RAILTYPE);
+		ftd = NPFRouteToDepotTrialError(v->tile, trackdir, TRANSPORT_WATER, 0, v->owner, INVALID_RAILTYPE);
 		if (ftd.best_bird_dist == 0) {
 			best_depot = GetDepotByTile(ftd.node.tile); /* Found target */
 		} else {
@@ -162,6 +165,7 @@
 		return;
 	}
 
+	if (v->current_order.type == OT_LOADING) v->LeaveStation();
 	v->current_order.type = OT_GOTO_DEPOT;
 	v->current_order.flags = OF_NON_STOP;
 	v->current_order.dest = depot->index;
@@ -184,14 +188,14 @@
 
 	if (v->vehstatus & VS_STOPPED) return;
 
-	cost = ShipVehInfo(v->engine_type)->running_cost * _price.ship_running / 364;
+	cost = GetVehicleProperty(v, 0x0F, ShipVehInfo(v->engine_type)->running_cost) * _price.ship_running / 364;
 	v->profit_this_year -= cost >> 8;
 
 	SET_EXPENSES_TYPE(EXPENSES_SHIP_RUN);
 	SubtractMoneyFromPlayerFract(v->owner, cost);
 
 	InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
-	//we need this for the profit
+	/* we need this for the profit */
 	InvalidateWindowClasses(WC_SHIPS_LIST);
 }
 
@@ -226,19 +230,24 @@
 	}
 }
 
-static void MarkShipDirty(Vehicle *v)
+void Ship::MarkDirty()
 {
-	v->cur_image = GetShipImage(v, v->direction);
-	MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1);
+	this->cur_image = GetShipImage(this, this->direction);
+	MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1);
 }
 
-static void PlayShipSound(Vehicle *v)
+static void PlayShipSound(const Vehicle *v)
 {
 	if (!PlayVehicleSound(v, VSE_START)) {
 		SndPlayVehicleFx(ShipVehInfo(v->engine_type)->sfx, v);
 	}
 }
 
+void Ship::PlayLeaveStationSound() const
+{
+	PlayShipSound(this);
+}
+
 static void ProcessShipOrder(Vehicle *v)
 {
 	const Order *order;
@@ -297,66 +306,34 @@
 	InvalidateWindowClasses(WC_SHIPS_LIST);
 }
 
-static void HandleShipLoading(Vehicle *v)
+void Ship::UpdateDeltaXY(Direction direction)
 {
-	switch (v->current_order.type) {
-		case OT_LOADING: {
-			if (--v->load_unload_time_rem) return;
-
-			if (CanFillVehicle(v) && (
-						v->current_order.flags & OF_FULL_LOAD ||
-						(_patches.gradual_loading && !HASBIT(v->vehicle_flags, VF_LOADING_FINISHED))
-					)) {
-				SET_EXPENSES_TYPE(EXPENSES_SHIP_INC);
-				if (LoadUnloadVehicle(v, false)) {
-					InvalidateWindow(WC_SHIPS_LIST, v->owner);
-					MarkShipDirty(v);
-				}
-				return;
-			}
-			PlayShipSound(v);
-
-			Order b = v->current_order;
-			v->LeaveStation();
-			if (!(b.flags & OF_NON_STOP)) return;
-			break;
-		}
-
-		case OT_DUMMY: break;
-
-		default: return;
-	}
-
-	v->cur_order_index++;
-	InvalidateVehicleOrder(v);
-}
-
-static void UpdateShipDeltaXY(Vehicle *v, int dir)
-{
-#define MKIT(d,c,b,a) ((a&0xFF)<<24) | ((b&0xFF)<<16) | ((c&0xFF)<<8) | ((d&0xFF)<<0)
+#define MKIT(a, b, c, d) ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | ((d & 0xFF) << 0)
 	static const uint32 _delta_xy_table[8] = {
-		MKIT( -3,  -3,  6,  6),
-		MKIT(-16,  -3, 32,  6),
-		MKIT( -3,  -3,  6,  6),
-		MKIT( -3, -16,  6, 32),
-		MKIT( -3,  -3,  6,  6),
-		MKIT(-16,  -3, 32,  6),
-		MKIT( -3,  -3,  6,  6),
-		MKIT( -3, -16,  6, 32),
+		MKIT( 6,  6,  -3,  -3),
+		MKIT( 6, 32,  -3, -16),
+		MKIT( 6,  6,  -3,  -3),
+		MKIT(32,  6, -16,  -3),
+		MKIT( 6,  6,  -3,  -3),
+		MKIT( 6, 32,  -3, -16),
+		MKIT( 6,  6,  -3,  -3),
+		MKIT(32,  6, -16,  -3),
 	};
 #undef MKIT
-	uint32 x = _delta_xy_table[dir];
-	v->x_offs        = GB(x,  0, 8);
-	v->y_offs        = GB(x,  8, 8);
-	v->sprite_width  = GB(x, 16, 8);
-	v->sprite_height = GB(x, 24, 8);
+
+	uint32 x = _delta_xy_table[direction];
+	this->x_offs        = GB(x,  0, 8);
+	this->y_offs        = GB(x,  8, 8);
+	this->sprite_width  = GB(x, 16, 8);
+	this->sprite_height = GB(x, 24, 8);
+	this->z_height      = 6;
 }
 
 void RecalcShipStuff(Vehicle *v)
 {
-	UpdateShipDeltaXY(v, v->direction);
+	v->UpdateDeltaXY(v->direction);
 	v->cur_image = GetShipImage(v, v->direction);
-	MarkShipDirty(v);
+	v->MarkDirty();
 	InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 }
 
@@ -376,10 +353,10 @@
 	tile = v->tile;
 	axis = GetShipDepotAxis(tile);
 
-	// Check first side
+	/* Check first side */
 	if (_ship_sometracks[axis] & GetTileShipTrackStatus(TILE_ADD(tile, ToTileIndexDiff(_ship_leave_depot_offs[axis])))) {
 		m = (axis == AXIS_X) ? 0x101 : 0x207;
-	// Check second side
+	/* Check second side */
 	} else if (_ship_sometracks[axis + 2] & GetTileShipTrackStatus(TILE_ADD(tile, -2 * ToTileIndexDiff(_ship_leave_depot_offs[axis])))) {
 		m = (axis == AXIS_X) ? 0x105 : 0x203;
 	} else {
@@ -403,16 +380,16 @@
 	uint spd;
 	byte t;
 
-	spd = min(v->cur_speed + 1, v->max_speed);
+	spd = min(v->cur_speed + 1, GetVehicleProperty(v, 0x0B, v->max_speed));
 
-	//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)
 			InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 	}
 
-	// Decrease somewhat when turning
+	/* Decrease somewhat when turning */
 	if (!(v->direction & 1)) spd = spd * 3 / 4;
 
 	if (spd == 0) return false;
@@ -425,7 +402,7 @@
 
 static int32 EstimateShipCost(EngineID engine_type)
 {
-	return ShipVehInfo(engine_type)->base_cost * (_price.ship_base>>3)>>5;
+	return GetEngineProperty(engine_type, 0x0A, ShipVehInfo(engine_type)->base_cost) * (_price.ship_base>>3)>>5;
 }
 
 static void ShipArrivesAt(const Vehicle* v, Station* st)
@@ -455,7 +432,7 @@
 
 static bool ShipTrackFollower(TileIndex tile, PathFindShip *pfs, int track, uint length, byte *state)
 {
-	// Found dest?
+	/* Found dest? */
 	if (tile == pfs->dest_coords) {
 		pfs->best_bird_dist = 0;
 
@@ -463,7 +440,7 @@
 		return true;
 	}
 
-	// Skip this tile in the calculation
+	/* Skip this tile in the calculation */
 	if (tile != pfs->skiptile) {
 		pfs->best_bird_dist = minu(pfs->best_bird_dist, DistanceMaxPlusManhattan(pfs->dest_coords, tile));
 	}
@@ -502,7 +479,7 @@
 		pfs.best_bird_dist = (uint)-1;
 		pfs.best_length = (uint)-1;
 
-		FollowTrack(tile, 0x3800 | TRANSPORT_WATER, (DiagDirection)_ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs);
+		FollowTrack(tile, 0x3800 | TRANSPORT_WATER, 0, (DiagDirection)_ship_search_directions[i][dir], (TPFEnumProc*)ShipTrackFollower, NULL, &pfs);
 
 		if (best_track != INVALID_TRACK) {
 			if (pfs.best_bird_dist != 0) {
@@ -537,18 +514,18 @@
 {
 
 	void* perf = NpfBeginInterval();
-	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, target, type, owner, railtypes);
+	NPFFoundTargetData ret = NPFRouteToStationOrTile(tile, trackdir, target, type, 0, owner, railtypes);
 	int t = NpfEndInterval(perf);
 	DEBUG(yapf, 4, "[NPFW] %d us - %d rounds - %d open - %d closed -- ", t, 0, _aystar_stats_open_size, _aystar_stats_closed_size);
 	return ret;
 }
 
-/* returns the track to choose on the next tile, or -1 when it's better to
+/** returns the track to choose on the next tile, or -1 when it's better to
  * reverse. The tile given is the tile we are about to enter, enterdir is the
  * direction in which we are entering the tile */
 static Track ChooseShipTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks)
 {
-	assert(enterdir>=0 && enterdir<=3);
+	assert(enterdir >= 0 && enterdir <= 3);
 
 	if (_patches.yapf.ship_use_yapf) {
 		Trackdir trackdir = YapfChooseShipTrack(v, tile, enterdir, tracks);
@@ -558,7 +535,7 @@
 		NPFFoundTargetData ftd;
 		TileIndex src_tile = TILE_ADD(tile, TileOffsByDiagDir(ReverseDiagDir(enterdir)));
 		Trackdir trackdir = GetVehicleTrackdir(v);
-		assert(trackdir != INVALID_TRACKDIR); /* Check that we are not in a depot */
+		assert(trackdir != INVALID_TRACKDIR); // Check that we are not in a depot
 
 		NPFFillWithOrderData(&fstd, v);
 
@@ -620,7 +597,7 @@
 
 static TrackBits GetAvailShipTracks(TileIndex tile, int dir)
 {
-	uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER);
+	uint32 r = GetTileTrackStatus(tile, TRANSPORT_WATER, 0);
 	return (TrackBits)((r | r >> 8) & _ship_sometracks[dir]);
 }
 
@@ -651,11 +628,11 @@
 	},
 	{
 		{ 0, 0, 0},
-		{ 8,15, 7},
+		{ 8, 15, 7},
 		{ 0, 0, 0},
-		{ 8,15, 6},
+		{ 8, 15, 6},
 		{ 0, 0, 0},
-		{ 7,15, 0},
+		{ 7, 15, 0},
 	}
 };
 
@@ -680,7 +657,7 @@
 	if (v->vehstatus & VS_STOPPED) return;
 
 	ProcessShipOrder(v);
-	HandleShipLoading(v);
+	v->HandleLoading();
 
 	if (v->current_order.type == OT_LOADING) return;
 
@@ -731,19 +708,10 @@
 
 							/* Process station in the orderlist. */
 							st = GetStation(v->current_order.dest);
-							if (st->facilities & FACIL_DOCK) { /* ugly, ugly workaround for problem with ships able to drop off cargo at wrong stations */
-								v->BeginLoading();
-								v->current_order.flags &= OF_FULL_LOAD | OF_UNLOAD | OF_TRANSFER;
-								v->current_order.flags |= OF_NON_STOP;
+							if (st->facilities & FACIL_DOCK) { // ugly, ugly workaround for problem with ships able to drop off cargo at wrong stations
 								ShipArrivesAt(v, st);
-
-								SET_EXPENSES_TYPE(EXPENSES_SHIP_INC);
-								if (LoadUnloadVehicle(v, true)) {
-									InvalidateWindow(WC_SHIPS_LIST, v->owner);
-									MarkShipDirty(v);
-								}
-								InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
-							} else { /* leave stations without docks right aways */
+								v->BeginLoading();
+							} else { // leave stations without docks right aways
 								v->current_order.type = OT_LEAVESTATION;
 								v->cur_order_index++;
 								InvalidateVehicleOrder(v);
@@ -794,7 +762,7 @@
 	v->z_pos = GetSlopeZ(gp.x, gp.y);
 
 getout:
-	UpdateShipDeltaXY(v, dir);
+	v->UpdateDeltaXY(dir);
 	v->cur_image = GetShipImage(v, dir);
 	VehiclePositionChanged(v);
 	EndVehicleMove(v);
@@ -834,6 +802,7 @@
 
 /** Build a ship.
  * @param tile tile of depot where ship is built
+ * @param flags type of operation
  * @param p1 ship type being built (engine)
  * @param p2 bit 0 when set, the unitnumber will be 0, otherwise it will be a free number
  */
@@ -844,7 +813,7 @@
 	UnitID unit_num;
 	Engine *e;
 
-	if (!IsEngineBuildable(p1, VEH_SHIP, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
+	if (!IsEngineBuildable(p1, VEH_SHIP, _current_player)) return_cmd_error(STR_SHIP_NOT_AVAILABLE);
 
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
@@ -876,13 +845,9 @@
 		y = TileY(tile) * TILE_SIZE + TILE_SIZE / 2;
 		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->sprite_width = 6;
-		v->sprite_height = 6;
-		v->x_offs = -3;
-		v->y_offs = -3;
+		v->UpdateDeltaXY(v->direction);
 		v->vehstatus = VS_HIDDEN | VS_STOPPED | VS_DEFPAL;
 
 		v->spritenum = svi->image_index;
@@ -908,12 +873,14 @@
 		v->date_of_last_service = _date;
 		v->build_year = _cur_year;
 		v->cur_image = 0x0E5E;
-		v->type = VEH_SHIP;
+		v = new (v) Ship();
 		v->random_bits = VehicleRandomBits();
 
 		v->vehicle_flags = 0;
 		if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
+		v->cargo_cap = GetVehicleProperty(v, 0x0D, svi->capacity);
+
 		VehiclePositionChanged(v);
 
 		InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
@@ -930,6 +897,7 @@
 
 /** Sell a ship.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 vehicle ID to be sold
  * @param p2 unused
  */
@@ -963,6 +931,7 @@
 
 /** Start/Stop a ship.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 ship ID to start/stop
  * @param p2 unused
  */
@@ -1001,6 +970,7 @@
 
 /** Send a ship to the depot.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 vehicle ID to send to the depot
  * @param p2 various bitmasked elements
  * - p2 bit 0-3 - DEPOT_ flags (see vehicle.h)
@@ -1058,6 +1028,8 @@
 	if (dep == NULL) return_cmd_error(STR_981A_UNABLE_TO_FIND_LOCAL_DEPOT);
 
 	if (flags & DC_EXEC) {
+		if (v->current_order.type == OT_LOADING) v->LeaveStation();
+
 		v->dest_tile = dep->xy;
 		v->current_order.type = OT_GOTO_DEPOT;
 		v->current_order.flags = OF_NON_STOP;
@@ -1073,10 +1045,13 @@
 
 /** Refits a ship to the specified cargo type.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 vehicle ID of the ship to refit
  * @param p2 various bitstuffed elements
  * - p2 = (bit 0-7) - the new cargo type to refit to (p2 & 0xFF)
  * - p2 = (bit 8-15) - the new cargo subtype to refit to
+ * - p2 = (bit 16) - refit only this vehicle (ignored)
+ * @return cost of refit or error
  */
 int32 CmdRefitShip(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -1118,7 +1093,7 @@
 	}
 
 	if (capacity == CALLBACK_FAILED) {
-		capacity = ShipVehInfo(v->engine_type)->capacity;
+		capacity = GetVehicleProperty(v, 0x0D, ShipVehInfo(v->engine_type)->capacity);
 	}
 	_returned_refit_capacity = capacity;
 
--- a/src/ship_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/ship_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file ship_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -32,7 +34,7 @@
 		StringID str;
 
 		SetWindowWidgetDisabledState(w, 2, v->owner != _local_player);
-		// disable service-scroller when interval is set to disabled
+		/* disable service-scroller when interval is set to disabled */
 		SetWindowWidgetDisabledState(w, 5, !_patches.servint_ships);
 		SetWindowWidgetDisabledState(w, 6, !_patches.servint_ships);
 
@@ -76,7 +78,7 @@
 		{
 			SetDParam(0, v->service_interval);
 			SetDParam(1, v->date_of_last_service);
-			DrawString(13, 102, _patches.servint_ispercent?STR_SERVICING_INTERVAL_PERCENT:STR_883C_SERVICING_INTERVAL_DAYS, 0);
+			DrawString(13, 102, _patches.servint_ispercent ? STR_SERVICING_INTERVAL_PERCENT : STR_883C_SERVICING_INTERVAL_DAYS, 0);
 		}
 
 		DrawShipImage(v, 3, 57, INVALID_VEHICLE);
@@ -118,7 +120,7 @@
 			mod = _ctrl_pressed? 5 : 10;
 			goto do_change_service_int;
 		case 6: /* decrease int */
-			mod = _ctrl_pressed?- 5 : -10;
+			mod = _ctrl_pressed ? - 5 : -10;
 do_change_service_int:
 			v = GetVehicle(w->window_number);
 
@@ -155,7 +157,7 @@
 
 static const WindowDesc _ship_details_desc = {
 	WDP_AUTO, WDP_AUTO, 405, 113,
-	WC_VEHICLE_DETAILS,WC_VEHICLE_VIEW,
+	WC_VEHICLE_DETAILS, WC_VEHICLE_VIEW,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
 	_ship_details_widgets,
 	ShipDetailsWndProc
@@ -324,7 +326,7 @@
 { WWT_PUSHIMGBTN, RESIZE_LR,    14, 232, 249,  32,  49, SPR_SEND_SHIP_TODEPOT,   STR_982A_SEND_SHIP_TO_DEPOT},
 { WWT_PUSHIMGBTN, RESIZE_LR,    14, 232, 249,  50,  67, SPR_REFIT_VEHICLE,       STR_983A_REFIT_CARGO_SHIP_TO_CARRY},
 { WWT_PUSHIMGBTN, RESIZE_LR,    14, 232, 249,  68,  85, SPR_SHOW_ORDERS,         STR_9828_SHOW_SHIP_S_ORDERS},
-{ WWT_PUSHIMGBTN, RESIZE_LR,    14, 232, 249,  86, 103, SPR_SHOW_VEHICLE_DETAILS,STR_982B_SHOW_SHIP_DETAILS},
+{ WWT_PUSHIMGBTN, RESIZE_LR,    14, 232, 249,  86, 103, SPR_SHOW_VEHICLE_DETAILS, STR_982B_SHOW_SHIP_DETAILS},
 { WWT_PUSHIMGBTN, RESIZE_LR,    14, 232, 249,  32,  49, SPR_CLONE_SHIP,          STR_CLONE_SHIP_INFO},
 {      WWT_PANEL, RESIZE_LRB,   14, 232, 249, 104, 103, 0x0,                     STR_NULL },
 {  WWT_RESIZEBOX, RESIZE_LRTB,  14, 238, 249, 104, 115, 0x0,                     STR_NULL },
@@ -345,6 +347,6 @@
 
 	if (w != NULL) {
 		w->caption_color = v->owner;
-		AssignWindowViewport(w, 3, 17, 0xE2, 0x54, w->window_number | (1 << 31), 0);
+		AssignWindowViewport(w, 3, 17, 0xE2, 0x54, w->window_number | (1 << 31), ZOOM_LVL_SHIP);
 	}
 }
--- a/src/signs.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/signs.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,9 +1,12 @@
 /* $Id$ */
 
+/** @file signs.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
 #include "functions.h"
+#include "landscape.h"
 #include "player.h"
 #include "signs.h"
 #include "saveload.h"
@@ -30,6 +33,7 @@
 /**
  *
  * Update the coordinate of one sign
+ * @param si Pointer to the Sign
  *
  */
 static void UpdateSignVirtCoords(Sign *si)
@@ -60,11 +64,14 @@
  */
 static void MarkSignDirty(Sign *si)
 {
+	/* We use ZOOM_LVL_MAX here, as every viewport can have an other zoom,
+		*  and there is no way for us to know which is the biggest. So make the
+		*  biggest area dirty, and we are safe for sure. */
 	MarkAllViewportsDirty(
 		si->sign.left - 6,
 		si->sign.top  - 3,
-		si->sign.left + si->sign.width_1 * 4 + 12,
-		si->sign.top  + 45);
+		si->sign.left + ScaleByZoom(si->sign.width_1 + 12, ZOOM_LVL_MAX),
+		si->sign.top  + ScaleByZoom(12, ZOOM_LVL_MAX));
 }
 
 /**
@@ -97,6 +104,10 @@
 	return NULL;
 }
 
+/**
+ * Destroy a sign placed on the map
+ * @param si Pointer to the Sign to remove
+ */
 void DestroySign(Sign *si)
 {
 	DeleteName(si->str);
@@ -107,6 +118,7 @@
  * no effect whatsoever except for the colour the sign gets for easy recognition,
  * but everybody is able to rename/remove it.
  * @param tile tile to place sign at
+ * @param flags type of operation
  * @param p1 unused
  * @param p2 unused
  */
@@ -127,7 +139,7 @@
 		si->x = x;
 		si->y = y;
 		si->owner = _current_player; // owner of the sign; just eyecandy
-		si->z = GetSlopeZ(x,y);
+		si->z = GetSlopeZ(x, y);
 		UpdateSignVirtCoords(si);
 		MarkSignDirty(si);
 		InvalidateWindow(WC_SIGN_LIST, 0);
@@ -142,8 +154,10 @@
  * the user wanted to delete it. So delete it. Ownership of signs
  * has no meaning/effect whatsoever except for eyecandy
  * @param tile unused
+ * @param flags type of operation
  * @param p1 index of the sign to be renamed/removed
  * @param p2 unused
+ * @return 0 if succesfull, otherwise CMD_ERROR
  */
 int32 CmdRenameSign(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -175,7 +189,7 @@
 			/* Free the name, because we did not assign it yet */
 			DeleteName(str);
 		}
-	} else { /* Delete sign */
+	} else { // Delete sign
 		if (flags & DC_EXEC) {
 			Sign *si = GetSign(p1);
 
@@ -191,9 +205,11 @@
 }
 
 /**
- *
  * Callback function that is called after a sign is placed
- *
+ * @param success of the operation
+ * @param tile unused
+ * @param p1 unused
+ * @param p2 unused
  */
 void CcPlaceSign(bool success, TileIndex tile, uint32 p1, uint32 p2)
 {
@@ -207,7 +223,7 @@
  *
  * PlaceProc function, called when someone pressed the button if the
  *  sign-tool is selected
- *
+ * @param tile on which to place the sign
  */
 void PlaceProc_Sign(TileIndex tile)
 {
--- a/src/signs.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/signs.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file signs.h */
+
 #ifndef SIGNS_H
 #define SIGNS_H
 
@@ -62,7 +64,7 @@
 void UpdateAllSignVirtCoords();
 void PlaceProc_Sign(TileIndex tile);
 
-/* misc.c */
+/* misc.cpp */
 void ShowRenameSignWindow(const Sign *si);
 
 void ShowSignList();
--- a/src/signs_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/signs_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file signs_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
--- a/src/slope.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/slope.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file slope.h */
+
 #ifndef SLOPE_H
 #define SLOPE_H
 
--- a/src/smallmap_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/smallmap_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file smallmap_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
@@ -9,6 +11,7 @@
 #include "station_map.h"
 #include "table/strings.h"
 #include "table/sprites.h"
+#include "landscape.h"
 #include "map.h"
 #include "tile.h"
 #include "gui.h"
@@ -46,12 +49,24 @@
 static int _smallmap_type;
 static bool _smallmap_show_towns = true;
 
-#define MK(a,b) a, b
-#define MKEND() 0xFFFF
-#define MS(a,b) (a | 0x100), b
+/** Macro for ordinary entry of LegendAndColor */
+#define MK(a,b) {a, b, false, false}
+/** Macro for end of list marker in arrays of LegendAndColor */
+#define MKEND() {0, STR_NULL, true, false}
+/** Macro for break marker in arrays of LegendAndColor.
+ * It will have valid data, though */
+#define MS(a,b) {a, b, false, true}
 
-/* Legend text giving the colours to look for on the minimap */
-static const uint16 _legend_land_contours[] = {
+/** Structure for holding relevant data for legends in small map */
+struct LegendAndColour {
+	uint16 colour;     ///< color of the item on the map
+	StringID legend;   ///< string corresponding to the colored item
+	bool end;         ///< this is the end of the list
+	bool col_break;   ///< perform a break and go one collumn further
+};
+
+/** Legend text giving the colours to look for on the minimap */
+static const LegendAndColour _legend_land_contours[] = {
 	MK(0x5A, STR_00F0_100M),
 	MK(0x5C, STR_00F1_200M),
 	MK(0x5E, STR_00F2_300M),
@@ -66,7 +81,7 @@
 	MKEND()
 };
 
-static const uint16 _legend_vehicles[] = {
+static const LegendAndColour _legend_vehicles[] = {
 	MK(0xB8, STR_00F5_TRAINS),
 	MK(0xBF, STR_00F6_ROAD_VEHICLES),
 	MK(0x98, STR_00F7_SHIPS),
@@ -76,73 +91,7 @@
 	MKEND()
 };
 
-static const uint16 _legend_industries_normal[] = {
-	MK(0xD7, STR_00FA_COAL_MINE),
-	MK(0xB8, STR_00FB_POWER_STATION),
-	MK(0x56, STR_00FC_FOREST),
-	MK(0xC2, STR_00FD_SAWMILL),
-	MK(0xBF, STR_00FE_OIL_REFINERY),
-	MK(0x0F, STR_0105_BANK),
-
-	MS(0x30, STR_00FF_FARM),
-	MK(0xAE, STR_0100_FACTORY),
-	MK(0x98, STR_0102_OIL_WELLS),
-	MK(0x37, STR_0103_IRON_ORE_MINE),
-	MK(0x0A, STR_0104_STEEL_MILL),
-	MKEND()
-};
-
-static const uint16 _legend_industries_hilly[] = {
-	MK(0xD7, STR_00FA_COAL_MINE),
-	MK(0xB8, STR_00FB_POWER_STATION),
-	MK(0x56, STR_00FC_FOREST),
-	MK(0x0A, STR_0106_PAPER_MILL),
-	MK(0xBF, STR_00FE_OIL_REFINERY),
-	MK(0x37, STR_0108_FOOD_PROCESSING_PLANT),
-	MS(0x30, STR_00FF_FARM),
-
-	MK(0xAE, STR_0101_PRINTING_WORKS),
-	MK(0x98, STR_0102_OIL_WELLS),
-	MK(0xC2, STR_0107_GOLD_MINE),
-	MK(0x0F, STR_0105_BANK),
-	MKEND()
-};
-
-static const uint16 _legend_industries_desert[] = {
-	MK(0xBF, STR_00FE_OIL_REFINERY),
-	MK(0x98, STR_0102_OIL_WELLS),
-	MK(0x0F, STR_0105_BANK),
-	MK(0xB8, STR_0109_DIAMOND_MINE),
-	MK(0x37, STR_0108_FOOD_PROCESSING_PLANT),
-	MK(0x0A, STR_010A_COPPER_ORE_MINE),
-	MK(0x30, STR_00FF_FARM),
-	MS(0x56, STR_010B_FRUIT_PLANTATION),
-
-	MK(0x27, STR_010C_RUBBER_PLANTATION),
-	MK(0x25, STR_010D_WATER_SUPPLY),
-	MK(0xD0, STR_010E_WATER_TOWER),
-	MK(0xAE, STR_0100_FACTORY),
-	MK(0xC2, STR_010F_LUMBER_MILL),
-	MKEND()
-};
-
-static const uint16 _legend_industries_candy[] = {
-	MK(0x30, STR_0110_COTTON_CANDY_FOREST),
-	MK(0xAE, STR_0111_CANDY_FACTORY),
-	MK(0x27, STR_0112_BATTERY_FARM),
-	MK(0x37, STR_0113_COLA_WELLS),
-	MK(0xD0, STR_0114_TOY_SHOP),
-	MK(0x0A, STR_0115_TOY_FACTORY),
-	MS(0x25, STR_0116_PLASTIC_FOUNTAINS),
-
-	MK(0xB8, STR_0117_FIZZY_DRINK_FACTORY),
-	MK(0x98, STR_0118_BUBBLE_GENERATOR),
-	MK(0xC2, STR_0119_TOFFEE_QUARRY),
-	MK(0x0F, STR_011A_SUGAR_MINE),
-	MKEND()
-};
-
-static const uint16 _legend_routes[] = {
+static const LegendAndColour _legend_routes[] = {
 	MK(0xD7, STR_00EB_ROADS),
 	MK(0x0A, STR_00EC_RAILROADS),
 	MK(0xB5, STR_00EE_BUILDINGS_INDUSTRIES),
@@ -155,7 +104,7 @@
 	MKEND()
 };
 
-static const uint16 _legend_vegetation[] = {
+static const LegendAndColour _legend_vegetation[] = {
 	MK(0x52, STR_0120_ROUGH_LAND),
 	MK(0x54, STR_0121_GRASS_LAND),
 	MK(0x37, STR_0122_BARE_LAND),
@@ -171,7 +120,7 @@
 	MKEND()
 };
 
-static const uint16 _legend_land_owners[] = {
+static const LegendAndColour _legend_land_owners[] = {
 	MK(0xCA, STR_0126_WATER),
 	MK(0x54, STR_0127_NO_OWNER),
 	MK(0xB4, STR_0128_TOWNS),
@@ -182,20 +131,40 @@
 #undef MS
 #undef MKEND
 
+/** Allow room for all industries, plus a terminator entry
+ * This is required in order to have the indutry slots all filled up */
+static LegendAndColour _legend_from_industries[NUM_INDUSTRYTYPES+1];
 
-enum { IND_OFFS = 6 };
-static const uint16 * const _legend_table[] = {
+/**
+ * Fills an array for the industries legends.
+ */
+void BuildIndustriesLegend()
+{
+	const IndustrySpec *indsp;
+	uint j = 0;
+
+	/* Add each name */
+	for (IndustryType i = 0; i < NUM_INDUSTRYTYPES; i++) {
+		indsp = GetIndustrySpec(i);
+		if (indsp->enabled) {
+			_legend_from_industries[j].legend = indsp->name;
+			_legend_from_industries[j].colour = indsp->map_colour;
+			_legend_from_industries[j].col_break = (j % 6) == 0;  // break is performed on the 7th item
+			_legend_from_industries[j].end = false;
+			j++;
+		}
+	}
+	/* Terminate the list */
+	_legend_from_industries[j].end = true;
+}
+
+static const LegendAndColour * const _legend_table[] = {
 	_legend_land_contours,
 	_legend_vehicles,
-	NULL,
+	_legend_from_industries,
 	_legend_routes,
 	_legend_vegetation,
 	_legend_land_owners,
-
-	_legend_industries_normal,
-	_legend_industries_hilly,
-	_legend_industries_desert,
-	_legend_industries_candy,
 };
 
 #if defined(OTTD_ALIGNMENT)
@@ -332,13 +301,13 @@
 	Pixel *dst_ptr_end = _screen.dst_ptr + _screen.width * _screen.height - _screen.width;
 
 	do {
-		// check if the tile (xc,yc) is within the map range
+		/* check if the tile (xc,yc) is within the map range */
 		if (xc < MapMaxX() && yc < MapMaxY()) {
-			// check if the dst pointer points to a pixel inside the screen buffer
+			/* check if the dst pointer points to a pixel inside the screen buffer */
 			if (dst > _screen.dst_ptr && dst < dst_ptr_end)
 				WRITE_PIXELS_OR(dst, proc(TileXY(xc, yc)) & mask);
 		}
-	// switch to next tile in the column
+	/* switch to next tile in the column */
 	} while (xc++, yc++, dst += pitch, --reps != 0);
 }
 
@@ -380,7 +349,7 @@
 /**
  * Return the color a tile would be displayed with in the small map in mode "Vehicles".
  *
- * @param t The tile of which we would like to get the color.
+ * @param tile The tile of which we would like to get the color.
  * @return The color of tile in the small map in mode "Vehicles"
  */
 static inline uint32 GetSmallMapVehiclesPixels(TileIndex tile)
@@ -390,32 +359,6 @@
 	return ApplyMask(MKCOLOR(0x54545454), &_smallmap_vehicles_andor[t]);
 }
 
-/* Industry colours... a total of 175 gfx - XXX - increase if more industries */
-static const byte _industry_smallmap_colors[175] = {
-	215, 215, 215, 215, 215, 215, 215, 184,
-	184, 184, 184, 194, 194, 194, 194, 194,
-	 86,  86, 191, 191, 191, 191, 191, 191,
-	152, 152, 152, 152, 152, 152, 152, 152,
-	152,  48,  48,  48,  48,  48,  48, 174,
-	174, 174, 174, 174, 174, 174, 174,  10,
-	 10,  10,  10,  10,  10,  10,  10,  10,
-	 10,  10,  15,  15,  55,  55,  55,  55,
-	 10,  10,  10,  10,  10,  10,  10,  10,
-	194, 194, 194, 194, 194, 194, 194, 194,
-	194, 194, 194, 194, 194, 194, 194, 194,
-	194,  15,  15, 184, 184, 184, 184, 184,
-	184, 184, 184, 184,  55,  55,  55,  55,
-	 55,  55,  55,  55,  55,  55,  55,  55,
-	 55,  55,  55,  55,  86,  39,  37,  37,
-	208, 174, 174, 174, 174, 194, 194, 194,
-	194,  48,  48, 174, 174, 174, 174,  39,
-	 39,  55, 208, 208, 208, 208,  10,  10,
-	 10,  10,  10,  10,  37,  37,  37,  37,
-	 37,  37,  37,  37, 184, 184, 184, 184,
-	152, 152, 152, 152, 194, 194, 194,  15,
-	 15,  15,  15,  15,  15,  15,  15,
-};
-
 /**
  * Return the color a tile would be displayed with in the small map in mode "Industries".
  *
@@ -427,7 +370,7 @@
 	TileType t = GetEffectiveTileType(tile);
 
 	if (t == MP_INDUSTRY) {
-		return _industry_smallmap_colors[GetIndustryGfx(tile)] * 0x01010101;
+		return GetIndustrySpec(GetIndustryByTile(tile)->type)->map_colour * 0x01010101;
 	}
 
 	return ApplyMask(MKCOLOR(0x54545454), &_smallmap_vehicles_andor[t]);
@@ -436,7 +379,7 @@
 /**
  * Return the color a tile would be displayed with in the small map in mode "Routes".
  *
- * @param t The tile of which we would like to get the color.
+ * @param tile The tile of which we would like to get the color.
  * @return The color of tile  in the small map in mode "Routes"
  */
 static inline uint32 GetSmallMapRoutesPixels(TileIndex tile)
@@ -454,7 +397,7 @@
 			default:              bits = MKCOLOR(0xFFFFFFFF); break;
 		}
 	} else {
-		// ground color
+		/* ground color */
 		bits = ApplyMask(MKCOLOR(0x54545454), &_smallmap_contours_andor[t]);
 	}
 	return bits;
@@ -487,7 +430,7 @@
 			break;
 
 		case MP_INDUSTRY:
-			bits = GetIndustryType(tile) == IT_FOREST ? MKCOLOR(0xD0D0D0D0) : MKCOLOR(0xB5B5B5B5);
+			bits = GetIndustrySpec(GetIndustryByTile(tile)->type)->check_proc == CHECK_FOREST ? MKCOLOR(0xD0D0D0D0) : MKCOLOR(0xB5B5B5B5);
 			break;
 
 		case MP_TREES:
@@ -512,7 +455,7 @@
 /**
  * Return the color a tile would be displayed with in the small map in mode "Owner".
  *
- * @param t The tile of which we would like to get the color.
+ * @param tile The tile of which we would like to get the color.
  * @return The color of tile in the small map in mode "Owner"
  */
 static inline uint32 GetSmallMapOwnerPixels(TileIndex tile)
@@ -576,7 +519,7 @@
  * are drawn directly into the screen buffer. The final map is drawn in multiple passes.
  * The passes are:
  * <ol><li>The colors of tiles in the different modes.</li>
- * <li>Town names (optional)</li>
+ * <li>Town names (optional)</li></ol>
  *
  * @param dpi pointer to pixel to write onto
  * @param w pointer to Window struct
@@ -693,7 +636,7 @@
 		FOR_ALL_VEHICLES(v) {
 			if (v->type != VEH_SPECIAL &&
 					(v->vehstatus & (VS_HIDDEN | VS_UNCLICKABLE)) == 0) {
-				// Remap into flat coordinates.
+				/* Remap into flat coordinates. */
 				Point pt = RemapCoords(
 					v->x_pos / TILE_SIZE - WP(w,smallmap_d).scroll_x / TILE_SIZE, // divide each one separately because (a-b)/c != a/c-b/c in integer world
 					v->y_pos / TILE_SIZE - WP(w,smallmap_d).scroll_y / TILE_SIZE, //    dtto
@@ -701,32 +644,32 @@
 				x = pt.x;
 				y = pt.y;
 
-				// Check if y is out of bounds?
+				/* Check if y is out of bounds? */
 				y -= dpi->top;
 				if (!IS_INT_INSIDE(y, 0, dpi->height)) continue;
 
-				// Default is to draw both pixels.
+				/* Default is to draw both pixels. */
 				skip = false;
 
-				// Offset X coordinate
+				/* Offset X coordinate */
 				x -= WP(w,smallmap_d).subscroll + 3 + dpi->left;
 
 				if (x < 0) {
-					// if x+1 is 0, that means we're on the very left edge,
-					//  and should thus only draw a single pixel
+					/* if x+1 is 0, that means we're on the very left edge,
+					 *  and should thus only draw a single pixel */
 					if (++x != 0) continue;
 					skip = true;
 				} else if (x >= dpi->width - 1) {
-					// Check if we're at the very right edge, and if so draw only a single pixel
+					/* Check if we're at the very right edge, and if so draw only a single pixel */
 					if (x != dpi->width - 1) continue;
 					skip = true;
 				}
 
-				// Calculate pointer to pixel and the color
+				/* Calculate pointer to pixel and the color */
 				ptr = dpi->dst_ptr + y * dpi->pitch + x;
 				color = (type == 1) ? _vehicle_type_colors[v->type] : 0xF;
 
-				// And draw either one or two pixels depending on clipping
+				/* And draw either one or two pixels depending on clipping */
 				ptr[0] = color;
 				if (!skip) ptr[1] = color;
 			}
@@ -737,7 +680,7 @@
 		const Town *t;
 
 		FOR_ALL_TOWNS(t) {
-			// Remap the town coordinate
+			/* Remap the town coordinate */
 			Point pt = RemapCoords(
 				(int)(TileX(t->xy) * TILE_SIZE - WP(w, smallmap_d).scroll_x) / TILE_SIZE,
 				(int)(TileY(t->xy) * TILE_SIZE - WP(w, smallmap_d).scroll_y) / TILE_SIZE,
@@ -745,23 +688,23 @@
 			x = pt.x - WP(w,smallmap_d).subscroll + 3 - (t->sign.width_2 >> 1);
 			y = pt.y;
 
-			// Check if the town sign is within bounds
+			/* Check if the town sign is within bounds */
 			if (x + t->sign.width_2 > dpi->left &&
 					x < dpi->left + dpi->width &&
 					y + 6 > dpi->top &&
 					y < dpi->top + dpi->height) {
-				// And draw it.
+				/* And draw it. */
 				SetDParam(0, t->index);
 				DrawString(x, y, STR_2056, 12);
 			}
 		}
 	}
 
-	// Draw map indicators
+	/* Draw map indicators */
 	{
 		Point pt;
 
-		// Find main viewport.
+		/* Find main viewport. */
 		vp = FindWindowById(WC_MAIN_WINDOW,0)->viewport;
 
 		pt = RemapCoords(WP(w, smallmap_d).scroll_x, WP(w, smallmap_d).scroll_y, 0);
@@ -802,7 +745,7 @@
 {
 	switch (e->event) {
 		case WE_PAINT: {
-			const uint16 *tbl;
+			const LegendAndColour *tbl;
 			int x, y, y_org;
 			DrawPixelInfo new_dpi;
 
@@ -810,22 +753,31 @@
 			SetDParam(0, STR_00E5_CONTOURS + _smallmap_type);
 			DrawWindowWidgets(w);
 
-			/* draw the legend */
-			tbl = _legend_table[(_smallmap_type != 2) ? _smallmap_type : (_opt.landscape + IND_OFFS)];
+			tbl = _legend_table[_smallmap_type];
+
 			x = 4;
 			y_org = w->height - 44 - 11;
 			y = y_org;
 			for (;;) {
 				GfxFillRect(x,     y + 1, x + 8, y + 5, 0);
-				GfxFillRect(x + 1, y + 2, x + 7, y + 4, (byte)tbl[0]);
-				DrawString(x + 11, y, tbl[1], 0);
+				GfxFillRect(x + 1, y + 2, x + 7, y + 4, tbl->colour);
 
-				tbl += 2;
+				if (_smallmap_type == 2) {
+					/* Industry name must be formated, since it's not in tiny font in the specs.
+					* So, draw with a parameter and use the STR_7065 string, which is tiny, black */
+					SetDParam(0, tbl->legend);
+					DrawString(x + 11, y, STR_7065, 0);
+				} else {
+					DrawString(x + 11, y, tbl->legend, 0);
+				}
+
+				tbl += 1;
 				y += 6;
 
-				if (tbl[0] == 0xFFFF) {
+				if (tbl->end) { // end of the list
 					break;
-				} else if (tbl[0] & 0x100) {
+				} else if (tbl->col_break) {
+					/*  break asked, continue at top, 123 pixels (one "row") to the right */
 					x += 123;
 					y = y_org;
 				}
@@ -854,8 +806,8 @@
 					_left_button_clicked = false;
 
 					pt = RemapCoords(WP(w,smallmap_d).scroll_x, WP(w,smallmap_d).scroll_y, 0);
-					WP(w2, vp_d).scrollpos_x = pt.x + ((_cursor.pos.x - w->left + 2) << 4) - (w2->viewport->virtual_width >> 1);
-					WP(w2, vp_d).scrollpos_y = pt.y + ((_cursor.pos.y - w->top - 16) << 4) - (w2->viewport->virtual_height >> 1);
+					WP(w2, vp_d).dest_scrollpos_x = pt.x + ((_cursor.pos.x - w->left + 2) << 4) - (w2->viewport->virtual_width >> 1);
+					WP(w2, vp_d).dest_scrollpos_y = pt.y + ((_cursor.pos.y - w->top - 16) << 4) - (w2->viewport->virtual_height >> 1);
 
 					SetWindowDirty(w);
 				} break;
@@ -1033,9 +985,9 @@
 			int x = WP(w, vp_d).scrollpos_x; // Where is the main looking at
 			int y = WP(w, vp_d).scrollpos_y;
 
-			// set this view to same location. Based on the center, adjusting for zoom
-			WP(w2, vp_d).scrollpos_x =  x - (w2->viewport->virtual_width -  w->viewport->virtual_width) / 2;
-			WP(w2, vp_d).scrollpos_y =  y - (w2->viewport->virtual_height - w->viewport->virtual_height) / 2;
+			/* set this view to same location. Based on the center, adjusting for zoom */
+			WP(w2, vp_d).dest_scrollpos_x =  x - (w2->viewport->virtual_width -  w->viewport->virtual_width) / 2;
+			WP(w2, vp_d).dest_scrollpos_y =  y - (w2->viewport->virtual_height - w->viewport->virtual_height) / 2;
 		} break;
 
 		case 8: { /* inverse location button (move this view to same spot as main view) 'Copy Location' */
@@ -1043,8 +995,8 @@
 			int x = WP(w2, const vp_d).scrollpos_x;
 			int y = WP(w2, const vp_d).scrollpos_y;
 
-			WP(w, vp_d).scrollpos_x =  x + (w2->viewport->virtual_width -  w->viewport->virtual_width) / 2;
-			WP(w, vp_d).scrollpos_y =  y + (w2->viewport->virtual_height - w->viewport->virtual_height) / 2;
+			WP(w, vp_d).dest_scrollpos_x =  x + (w2->viewport->virtual_width -  w->viewport->virtual_width) / 2;
+			WP(w, vp_d).dest_scrollpos_y =  y + (w2->viewport->virtual_height - w->viewport->virtual_height) / 2;
 		} break;
 		}
 		break;
@@ -1064,8 +1016,10 @@
 				_scrolling_viewport = false;
 			}
 
-			WP(w, vp_d).scrollpos_x += e->we.scroll.delta.x << vp->zoom;
-			WP(w, vp_d).scrollpos_y += e->we.scroll.delta.y << vp->zoom;
+			WP(w, vp_d).scrollpos_x += ScaleByZoom(e->we.scroll.delta.x, vp->zoom);
+			WP(w, vp_d).scrollpos_y += ScaleByZoom(e->we.scroll.delta.y, vp->zoom);
+			WP(w, vp_d).dest_scrollpos_x = WP(w, vp_d).scrollpos_x;
+			WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y;
 		} break;
 
 		case WE_MOUSEWHEEL:
@@ -1094,21 +1048,23 @@
 	Window *w, *v;
 	int i = 0;
 
-	// find next free window number for extra viewport
+	/* find next free window number for extra viewport */
 	while (FindWindowById(WC_EXTRA_VIEW_PORT, i) != NULL) i++;
 
 	w = AllocateWindowDescFront(&_extra_view_port_desc, i);
 	if (w != NULL) {
 		int x, y;
-		// the main window with the main view
+		/* the main window with the main view */
 		v = FindWindowById(WC_MAIN_WINDOW, 0);
-		// New viewport start ats (zero,zero)
-		AssignWindowViewport(w, 3, 17, 294, 214, 0 , 0);
+		/* New viewport start ats (zero,zero) */
+		AssignWindowViewport(w, 3, 17, 294, 214, 0 , ZOOM_LVL_VIEWPORT);
 
-		// center on same place as main window (zoom is maximum, no adjustment needed)
+		/* center on same place as main window (zoom is maximum, no adjustment needed) */
 		x = WP(v, vp_d).scrollpos_x;
 		y = WP(v, vp_d).scrollpos_y;
 		WP(w, vp_d).scrollpos_x = x + (v->viewport->virtual_width  - (294)) / 2;
 		WP(w, vp_d).scrollpos_y = y + (v->viewport->virtual_height - (214)) / 2;
+		WP(w, vp_d).dest_scrollpos_x = WP(w, vp_d).scrollpos_x;
+		WP(w, vp_d).dest_scrollpos_y = WP(w, vp_d).scrollpos_y;
 	}
 }
--- a/src/sound.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/sound.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,8 +1,11 @@
 /* $Id$ */
 
+/** @file sound.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
+#include "landscape.h"
 #include "map.h"
 #include "mixer.h"
 #include "sound.h"
@@ -51,12 +54,12 @@
 
 		FioSeekTo(fe->file_offset, SEEK_SET);
 
-		// Check for special case, see else case
+		/* Check for special case, see else case */
 		FioReadBlock(name, FioReadByte()); // Read the name of the sound
 		if (strcmp(name, "Corrupt sound") != 0) {
 			FioSeekTo(12, SEEK_CUR); // Skip past RIFF header
 
-			// Read riff tags
+			/* Read riff tags */
 			for (;;) {
 				uint32 tag = FioReadDword();
 				uint32 size = FioReadDword();
@@ -130,7 +133,7 @@
 	return true;
 }
 
-// Low level sound player
+/* Low level sound player */
 static void StartSound(uint sound, int panning, uint volume)
 {
 	MixerChannel *mc;
@@ -149,7 +152,8 @@
 }
 
 
-static const byte _vol_factor_by_zoom[] = {255, 190, 134};
+static const byte _vol_factor_by_zoom[] = {255, 190, 134, 87, 49};
+assert_compile(lengthof(_vol_factor_by_zoom) == ZOOM_LVL_END);
 
 static const byte _sound_base_vol[] = {
 	128,  90, 128, 128, 128, 128, 128, 128,
--- a/src/sound.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/sound.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file sound.h */
+
 #ifndef SOUND_H
 #define SOUND_H
 
--- a/src/sprite.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/sprite.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file sprite.h */
+
 #ifndef SPRITE_H
 #define SPRITE_H
 
@@ -40,7 +42,7 @@
 	byte draw_proc;  /* this allows to specify a special drawing procedure.*/
 };
 
-// Iterate through all DrawTileSeqStructs in DrawTileSprites.
+/** Iterate through all DrawTileSeqStructs in DrawTileSprites. */
 #define foreach_draw_tile_seq(idx, list) for (idx = list; ((byte) idx->delta_x) != 0x80; idx++)
 
 
--- a/src/spritecache.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/spritecache.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file spritecache.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -237,7 +239,7 @@
 
 void IncreaseSpriteLRU()
 {
-	// Increase all LRU values
+	/* Increase all LRU values */
 	if (_sprite_lru_counter > 16384) {
 		SpriteID i;
 
@@ -256,15 +258,15 @@
 		_sprite_lru_counter = 0;
 	}
 
-	// Compact sprite cache every now and then.
+	/* Compact sprite cache every now and then. */
 	if (++_compact_cache_counter >= 740) {
 		CompactSpriteCache();
 		_compact_cache_counter = 0;
 	}
 }
 
-// Called when holes in the sprite cache should be removed.
-// That is accomplished by moving the cached data.
+/** Called when holes in the sprite cache should be removed.
+ * That is accomplished by moving the cached data. */
 static void CompactSpriteCache()
 {
 	MemBlock *s;
@@ -277,26 +279,26 @@
 			MemBlock temp;
 			SpriteID i;
 
-			// Since free blocks are automatically coalesced, this should hold true.
+			/* Since free blocks are automatically coalesced, this should hold true. */
 			assert(!(next->size & S_FREE_MASK));
 
-			// If the next block is the sentinel block, we can safely return
+			/* If the next block is the sentinel block, we can safely return */
 			if (next->size == 0)
 				break;
 
-			// Locate the sprite belonging to the next pointer.
+			/* Locate the sprite belonging to the next pointer. */
 			for (i = 0; GetSpriteCache(i)->ptr != next->data; i++) {
 				assert(i != _spritecache_items);
 			}
 
 			GetSpriteCache(i)->ptr = s->data; // Adjust sprite array entry
-			// Swap this and the next block
+			/* Swap this and the next block */
 			temp = *s;
 			memmove(s, next, next->size);
 			s = NextBlock(s);
 			*s = temp;
 
-			// Coalesce free blocks
+			/* Coalesce free blocks */
 			while (NextBlock(s)->size & S_FREE_MASK) {
 				s->size += NextBlock(s)->size & ~S_FREE_MASK;
 			}
@@ -324,18 +326,18 @@
 		}
 	}
 
-	// Display an error message and die, in case we found no sprite at all.
-	// This shouldn't really happen, unless all sprites are locked.
+	/* Display an error message and die, in case we found no sprite at all.
+	 * This shouldn't really happen, unless all sprites are locked. */
 	if (best == (uint)-1)
 		error("Out of sprite memory");
 
-	// Mark the block as free (the block must be in use)
+	/* Mark the block as free (the block must be in use) */
 	s = (MemBlock*)GetSpriteCache(best)->ptr - 1;
 	assert(!(s->size & S_FREE_MASK));
 	s->size |= S_FREE_MASK;
 	GetSpriteCache(best)->ptr = NULL;
 
-	// And coalesce adjacent free blocks
+	/* And coalesce adjacent free blocks */
 	for (s = _spritecache_ptr; s->size != 0; s = NextBlock(s)) {
 		if (s->size & S_FREE_MASK) {
 			while (NextBlock(s)->size & S_FREE_MASK) {
@@ -364,10 +366,10 @@
 				 * big enough for an additional free block? */
 				if (cur_size == mem_req ||
 						cur_size >= mem_req + sizeof(MemBlock)) {
-					// Set size and in use
+					/* Set size and in use */
 					s->size = mem_req;
 
-					// Do we need to inject a free block too?
+					/* Do we need to inject a free block too? */
 					if (cur_size != mem_req) {
 						NextBlock(s)->size = (cur_size - mem_req) | S_FREE_MASK;
 					}
@@ -377,7 +379,7 @@
 			}
 		}
 
-		// Reached sentinel, but no block found yet. Delete some old entry.
+		/* Reached sentinel, but no block found yet. Delete some old entry. */
 		DeleteEntryFromSpriteCache();
 	}
 }
@@ -392,12 +394,12 @@
 
 	sc = GetSpriteCache(sprite);
 
-	// Update LRU
+	/* Update LRU */
 	sc->lru = ++_sprite_lru_counter;
 
 	p = sc->ptr;
 
-	// Load the sprite, if it is not loaded, yet
+	/* Load the sprite, if it is not loaded, yet */
 	if (p == NULL) p = ReadSprite(sc, sprite);
 	return p;
 }
@@ -405,12 +407,12 @@
 
 void GfxInitSpriteMem()
 {
-	// initialize sprite cache heap
+	/* initialize sprite cache heap */
 	if (_spritecache_ptr == NULL) _spritecache_ptr = (MemBlock*)malloc(SPRITE_CACHE_SIZE);
 
-	// A big free block
+	/* A big free block */
 	_spritecache_ptr->size = (SPRITE_CACHE_SIZE - sizeof(MemBlock)) | S_FREE_MASK;
-	// Sentinel block (identified by size == 0)
+	/* Sentinel block (identified by size == 0) */
 	NextBlock(_spritecache_ptr)->size = 0;
 
 	/* Reset the spritecache 'pool' */
--- a/src/spritecache.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/spritecache.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file spritecache.h */
+
 #ifndef SPRITECACHE_H
 #define SPRITECACHE_H
 
--- a/src/station.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/station.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -55,12 +55,11 @@
 }
 
 /**
-	* Clean up a station by clearing vehicle orders and invalidating windows.
-	* Aircraft-Hangar orders need special treatment here, as the hangars are
-	* actually part of a station (tiletype is STATION), but the order type
-	* is OT_GOTO_DEPOT.
-	* @param st Station to be deleted
-	*/
+ * Clean up a station by clearing vehicle orders and invalidating windows.
+ * Aircraft-Hangar orders need special treatment here, as the hangars are
+ * actually part of a station (tiletype is STATION), but the order type
+ * is OT_GOTO_DEPOT.
+ */
 Station::~Station()
 {
 	DEBUG(station, cDebugCtorLevel, "I-%3d", index);
@@ -106,7 +105,7 @@
 }
 
 /** Called when new facility is built on the station. If it is the first facility
-	* it initializes also 'xy' and 'random_bits' members */
+ * it initializes also 'xy' and 'random_bits' members */
 void Station::AddFacility(byte new_facility_bit, TileIndex facil_xy)
 {
 	if (facilities == 0) {
@@ -123,11 +122,14 @@
 	if (sign.width_1 != 0) {
 		InvalidateWindowWidget(WC_STATION_VIEW, index, 1);
 
+		/* We use ZOOM_LVL_MAX here, as every viewport can have an other zoom,
+		 *  and there is no way for us to know which is the biggest. So make the
+		 *  biggest area dirty, and we are safe for sure. */
 		MarkAllViewportsDirty(
 			sign.left - 6,
 			sign.top,
-			sign.left + (sign.width_1 << 2) + 12,
-			sign.top + 48);
+			sign.left + ScaleByZoom(sign.width_1 + 12, ZOOM_LVL_MAX),
+			sign.top + ScaleByZoom(12, ZOOM_LVL_MAX));
 	}
 }
 
@@ -182,7 +184,7 @@
 /** Obtain the length of a platform
  * @pre tile must be a railway station tile
  * @param tile A tile that contains the platform in question
- * @returns The length of the platform
+ * @return The length of the platform
  */
 uint Station::GetPlatformLength(TileIndex tile) const
 {
--- a/src/station.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/station.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file station.h */
+
 #ifndef STATION_H
 #define STATION_H
 
@@ -8,7 +10,9 @@
 #include "oldpool.h"
 #include "sprite.h"
 #include "tile.h"
+#include "road.h"
 #include "newgrf_station.h"
+#include <list>
 
 static const StationID INVALID_STATION = 0xFFFF;
 static const byte INITIAL_STATION_RATING = 175;
@@ -82,8 +86,8 @@
 
 struct StationSpecList {
 	const StationSpec *spec;
-	uint32 grfid;      /// GRF ID of this custom station
-	uint8  localidx;   /// Station ID within GRF of station
+	uint32 grfid;      ///< GRF ID of this custom station
+	uint8  localidx;   ///< Station ID within GRF of station
 };
 
 /** StationRect - used to track station spread out rectangle - cheaper than scanning whole map */
@@ -118,7 +122,7 @@
 
 		const AirportFTAClass *Airport() const
 		{
-			assert(airport_tile != 0);
+			if (airport_tile == 0) return GetAirport(AT_DUMMY);
 			return GetAirport(airport_type);
 		}
 
@@ -142,7 +146,7 @@
 	byte facilities;
 	byte airport_type;
 
-	// trainstation width/height
+	/* trainstation width/height */
 	byte trainst_w, trainst_h;
 
 	/** List of custom stations (StationSpecs) allocated to the station */
@@ -151,10 +155,11 @@
 
 	Date build_date;
 
-	uint64 airport_flags;   /// stores which blocks on the airport are taken. was 16 bit earlier on, then 32
+	uint64 airport_flags;   ///< stores which blocks on the airport are taken. was 16 bit earlier on, then 32
 	StationID index;
 
 	byte last_vehicle_type;
+	std::list<Vehicle *> loading_vehicles;
 	GoodsEntry goods[NUM_CARGO];
 
 	uint16 random_bits;
@@ -267,7 +272,7 @@
 
 
 const DrawTileSprites *GetStationTileLayout(byte gfx);
-void StationPickerDrawSprite(int x, int y, RailType railtype, int image);
+void StationPickerDrawSprite(int x, int y, RailType railtype, RoadType roadtype, int image);
 
 RoadStop * GetRoadStopByTile(TileIndex tile, RoadStop::Type type);
 uint GetNumRoadStops(const Station* st, RoadStop::Type type);
--- a/src/station_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/station_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -9,6 +9,7 @@
 #include "cmd_helper.h"
 #include "debug.h"
 #include "functions.h"
+#include "landscape.h"
 #include "station_map.h"
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -40,6 +41,7 @@
 #include "road.h"
 #include "cargotype.h"
 #include "table/station_air.h"
+#include "airport_states.h"
 
 /**
  * Called if a new block is added to the station-pool
@@ -119,7 +121,7 @@
 
 static Station* GetStationAround(TileIndex tile, int w, int h, StationID closest_station)
 {
-	// check around to see if there's any stations there
+	/* check around to see if there's any stations there */
 	BEGIN_TILE_LOOP(tile_cur, w + 2, h + 2, tile - TileDiffXY(1, 1))
 		if (IsTileType(tile_cur, MP_STATION)) {
 			StationID t = GetStationIndex(tile_cur);
@@ -199,7 +201,7 @@
 		Station *s;
 
 		FOR_ALL_STATIONS(s) {
-			if (s != st && s->town==t) {
+			if (s != st && s->town == t) {
 				uint str = M(s->string_id);
 				if (str <= 0x20) {
 					if (str == M(STR_SV_STNAME_FOREST))
@@ -230,7 +232,7 @@
 	}
 
 	/* check close enough to town to get central as name? */
-	if (DistanceMax(tile,t->xy) < 8) {
+	if (DistanceMax(tile, t->xy) < 8) {
 		found = M(STR_SV_STNAME);
 		if (HASBIT(free_names, M(STR_SV_STNAME))) goto done;
 
@@ -272,10 +274,10 @@
 	/* check direction compared to town */
 	{
 		static const int8 _direction_and_table[] = {
-			~( (1<<M(STR_SV_STNAME_WEST)) | (1<<M(STR_SV_STNAME_EAST)) | (1<<M(STR_SV_STNAME_NORTH)) ),
-			~( (1<<M(STR_SV_STNAME_SOUTH)) | (1<<M(STR_SV_STNAME_WEST)) | (1<<M(STR_SV_STNAME_NORTH)) ),
-			~( (1<<M(STR_SV_STNAME_SOUTH)) | (1<<M(STR_SV_STNAME_EAST)) | (1<<M(STR_SV_STNAME_NORTH)) ),
-			~( (1<<M(STR_SV_STNAME_SOUTH)) | (1<<M(STR_SV_STNAME_WEST)) | (1<<M(STR_SV_STNAME_EAST)) ),
+			~( (1 << M(STR_SV_STNAME_WEST)) | (1 << M(STR_SV_STNAME_EAST)) | (1 << M(STR_SV_STNAME_NORTH)) ),
+			~( (1 << M(STR_SV_STNAME_SOUTH)) | (1 << M(STR_SV_STNAME_WEST)) | (1 << M(STR_SV_STNAME_NORTH)) ),
+			~( (1 << M(STR_SV_STNAME_SOUTH)) | (1 << M(STR_SV_STNAME_EAST)) | (1 << M(STR_SV_STNAME_NORTH)) ),
+			~( (1 << M(STR_SV_STNAME_SOUTH)) | (1 << M(STR_SV_STNAME_WEST)) | (1 << M(STR_SV_STNAME_EAST)) ),
 		};
 
 		free_names &= _direction_and_table[
@@ -283,7 +285,7 @@
 			(TileY(tile) < TileY(t->xy)) * 2];
 	}
 
-	tmp = free_names & ((1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<6)|(1<<7)|(1<<12)|(1<<26)|(1<<27)|(1<<28)|(1<<29)|(1<<30));
+	tmp = free_names & ((1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 6) | (1 << 7) | (1 << 12) | (1 << 26) | (1 << 27) | (1 << 28) | (1 << 29) | (1 << 30));
 	if (tmp == 0) {
 		_error_message = STR_3007_TOO_MANY_STATIONS_LOADING;
 		return false;
@@ -368,7 +370,7 @@
 	}
 
 	SetDParam(0, st->index);
-	AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_TILE, NT_ACCEPTANCE, 0), st->xy, 0);
+	AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT | NF_TILE, NT_ACCEPTANCE, 0), st->xy, 0);
 }
 
 // Get a list of the cargo types being produced around the tile.
@@ -615,7 +617,7 @@
 
 // Tries to clear the given area. Returns the cost in case of success.
 // Or an error code if it failed.
-int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID* station)
+int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID* station, bool check_clear = true)
 {
 	int32 cost = 0;
 	int allowed_z = -1;
@@ -655,10 +657,10 @@
 		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) ||
-					(invalid_dirs&2 && !(tileh & SLOPE_SE) && h_cur == 1) ||
-					(invalid_dirs&4 && !(tileh & SLOPE_SW) && w_cur == 1) ||
-					(invalid_dirs&8 && !(tileh & SLOPE_NW) && (uint)h_cur == h)) {
+			if ((invalid_dirs & 1 && !(tileh & SLOPE_NE) && (uint)w_cur == w) ||
+					(invalid_dirs & 2 && !(tileh & SLOPE_SE) && h_cur == 1) ||
+					(invalid_dirs & 4 && !(tileh & SLOPE_SW) && w_cur == 1) ||
+					(invalid_dirs & 8 && !(tileh & SLOPE_NW) && (uint)h_cur == h)) {
 				return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 			}
 			cost += _price.terraform;
@@ -767,7 +769,7 @@
 {
 	int i = n;
 	do *layout++ = 0; while (--i);
-	layout[((n-1) >> 1)-n] = 2;
+	layout[((n - 1) >> 1) - n] = 2;
 	return layout;
 }
 
@@ -776,8 +778,8 @@
 	int i = n;
 	do *layout++ = b; while (--i);
 	if (n > 4) {
-		layout[0-n] = 0;
-		layout[n-1-n] = 0;
+		layout[0 - n] = 0;
+		layout[n - 1 - n] = 0;
 	}
 	return layout;
 }
@@ -808,10 +810,12 @@
 
 /** Build railroad station
  * @param tile_org starting position of station dragging/placement
+ * @param flags operation to perform
  * @param p1 various bitstuffed elements
  * - p1 = (bit  0)    - orientation (Axis)
  * - p1 = (bit  8-15) - number of tracks
  * - p1 = (bit 16-23) - platform length
+ * - p1 = (bit 24)    - allow stations directly adjacent to other stations.
  * @param p2 various bitstuffed elements
  * - p2 = (bit  0- 3) - railtype (p2 & 0xF)
  * - p2 = (bit  8-15) - custom station class
@@ -856,9 +860,33 @@
 	if (CmdFailed(ret)) return ret;
 	int32 cost = ret + (numtracks * _price.train_station_track + _price.train_station_length) * plat_len;
 
-	// Make sure there are no similar stations around us.
-	Station *st = GetStationAround(tile_org, w_org, h_org, est);
-	if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
+	Station *st = NULL;
+	bool check_surrounding = true;
+
+	if (_patches.adjacent_stations) {
+		if (est != INVALID_STATION) {
+			if (HASBIT(p1, 24)) {
+				/* You can't build an adjacent station over the top of one that
+				 * already exists. */
+				return_cmd_error(STR_MUST_REMOVE_RAILWAY_STATION_FIRST);
+			} else {
+				/* Extend the current station, and don't check whether it will
+				 * be near any other stations. */
+				st = GetStation(est);
+				check_surrounding = false;
+			}
+		} else {
+			/* There's no station here. Don't check the tiles surrounding this
+			 * one if the player wanted to build an adjacent station. */
+			if (HASBIT(p1, 24)) check_surrounding = false;
+		}
+	}
+
+	if (check_surrounding) {
+		// Make sure there are no similar stations around us.
+		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);
@@ -953,7 +981,7 @@
 			int w = plat_len;
 			do {
 				byte layout = *layout_ptr++;
-				MakeRailStation(tile, st->owner, st->index, axis, layout, (RailType)GB(p2, 0, 4));
+				MakeRailStation(tile, st->owner, st->index, axis, layout & ~1, (RailType)GB(p2, 0, 4));
 				SetCustomStationSpecIndex(tile, specindex);
 				SetStationTileRandomBits(tile, GB(Random(), 0, 4));
 
@@ -961,7 +989,7 @@
 					/* Use a fixed axis for GetPlatformInfo as our platforms / numtracks are always the right way around */
 					uint32 platinfo = GetPlatformInfo(AXIS_X, 0, plat_len, numtracks_orig, plat_len - w, numtracks_orig - numtracks, false);
 					uint16 callback = GetStationCallback(CBID_STATION_TILE_LAYOUT, platinfo, 0, statspec, st, tile);
-					if (callback != CALLBACK_FAILED && callback < 8) SetStationGfx(tile, callback + axis);
+					if (callback != CALLBACK_FAILED && callback < 8) SetStationGfx(tile, (callback & ~1) + axis);
 				}
 
 				tile += tile_delta;
@@ -1042,43 +1070,78 @@
 /** Remove a single tile from a railroad station.
  * This allows for custom-built station with holes and weird layouts
  * @param tile tile of station piece to remove
- * @param p1 unused
+ * @param flags operation to perform
+ * @param p1 start_tile
  * @param p2 unused
  */
 int32 CmdRemoveFromRailroadStation(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
+	TileIndex start = p1 == 0 ? tile : p1;
+
+	/* Count of the number of tiles removed */
+	int quantity = 0;
+
+	if (tile >= MapSize() || start >= MapSize()) return CMD_ERROR;
+
+	/* make sure sx,sy are smaller than ex,ey */
+	int ex = TileX(tile);
+	int ey = TileY(tile);
+	int sx = TileX(start);
+	int sy = TileY(start);
+	if (ex < sx) Swap(ex, sx);
+	if (ey < sy) Swap(ey, sy);
+	tile = TileXY(sx, sy);
+
+	int size_x = ex - sx + 1;
+	int size_y = ey - sy + 1;
+
 	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;
-	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.
-	if (flags & DC_EXEC) {
-		uint specindex = GetCustomStationSpecIndex(tile);
-		Track track = GetRailStationTrack(tile);
-		DoClearSquare(tile);
-		st->rect.AfterRemoveTile(st, tile);
-		SetSignalsOnBothDir(tile, track);
-		YapfNotifyTrackLayoutChange(tile, track);
-
-		DeallocateSpecFromStation(st, specindex);
-
-		// now we need to make the "spanned" area of the railway station smaller if we deleted something at the edges.
-		// we also need to adjust train_tile.
-		MakeRailwayStationAreaSmaller(st);
-		st->MarkTilesDirty();
-		UpdateStationSignCoord(st);
-
-		// if we deleted the whole station, delete the train facility.
-		if (st->train_tile == 0) {
-			st->facilities &= ~FACIL_TRAIN;
-			UpdateStationVirtCoordDirty(st);
-			DeleteStationIfEmpty(st);
+	/* Do the action for every tile into the area */
+	BEGIN_TILE_LOOP(tile2, size_x, size_y, tile) {
+		/* Make sure the specified tile belongs to the current player, and that it is a railroad station. */
+		if (!IsTileType(tile2, MP_STATION) || !IsRailwayStation(tile2) || !_patches.nonuniform_stations) {
+			continue;
 		}
-	}
-	return _price.remove_rail_station;
+
+		/* Check ownership of station */
+		Station *st = GetStationByTile(tile2);
+		if (_current_player != OWNER_WATER && (!CheckOwnership(st->owner) || !EnsureNoVehicle(tile2))) {
+			continue;
+		}
+
+		/* If we reached here, the tile is valid so increase the quantity of tiles we will remove */
+		quantity++;
+
+		if (flags & DC_EXEC) {
+			uint specindex = GetCustomStationSpecIndex(tile2);
+			Track track = GetRailStationTrack(tile2);
+			DoClearSquare(tile2);
+			st->rect.AfterRemoveTile(st, tile2);
+			SetSignalsOnBothDir(tile2, track);
+			YapfNotifyTrackLayoutChange(tile2, track);
+
+			DeallocateSpecFromStation(st, specindex);
+
+			// now we need to make the "spanned" area of the railway station smaller if we deleted something at the edges.
+			// we also need to adjust train_tile.
+			MakeRailwayStationAreaSmaller(st);
+			st->MarkTilesDirty();
+			UpdateStationSignCoord(st);
+
+			// if we deleted the whole station, delete the train facility.
+			if (st->train_tile == 0) {
+				st->facilities &= ~FACIL_TRAIN;
+				UpdateStationVirtCoordDirty(st);
+				DeleteStationIfEmpty(st);
+			}
+		}
+	} END_TILE_LOOP(tile2, size_x, size_y, tile)
+
+	/* If we've not removed any tiles, give an error */
+	if (quantity == 0) return CMD_ERROR;
+
+	return _price.remove_rail_station * quantity;
 }
 
 
@@ -1172,8 +1235,8 @@
 }
 
 /**
- * @param[in] truck_station Determines whether a stop is RoadStop::BUS or RoadStop::TRUCK
- * @param[in] station The station to do the whole procedure for
+ * @param truck_station Determines whether a stop is RoadStop::BUS or RoadStop::TRUCK
+ * @param st The Station to do the whole procedure for
  * @return a pointer to where to link a new RoadStop*
  */
 static RoadStop **FindRoadStopSpot(bool truck_station, Station* st)
@@ -1181,10 +1244,10 @@
 	RoadStop **primary_stop = (truck_station) ? &st->truck_stops : &st->bus_stops;
 
 	if (*primary_stop == NULL) {
-		//we have no roadstop of the type yet, so write a "primary stop"
+		/* we have no roadstop of the type yet, so write a "primary stop" */
 		return primary_stop;
 	} else {
-		//there are stops already, so append to the end of the list
+		/* there are stops already, so append to the end of the list */
 		RoadStop *stop = *primary_stop;
 		while (stop->next != NULL) stop = stop->next;
 		return &stop->next;
@@ -1193,9 +1256,12 @@
 
 /** Build a bus or truck stop
  * @param tile tile to build the stop at
+ * @param flags operation to perform
  * @param p1 entrance direction (DiagDirection)
  * @param p2 bit 0: 0 for Bus stops, 1 for truck stops
  *           bit 1: 0 for normal, 1 for drive-through
+ *           bit 2..4: the roadtypes
+ *           bit 5: allow stations directly adjacent to other stations.
  */
 int32 CmdBuildRoadStop(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -1203,32 +1269,50 @@
 	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;
+	RoadTypes rts = (RoadTypes)GB(p2, 2, 3);
+
+	if (rts == ROADTYPES_NONE || HASBIT(rts, ROADTYPE_HWAY)) return CMD_ERROR;
+
+	/* Trams only have drive through stops */
+	if (!is_drive_through && HASBIT(rts, ROADTYPE_TRAM)) return CMD_ERROR;
 
 	/* Saveguard the parameters */
 	if (!IsValidDiagDirection((DiagDirection)p1)) return CMD_ERROR;
 	/* If it is a drive-through stop check for valid axis */
 	if (is_drive_through && !IsValidAxis((Axis)p1)) return CMD_ERROR;
 	/* Road bits in the wrong direction */
-	if (build_over_road && (GetRoadBits(tile) & ((Axis)p1 == AXIS_X ? ROAD_Y : ROAD_X)) != 0) return CMD_ERROR;
-	/* Not allowed to build over this road */
-	if (build_over_road && !IsTileOwner(tile, _current_player) && !(IsTileOwner(tile, OWNER_TOWN) && _patches.road_stop_on_town_road)) return CMD_ERROR;
+	if (build_over_road && (GetAllRoadBits(tile) & ((Axis)p1 == AXIS_X ? ROAD_Y : ROAD_X)) != 0) return_cmd_error(STR_DRIVE_THROUGH_ERROR_DIRECTION);
 
 	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
 
-	if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile))
-		return CMD_ERROR;
-
-	if (build_over_road) flags ^= DC_AUTO;
-
-	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;
-	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;
+	if (!(flags & DC_NO_TOWN_RATING) && !CheckIfAuthorityAllows(tile)) return CMD_ERROR;
+
+	int32 cost = 0;
+
+	/* Not allowed to build over this road */
+	if (build_over_road) {
+		if (IsTileOwner(tile, OWNER_TOWN) && !_patches.road_stop_on_town_road) return_cmd_error(STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD);
+		if (GetRoadTileType(tile) != ROAD_TILE_NORMAL) return CMD_ERROR;
+
+		/* Don't allow building the roadstop when vehicles are already driving on it */
+		if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
+
+		RoadTypes cur_rts = GetRoadTypes(tile);
+		if (GetRoadOwner(tile, ROADTYPE_ROAD) != OWNER_TOWN && HASBIT(cur_rts, ROADTYPE_ROAD) && !CheckOwnership(GetRoadOwner(tile, ROADTYPE_ROAD))) return CMD_ERROR;
+		if (HASBIT(cur_rts, ROADTYPE_TRAM) && !CheckOwnership(GetRoadOwner(tile, ROADTYPE_TRAM))) return CMD_ERROR;
+
+		/* Do not remove roadtypes! */
+		rts |= cur_rts;
+	}
+	cost = CheckFlatLandBelow(tile, 1, 1, flags, is_drive_through ? 5 << p1 : 1 << p1, NULL, !build_over_road);
+	if (CmdFailed(cost)) return cost;
+
+	Station *st = NULL;
+
+	if (!_patches.adjacent_stations || !HASBIT(p2, 5)) {
+		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);
@@ -1290,9 +1374,9 @@
 
 		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);
+			MakeDriveThroughRoadStop(tile, st->owner, st->index, rs_type, rts, (Axis)p1, town_owned_road);
 		} else {
-			MakeRoadStop(tile, st->owner, st->index, rs_type, (DiagDirection)p1);
+			MakeRoadStop(tile, st->owner, st->index, rs_type, rts, (DiagDirection)p1);
 		}
 
 		UpdateStationVirtCoordDirty(st);
@@ -1357,6 +1441,7 @@
 
 /** Remove a bus or truck stop
  * @param tile tile to remove the stop from
+ * @param flags operation to perform
  * @param p1 not used
  * @param p2 bit 0: 0 for Bus stops, 1 for truck stops
  */
@@ -1367,22 +1452,21 @@
 	Station *st = GetStationByTile(tile);
 	/* Save the stop info before it is removed */
 	bool is_drive_through = IsDriveThroughStopTile(tile);
-	RoadBits road_bits = GetAnyRoadBits(tile);
+	RoadTypes rts = GetRoadTypes(tile);
+	RoadBits road_bits = IsDriveThroughStopTile(tile) ?
+			((GetRoadStopDir(tile) == DIAGDIR_NE) ? ROAD_X : ROAD_Y) :
+			DiagDirToRoadBits(GetRoadStopDir(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) {
-		uint index = 0;
-		Owner cur_owner = _current_player;
-
-		if (is_towns_road) {
-			index = ClosestTownFromTile(tile, (uint)-1)->index;
-			_current_player = OWNER_TOWN;
-		}
-		DoCommand(tile, road_bits, index, DC_EXEC, CMD_BUILD_ROAD);
-		_current_player = cur_owner;
+		/* Rebuild the drive throuhg road stop. As a road stop can only be
+		 * removed by the owner of the roadstop, _current_player is the
+		 * owner of the road stop. */
+		MakeRoadNormal(tile, road_bits, rts, is_towns_road ? ClosestTownFromTile(tile, (uint)-1)->index : 0,
+				is_towns_road ? OWNER_TOWN : _current_player, _current_player, _current_player);
 	}
 
 	return ret;
@@ -1390,8 +1474,9 @@
 
 /** Place an Airport.
  * @param tile tile where airport will be built
+ * @param flags operation to perform
  * @param p1 airport type, @see airport.h
- * @param p2 unused
+ * @param p2 (bit 0) - allow airports directly adjacent to other airports.
  */
 int32 CmdBuildAirport(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -1430,8 +1515,12 @@
 	if (CmdFailed(ret)) return ret;
 	int32 cost = ret;
 
-	Station *st = GetStationAround(tile, w, h, INVALID_STATION);
-	if (st == CHECK_STATIONS_ERR) return CMD_ERROR;
+	Station *st = NULL;
+
+	if (!_patches.adjacent_stations || !HASBIT(p2, 0)) {
+		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);
@@ -1529,6 +1618,13 @@
 
 	int32 cost = w * h * _price.remove_airport;
 
+	Vehicle *v;
+	FOR_ALL_VEHICLES(v) {
+		if (!(v->type == VEH_AIRCRAFT && IsNormalAircraft(v))) continue;
+
+		if (v->u.air.targetairport == st->index && v->u.air.state != FLYING) return CMD_ERROR;
+	}
+
 	{
 		const byte *b = _airport_sections[st->airport_type];
 		BEGIN_TILE_LOOP(tile_cur, w, h, tile)
@@ -1565,6 +1661,7 @@
 
 /** Build a buoy.
  * @param tile tile where to place the bouy
+ * @param flags operation to perform
  * @param p1 unused
  * @param p2 unused
  */
@@ -1673,7 +1770,8 @@
 
 /** Build a dock/haven.
  * @param tile tile where dock will be built
- * @param p1 unused
+ * @param flags operation to perform
+ * @param p1 (bit 0) - allow docks directly adjacent to other docks.
  * @param p2 unused
  */
 int32 CmdBuildDock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
@@ -1715,10 +1813,14 @@
 	}
 
 	/* middle */
-	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;
+	Station *st = NULL;
+
+	if (!_patches.adjacent_stations || !HASBIT(p1, 0)) {
+		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);
@@ -1813,7 +1915,15 @@
 static void DrawTile_Station(TileInfo *ti)
 {
 	const DrawTileSprites *t = NULL;
-	RailType railtype = GetRailType(ti->tile);
+	RailType railtype;
+	RoadTypes roadtypes;
+	if (IsRailwayStation(ti->tile)) {
+		railtype = GetRailType(ti->tile);
+		roadtypes = ROADTYPES_NONE;
+	} else {
+		roadtypes = GetRoadTypes(ti->tile);
+		railtype = RAILTYPE_BEGIN;
+	}
 	const RailtypeInfo *rti = GetRailTypeInfo(railtype);
 	uint32 relocation = 0;
 	const Station *st = NULL;
@@ -1872,6 +1982,12 @@
 
 	if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC && IsStationTileElectrifiable(ti->tile)) DrawCatenary(ti);
 
+	if (HASBIT(roadtypes, ROADTYPE_TRAM)) {
+		Axis axis = GetRoadStopDir(ti->tile) == DIAGDIR_NE ? AXIS_X : AXIS_Y;
+		DrawGroundSprite((HASBIT(roadtypes, ROADTYPE_ROAD) ? SPR_TRAMWAY_OVERLAY : SPR_TRAMWAY_TRAM) + (axis ^ 1), PAL_NONE);
+		DrawTramCatenary(ti, axis == AXIS_X ? ROAD_X : ROAD_Y);
+	}
+
 	if (IsBuoyTile(ti->tile) && (ti->z != 0 || !IsTileOwner(ti->tile, OWNER_WATER))) DrawCanalWater(ti->tile);
 
 	const DrawTileSeqStruct *dtss;
@@ -1884,7 +2000,7 @@
 		}
 
 		SpriteID pal;
-		if (_display_opt & DO_TRANS_BUILDINGS) {
+		if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
 		} else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
@@ -1906,7 +2022,7 @@
 	}
 }
 
-void StationPickerDrawSprite(int x, int y, RailType railtype, int image)
+void StationPickerDrawSprite(int x, int y, RailType railtype, RoadType roadtype, int image)
 {
 	const RailtypeInfo *rti = GetRailTypeInfo(railtype);
 	SpriteID pal = PLAYER_SPRITE_COLOR(_local_player);
@@ -1915,6 +2031,10 @@
 	SpriteID img = t->ground_sprite;
 	DrawSprite(img + rti->total_offset, HASBIT(img, PALETTE_MODIFIER_COLOR) ? pal : PAL_NONE, x, y);
 
+	if (roadtype == ROADTYPE_TRAM) {
+		DrawSprite(SPR_TRAMWAY_TRAM + (t->ground_sprite == SPR_ROAD_PAVED_STRAIGHT_X ? 1 : 0), 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);
@@ -1959,7 +2079,7 @@
 }
 
 
-static uint32 GetTileTrackStatus_Station(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Station(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	switch (mode) {
 		case TRANSPORT_RAIL:
@@ -1981,7 +2101,7 @@
 			break;
 
 		case TRANSPORT_ROAD:
-			if (IsRoadStopTile(tile)) {
+			if ((GetRoadTypes(tile) & sub_mode) != 0 && IsRoadStopTile(tile)) {
 				return AxisToTrackBits(DiagDirToAxis(GetRoadStopDir(tile))) * 0x101;
 			}
 			break;
@@ -2305,6 +2425,7 @@
 
 /** Rename a station
  * @param tile unused
+ * @param flags operation to perform
  * @param p1 station ID that is to be renamed
  * @param p2 unused
  */
@@ -2558,7 +2679,8 @@
 	if (!GetStopBuiltOnTownRoad(tile)) return true;
 
 	bool edge_road;
-	return CheckAllowRemoveRoad(tile, GetAnyRoadBits(tile), OWNER_TOWN, &edge_road);
+	return CheckAllowRemoveRoad(tile, GetAnyRoadBits(tile, ROADTYPE_ROAD), OWNER_TOWN, &edge_road, ROADTYPE_ROAD) &&
+				CheckAllowRemoveRoad(tile, GetAnyRoadBits(tile, ROADTYPE_TRAM), OWNER_TOWN, &edge_road, ROADTYPE_TRAM);
 }
 
 static int32 ClearTile_Station(TileIndex tile, byte flags)
@@ -2567,8 +2689,8 @@
 		switch (GetStationType(tile)) {
 			case STATION_RAIL:    return_cmd_error(STR_300B_MUST_DEMOLISH_RAILROAD);
 			case STATION_AIRPORT: return_cmd_error(STR_300E_MUST_DEMOLISH_AIRPORT_FIRST);
-			case STATION_TRUCK:   return_cmd_error(STR_3047_MUST_DEMOLISH_TRUCK_STATION);
-			case STATION_BUS:     return_cmd_error(STR_3046_MUST_DEMOLISH_BUS_STATION);
+			case STATION_TRUCK:   return_cmd_error(HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) ? STR_3047_MUST_DEMOLISH_CARGO_TRAM_STATION : STR_3047_MUST_DEMOLISH_TRUCK_STATION);
+			case STATION_BUS:     return_cmd_error(HASBIT(GetRoadTypes(tile), ROADTYPE_TRAM) ? STR_3046_MUST_DEMOLISH_PASSENGER_TRAM_STATION : STR_3046_MUST_DEMOLISH_BUS_STATION);
 			case STATION_BUOY:    return_cmd_error(STR_306A_BUOY_IN_THE_WAY);
 			case STATION_DOCK:    return_cmd_error(STR_304D_MUST_DEMOLISH_DOCK_FIRST);
 			case STATION_OILRIG:
@@ -2711,6 +2833,8 @@
 	SLE_CONDVAR(Station, waiting_triggers,           SLE_UINT8,                  27, SL_MAX_VERSION),
 	SLE_CONDVAR(Station, num_specs,                  SLE_UINT8,                  27, SL_MAX_VERSION),
 
+	SLE_CONDLST(Station, loading_vehicles,           REF_VEHICLE,                57, SL_MAX_VERSION),
+
 	// reserve extra space in savegame here. (currently 32 bytes)
 	SLE_CONDNULL(32, 2, SL_MAX_VERSION),
 
@@ -2744,7 +2868,9 @@
 static void SaveLoad_STNS(Station *st)
 {
 	SlObject(st, _station_desc);
-	for (CargoID i = 0; i < NUM_CARGO; i++) {
+
+	uint num_cargo = CheckSavegameVersion(55) ? 12 : NUM_CARGO;
+	for (CargoID i = 0; i < num_cargo; i++) {
 		SlObject(&st->goods[i], _goods_desc);
 	}
 
--- a/src/station_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/station_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file station_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -51,7 +53,8 @@
  * goes for the rating: at above 90% orso (224) it is also 'full'
  * Each cargo-bar is 16 pixels wide and 6 pixels high
  * Each rating 14 pixels wide and 1 pixel high and is 1 pixel below the cargo-bar
- * @param x,y X/Y coordinate to draw the box at
+ * @param x coordinate to draw the box at
+ * @param y coordinate to draw the box at
  * @param type Cargo type
  * @param amount Cargo amount
  * @param rating ratings data for that particular cargo */
@@ -230,7 +233,7 @@
 						}
 					}
 				}
-				//stations without waiting cargo
+				/* stations without waiting cargo */
 				if (num_waiting_cargo == 0 && include_empty) {
 					station_sort[n++] = st;
 				}
@@ -320,7 +323,7 @@
 			int cg_ofst;
 			int x = 89;
 			int y = 14;
-			int xb = 2; // offset from left of widget
+			int xb = 2; ///< offset from left of widget
 
 			uint i = 0;
 			for (CargoID c = 0; c < NUM_CARGO; c++) {
@@ -363,7 +366,7 @@
 				SetDParam(1, st->facilities);
 				x = DrawString(xb, y, STR_3049_0, 0) + 5;
 
-				// show cargo waiting and station ratings
+				/* show cargo waiting and station ratings */
 				for (CargoID j = 0; j < NUM_CARGO; j++) {
 					uint amount = GB(st->goods[j].waiting_acceptance, 0, 12);
 					if (amount != 0) {
@@ -510,7 +513,7 @@
 
 		case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
 			if (sl->sort_type != e->we.dropdown.index) {
-				// value has changed -> resort
+				/* value has changed -> resort */
 				sl->sort_type = e->we.dropdown.index;
 				station_sort.criteria = sl->sort_type;
 				sl->flags |= SL_RESORT;
@@ -683,7 +686,7 @@
 		sprite = cs->sprite;
 	}
 
-	if (sprite == 0) return;
+	if (sprite == 0) sprite = SPR_CARGO_GOODS;
 
 	do {
 		DrawSprite(sprite, PAL_NONE, x, y);
--- a/src/station_map.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/station_map.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,17 @@
 /* $Id$ */
 
+/** @file station_map.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "station_map.h"
 
-
+/**
+ * Get the station type (rail, airport, truck etc) for the given tile.
+ * @param t the tile to get the station type of.
+ * @pre IsTileType(t, MP_STATION)
+ * @return the station type of the given tile.
+ */
 StationType GetStationType(TileIndex t)
 {
 	assert(IsTileType(t, MP_STATION));
--- a/src/station_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/station_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,9 +1,12 @@
 /* $Id$ */
 
+/** @file station_map.h */
+
 #ifndef STATION_MAP_H
 #define STATION_MAP_H
 
 #include "rail_map.h"
+#include "road_map.h"
 #include "station.h"
 
 typedef byte StationGfx;
@@ -307,15 +310,17 @@
 	SetRailType(t, rt);
 }
 
-static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, DiagDirection d)
+static inline void MakeRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, RoadTypes rt, DiagDirection d)
 {
 	MakeStation(t, o, sid, (rst == RoadStop::BUS ? GFX_BUS_BASE : GFX_TRUCK_BASE) + d);
+	SetRoadTypes(t, rt);
 }
 
-static inline void MakeDriveThroughRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, Axis a, bool on_town_road)
+static inline void MakeDriveThroughRoadStop(TileIndex t, Owner o, StationID sid, RoadStop::Type rst, RoadTypes rt, 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);
+	SetRoadTypes(t, rt);
 }
 
 static inline void MakeAirport(TileIndex t, Owner o, StationID sid, byte section)
--- a/src/stdafx.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/stdafx.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file stdafx.h */
+
 #ifndef STDAFX_H
 #define STDAFX_H
 
@@ -76,6 +78,9 @@
 # ifdef amiga
 #  undef amiga
 # endif
+/* Act like we already included this file, as it somehow gives linkage problems
+ *  (mismatch linkage of C++ and C between this include and unistd.h). */
+#define CLIB_USERGROUP_PROTOS_H
 #endif /* __MORPHOS__ */
 
 #ifdef __APPLE__
@@ -107,7 +112,6 @@
 # define FORCEINLINE inline
 # define CDECL
 # define __int64 long long
-# define NOT_REACHED() assert(0)
 # define GCC_PACK __attribute__((packed))
 
 # if (__GNUC__ == 2)
@@ -120,7 +124,6 @@
 # define NORETURN
 # define FORCEINLINE inline
 # define CDECL
-# define NOT_REACHED() assert(0)
 # define GCC_PACK
 # include <malloc.h>
 #endif /* __WATCOMC__ */
@@ -158,11 +161,6 @@
 # define FORCEINLINE __forceinline
 # define inline _inline
 # define CDECL _cdecl
-# if defined(_DEBUG)
-#  define NOT_REACHED() assert(0)
-# else
-#  define NOT_REACHED() _assume(0)
-# endif /* _DEBUG */
   int CDECL snprintf(char *str, size_t size, const char *format, ...);
 # if _MSC_VER < 1400
    int CDECL vsnprintf(char *str, size_t size, const char *format, va_list ap);
@@ -329,4 +327,12 @@
 # define Point OTTD_AMIGA_POINT
 #endif
 
+void
+#ifndef STRGEN
+/* In strgen error is not fatal and returns */
+NORETURN
+#endif /* STRGEN */
+CDECL error(const char *str, ...);
+#define NOT_REACHED() error("NOT_REACHED triggered at line %i of %s", __LINE__, __FILE__)
+
 #endif /* STDAFX_H */
--- a/src/strgen/strgen.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/strgen/strgen.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -506,6 +506,7 @@
 	{"WAYPOINT", EmitSingleChar, SCC_WAYPOINT_NAME, 1, 0}, // waypoint name
 	{"STATION",  EmitSingleChar, SCC_STATION_NAME,  1, 0},
 	{"TOWN",     EmitSingleChar, SCC_TOWN_NAME,     1, 0},
+	{"GROUP",    EmitSingleChar, SCC_GROUP_NAME,    1, 0},
 
 	// 0x9D is used for the pseudo command SETCASE
 	// 0x9E is used for case switching
@@ -730,7 +731,7 @@
 {
 	ParsedCommandStruct templ;
 	ParsedCommandStruct lang;
-	int i,j;
+	int i, j;
 	bool result = true;
 
 	ExtractCommandString(&templ, b, true);
@@ -914,7 +915,7 @@
 	in = fopen(file, "r");
 	if (in == NULL) fatal("Cannot open file");
 	_cur_line = 1;
-	while (fgets(buf, sizeof(buf),in) != NULL) {
+	while (fgets(buf, sizeof(buf), in) != NULL) {
 		rstrip(buf);
 		HandleString(buf, english);
 		_cur_line++;
--- a/src/string.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/string.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file string.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
@@ -123,7 +125,8 @@
  * not found, this is sufficient. If more, or general functionality is
  * needed, look to r7271 where it was removed because it was broken when
  * using certain locales: eg in Turkish the uppercase 'I' was converted to
- * '?', so just revert to the old functionality */
+ * '?', so just revert to the old functionality
+ * @param str string to convert */
 void strtolower(char *str)
 {
 	for (; *str != '\0'; str++) *str = tolower(*str);
--- a/src/string.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/string.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,26 +1,28 @@
 /* $Id$ */
 
+/** @file string.h */
+
 #ifndef STRING_H
 #define STRING_H
 
 #include "macros.h"
 
-/*
- * dst: destination buffer
- * src: string to copy/concatenate
- * size: size of the destination buffer
- * usage: ttd_strlcpy(dst, src, lengthof(dst));
+/**
+ * usage ttd_strlcpy(dst, src, lengthof(dst));
+ * @param dst destination buffer
+ * @param src string to copy/concatenate
+ * @param size size of the destination buffer
  */
 void ttd_strlcat(char *dst, const char *src, size_t size);
 void ttd_strlcpy(char *dst, const char *src, size_t size);
 
-/*
- * dst: destination buffer
- * src: string to copy
- * last: pointer to the last element in the dst array
- *       if NULL no boundary check is performed
- * returns a pointer to the terminating \0 in the destination buffer
+/**
  * usage: strecpy(dst, src, lastof(dst));
+ * @param dst destination buffer
+ * @param src string to copy
+ * @param last pointer to the last element in the dst array
+ *             if NULL no boundary check is performed
+ * @return a pointer to the terminating \0 in the destination buffer
  */
 char* strecat(char* dst, const char* src, const char* last);
 char* strecpy(char* dst, const char* src, const char* last);
@@ -38,9 +40,9 @@
  * Valid filter types for IsValidChar.
  */
 enum CharSetFilter {
-	CS_ALPHANUMERAL,      //! Both numeric and alphabetic and spaces and stuff
-	CS_NUMERAL,           //! Only numeric ones
-	CS_ALPHA,             //! Only alphabetic values
+	CS_ALPHANUMERAL,      ///< Both numeric and alphabetic and spaces and stuff
+	CS_NUMERAL,           ///< Only numeric ones
+	CS_ALPHA,             ///< Only alphabetic values
 };
 
 /** Convert the given string to lowercase, only works with ASCII! */
@@ -105,6 +107,8 @@
  * Return the length of an UTF-8 encoded value based on a single char. This
  * char should be the first byte of the UTF-8 encoding. If not, or encoding
  * is invalid, return value is 0
+ * @param c char to query length of
+ * @return requested size
  */
 static inline size_t Utf8EncodedCharLen(char c)
 {
@@ -127,7 +131,7 @@
 /**
  * Retrieve the previous UNICODE character in an UTF-8 encoded string.
  * @param s char pointer pointing to (the first char of) the next character
- * @returns a pointer in 's' to the previous UNICODE character's first byte
+ * @return a pointer in 's' to the previous UNICODE character's first byte
  * @note The function should not be used to determine the length of the previous
  * encoded char because it might be an invalid/corrupt start-sequence
  */
--- a/src/strings.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/strings.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file strings.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "currency.h"
@@ -23,6 +25,8 @@
 #include "industry.h"
 #include "helpers.hpp"
 #include "cargotype.h"
+#include "group.h"
+#include "debug.h"
 
 /* for opendir/readdir/closedir */
 # include "fios.h"
@@ -37,7 +41,7 @@
 static char *FormatString(char *buff, const char *str, const int32 *argv, uint casei, const char* last);
 
 struct LanguagePack {
-	uint32 ident;
+	uint32 ident;       // 32-bits identifier
 	uint32 version;     // 32-bits of auto generated version info which is basically a hash of strings.h
 	char name[32];      // the international name of this language
 	char own_name[32];  // the localized name of this language
@@ -45,34 +49,34 @@
 	uint16 offsets[32]; // the offsets
 	byte plural_form;   // how to compute plural forms
 	byte pad[3];        // pad header to be a multiple of 4
-	char data[VARARRAY_SIZE];
+	char data[VARARRAY_SIZE]; // list of strings
 };
 
 static char **_langpack_offs;
 static LanguagePack *_langpack;
-static uint _langtab_num[32]; // Offset into langpack offs
+static uint _langtab_num[32];   // Offset into langpack offs
 static uint _langtab_start[32]; // Offset into langpack offs
 
 
-// Read an int64 from the argv array.
+/** Read an int64 from the argv array. */
 static inline int64 GetInt64(const int32 **argv)
 {
 	int64 result;
 
 	assert(argv);
 	result = (uint32)(*argv)[0] + ((uint64)(uint32)(*argv)[1] << 32);
-	(*argv)+=2;
+	(*argv) += 2;
 	return result;
 }
 
-// Read an int32 from the argv array.
+/** Read an int32 from the argv array. */
 static inline int32 GetInt32(const int32 **argv)
 {
 	assert(argv);
 	return *(*argv)++;
 }
 
-// Read an array from the argv array.
+/** Read an array from the argv array. */
 static inline const int32 *GetArgvPtr(const int32 **argv, int n)
 {
 	const int32 *result;
@@ -85,13 +89,13 @@
 
 #define NUM_BOUND_STRINGS 8
 
-// Array to hold the bound strings.
+/* Array to hold the bound strings. */
 static const char *_bound_strings[NUM_BOUND_STRINGS];
 
-// This index is used to implement a "round-robin" allocating of
-// slots for BindCString. NUM_BOUND_STRINGS slots are reserved.
-// Which means that after NUM_BOUND_STRINGS calls to BindCString,
-// the indices will be reused.
+/* This index is used to implement a "round-robin" allocating of
+ * slots for BindCString. NUM_BOUND_STRINGS slots are reserved.
+ * Which means that after NUM_BOUND_STRINGS calls to BindCString,
+ * the indices will be reused. */
 static int _bind_index;
 
 static const char *GetStringPtr(StringID string)
@@ -99,10 +103,16 @@
 	return _langpack_offs[_langtab_start[string >> 11] + (string & 0x7FF)];
 }
 
-// The highest 8 bits of string contain the "case index".
-// These 8 bits will only be set when FormatString wants to print
-// the string in a different case. No one else except FormatString
-// should set those bits, therefore string CANNOT be StringID, but uint32.
+/** The highest 8 bits of string contain the "case index".
+ * These 8 bits will only be set when FormatString wants to print
+ * the string in a different case. No one else except FormatString
+ * should set those bits, therefore string CANNOT be StringID, but uint32.
+ * @param buffr
+ * @param string
+ * @param argv
+ * @param last
+ * @return a formatted string of char
+ */
 static char *GetStringWithArgs(char *buffr, uint string, const int32 *argv, const char* last)
 {
 	uint index = GB(string,  0, 11);
@@ -122,8 +132,8 @@
 				return GetSpecialPlayerNameString(buffr, index - 0xE4, argv, last);
 			break;
 
-		// User defined name
 		case 15:
+			/* User defined name */
 			return GetName(buffr, index, last);
 
 		case 26:
@@ -147,8 +157,8 @@
 			return FormatString(buffr, buff, argv, 0, last);
 
 		case 31:
-			// dynamic strings. These are NOT to be passed through the formatter,
-			// but passed through verbatim.
+			/* dynamic strings. These are NOT to be passed through the formatter,
+			 * but passed through verbatim. */
 			if (index < (STR_SPEC_USERSTRING & 0x7FF)) {
 				return strecpy(buffr, _bound_strings[index], last);
 			}
@@ -184,7 +194,8 @@
  * This function takes a C-string and allocates a temporary string ID.
  * The StringID of the bound string is valid until BindCString is called
  * another NUM_BOUND_STRINGS times. So be careful when using it.
- *
+ * @param str temp string to add
+ * @return the id of that temp string
  * @note formatting a DATE_TINY calls BindCString twice, thus reduces the
  *       amount of 'user' bound strings by 2.
  * @todo rewrite the BindCString system to make the limit flexible and
@@ -198,7 +209,10 @@
 	return idx + STR_SPEC_DYNSTRING;
 }
 
-// This function is used to "bind" a C string to a OpenTTD dparam slot.
+/** This function is used to "bind" a C string to a OpenTTD dparam slot.
+ * @param n slot of the string
+ * @param str string to bind
+ */
 void SetDParamStr(uint n, const char *str)
 {
 	SetDParam(n, BindCString(str));
@@ -331,10 +345,10 @@
 	char* p;
 	int j;
 
-	// multiply by exchange rate
+	/* multiply by exchange rate */
 	number *= spec->rate;
 
-	// convert from negative
+	/* convert from negative */
 	if (number < 0) {
 		buff = strecpy(buff, "-", last);
 		number = -number;
@@ -345,7 +359,7 @@
 	 * The only remaining value is 1 (suffix), so everything that is not 1 */
 	if (spec->symbol_pos != 1) buff = strecpy(buff, spec->prefix, last);
 
-	// for huge numbers, compact the number into k or M
+	/* for huge numbers, compact the number into k or M */
 	if (compact) {
 		if (number >= 1000000000) {
 			number = (number + 500000) / 1000000;
@@ -356,7 +370,7 @@
 		}
 	}
 
-	// convert to ascii number and add commas
+	/* convert to ascii number and add commas */
 	p = endof(buf);
 	*--p = '\0';
 	j = 4;
@@ -381,65 +395,65 @@
 
 static int DeterminePluralForm(int32 n)
 {
-	// The absolute value determines plurality
+	/* The absolute value determines plurality */
 	if (n < 0) n = -n;
 
 	switch (_langpack->plural_form) {
-	// Two forms, singular used for one only
-	// Used in:
-	//   Danish, Dutch, English, German, Norwegian, Swedish, Estonian, Finnish,
-	//   Greek, Hebrew, Italian, Portuguese, Spanish, Esperanto
+	/* Two forms, singular used for one only
+	 * Used in:
+	 *   Danish, Dutch, English, German, Norwegian, Swedish, Estonian, Finnish,
+	 *   Greek, Hebrew, Italian, Portuguese, Spanish, Esperanto */
 	case 0:
 	default:
 		return n != 1;
 
-	// Only one form
-	// Used in:
-	//   Hungarian, Japanese, Korean, Turkish
+	/* Only one form
+	 * Used in:
+	 *   Hungarian, Japanese, Korean, Turkish */
 	case 1:
 		return 0;
 
-	// Two forms, singular used for zero and one
-	// Used in:
-	//   French, Brazilian Portuguese
+	/* Two forms, singular used for zero and one
+	 * Used in:
+	 *   French, Brazilian Portuguese */
 	case 2:
 		return n > 1;
 
-	// Three forms, special case for zero
-	// Used in:
-	//   Latvian
+	/* Three forms, special case for zero
+	 * Used in:
+	 *   Latvian */
 	case 3:
-		return n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;
+		return n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2;
 
-	// Three forms, special case for one and two
-	// Used in:
-	//   Gaelige (Irish)
+	/* Three forms, special case for one and two
+	 * Used in:
+	 *   Gaelige (Irish) */
 	case 4:
-		return n==1 ? 0 : n==2 ? 1 : 2;
+		return n == 1 ? 0 : n == 2 ? 1 : 2;
 
-	// Three forms, special case for numbers ending in 1[2-9]
-	// Used in:
-	//   Lithuanian
+	/* Three forms, special case for numbers ending in 1[2-9]
+	 * Used in:
+	 *   Lithuanian */
 	case 5:
-		return n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2;
-
-	// Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
-	// Used in:
-	//   Croatian, Czech, Russian, Slovak, Ukrainian
-	case 6:
-		return n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
+		return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
 
-	// Three forms, special case for one and some numbers ending in 2, 3, or 4
-	// Used in:
-	//   Polish
+	/* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
+	 * Used in:
+	 *   Croatian, Czech, Russian, Slovak, Ukrainian */
+	case 6:
+		return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+
+	/* Three forms, special case for one and some numbers ending in 2, 3, or 4
+	 * Used in:
+	 *   Polish */
 	case 7:
-		return n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
+		return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
 
-	// Four forms, special case for one and all numbers ending in 02, 03, or 04
-	// Used in:
-	//   Slovenian
+	/* Four forms, special case for one and all numbers ending in 02, 03, or 04
+	 * Used in:
+	 *   Slovenian */
 	case 8:
-		return n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;
+		return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
 	}
 }
 
@@ -447,7 +461,7 @@
 {
 	//<NUM> {Length of each string} {each string}
 	uint n = (byte)*b++;
-	uint pos,i, mylen=0,mypos=0;
+	uint pos, i, mylen = 0, mypos = 0;
 
 	for (i = pos = 0; i != n; i++) {
 		uint len = (byte)*b++;
@@ -561,9 +575,9 @@
 				break;
 
 			case SCC_CARGO_SHORT: { /* {SHORTCARGO} */
-				// Short description of cargotypes. Layout:
-				// 8-bit = cargo type
-				// 16-bit = cargo count
+				/* Short description of cargotypes. Layout:
+				 * 8-bit = cargo type
+				 * 16-bit = cargo count */
 				StringID cargo_str = GetCargo(GetInt32(&argv))->units_volume;
 				switch (cargo_str) {
 					case STR_TONS: {
@@ -599,13 +613,13 @@
 			} break;
 
 			case SCC_CURRENCY_COMPACT_64: { /* {CURRCOMPACT64} */
-				// 64 bit compact currency-unit
+				/* 64 bit compact currency-unit */
 				buff = FormatGenericCurrency(buff, _currency, GetInt64(&argv), true, last);
 				break;
 			}
 
 			case SCC_STRING1: { /* {STRING1} */
-				// String that consumes ONE argument
+				/* String that consumes ONE argument */
 				uint str = modifier + GetInt32(&argv);
 				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 1), last);
 				modifier = 0;
@@ -613,7 +627,7 @@
 			}
 
 			case SCC_STRING2: { /* {STRING2} */
-				// String that consumes TWO arguments
+				/* String that consumes TWO arguments */
 				uint str = modifier + GetInt32(&argv);
 				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 2), last);
 				modifier = 0;
@@ -621,7 +635,7 @@
 			}
 
 			case SCC_STRING3: { /* {STRING3} */
-				// String that consumes THREE arguments
+				/* String that consumes THREE arguments */
 				uint str = modifier + GetInt32(&argv);
 				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 3), last);
 				modifier = 0;
@@ -629,7 +643,7 @@
 			}
 
 			case SCC_STRING4: { /* {STRING4} */
-				// String that consumes FOUR arguments
+				/* String that consumes FOUR arguments */
 				uint str = modifier + GetInt32(&argv);
 				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 4), last);
 				modifier = 0;
@@ -637,7 +651,7 @@
 			}
 
 			case SCC_STRING5: { /* {STRING5} */
-				// String that consumes FIVE arguments
+				/* String that consumes FIVE arguments */
 				uint str = modifier + GetInt32(&argv);
 				buff = GetStringWithArgs(buff, str, GetArgvPtr(&argv, 5), last);
 				modifier = 0;
@@ -653,11 +667,11 @@
 				const Industry* i = GetIndustry(GetInt32(&argv));
 				int32 args[2];
 
-				// industry not valid anymore?
+				/* industry not valid anymore? */
 				if (!IsValidIndustry(i)) break;
 
-				// First print the town name and the industry type name
-				// The string STR_INDUSTRY_PATTERN controls the formatting
+				/* First print the town name and the industry type name
+				 * The string STR_INDUSTRY_PATTERN controls the formatting */
 				args[0] = i->town->index;
 				args[1] = GetIndustrySpec(i->type)->name;
 				buff = FormatString(buff, GetStringPtr(STR_INDUSTRY_FORMAT), args, modifier >> 24, last);
@@ -690,9 +704,9 @@
 			}
 
 			case SCC_CARGO: { // {CARGO}
-				// Layout now is:
-				//   8bit   - cargo type
-				//   16-bit - cargo count
+				/* Layout now is:
+				 *   8bit   - cargo type
+				 *   16-bit - cargo count */
 				CargoID cargo = GetInt32(&argv);
 				StringID cargo_str = (cargo == CT_INVALID) ? (StringID)STR_8838_N_A : GetCargo(cargo)->quantifier;
 				buff = GetStringWithArgs(buff, cargo_str, argv++, last);
@@ -748,17 +762,17 @@
 				argv++;
 				break;
 
-			// This sets up the gender for the string.
-			// We just ignore this one. It's used in {G 0 Der Die Das} to determine the case.
+			/* This sets up the gender for the string.
+			 * We just ignore this one. It's used in {G 0 Der Die Das} to determine the case. */
 			case SCC_GENDER_INDEX: // {GENDER 0}
 				str++;
 				break;
 
 			case SCC_STRING: {// {STRING}
 				uint str = modifier + GetInt32(&argv);
-				// WARNING. It's prohibited for the included string to consume any arguments.
-				// For included strings that consume argument, you should use STRING1, STRING2 etc.
-				// To debug stuff you can set argv to NULL and it will tell you
+				/* WARNING. It's prohibited for the included string to consume any arguments.
+				 * For included strings that consume argument, you should use STRING1, STRING2 etc.
+				 * To debug stuff you can set argv to NULL and it will tell you */
 				buff = GetStringWithArgs(buff, str, argv, last);
 				modifier = 0;
 				break;
@@ -828,29 +842,41 @@
 				break;
 			}
 
+			case SCC_GROUP_NAME: { // {GROUP}
+				const Group *g = GetGroup(GetInt32(&argv));
+				int32 args[1];
+
+				assert(IsValidGroup(g));
+
+				args[0] = g->index;
+				buff = GetStringWithArgs(buff, (g->string_id == STR_SV_GROUP_NAME) ? (StringID)STR_GROUP_NAME_FORMAT : g->string_id, args, last);
+
+				break;
+			}
+
 			case SCC_CURRENCY_64: { // {CURRENCY64}
 				buff = FormatGenericCurrency(buff, _currency, GetInt64(&argv), false, last);
 				break;
 			}
 
 			case SCC_SETCASE: { // {SETCASE}
-				// This is a pseudo command, it's outputted when someone does {STRING.ack}
-				// The modifier is added to all subsequent GetStringWithArgs that accept the modifier.
+				/* This is a pseudo command, it's outputted when someone does {STRING.ack}
+				 * The modifier is added to all subsequent GetStringWithArgs that accept the modifier. */
 				modifier = (byte)*str++ << 24;
 				break;
 			}
 
 			case SCC_SWITCH_CASE: { // {Used to implement case switching}
-				// <0x9E> <NUM CASES> <CASE1> <LEN1> <STRING1> <CASE2> <LEN2> <STRING2> <CASE3> <LEN3> <STRING3> <STRINGDEFAULT>
-				// Each LEN is printed using 2 bytes in big endian order.
+				/* <0x9E> <NUM CASES> <CASE1> <LEN1> <STRING1> <CASE2> <LEN2> <STRING2> <CASE3> <LEN3> <STRING3> <STRINGDEFAULT>
+				 * Each LEN is printed using 2 bytes in big endian order. */
 				uint num = (byte)*str++;
 				while (num) {
 					if ((byte)str[0] == casei) {
-						// Found the case, adjust str pointer and continue
+						/* Found the case, adjust str pointer and continue */
 						str += 3;
 						break;
 					}
-					// Otherwise skip to the next case
+					/* Otherwise skip to the next case */
 					str += 3 + (str[1] << 8) + str[2];
 					num--;
 				}
@@ -1018,20 +1044,20 @@
 			return strecpy(buff, origin_songs_specs[GetInt32(&argv) - 1].song_name, last);
 	}
 
-	// town name?
+	/* town name? */
 	if (IS_INT_INSIDE(ind - 6, 0, SPECSTR_TOWNNAME_LAST-SPECSTR_TOWNNAME_START + 1)) {
 		buff = GetSpecialTownNameString(buff, ind - 6, GetInt32(&argv), last);
 		return strecpy(buff, " Transport", last);
 	}
 
-	// language name?
+	/* language name? */
 	if (IS_INT_INSIDE(ind, (SPECSTR_LANGUAGE_START - 0x70E4), (SPECSTR_LANGUAGE_END - 0x70E4) + 1)) {
 		int i = ind - (SPECSTR_LANGUAGE_START - 0x70E4);
 		return strecpy(buff,
 			i == _dynlang.curr ? _langpack->own_name : _dynlang.ent[i].name, last);
 	}
 
-	// resolution size?
+	/* resolution size? */
 	if (IS_INT_INSIDE(ind, (SPECSTR_RESOLUTION_START - 0x70E4), (SPECSTR_RESOLUTION_END - 0x70E4) + 1)) {
 		int i = ind - (SPECSTR_RESOLUTION_START - 0x70E4);
 		buff += snprintf(
@@ -1040,7 +1066,7 @@
 		return buff;
 	}
 
-	// screenshot format name?
+	/* screenshot format name? */
 	if (IS_INT_INSIDE(ind, (SPECSTR_SCREENSHOT_START - 0x70E4), (SPECSTR_SCREENSHOT_END - 0x70E4) + 1)) {
 		int i = ind - (SPECSTR_SCREENSHOT_START - 0x70E4);
 		return strecpy(buff, GetScreenshotFormatDesc(i), last);
@@ -1050,7 +1076,10 @@
 	return NULL;
 }
 
-// remap a string ID from the old format to the new format
+/**
+ * remap a string ID from the old format to the new format
+ * @param s StringID that requires remapping
+ * @return translated ID*/
 StringID RemapOldStringID(StringID s)
 {
 	switch (s) {
@@ -1103,10 +1132,10 @@
 		tot_count += num;
 	}
 
-	// Allocate offsets
+	/* Allocate offsets */
 	langpack_offs = MallocT<char*>(tot_count);
 
-	// Fill offsets
+	/* Fill offsets */
 	s = lang_pack->data;
 	for (i = 0; i != tot_count; i++) {
 		len = (byte)*s;
@@ -1133,7 +1162,7 @@
 /** Determine the current charset based on the environment
  * First check some default values, after this one we passed ourselves
  * and if none exist return the value for $LANG
- * @param environment variable to check conditionally if default ones are not
+ * @param param environment variable to check conditionally if default ones are not
  *        set. Pass NULL if you don't want additional checks.
  * @return return string containing current charset, or NULL if not-determinable */
 const char *GetCurrentLocale(const char *param)
--- a/src/strings.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/strings.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file strings.h */
+
 #ifndef STRINGS_H
 #define STRINGS_H
 
--- a/src/subsidy_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/subsidy_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file subsidy_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
--- a/src/table/ai_rail.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/ai_rail.h	Sat Jun 02 19:59:29 2007 +0000
@@ -21,7 +21,7 @@
 };
 
 
-#define MKHDR(a,b,c,d,e) a,b,c,d,e,
+#define MKHDR(a, b, c, d, e) a, b, c, d, e,
 #define MKDEPOT(a, b, c)   {0, a, {b, c}}
 #define MKSTATION(a, b, c) {1, a, {b, c}}
 #define MKRAIL(a, b, c)    {2, a, {b, c}}
@@ -424,17 +424,17 @@
 
 #undef MKHDR
 
-#define MKHDR(a) a,{
+#define MKHDR(a) a, {
 
 static const AiDefaultBlockData _roaddata_ai_0_data[] = {
-	MKDEPOT(2, -1,1),
-	MKSTATION(0x2, -1,0),
-	MKRAIL(0xC, 0,0),
-	MKRAIL(0x9, 0,1),
-	MKCLRRAIL(0, 0,-1),
-	MKCLRRAIL(0, 1,0),
-	MKCLRRAIL(0, 1,1),
-	MKCLRRAIL(0, 0,2),
+	MKDEPOT(2, -1, 1),
+	MKSTATION(0x2, -1, 0),
+	MKRAIL(0xC, 0, 0),
+	MKRAIL(0x9, 0, 1),
+	MKCLRRAIL(0, 0, -1),
+	MKCLRRAIL(0, 1, 0),
+	MKCLRRAIL(0, 1, 1),
+	MKCLRRAIL(0, 0, 2),
 	MKEND
 };
 
@@ -443,14 +443,14 @@
 };
 
 static const AiDefaultBlockData _roaddata_ai_1_data[] = {
-	MKDEPOT(1, 0,-1),
-	MKSTATION(0x1, 1,-1),
-	MKRAIL(0x3, 0,0),
-	MKRAIL(0x9, 1,0),
-	MKCLRRAIL(0, -1,0),
-	MKCLRRAIL(0, 0,1),
-	MKCLRRAIL(0, 1,1),
-	MKCLRRAIL(0, 2,0),
+	MKDEPOT(1, 0, -1),
+	MKSTATION(0x1, 1, -1),
+	MKRAIL(0x3, 0, 0),
+	MKRAIL(0x9, 1, 0),
+	MKCLRRAIL(0, -1, 0),
+	MKCLRRAIL(0, 0, 1),
+	MKCLRRAIL(0, 1, 1),
+	MKCLRRAIL(0, 2, 0),
 	MKEND
 };
 
@@ -459,14 +459,14 @@
 };
 
 static const AiDefaultBlockData _roaddata_ai_2_data[] = {
-	MKDEPOT(3, 1,1),
-	MKSTATION(0x3, 0,1),
-	MKRAIL(0x6, 0,0),
-	MKRAIL(0xC, 1,0),
-	MKCLRRAIL(0, -1,0),
-	MKCLRRAIL(0, 0,-1),
-	MKCLRRAIL(0, 1,-1),
-	MKCLRRAIL(0, 2,0),
+	MKDEPOT(3, 1, 1),
+	MKSTATION(0x3, 0, 1),
+	MKRAIL(0x6, 0, 0),
+	MKRAIL(0xC, 1, 0),
+	MKCLRRAIL(0, -1, 0),
+	MKCLRRAIL(0, 0, -1),
+	MKCLRRAIL(0, 1, -1),
+	MKCLRRAIL(0, 2, 0),
 	MKEND
 };
 
@@ -475,14 +475,14 @@
 };
 
 static const AiDefaultBlockData _roaddata_ai_3_data[] = {
-	MKDEPOT(0, 1,0),
-	MKSTATION(0x0, 1,1),
-	MKRAIL(0x6, 0,0),
-	MKRAIL(0x3, 0,1),
-	MKCLRRAIL(0, 0,-1),
-	MKCLRRAIL(0, -1,0),
-	MKCLRRAIL(0, -1,1),
-	MKCLRRAIL(0, 0,2),
+	MKDEPOT(0, 1, 0),
+	MKSTATION(0x0, 1, 1),
+	MKRAIL(0x6, 0, 0),
+	MKRAIL(0x3, 0, 1),
+	MKCLRRAIL(0, 0, -1),
+	MKCLRRAIL(0, -1, 0),
+	MKCLRRAIL(0, -1, 1),
+	MKCLRRAIL(0, 0, 2),
 	MKEND
 };
 
@@ -491,11 +491,11 @@
 };
 
 static const AiDefaultBlockData _roaddata_ai_4_data[] = {
-	MKSTATION(0x2, -1,0),
-	MKRAIL(0x8, 0,0),
-	MKCLRRAIL(0, 0,-1),
-	MKCLRRAIL(0, 1,0),
-	MKCLRRAIL(0, 0,1),
+	MKSTATION(0x2, -1, 0),
+	MKRAIL(0x8, 0, 0),
+	MKCLRRAIL(0, 0, -1),
+	MKCLRRAIL(0, 1, 0),
+	MKCLRRAIL(0, 0, 1),
 	MKEND
 };
 
@@ -504,11 +504,11 @@
 };
 
 static const AiDefaultBlockData _roaddata_ai_5_data[] = {
-	MKSTATION(0x3, 0,1),
-	MKRAIL(0x4, 0,0),
-	MKCLRRAIL(0, -1,0),
-	MKCLRRAIL(0, 0,-1),
-	MKCLRRAIL(0, 1,0),
+	MKSTATION(0x3, 0, 1),
+	MKRAIL(0x4, 0, 0),
+	MKCLRRAIL(0, -1, 0),
+	MKCLRRAIL(0, 0, -1),
+	MKCLRRAIL(0, 1, 0),
 	MKEND
 };
 
@@ -517,11 +517,11 @@
 };
 
 static const AiDefaultBlockData _roaddata_ai_6_data[] = {
-	MKSTATION(0x0, 1,1),
-	MKRAIL(0x2, 0,1),
-	MKCLRRAIL(0, 0,0),
-	MKCLRRAIL(0, -1,0),
-	MKCLRRAIL(0, 0,2),
+	MKSTATION(0x0, 1, 1),
+	MKRAIL(0x2, 0, 1),
+	MKCLRRAIL(0, 0, 0),
+	MKCLRRAIL(0, -1, 0),
+	MKCLRRAIL(0, 0, 2),
 	MKEND
 };
 
@@ -530,11 +530,11 @@
 };
 
 static const AiDefaultBlockData _roaddata_ai_7_data[] = {
-	MKSTATION(0x1, 1,-1),
-	MKRAIL(0x1, 1,0),
-	MKCLRRAIL(0, 0,0),
-	MKCLRRAIL(0, 1,1),
-	MKCLRRAIL(0, 2,0),
+	MKSTATION(0x1, 1, -1),
+	MKRAIL(0x1, 1, 0),
+	MKCLRRAIL(0, 0, 0),
+	MKCLRRAIL(0, 1, 1),
+	MKCLRRAIL(0, 2, 0),
 	MKEND
 };
 
--- a/src/table/build_industry.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/build_industry.h	Sat Jun 02 19:59:29 2007 +0000
@@ -5,54 +5,65 @@
 #ifndef BUILD_INDUSTRY_H
 #define BUILD_INDUSTRY_H
 
-#define MK(x,y, m) {{x, y}, m}
+/**
+ * Definition of an industry tiles layout.
+ * @param x offset x of this tile
+ * @param y offset y of this tile
+ * @param m index of the tile.
+ * @see _industry_specs
+ * @see IndustryTileTable
+ */
+#define MK(x, y, m) {{x, y}, m}
 
+/**
+ * Terminator of industry tiles layout definition
+ */
 #define MKEND {{-0x80, 0}, 0}
 
 static const IndustryTileTable _tile_table_coal_mine_0[] = {
-	MK(1,1, 0),
-	MK(1,2, 2),
-	MK(0,0, 5),
-	MK(1,0, 6),
-	MK(2,0, 3),
-	MK(2,2, 3),
+	MK(1, 1, 0),
+	MK(1, 2, 2),
+	MK(0, 0, 5),
+	MK(1, 0, 6),
+	MK(2, 0, 3),
+	MK(2, 2, 3),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_coal_mine_1[] = {
-	MK(1,1, 0),
-	MK(1,2, 2),
-	MK(2,0, 0),
-	MK(2,1, 2),
-	MK(1,0, 3),
-	MK(0,0, 3),
-	MK(0,1, 4),
-	MK(0,2, 4),
-	MK(2,2, 4),
+	MK(1, 1, 0),
+	MK(1, 2, 2),
+	MK(2, 0, 0),
+	MK(2, 1, 2),
+	MK(1, 0, 3),
+	MK(0, 0, 3),
+	MK(0, 1, 4),
+	MK(0, 2, 4),
+	MK(2, 2, 4),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_coal_mine_2[] = {
-	MK(0,0, 0),
-	MK(0,1, 2),
-	MK(0,2, 5),
-	MK(1,0, 3),
-	MK(1,1, 3),
-	MK(1,2, 6),
+	MK(0, 0, 0),
+	MK(0, 1, 2),
+	MK(0, 2, 5),
+	MK(1, 0, 3),
+	MK(1, 1, 3),
+	MK(1, 2, 6),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_coal_mine_3[] = {
-	MK(0,1, 0),
-	MK(0,2, 2),
-	MK(0,3, 4),
-	MK(1,0, 5),
-	MK(1,1, 0),
-	MK(1,2, 2),
-	MK(1,3, 3),
-	MK(2,0, 6),
-	MK(2,1, 4),
-	MK(2,2, 3),
+	MK(0, 1, 0),
+	MK(0, 2, 2),
+	MK(0, 3, 4),
+	MK(1, 0, 5),
+	MK(1, 1, 0),
+	MK(1, 2, 2),
+	MK(1, 3, 3),
+	MK(2, 0, 6),
+	MK(2, 1, 4),
+	MK(2, 2, 3),
 	MKEND
 };
 
@@ -64,36 +75,36 @@
 };
 
 static const IndustryTileTable _tile_table_power_station_0[] = {
-	MK(0,0, 7),
-	MK(0,1, 9),
-	MK(1,0, 7),
-	MK(1,1, 8),
-	MK(2,0, 7),
-	MK(2,1, 8),
-	MK(3,0, 10),
-	MK(3,1, 10),
+	MK(0, 0, 7),
+	MK(0, 1, 9),
+	MK(1, 0, 7),
+	MK(1, 1, 8),
+	MK(2, 0, 7),
+	MK(2, 1, 8),
+	MK(3, 0, 10),
+	MK(3, 1, 10),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_power_station_1[] = {
-	MK(0,1, 7),
-	MK(0,2, 7),
-	MK(1,0, 8),
-	MK(1,1, 8),
-	MK(1,2, 7),
-	MK(2,0, 9),
-	MK(2,1, 10),
-	MK(2,2, 9),
+	MK(0, 1, 7),
+	MK(0, 2, 7),
+	MK(1, 0, 8),
+	MK(1, 1, 8),
+	MK(1, 2, 7),
+	MK(2, 0, 9),
+	MK(2, 1, 10),
+	MK(2, 2, 9),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_power_station_2[] = {
-	MK(0,0, 7),
-	MK(0,1, 7),
-	MK(1,0, 9),
-	MK(1,1, 8),
-	MK(2,0, 10),
-	MK(2,1, 9),
+	MK(0, 0, 7),
+	MK(0, 1, 7),
+	MK(1, 0, 9),
+	MK(1, 1, 8),
+	MK(2, 0, 10),
+	MK(2, 1, 9),
 	MKEND
 };
 
@@ -104,26 +115,26 @@
 };
 
 static const IndustryTileTable _tile_table_sawmill_0[] = {
-	MK(1,0, 14),
-	MK(1,1, 12),
-	MK(1,2, 11),
-	MK(2,0, 14),
-	MK(2,1, 13),
-	MK(0,0, 15),
-	MK(0,1, 15),
-	MK(0,2, 12),
+	MK(1, 0, 14),
+	MK(1, 1, 12),
+	MK(1, 2, 11),
+	MK(2, 0, 14),
+	MK(2, 1, 13),
+	MK(0, 0, 15),
+	MK(0, 1, 15),
+	MK(0, 2, 12),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_sawmill_1[] = {
-	MK(0,0, 15),
-	MK(0,1, 11),
-	MK(0,2, 14),
-	MK(1,0, 15),
-	MK(1,1, 13),
-	MK(1,2, 12),
-	MK(2,0, 11),
-	MK(2,1, 13),
+	MK(0, 0, 15),
+	MK(0, 1, 11),
+	MK(0, 2, 14),
+	MK(1, 0, 15),
+	MK(1, 1, 13),
+	MK(1, 2, 12),
+	MK(2, 0, 11),
+	MK(2, 1, 13),
 	MKEND
 };
 
@@ -133,51 +144,51 @@
 };
 
 static const IndustryTileTable _tile_table_forest_0[] = {
-	MK(0,0, 16),
-	MK(0,1, 16),
-	MK(0,2, 16),
-	MK(0,3, 16),
-	MK(1,0, 16),
-	MK(1,1, 16),
-	MK(1,2, 16),
-	MK(1,3, 16),
-	MK(2,0, 16),
-	MK(2,1, 16),
-	MK(2,2, 16),
-	MK(2,3, 16),
-	MK(3,0, 16),
-	MK(3,1, 16),
-	MK(3,2, 16),
-	MK(3,3, 16),
-	MK(1,4, 16),
-	MK(2,4, 16),
+	MK(0, 0, 16),
+	MK(0, 1, 16),
+	MK(0, 2, 16),
+	MK(0, 3, 16),
+	MK(1, 0, 16),
+	MK(1, 1, 16),
+	MK(1, 2, 16),
+	MK(1, 3, 16),
+	MK(2, 0, 16),
+	MK(2, 1, 16),
+	MK(2, 2, 16),
+	MK(2, 3, 16),
+	MK(3, 0, 16),
+	MK(3, 1, 16),
+	MK(3, 2, 16),
+	MK(3, 3, 16),
+	MK(1, 4, 16),
+	MK(2, 4, 16),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_forest_1[] = {
-	MK(0,0, 16),
-	MK(1,0, 16),
-	MK(2,0, 16),
-	MK(3,0, 16),
-	MK(4,0, 16),
-	MK(0,1, 16),
-	MK(1,1, 16),
-	MK(2,1, 16),
-	MK(3,1, 16),
-	MK(4,1, 16),
-	MK(0,2, 16),
-	MK(1,2, 16),
-	MK(2,2, 16),
-	MK(3,2, 16),
-	MK(4,2, 16),
-	MK(0,3, 16),
-	MK(1,3, 16),
-	MK(2,3, 16),
-	MK(3,3, 16),
-	MK(4,3, 16),
-	MK(1,4, 16),
-	MK(2,4, 16),
-	MK(3,4, 16),
+	MK(0, 0, 16),
+	MK(1, 0, 16),
+	MK(2, 0, 16),
+	MK(3, 0, 16),
+	MK(4, 0, 16),
+	MK(0, 1, 16),
+	MK(1, 1, 16),
+	MK(2, 1, 16),
+	MK(3, 1, 16),
+	MK(4, 1, 16),
+	MK(0, 2, 16),
+	MK(1, 2, 16),
+	MK(2, 2, 16),
+	MK(3, 2, 16),
+	MK(4, 2, 16),
+	MK(0, 3, 16),
+	MK(1, 3, 16),
+	MK(2, 3, 16),
+	MK(3, 3, 16),
+	MK(4, 3, 16),
+	MK(1, 4, 16),
+	MK(2, 4, 16),
+	MK(3, 4, 16),
 	MKEND
 };
 
@@ -187,40 +198,40 @@
 };
 
 static const IndustryTileTable _tile_table_oil_refinery_0[] = {
-	MK(0,0, 20),
-	MK(0,1, 21),
-	MK(0,2, 22),
-	MK(0,3, 21),
-	MK(1,0, 20),
-	MK(1,1, 19),
-	MK(1,2, 22),
-	MK(1,3, 20),
-	MK(2,1, 18),
-	MK(2,2, 18),
-	MK(2,3, 18),
-	MK(3,2, 18),
-	MK(3,3, 18),
-	MK(2,0, 23),
-	MK(3,1, 23),
+	MK(0, 0, 20),
+	MK(0, 1, 21),
+	MK(0, 2, 22),
+	MK(0, 3, 21),
+	MK(1, 0, 20),
+	MK(1, 1, 19),
+	MK(1, 2, 22),
+	MK(1, 3, 20),
+	MK(2, 1, 18),
+	MK(2, 2, 18),
+	MK(2, 3, 18),
+	MK(3, 2, 18),
+	MK(3, 3, 18),
+	MK(2, 0, 23),
+	MK(3, 1, 23),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_oil_refinery_1[] = {
-	MK(0,0, 18),
-	MK(0,1, 18),
-	MK(0,2, 21),
-	MK(0,3, 22),
-	MK(0,4, 20),
-	MK(1,0, 18),
-	MK(1,1, 18),
-	MK(1,2, 19),
-	MK(1,3, 20),
-	MK(2,0, 18),
-	MK(2,1, 18),
-	MK(2,2, 19),
-	MK(2,3, 22),
-	MK(1,4, 23),
-	MK(2,4, 23),
+	MK(0, 0, 18),
+	MK(0, 1, 18),
+	MK(0, 2, 21),
+	MK(0, 3, 22),
+	MK(0, 4, 20),
+	MK(1, 0, 18),
+	MK(1, 1, 18),
+	MK(1, 2, 19),
+	MK(1, 3, 20),
+	MK(2, 0, 18),
+	MK(2, 1, 18),
+	MK(2, 2, 19),
+	MK(2, 3, 22),
+	MK(1, 4, 23),
+	MK(2, 4, 23),
 	MKEND
 };
 
@@ -230,51 +241,51 @@
 };
 
 static const IndustryTileTable _tile_table_oil_rig_0[] = {
-	MK(0,0, 24),
-	MK(0,1, 24),
-	MK(0,2, 25),
-	MK(1,0, 26),
-	MK(1,1, 27),
-	MK(1,2, 28),
-	MK(-4,-5, 255),
-	MK(-4,-4, 255),
-	MK(-4,-3, 255),
-	MK(-4,-2, 255),
-	MK(-4,-1, 255),
-	MK(-4,0, 255),
-	MK(-4,1, 255),
-	MK(-4,2, 255),
-	MK(-4,3, 255),
-	MK(-4,4, 255),
-	MK(-4,5, 255),
-	MK(-3,5, 255),
-	MK(-2,5, 255),
-	MK(-1,5, 255),
-	MK(0,6, 255),
-	MK(1,6, 255),
-	MK(2,6, 255),
-	MK(3,6, 255),
-	MK(4,6, 255),
-	MK(5,6, 255),
-	MK(5,5, 255),
-	MK(5,4, 255),
-	MK(5,3, 255),
-	MK(5,2, 255),
-	MK(5,1, 255),
-	MK(5,0, 255),
-	MK(5,-1, 255),
-	MK(5,-2, 255),
-	MK(5,-3, 255),
-	MK(5,-4, 255),
-	MK(4,-4, 255),
-	MK(3,-4, 255),
-	MK(2,-4, 255),
-	MK(1,-4, 255),
-	MK(0,-4, 255),
-	MK(-1,-5, 255),
-	MK(-2,-5, 255),
-	MK(-3,-5, 255),
-	MK(2,0, 255),
+	MK(0, 0, 24),
+	MK(0, 1, 24),
+	MK(0, 2, 25),
+	MK(1, 0, 26),
+	MK(1, 1, 27),
+	MK(1, 2, 28),
+	MK(-4, -5, 255),
+	MK(-4, -4, 255),
+	MK(-4, -3, 255),
+	MK(-4, -2, 255),
+	MK(-4, -1, 255),
+	MK(-4, 0, 255),
+	MK(-4, 1, 255),
+	MK(-4, 2, 255),
+	MK(-4, 3, 255),
+	MK(-4, 4, 255),
+	MK(-4, 5, 255),
+	MK(-3, 5, 255),
+	MK(-2, 5, 255),
+	MK(-1, 5, 255),
+	MK(0, 6, 255),
+	MK(1, 6, 255),
+	MK(2, 6, 255),
+	MK(3, 6, 255),
+	MK(4, 6, 255),
+	MK(5, 6, 255),
+	MK(5, 5, 255),
+	MK(5, 4, 255),
+	MK(5, 3, 255),
+	MK(5, 2, 255),
+	MK(5, 1, 255),
+	MK(5, 0, 255),
+	MK(5, -1, 255),
+	MK(5, -2, 255),
+	MK(5, -3, 255),
+	MK(5, -4, 255),
+	MK(4, -4, 255),
+	MK(3, -4, 255),
+	MK(2, -4, 255),
+	MK(1, -4, 255),
+	MK(0, -4, 255),
+	MK(-1, -5, 255),
+	MK(-2, -5, 255),
+	MK(-3, -5, 255),
+	MK(2, 0, 255),
 	MKEND
 };
 
@@ -283,34 +294,34 @@
 };
 
 static const IndustryTileTable _tile_table_factory_0[] = {
-	MK(0,0, 39),
-	MK(0,1, 40),
-	MK(1,0, 41),
-	MK(1,1, 42),
-	MK(0,2, 39),
-	MK(0,3, 40),
-	MK(1,2, 41),
-	MK(1,3, 42),
-	MK(2,1, 39),
-	MK(2,2, 40),
-	MK(3,1, 41),
-	MK(3,2, 42),
+	MK(0, 0, 39),
+	MK(0, 1, 40),
+	MK(1, 0, 41),
+	MK(1, 1, 42),
+	MK(0, 2, 39),
+	MK(0, 3, 40),
+	MK(1, 2, 41),
+	MK(1, 3, 42),
+	MK(2, 1, 39),
+	MK(2, 2, 40),
+	MK(3, 1, 41),
+	MK(3, 2, 42),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_factory_1[] = {
-	MK(0,0, 39),
-	MK(0,1, 40),
-	MK(1,0, 41),
-	MK(1,1, 42),
-	MK(2,0, 39),
-	MK(2,1, 40),
-	MK(3,0, 41),
-	MK(3,1, 42),
-	MK(1,2, 39),
-	MK(1,3, 40),
-	MK(2,2, 41),
-	MK(2,3, 42),
+	MK(0, 0, 39),
+	MK(0, 1, 40),
+	MK(1, 0, 41),
+	MK(1, 1, 42),
+	MK(2, 0, 39),
+	MK(2, 1, 40),
+	MK(3, 0, 41),
+	MK(3, 1, 42),
+	MK(1, 2, 39),
+	MK(1, 3, 40),
+	MK(2, 2, 41),
+	MK(2, 3, 42),
 	MKEND
 };
 
@@ -320,34 +331,34 @@
 };
 
 static const IndustryTileTable _tile_table_printing_works_0[] = {
-	MK(0,0, 43),
-	MK(0,1, 44),
-	MK(1,0, 45),
-	MK(1,1, 46),
-	MK(0,2, 43),
-	MK(0,3, 44),
-	MK(1,2, 45),
-	MK(1,3, 46),
-	MK(2,1, 43),
-	MK(2,2, 44),
-	MK(3,1, 45),
-	MK(3,2, 46),
+	MK(0, 0, 43),
+	MK(0, 1, 44),
+	MK(1, 0, 45),
+	MK(1, 1, 46),
+	MK(0, 2, 43),
+	MK(0, 3, 44),
+	MK(1, 2, 45),
+	MK(1, 3, 46),
+	MK(2, 1, 43),
+	MK(2, 2, 44),
+	MK(3, 1, 45),
+	MK(3, 2, 46),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_printing_works_1[] = {
-	MK(0,0, 43),
-	MK(0,1, 44),
-	MK(1,0, 45),
-	MK(1,1, 46),
-	MK(2,0, 43),
-	MK(2,1, 44),
-	MK(3,0, 45),
-	MK(3,1, 46),
-	MK(1,2, 43),
-	MK(1,3, 44),
-	MK(2,2, 45),
-	MK(2,3, 46),
+	MK(0, 0, 43),
+	MK(0, 1, 44),
+	MK(1, 0, 45),
+	MK(1, 1, 46),
+	MK(2, 0, 43),
+	MK(2, 1, 44),
+	MK(3, 0, 45),
+	MK(3, 1, 46),
+	MK(1, 2, 43),
+	MK(1, 3, 44),
+	MK(2, 2, 45),
+	MK(2, 3, 46),
 	MKEND
 };
 
@@ -357,36 +368,36 @@
 };
 
 static const IndustryTileTable _tile_table_steel_mill_0[] = {
-	MK(2,1, 52),
-	MK(2,2, 53),
-	MK(3,1, 54),
-	MK(3,2, 55),
-	MK(0,0, 56),
-	MK(1,0, 57),
-	MK(0,1, 56),
-	MK(1,1, 57),
-	MK(0,2, 56),
-	MK(1,2, 57),
-	MK(2,0, 56),
-	MK(3,0, 57),
+	MK(2, 1, 52),
+	MK(2, 2, 53),
+	MK(3, 1, 54),
+	MK(3, 2, 55),
+	MK(0, 0, 56),
+	MK(1, 0, 57),
+	MK(0, 1, 56),
+	MK(1, 1, 57),
+	MK(0, 2, 56),
+	MK(1, 2, 57),
+	MK(2, 0, 56),
+	MK(3, 0, 57),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_steel_mill_1[] = {
-	MK(0,0, 52),
-	MK(0,1, 53),
-	MK(1,0, 54),
-	MK(1,1, 55),
-	MK(2,0, 52),
-	MK(2,1, 53),
-	MK(3,0, 54),
-	MK(3,1, 55),
-	MK(0,2, 56),
-	MK(1,2, 57),
-	MK(2,2, 56),
-	MK(3,2, 57),
-	MK(1,3, 56),
-	MK(2,3, 57),
+	MK(0, 0, 52),
+	MK(0, 1, 53),
+	MK(1, 0, 54),
+	MK(1, 1, 55),
+	MK(2, 0, 52),
+	MK(2, 1, 53),
+	MK(3, 0, 54),
+	MK(3, 1, 55),
+	MK(0, 2, 56),
+	MK(1, 2, 57),
+	MK(2, 2, 56),
+	MK(3, 2, 57),
+	MK(1, 3, 56),
+	MK(2, 3, 57),
 	MKEND
 };
 
@@ -396,47 +407,47 @@
 };
 
 static const IndustryTileTable _tile_table_farm_0[] = {
-	MK(1,0, 33),
-	MK(1,1, 34),
-	MK(1,2, 36),
-	MK(0,0, 37),
-	MK(0,1, 37),
-	MK(0,2, 36),
-	MK(2,0, 35),
-	MK(2,1, 38),
-	MK(2,2, 38),
+	MK(1, 0, 33),
+	MK(1, 1, 34),
+	MK(1, 2, 36),
+	MK(0, 0, 37),
+	MK(0, 1, 37),
+	MK(0, 2, 36),
+	MK(2, 0, 35),
+	MK(2, 1, 38),
+	MK(2, 2, 38),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_farm_1[] = {
-	MK(1,1, 33),
-	MK(1,2, 34),
-	MK(0,0, 35),
-	MK(0,1, 36),
-	MK(0,2, 36),
-	MK(0,3, 35),
-	MK(1,0, 37),
-	MK(1,3, 38),
-	MK(2,0, 37),
-	MK(2,1, 37),
-	MK(2,2, 38),
-	MK(2,3, 38),
+	MK(1, 1, 33),
+	MK(1, 2, 34),
+	MK(0, 0, 35),
+	MK(0, 1, 36),
+	MK(0, 2, 36),
+	MK(0, 3, 35),
+	MK(1, 0, 37),
+	MK(1, 3, 38),
+	MK(2, 0, 37),
+	MK(2, 1, 37),
+	MK(2, 2, 38),
+	MK(2, 3, 38),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_farm_2[] = {
-	MK(2,0, 33),
-	MK(2,1, 34),
-	MK(0,0, 36),
-	MK(0,1, 36),
-	MK(0,2, 37),
-	MK(0,3, 37),
-	MK(1,0, 35),
-	MK(1,1, 38),
-	MK(1,2, 38),
-	MK(1,3, 37),
-	MK(2,2, 37),
-	MK(2,3, 35),
+	MK(2, 0, 33),
+	MK(2, 1, 34),
+	MK(0, 0, 36),
+	MK(0, 1, 36),
+	MK(0, 2, 37),
+	MK(0, 3, 37),
+	MK(1, 0, 35),
+	MK(1, 1, 38),
+	MK(1, 2, 38),
+	MK(1, 3, 37),
+	MK(2, 2, 37),
+	MK(2, 3, 35),
 	MKEND
 };
 
@@ -447,27 +458,27 @@
 };
 
 static const IndustryTileTable _tile_table_copper_mine_0[] = {
-	MK(0,0, 47),
-	MK(0,1, 49),
-	MK(0,2, 51),
-	MK(1,0, 47),
-	MK(1,1, 49),
-	MK(1,2, 50),
-	MK(2,0, 51),
-	MK(2,1, 51),
+	MK(0, 0, 47),
+	MK(0, 1, 49),
+	MK(0, 2, 51),
+	MK(1, 0, 47),
+	MK(1, 1, 49),
+	MK(1, 2, 50),
+	MK(2, 0, 51),
+	MK(2, 1, 51),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_copper_mine_1[] = {
-	MK(0,0, 50),
-	MK(0,1, 47),
-	MK(0,2, 49),
-	MK(1,0, 47),
-	MK(1,1, 49),
-	MK(1,2, 51),
-	MK(2,0, 51),
-	MK(2,1, 47),
-	MK(2,2, 49),
+	MK(0, 0, 50),
+	MK(0, 1, 47),
+	MK(0, 2, 49),
+	MK(1, 0, 47),
+	MK(1, 1, 49),
+	MK(1, 2, 51),
+	MK(2, 0, 51),
+	MK(2, 1, 47),
+	MK(2, 2, 49),
 	MKEND
 };
 
@@ -477,20 +488,20 @@
 };
 
 static const IndustryTileTable _tile_table_oil_well_0[] = {
-	MK(0,0, 29),
-	MK(1,0, 29),
-	MK(2,0, 29),
-	MK(0,1, 29),
-	MK(0,2, 29),
+	MK(0, 0, 29),
+	MK(1, 0, 29),
+	MK(2, 0, 29),
+	MK(0, 1, 29),
+	MK(0, 2, 29),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_oil_well_1[] = {
-	MK(0,0, 29),
-	MK(1,0, 29),
-	MK(1,1, 29),
-	MK(2,2, 29),
-	MK(2,3, 29),
+	MK(0, 0, 29),
+	MK(1, 0, 29),
+	MK(1, 1, 29),
+	MK(2, 2, 29),
+	MK(2, 3, 29),
 	MKEND
 };
 
@@ -500,8 +511,8 @@
 };
 
 static const IndustryTileTable _tile_table_bank_0[] = {
-	MK(0,0, 58),
-	MK(1,0, 59),
+	MK(0, 0, 58),
+	MK(1, 0, 59),
 	MKEND
 };
 
@@ -510,36 +521,36 @@
 };
 
 static const IndustryTileTable _tile_table_food_process_0[] = {
-	MK(0,0, 60),
-	MK(1,0, 60),
-	MK(2,0, 60),
-	MK(0,1, 60),
-	MK(1,1, 60),
-	MK(2,1, 60),
-	MK(0,2, 61),
-	MK(1,2, 61),
-	MK(2,2, 63),
-	MK(0,3, 62),
-	MK(1,3, 62),
-	MK(2,3, 63),
+	MK(0, 0, 60),
+	MK(1, 0, 60),
+	MK(2, 0, 60),
+	MK(0, 1, 60),
+	MK(1, 1, 60),
+	MK(2, 1, 60),
+	MK(0, 2, 61),
+	MK(1, 2, 61),
+	MK(2, 2, 63),
+	MK(0, 3, 62),
+	MK(1, 3, 62),
+	MK(2, 3, 63),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_food_process_1[] = {
-	MK(0,0, 61),
-	MK(1,0, 60),
-	MK(2,0, 61),
-	MK(3,0, 61),
-	MK(0,1, 62),
-	MK(1,1, 63),
-	MK(2,1, 63),
-	MK(3,1, 63),
-	MK(0,2, 60),
-	MK(1,2, 60),
-	MK(2,2, 60),
-	MK(3,2, 60),
-	MK(0,3, 62),
-	MK(1,3, 62),
+	MK(0, 0, 61),
+	MK(1, 0, 60),
+	MK(2, 0, 61),
+	MK(3, 0, 61),
+	MK(0, 1, 62),
+	MK(1, 1, 63),
+	MK(2, 1, 63),
+	MK(3, 1, 63),
+	MK(0, 2, 60),
+	MK(1, 2, 60),
+	MK(2, 2, 60),
+	MK(3, 2, 60),
+	MK(0, 3, 62),
+	MK(1, 3, 62),
 	MKEND
 };
 
@@ -549,18 +560,18 @@
 };
 
 static const IndustryTileTable _tile_table_paper_mill_0[] = {
-	MK(0,0, 64),
-	MK(1,0, 65),
-	MK(2,0, 66),
-	MK(3,0, 67),
-	MK(0,1, 68),
-	MK(1,1, 69),
-	MK(2,1, 67),
-	MK(3,1, 67),
-	MK(0,2, 66),
-	MK(1,2, 71),
-	MK(2,2, 71),
-	MK(3,2, 70),
+	MK(0, 0, 64),
+	MK(1, 0, 65),
+	MK(2, 0, 66),
+	MK(3, 0, 67),
+	MK(0, 1, 68),
+	MK(1, 1, 69),
+	MK(2, 1, 67),
+	MK(3, 1, 67),
+	MK(0, 2, 66),
+	MK(1, 2, 71),
+	MK(2, 2, 71),
+	MK(3, 2, 70),
 	MKEND
 };
 
@@ -569,22 +580,22 @@
 };
 
 static const IndustryTileTable _tile_table_gold_mine_0[] = {
-	MK(0,0, 72),
-	MK(0,1, 73),
-	MK(0,2, 74),
-	MK(0,3, 75),
-	MK(1,0, 76),
-	MK(1,1, 77),
-	MK(1,2, 78),
-	MK(1,3, 79),
-	MK(2,0, 80),
-	MK(2,1, 81),
-	MK(2,2, 82),
-	MK(2,3, 83),
-	MK(3,0, 84),
-	MK(3,1, 85),
-	MK(3,2, 86),
-	MK(3,3, 87),
+	MK(0, 0, 72),
+	MK(0, 1, 73),
+	MK(0, 2, 74),
+	MK(0, 3, 75),
+	MK(1, 0, 76),
+	MK(1, 1, 77),
+	MK(1, 2, 78),
+	MK(1, 3, 79),
+	MK(2, 0, 80),
+	MK(2, 1, 81),
+	MK(2, 2, 82),
+	MK(2, 3, 83),
+	MK(3, 0, 84),
+	MK(3, 1, 85),
+	MK(3, 2, 86),
+	MK(3, 3, 87),
 	MKEND
 };
 
@@ -593,8 +604,8 @@
 };
 
 static const IndustryTileTable _tile_table_bank2_0[] = {
-	MK(0,0, 89),
-	MK(1,0, 90),
+	MK(0, 0, 89),
+	MK(1, 0, 90),
 	MKEND
 };
 
@@ -603,15 +614,15 @@
 };
 
 static const IndustryTileTable _tile_table_diamond_mine_0[] = {
-	MK(0,0, 91),
-	MK(0,1, 92),
-	MK(0,2, 93),
-	MK(1,0, 94),
-	MK(1,1, 95),
-	MK(1,2, 96),
-	MK(2,0, 97),
-	MK(2,1, 98),
-	MK(2,2, 99),
+	MK(0, 0, 91),
+	MK(0, 1, 92),
+	MK(0, 2, 93),
+	MK(1, 0, 94),
+	MK(1, 1, 95),
+	MK(1, 2, 96),
+	MK(2, 0, 97),
+	MK(2, 1, 98),
+	MK(2, 2, 99),
 	MKEND
 };
 
@@ -620,22 +631,22 @@
 };
 
 static const IndustryTileTable _tile_table_iron_mine_0[] = {
-	MK(0,0, 100),
-	MK(0,1, 101),
-	MK(0,2, 102),
-	MK(0,3, 103),
-	MK(1,0, 104),
-	MK(1,1, 105),
-	MK(1,2, 106),
-	MK(1,3, 107),
-	MK(2,0, 108),
-	MK(2,1, 109),
-	MK(2,2, 110),
-	MK(2,3, 111),
-	MK(3,0, 112),
-	MK(3,1, 113),
-	MK(3,2, 114),
-	MK(3,3, 115),
+	MK(0, 0, 100),
+	MK(0, 1, 101),
+	MK(0, 2, 102),
+	MK(0, 3, 103),
+	MK(1, 0, 104),
+	MK(1, 1, 105),
+	MK(1, 2, 106),
+	MK(1, 3, 107),
+	MK(2, 0, 108),
+	MK(2, 1, 109),
+	MK(2, 2, 110),
+	MK(2, 3, 111),
+	MK(3, 0, 112),
+	MK(3, 1, 113),
+	MK(3, 2, 114),
+	MK(3, 3, 115),
 	MKEND
 };
 
@@ -644,26 +655,26 @@
 };
 
 static const IndustryTileTable _tile_table_fruit_plantation_0[] = {
-	MK(0,0, 116),
-	MK(0,1, 116),
-	MK(0,2, 116),
-	MK(0,3, 116),
-	MK(1,0, 116),
-	MK(1,1, 116),
-	MK(1,2, 116),
-	MK(1,3, 116),
-	MK(2,0, 116),
-	MK(2,1, 116),
-	MK(2,2, 116),
-	MK(2,3, 116),
-	MK(3,0, 116),
-	MK(3,1, 116),
-	MK(3,2, 116),
-	MK(3,3, 116),
-	MK(4,0, 116),
-	MK(4,1, 116),
-	MK(4,2, 116),
-	MK(4,3, 116),
+	MK(0, 0, 116),
+	MK(0, 1, 116),
+	MK(0, 2, 116),
+	MK(0, 3, 116),
+	MK(1, 0, 116),
+	MK(1, 1, 116),
+	MK(1, 2, 116),
+	MK(1, 3, 116),
+	MK(2, 0, 116),
+	MK(2, 1, 116),
+	MK(2, 2, 116),
+	MK(2, 3, 116),
+	MK(3, 0, 116),
+	MK(3, 1, 116),
+	MK(3, 2, 116),
+	MK(3, 3, 116),
+	MK(4, 0, 116),
+	MK(4, 1, 116),
+	MK(4, 2, 116),
+	MK(4, 3, 116),
 	MKEND
 };
 
@@ -672,26 +683,26 @@
 };
 
 static const IndustryTileTable _tile_table_rubber_plantation_0[] = {
-	MK(0,0, 117),
-	MK(0,1, 117),
-	MK(0,2, 117),
-	MK(0,3, 117),
-	MK(1,0, 117),
-	MK(1,1, 117),
-	MK(1,2, 117),
-	MK(1,3, 117),
-	MK(2,0, 117),
-	MK(2,1, 117),
-	MK(2,2, 117),
-	MK(2,3, 117),
-	MK(3,0, 117),
-	MK(3,1, 117),
-	MK(3,2, 117),
-	MK(3,3, 117),
-	MK(4,0, 117),
-	MK(4,1, 117),
-	MK(4,2, 117),
-	MK(4,3, 117),
+	MK(0, 0, 117),
+	MK(0, 1, 117),
+	MK(0, 2, 117),
+	MK(0, 3, 117),
+	MK(1, 0, 117),
+	MK(1, 1, 117),
+	MK(1, 2, 117),
+	MK(1, 3, 117),
+	MK(2, 0, 117),
+	MK(2, 1, 117),
+	MK(2, 2, 117),
+	MK(2, 3, 117),
+	MK(3, 0, 117),
+	MK(3, 1, 117),
+	MK(3, 2, 117),
+	MK(3, 3, 117),
+	MK(4, 0, 117),
+	MK(4, 1, 117),
+	MK(4, 2, 117),
+	MK(4, 3, 117),
 	MKEND
 };
 
@@ -700,10 +711,10 @@
 };
 
 static const IndustryTileTable _tile_table_water_supply_0[] = {
-	MK(0,0, 118),
-	MK(0,1, 119),
-	MK(1,0, 118),
-	MK(1,1, 119),
+	MK(0, 0, 118),
+	MK(0, 1, 119),
+	MK(1, 0, 118),
+	MK(1, 1, 119),
 	MKEND
 };
 
@@ -712,7 +723,7 @@
 };
 
 static const IndustryTileTable _tile_table_water_tower_0[] = {
-	MK(0,0, 120),
+	MK(0, 0, 120),
 	MKEND
 };
 
@@ -721,26 +732,26 @@
 };
 
 static const IndustryTileTable _tile_table_factory2_0[] = {
-	MK(0,0, 121),
-	MK(0,1, 122),
-	MK(1,0, 123),
-	MK(1,1, 124),
-	MK(0,2, 121),
-	MK(0,3, 122),
-	MK(1,2, 123),
-	MK(1,3, 124),
+	MK(0, 0, 121),
+	MK(0, 1, 122),
+	MK(1, 0, 123),
+	MK(1, 1, 124),
+	MK(0, 2, 121),
+	MK(0, 3, 122),
+	MK(1, 2, 123),
+	MK(1, 3, 124),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_factory2_1[] = {
-	MK(0,0, 121),
-	MK(0,1, 122),
-	MK(1,0, 123),
-	MK(1,1, 124),
-	MK(2,0, 121),
-	MK(2,1, 122),
-	MK(3,0, 123),
-	MK(3,1, 124),
+	MK(0, 0, 121),
+	MK(0, 1, 122),
+	MK(1, 0, 123),
+	MK(1, 1, 124),
+	MK(2, 0, 121),
+	MK(2, 1, 122),
+	MK(3, 0, 123),
+	MK(3, 1, 124),
 	MKEND
 };
 
@@ -750,47 +761,47 @@
 };
 
 static const IndustryTileTable _tile_table_farm2_0[] = {
-	MK(1,0, 33),
-	MK(1,1, 34),
-	MK(1,2, 36),
-	MK(0,0, 37),
-	MK(0,1, 37),
-	MK(0,2, 36),
-	MK(2,0, 35),
-	MK(2,1, 38),
-	MK(2,2, 38),
+	MK(1, 0, 33),
+	MK(1, 1, 34),
+	MK(1, 2, 36),
+	MK(0, 0, 37),
+	MK(0, 1, 37),
+	MK(0, 2, 36),
+	MK(2, 0, 35),
+	MK(2, 1, 38),
+	MK(2, 2, 38),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_farm2_1[] = {
-	MK(1,1, 33),
-	MK(1,2, 34),
-	MK(0,0, 35),
-	MK(0,1, 36),
-	MK(0,2, 36),
-	MK(0,3, 35),
-	MK(1,0, 37),
-	MK(1,3, 38),
-	MK(2,0, 37),
-	MK(2,1, 37),
-	MK(2,2, 38),
-	MK(2,3, 38),
+	MK(1, 1, 33),
+	MK(1, 2, 34),
+	MK(0, 0, 35),
+	MK(0, 1, 36),
+	MK(0, 2, 36),
+	MK(0, 3, 35),
+	MK(1, 0, 37),
+	MK(1, 3, 38),
+	MK(2, 0, 37),
+	MK(2, 1, 37),
+	MK(2, 2, 38),
+	MK(2, 3, 38),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_farm2_2[] = {
-	MK(2,0, 33),
-	MK(2,1, 34),
-	MK(0,0, 36),
-	MK(0,1, 36),
-	MK(0,2, 37),
-	MK(0,3, 37),
-	MK(1,0, 35),
-	MK(1,1, 38),
-	MK(1,2, 38),
-	MK(1,3, 37),
-	MK(2,2, 37),
-	MK(2,3, 35),
+	MK(2, 0, 33),
+	MK(2, 1, 34),
+	MK(0, 0, 36),
+	MK(0, 1, 36),
+	MK(0, 2, 37),
+	MK(0, 3, 37),
+	MK(1, 0, 35),
+	MK(1, 1, 38),
+	MK(1, 2, 38),
+	MK(1, 3, 37),
+	MK(2, 2, 37),
+	MK(2, 3, 35),
 	MKEND
 };
 
@@ -801,10 +812,10 @@
 };
 
 static const IndustryTileTable _tile_table_lumber_mill_0[] = {
-	MK(0,0, 125),
-	MK(0,1, 126),
-	MK(1,0, 127),
-	MK(1,1, 128),
+	MK(0, 0, 125),
+	MK(0, 1, 126),
+	MK(1, 0, 127),
+	MK(1, 1, 128),
 	MKEND
 };
 
@@ -813,51 +824,51 @@
 };
 
 static const IndustryTileTable _tile_table_cotton_candy_0[] = {
-	MK(0,0, 129),
-	MK(0,1, 129),
-	MK(0,2, 129),
-	MK(0,3, 129),
-	MK(1,0, 129),
-	MK(1,1, 129),
-	MK(1,2, 129),
-	MK(1,3, 129),
-	MK(2,0, 129),
-	MK(2,1, 129),
-	MK(2,2, 129),
-	MK(2,3, 129),
-	MK(3,0, 129),
-	MK(3,1, 129),
-	MK(3,2, 129),
-	MK(3,3, 129),
-	MK(1,4, 129),
-	MK(2,4, 129),
+	MK(0, 0, 129),
+	MK(0, 1, 129),
+	MK(0, 2, 129),
+	MK(0, 3, 129),
+	MK(1, 0, 129),
+	MK(1, 1, 129),
+	MK(1, 2, 129),
+	MK(1, 3, 129),
+	MK(2, 0, 129),
+	MK(2, 1, 129),
+	MK(2, 2, 129),
+	MK(2, 3, 129),
+	MK(3, 0, 129),
+	MK(3, 1, 129),
+	MK(3, 2, 129),
+	MK(3, 3, 129),
+	MK(1, 4, 129),
+	MK(2, 4, 129),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_cotton_candy_1[] = {
-	MK(0,0, 129),
-	MK(1,0, 129),
-	MK(2,0, 129),
-	MK(3,0, 129),
-	MK(4,0, 129),
-	MK(0,1, 129),
-	MK(1,1, 129),
-	MK(2,1, 129),
-	MK(3,1, 129),
-	MK(4,1, 129),
-	MK(0,2, 129),
-	MK(1,2, 129),
-	MK(2,2, 129),
-	MK(3,2, 129),
-	MK(4,2, 129),
-	MK(0,3, 129),
-	MK(1,3, 129),
-	MK(2,3, 129),
-	MK(3,3, 129),
-	MK(4,3, 129),
-	MK(1,4, 129),
-	MK(2,4, 129),
-	MK(3,4, 129),
+	MK(0, 0, 129),
+	MK(1, 0, 129),
+	MK(2, 0, 129),
+	MK(3, 0, 129),
+	MK(4, 0, 129),
+	MK(0, 1, 129),
+	MK(1, 1, 129),
+	MK(2, 1, 129),
+	MK(3, 1, 129),
+	MK(4, 1, 129),
+	MK(0, 2, 129),
+	MK(1, 2, 129),
+	MK(2, 2, 129),
+	MK(3, 2, 129),
+	MK(4, 2, 129),
+	MK(0, 3, 129),
+	MK(1, 3, 129),
+	MK(2, 3, 129),
+	MK(3, 3, 129),
+	MK(4, 3, 129),
+	MK(1, 4, 129),
+	MK(2, 4, 129),
+	MK(3, 4, 129),
 	MKEND
 };
 
@@ -867,34 +878,34 @@
 };
 
 static const IndustryTileTable _tile_table_candy_factory_0[] = {
-	MK(0,0, 131),
-	MK(0,1, 132),
-	MK(1,0, 133),
-	MK(1,1, 134),
-	MK(0,2, 131),
-	MK(0,3, 132),
-	MK(1,2, 133),
-	MK(1,3, 134),
-	MK(2,1, 131),
-	MK(2,2, 132),
-	MK(3,1, 133),
-	MK(3,2, 134),
+	MK(0, 0, 131),
+	MK(0, 1, 132),
+	MK(1, 0, 133),
+	MK(1, 1, 134),
+	MK(0, 2, 131),
+	MK(0, 3, 132),
+	MK(1, 2, 133),
+	MK(1, 3, 134),
+	MK(2, 1, 131),
+	MK(2, 2, 132),
+	MK(3, 1, 133),
+	MK(3, 2, 134),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_candy_factory_1[] = {
-	MK(0,0, 131),
-	MK(0,1, 132),
-	MK(1,0, 133),
-	MK(1,1, 134),
-	MK(2,0, 131),
-	MK(2,1, 132),
-	MK(3,0, 133),
-	MK(3,1, 134),
-	MK(1,2, 131),
-	MK(1,3, 132),
-	MK(2,2, 133),
-	MK(2,3, 134),
+	MK(0, 0, 131),
+	MK(0, 1, 132),
+	MK(1, 0, 133),
+	MK(1, 1, 134),
+	MK(2, 0, 131),
+	MK(2, 1, 132),
+	MK(3, 0, 133),
+	MK(3, 1, 134),
+	MK(1, 2, 131),
+	MK(1, 3, 132),
+	MK(2, 2, 133),
+	MK(2, 3, 134),
 	MKEND
 };
 
@@ -904,26 +915,26 @@
 };
 
 static const IndustryTileTable _tile_table_battery_farm_0[] = {
-	MK(0,0, 135),
-	MK(0,1, 135),
-	MK(0,2, 135),
-	MK(0,3, 135),
-	MK(1,0, 135),
-	MK(1,1, 135),
-	MK(1,2, 135),
-	MK(1,3, 135),
-	MK(2,0, 135),
-	MK(2,1, 135),
-	MK(2,2, 135),
-	MK(2,3, 135),
-	MK(3,0, 135),
-	MK(3,1, 135),
-	MK(3,2, 135),
-	MK(3,3, 135),
-	MK(4,0, 135),
-	MK(4,1, 135),
-	MK(4,2, 135),
-	MK(4,3, 135),
+	MK(0, 0, 135),
+	MK(0, 1, 135),
+	MK(0, 2, 135),
+	MK(0, 3, 135),
+	MK(1, 0, 135),
+	MK(1, 1, 135),
+	MK(1, 2, 135),
+	MK(1, 3, 135),
+	MK(2, 0, 135),
+	MK(2, 1, 135),
+	MK(2, 2, 135),
+	MK(2, 3, 135),
+	MK(3, 0, 135),
+	MK(3, 1, 135),
+	MK(3, 2, 135),
+	MK(3, 3, 135),
+	MK(4, 0, 135),
+	MK(4, 1, 135),
+	MK(4, 2, 135),
+	MK(4, 3, 135),
 	MKEND
 };
 
@@ -932,25 +943,25 @@
 };
 
 static const IndustryTileTable _tile_table_cola_wells_0[] = {
-	MK(0,0, 137),
-	MK(0,1, 137),
-	MK(0,2, 137),
-	MK(1,0, 137),
-	MK(1,1, 137),
-	MK(1,2, 137),
-	MK(2,1, 137),
-	MK(2,2, 137),
+	MK(0, 0, 137),
+	MK(0, 1, 137),
+	MK(0, 2, 137),
+	MK(1, 0, 137),
+	MK(1, 1, 137),
+	MK(1, 2, 137),
+	MK(2, 1, 137),
+	MK(2, 2, 137),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_cola_wells_1[] = {
-	MK(0,1, 137),
-	MK(0,2, 137),
-	MK(0,3, 137),
-	MK(1,0, 137),
-	MK(1,1, 137),
-	MK(1,2, 137),
-	MK(2,1, 137),
+	MK(0, 1, 137),
+	MK(0, 2, 137),
+	MK(0, 3, 137),
+	MK(1, 0, 137),
+	MK(1, 1, 137),
+	MK(1, 2, 137),
+	MK(2, 1, 137),
 	MKEND
 };
 
@@ -960,10 +971,10 @@
 };
 
 static const IndustryTileTable _tile_table_toy_shop_0[] = {
-	MK(0,0, 138),
-	MK(0,1, 139),
-	MK(1,0, 140),
-	MK(1,1, 141),
+	MK(0, 0, 138),
+	MK(0, 1, 139),
+	MK(1, 0, 140),
+	MK(1, 1, 141),
 	MKEND
 };
 
@@ -972,14 +983,14 @@
 };
 
 static const IndustryTileTable _tile_table_toy_factory_0[] = {
-	MK(0,0, 147),
-	MK(0,1, 142),
-	MK(1,0, 147),
-	MK(1,1, 143),
-	MK(2,0, 147),
-	MK(2,1, 144),
-	MK(3,0, 146),
-	MK(3,1, 145),
+	MK(0, 0, 147),
+	MK(0, 1, 142),
+	MK(1, 0, 147),
+	MK(1, 1, 143),
+	MK(2, 0, 147),
+	MK(2, 1, 144),
+	MK(3, 0, 146),
+	MK(3, 1, 145),
 	MKEND
 };
 
@@ -988,16 +999,16 @@
 };
 
 static const IndustryTileTable _tile_table_plastic_fountain_0[] = {
-	MK(0,0, 148),
-	MK(0,1, 151),
-	MK(0,2, 154),
+	MK(0, 0, 148),
+	MK(0, 1, 151),
+	MK(0, 2, 154),
 	MKEND
 };
 
 static const IndustryTileTable _tile_table_plastic_fountain_1[] = {
-	MK(0,0, 148),
-	MK(1,0, 151),
-	MK(2,0, 154),
+	MK(0, 0, 148),
+	MK(1, 0, 151),
+	MK(2, 0, 154),
 	MKEND
 };
 
@@ -1007,10 +1018,10 @@
 };
 
 static const IndustryTileTable _tile_table_fizzy_drink_0[] = {
-	MK(0,0, 156),
-	MK(0,1, 157),
-	MK(1,0, 158),
-	MK(1,1, 159),
+	MK(0, 0, 156),
+	MK(0, 1, 157),
+	MK(1, 0, 158),
+	MK(1, 1, 159),
 	MKEND
 };
 
@@ -1019,18 +1030,18 @@
 };
 
 static const IndustryTileTable _tile_table_bubble_generator_0[] = {
-	MK(0,0, 163),
-	MK(0,1, 160),
-	MK(1,0, 163),
-	MK(1,1, 161),
-	MK(2,0, 163),
-	MK(2,1, 162),
-	MK(0,2, 163),
-	MK(0,3, 160),
-	MK(1,2, 163),
-	MK(1,3, 161),
-	MK(2,2, 163),
-	MK(2,3, 162),
+	MK(0, 0, 163),
+	MK(0, 1, 160),
+	MK(1, 0, 163),
+	MK(1, 1, 161),
+	MK(2, 0, 163),
+	MK(2, 1, 162),
+	MK(0, 2, 163),
+	MK(0, 3, 160),
+	MK(1, 2, 163),
+	MK(1, 3, 161),
+	MK(2, 2, 163),
+	MK(2, 3, 162),
 	MKEND
 };
 
@@ -1039,9 +1050,9 @@
 };
 
 static const IndustryTileTable _tile_table_toffee_quarry_0[] = {
-	MK(0,0, 164),
-	MK(1,0, 165),
-	MK(2,0, 166),
+	MK(0, 0, 164),
+	MK(1, 0, 165),
+	MK(2, 0, 166),
 	MKEND
 };
 
@@ -1050,14 +1061,14 @@
 };
 
 static const IndustryTileTable _tile_table_sugar_mine_0[] = {
-	MK(0,0, 167),
-	MK(0,1, 168),
-	MK(1,0, 169),
-	MK(1,1, 170),
-	MK(2,0, 171),
-	MK(2,1, 172),
-	MK(3,0, 173),
-	MK(3,1, 174),
+	MK(0, 0, 167),
+	MK(0, 1, 168),
+	MK(1, 0, 169),
+	MK(1, 1, 170),
+	MK(2, 0, 171),
+	MK(2, 1, 172),
+	MK(3, 0, 173),
+	MK(3, 1, 174),
 	MKEND
 };
 
@@ -1068,659 +1079,706 @@
 #undef MK
 #undef MKEND
 
-/* Procedures that can be run to check whether an industry may
- * build at location the given to the procedure */
-enum CheckProc {
-	CHECK_NOTHING    = 0,
-	CHECK_FOREST     = 1,
-	CHECK_REFINERY   = 2,
-	CHECK_FARM       = 3,
-	CHECK_PLANTATION = 4,
-	CHECK_WATER      = 5,
-	CHECK_LUMBERMILL = 6,
-	CHECK_BUBBLEGEN  = 7,
-	CHECK_OIL_RIG    = 8,
-	CHECK_END,
-};
+/** Array with saw sound, for sawmill */
+static const uint8 _sawmill_sounds[] = { SND_28_SAWMILL };
 
-#define MK(tbl, d, c1, c2, c3, proc, p1, r1, p2, r2, m, a1, a2, a3, pr, clim, in, intx, s1, s2, s3) \
-	{tbl, lengthof(tbl), d, {c1, c2, c3}, proc, {p1, p2}, {r1, r2}, m,            \
-	 {a1, a2, a3}, pr, clim, in, intx, s1, s2, s3}
+/** Array with whistle sound, for factory */
+static const uint8 _factory_sounds[] = { SND_03_FACTORY_WHISTLE };
 
-static const IndustrySpec _industry_specs[] = {
+/** Array with 3 animal sounds, for farms */
+static const uint8 _farm_sounds[] = { SND_24_SHEEP, SND_25_COW, SND_26_HORSE };
+
+/** Array with... hem... a sound of toyland */
+static const uint8 _plastic_mine_sounds[] = { SND_33_PLASTIC_MINE };
+
+/**
+ * Writes the properties of an industry into the IndustrySpec struct.
+ * @param tbl  tile table
+ * @param sndc number of sounds
+ * @param snd  sounds table
+ * @param d    cost multiplier
+ * @param ai1  appear chance ingame - temperate
+ * @param ai2  appear chance ingame - arctic
+ * @param ai3  appear chance ingame - tropic
+ * @param ai4  appear chance ingame - toyland
+ * @param ag1  appear chance random creation - temperate
+ * @param ag2  appear chance random creation - arctic
+ * @param ag3  appear chance random creation - tropic
+ * @param ag4  appear chance random creation - toyland
+ * @param col  map colour
+ * @param c1   industry proximity refusal - 1st
+ * @param c2   industry proximity refusal - 2nd
+ * @param c3   industry proximity refusal - 3th
+ * @param proc check procedure index
+ * @param p1   produce cargo 1
+ * @param r1   rate of production 1
+ * @param p2   produce cargo 2
+ * @param r2   rate of production 1
+ * @param m    minimum cargo moved to station
+ * @param a1   accepted cargo 1
+ * @param im1  input multiplier for cargo 1
+ * @param a2   accepted cargo 2
+ * @param im2  input multiplier for cargo 2
+ * @param a3   accepted cargo 3
+ * @param im3  input multiplier for cargo 3
+ * @param pr   industry life (actually, the same as extractive, organic, processing in ttdpatch's specs)
+ * @param clim climate availaility
+ * @param bev  industry behaviour
+ * @param in   name
+ * @param intx text while building
+ * @param s1   text for closure
+ * @param s2   text for production up
+ * @param s3   text for production down
+ */
+
+#define MI(tbl, sndc, snd, d, ai1, ai2, ai3, ai4, ag1, ag2, ag3, ag4, col, \
+           c1, c2, c3, proc, p1, r1, p2, r2, m, a1, im1, a2, im2, a3, im3, pr, clim, bev, in, intx, s1, s2, s3) \
+	 {tbl, lengthof(tbl), d, {c1, c2, c3}, proc, {p1, p2}, {r1, r2}, m,            \
+	 {a1, a2, a3}, {{im1, 0}, {im2, 0}, {im3, 0}}, pr, clim, bev, col, in, intx, s1, s2, s3, {ai1, ai2, ai3, ai4}, {ag1, ag2, ag3, ag4}, \
+	 sndc, snd, 0, 0, true, {0, 0, NULL, NULL, INVALID_INDUSTRYTYPE}}
 	/* Format:
-	   tile table                              cost multiplier
+	   tile table                              count and sounds table
+	   cost multiplier                         appear chances(4ingame, 4random)  map colour
 	   cannot be close to these industries (3 times)             check proc
 	   (produced cargo + rate) (twice)         minimum cargo moved to station
-	   3 accepted cargo
+	   3 accepted cargo and their corresponding input multiplier
 	   industry life                           climate availability
+	   industry behaviours
 	   industry name                           building text
 	   messages : Closure                      production up                      production down   */
-	MK(_tile_table_coal_mine,                  210,
+static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = {
+	MI(_tile_table_coal_mine,                  0, NULL,
+	   210,                                    2, 3, 0, 0,    8, 8, 0, 0,        215,
 	   IT_POWER_STATION,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_COAL,       15, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TEMPERATE | 1 << LT_ARCTIC,
+	   INDUSTRYBEH_CAN_SUBSIDENCE,
 	   STR_4802_COAL_MINE,                     STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4836_NEW_COAL_SEAM_FOUND_AT,   STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_power_station,              30,
+	MI(_tile_table_power_station,              0, NULL,
+	   30,                                     2, 2, 0, 0,    5, 5, 0, 0,        184,
 	   IT_COAL_MINE,      IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_COAL,           CT_INVALID,          CT_INVALID,
+	   CT_COAL,        0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_NOT_CLOSABLE,              1 << LT_TEMPERATE | 1 << LT_ARCTIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4803_POWER_STATION,                 STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_sawmill,                    28,
+	MI(_tile_table_sawmill,                    1, _sawmill_sounds,
+	   28,                                     2, 0, 0, 0,    5, 0, 0, 0,        194,
 	   IT_FOREST,         IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_WOOD,           CT_INVALID,          CT_INVALID,
+	   CT_WOOD,      256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TEMPERATE,
+	   INDUSTRYBEH_NONE,
 	   STR_4804_SAWMILL,                       STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_forest,                     200,
+	MI(_tile_table_forest,                     0, NULL,
+	   200,                                    3, 4, 0, 0,    5, 5, 0, 0,         86,
 	   IT_SAWMILL,        IT_PAPER_MILL,       IT_INVALID,       CHECK_FOREST,
 	   CT_WOOD,       13, CT_INVALID,       0, 30,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TEMPERATE | 1 << LT_ARCTIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4805_FOREST,                        STR_482E_NEW_BEING_PLANTED_NEAR,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_483A_INSECT_INFESTATION_CAUSES),
 
-	MK(_tile_table_oil_refinery,               31,
+	MI(_tile_table_oil_refinery,               0, NULL,
+	   31,                                     2, 2, 2, 0,    4, 4, 4, 0,        191,
 	   IT_OIL_RIG,        IT_INVALID,          IT_INVALID,       CHECK_REFINERY,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_OIL,            CT_INVALID,          CT_INVALID,
+	   CT_OIL,       256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TEMPERATE | 1 << LT_ARCTIC | 1 << LT_TROPIC,
+	   INDUSTRYBEH_AIRPLANE_ATTACKS,
 	   STR_4806_OIL_REFINERY,                  STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_oil_rig,                    240,
+	MI(_tile_table_oil_rig,                    0, NULL,
+	   240,                                    6, 0, 0, 0,    0, 0, 0, 0,        152,
 	   IT_OIL_REFINERY,   IT_INVALID,          IT_INVALID,       CHECK_OIL_RIG,
 	   CT_OIL,        15, CT_PASSENGERS,    2, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TEMPERATE,
+	   INDUSTRYBEH_BUILT_ONWATER | INDUSTRYBEH_AFTER_1960 | INDUSTRYBEH_AI_AIRSHIP_ROUTES,
 	   STR_4807_OIL_RIG,                       STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4837_NEW_OIL_RESERVES_FOUND,   STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_factory,                    26,
+	MI(_tile_table_factory,                    1, _factory_sounds,
+	   26,                                     2, 0, 0, 0,    5, 0, 0, 0,        174,
 	   IT_FARM,           IT_STEEL_MILL,       IT_INVALID,       CHECK_NOTHING,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_LIVESTOCK,      CT_GRAIN,            CT_STEEL,
+	   CT_LIVESTOCK, 256, CT_GRAIN ,      256, CT_STEEL,    256,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TEMPERATE,
+	   INDUSTRYBEH_CHOPPER_ATTACKS,
 	   STR_4808_FACTORY,                       STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_printing_works,             26,
+	MI(_tile_table_printing_works,             1, _factory_sounds,
+	   26,                                     0, 2, 0, 0,    0, 5, 0, 0,        174,
 	   IT_PAPER_MILL,     IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_PAPER,          CT_INVALID,          CT_INVALID,
+	   CT_PAPER,     256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_ARCTIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4809_PRINTING_WORKS,                STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_steel_mill,                 27,
+	MI(_tile_table_steel_mill,                 0, NULL,
+	   27,                                     2, 0, 0, 0,    5, 0, 0, 0,         10,
 	   IT_IRON_MINE,      IT_FACTORY,          IT_INVALID,       CHECK_NOTHING,
 	   CT_STEEL,       0, CT_INVALID,       0, 5,
-	   CT_IRON_ORE,       CT_INVALID,          CT_INVALID,
+	   CT_IRON_ORE,  256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TEMPERATE,
+	   INDUSTRYBEH_NONE,
 	   STR_480A_STEEL_MILL,                    STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_farm,                       250,
+	MI(_tile_table_farm,                       3, _farm_sounds,
+	   250,                                    2, 4, 0, 0,    9, 9, 0, 0,         48,
 	   IT_FACTORY,        IT_FOOD_PROCESS,     IT_INVALID,       CHECK_FARM,
 	   CT_GRAIN,      10, CT_LIVESTOCK,    10, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TEMPERATE | 1 << LT_ARCTIC,
+	   INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT,
 	   STR_480B_FARM,                          STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4838_IMPROVED_FARMING_METHODS, STR_483A_INSECT_INFESTATION_CAUSES),
 
-	MK(_tile_table_copper_mine,                205,
+	MI(_tile_table_copper_mine,                0, NULL,
+	   205,                                    0, 0, 3, 0,    0, 0, 4, 0,         10,
 	   IT_FACTORY_2,      IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_COPPER_ORE, 10, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TROPIC,
+	   INDUSTRYBEH_NONE,
 	   STR_480C_COPPER_ORE_MINE,               STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_oil_well,                   220,
+	MI(_tile_table_oil_well,                   0, NULL,               220,              0, 5, 3, 0,    4, 5, 5, 0,        152,
 	   IT_OIL_REFINERY,   IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_OIL,        12, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TEMPERATE | 1 << LT_ARCTIC | 1 << LT_TROPIC,
+	   INDUSTRYBEH_DONT_INCR_PROD | INDUSTRYBEH_BEFORE_1950,
 	   STR_480D_OIL_WELLS,                     STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4837_NEW_OIL_RESERVES_FOUND,   STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_bank,                       193,
+	MI(_tile_table_bank,                       0, NULL,
+	   193,                                    7, 0, 0, 0,    0, 0, 0, 0,         15,
 	   IT_BANK_TEMP,      IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_VALUABLES,   6, CT_INVALID,       0, 5,
-	   CT_VALUABLES,      CT_INVALID,          CT_INVALID,
+	   CT_VALUABLES,   0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_NOT_CLOSABLE,              1 << LT_TEMPERATE,
+	   INDUSTRYBEH_TOWN1200_MORE | INDUSTRYBEH_ONLY_INTOWN,
 	   STR_480E_BANK,                          STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_food_process,               26,
+	MI(_tile_table_food_process,               0, NULL,
+	   26,                                     0, 2, 2, 0,    0, 3, 4, 0,         55,
 	   IT_FRUIT_PLANTATION, IT_FARM,           IT_FARM_2,        CHECK_NOTHING,
 	   CT_FOOD,        0, CT_INVALID,       0, 5,
-	   CT_FRUIT,          CT_MAIZE,            CT_INVALID,
+	   CT_FRUIT,     256, CT_MAIZE,       256, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_ARCTIC | 1 << LT_TROPIC,
+	   INDUSTRYBEH_NONE,
 	   STR_480F_FOOD_PROCESSING_PLANT,         STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_paper_mill,                 28,
+	MI(_tile_table_paper_mill,                 1, _sawmill_sounds,
+	   28,                                     0, 2, 0, 0,    0, 5, 0, 0,         10,
 	   IT_FOREST,         IT_PRINTING_WORKS,   IT_INVALID,       CHECK_NOTHING,
 	   CT_PAPER,       0, CT_INVALID,       0, 5,
-	   CT_WOOD,           CT_INVALID,          CT_INVALID,
+	   CT_WOOD,      256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_ARCTIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4810_PAPER_MILL,                    STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_gold_mine,                  208,
+	MI(_tile_table_gold_mine,                  0, NULL,
+	   208,                                    0, 3, 0, 0,    0, 4, 0, 0,        194,
 	   IT_BANK_TROPIC_ARCTIC, IT_INVALID,      IT_INVALID,       CHECK_NOTHING,
 	   CT_GOLD,        7, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
-	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TROPIC,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
+	   INDUSTRYLIFE_PRODUCTION,                1 << LT_ARCTIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4811_GOLD_MINE,                     STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_bank2,                      19,
+	MI(_tile_table_bank2,                      0, NULL,
+	   19,                                     0, 3, 3, 0,    0, 6, 5, 0,         15,
 	   IT_GOLD_MINE,      IT_DIAMOND_MINE,     IT_INVALID,       CHECK_NOTHING,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_GOLD,           CT_INVALID,          CT_INVALID,
+	   CT_GOLD,      256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_NOT_CLOSABLE,              1 << LT_ARCTIC | 1 << LT_TROPIC,
+	   INDUSTRYBEH_ONLY_INTOWN,
 	   STR_4812_BANK,                          STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_diamond_mine,               213,
+	MI(_tile_table_diamond_mine,               0, NULL,
+	   213,                                    0, 0, 3, 0,    0, 0, 4, 0,        184,
 	   IT_BANK_TROPIC_ARCTIC, IT_INVALID,      IT_INVALID,       CHECK_NOTHING,
 	   CT_DIAMONDS,    7, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TROPIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4813_DIAMOND_MINE,                  STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_iron_mine,                  220,
+	MI(_tile_table_iron_mine,                  0, NULL,
+	   220,                                    2, 0, 0, 0,    5, 0, 0, 0,         55,
 	   IT_STEEL_MILL,     IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_IRON_ORE,   10, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TEMPERATE,
+	   INDUSTRYBEH_NONE,
 	   STR_4814_IRON_ORE_MINE,                 STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_fruit_plantation,           225,
+	MI(_tile_table_fruit_plantation,           0, NULL,
+	   225,                                    0, 0, 2, 0,    0, 0, 4, 0,         86,
 	   IT_FOOD_PROCESS,   IT_INVALID,          IT_INVALID,       CHECK_PLANTATION,
 	   CT_FRUIT,      10, CT_INVALID,       0, 15,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TROPIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4815_FRUIT_PLANTATION,              STR_482E_NEW_BEING_PLANTED_NEAR,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4838_IMPROVED_FARMING_METHODS, STR_483A_INSECT_INFESTATION_CAUSES),
 
-	MK(_tile_table_rubber_plantation,          218,
+	MI(_tile_table_rubber_plantation,          0, NULL,
+	   218,                                    0, 0, 3, 0,    0, 0, 4, 0,         39,
 	   IT_FACTORY_2,      IT_INVALID,          IT_INVALID,       CHECK_PLANTATION,
 	   CT_RUBBER,     10, CT_INVALID,       0, 15,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TROPIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4816_RUBBER_PLANTATION,             STR_482E_NEW_BEING_PLANTED_NEAR,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4838_IMPROVED_FARMING_METHODS, STR_483A_INSECT_INFESTATION_CAUSES),
 
-	MK(_tile_table_water_supply,               199,
+	MI(_tile_table_water_supply,               0, NULL,
+	   199,                                    0, 0, 3, 0,    0, 0, 4, 0,         37,
 	   IT_WATER_TOWER,    IT_INVALID,          IT_INVALID,       CHECK_WATER,
 	   CT_WATER,      12, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TROPIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4817_WATER_SUPPLY,                  STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_water_tower,                14,
+	MI(_tile_table_water_tower,                0, NULL,
+	   14,                                     0, 0, 4, 0,    0, 0, 8, 0,        208,
 	   IT_WATER_SUPPLY,   IT_INVALID,          IT_INVALID,       CHECK_WATER,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_WATER,          CT_INVALID,          CT_INVALID,
+	   CT_WATER,     256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_NOT_CLOSABLE,              1 << LT_TROPIC,
+	   INDUSTRYBEH_ONLY_INTOWN,
 	   STR_4818_WATER_TOWER,                   STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_factory2,                   26,
+	MI(_tile_table_factory2,                   1, _factory_sounds,
+	   26,                                     0, 0, 2, 0,    0, 0, 4, 0,        174,
 	   IT_RUBBER_PLANTATION, IT_COPPER_MINE,   IT_LUMBER_MILL,   CHECK_PLANTATION,
 	   CT_GOODS,       0, CT_INVALID,       0, 5,
-	   CT_RUBBER,         CT_COPPER_ORE,       CT_WOOD,
+	   CT_RUBBER,    256, CT_COPPER_ORE,  256, CT_WOOD,      256,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TROPIC,
+	   INDUSTRYBEH_NONE,
 	   STR_4819_FACTORY,                       STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_farm2,                      250,
+	MI(_tile_table_farm2,                      0, NULL,
+	   250,                                    0, 0, 1, 0,    0, 0, 2, 0,         48,
 	   IT_FOOD_PROCESS,   IT_INVALID,          IT_INVALID,       CHECK_PLANTATION,
 	   CT_MAIZE,      11, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TROPIC,
+	   INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT,
 	   STR_481A_FARM,                          STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4838_IMPROVED_FARMING_METHODS, STR_483A_INSECT_INFESTATION_CAUSES),
 
-	MK(_tile_table_lumber_mill,                17,
+	MI(_tile_table_lumber_mill,                0, NULL,
+	   17,                                     0, 0, 0, 0,    0, 0, 0, 0,        194,
 	   IT_FACTORY_2,      IT_INVALID,          IT_INVALID,       CHECK_LUMBERMILL,
 	   CT_WOOD,        0, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TROPIC,
+	   INDUSTRYBEH_CUT_TREES,
 	   STR_481B_LUMBER_MILL,                   STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4834_LACK_OF_NEARBY_TREES_CAUSES,   STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_cotton_candy,               195,
+	MI(_tile_table_cotton_candy,               0, NULL,
+	   195,                                    0, 0, 0, 3,    0, 0, 0, 5,         48,
 	   IT_CANDY_FACTORY,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_COTTON_CANDY, 13, CT_INVALID,    0, 30,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_481C_COTTON_CANDY_FOREST,           STR_482E_NEW_BEING_PLANTED_NEAR,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4838_IMPROVED_FARMING_METHODS, STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_candy_factory,              26,
+	MI(_tile_table_candy_factory,              0, NULL,
+	   26,                                     0, 0, 0, 3,    0, 0, 0, 5,        174,
 	   IT_COTTON_CANDY,   IT_TOFFEE_QUARRY,    IT_SUGAR_MINE,    CHECK_NOTHING,
 	   CT_CANDY,       0, CT_INVALID,       0, 5,
-	   CT_SUGAR,          CT_TOFFEE,           CT_COTTON_CANDY,
+	   CT_SUGAR,     256, CT_TOFFEE,      256, CT_COTTON_CANDY, 256,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_481D_CANDY_FACTORY,                 STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_battery_farm,               187,
+	MI(_tile_table_battery_farm,               0, NULL,
+	   187,                                    0, 0, 0, 3,    0, 0, 0, 4,         39,
 	   IT_TOY_FACTORY,    IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_BATTERIES,  11, CT_INVALID,      0, 30,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_481E_BATTERY_FARM,                  STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4838_IMPROVED_FARMING_METHODS, STR_483A_INSECT_INFESTATION_CAUSES),
 
-	MK(_tile_table_cola_wells,                 193,
+	MI(_tile_table_cola_wells,                 0, NULL,
+	   193,                                    0, 0, 0, 3,    0, 0, 0, 5,         55,
 	   IT_FIZZY_DRINK_FACTORY, IT_INVALID,     IT_INVALID,       CHECK_NOTHING,
 	   CT_COLA,       12, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_481F_COLA_WELLS,                    STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_toy_shop,                   17,
+	MI(_tile_table_toy_shop,                   0, NULL,
+	   17,                                     0, 0, 0, 3,    0, 0, 0, 4,        208,
 	   IT_TOY_FACTORY,    IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_INVALID,     0, CT_INVALID,       0, 5,
-	   CT_TOYS,           CT_INVALID,          CT_INVALID,
+	   CT_TOYS,      256, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_NOT_CLOSABLE,              1 << LT_TOYLAND,
+	   INDUSTRYBEH_ONLY_NEARTOWN,
 	   STR_4820_TOY_SHOP,                      STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_toy_factory,                20,
+	MI(_tile_table_toy_factory,                0, NULL,
+	   20,                                     0, 0, 0, 3,    0, 0, 0, 5,          10,
 	   IT_PLASTIC_FOUNTAINS, IT_BATTERY_FARM,  IT_TOY_SHOP,     CHECK_NOTHING,
 	   CT_TOYS,        0, CT_INVALID,       0, 5,
-	   CT_PLASTIC,        CT_BATTERIES,        CT_INVALID,
+	   CT_PLASTIC,   256, CT_BATTERIES,   256, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_4821_TOY_FACTORY,                   STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_plastic_fountain,           192,
+	MI(_tile_table_plastic_fountain,           1, _plastic_mine_sounds,
+	   192,                                    0, 0, 0, 3,    0, 0, 0, 5,         37,
 	   IT_TOY_FACTORY,    IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_PLASTIC,    14, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_4822_PLASTIC_FOUNTAINS,             STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_fizzy_drink,                22,
-	   IT_COLA_WELLS,     IT_BUBBLE_GENERATOR, IT_INVALID,     CHECK_NOTHING,
+	MI(_tile_table_fizzy_drink,                0, NULL,
+	   22,                                     0, 0, 0, 3,    0, 0, 0, 4,        184,
+	   IT_COLA_WELLS,     IT_BUBBLE_GENERATOR, IT_INVALID,       CHECK_NOTHING,
 	   CT_FIZZY_DRINKS, 0, CT_INVALID,      0, 5,
-	   CT_COLA,           CT_BUBBLES,          CT_INVALID,
+	   CT_COLA,       256, CT_BUBBLES,    256, CT_INVALID,     0,
 	   INDUSTRYLIFE_CLOSABLE,                  1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_4823_FIZZY_DRINK_FACTORY,           STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4833_SUPPLY_PROBLEMS_CAUSE_TO,      STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_bubble_generator,           203,
+	MI(_tile_table_bubble_generator,           0, NULL,
+	   203,                                    0, 0, 0, 3,    0, 0, 0, 5,        152,
 	   IT_FIZZY_DRINK_FACTORY, IT_INVALID,     IT_INVALID,       CHECK_BUBBLEGEN,
 	   CT_BUBBLES,    13, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_4824_BUBBLE_GENERATOR,              STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_toffee_quarry,              213,
+	MI(_tile_table_toffee_quarry,              0, NULL,
+	   213,                                    0, 0, 0, 3,    0, 0, 0, 5,        194,
 	   IT_CANDY_FACTORY,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_TOFFEE,     10, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_4825_TOFFEE_QUARRY,                 STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 
-	MK(_tile_table_sugar_mine,                 210,
+	MI(_tile_table_sugar_mine,                 0, NULL,
+	   210,                                    0, 0, 0, 2,    0, 0, 0, 4,         15,
 	   IT_CANDY_FACTORY,  IT_INVALID,          IT_INVALID,       CHECK_NOTHING,
 	   CT_SUGAR,      11, CT_INVALID,       0, 5,
-	   CT_INVALID,        CT_INVALID,          CT_INVALID,
+	   CT_INVALID,     0, CT_INVALID,       0, CT_INVALID,     0,
 	   INDUSTRYLIFE_PRODUCTION,                1 << LT_TOYLAND,
+	   INDUSTRYBEH_NONE,
 	   STR_4826_SUGAR_MINE,                    STR_482D_NEW_UNDER_CONSTRUCTION,
 	   STR_4832_ANNOUNCES_IMMINENT_CLOSURE,    STR_4835_INCREASES_PRODUCTION,     STR_4839_PRODUCTION_DOWN_BY_50),
 };
-#undef MK
-
-
-static const byte _industry_create_table_0[] = {
-	4, 4,
-	5, 3,
-	5, 2,
-	8, 0,
-	5, 1,
-	4, 11,
-	5, 18,
-	9, 9,
-	5, 8,
-	5, 6,
-	0
-};
-
-static const byte _industry_create_table_1[] = {
-	4, 4,
-	5, 3,
-	5, 14,
-	8, 0,
-	5, 1,
-	5, 11,
-	5, 13,
-	9, 9,
-	4, 15,
-	5, 7,
-	6, 16,
-	0
-};
+#undef MI
 
-static const byte _industry_create_table_2[] = {
-	4, 4,
-	5, 11,
-	5, 16,
-	4, 13,
-	4, 17,
-	4, 10,
-	4, 19,
-	4, 20,
-	4, 21,
-	8, 22,
-	4, 13,
-	4, 23,
-	2, 24,
-	0
-};
-
-static const byte _industry_create_table_3[] = {
-	5, 26,
-	5, 27,
-	4, 28,
-	5, 29,
-	4, 30,
-	5, 31,
-	5, 32,
-	4, 33,
-	5, 34,
-	5, 35,
-	4, 36,
-	0
-};
-
-static const byte * const _industry_create_table[4] = {
-	_industry_create_table_0,
-	_industry_create_table_1,
-	_industry_create_table_2,
-	_industry_create_table_3,
-};
-
-/** Writes the properties of a industry tile into the IndustryTileSpec struct.
- * @param c1 first type of cargo accepted for this tile
- * @param c2 second cargo
- * @param c3 and third cargo. Those three are in an array
- * @param s1 slope refused upon choosing a place to build
- * @param a1 animation frame on production
- * @param a2 next frame of animation
- * @param a3 chosses between animation of construction state
+/** Writes the properties of an industry tile into the IndustryTileSpec struct.
+ * @param ca1 acceptance of first cargo
+ * @param c1  first type of cargo accepted for this tile
+ * @param ca2 acceptance of second cargo
+ * @param c2  second cargo
+ * @param ca3 acceptance of third cargo
+ * @param c3  and third cargo. Those three are in an array
+ * @param s1  slope refused upon choosing a place to build
+ * @param a1  animation frame on production
+ * @param a2  next frame of animation
+ * @param a3  chooses between animation or construction state
  */
-#define MK(c1, c2, c3, sl, a1, a2, a3) {{c1, c2, c3}, sl, a1, a2, a3}
-static const IndustryTileSpec _industry_tile_specs[] = {
+#define MT(ca1, c1, ca2, c2, ca3, c3, sl, a1, a2, a3) {{c1, c2, c3}, {ca1, ca2, ca3}, sl, a1, a2, a3, 0, true, {0, 0, NULL, NULL, 0}}
+static const IndustryTileSpec _origin_industry_tile_specs[NEW_INDUSTRYTILEOFFSET] = {
 	/* Coal Mine */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  true),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Power Station */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_COAL,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_COAL,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Sawmill */
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Forest Artic, temperate */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,               17,  INDUTILE_NOANIM,   false), // Chopping forest
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,               16,   false), // Growing forest
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,                   17,  INDUSTRYTILE_NOANIM,   false), ///< Chopping forest
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,                   16,   false), ///< Growing forest
 
 	/* Oil refinery */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_OIL,        SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_OIL,        SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* oil Rig */
-	MK(CT_INVALID,      CT_INVALID,   CT_PASSENGERS, SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_MAIL,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PASSENGERS, SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_MAIL,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Oil Wells artic, temperate */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  true ),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  true ),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  true ),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
 
 	/* Farm tropic, arctic and temperate */
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Factory temperate */
-	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_GRAIN,        CT_STEEL,     CT_LIVESTOCK,  SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_GRAIN,        8,  CT_STEEL,     8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Printing works */
-	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_PAPER,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_PAPER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Copper ore mine */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  true ),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Steel mill */
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_IRON_ORE,   SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_IRON_ORE,   SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Bank temperate*/
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_VALUABLES,  SLOPE_E,      INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_PASSENGERS,   CT_INVALID,   CT_VALUABLES,  SLOPE_S,      INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_VALUABLES,  SLOPE_E,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(1,  CT_PASSENGERS,   0,  CT_INVALID,   8,  CT_VALUABLES,  SLOPE_S,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* 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,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_MAIZE,        CT_INVALID,   CT_LIVESTOCK,  SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_MAIZE,        CT_INVALID,   CT_LIVESTOCK,  SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_MAIZE,        CT_INVALID,   CT_LIVESTOCK,  SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_MAIZE,        0,  CT_INVALID,   8,  CT_LIVESTOCK,  SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Paper mill */
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_WOOD,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WOOD,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Gold mine */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  true ),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  true ),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Bank Sub Arctic */
-	MK(CT_INVALID,      CT_INVALID,   CT_GOLD,       SLOPE_E,      INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_GOLD,       SLOPE_S,      INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_GOLD,       SLOPE_E,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_GOLD,       SLOPE_S,      INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Diamond mine */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Iron ore Mine */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Fruit plantation */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Rubber plantation */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Water supply */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Water tower */
-	MK(CT_INVALID,      CT_INVALID,   CT_WATER,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_WATER,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Factory (sub-tropical) */
-	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_COPPER_ORE,   CT_WOOD,      CT_RUBBER,     SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_COPPER_ORE,   8,  CT_WOOD,      8,  CT_RUBBER,     SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Lumber mill */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Candyfloss forest */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,              130,   INDUTILE_NOANIM,  false), // Chopping candyfloss
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,               129,  false), // Growing candyfloss
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,                  130,   INDUSTRYTILE_NOANIM,  false), ///< Chopping candyfloss
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,                   129,  false), ///< Growing candyfloss
 
 	/* Sweet factory */
-	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_COTTON_CANDY, CT_TOFFEE,    CT_SUGAR,      SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_COTTON_CANDY, 8,  CT_TOFFEE,    8,  CT_SUGAR,      SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Batter farm */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,              136,   INDUTILE_NOANIM,  false), // Reaping batteries
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,               135,  false), // Growing batteries
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,                  136,   INDUSTRYTILE_NOANIM,  false), ///< Reaping batteries
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,                   135,  false), ///< Growing batteries
 
 	/* Cola wells */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Toy shop */
-	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_TOYS,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   8,  CT_TOYS,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Toy factory */
-	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BATTERIES,    CT_INVALID,   CT_PLASTIC,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BATTERIES,    0,  CT_INVALID,   8,  CT_PLASTIC,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Plastic Fountain */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Fizzy drink factory */
-	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_BUBBLES,      CT_INVALID,   CT_COLA,       SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(8,  CT_BUBBLES,      0,  CT_INVALID,   8,  CT_COLA,       SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Bubble generator */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Toffee quarry */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 
 	/* Sugar mine */
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
-	MK(CT_INVALID,      CT_INVALID,   CT_INVALID,    SLOPE_STEEP,  INDUTILE_NOANIM,   INDUTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
+	MT(0,  CT_INVALID,      0,  CT_INVALID,   0,  CT_INVALID,    SLOPE_STEEP,  INDUSTRYTILE_NOANIM,   INDUSTRYTILE_NOANIM,  false),
 };
-#undef MK
+#undef MT
 
 #endif  /* BUILD_INDUSTRY_H */
--- a/src/table/cargo_const.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/cargo_const.h	Sat Jun 02 19:59:29 2007 +0000
@@ -17,10 +17,16 @@
 		STR_0011_MAIL,           STR_0031_MAIL,           STR_BAGS,       STR_QUANTITY_MAIL,         STR_ABBREV_MAIL,
 		SPR_CARGO_MAIL,          CC_MAIL        ),
 
+	/* Oil in temperate and arctic */
 	MK(  3, 'OIL_', 174, 16, 4437, 25, 255, true,  TE_NONE,
 		STR_0012_OIL,            STR_0032_OIL,            STR_LITERS,     STR_QUANTITY_OIL,          STR_ABBREV_OIL,
 		SPR_CARGO_OIL,           CC_LIQUID      ),
 
+	/* Oil in subtropic */
+	MK(  3, 'OIL_', 174, 16, 4892, 25, 255, true,  TE_NONE,
+		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,  TE_NONE,
 		STR_0013_LIVESTOCK,      STR_0033_LIVESTOCK,      STR_ITEMS,      STR_QUANTITY_LIVESTOCK,    STR_ABBREV_LIVESTOCK,
 		SPR_CARGO_LIVESTOCK,     CC_PIECE_GOODS ),
@@ -37,14 +43,20 @@
 		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,  TE_NONE,
+	MK(  6, 'MAIZ', 191,  6, 4322,  4,  40, true,  TE_NONE,
 		STR_001B_MAIZE,          STR_003B_MAIZE,          STR_TONS,       STR_QUANTITY_MAIZE,        STR_ABBREV_MAIZE,
 		SPR_CARGO_GRAIN,         CC_BULK        ),
 
+	/* Wood in temperate and arctic */
 	MK(  7, 'WOOD',  84, 16, 5005, 15, 255, true,  TE_NONE,
 		STR_0016_WOOD,           STR_0036_WOOD,           STR_TONS,       STR_QUANTITY_WOOD,         STR_ABBREV_WOOD,
 		SPR_CARGO_WOOD,          CC_PIECE_GOODS ),
 
+	/* Wood in subtropic */
+	MK(  7, 'WOOD',  84, 16, 7964, 15, 255, true,  TE_NONE,
+		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,  TE_NONE,
 		STR_0017_IRON_ORE,       STR_0037_IRON_ORE,       STR_TONS,       STR_QUANTITY_IRON_ORE,     STR_ABBREV_IRON_ORE,
 		SPR_CARGO_IRON_ORE,      CC_BULK        ),
@@ -57,15 +69,15 @@
 		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,  TE_NONE,
+	MK( 10, 'GOLD', 202,  8, 5802, 10,  40, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 10, 'DIAM', 202,  2, 5802, 10, 255, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 11, 'PAPR',  10, 16, 5461,  7,  60, true,  TE_NONE,
 		STR_001F_PAPER,          STR_003F_PAPER,          STR_TONS,       STR_QUANTITY_PAPER,        STR_ABBREV_PAPER,
 		SPR_CARGO_PAPER,         CC_PIECE_GOODS ),
 
@@ -73,27 +85,27 @@
 		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,  TE_NONE,
+	MK( 13, 'FRUT', 208,  6, 4209,  0,  15, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 14, 'CORE', 184,  6, 4892, 12, 255, true,  TE_NONE,
 		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,  TE_WATER,
+	MK( 15, 'WATR',  10,  6, 4664, 20,  80, true,  TE_WATER,
 		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,  TE_NONE,
+	MK( 16, 'RUBR',  32,  6, 4437,  2,  20, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 17, 'SUGR',  32, 16, 4437, 20, 255, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 18, 'TOYS', 174,  2, 5574, 25, 255, true,  TE_NONE,
 		STR_0025_TOYS,           STR_0045_TOY,            STR_NOTHING,    STR_QUANTITY_TOYS,         STR_ABBREV_TOYS,
 		SPR_CARGO_TOYS,          CC_PIECE_GOODS ),
 
@@ -109,23 +121,23 @@
 		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,  TE_NONE,
+	MK( 22, 'COLA',  84, 16, 4892,  5,  75, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 23, 'CTCD', 184, 16, 5005, 10,  25, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 24, 'BUBL',  10,  1, 5077, 20,  80, true,  TE_NONE,
 		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,  TE_NONE,
+	MK( 25, 'PLST', 202, 16, 4664, 30, 255, true,  TE_NONE,
 		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,  TE_FOOD,
+	MK( 26, 'FZDR',  48,  2, 6250, 30,  50, true,  TE_FOOD,
 		STR_002D_FIZZY_DRINKS,   STR_004D_FIZZY_DRINK,    STR_NOTHING,    STR_QUANTITY_FIZZY_DRINKS, STR_ABBREV_FIZZY_DRINKS,
 		SPR_CARGO_FIZZYDRINK,    CC_PIECE_GOODS ),
 
@@ -136,7 +148,7 @@
 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', 'RUBR', 'MAIL',      4, 'FRUT', 'GOOD', 'MAIZ',     11, 'CORE', 'WATR', 'DIAM', 'FOOD', },
 	{ 'PASS', 'SUGR', 'MAIL', 'TOYS', 'BATT', 'SWET', 'TOFF', 'COLA', 'CTCD', 'BUBL', 'PLST', 'FZDR', },
 };
 
--- a/src/table/control_codes.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/control_codes.h	Sat Jun 02 19:59:29 2007 +0000
@@ -26,6 +26,7 @@
 	SCC_WAYPOINT_NAME,
 	SCC_STATION_NAME,
 	SCC_TOWN_NAME,
+	SCC_GROUP_NAME,
 
 	SCC_CURRENCY_COMPACT,
 	SCC_CURRENCY_COMPACT_64,
--- a/src/table/engines.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/engines.h	Sat Jun 02 19:59:29 2007 +0000
@@ -12,29 +12,47 @@
 /** Writes the properties of a train or road vehicle into the EngineInfo struct.
  * @see EngineInfo
  * @param a Introduction date
+ * @param b unk2, flag for carriage(bit 7) and decay speed(bits0..6)
+ * @param c life length
+ * @param d base life
  * @param e Bitmask of the climates
- * @note the 5 between d and e is the load amount
- */
-#define MK(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, e, 0, 8, 0, 0 }
-
-/** Writes the properties of a train carriage into the EngineInfo struct.
- * @see MK
  * @note the 0x80 in parameter b sets the "is carriage bit"
  * @note the 5 between d and e is the load amount
  */
-#define MW(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b | 0x80, 5, e, 0, 8, 0, 0 }
+#define MK(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 5, e, 0, 8, 0, 0, 0 }
+
+/** Writes the properties of a train carriage into the EngineInfo struct.
+ * @param a Introduction date
+ * @param b unk2, flag for carriage(bit 7) and decay speed(bits0..6)
+ * @param c life length
+ * @param d base life
+ * @param e Bitmask of the climates
+ * @see MK
+ * @note the 5 between d and e is the load amount
+ */
+#define MW(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b | 0x80, 5, e, 0, 8, 0, 0, 0 }
 
 /** Writes the properties of a ship into the EngineInfo struct.
+ * @param a Introduction date
+ * @param b unk2, flag for carriage(bit 7) and decay speed(bits0..6)
+ * @param c life length
+ * @param d base life
+ * @param e Bitmask of the climates
  * @see MK
  * @note the 10 between d and e is the load amount
  */
-#define MS(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, e, 0, 8, 0, 0 }
+#define MS(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 10, e, 0, 8, 0, 0, 0 }
 
 /** Writes the properties of an aeroplane into the EngineInfo struct.
+ * @param a Introduction date
+ * @param b unk2, flag for carriage(bit 7) and decay speed(bits0..6)
+ * @param c life length
+ * @param d base life
+ * @param e Bitmask of the climates
  * @see MK
  * @note the 20 between d and e is the load amount
  */
-#define MA(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, 0, 8, 0, 0 }
+#define MA(a, b, c, d, e) { DAYS_TILL_ORIGINAL_BASE_YEAR + a, c, d, b, 20, e, 0, 8, 0, 0, 0 }
 
 // Climates
 // T = Temperate
@@ -321,20 +339,25 @@
  * @param e power (hp)
  * @param f weight
  * @param g running_cost_base
- * @param h running_cost_class / engclass
+ * @param h running_cost_class
  * @param i capacity
  * @param j cargo_type
  * @param k ai_rank
  * @param l railtype
+ * @param m engclass
  * Tractive effort coefficient by default is the same as TTDPatch, 0.30*256=76
  */
-#define RVI(a, b, c, d, e, f, g, h, i, j, k, l) { a, b, c, {l}, d, e, f, g, h, h, i, j, k, 0, 0, 0, 0, 76, 0 }
+#define RVI(a, b, c, d, e, f, g, h, i, j, k, l, m) { a, b, c, {l}, d, e, f, g, h, m, i, j, k, 0, 0, 0, 0, 76, 0 }
 #define M RAILVEH_MULTIHEAD
 #define W RAILVEH_WAGON
 #define G RAILVEH_SINGLEHEAD
-#define S 0
-#define D 1
-#define E 2
+#define S EC_STEAM
+#define D EC_DIESEL
+#define E EC_ELECTRIC
+#define N EC_MONORAIL
+#define V EC_MAGLEV
+/* Wagons always have engine type 0, i.e. steam. */
+#define A EC_STEAM
 
 #define R RAILTYPE_RAIL
 #define C RAILTYPE_ELECTRIC
@@ -342,132 +365,134 @@
 #define L RAILTYPE_MAGLEV
 
 const RailVehicleInfo orig_rail_vehicle_info[NUM_TRAIN_ENGINES] = {
-	//   image_index  max_speed (kph)      running_cost_base
-	//   |  flags     |        power (hp)  |  running_cost_class & engclass
-	//   |  |    base_cost     |    weight |  |   capacity
-	//   |  |    |    |        |    |      |  |   |  cargo_type
-	//   |  |    |    |        |    |      |  |   |  |
-	RVI( 2, G,   7,  64,     300,  47,    50, S,  0, 0              ,  1, R), //   0
-	RVI(19, G,   8,  80,     600,  65,    65, D,  0, 0              ,  4, R), //   1
-	RVI( 2, G,  10,  72,     400,  85,    90, S,  0, 0              ,  7, R), //   2
-	RVI( 0, G,  15,  96,     900, 130,   130, S,  0, 0              , 19, R), //   3
-	RVI( 1, G,  19, 112,    1000, 140,   145, S,  0, 0              , 20, R), //   4
-	RVI(12, G,  16, 120,    1400,  95,   125, D,  0, 0              , 30, R), //   5
-	RVI(14, G,  20, 152,    2000, 120,   135, D,  0, 0              , 31, R), //   6
-	RVI( 3, G,  14,  88,    1100, 145,   130, S,  0, 0              , 19, R), //   7
-	RVI( 0, G,  13, 112,    1000, 131,   120, S,  0, 0              , 20, R), //   8
-	RVI( 1, G,  19, 128,    1200, 162,   140, S,  0, 0              , 21, R), //   9
-	RVI( 0, G,  22, 144,    1600, 170,   130, S,  0, 0              , 22, R), //  10
-	RVI( 8, M,  11, 112,   600/2,32/2,  85/2, D, 38, CT_PASSENGERS  , 10, R), //  11
-	RVI(10, M,  14, 120,   700/2,38/2,  70/2, D, 40, CT_PASSENGERS  , 11, R), //  12
-	RVI( 4, G,  15, 128,    1250,  72,    95, D,  0, 0              , 30, R), //  13
-	RVI( 5, G,  17, 144,    1750, 101,   120, D,  0, 0              , 31, R), //  14
-	RVI( 4, G,  18, 160,    2580, 112,   140, D,  0, 0              , 32, R), //  15
-	RVI(14, G,  23,  96,    4000, 150,   135, D,  0, 0              , 33, R), //  16
-	RVI(12, G,  16, 112,    2400, 120,   105, D,  0, 0              , 34, R), //  17
-	RVI(13, G,  30, 112,    6600, 207,   155, D,  0, 0              , 35, R), //  18
-	RVI(15, G,  18, 104,    1500, 110,   105, D,  0, 0              , 29, R), //  19
-	RVI(16, M,  35, 160,  3500/2,95/2, 205/2, D,  0, 0              , 45, R), //  20
-	RVI(18, G,  21, 104,    2200, 120,   145, D,  0, 0              , 32, R), //  21
-	RVI( 6, M,  20, 200,  4500/2,70/2, 190/2, D,  4, CT_MAIL        , 50, R), //  22
-	RVI(20, G,  26, 160,    3600,  84,   180, E,  0, 0              , 40, C), //  23
-	RVI(20, G,  30, 176,    5000,  82,   205, E,  0, 0              , 41, C), //  24
-	RVI(21, M,  40, 240,  7000/2,90/2, 240/2, E,  0, 0              , 51, C), //  25
-	RVI(23, M,  43, 264,  8000/2,95/2, 250/2, E,  0, 0              , 52, C), //  26
-	RVI(33, W, 247,   0,       0,  25,     0, 0, 40, CT_PASSENGERS  ,  0, R), //  27
-	RVI(35, W, 228,   0,       0,  21,     0, 0, 30, CT_MAIL        ,  0, R), //  28
-	RVI(34, W, 176,   0,       0,  18,     0, 0, 30, CT_COAL        ,  0, R), //  29
-	RVI(36, W, 200,   0,       0,  24,     0, 0, 30, CT_OIL         ,  0, R), //  30
-	RVI(37, W, 192,   0,       0,  20,     0, 0, 25, CT_LIVESTOCK   ,  0, R), //  31
-	RVI(38, W, 190,   0,       0,  21,     0, 0, 25, CT_GOODS       ,  0, R), //  32
-	RVI(39, W, 182,   0,       0,  19,     0, 0, 30, CT_GRAIN       ,  0, R), //  33
-	RVI(40, W, 181,   0,       0,  16,     0, 0, 30, CT_WOOD        ,  0, R), //  34
-	RVI(41, W, 179,   0,       0,  19,     0, 0, 30, CT_IRON_ORE    ,  0, R), //  35
-	RVI(42, W, 196,   0,       0,  18,     0, 0, 20, CT_STEEL       ,  0, R), //  36
-	RVI(43, W, 255,   0,       0,  30,     0, 0, 20, CT_VALUABLES   ,  0, R), //  37
-	RVI(44, W, 191,   0,       0,  22,     0, 0, 25, CT_FOOD        ,  0, R), //  38
-	RVI(45, W, 196,   0,       0,  18,     0, 0, 20, CT_PAPER       ,  0, R), //  39
-	RVI(46, W, 179,   0,       0,  19,     0, 0, 30, CT_COPPER_ORE  ,  0, R), //  40
-	RVI(47, W, 199,   0,       0,  25,     0, 0, 25, CT_WATER       ,  0, R), //  41
-	RVI(48, W, 182,   0,       0,  18,     0, 0, 25, CT_FRUIT       ,  0, R), //  42
-	RVI(49, W, 185,   0,       0,  19,     0, 0, 21, CT_RUBBER      ,  0, R), //  43
-	RVI(50, W, 176,   0,       0,  19,     0, 0, 30, CT_SUGAR       ,  0, R), //  44
-	RVI(51, W, 178,   0,       0,  20,     0, 0, 30, CT_COTTON_CANDY,  0, R), //  45
-	RVI(52, W, 192,   0,       0,  20,     0, 0, 30, CT_TOFFEE      ,  0, R), //  46
-	RVI(53, W, 190,   0,       0,  21,     0, 0, 20, CT_BUBBLES     ,  0, R), //  47
-	RVI(54, W, 182,   0,       0,  24,     0, 0, 25, CT_COLA        ,  0, R), //  48
-	RVI(55, W, 181,   0,       0,  21,     0, 0, 25, CT_CANDY       ,  0, R), //  49
-	RVI(56, W, 183,   0,       0,  21,     0, 0, 20, CT_TOYS        ,  0, R), //  50
-	RVI(57, W, 196,   0,       0,  18,     0, 0, 22, CT_BATTERIES   ,  0, R), //  51
-	RVI(58, W, 193,   0,       0,  18,     0, 0, 25, CT_FIZZY_DRINKS,  0, R), //  52
-	RVI(59, W, 191,   0,       0,  18,     0, 0, 30, CT_PLASTIC     ,  0, R), //  53
-	RVI(25, G,  52, 304,    9000,  95,   230, E,  0, 0              , 60, O), //  54
-	RVI(26, M,  60, 336, 10000/2,85/2, 240/2, E, 25, CT_PASSENGERS  , 62, O), //  55
-	RVI(26, G,  53, 320,    5000,  95,   230, E,  0, 0              , 63, O), //  56
-	RVI(60, W, 247,   0,       0,  25,     0, 0, 45, CT_PASSENGERS  ,  0, O), //  57
-	RVI(62, W, 228,   0,       0,  21,     0, 0, 35, CT_MAIL        ,  0, O), //  58
-	RVI(61, W, 176,   0,       0,  18,     0, 0, 35, CT_COAL        ,  0, O), //  59
-	RVI(63, W, 200,   0,       0,  24,     0, 0, 35, CT_OIL         ,  0, O), //  60
-	RVI(64, W, 192,   0,       0,  20,     0, 0, 30, CT_LIVESTOCK   ,  0, O), //  61
-	RVI(65, W, 190,   0,       0,  21,     0, 0, 30, CT_GOODS       ,  0, O), //  62
-	RVI(66, W, 182,   0,       0,  19,     0, 0, 35, CT_GRAIN       ,  0, O), //  63
-	RVI(67, W, 181,   0,       0,  16,     0, 0, 35, CT_WOOD        ,  0, O), //  64
-	RVI(68, W, 179,   0,       0,  19,     0, 0, 35, CT_IRON_ORE    ,  0, O), //  65
-	RVI(69, W, 196,   0,       0,  18,     0, 0, 25, CT_STEEL       ,  0, O), //  66
-	RVI(70, W, 255,   0,       0,  30,     0, 0, 25, CT_VALUABLES   ,  0, O), //  67
-	RVI(71, W, 191,   0,       0,  22,     0, 0, 30, CT_FOOD        ,  0, O), //  68
-	RVI(72, W, 196,   0,       0,  18,     0, 0, 25, CT_PAPER       ,  0, O), //  69
-	RVI(73, W, 179,   0,       0,  19,     0, 0, 35, CT_COPPER_ORE  ,  0, O), //  70
-	RVI(47, W, 199,   0,       0,  25,     0, 0, 30, CT_WATER       ,  0, O), //  71
-	RVI(48, W, 182,   0,       0,  18,     0, 0, 30, CT_FRUIT       ,  0, O), //  72
-	RVI(49, W, 185,   0,       0,  19,     0, 0, 26, CT_RUBBER      ,  0, O), //  73
-	RVI(50, W, 176,   0,       0,  19,     0, 0, 35, CT_SUGAR       ,  0, O), //  74
-	RVI(51, W, 178,   0,       0,  20,     0, 0, 35, CT_COTTON_CANDY,  0, O), //  75
-	RVI(52, W, 192,   0,       0,  20,     0, 0, 35, CT_TOFFEE      ,  0, O), //  76
-	RVI(53, W, 190,   0,       0,  21,     0, 0, 25, CT_BUBBLES     ,  0, O), //  77
-	RVI(54, W, 182,   0,       0,  24,     0, 0, 30, CT_COLA        ,  0, O), //  78
-	RVI(55, W, 181,   0,       0,  21,     0, 0, 30, CT_CANDY       ,  0, O), //  79
-	RVI(56, W, 183,   0,       0,  21,     0, 0, 25, CT_TOYS        ,  0, O), //  80
-	RVI(57, W, 196,   0,       0,  18,     0, 0, 27, CT_BATTERIES   ,  0, O), //  81
-	RVI(58, W, 193,   0,       0,  18,     0, 0, 30, CT_FIZZY_DRINKS,  0, O), //  82
-	RVI(59, W, 191,   0,       0,  18,     0, 0, 35, CT_PLASTIC     ,  0, O), //  83
-	RVI(28, G,  70, 400,   10000, 105,   250, E,  0, 0              , 70, L), //  84
-	RVI(29, G,  74, 448,   12000, 120,   253, E,  0, 0              , 71, L), //  85
-	RVI(30, G,  82, 480,   15000, 130,   254, E,  0, 0              , 72, L), //  86
-	RVI(31, M,  95, 640, 20000/2,150/2,255/2, E,  0, 0              , 73, L), //  87
-	RVI(28, G,  70, 480,   10000, 120,   250, E,  0, 0              , 74, L), //  88
-	RVI(60, W, 247,   0,       0,  25,     0, 0, 47, CT_PASSENGERS  ,  0, L), //  89
-	RVI(62, W, 228,   0,       0,  21,     0, 0, 37, CT_MAIL        ,  0, L), //  90
-	RVI(61, W, 176,   0,       0,  18,     0, 0, 37, CT_COAL        ,  0, L), //  91
-	RVI(63, W, 200,   0,       0,  24,     0, 0, 37, CT_OIL         ,  0, L), //  92
-	RVI(64, W, 192,   0,       0,  20,     0, 0, 32, CT_LIVESTOCK   ,  0, L), //  93
-	RVI(65, W, 190,   0,       0,  21,     0, 0, 32, CT_GOODS       ,  0, L), //  94
-	RVI(66, W, 182,   0,       0,  19,     0, 0, 37, CT_GRAIN       ,  0, L), //  95
-	RVI(67, W, 181,   0,       0,  16,     0, 0, 37, CT_WOOD        ,  0, L), //  96
-	RVI(68, W, 179,   0,       0,  19,     0, 0, 37, CT_IRON_ORE    ,  0, L), //  97
-	RVI(69, W, 196,   0,       0,  18,     0, 0, 27, CT_STEEL       ,  0, L), //  98
-	RVI(70, W, 255,   0,       0,  30,     0, 0, 27, CT_VALUABLES   ,  0, L), //  99
-	RVI(71, W, 191,   0,       0,  22,     0, 0, 32, CT_FOOD        ,  0, L), // 100
-	RVI(72, W, 196,   0,       0,  18,     0, 0, 27, CT_PAPER       ,  0, L), // 101
-	RVI(73, W, 179,   0,       0,  19,     0, 0, 37, CT_COPPER_ORE  ,  0, L), // 102
-	RVI(47, W, 199,   0,       0,  25,     0, 0, 32, CT_WATER       ,  0, L), // 103
-	RVI(48, W, 182,   0,       0,  18,     0, 0, 32, CT_FRUIT       ,  0, L), // 104
-	RVI(49, W, 185,   0,       0,  19,     0, 0, 28, CT_RUBBER      ,  0, L), // 105
-	RVI(50, W, 176,   0,       0,  19,     0, 0, 37, CT_SUGAR       ,  0, L), // 106
-	RVI(51, W, 178,   0,       0,  20,     0, 0, 37, CT_COTTON_CANDY,  0, L), // 107
-	RVI(52, W, 192,   0,       0,  20,     0, 0, 37, CT_TOFFEE      ,  0, L), // 108
-	RVI(53, W, 190,   0,       0,  21,     0, 0, 27, CT_BUBBLES     ,  0, L), // 109
-	RVI(54, W, 182,   0,       0,  24,     0, 0, 32, CT_COLA        ,  0, L), // 110
-	RVI(55, W, 181,   0,       0,  21,     0, 0, 32, CT_CANDY       ,  0, L), // 111
-	RVI(56, W, 183,   0,       0,  21,     0, 0, 27, CT_TOYS        ,  0, L), // 112
-	RVI(57, W, 196,   0,       0,  18,     0, 0, 29, CT_BATTERIES   ,  0, L), // 113
-	RVI(58, W, 193,   0,       0,  18,     0, 0, 32, CT_FIZZY_DRINKS,  0, L), // 114
-	RVI(59, W, 191,   0,       0,  18,     0, 0, 37, CT_PLASTIC     ,  0, L), // 115
+	//   image_index  max_speed (kph)      running_cost_base           ai_rank
+	//   |  flags     |        power (hp)  |  running_cost_class       |  railtype
+	//   |  |    base_cost     |    weight |  |   capacity             |  |
+	//   |  |    |    |        |    |      |  |   |  cargo_type        |  |  engclass
+	//   |  |    |    |        |    |      |  |   |  |                 |  |  |
+	RVI( 2, G,   7,  64,     300,  47,    50, S,  0, 0              ,  1, R, S), //   0
+	RVI(19, G,   8,  80,     600,  65,    65, D,  0, 0              ,  4, R, D), //   1
+	RVI( 2, G,  10,  72,     400,  85,    90, S,  0, 0              ,  7, R, S), //   2
+	RVI( 0, G,  15,  96,     900, 130,   130, S,  0, 0              , 19, R, S), //   3
+	RVI( 1, G,  19, 112,    1000, 140,   145, S,  0, 0              , 20, R, S), //   4
+	RVI(12, G,  16, 120,    1400,  95,   125, D,  0, 0              , 30, R, D), //   5
+	RVI(14, G,  20, 152,    2000, 120,   135, D,  0, 0              , 31, R, D), //   6
+	RVI( 3, G,  14,  88,    1100, 145,   130, S,  0, 0              , 19, R, S), //   7
+	RVI( 0, G,  13, 112,    1000, 131,   120, S,  0, 0              , 20, R, S), //   8
+	RVI( 1, G,  19, 128,    1200, 162,   140, S,  0, 0              , 21, R, S), //   9
+	RVI( 0, G,  22, 144,    1600, 170,   130, S,  0, 0              , 22, R, S), //  10
+	RVI( 8, M,  11, 112,   600/2,32/2,  85/2, D, 38, CT_PASSENGERS  , 10, R, D), //  11
+	RVI(10, M,  14, 120,   700/2,38/2,  70/2, D, 40, CT_PASSENGERS  , 11, R, D), //  12
+	RVI( 4, G,  15, 128,    1250,  72,    95, D,  0, 0              , 30, R, D), //  13
+	RVI( 5, G,  17, 144,    1750, 101,   120, D,  0, 0              , 31, R, D), //  14
+	RVI( 4, G,  18, 160,    2580, 112,   140, D,  0, 0              , 32, R, D), //  15
+	RVI(14, G,  23,  96,    4000, 150,   135, D,  0, 0              , 33, R, D), //  16
+	RVI(12, G,  16, 112,    2400, 120,   105, D,  0, 0              , 34, R, D), //  17
+	RVI(13, G,  30, 112,    6600, 207,   155, D,  0, 0              , 35, R, D), //  18
+	RVI(15, G,  18, 104,    1500, 110,   105, D,  0, 0              , 29, R, D), //  19
+	RVI(16, M,  35, 160,  3500/2,95/2, 205/2, D,  0, 0              , 45, R, D), //  20
+	RVI(18, G,  21, 104,    2200, 120,   145, D,  0, 0              , 32, R, D), //  21
+	RVI( 6, M,  20, 200,  4500/2,70/2, 190/2, D,  4, CT_MAIL        , 50, R, D), //  22
+	RVI(20, G,  26, 160,    3600,  84,   180, E,  0, 0              , 40, C, E), //  23
+	RVI(20, G,  30, 176,    5000,  82,   205, E,  0, 0              , 41, C, E), //  24
+	RVI(21, M,  40, 240,  7000/2,90/2, 240/2, E,  0, 0              , 51, C, E), //  25
+	RVI(23, M,  43, 264,  8000/2,95/2, 250/2, E,  0, 0              , 52, C, E), //  26
+	RVI(33, W, 247,   0,       0,  25,     0, 0, 40, CT_PASSENGERS  ,  0, R, A), //  27
+	RVI(35, W, 228,   0,       0,  21,     0, 0, 30, CT_MAIL        ,  0, R, A), //  28
+	RVI(34, W, 176,   0,       0,  18,     0, 0, 30, CT_COAL        ,  0, R, A), //  29
+	RVI(36, W, 200,   0,       0,  24,     0, 0, 30, CT_OIL         ,  0, R, A), //  30
+	RVI(37, W, 192,   0,       0,  20,     0, 0, 25, CT_LIVESTOCK   ,  0, R, A), //  31
+	RVI(38, W, 190,   0,       0,  21,     0, 0, 25, CT_GOODS       ,  0, R, A), //  32
+	RVI(39, W, 182,   0,       0,  19,     0, 0, 30, CT_GRAIN       ,  0, R, A), //  33
+	RVI(40, W, 181,   0,       0,  16,     0, 0, 30, CT_WOOD        ,  0, R, A), //  34
+	RVI(41, W, 179,   0,       0,  19,     0, 0, 30, CT_IRON_ORE    ,  0, R, A), //  35
+	RVI(42, W, 196,   0,       0,  18,     0, 0, 20, CT_STEEL       ,  0, R, A), //  36
+	RVI(43, W, 255,   0,       0,  30,     0, 0, 20, CT_VALUABLES   ,  0, R, A), //  37
+	RVI(44, W, 191,   0,       0,  22,     0, 0, 25, CT_FOOD        ,  0, R, A), //  38
+	RVI(45, W, 196,   0,       0,  18,     0, 0, 20, CT_PAPER       ,  0, R, A), //  39
+	RVI(46, W, 179,   0,       0,  19,     0, 0, 30, CT_COPPER_ORE  ,  0, R, A), //  40
+	RVI(47, W, 199,   0,       0,  25,     0, 0, 25, CT_WATER       ,  0, R, A), //  41
+	RVI(48, W, 182,   0,       0,  18,     0, 0, 25, CT_FRUIT       ,  0, R, A), //  42
+	RVI(49, W, 185,   0,       0,  19,     0, 0, 21, CT_RUBBER      ,  0, R, A), //  43
+	RVI(50, W, 176,   0,       0,  19,     0, 0, 30, CT_SUGAR       ,  0, R, A), //  44
+	RVI(51, W, 178,   0,       0,  20,     0, 0, 30, CT_COTTON_CANDY,  0, R, A), //  45
+	RVI(52, W, 192,   0,       0,  20,     0, 0, 30, CT_TOFFEE      ,  0, R, A), //  46
+	RVI(53, W, 190,   0,       0,  21,     0, 0, 20, CT_BUBBLES     ,  0, R, A), //  47
+	RVI(54, W, 182,   0,       0,  24,     0, 0, 25, CT_COLA        ,  0, R, A), //  48
+	RVI(55, W, 181,   0,       0,  21,     0, 0, 25, CT_CANDY       ,  0, R, A), //  49
+	RVI(56, W, 183,   0,       0,  21,     0, 0, 20, CT_TOYS        ,  0, R, A), //  50
+	RVI(57, W, 196,   0,       0,  18,     0, 0, 22, CT_BATTERIES   ,  0, R, A), //  51
+	RVI(58, W, 193,   0,       0,  18,     0, 0, 25, CT_FIZZY_DRINKS,  0, R, A), //  52
+	RVI(59, W, 191,   0,       0,  18,     0, 0, 30, CT_PLASTIC     ,  0, R, A), //  53
+	RVI(25, G,  52, 304,    9000,  95,   230, E,  0, 0              , 60, O, N), //  54
+	RVI(26, M,  60, 336, 10000/2,85/2, 240/2, E, 25, CT_PASSENGERS  , 62, O, N), //  55
+	RVI(26, G,  53, 320,    5000,  95,   230, E,  0, 0              , 63, O, N), //  56
+	RVI(60, W, 247,   0,       0,  25,     0, 0, 45, CT_PASSENGERS  ,  0, O, A), //  57
+	RVI(62, W, 228,   0,       0,  21,     0, 0, 35, CT_MAIL        ,  0, O, A), //  58
+	RVI(61, W, 176,   0,       0,  18,     0, 0, 35, CT_COAL        ,  0, O, A), //  59
+	RVI(63, W, 200,   0,       0,  24,     0, 0, 35, CT_OIL         ,  0, O, A), //  60
+	RVI(64, W, 192,   0,       0,  20,     0, 0, 30, CT_LIVESTOCK   ,  0, O, A), //  61
+	RVI(65, W, 190,   0,       0,  21,     0, 0, 30, CT_GOODS       ,  0, O, A), //  62
+	RVI(66, W, 182,   0,       0,  19,     0, 0, 35, CT_GRAIN       ,  0, O, A), //  63
+	RVI(67, W, 181,   0,       0,  16,     0, 0, 35, CT_WOOD        ,  0, O, A), //  64
+	RVI(68, W, 179,   0,       0,  19,     0, 0, 35, CT_IRON_ORE    ,  0, O, A), //  65
+	RVI(69, W, 196,   0,       0,  18,     0, 0, 25, CT_STEEL       ,  0, O, A), //  66
+	RVI(70, W, 255,   0,       0,  30,     0, 0, 25, CT_VALUABLES   ,  0, O, A), //  67
+	RVI(71, W, 191,   0,       0,  22,     0, 0, 30, CT_FOOD        ,  0, O, A), //  68
+	RVI(72, W, 196,   0,       0,  18,     0, 0, 25, CT_PAPER       ,  0, O, A), //  69
+	RVI(73, W, 179,   0,       0,  19,     0, 0, 35, CT_COPPER_ORE  ,  0, O, A), //  70
+	RVI(47, W, 199,   0,       0,  25,     0, 0, 30, CT_WATER       ,  0, O, A), //  71
+	RVI(48, W, 182,   0,       0,  18,     0, 0, 30, CT_FRUIT       ,  0, O, A), //  72
+	RVI(49, W, 185,   0,       0,  19,     0, 0, 26, CT_RUBBER      ,  0, O, A), //  73
+	RVI(50, W, 176,   0,       0,  19,     0, 0, 35, CT_SUGAR       ,  0, O, A), //  74
+	RVI(51, W, 178,   0,       0,  20,     0, 0, 35, CT_COTTON_CANDY,  0, O, A), //  75
+	RVI(52, W, 192,   0,       0,  20,     0, 0, 35, CT_TOFFEE      ,  0, O, A), //  76
+	RVI(53, W, 190,   0,       0,  21,     0, 0, 25, CT_BUBBLES     ,  0, O, A), //  77
+	RVI(54, W, 182,   0,       0,  24,     0, 0, 30, CT_COLA        ,  0, O, A), //  78
+	RVI(55, W, 181,   0,       0,  21,     0, 0, 30, CT_CANDY       ,  0, O, A), //  79
+	RVI(56, W, 183,   0,       0,  21,     0, 0, 25, CT_TOYS        ,  0, O, A), //  80
+	RVI(57, W, 196,   0,       0,  18,     0, 0, 27, CT_BATTERIES   ,  0, O, A), //  81
+	RVI(58, W, 193,   0,       0,  18,     0, 0, 30, CT_FIZZY_DRINKS,  0, O, A), //  82
+	RVI(59, W, 191,   0,       0,  18,     0, 0, 35, CT_PLASTIC     ,  0, O, A), //  83
+	RVI(28, G,  70, 400,   10000, 105,   250, E,  0, 0              , 70, L, V), //  84
+	RVI(29, G,  74, 448,   12000, 120,   253, E,  0, 0              , 71, L, V), //  85
+	RVI(30, G,  82, 480,   15000, 130,   254, E,  0, 0              , 72, L, V), //  86
+	RVI(31, M,  95, 640, 20000/2,150/2,255/2, E,  0, 0              , 73, L, V), //  87
+	RVI(28, G,  70, 480,   10000, 120,   250, E,  0, 0              , 74, L, V), //  88
+	RVI(60, W, 247,   0,       0,  25,     0, 0, 47, CT_PASSENGERS  ,  0, L, A), //  89
+	RVI(62, W, 228,   0,       0,  21,     0, 0, 37, CT_MAIL        ,  0, L, A), //  90
+	RVI(61, W, 176,   0,       0,  18,     0, 0, 37, CT_COAL        ,  0, L, A), //  91
+	RVI(63, W, 200,   0,       0,  24,     0, 0, 37, CT_OIL         ,  0, L, A), //  92
+	RVI(64, W, 192,   0,       0,  20,     0, 0, 32, CT_LIVESTOCK   ,  0, L, A), //  93
+	RVI(65, W, 190,   0,       0,  21,     0, 0, 32, CT_GOODS       ,  0, L, A), //  94
+	RVI(66, W, 182,   0,       0,  19,     0, 0, 37, CT_GRAIN       ,  0, L, A), //  95
+	RVI(67, W, 181,   0,       0,  16,     0, 0, 37, CT_WOOD        ,  0, L, A), //  96
+	RVI(68, W, 179,   0,       0,  19,     0, 0, 37, CT_IRON_ORE    ,  0, L, A), //  97
+	RVI(69, W, 196,   0,       0,  18,     0, 0, 27, CT_STEEL       ,  0, L, A), //  98
+	RVI(70, W, 255,   0,       0,  30,     0, 0, 27, CT_VALUABLES   ,  0, L, A), //  99
+	RVI(71, W, 191,   0,       0,  22,     0, 0, 32, CT_FOOD        ,  0, L, A), // 100
+	RVI(72, W, 196,   0,       0,  18,     0, 0, 27, CT_PAPER       ,  0, L, A), // 101
+	RVI(73, W, 179,   0,       0,  19,     0, 0, 37, CT_COPPER_ORE  ,  0, L, A), // 102
+	RVI(47, W, 199,   0,       0,  25,     0, 0, 32, CT_WATER       ,  0, L, A), // 103
+	RVI(48, W, 182,   0,       0,  18,     0, 0, 32, CT_FRUIT       ,  0, L, A), // 104
+	RVI(49, W, 185,   0,       0,  19,     0, 0, 28, CT_RUBBER      ,  0, L, A), // 105
+	RVI(50, W, 176,   0,       0,  19,     0, 0, 37, CT_SUGAR       ,  0, L, A), // 106
+	RVI(51, W, 178,   0,       0,  20,     0, 0, 37, CT_COTTON_CANDY,  0, L, A), // 107
+	RVI(52, W, 192,   0,       0,  20,     0, 0, 37, CT_TOFFEE      ,  0, L, A), // 108
+	RVI(53, W, 190,   0,       0,  21,     0, 0, 27, CT_BUBBLES     ,  0, L, A), // 109
+	RVI(54, W, 182,   0,       0,  24,     0, 0, 32, CT_COLA        ,  0, L, A), // 110
+	RVI(55, W, 181,   0,       0,  21,     0, 0, 32, CT_CANDY       ,  0, L, A), // 111
+	RVI(56, W, 183,   0,       0,  21,     0, 0, 27, CT_TOYS        ,  0, L, A), // 112
+	RVI(57, W, 196,   0,       0,  18,     0, 0, 29, CT_BATTERIES   ,  0, L, A), // 113
+	RVI(58, W, 193,   0,       0,  18,     0, 0, 32, CT_FIZZY_DRINKS,  0, L, A), // 114
+	RVI(59, W, 191,   0,       0,  18,     0, 0, 37, CT_PLASTIC     ,  0, L, A), // 115
 };
 #undef L
 #undef O
 #undef C
 #undef R
+#undef V
+#undef N
 #undef E
 #undef D
 #undef S
@@ -586,101 +611,101 @@
  * @param f capacity
  * @param g cargo_type
  */
-#define RVI(a, b, c, d, e, f, g) { a, b, c, {d}, e, f, g }
+#define ROV(a, b, c, d, e, f, g) { a, b, c, {d}, e, f, g }
 const RoadVehicleInfo orig_road_vehicle_info[NUM_ROAD_ENGINES] = {
 	//    image_index       sfx                                 max_speed
 	//    |    base_cost    |                                   |   capacity
 	//    |    |    running_cost                                |   |  cargo_type
 	//    |    |    |       |                                   |   |  |
-	RVI(  0, 120,  91, SND_19_BUS_START_PULL_AWAY,            112, 31, CT_PASSENGERS   ), /*  0 */
-	RVI( 17, 140, 128, SND_1C_TRUCK_START_2,                  176, 35, CT_PASSENGERS   ), /*  1 */
-	RVI( 17, 150, 178, SND_1B_TRUCK_START,                    224, 37, CT_PASSENGERS   ), /*  2 */
-	RVI( 34, 160, 240, SND_1B_TRUCK_START,                    255, 40, CT_PASSENGERS   ), /*  3 */
-	RVI( 51, 120,  91, SND_3C_COMEDY_CAR,                     112, 30, CT_PASSENGERS   ), /*  4 */
-	RVI( 51, 140, 171, SND_3E_COMEDY_CAR_2,                   192, 35, CT_PASSENGERS   ), /*  5 */
-	RVI( 51, 160, 240, SND_3C_COMEDY_CAR,                     240, 38, CT_PASSENGERS   ), /*  6 */
-	RVI(  1, 108,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_COAL         ), /*  7 */
-	RVI( 18, 128, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_COAL         ), /*  8 */
-	RVI( 35, 138, 240, SND_19_BUS_START_PULL_AWAY,            224, 28, CT_COAL         ), /*  9 */
-	RVI(  2, 115,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_MAIL         ), /* 10 */
-	RVI( 19, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 28, CT_MAIL         ), /* 11 */
-	RVI( 36, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 30, CT_MAIL         ), /* 12 */
-	RVI( 57, 115,  90, SND_3E_COMEDY_CAR_2,                    96, 22, CT_MAIL         ), /* 13 */
-	RVI( 57, 135, 168, SND_3C_COMEDY_CAR,                     176, 28, CT_MAIL         ), /* 14 */
-	RVI( 57, 145, 240, SND_3E_COMEDY_CAR_2,                   224, 30, CT_MAIL         ), /* 15 */
-	RVI(  3, 110,  90, SND_19_BUS_START_PULL_AWAY,             96, 21, CT_OIL          ), /* 16 */
-	RVI( 20, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_OIL          ), /* 17 */
-	RVI( 37, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_OIL          ), /* 18 */
-	RVI(  4, 105,  90, SND_19_BUS_START_PULL_AWAY,             96, 14, CT_LIVESTOCK    ), /* 19 */
-	RVI( 21, 130, 168, SND_19_BUS_START_PULL_AWAY,            176, 16, CT_LIVESTOCK    ), /* 20 */
-	RVI( 38, 140, 240, SND_19_BUS_START_PULL_AWAY,            224, 18, CT_LIVESTOCK    ), /* 21 */
-	RVI(  5, 107,  90, SND_19_BUS_START_PULL_AWAY,             96, 14, CT_GOODS        ), /* 22 */
-	RVI( 22, 130, 168, SND_19_BUS_START_PULL_AWAY,            176, 16, CT_GOODS        ), /* 23 */
-	RVI( 39, 140, 240, SND_19_BUS_START_PULL_AWAY,            224, 18, CT_GOODS        ), /* 24 */
-	RVI(  6, 114,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_GRAIN        ), /* 25 */
-	RVI( 23, 133, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_GRAIN        ), /* 26 */
-	RVI( 40, 143, 240, SND_19_BUS_START_PULL_AWAY,            224, 30, CT_GRAIN        ), /* 27 */
-	RVI(  7, 118,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_WOOD         ), /* 28 */
-	RVI( 24, 137, 168, SND_19_BUS_START_PULL_AWAY,            176, 22, CT_WOOD         ), /* 29 */
-	RVI( 41, 147, 240, SND_19_BUS_START_PULL_AWAY,            224, 24, CT_WOOD         ), /* 30 */
-	RVI(  8, 121,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_IRON_ORE     ), /* 31 */
-	RVI( 25, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_IRON_ORE     ), /* 32 */
-	RVI( 42, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_IRON_ORE     ), /* 33 */
-	RVI(  9, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 15, CT_STEEL        ), /* 34 */
-	RVI( 26, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 18, CT_STEEL        ), /* 35 */
-	RVI( 43, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 20, CT_STEEL        ), /* 36 */
-	RVI( 10, 145,  90, SND_19_BUS_START_PULL_AWAY,             96, 12, CT_VALUABLES    ), /* 37 */
-	RVI( 27, 170, 168, SND_19_BUS_START_PULL_AWAY,            176, 15, CT_VALUABLES    ), /* 38 */
-	RVI( 44, 180, 240, SND_19_BUS_START_PULL_AWAY,            224, 16, CT_VALUABLES    ), /* 39 */
-	RVI( 11, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 17, CT_FOOD         ), /* 40 */
-	RVI( 28, 134, 168, SND_19_BUS_START_PULL_AWAY,            176, 20, CT_FOOD         ), /* 41 */
-	RVI( 45, 144, 240, SND_19_BUS_START_PULL_AWAY,            224, 22, CT_FOOD         ), /* 42 */
-	RVI( 12, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 15, CT_PAPER        ), /* 43 */
-	RVI( 29, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 18, CT_PAPER        ), /* 44 */
-	RVI( 46, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 20, CT_PAPER        ), /* 45 */
-	RVI( 13, 121,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_COPPER_ORE   ), /* 46 */
-	RVI( 30, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_COPPER_ORE   ), /* 47 */
-	RVI( 47, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_COPPER_ORE   ), /* 48 */
-	RVI( 14, 111,  90, SND_19_BUS_START_PULL_AWAY,             96, 21, CT_WATER        ), /* 49 */
-	RVI( 31, 141, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_WATER        ), /* 50 */
-	RVI( 48, 151, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_WATER        ), /* 51 */
-	RVI( 15, 118,  90, SND_19_BUS_START_PULL_AWAY,             96, 18, CT_FRUIT        ), /* 52 */
-	RVI( 32, 148, 168, SND_19_BUS_START_PULL_AWAY,            176, 20, CT_FRUIT        ), /* 53 */
-	RVI( 49, 158, 240, SND_19_BUS_START_PULL_AWAY,            224, 23, CT_FRUIT        ), /* 54 */
-	RVI( 16, 117,  90, SND_19_BUS_START_PULL_AWAY,             96, 17, CT_RUBBER       ), /* 55 */
-	RVI( 33, 147, 168, SND_19_BUS_START_PULL_AWAY,            176, 19, CT_RUBBER       ), /* 56 */
-	RVI( 50, 157, 240, SND_19_BUS_START_PULL_AWAY,            224, 22, CT_RUBBER       ), /* 57 */
-	RVI( 52, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_SUGAR        ), /* 58 */
-	RVI( 52, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_SUGAR        ), /* 59 */
-	RVI( 52, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_SUGAR        ), /* 60 */
-	RVI( 53, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_COLA         ), /* 61 */
-	RVI( 53, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_COLA         ), /* 62 */
-	RVI( 53, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_COLA         ), /* 63 */
-	RVI( 54, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_COTTON_CANDY ), /* 64 */
-	RVI( 54, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_COTTON_CANDY ), /* 65 */
-	RVI( 54, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_COTTON_CANDY ), /* 66 */
-	RVI( 55, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_TOFFEE       ), /* 67 */
-	RVI( 55, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_TOFFEE       ), /* 68 */
-	RVI( 55, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_TOFFEE       ), /* 69 */
-	RVI( 56, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_TOYS         ), /* 70 */
-	RVI( 56, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_TOYS         ), /* 71 */
-	RVI( 56, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_TOYS         ), /* 72 */
-	RVI( 58, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_CANDY        ), /* 73 */
-	RVI( 58, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_CANDY        ), /* 74 */
-	RVI( 58, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_CANDY        ), /* 75 */
-	RVI( 59, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_BATTERIES    ), /* 76 */
-	RVI( 59, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_BATTERIES    ), /* 77 */
-	RVI( 59, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_BATTERIES    ), /* 78 */
-	RVI( 60, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_FIZZY_DRINKS ), /* 79 */
-	RVI( 60, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_FIZZY_DRINKS ), /* 80 */
-	RVI( 60, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_FIZZY_DRINKS ), /* 81 */
-	RVI( 61, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_PLASTIC      ), /* 82 */
-	RVI( 61, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_PLASTIC      ), /* 83 */
-	RVI( 61, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_PLASTIC      ), /* 84 */
-	RVI( 62, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_BUBBLES      ), /* 85 */
-	RVI( 62, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_BUBBLES      ), /* 86 */
-	RVI( 62, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_BUBBLES      ), /* 87 */
+	ROV(  0, 120,  91, SND_19_BUS_START_PULL_AWAY,            112, 31, CT_PASSENGERS   ), /*  0 */
+	ROV( 17, 140, 128, SND_1C_TRUCK_START_2,                  176, 35, CT_PASSENGERS   ), /*  1 */
+	ROV( 17, 150, 178, SND_1B_TRUCK_START,                    224, 37, CT_PASSENGERS   ), /*  2 */
+	ROV( 34, 160, 240, SND_1B_TRUCK_START,                    255, 40, CT_PASSENGERS   ), /*  3 */
+	ROV( 51, 120,  91, SND_3C_COMEDY_CAR,                     112, 30, CT_PASSENGERS   ), /*  4 */
+	ROV( 51, 140, 171, SND_3E_COMEDY_CAR_2,                   192, 35, CT_PASSENGERS   ), /*  5 */
+	ROV( 51, 160, 240, SND_3C_COMEDY_CAR,                     240, 38, CT_PASSENGERS   ), /*  6 */
+	ROV(  1, 108,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_COAL         ), /*  7 */
+	ROV( 18, 128, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_COAL         ), /*  8 */
+	ROV( 35, 138, 240, SND_19_BUS_START_PULL_AWAY,            224, 28, CT_COAL         ), /*  9 */
+	ROV(  2, 115,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_MAIL         ), /* 10 */
+	ROV( 19, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 28, CT_MAIL         ), /* 11 */
+	ROV( 36, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 30, CT_MAIL         ), /* 12 */
+	ROV( 57, 115,  90, SND_3E_COMEDY_CAR_2,                    96, 22, CT_MAIL         ), /* 13 */
+	ROV( 57, 135, 168, SND_3C_COMEDY_CAR,                     176, 28, CT_MAIL         ), /* 14 */
+	ROV( 57, 145, 240, SND_3E_COMEDY_CAR_2,                   224, 30, CT_MAIL         ), /* 15 */
+	ROV(  3, 110,  90, SND_19_BUS_START_PULL_AWAY,             96, 21, CT_OIL          ), /* 16 */
+	ROV( 20, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_OIL          ), /* 17 */
+	ROV( 37, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_OIL          ), /* 18 */
+	ROV(  4, 105,  90, SND_19_BUS_START_PULL_AWAY,             96, 14, CT_LIVESTOCK    ), /* 19 */
+	ROV( 21, 130, 168, SND_19_BUS_START_PULL_AWAY,            176, 16, CT_LIVESTOCK    ), /* 20 */
+	ROV( 38, 140, 240, SND_19_BUS_START_PULL_AWAY,            224, 18, CT_LIVESTOCK    ), /* 21 */
+	ROV(  5, 107,  90, SND_19_BUS_START_PULL_AWAY,             96, 14, CT_GOODS        ), /* 22 */
+	ROV( 22, 130, 168, SND_19_BUS_START_PULL_AWAY,            176, 16, CT_GOODS        ), /* 23 */
+	ROV( 39, 140, 240, SND_19_BUS_START_PULL_AWAY,            224, 18, CT_GOODS        ), /* 24 */
+	ROV(  6, 114,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_GRAIN        ), /* 25 */
+	ROV( 23, 133, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_GRAIN        ), /* 26 */
+	ROV( 40, 143, 240, SND_19_BUS_START_PULL_AWAY,            224, 30, CT_GRAIN        ), /* 27 */
+	ROV(  7, 118,  90, SND_19_BUS_START_PULL_AWAY,             96, 20, CT_WOOD         ), /* 28 */
+	ROV( 24, 137, 168, SND_19_BUS_START_PULL_AWAY,            176, 22, CT_WOOD         ), /* 29 */
+	ROV( 41, 147, 240, SND_19_BUS_START_PULL_AWAY,            224, 24, CT_WOOD         ), /* 30 */
+	ROV(  8, 121,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_IRON_ORE     ), /* 31 */
+	ROV( 25, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_IRON_ORE     ), /* 32 */
+	ROV( 42, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_IRON_ORE     ), /* 33 */
+	ROV(  9, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 15, CT_STEEL        ), /* 34 */
+	ROV( 26, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 18, CT_STEEL        ), /* 35 */
+	ROV( 43, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 20, CT_STEEL        ), /* 36 */
+	ROV( 10, 145,  90, SND_19_BUS_START_PULL_AWAY,             96, 12, CT_VALUABLES    ), /* 37 */
+	ROV( 27, 170, 168, SND_19_BUS_START_PULL_AWAY,            176, 15, CT_VALUABLES    ), /* 38 */
+	ROV( 44, 180, 240, SND_19_BUS_START_PULL_AWAY,            224, 16, CT_VALUABLES    ), /* 39 */
+	ROV( 11, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 17, CT_FOOD         ), /* 40 */
+	ROV( 28, 134, 168, SND_19_BUS_START_PULL_AWAY,            176, 20, CT_FOOD         ), /* 41 */
+	ROV( 45, 144, 240, SND_19_BUS_START_PULL_AWAY,            224, 22, CT_FOOD         ), /* 42 */
+	ROV( 12, 112,  90, SND_19_BUS_START_PULL_AWAY,             96, 15, CT_PAPER        ), /* 43 */
+	ROV( 29, 135, 168, SND_19_BUS_START_PULL_AWAY,            176, 18, CT_PAPER        ), /* 44 */
+	ROV( 46, 145, 240, SND_19_BUS_START_PULL_AWAY,            224, 20, CT_PAPER        ), /* 45 */
+	ROV( 13, 121,  90, SND_19_BUS_START_PULL_AWAY,             96, 22, CT_COPPER_ORE   ), /* 46 */
+	ROV( 30, 140, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_COPPER_ORE   ), /* 47 */
+	ROV( 47, 150, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_COPPER_ORE   ), /* 48 */
+	ROV( 14, 111,  90, SND_19_BUS_START_PULL_AWAY,             96, 21, CT_WATER        ), /* 49 */
+	ROV( 31, 141, 168, SND_19_BUS_START_PULL_AWAY,            176, 25, CT_WATER        ), /* 50 */
+	ROV( 48, 151, 240, SND_19_BUS_START_PULL_AWAY,            224, 27, CT_WATER        ), /* 51 */
+	ROV( 15, 118,  90, SND_19_BUS_START_PULL_AWAY,             96, 18, CT_FRUIT        ), /* 52 */
+	ROV( 32, 148, 168, SND_19_BUS_START_PULL_AWAY,            176, 20, CT_FRUIT        ), /* 53 */
+	ROV( 49, 158, 240, SND_19_BUS_START_PULL_AWAY,            224, 23, CT_FRUIT        ), /* 54 */
+	ROV( 16, 117,  90, SND_19_BUS_START_PULL_AWAY,             96, 17, CT_RUBBER       ), /* 55 */
+	ROV( 33, 147, 168, SND_19_BUS_START_PULL_AWAY,            176, 19, CT_RUBBER       ), /* 56 */
+	ROV( 50, 157, 240, SND_19_BUS_START_PULL_AWAY,            224, 22, CT_RUBBER       ), /* 57 */
+	ROV( 52, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_SUGAR        ), /* 58 */
+	ROV( 52, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_SUGAR        ), /* 59 */
+	ROV( 52, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_SUGAR        ), /* 60 */
+	ROV( 53, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_COLA         ), /* 61 */
+	ROV( 53, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_COLA         ), /* 62 */
+	ROV( 53, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_COLA         ), /* 63 */
+	ROV( 54, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_COTTON_CANDY ), /* 64 */
+	ROV( 54, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_COTTON_CANDY ), /* 65 */
+	ROV( 54, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_COTTON_CANDY ), /* 66 */
+	ROV( 55, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_TOFFEE       ), /* 67 */
+	ROV( 55, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_TOFFEE       ), /* 68 */
+	ROV( 55, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_TOFFEE       ), /* 69 */
+	ROV( 56, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_TOYS         ), /* 70 */
+	ROV( 56, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_TOYS         ), /* 71 */
+	ROV( 56, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_TOYS         ), /* 72 */
+	ROV( 58, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_CANDY        ), /* 73 */
+	ROV( 58, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_CANDY        ), /* 74 */
+	ROV( 58, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_CANDY        ), /* 75 */
+	ROV( 59, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_BATTERIES    ), /* 76 */
+	ROV( 59, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_BATTERIES    ), /* 77 */
+	ROV( 59, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_BATTERIES    ), /* 78 */
+	ROV( 60, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_FIZZY_DRINKS ), /* 79 */
+	ROV( 60, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_FIZZY_DRINKS ), /* 80 */
+	ROV( 60, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_FIZZY_DRINKS ), /* 81 */
+	ROV( 61, 117,  90, SND_3F_COMEDY_CAR_3,                    96, 17, CT_PLASTIC      ), /* 82 */
+	ROV( 61, 147, 168, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 176, 19, CT_PLASTIC      ), /* 83 */
+	ROV( 61, 157, 240, SND_3F_COMEDY_CAR_3,                   224, 22, CT_PLASTIC      ), /* 84 */
+	ROV( 62, 117,  90, SND_40_COMEDY_CAR_START_AND_PULL_AWAY,  96, 17, CT_BUBBLES      ), /* 85 */
+	ROV( 62, 147, 168, SND_3F_COMEDY_CAR_3,                   176, 19, CT_BUBBLES      ), /* 86 */
+	ROV( 62, 157, 240, SND_40_COMEDY_CAR_START_AND_PULL_AWAY, 224, 22, CT_BUBBLES      ), /* 87 */
 };
-#undef RVI
+#undef ROV
 
 #endif /* ENGINES_H */
--- a/src/table/files.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/files.h	Sat Jun 02 19:59:29 2007 +0000
@@ -59,7 +59,11 @@
 	{ "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",   { 0x10, 0xc1, 0x68, 0x56, 0x9e, 0x1e, 0x0e, 0x85, 0x9d, 0xf8, 0x53, 0x27, 0x48, 0x7e, 0x17, 0x58 } },
+	{ "openttd.grf",   { 0x20, 0x64, 0x4a, 0xf6, 0x75, 0x26, 0x5b, 0x92, 0xbb, 0x6f, 0x8d, 0x0e, 0x34, 0x7e, 0xa6, 0xe3 } },
 	{ "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 } },
+	{ "group.grf",     { 0xe8, 0x52, 0x5f, 0x1c, 0x3e, 0xf9, 0x91, 0x9d, 0x0f, 0x70, 0x8c, 0x8a, 0x21, 0xa4, 0xc7, 0x02 } },
+	{ "tramtrkw.grf",  { 0x83, 0x0a, 0xf4, 0x9f, 0x29, 0x10, 0x48, 0xfd, 0x76, 0xe9, 0xda, 0xac, 0x5d, 0xa2, 0x30, 0x45 } },
+	{ "oneway.grf",    { 0xbb, 0xc6, 0xa3, 0xb2, 0xb3, 0xa0, 0xc9, 0x3c, 0xc9, 0xee, 0x24, 0x7c, 0xb6, 0x51, 0x74, 0x63 } },
+	{ "flags.grf",     { 0xa1, 0xd7, 0x72, 0x75, 0x0e, 0x81, 0x86, 0x0e, 0xc9, 0xcd, 0xc2, 0x57, 0xb2, 0x19, 0xe1, 0x0c } },
 };
--- a/src/table/industry_land.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/industry_land.h	Sat Jun 02 19:59:29 2007 +0000
@@ -2,22 +2,47 @@
 
 /** @file industry_land.h */
 
-struct DrawIndustrySpec1Struct {
-	byte x;
-	byte image_1;
-	byte image_2;
-	byte image_3;
+/**
+ * This is used to gather some data about animation
+ * drawing in the industry code
+ * Image_1-2-3 are in fact only offset in the sprites
+ * used by the industry.
+ * To specify an invalid one, either 255 or 0 is used,
+ * depending of the industry.
+ */
+struct DrawIndustryAnimationStruct {
+	int x;        ///< coordinate x of the first image offset
+	byte image_1; ///< image offset 1
+	byte image_2; ///< image offset 2
+	byte image_3; ///< image offset 3
 };
 
-struct DrawIndustrySpec4Struct {
-	byte image_1;
-	byte image_2;
-	byte image_3;
+/**
+ * Simple structure gathering x,y coordinates for
+ * industries animations
+ */
+struct DrawIndustryCoordinates {
+	byte x;  ///< coordinate x of the pair
+	byte y;  ///< coordinate y of the pair
 };
 
+/**
+ * Macro to ease the declaration of the array
+ * @param s1 sprite ID of ground sprite
+ * @param p1 palette ID of ground sprite
+ * @param s2 sprite ID of building sprite
+ * @param p2 palette ID of building sprite
+ * @param sx coordinate x of the sprite
+ * @param sy coordinate y of the sprite
+ * @param w width of the sprite
+ * @param h height of the sprite
+ * @param dz virtual height of the sprite
+ * @param p this allows to specify a special drawing procedure.
+ * @see DrawBuildingsTileStruct */
 #define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w - 1, h - 1, dz, p }
 
-static const DrawBuildingsTileStruct _industry_draw_tile_data[NUM_INDUSTRY_GFXES * 4] = {
+/** Structure for industry tiles drawing */
+static const DrawBuildingsTileStruct _industry_draw_tile_data[NEW_INDUSTRYTILEOFFSET * 4] = {
 	M(     0xf54, PAL_NONE,      0x7db, PAL_NONE,  7,  0,  9,  9,  10, 0),
 	M(     0xf54, PAL_NONE,      0x7dc, PAL_NONE,  7,  0,  9,  9,  30, 0),
 	M(     0xf54, PAL_NONE,      0x7dd, PAL_NONE,  7,  0,  9,  9,  30, 0),
@@ -719,9 +744,10 @@
 	M(     0xf8d, PAL_NONE,     0x12a5 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE,  0,  0, 16, 16,  50, 1),
 	M(     0xf8d, PAL_NONE,     0x12a5 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE,  0,  0, 16, 16,  50, 1),
 };
+#undef M
 
 /* this is ONLY used for Sugar Mine*/
-static const DrawIndustrySpec1Struct _draw_industry_spec1[96] = {
+static const DrawIndustryAnimationStruct _draw_industry_spec1[96] = {
 	{  8,   4,   0,   0},
 	{  6,   0,   1,   0},
 	{  4,   0,   2,   0},
@@ -821,71 +847,77 @@
 };
 
 /* this is ONLY used for Sugar Mine*/
-static const byte _drawtile_proc1_x[5] = {
-	22, 17, 14, 10, 8
-};
-
-/* this is ONLY used for Sugar Mine*/
-static const byte _drawtile_proc1_y[5] = {
-	73, 70, 69, 66, 41
+static const DrawIndustryCoordinates _drawtile_proc1[5] = {
+	{22, 73},
+	{17, 70},
+	{14, 69},
+	{10, 66},
+	{ 8, 41},
 };
 
-/* this is ONLY used for Toy Factory*/
-static const DrawIndustrySpec4Struct _industry_anim_offs_3[] = {
-	{255, 255,   0},
-	{  0, 255,   0},
-	{  1, 255,   0},
-	{  2, 255,   0},
-	{  3, 255,   0},
-	{  4, 255,   0},
-	{  5, 255,   0},
-	{  6, 255,   0},
-	{  7, 255,   0},
-	{  8, 255,   0},
-	{  9, 255,   0},
-	{ 10, 255,   0},
-	{ 11, 255,   0},
-	{ 12, 255,   0},
-	{ 13, 255,   0},
-	{ 14, 255,   0},
-	{ 15, 255,   0},
-	{ 16, 255,   0},
-	{ 17, 255,   0},
-	{ 18, 255,   0},
-	{ 18, 255,   1},
-	{ 18, 255,   2},
-	{ 18, 255,   4},
-	{ 18, 255,   6},
-	{ 18, 255,   8},
-	{ 18, 255,  11},
-	{ 18, 255,  14},
-	{ 18, 255,  17},
-	{ 18, 255,  20},
-	{ 18, 255,  24},
-	{255,   0,  29},
-	{255,   0,  24},
-	{255,   0,  20},
-	{255,   0,  17},
-	{255,   0,  14},
-	{255,   0,  11},
-	{255,   0,   8},
-	{255,   0,   6},
-	{255,   0,   4},
-	{255,   0,   2},
-	{255,   0,   1},
-	{255,   1,   0},
-	{255,   2,   0},
-	{255,   3,   0},
-	{255,   4,   0},
-	{255,   5,   0},
-	{255,   6,   0},
-	{255,   7,   0},
-	{255,   8,   0},
-	{255, 255,   0},
+/** this is ONLY used for Toy Factory.
+ * 255 means no drawing
+ * @param img1 offset from base sprite SPR_IT_SUGAR_MINE_SIEVE
+ * @param img2 offset from base sprite SPR_IT_SUGAR_MINE_CLOUDS
+ * @param img3 offset from base sprite SPR_IT_SUGAR_MINE_PILE
+ */
+#define MD( img1, img2, img3) { (50 - img1 * 2), img1, img2, img3 }
+static const DrawIndustryAnimationStruct _industry_anim_offs_toys[] = {
+	MD(255, 255,   0),
+	MD(  0, 255,   0),
+	MD(  1, 255,   0),
+	MD(  2, 255,   0),
+	MD(  3, 255,   0),
+	MD(  4, 255,   0),
+	MD(  5, 255,   0),
+	MD(  6, 255,   0),
+	MD(  7, 255,   0),
+	MD(  8, 255,   0),
+	MD(  9, 255,   0),
+	MD( 10, 255,   0),
+	MD( 11, 255,   0),
+	MD( 12, 255,   0),
+	MD( 13, 255,   0),
+	MD( 14, 255,   0),
+	MD( 15, 255,   0),
+	MD( 16, 255,   0),
+	MD( 17, 255,   0),
+	MD( 18, 255,   0),
+	MD( 18, 255,   1),
+	MD( 18, 255,   2),
+	MD( 18, 255,   4),
+	MD( 18, 255,   6),
+	MD( 18, 255,   8),
+	MD( 18, 255,  11),
+	MD( 18, 255,  14),
+	MD( 18, 255,  17),
+	MD( 18, 255,  20),
+	MD( 18, 255,  24),
+	MD(255,   0,  29),
+	MD(255,   0,  24),
+	MD(255,   0,  20),
+	MD(255,   0,  17),
+	MD(255,   0,  14),
+	MD(255,   0,  11),
+	MD(255,   0,   8),
+	MD(255,   0,   6),
+	MD(255,   0,   4),
+	MD(255,   0,   2),
+	MD(255,   0,   1),
+	MD(255,   1,   0),
+	MD(255,   2,   0),
+	MD(255,   3,   0),
+	MD(255,   4,   0),
+	MD(255,   5,   0),
+	MD(255,   6,   0),
+	MD(255,   7,   0),
+	MD(255,   8,   0),
+	MD(255, 255,   0),
 };
+#undef MD
 
 /* this is ONLY used for Toffee Quarry*/
-static const byte _industry_anim_offs[] = {
+static const byte _industry_anim_offs_toffee[] = {
 	255,   0,   0,   0,   2,   4,   6,   8,  10,   9,
 	  7,   5,   3,   1, 255,   0,   0,   0,   2,   4,
 	  6,   8,  10,   9,   7,   5,   3,   1, 255,   0,
@@ -896,13 +928,22 @@
 };
 
 /* this is ONLY used for the Bubble Generator*/
-static const byte _industry_anim_offs_2[] = {
+static const byte _industry_anim_offs_bubbles[] = {
 	68, 69, 71, 74, 77, 80, 83, 85, 86, 86,
 	86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
 	86, 86, 85, 84, 83, 82, 81, 80, 79, 78,
 	77, 76, 75, 74, 73, 72, 71, 70, 69, 68,
 };
 
-/* those are ONLY used for Power Station*/
-static const byte _coal_plant_sparks_x[] = {11, 11, 14, 13, 18, 15};
-static const byte _coal_plant_sparks_y[] = {23, 11,  6,  3,  1,  0};
+/**
+ * Movement of the sparks , only used for Power Station
+ */
+static const DrawIndustryCoordinates _coal_plant_sparks[] = {
+	{11, 23},
+	{11, 11},
+	{14,  6},
+	{13,  3},
+	{18,  1},
+	{15,  0},
+};
+
--- a/src/table/namegen.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/namegen.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file table/namegen.h Namepart tables for the town name generator */
+
 #include "../stdafx.h"
 #include "../openttd.h"
 
@@ -1929,7 +1931,7 @@
 
 
 
-static const char *name_romanian_real[]= {
+static const char *name_romanian_real[] = {
 	"Adjud",
 	"Alba Iulia",
 	"Alexandria",
--- a/src/table/palettes.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/palettes.h	Sat Jun 02 19:59:29 2007 +0000
@@ -178,22 +178,43 @@
 	byte shadow;
 };
 
-static const StringColor _string_colormap[] = {
-	{ 150, 215 }, // BLUE
-	{  12, 215 }, // SILVER
-	{ 189, 215 }, // GOLD
-	{ 184, 215 }, // RED
-	{ 174, 215 }, // PURPLE
-	{  30, 215 }, // LTBROWN
-	{ 195, 215 }, // ORANGE
-	{ 209, 215 }, // GREEN
-	{  68, 215 }, // YELLOW
-	{  95, 215 }, // DKGREEN
-	{  79, 215 }, // CREAM
-	{ 116, 215 }, // BROWN
-	{  15, 215 }, // WHITE
-	{ 152, 215 }, // LTBLUE
-	{  32, 215 }, // GRAY
-	{ 133, 215 }, // DKBLUE
-	{ 215,   0 }, // BLACK
+static const StringColor _string_colormap[][17] = {
+	{ /* Windows palette. */
+		{ 150, 215 }, // BLUE
+		{  12, 215 }, // SILVER
+		{ 189, 215 }, // GOLD
+		{ 184, 215 }, // RED
+		{ 174, 215 }, // PURPLE
+		{  30, 215 }, // LTBROWN
+		{ 195, 215 }, // ORANGE
+		{ 209, 215 }, // GREEN
+		{  68, 215 }, // YELLOW
+		{  95, 215 }, // DKGREEN
+		{  79, 215 }, // CREAM
+		{ 116, 215 }, // BROWN
+		{  15, 215 }, // WHITE
+		{ 152, 215 }, // LTBLUE
+		{  32, 215 }, // GRAY
+		{ 133, 215 }, // DKBLUE
+		{ 215,   0 }, // BLACK
+	},
+	{ /* DOS palette. */
+		{ 150,   1 }, // BLUE
+		{  12,   1 }, // SILVER
+		{ 189,   1 }, // GOLD
+		{ 184,   1 }, // RED
+		{ 174,   1 }, // PURPLE
+		{  30,   1 }, // LTBROWN
+		{ 195,   1 }, // ORANGE
+		{ 209,   1 }, // GREEN
+		{  68,   1 }, // YELLOW
+		{  95,   1 }, // DKGREEN
+		{  79,   1 }, // CREAM
+		{ 116,   1 }, // BROWN
+		{  15,   1 }, // WHITE
+		{ 152,   1 }, // LTBLUE
+		{   6,   1 }, // GRAY
+		{ 133,   1 }, // DKBLUE
+		{   1,   0 }, // BLACK
+	}
 };
--- a/src/table/road_land.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/road_land.h	Sat Jun 02 19:59:29 2007 +0000
@@ -32,6 +32,35 @@
 	{ 0xA4A, PAL_NONE, _road_depot_NW }
 };
 
+static const DrawTileSeqStruct _tram_depot_NE[] = {
+	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x35 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 15, 16, 1)
+	TILE_SEQ_END()
+};
+
+static const DrawTileSeqStruct _tram_depot_SE[] = {
+	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x31, PAL_NONE, 0, 0, 1, 16)
+	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x32 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 15, 0, 1, 16)
+	TILE_SEQ_END()
+};
+
+static const DrawTileSeqStruct _tram_depot_SW[] = {
+	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x33, PAL_NONE, 0, 0, 16, 1)
+	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x34 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 15, 16, 1)
+	TILE_SEQ_END()
+};
+
+static const DrawTileSeqStruct _tram_depot_NW[] = {
+	TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x36 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 15, 0, 1, 16)
+	TILE_SEQ_END()
+};
+
+static const DrawTileSprites _tram_depot[] = {
+	{ 0xA4A, PAL_NONE, _tram_depot_NE },
+	{ 0xA4A, PAL_NONE, _tram_depot_SE },
+	{ 0xA4A, PAL_NONE, _tram_depot_SW },
+	{ 0xA4A, PAL_NONE, _tram_depot_NW }
+};
+
 #undef TILE_SEQ_BEGIN
 #undef TILE_SEQ_LINE
 #undef TILE_SEQ_END
@@ -42,7 +71,13 @@
   0x543, 0x53C, 0x535, 0x538, 0x53D, 0x537, 0x53A, 0x536
 };
 
+static const SpriteID _road_frontwire_sprites_1[16] = {
+	0, 0x37, 0x37, 0x3F, 0x37, 0x37, 0x43, 0x37, 0x37, 0x3F, 0x37, 0x37, 0x3F, 0x37, 0x37, 0x37
+};
 
+static const SpriteID _road_backpole_sprites_1[16] = {
+	0, 0x38, 0x39, 0x40, 0x38, 0x38, 0x43, 0x3E, 0x39, 0x41, 0x39, 0x3C, 0x42, 0x3B, 0x3D, 0x3A
+};
 
 #define MAKELINE(a, b, c) { a, b, c },
 #define ENDLINE { 0, 0, 0 }
--- a/src/table/roadveh.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/roadveh.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file table/roadveh.h Data about how a road vehicle must drive on a tile */
+
 static const RoadDriveEntry _roadveh_drive_data_0[] = {
 	{15, 5},
 	{14, 5},
@@ -1009,7 +1011,7 @@
 	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
 };
 
-static const RoadDriveEntry * const _road_drive_data[] = {
+static const RoadDriveEntry * const _road_road_drive_data[] = {
 	_roadveh_drive_data_0,
 	_roadveh_drive_data_1,
 	_roadveh_drive_data_2,
@@ -1075,3 +1077,386 @@
 	NULL,
 	NULL,
 };
+
+static const RoadDriveEntry _roadveh_tram_turn_ne_0[] = {
+	{15, 5},
+	{14, 5},
+	{13, 5},
+	{12, 5},
+	{11, 5},
+	{10, 5},
+	{ 9, 5},
+	{ 8, 5},
+	{ 7, 5},
+	{ 6, 5},
+	{ 5, 5},
+	{ 4, 5},
+	{ 3, 5},
+	{ 2, 5},
+	{ 1, 5},
+	{ 0, 5},
+	{ 0, 6},
+	{ 0, 7},
+	{ 0, 8},
+	{ 0, 9},
+	{ 1, 9},
+	{ 2, 9},
+	{ 3, 9},
+	{ 4, 9},
+	{ 5, 9},
+	{ 6, 9},
+	{ 7, 9},
+	{ 8, 9},
+	{ 9, 9},
+	{10, 9},
+	{11, 9},
+	{12, 9},
+	{13, 9},
+	{14, 9},
+	{15, 9},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_ne_1[] = {
+	{15, 9},
+	{14, 9},
+	{13, 9},
+	{12, 9},
+	{11, 9},
+	{10, 9},
+	{ 9, 9},
+	{ 8, 9},
+	{ 7, 9},
+	{ 6, 9},
+	{ 5, 9},
+	{ 4, 9},
+	{ 3, 9},
+	{ 2, 9},
+	{ 1, 9},
+	{ 0, 9},
+	{ 0, 8},
+	{ 0, 7},
+	{ 0, 6},
+	{ 0, 5},
+	{ 1, 5},
+	{ 2, 5},
+	{ 3, 5},
+	{ 4, 5},
+	{ 5, 5},
+	{ 6, 5},
+	{ 7, 5},
+	{ 8, 5},
+	{ 9, 5},
+	{10, 5},
+	{11, 5},
+	{12, 5},
+	{13, 5},
+	{14, 5},
+	{15, 5},
+	{RDE_NEXT_TILE | DIAGDIR_SW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_se_0[] = {
+	{5,  0},
+	{5,  1},
+	{5,  2},
+	{5,  3},
+	{5,  4},
+	{5,  5},
+	{5,  6},
+	{5,  7},
+	{5,  8},
+	{5,  9},
+	{5, 10},
+	{5, 11},
+	{5, 12},
+	{5, 13},
+	{5, 14},
+	{5, 15},
+	{6, 15},
+	{7, 15},
+	{8, 15},
+	{9, 15},
+	{9, 14},
+	{9, 13},
+	{9, 12},
+	{9, 11},
+	{9, 10},
+	{9,  9},
+	{9,  8},
+	{9,  7},
+	{9,  6},
+	{9,  5},
+	{9,  4},
+	{9,  3},
+	{9,  2},
+	{9,  1},
+	{9,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_se_1[] = {
+	{9,  0},
+	{9,  1},
+	{9,  2},
+	{9,  3},
+	{9,  4},
+	{9,  5},
+	{9,  6},
+	{9,  7},
+	{9,  8},
+	{9,  9},
+	{9, 10},
+	{9, 11},
+	{9, 12},
+	{9, 13},
+	{9, 14},
+	{9, 15},
+	{8, 15},
+	{7, 15},
+	{6, 15},
+	{5, 15},
+	{5, 14},
+	{5, 13},
+	{5, 12},
+	{5, 11},
+	{5, 10},
+	{5,  9},
+	{5,  8},
+	{5,  7},
+	{5,  6},
+	{5,  5},
+	{5,  4},
+	{5,  3},
+	{5,  2},
+	{5,  1},
+	{5,  0},
+	{RDE_NEXT_TILE | DIAGDIR_NW, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_sw_0[] = {
+	{ 0, 9},
+	{ 1, 9},
+	{ 2, 9},
+	{ 3, 9},
+	{ 4, 9},
+	{ 5, 9},
+	{ 6, 9},
+	{ 7, 9},
+	{ 8, 9},
+	{ 9, 9},
+	{10, 9},
+	{11, 9},
+	{12, 9},
+	{13, 9},
+	{14, 9},
+	{15, 9},
+	{15, 8},
+	{15, 7},
+	{15, 6},
+	{15, 5},
+	{14, 5},
+	{13, 5},
+	{12, 5},
+	{11, 5},
+	{10, 5},
+	{ 9, 5},
+	{ 8, 5},
+	{ 7, 5},
+	{ 6, 5},
+	{ 5, 5},
+	{ 4, 5},
+	{ 3, 5},
+	{ 2, 5},
+	{ 1, 5},
+	{ 0, 5},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+static const RoadDriveEntry _roadveh_tram_turn_sw_1[] = {
+	{ 0, 5},
+	{ 1, 5},
+	{ 2, 5},
+	{ 3, 5},
+	{ 4, 5},
+	{ 5, 5},
+	{ 6, 5},
+	{ 7, 5},
+	{ 8, 5},
+	{ 9, 5},
+	{10, 5},
+	{11, 5},
+	{12, 5},
+	{13, 5},
+	{14, 5},
+	{15, 5},
+	{15, 6},
+	{15, 7},
+	{15, 8},
+	{15, 9},
+	{14, 9},
+	{13, 9},
+	{12, 9},
+	{11, 9},
+	{10, 9},
+	{ 9, 9},
+	{ 8, 9},
+	{ 7, 9},
+	{ 6, 9},
+	{ 5, 9},
+	{ 4, 9},
+	{ 3, 9},
+	{ 2, 9},
+	{ 1, 9},
+	{ 0, 9},
+	{RDE_NEXT_TILE | DIAGDIR_NE, 0}
+};
+
+static const RoadDriveEntry _roadveh_tram_turn_nw_0[] = {
+	{9, 15},
+	{9, 14},
+	{9, 13},
+	{9, 12},
+	{9, 11},
+	{9, 10},
+	{9,  9},
+	{9,  8},
+	{9,  7},
+	{9,  6},
+	{9,  5},
+	{9,  4},
+	{9,  3},
+	{9,  2},
+	{9,  1},
+	{9,  0},
+	{8,  0},
+	{7,  0},
+	{6,  0},
+	{5,  0},
+	{5,  1},
+	{5,  2},
+	{5,  3},
+	{5,  4},
+	{5,  5},
+	{5,  6},
+	{5,  7},
+	{5,  8},
+	{5,  9},
+	{5, 10},
+	{5, 11},
+	{5, 12},
+	{5, 13},
+	{5, 14},
+	{5, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+static const RoadDriveEntry _roadveh_tram_turn_nw_1[] = {
+	{5, 15},
+	{5, 14},
+	{5, 13},
+	{5, 12},
+	{5, 11},
+	{5, 10},
+	{5,  9},
+	{5,  8},
+	{5,  7},
+	{5,  6},
+	{5,  5},
+	{5,  4},
+	{5,  3},
+	{5,  2},
+	{5,  1},
+	{5,  0},
+	{6,  0},
+	{7,  0},
+	{8,  0},
+	{9,  0},
+	{9,  1},
+	{9,  2},
+	{9,  3},
+	{9,  4},
+	{9,  5},
+	{9,  6},
+	{9,  7},
+	{9,  8},
+	{9,  9},
+	{9, 10},
+	{9, 11},
+	{9, 12},
+	{9, 13},
+	{9, 14},
+	{9, 15},
+	{RDE_NEXT_TILE | DIAGDIR_SE, 0}
+};
+
+static const RoadDriveEntry * const _road_tram_drive_data[] = {
+	_roadveh_drive_data_0,
+	_roadveh_drive_data_1,
+	_roadveh_drive_data_2,
+	_roadveh_drive_data_3,
+	_roadveh_drive_data_4,
+	_roadveh_drive_data_5,
+	_roadveh_tram_turn_ne_0,
+	_roadveh_tram_turn_se_0,
+	_roadveh_drive_data_8,
+	_roadveh_drive_data_9,
+	_roadveh_drive_data_10,
+	_roadveh_drive_data_11,
+	_roadveh_drive_data_12,
+	_roadveh_drive_data_13,
+	_roadveh_tram_turn_sw_0,
+	_roadveh_tram_turn_nw_0,
+	_roadveh_drive_data_16,
+	_roadveh_drive_data_17,
+	_roadveh_drive_data_18,
+	_roadveh_drive_data_19,
+	_roadveh_drive_data_20,
+	_roadveh_drive_data_21,
+	_roadveh_tram_turn_ne_1,
+	_roadveh_tram_turn_se_1,
+	_roadveh_drive_data_24,
+	_roadveh_drive_data_25,
+	_roadveh_drive_data_26,
+	_roadveh_drive_data_27,
+	_roadveh_drive_data_28,
+	_roadveh_drive_data_29,
+	_roadveh_tram_turn_sw_1,
+	_roadveh_tram_turn_nw_1,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+};
+
+static const RoadDriveEntry * const * const _road_drive_data[2] = {
+	_road_road_drive_data,
+	_road_tram_drive_data,
+};
--- a/src/table/sprites.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/sprites.h	Sat Jun 02 19:59:29 2007 +0000
@@ -25,7 +25,7 @@
  * All sprites which are described here are referenced only one to a handful of times
  * throughout the code. When introducing new sprite enums, use meaningful names.
  * Don't be lazy and typing, and only use abbrevations when their meaning is clear or
- * the length of the enum would get out of hand. In that case EXPLAIN THE ABBREVATION
+ * the length of the enum would get out of hand. In that case EXPLAIN THE ABBREVATION
  * IN THIS FILE, and perhaps add some comments in the code where it is used.
  * Now, don't whine about this being too much typing work if the enums are like
  * 30 characters in length. If your editor doen't help you simplifying your work,
@@ -47,7 +47,7 @@
 	SPR_ASCII_SPACE_BIG   = 450,
 
 	/* Extra graphic spritenumbers */
-	OPENTTD_SPRITES_COUNT = 117, // number of gfx-sprites in openttd.grf
+	OPENTTD_SPRITES_COUNT = 112, // 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,
@@ -62,44 +62,43 @@
 	SPR_PIN_DOWN      = SPR_OPENTTD_BASE + 56,
 	SPR_BOX_EMPTY     = SPR_OPENTTD_BASE + 59,
 	SPR_BOX_CHECKED   = SPR_OPENTTD_BASE + 60,
-	SPR_WINDOW_RESIZE = SPR_OPENTTD_BASE + 87,   // resize icon
-	SPR_HOUSE_ICON    = SPR_OPENTTD_BASE + 94,
+	SPR_WINDOW_RESIZE = SPR_OPENTTD_BASE + 82,   // resize icon
+	SPR_HOUSE_ICON    = SPR_OPENTTD_BASE + 89,
 	// arrow icons pointing in all 4 directions
-	SPR_ARROW_DOWN    = SPR_OPENTTD_BASE + 88,
-	SPR_ARROW_UP      = SPR_OPENTTD_BASE + 89,
-	SPR_ARROW_LEFT    = SPR_OPENTTD_BASE + 90,
-	SPR_ARROW_RIGHT   = SPR_OPENTTD_BASE + 91,
+	SPR_ARROW_DOWN    = SPR_OPENTTD_BASE + 83,
+	SPR_ARROW_UP      = SPR_OPENTTD_BASE + 84,
+	SPR_ARROW_LEFT    = SPR_OPENTTD_BASE + 85,
+	SPR_ARROW_RIGHT   = SPR_OPENTTD_BASE + 86,
 
 	SPR_LARGE_SMALL_WINDOW = 682,
 
 	/* Clone vehicles stuff */
-	SPR_CLONE_TRAIN    = SPR_OPENTTD_BASE + 92,
-	SPR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 109,
-	SPR_CLONE_SHIP     = SPR_OPENTTD_BASE + 111,
-	SPR_CLONE_AIRCRAFT = SPR_OPENTTD_BASE + 113,
+	SPR_CLONE_TRAIN    = SPR_OPENTTD_BASE + 87,
+	SPR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 104,
+	SPR_CLONE_SHIP     = SPR_OPENTTD_BASE + 106,
+	SPR_CLONE_AIRCRAFT = SPR_OPENTTD_BASE + 108,
 
-	SPR_SELL_TRAIN        = SPR_OPENTTD_BASE + 96,
-	SPR_SELL_ROADVEH      = SPR_OPENTTD_BASE + 97,
-	SPR_SELL_SHIP         = SPR_OPENTTD_BASE + 98,
-	SPR_SELL_AIRCRAFT     = SPR_OPENTTD_BASE + 99,
-	SPR_SELL_ALL_TRAIN    = SPR_OPENTTD_BASE + 100,
-	SPR_SELL_ALL_ROADVEH  = SPR_OPENTTD_BASE + 101,
-	SPR_SELL_ALL_SHIP     = SPR_OPENTTD_BASE + 102,
-	SPR_SELL_ALL_AIRCRAFT = SPR_OPENTTD_BASE + 103,
-	SPR_REPLACE_TRAIN     = SPR_OPENTTD_BASE + 104,
-	SPR_REPLACE_ROADVEH   = SPR_OPENTTD_BASE + 105,
-	SPR_REPLACE_SHIP      = SPR_OPENTTD_BASE + 106,
-	SPR_REPLACE_AIRCRAFT  = SPR_OPENTTD_BASE + 107,
-	SPR_SELL_CHAIN_TRAIN  = SPR_OPENTTD_BASE + 108,
+	SPR_SELL_TRAIN        = SPR_OPENTTD_BASE + 91,
+	SPR_SELL_ROADVEH      = SPR_OPENTTD_BASE + 92,
+	SPR_SELL_SHIP         = SPR_OPENTTD_BASE + 93,
+	SPR_SELL_AIRCRAFT     = SPR_OPENTTD_BASE + 94,
+	SPR_SELL_ALL_TRAIN    = SPR_OPENTTD_BASE + 95,
+	SPR_SELL_ALL_ROADVEH  = SPR_OPENTTD_BASE + 96,
+	SPR_SELL_ALL_SHIP     = SPR_OPENTTD_BASE + 97,
+	SPR_SELL_ALL_AIRCRAFT = SPR_OPENTTD_BASE + 98,
+	SPR_REPLACE_TRAIN     = SPR_OPENTTD_BASE + 99,
+	SPR_REPLACE_ROADVEH   = SPR_OPENTTD_BASE + 100,
+	SPR_REPLACE_SHIP      = SPR_OPENTTD_BASE + 101,
+	SPR_REPLACE_AIRCRAFT  = SPR_OPENTTD_BASE + 102,
+	SPR_SELL_CHAIN_TRAIN  = SPR_OPENTTD_BASE + 103,
 
-	SPR_SHARED_ORDERS_ICON = SPR_OPENTTD_BASE + 115,
+	SPR_SHARED_ORDERS_ICON = SPR_OPENTTD_BASE + 110,
 
-	SPR_WARNING_SIGN      = SPR_OPENTTD_BASE + 116, // warning sign (shown if there are any newgrf errors)
+	SPR_WARNING_SIGN      = SPR_OPENTTD_BASE + 111, // 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)
-	SPR_FLAGS_BASE = SPR_OPENTTD_BASE + 83, // start of the flags block (in same order as enum NetworkLanguage)
 
 	SPR_AIRPORTX_BASE = SPR_OPENTTD_BASE + OPENTTD_SPRITES_COUNT, // The sprites used for other airport angles
 	SPR_NEWAIRPORT_TARMAC = SPR_AIRPORTX_BASE,
@@ -128,6 +127,52 @@
 	SPR_TRUCK_STOP_DT_X_W = SPR_ROADSTOP_BASE + 6,
 	SPR_TRUCK_STOP_DT_X_E = SPR_ROADSTOP_BASE + 7,
 
+	SPR_GROUP_BASE                 = SPR_ROADSTOP_BASE + 8, // The sprites used for the group interface
+	SPR_GROUP_CREATE_TRAIN         = SPR_GROUP_BASE,
+	SPR_GROUP_CREATE_ROADVEH       = SPR_GROUP_BASE + 1,
+	SPR_GROUP_CREATE_SHIP          = SPR_GROUP_BASE + 2,
+	SPR_GROUP_CREATE_AIRCRAFT      = SPR_GROUP_BASE + 3,
+	SPR_GROUP_DELETE_TRAIN         = SPR_GROUP_BASE + 4,
+	SPR_GROUP_DELETE_ROADVEH       = SPR_GROUP_BASE + 5,
+	SPR_GROUP_DELETE_SHIP          = SPR_GROUP_BASE + 6,
+	SPR_GROUP_DELETE_AIRCRAFT      = SPR_GROUP_BASE + 7,
+	SPR_GROUP_RENAME_TRAIN         = SPR_GROUP_BASE + 8,
+	SPR_GROUP_RENAME_ROADVEH       = SPR_GROUP_BASE + 9,
+	SPR_GROUP_RENAME_SHIP          = SPR_GROUP_BASE + 10,
+	SPR_GROUP_RENAME_AIRCRAFT      = SPR_GROUP_BASE + 11,
+	SPR_GROUP_REPLACE_ON_TRAIN     = SPR_GROUP_BASE + 12,
+	SPR_GROUP_REPLACE_ON_ROADVEH   = SPR_GROUP_BASE + 13,
+	SPR_GROUP_REPLACE_ON_SHIP      = SPR_GROUP_BASE + 14,
+	SPR_GROUP_REPLACE_ON_AIRCRAFT  = SPR_GROUP_BASE + 15,
+	SPR_GROUP_REPLACE_OFF_TRAIN    = SPR_GROUP_BASE + 16,
+	SPR_GROUP_REPLACE_OFF_ROADVEH  = SPR_GROUP_BASE + 17,
+	SPR_GROUP_REPLACE_OFF_SHIP     = SPR_GROUP_BASE + 18,
+	SPR_GROUP_REPLACE_OFF_AIRCRAFT = SPR_GROUP_BASE + 19,
+
+	/* Tramway sprites */
+	SPR_TRAMWAY_BASE                 = SPR_GROUP_BASE + 20,
+	SPR_TRAMWAY_OVERLAY              = SPR_TRAMWAY_BASE + 4,
+	SPR_TRAMWAY_TRAM                 = SPR_TRAMWAY_BASE + 27,
+	SPR_TRAMWAY_SLOPED_OFFSET        = 11,
+	SPR_TRAMWAY_BUS_STOP_DT_Y_W      = SPR_TRAMWAY_BASE + 25,
+	SPR_TRAMWAY_BUS_STOP_DT_Y_E      = SPR_TRAMWAY_BASE + 23,
+	SPR_TRAMWAY_BUS_STOP_DT_X_W      = SPR_TRAMWAY_BASE + 24,
+	SPR_TRAMWAY_BUS_STOP_DT_X_E      = SPR_TRAMWAY_BASE + 26,
+	SPR_TRAMWAY_PAVED_STRAIGHT_Y     = SPR_TRAMWAY_BASE + 46,
+	SPR_TRAMWAY_PAVED_STRAIGHT_X     = SPR_TRAMWAY_BASE + 47,
+	SPR_TRAMWAY_BACK_WIRES_STRAIGHT  = SPR_TRAMWAY_BASE + 55,
+	SPR_TRAMWAY_FRONT_WIRES_STRAIGHT = SPR_TRAMWAY_BASE + 56,
+	SPR_TRAMWAY_BACK_WIRES_SLOPED    = SPR_TRAMWAY_BASE + 72,
+	SPR_TRAMWAY_FRONT_WIRES_SLOPED   = SPR_TRAMWAY_BASE + 68,
+	SPR_TRAMWAY_TUNNEL_WIRES         = SPR_TRAMWAY_BASE + 80,
+	SPR_TRAMWAY_BRIDGE               = SPR_TRAMWAY_BASE + 107,
+
+	/* One way road sprites */
+	SPR_ONEWAY_BASE = SPR_TRAMWAY_BASE + 113,
+
+	/* Flags sprites (in same order as enum NetworkLanguage) */
+	SPR_FLAGS_BASE = SPR_ONEWAY_BASE + 6,
+
 	/* Manager face sprites */
 	SPR_GRADIENT = 874, // background gradient behind manager face
 
@@ -940,7 +985,6 @@
 	SPR_IMG_LEVEL_LAND      = SPR_OPENTTD_BASE + 61,
 	SPR_IMG_BUILD_CANAL     = SPR_OPENTTD_BASE + 58,
 	SPR_IMG_BUILD_LOCK      = SPR_CANALS_BASE + 69,
-	SPR_IMG_PLACE_SIGN      = SPR_OPENTTD_BASE + 63,
 	SPR_IMG_PAUSE           = 726,
 	SPR_IMG_FASTFORWARD     = SPR_OPENTTD_BASE + 54,
 	SPR_IMG_SETTINGS        = 751,
@@ -1157,6 +1201,8 @@
 	SPR_IMG_BRIDGE        = 2594,
 	SPR_IMG_ROAD_TUNNEL   = 2429,
 	SPR_IMG_REMOVE        = 714,
+	SPR_IMG_TRAMWAY_NW    = SPR_TRAMWAY_BASE + 0,
+	SPR_IMG_TRAMWAY_NE    = SPR_TRAMWAY_BASE + 1,
 
 	/* rail_gui.c */
 	SPR_IMG_RAIL_NS    = 1251,
@@ -1273,16 +1319,18 @@
 	/* road cursors */
 	SPR_CURSOR_ROAD_NESW      = 1311,
 	SPR_CURSOR_ROAD_NWSE      = 1312,
+	SPR_CURSOR_TRAMWAY_NESW   = SPR_TRAMWAY_BASE + 2,
+	SPR_CURSOR_TRAMWAY_NWSE   = SPR_TRAMWAY_BASE + 3,
 
 	SPR_CURSOR_ROAD_DEPOT     = 1297,
 	SPR_CURSOR_BUS_STATION    = 2725,
 	SPR_CURSOR_TRUCK_STATION  = 2726,
 	SPR_CURSOR_ROAD_TUNNEL    = 2433,
 
-	SPR_CURSOR_CLONE_TRAIN    = SPR_OPENTTD_BASE +  93,
-	SPR_CURSOR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 110,
-	SPR_CURSOR_CLONE_SHIP     = SPR_OPENTTD_BASE + 112,
-	SPR_CURSOR_CLONE_AIRPLANE = SPR_OPENTTD_BASE + 114,
+	SPR_CURSOR_CLONE_TRAIN    = SPR_OPENTTD_BASE +  88,
+	SPR_CURSOR_CLONE_ROADVEH  = SPR_OPENTTD_BASE + 105,
+	SPR_CURSOR_CLONE_SHIP     = SPR_OPENTTD_BASE + 107,
+	SPR_CURSOR_CLONE_AIRPLANE = SPR_OPENTTD_BASE + 109
 };
 
 /// Animation macro in table/animcursors.h (_animcursors[])
@@ -1302,7 +1350,7 @@
  * <li> TRANSPARENT_BIT is the bit number which toggles sprite transparency</li>
  * <li> RECOLOR_BIT toggles the recoloring system</li>
  * <li> PALETTE_SPRITE_WIDTH and PALETTE_SPRITE_START determine the position and number of
- * bits used for the recoloring process. For transparency, it must be 0x322.</li>
+ * bits used for the recoloring process. For transparency, it must be 0x322.</li></ul>
  */
 enum SpriteSetup {
 	TRANSPARENT_BIT = 31,       ///< toggles transparency in the sprite
--- a/src/table/station_land.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/station_land.h	Sat Jun 02 19:59:29 2007 +0000
@@ -34,7 +34,7 @@
 	{  0,  0,  0, 16,  5,  7, SPR_RAIL_PLATFORM_PILLARS_X_REAR | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{  0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_FRONT        | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_X_TILE_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,(byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
 	TILE_SEQ_END()
 };
 
@@ -42,7 +42,7 @@
 	{  0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_PILLARS_Y_REAR | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{ 11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_FRONT        | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_Y_TILE_A | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,(byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_A     | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
 	TILE_SEQ_END()
 };
 
@@ -50,7 +50,7 @@
 	{  0,  0,  0, 16,  5,  2, SPR_RAIL_PLATFORM_X_REAR          | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{  0, 11,  0, 16,  5,  2, SPR_RAIL_PLATFORM_PILLARS_X_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_X_TILE_B  | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,(byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_X_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
 	TILE_SEQ_END()
 };
 
@@ -58,7 +58,7 @@
 	{  0,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_Y_REAR          | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{ 11,  0,  0,  5, 16,  2, SPR_RAIL_PLATFORM_PILLARS_Y_FRONT | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
 	{  0,  0, 16, 16, 16, 10, SPR_RAIL_ROOF_STRUCTURE_Y_TILE_B  | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE },
-	{  0,  0,(byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
+	{  0,  0, (byte)0x80, 0,  0,  0, SPR_RAIL_ROOF_GLASS_Y_TILE_B      | (1 << PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT },
 	TILE_SEQ_END()
 };
 
--- a/src/table/town_land.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/town_land.h	Sat Jun 02 19:59:29 2007 +0000
@@ -5,17 +5,19 @@
 
 /** Writes the data into the Town Tile Drawing Struct
  * @param s1 The first sprite of the building, mostly the ground sprite
+ * @param p1 The first sprite's palette of the building, mostly the ground sprite
  * @param s2 The second sprite of the building.
+ * @param p2 The second sprite's palette of the building.
  * @param sx The x-position of the sprite within the tile
- * @param xy the y-position of the sprite within the tile
+ * @param sy the y-position of the sprite within the tile
  * @param w the width of the sprite
  * @param h the height of the sprite
  * @param dz the virtual height of the sprite
- * @param p set to 1 if a lift is present
- * @see DrawTownTileStruct
- */
+ * @param p set to 1 if a lift is present ()
+ * @see DrawBuildingsTileStruct */
 #define M(s1, p1, s2, p2, sx, sy, w, h, dz, p) { { s1, p1 }, { s2, p2 }, sx, sy, w - 1, h - 1, dz, p}
 
+/** structure of houses graphics*/
 static const DrawBuildingsTileStruct _town_draw_tile_data[] = {
 	M( 0xf54, PAL_NONE,  0x58d, PAL_NONE,  0,  0, 14, 14,   8, 0),
 	M( 0xf54, PAL_NONE,  0x58e, PAL_NONE,  0,  0, 14, 14,  60, 0),
@@ -1779,7 +1781,7 @@
 	M(0x1244, PAL_NONE, 0x125a, PAL_NONE,  0,  0, 16, 16,  50, 0),
 };
 #undef M
-/* 4 variants * 4 build stages */
+/** Make sure we have the right number of elements: 4 variants * 4 build stages for each house */
 assert_compile(lengthof(_town_draw_tile_data) == (NEW_HOUSE_OFFSET) * 4 * 4);
 
 /** Describes the data that defines each house in the game
@@ -1800,9 +1802,10 @@
  * @param cg3 3rd CargoID available
  * @see HouseSpec
  */
-#define M(mnd, mxd, p, rc, bn, rr, mg, ca1, ca2, ca3, bf, ba, cg1, cg2, cg3) \
+#define MS(mnd, mxd, p, rc, bn, rr, mg, ca1, ca2, ca3, bf, ba, cg1, cg2, cg3) \
 	{mnd, mxd, p, rc, bn, rr, mg, {ca1, ca2, ca3}, {cg1, cg2, cg3}, bf, ba, true, \
-	 0, NULL, 0, 0, {0, 0, 0, 0}, 16, NO_EXTRA_FLAG, HOUSE_NO_CLASS, 0, 2, 0, 0, NULL}
+	 0, NULL, 0, 0, {0, 0, 0, 0}, 16, NO_EXTRA_FLAG, HOUSE_NO_CLASS, 0, 2, 0, 0, 0, NULL}
+/** House specifications from original data */
 static const HouseSpec _original_house_specs[] = {
 	/**
 	 *                                                              remove_rating_decrease
@@ -1818,446 +1821,448 @@
 	 * +-building_availability |    |                                |    |    |    |    |
 	 * +-cargoID accepted |    |    |                                |    |    |    |    |
 	 * |   |         |    |    |    |                                |    |    |    |    | */
-	M( 1963, MAX_YEAR, 187, 150, STR_200F_TALL_OFFICE_BLOCK,      140,  70,   8,   3,   4,
+	MS(1963, MAX_YEAR, 187, 150, STR_200F_TALL_OFFICE_BLOCK,      140,  70,   8,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //00
-	M( 1957, MAX_YEAR,  85, 140, STR_2010_OFFICE_BLOCK,           130,  55,   8,   3,   4,
+	MS(1957, MAX_YEAR,  85, 140, STR_2010_OFFICE_BLOCK,           130,  55,   8,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //01
-	M( 1968, MAX_YEAR,  40, 100, STR_2011_SMALL_BLOCK_OF_FLATS,    90,  20,   8,   3,   1,
+	MS(1968, MAX_YEAR,  40, 100, STR_2011_SMALL_BLOCK_OF_FLATS,    90,  20,   8,   3,   1,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //02
-	M(    0, MAX_YEAR,   5,  90, STR_2012_CHURCH,                 230,   2,   2,   0,   0,
+	MS(   0, MAX_YEAR,   5,  90, STR_2012_CHURCH,                 230,   2,   2,   0,   0,
 	   BUILDING_IS_CHURCH | TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //03
-	M( 1975, MAX_YEAR, 220, 160, STR_2013_LARGE_OFFICE_BLOCK,     160,  85,  10,   4,   6,
+	MS(1975, MAX_YEAR, 220, 160, STR_2013_LARGE_OFFICE_BLOCK,     160,  85,  10,   4,   6,
 	   BUILDING_IS_ANIMATED | TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //04
-	M( 1975, MAX_YEAR, 220, 160, STR_2013_LARGE_OFFICE_BLOCK,     160,  85,  10,   4,   6,
+	MS(1975, MAX_YEAR, 220, 160, STR_2013_LARGE_OFFICE_BLOCK,     160,  85,  10,   4,   6,
 	   BUILDING_IS_ANIMATED | TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE  | HZ_ZON5,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //05
-	M(    0, MAX_YEAR,  30,  80, STR_2014_TOWN_HOUSES,             80,  12,   4,   1,   0,
+	MS(   0, MAX_YEAR,  30,  80, STR_2014_TOWN_HOUSES,             80,  12,   4,   1,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //06
-	M( 1959, MAX_YEAR, 140, 180, STR_2015_HOTEL,                  150,  22,   6,   1,   2,
+	MS(1959, MAX_YEAR, 140, 180, STR_2015_HOTEL,                  150,  22,   6,   1,   2,
 	   TILE_SIZE_1x2,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //07
-	M( 1959, MAX_YEAR,   0, 180, STR_2015_HOTEL,                  150,  22,   6,   1,   2,
+	MS(1959, MAX_YEAR,   0, 180, STR_2015_HOTEL,                  150,  22,   6,   1,   2,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //08
-	M( 1945, MAX_YEAR,   0,  65, STR_2016_STATUE,                  40,   0,   2,   0,   0,
+	MS(1945, MAX_YEAR,   0,  65, STR_2016_STATUE,                  40,   0,   2,   0,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //09
-	M( 1945, MAX_YEAR,   0,  65, STR_2017_FOUNTAIN,                40,   0,   2,   0,   0,
+	MS(1945, MAX_YEAR,   0,  65, STR_2017_FOUNTAIN,                40,   0,   2,   0,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //0A
-	M(    0, MAX_YEAR,   0,  60, STR_2018_PARK,                    75,   0,   2,   0,   0,
+	MS(   0, MAX_YEAR,   0,  60, STR_2018_PARK,                    75,   0,   2,   0,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //0B
-	M( 1935, MAX_YEAR,   0,  60, STR_2018_PARK,                    75,   0,   2,   0,   0,
+	MS(1935, MAX_YEAR,   0,  60, STR_2018_PARK,                    75,   0,   2,   0,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //0C
-	M( 1951, MAX_YEAR, 150, 130, STR_2019_OFFICE_BLOCK,           110,  65,   8,   2,   4,
+	MS(1951, MAX_YEAR, 150, 130, STR_2019_OFFICE_BLOCK,           110,  65,   8,   2,   4,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //0D
-	M( 1930, 1960,      95, 110, STR_201A_SHOPS_AND_OFFICES,      100,  48,   6,   2,   3,
+	MS(1930, 1960,      95, 110, STR_201A_SHOPS_AND_OFFICES,      100,  48,   6,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //0E
-	M( 1930, 1960,      95, 105, STR_201A_SHOPS_AND_OFFICES,      100,  48,   6,   2,   3,
+	MS(1930, 1960,      95, 105, STR_201A_SHOPS_AND_OFFICES,      100,  48,   6,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //0F
-	M( 1930, 1960,      95, 107, STR_201A_SHOPS_AND_OFFICES,      100,  48,   6,   2,   3,
+	MS(1930, 1960,      95, 107, STR_201A_SHOPS_AND_OFFICES,      100,  48,   6,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //10
-	M( 1977, MAX_YEAR, 130, 200, STR_201B_MODERN_OFFICE_BUILDING, 150,  50,  10,   3,   6,
+	MS(1977, MAX_YEAR, 130, 200, STR_201B_MODERN_OFFICE_BUILDING, 150,  50,  10,   3,   6,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //11
-	M( 1983, MAX_YEAR,   6, 145, STR_201C_WAREHOUSE,              110,  10,   6,   3,   8,
+	MS(1983, MAX_YEAR,   6, 145, STR_201C_WAREHOUSE,              110,  10,   6,   3,   8,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //12
-	M( 1985, MAX_YEAR, 110, 155, STR_201D_OFFICE_BLOCK,           110,  55,   6,   2,   6,
+	MS(1985, MAX_YEAR, 110, 155, STR_201D_OFFICE_BLOCK,           110,  55,   6,   2,   6,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //13
-	M(    0, MAX_YEAR,  65, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
+	MS(   0, MAX_YEAR,  65, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
 	   BUILDING_IS_STADIUM | TILE_SIZE_2x2,
 	   HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //14
-	M(    0, MAX_YEAR,   0, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
+	MS(   0, MAX_YEAR,   0, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //15
-	M(    0, MAX_YEAR,   0, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
+	MS(   0, MAX_YEAR,   0, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //16
-	M(    0, MAX_YEAR,   0, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
+	MS(   0, MAX_YEAR,   0, 250, STR_201E_STADIUM,                300,   5,   4,   0,   0,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //17
-	M(    0, 1951,      15,  70, STR_201F_OLD_HOUSES,              75,   6,   3,   1,   0,
+	MS(   0, 1951,      15,  70, STR_201F_OLD_HOUSES,              75,   6,   3,   1,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //18
-	M(    0, 1952,      12,  75, STR_2036_COTTAGES,                75,   7,   3,   1,   0,
+	MS(   0, 1952,      12,  75, STR_2036_COTTAGES,                75,   7,   3,   1,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //19
-	M( 1931, MAX_YEAR,  13,  71, STR_2037_HOUSES,                  75,   8,   3,   1,   0,
+	MS(1931, MAX_YEAR,  13,  71, STR_2037_HOUSES,                  75,   8,   3,   1,   0,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //1A
-	M( 1935, MAX_YEAR, 100, 135, STR_2038_FLATS,                  100,  35,   7,   2,   2,
+	MS(1935, MAX_YEAR, 100, 135, STR_2038_FLATS,                  100,  35,   7,   2,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //1B
-	M( 1963, MAX_YEAR, 170, 145, STR_2039_TALL_OFFICE_BLOCK,      170,  50,   8,   3,   3,
+	MS(1963, MAX_YEAR, 170, 145, STR_2039_TALL_OFFICE_BLOCK,      170,  50,   8,   3,   3,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //1C
-	M(    0, 1955,     100, 132, STR_203A_SHOPS_AND_OFFICES,      135,  40,   6,   2,   3,
+	MS(   0, 1955,     100, 132, STR_203A_SHOPS_AND_OFFICES,      135,  40,   6,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //1D
-	M( 1973, MAX_YEAR, 180, 155, STR_203B_SHOPS_AND_OFFICES,      180,  64,   8,   3,   3,
+	MS(1973, MAX_YEAR, 180, 155, STR_203B_SHOPS_AND_OFFICES,      180,  64,   8,   3,   3,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //1E
-	M(    0, MAX_YEAR,  35, 220, STR_203C_THEATER,                230,  23,   8,   2,   2,
+	MS(   0, MAX_YEAR,  35, 220, STR_203C_THEATER,                230,  23,   8,   2,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //1F
-	M( 1958, MAX_YEAR,  65, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
+	MS(1958, MAX_YEAR,  65, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
 	   BUILDING_IS_STADIUM | TILE_SIZE_2x2,
 	   HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //20
-	M( 1958, MAX_YEAR,   0, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
+	MS(1958, MAX_YEAR,   0, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //21
-	M( 1958, MAX_YEAR,   0, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
+	MS(1958, MAX_YEAR,   0, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //22
-	M( 1958, MAX_YEAR,   0, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
+	MS(1958, MAX_YEAR,   0, 250, STR_203D_STADIUM,                300,   5,   4,   0,   0,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //23
-	M( 2000, MAX_YEAR, 140, 170, STR_203E_OFFICES,                250,  65,   8,   3,   2,
+	MS(2000, MAX_YEAR, 140, 170, STR_203E_OFFICES,                250,  65,   8,   3,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //24
-	M(    0, 1960,      15,  70, STR_203F_HOUSES,                  75,   6,   3,   1,   1,
+	MS(   0, 1960,      15,  70, STR_203F_HOUSES,                  75,   6,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //25
-	M(    0, 1960,      15,  70, STR_203F_HOUSES,                  75,   6,   3,   1,   1,
+	MS(   0, 1960,      15,  70, STR_203F_HOUSES,                  75,   6,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //26
-	M( 1945, MAX_YEAR,  35, 210, STR_2040_CINEMA,                 230,  23,   8,   2,   2,
+	MS(1945, MAX_YEAR,  35, 210, STR_2040_CINEMA,                 230,  23,   8,   2,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //27
-	M( 1983, MAX_YEAR, 180, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
+	MS(1983, MAX_YEAR, 180, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
 	   TILE_SIZE_2x2,
 	   HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 |HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //28
-	M( 1983, MAX_YEAR,   0, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
+	MS(1983, MAX_YEAR,   0, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //29
-	M( 1983, MAX_YEAR,   0, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
+	MS(1983, MAX_YEAR,   0, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //2A
-	M( 1983, MAX_YEAR,   0, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
+	MS(1983, MAX_YEAR,   0, 250, STR_2041_SHOPPING_MALL,          300,   5,   8,   2,   3,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //2B
-	M(    0, MAX_YEAR,  80, 100, STR_2038_FLATS,                   90,  20,   5,   2,   2,
+	MS(   0, MAX_YEAR,  80, 100, STR_2038_FLATS,                   90,  20,   5,   2,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //2C
-	M(    0, MAX_YEAR,  80, 100, STR_2038_FLATS,                   90,  20,   5,   2,   2,
+	MS(   0, MAX_YEAR,  80, 100, STR_2038_FLATS,                   90,  20,   5,   2,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE  | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //2D
-	M(    0, MAX_YEAR,  16,  70, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  16,  70, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //2E
-	M(    0, MAX_YEAR,  16,  70, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  16,  70, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //2F
-	M(    0, 1963,      14,  80, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
+	MS(   0, 1963,      14,  80, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //30
-	M(    0, 1963,      14,  80, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
+	MS(   0, 1963,      14,  80, STR_203F_HOUSES,                  70,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //31
-	M( 1966, MAX_YEAR, 135, 150, STR_200F_TALL_OFFICE_BLOCK,      120,  60,   8,   3,   4,
+	MS(1966, MAX_YEAR, 135, 150, STR_200F_TALL_OFFICE_BLOCK,      120,  60,   8,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //32
-	M( 1966, MAX_YEAR, 135, 150, STR_200F_TALL_OFFICE_BLOCK,      120,  60,   8,   3,   4,
+	MS(1966, MAX_YEAR, 135, 150, STR_200F_TALL_OFFICE_BLOCK,      120,  60,   8,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //33
-	M( 1970, MAX_YEAR, 170, 170, STR_200F_TALL_OFFICE_BLOCK,      130,  70,   9,   3,   4,
+	MS(1970, MAX_YEAR, 170, 170, STR_200F_TALL_OFFICE_BLOCK,      130,  70,   9,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //34
-	M( 1970, MAX_YEAR, 170, 170, STR_200F_TALL_OFFICE_BLOCK,      130,  70,   9,   3,   4,
+	MS(1970, MAX_YEAR, 170, 170, STR_200F_TALL_OFFICE_BLOCK,      130,  70,   9,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //35
-	M( 1974, MAX_YEAR, 210, 200, STR_200F_TALL_OFFICE_BLOCK,      140,  80,  10,   3,   5,
+	MS(1974, MAX_YEAR, 210, 200, STR_200F_TALL_OFFICE_BLOCK,      140,  80,  10,   3,   5,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //36
-	M( 1974, MAX_YEAR, 210, 200, STR_200F_TALL_OFFICE_BLOCK,      140,  80,  10,   3,   5,
+	MS(1974, MAX_YEAR, 210, 200, STR_200F_TALL_OFFICE_BLOCK,      140,  80,  10,   3,   5,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //37
-	M(    0, MAX_YEAR,  10,  60, STR_203F_HOUSES,                  60,   5,   2,   1,   1,
+	MS(   0, MAX_YEAR,  10,  60, STR_203F_HOUSES,                  60,   5,   2,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //38
-	M(    0, MAX_YEAR,  10,  60, STR_203F_HOUSES,                  60,   5,   2,   1,   1,
+	MS(   0, MAX_YEAR,  10,  60, STR_203F_HOUSES,                  60,   5,   2,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //39
-	M(    0, MAX_YEAR,  25, 100, STR_201A_SHOPS_AND_OFFICES,       80,  20,   3,   1,   1,
+	MS(   0, MAX_YEAR,  25, 100, STR_201A_SHOPS_AND_OFFICES,       80,  20,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //3A
-	M(    0, MAX_YEAR,  25, 100, STR_201A_SHOPS_AND_OFFICES,       80,  20,   3,   1,   1,
+	MS(   0, MAX_YEAR,  25, 100, STR_201A_SHOPS_AND_OFFICES,       80,  20,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //3B
-	M(    0, MAX_YEAR,   6,  85, STR_2012_CHURCH,                 230,   2,   2,   0,   0,
+	MS(   0, MAX_YEAR,   6,  85, STR_2012_CHURCH,                 230,   2,   2,   0,   0,
 	   BUILDING_IS_CHURCH | TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //3C
-	M(    0, MAX_YEAR,   6,  85, STR_2012_CHURCH,                 230,   2,   2,   0,   0,
+	MS(   0, MAX_YEAR,   6,  85, STR_2012_CHURCH,                 230,   2,   2,   0,   0,
 	   BUILDING_IS_CHURCH | TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //3D
-	M(    0, MAX_YEAR,  17,  80, STR_203F_HOUSES,                  80,   7,   3,   1,   1,
+	MS(   0, MAX_YEAR,  17,  80, STR_203F_HOUSES,                  80,   7,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //3E
-	M(    0, MAX_YEAR,  17,  80, STR_203F_HOUSES,                  80,   7,   3,   1,   1,
+	MS(   0, MAX_YEAR,  17,  80, STR_203F_HOUSES,                  80,   7,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //3F
-	M(    0, 1960,      90, 140, STR_201A_SHOPS_AND_OFFICES,      110,  45,   6,   2,   3,
+	MS(   0, 1960,      90, 140, STR_201A_SHOPS_AND_OFFICES,      110,  45,   6,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //40
-	M(    0, 1960,      90, 140, STR_201A_SHOPS_AND_OFFICES,      110,  45,   6,   2,   3,
+	MS(   0, 1960,      90, 140, STR_201A_SHOPS_AND_OFFICES,      110,  45,   6,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //41
-	M( 1972, MAX_YEAR, 140, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   3,
+	MS(1972, MAX_YEAR, 140, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   3,
 	   TILE_SIZE_1x2,
 	   HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //42
-	M( 1972, MAX_YEAR,   0, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   2,
+	MS(1972, MAX_YEAR,   0, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   2,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //43
-	M( 1972, MAX_YEAR, 140, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   3,
+	MS(1972, MAX_YEAR, 140, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   3,
 	   TILE_SIZE_1x2,
 	   HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //44
-	M( 1972, MAX_YEAR,   0, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   2,
+	MS(1972, MAX_YEAR,   0, 160, STR_2015_HOTEL,                  160,  25,   6,   1,   2,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //45
-	M( 1963, MAX_YEAR, 105, 130, STR_201A_SHOPS_AND_OFFICES,      105,  50,   7,   2,   3,
+	MS(1963, MAX_YEAR, 105, 130, STR_201A_SHOPS_AND_OFFICES,      105,  50,   7,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //46
-	M( 1963, MAX_YEAR, 105, 130, STR_201A_SHOPS_AND_OFFICES,      105,  50,   7,   2,   3,
+	MS(1963, MAX_YEAR, 105, 130, STR_201A_SHOPS_AND_OFFICES,      105,  50,   7,   2,   3,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //47
-	M( 1978, MAX_YEAR, 190, 190, STR_200F_TALL_OFFICE_BLOCK,      135,  75,   9,   3,   4,
+	MS(1978, MAX_YEAR, 190, 190, STR_200F_TALL_OFFICE_BLOCK,      135,  75,   9,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //48
-	M( 1978, MAX_YEAR, 190, 190, STR_200F_TALL_OFFICE_BLOCK,      135,  75,   9,   3,   4,
+	MS(1978, MAX_YEAR, 190, 190, STR_200F_TALL_OFFICE_BLOCK,      135,  75,   9,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //49
-	M( 1967, MAX_YEAR, 250, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
+	MS(1967, MAX_YEAR, 250, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
 	   TILE_SIZE_2x1,
 	   HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //4A
-	M( 1967, MAX_YEAR,   0, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
+	MS(1967, MAX_YEAR,   0, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //4B
-	M( 1967, MAX_YEAR, 250, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
+	MS(1967, MAX_YEAR, 250, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
 	   TILE_SIZE_2x1,
 	   HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //4C
-	M( 1967, MAX_YEAR,   0, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
+	MS(1967, MAX_YEAR,   0, 140, STR_200F_TALL_OFFICE_BLOCK,      200,  60,   7,   2,   2,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //4D
-	M(    0, MAX_YEAR,  16,  80, STR_203F_HOUSES,                  80,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  16,  80, STR_203F_HOUSES,                  80,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //4E
-	M(    0, MAX_YEAR,  16,  80, STR_203F_HOUSES,                  80,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  16,  80, STR_203F_HOUSES,                  80,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //4F
-	M(    0, MAX_YEAR,  16,  80, STR_203F_HOUSES,                  80,   5,   3,   1,   2,
+	MS(   0, MAX_YEAR,  16,  80, STR_203F_HOUSES,                  80,   5,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //50
-	M(    0, MAX_YEAR,   7,  30, STR_203F_HOUSES,                  30,   4,   3,   1,   1,
+	MS(   0, MAX_YEAR,   7,  30, STR_203F_HOUSES,                  30,   4,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //51
-	M(    0, MAX_YEAR,  45, 130, STR_2038_FLATS,                   95,  15,   6,   2,   1,
+	MS(   0, MAX_YEAR,  45, 130, STR_2038_FLATS,                   95,  15,   6,   2,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //52
-	M(    0, MAX_YEAR,   8,  90, STR_2012_CHURCH,                 200,   3,   2,   0,   0,
+	MS(   0, MAX_YEAR,   8,  90, STR_2012_CHURCH,                 200,   3,   2,   0,   0,
 	   BUILDING_IS_CHURCH | TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //53
-	M(    0, MAX_YEAR,  18,  80, STR_203F_HOUSES,                  80,   7,   3,   1,   2,
+	MS(   0, MAX_YEAR,  18,  80, STR_203F_HOUSES,                  80,   7,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
 	   CT_PASSENGERS, CT_MAIL, CT_FOOD), //54
-	M( 1973, MAX_YEAR,  90, 110, STR_2038_FLATS,                   95,  24,   6,   2,   1,
+	MS(1973, MAX_YEAR,  90, 110, STR_2038_FLATS,                   95,  24,   6,   2,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //55
-	M( 1962, MAX_YEAR, 120, 120, STR_2038_FLATS,                   95,  25,   6,   2,   1,
+	MS(1962, MAX_YEAR, 120, 120, STR_2038_FLATS,                   95,  25,   6,   2,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //56
-	M( 1984, MAX_YEAR, 250, 190, STR_200F_TALL_OFFICE_BLOCK,      140,  80,   8,   3,   4,
+	MS(1984, MAX_YEAR, 250, 190, STR_200F_TALL_OFFICE_BLOCK,      140,  80,   8,   3,   4,
 	   TILE_SIZE_2x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //57
-	M( 1984, MAX_YEAR,   0, 190, STR_200F_TALL_OFFICE_BLOCK,      140,  80,   8,   3,   4,
+	MS(1984, MAX_YEAR,   0, 190, STR_200F_TALL_OFFICE_BLOCK,      140,  80,   8,   3,   4,
 	   TILE_NO_FLAG,
 	   HZ_SUBTROPIC,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //58
-	M(    0, MAX_YEAR,  80, 110, STR_2038_FLATS,                   95,  23,   6,   2,   1,
+	MS(   0, MAX_YEAR,  80, 110, STR_2038_FLATS,                   95,  23,   6,   2,   1,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //59
-	M( 1993, MAX_YEAR, 180, 180, STR_200F_TALL_OFFICE_BLOCK,      150,  90,   8,   3,   4,
+	MS(1993, MAX_YEAR, 180, 180, STR_200F_TALL_OFFICE_BLOCK,      150,  90,   8,   3,   4,
 	   TILE_SIZE_1x1,
 	   HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_GOODS), //5A
-	M(    0, MAX_YEAR,   8,  90, STR_2012_CHURCH,                 200,   3,   2,   0,   0,
+	MS(   0, MAX_YEAR,   8,  90, STR_2012_CHURCH,                 200,   3,   2,   0,   0,
 	   BUILDING_IS_CHURCH | TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //5B
-	M(    0, MAX_YEAR,  18,  90, STR_203F_HOUSES,                  90,   5,   6,   2,   2,
+	MS(   0, MAX_YEAR,  18,  90, STR_203F_HOUSES,                  90,   5,   6,   2,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //5C
-	M(    0, MAX_YEAR,   7,  70, STR_203F_HOUSES,                  50,   3,   3,   1,   1,
+	MS(   0, MAX_YEAR,   7,  70, STR_203F_HOUSES,                  50,   3,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //5D
-	M(    0, MAX_YEAR,  15,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  15,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //5E
-	M(    0, MAX_YEAR,  17,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  17,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //5F
-	M(    0, MAX_YEAR,  19,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  19,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //60
-	M(    0, MAX_YEAR,  21,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
+	MS(   0, MAX_YEAR,  21,  80, STR_203F_HOUSES,                  75,   6,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //61
-	M(    0, MAX_YEAR,  75, 160, STR_200F_TALL_OFFICE_BLOCK,      130,  20,   8,   4,   2,
+	MS(   0, MAX_YEAR,  75, 160, STR_200F_TALL_OFFICE_BLOCK,      130,  20,   8,   4,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //62
-	M(    0, MAX_YEAR,  35,  90, STR_203F_HOUSES,                  80,   9,   4,   1,   2,
+	MS(   0, MAX_YEAR,  35,  90, STR_203F_HOUSES,                  80,   9,   4,   1,   2,
 	   TILE_SIZE_1x2,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //63
-	M(    0, MAX_YEAR,   0,  90, STR_203F_HOUSES,                  80,   0,   4,   1,   2,
+	MS(   0, MAX_YEAR,   0,  90, STR_203F_HOUSES,                  80,   0,   4,   1,   2,
 	   TILE_NO_FLAG,
 	   HZ_NOZNS,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //64
-	M(    0, MAX_YEAR,  85, 150, STR_200F_TALL_OFFICE_BLOCK,      130,  18,   8,   4,   2,
+	MS(   0, MAX_YEAR,  85, 150, STR_200F_TALL_OFFICE_BLOCK,      130,  18,   8,   4,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //65
-	M(    0, MAX_YEAR,  11,  60, STR_2059_IGLOO,                   45,   3,   3,   1,   1,
+	MS(   0, MAX_YEAR,  11,  60, STR_2059_IGLOO,                   45,   3,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //66
-	M(    0, MAX_YEAR,  10,  60, STR_205A_TEPEES,                  45,   3,   3,   1,   1,
+	MS(   0, MAX_YEAR,  10,  60, STR_205A_TEPEES,                  45,   3,   3,   1,   1,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //67
-	M(    0, MAX_YEAR,  67, 140, STR_201A_SHOPS_AND_OFFICES,      130,  22,   8,   4,   4,
+	MS(   0, MAX_YEAR,  67, 140, STR_201A_SHOPS_AND_OFFICES,      130,  22,   8,   4,   4,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), //68
-	M(    0, MAX_YEAR,  86, 145, STR_201A_SHOPS_AND_OFFICES,      130,  23,   8,   4,   4,
+	MS(   0, MAX_YEAR,  86, 145, STR_201A_SHOPS_AND_OFFICES,      130,  23,   8,   4,   4,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), //69
-	M(    0, MAX_YEAR,  95, 165, STR_200F_TALL_OFFICE_BLOCK,      130,  28,   8,   4,   2,
+	MS(   0, MAX_YEAR,  95, 165, STR_200F_TALL_OFFICE_BLOCK,      130,  28,   8,   4,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //6A
-	M(    0, MAX_YEAR,  30,  90, STR_2016_STATUE,                  70,  10,   4,   1,   2,
+	MS(   0, MAX_YEAR,  30,  90, STR_2016_STATUE,                  70,  10,   4,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //6B
-	M(    0, MAX_YEAR,  25,  75, STR_205B_TEAPOT_HOUSE,            65,   8,   3,   1,   2,
+	MS(   0, MAX_YEAR,  25,  75, STR_205B_TEAPOT_HOUSE,            65,   8,   3,   1,   2,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_CANDY), //6C
-	M(    0, MAX_YEAR,  18,  85, STR_205C_PIGGY_BANK,              95,   7,   3,   2,   4,
+	MS(   0, MAX_YEAR,  18,  85, STR_205C_PIGGY_BANK,              95,   7,   3,   2,   4,
 	   TILE_SIZE_1x1,
 	   HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
 	   CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), //6D
 };
-#undef M
+#undef MS
+
+/** Make sure we have the right number of elements: one entry for each house */
 assert_compile(lengthof(_original_house_specs) == NEW_HOUSE_OFFSET);
--- a/src/table/tree_land.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/tree_land.h	Sat Jun 02 19:59:29 2007 +0000
@@ -25,7 +25,7 @@
 	{ { 3, 9 }, { 8, 2 }, { 9, 9 }, { 1, 5 } }
 };
 
-static const PalSpriteID _tree_layout_sprite[164+(79-48+1)][4] = {
+static const PalSpriteID _tree_layout_sprite[164 + (79 - 48 + 1)][4] = {
 	{ { 0x652, PAL_NONE }, { 0x659, PAL_NONE }, { 0x660, PAL_NONE }, { 0x667, PAL_NONE } }, /* 0 */
 	{ { 0x652, PAL_NONE }, { 0x667, PAL_NONE }, { 0x66e, PAL_NONE }, { 0x675, PAL_NONE } }, /* 1 */
 	{ { 0x652, PAL_NONE }, { 0x66e, PAL_NONE }, { 0x659, PAL_NONE }, { 0x675, PAL_NONE } }, /* 2 */
--- a/src/table/water_land.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/table/water_land.h	Sat Jun 02 19:59:29 2007 +0000
@@ -47,86 +47,86 @@
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_0[] = {
-	BEGIN(SPR_CANALS_BASE + 6),
-	{ 0,   0, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 0 + 1 },
-	{ 0, 0xF, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 4 + 1 },
+	BEGIN(1),
+	{ 0,   0, 0, 0x10, 1, 0x14, 0 + 1 },
+	{ 0, 0xF, 0, 0x10, 1, 0x14, 4 + 1 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_1[] = {
-	BEGIN(SPR_CANALS_BASE + 5),
-	{   0, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 0 },
-	{ 0xF, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 4 },
+	BEGIN(0),
+	{   0, 0, 0, 1, 0x10, 0x14, 0 },
+	{ 0xF, 0, 0, 1, 0x10, 0x14, 4 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_2[] = {
-	BEGIN(SPR_CANALS_BASE + 7),
-	{ 0,   0, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 0 + 2 },
-	{ 0, 0xF, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 4 + 2 },
+	BEGIN(2),
+	{ 0,   0, 0, 0x10, 1, 0x14, 0 + 2 },
+	{ 0, 0xF, 0, 0x10, 1, 0x14, 4 + 2 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_3[] = {
-	BEGIN(SPR_CANALS_BASE + 8),
-	{   0, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 0 + 3 },
-	{ 0xF, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 4 + 3 },
+	BEGIN(3),
+	{   0, 0, 0, 1, 0x10, 0x14, 0 + 3 },
+	{ 0xF, 0, 0, 1, 0x10, 0x14, 4 + 3 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_0b[] = {
 	BEGIN(0xFDD),
-	{ 0,   0, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 8 + 1 },
-	{ 0, 0xF, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 12 + 1 },
+	{ 0,   0, 0, 0x10, 1, 0x14, 8 + 1 },
+	{ 0, 0xF, 0, 0x10, 1, 0x14, 12 + 1 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_1b[] = {
 	BEGIN(0xFDD),
-	{   0, 0, 0, 0x1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 8 },
-	{ 0xF, 0, 0, 0x1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 12 },
+	{   0, 0, 0, 0x1, 0x10, 0x14, 8 },
+	{ 0xF, 0, 0, 0x1, 0x10, 0x14, 12 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_2b[] = {
 	BEGIN(0xFDD),
-	{ 0,   0, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 8 + 2 },
-	{ 0, 0xF, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 12 + 2 },
+	{ 0,   0, 0, 0x10, 1, 0x14, 8 + 2 },
+	{ 0, 0xF, 0, 0x10, 1, 0x14, 12 + 2 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_3b[] = {
 	BEGIN(0xFDD),
-	{   0, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 8 + 3 },
-	{ 0xF, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 12 + 3 },
+	{   0, 0, 0, 1, 0x10, 0x14, 8 + 3 },
+	{ 0xF, 0, 0, 1, 0x10, 0x14, 12 + 3 },
 	END(0)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_0t[] = {
 	BEGIN(0xFDD),
-	{ 0,   0, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 16 + 1 },
-	{ 0, 0xF, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 20 + 1 },
+	{ 0,   0, 0, 0x10, 1, 0x14, 16 + 1 },
+	{ 0, 0xF, 0, 0x10, 1, 0x14, 20 + 1 },
 	END(8)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_1t[] = {
 	BEGIN(0xFDD),
-	{   0, 0, 0, 0x1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 16 },
-	{ 0xF, 0, 0, 0x1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 20 },
+	{   0, 0, 0, 0x1, 0x10, 0x14, 16 },
+	{ 0xF, 0, 0, 0x1, 0x10, 0x14, 20 },
 	END(8)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_2t[] = {
 	BEGIN(0xFDD),
-	{ 0,   0, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 16 + 2 },
-	{ 0, 0xF, 0, 0x10, 1, 0x14, SPR_CANALS_BASE + 9 + 20 + 2 },
+	{ 0,   0, 0, 0x10, 1, 0x14, 16 + 2 },
+	{ 0, 0xF, 0, 0x10, 1, 0x14, 20 + 2 },
 	END(8)
 };
 
 static const WaterDrawTileStruct _shiplift_display_seq_3t[] = {
 	BEGIN(0xFDD),
-	{   0, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 16 + 3 },
-	{ 0xF, 0, 0, 1, 0x10, 0x14, SPR_CANALS_BASE + 9 + 20 + 3 },
+	{   0, 0, 0, 1, 0x10, 0x14, 16 + 3 },
+	{ 0xF, 0, 0, 1, 0x10, 0x14, 20 + 3 },
 	END(8)
 };
 
--- a/src/terraform_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/terraform_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file terraform_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
@@ -91,34 +93,35 @@
 
 /**
  * A central place to handle all X_AND_Y dragged GUI functions.
- * @param e @WindowEvent variable holding in its higher bits (excluding the lower
+ * @param e WindowEvent variable holding in its higher bits (excluding the lower
  * 4, since that defined the X_Y drag) the type of action to be performed
  * @return Returns true if the action was found and handled, and false otherwise. This
  * allows for additional implements that are more local. For example X_Y drag
- * of convertrail which belongs in rail_gui.c and not terraform_gui.c
+ * of convertrail which belongs in rail_gui.cpp and not terraform_gui.cpp
  **/
 bool GUIPlaceProcDragXY(const WindowEvent *e)
 {
 	TileIndex start_tile = e->we.place.starttile;
 	TileIndex end_tile = e->we.place.tile;
 
-	switch (e->we.place.userdata >> 4) {
-	case GUI_PlaceProc_DemolishArea >> 4:
-		DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
-		break;
-	case GUI_PlaceProc_LevelArea >> 4:
-		DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND | CMD_AUTO);
-		break;
-	case GUI_PlaceProc_RockyArea >> 4:
-		GenerateRockyArea(end_tile, start_tile);
-		break;
-	case GUI_PlaceProc_DesertArea >> 4:
-		GenerateDesertArea(end_tile, start_tile);
-		break;
-	case GUI_PlaceProc_WaterArea >> 4:
-		DoCommandP(end_tile, start_tile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_CANALS));
-		break;
-	default: return false;
+	switch (e->we.place.select_proc) {
+		case DDSP_DEMOLISH_AREA:
+			DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_CLEAR_AREA | CMD_MSG(STR_00B5_CAN_T_CLEAR_THIS_AREA));
+			break;
+		case DDSP_LEVEL_AREA:
+			DoCommandP(end_tile, start_tile, 0, CcPlaySound10, CMD_LEVEL_LAND | CMD_AUTO);
+			break;
+		case DDSP_CREATE_ROCKS:
+			GenerateRockyArea(end_tile, start_tile);
+			break;
+		case DDSP_CREATE_DESERT:
+			GenerateDesertArea(end_tile, start_tile);
+			break;
+		case DDSP_CREATE_WATER:
+			DoCommandP(end_tile, start_tile, _ctrl_pressed, CcBuildCanal, CMD_BUILD_CANAL | CMD_AUTO | CMD_MSG(STR_CANT_BUILD_CANALS));
+			break;
+		default:
+			return false;
 	}
 
 	return true;
@@ -138,7 +141,7 @@
 
 void PlaceProc_DemolishArea(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_DemolishArea);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_DEMOLISH_AREA);
 }
 
 static void PlaceProc_RaiseLand(TileIndex tile)
@@ -159,7 +162,7 @@
 
 void PlaceProc_LevelLand(TileIndex tile)
 {
-	VpStartPlaceSizing(tile, VPM_X_AND_Y | GUI_PlaceProc_LevelArea);
+	VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_LEVEL_AREA);
 }
 
 static void TerraformClick_Lower(Window *w)
@@ -237,13 +240,17 @@
 		return;
 
 	case WE_PLACE_DRAG:
-		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.userdata & 0xF);
+		VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
 		break;
 
 	case WE_PLACE_MOUSEUP:
-		if (e->we.place.pt.x != -1 &&
-				(e->we.place.userdata & 0xF) == VPM_X_AND_Y) { // dragged actions
-			GUIPlaceProcDragXY(e);
+		if (e->we.place.pt.x != -1) {
+			switch (e->we.place.select_proc) {
+				case DDSP_DEMOLISH_AREA:
+				case DDSP_LEVEL_AREA:
+					GUIPlaceProcDragXY(e);
+					break;
+			}
 		}
 		break;
 
@@ -265,13 +272,13 @@
 {   WWT_IMGBTN,   RESIZE_NONE,     7,  70,  91,  14,  35, SPR_IMG_DYNAMITE,        STR_018D_DEMOLISH_BUILDINGS_ETC},
 {   WWT_IMGBTN,   RESIZE_NONE,     7,  92, 113,  14,  35, SPR_IMG_BUY_LAND,        STR_0329_PURCHASE_LAND_FOR_FUTURE},
 {   WWT_IMGBTN,   RESIZE_NONE,     7, 114, 135,  14,  35, SPR_IMG_PLANTTREES,      STR_0185_PLANT_TREES_PLACE_SIGNS},
-{   WWT_IMGBTN,   RESIZE_NONE,     7, 136, 157,  14,  35, SPR_IMG_PLACE_SIGN,      STR_0289_PLACE_SIGN},
+{   WWT_IMGBTN,   RESIZE_NONE,     7, 136, 157,  14,  35, SPR_IMG_SIGN,            STR_0289_PLACE_SIGN},
 
 {   WIDGETS_END},
 };
 
 static const WindowDesc _terraform_desc = {
-	WDP_ALIGN_TBR, 22+36, 158, 36,
+	WDP_ALIGN_TBR, 22 + 36, 158, 36,
 	WC_SCEN_LAND_GEN, WC_NONE,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
 	_terraform_widgets,
--- a/src/texteff.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/texteff.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,11 +1,14 @@
 /* $Id$ */
 
+/** @file texteff.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
 #include "macros.h"
 #include "strings.h"
 #include "gfx.h"
+#include "landscape.h"
 #include "viewport.h"
 #include "saveload.h"
 #include "hal.h"
@@ -121,7 +124,7 @@
 	}
 }
 
-/* Hide the textbox */
+/** Hide the textbox */
 void UndrawTextMessage()
 {
 	if (_textmessage_visible) {
@@ -172,7 +175,7 @@
 	}
 }
 
-/* Check if a message is expired every day */
+/** Check if a message is expired every day */
 void TextMessageDailyLoop()
 {
 	uint i;
@@ -196,7 +199,7 @@
 	}
 }
 
-/* Draw the textmessage-box */
+/** Draw the textmessage-box */
 void DrawTextMessage()
 {
 	if (!_textmessage_dirty) return;
@@ -243,7 +246,7 @@
 	/* Paint the messages starting with the lowest at the bottom */
 	for (uint y = 13; count-- != 0; y += 13) {
 		DoDrawString(_textmsg_list[count].message, _textmsg_box.x + 3, _screen.height - _textmsg_box.y - y + 1, _textmsg_list[count].color);
- 	}
+	}
 
 	/* Make sure the data is updated next flush */
 	_video_driver->make_dirty(x, y, width, height);
@@ -324,7 +327,7 @@
 	const TextEffect* te;
 
 	switch (dpi->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			for (te = _text_effect_list; te != endof(_text_effect_list); te++) {
 				if (te->string_id != INVALID_STRING_ID &&
 						dpi->left <= te->right &&
@@ -336,7 +339,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			for (te = _text_effect_list; te != endof(_text_effect_list); te++) {
 				if (te->string_id != INVALID_STRING_ID &&
 						dpi->left <= te->right  * 2 - te->x &&
@@ -347,6 +350,13 @@
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 }
 
--- a/src/tgp.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tgp.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file tgp.cpp OTTD Perlin Noise Landscape Generator, aka TerraGenesis Perlin */
+
 #include "stdafx.h"
 #include <math.h>
 #include "openttd.h"
@@ -17,7 +19,6 @@
 #include "helpers.hpp"
 
 /*
- * OTTD Perlin Noise Landscape Generator, aka TerraGenesis Perlin
  *
  * Quickie guide to Perlin Noise
  * Perlin noise is a predictable pseudo random number sequence. By generating
@@ -167,11 +168,11 @@
 /** Height map - allocated array of heights (MapSizeX() + 1) x (MapSizeY() + 1) */
 struct HeightMap
 {
-	height_t *h;         //! array of heights
-	uint     dim_x;      //! height map size_x MapSizeX() + 1
-	uint     total_size; //! height map total size
-	uint     size_x;     //! MapSizeX()
-	uint     size_y;     //! MapSizeY()
+	height_t *h;         //< array of heights
+	uint     dim_x;      //< height map size_x MapSizeX() + 1
+	uint     total_size; //< height map total size
+	uint     size_x;     //< MapSizeX()
+	uint     size_y;     //< MapSizeY()
 };
 
 /** Global height map instance */
@@ -200,13 +201,13 @@
 /** Noise amplitudes (multiplied by 1024)
  * - indexed by "smoothness setting" and log2(frequency) */
 static const amplitude_t _amplitudes_by_smoothness_and_frequency[4][12] = {
-	// Very smooth
+	/* Very smooth */
 	{1000,  350,  123,   43,   15,    1,     1,    0,    0,    0,    0,    0},
-	// Smooth
+	/* Smooth */
 	{1000, 1000,  403,  200,   64,    8,     1,    0,    0,    0,    0,    0},
-	// Rough
+	/* Rough */
 	{1000, 1200,  800,  500,  200,   16,     4,    0,    0,    0,    0,    0},
-	// Very Rough
+	/* Very Rough */
 	{1500, 1000, 1200, 1000,  500,   32,    20,    0,    0,    0,    0,    0},
 };
 
@@ -215,13 +216,17 @@
 
 /** Desired maximum height - indexed by _opt.diff.terrain_type */
 static const int8 _max_height[4] = {
-	6,       // Very flat
-	9,       // Flat
-	12,      // Hilly
-	15       // Mountainous
+	6,       ///< Very flat
+	9,       ///< Flat
+	12,      ///< Hilly
+	15       ///< Mountainous
 };
 
-/** Check if a X/Y set are within the map. */
+/** Check if a X/Y set are within the map.
+ * @param x coordinate x
+ * @param y coordinate y
+ * @return true if within the map
+ */
 static inline bool IsValidXY(uint x, uint y)
 {
 	return ((int)x) >= 0 && x < _height_map.size_x && ((int)y) >= 0 && y < _height_map.size_y;
@@ -680,10 +685,10 @@
 
 /* The following decimals are the octave power modifiers for the Perlin noise */
 static const double _perlin_p_values[][7] = {    // perlin frequency per power
-	{ 0.35, 0.35, 0.35, 0.35, 0.35, 0.25, 0.539 }, // Very smooth
-	{ 0.45, 0.55, 0.45, 0.45, 0.35, 0.25, 0.89  }, // Smooth
-	{ 0.85, 0.80, 0.70, 0.45, 0.45, 0.35, 1.825 }, // Rough 1.825
-	{ 0.95, 0.85, 0.80, 0.55, 0.55, 0.45, 2.245 }  // Very Rough 2.25
+	{ 0.35, 0.35, 0.35, 0.35, 0.35, 0.25, 0.539 }, ///< Very smooth
+	{ 0.45, 0.55, 0.45, 0.45, 0.35, 0.25, 0.89  }, ///< Smooth
+	{ 0.85, 0.80, 0.70, 0.45, 0.45, 0.35, 1.825 }, ///< Rough 1.825
+	{ 0.95, 0.85, 0.80, 0.55, 0.55, 0.45, 2.245 }  //< Very Rough 2.25
 };
 
 /**
--- a/src/tgp.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tgp.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file tgp.h */
+
 #ifndef TGP_H
 #define TGP_H
 
--- a/src/thread.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/thread.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,11 +1,13 @@
 /* $Id$ */
 
+/** @file thread.cpp */
+
 #include "stdafx.h"
 #include "thread.h"
 #include <stdlib.h>
 #include "helpers.hpp"
 
-#if defined(__AMIGA__) || defined(__MORPHOS__) || defined(PSP) || defined(NO_THREADS)
+#if defined(__AMIGA__) || defined(PSP) || defined(NO_THREADS)
 OTTDThread *OTTDCreateThread(OTTDThreadFunc function, void *arg) { return NULL; }
 void *OTTDJoinThread(OTTDThread *t) { return NULL; }
 void OTTDExitThread() { NOT_REACHED(); };
@@ -63,7 +65,7 @@
 	_endthread();
 }
 
-#elif defined(UNIX)
+#elif defined(UNIX) && !defined(MORPHOS)
 
 #include <pthread.h>
 
@@ -155,4 +157,157 @@
 {
 	ExitThread(0);
 }
+
+
+#elif defined(MORPHOS)
+
+#include <exec/types.h>
+#include <exec/rawfmt.h>
+#include <dos/dostags.h>
+
+#include <proto/dos.h>
+#include <proto/exec.h>
+
+#include <setjmp.h>
+
+/* NOTE: this code heavily depends on latest libnix updates. So make
+ *        sure you link with new stuff which supports semaphore locking of
+ *        the IO resources, else it will just go foobar. */
+
+struct OTTDThreadStartupMessage {
+	struct Message msg;  ///< standard exec.library message (MUST be the first thing in the message struct!)
+	OTTDThreadFunc func; ///< function the thread will execute
+	void *arg;           ///< functions arguments for the thread function
+	void *ret;           ///< return value of the thread function
+	jmp_buf jumpstore;   ///< storage for the setjump state
+};
+
+struct OTTDThread {
+	struct MsgPort *replyport;
+	struct OTTDThreadStartupMessage msg;
+};
+
+
+/**
+ *  Default OpenTTD STDIO/ERR debug output is not very useful for this, so we
+ *  utilize serial/ramdebug instead.
+ */
+#ifndef NO_DEBUG_MESSAGES
+void KPutStr(CONST_STRPTR format)
+{
+	RawDoFmt(format, NULL, (void (*)())RAWFMTFUNC_SERIAL, NULL);
+}
+#else
+#define KPutStr(x)
 #endif
+
+static void Proxy(void)
+{
+	struct Task *child = FindTask(NULL);
+	struct OTTDThreadStartupMessage *msg;
+
+	/* Make sure, we don't block the parent. */
+	SetTaskPri(child, -5);
+
+	KPutStr("[Child] Progressing...\n");
+
+	if (NewGetTaskAttrs(NULL, &msg, sizeof(struct OTTDThreadStartupMessage *), TASKINFOTYPE_STARTUPMSG, TAG_DONE) && msg != NULL) {
+		/* Make use of setjmp() here, so this point can be reached again from inside
+		 *  OTTDExitThread() which can be called from anythere inside msg->func.
+		 *  It's a bit ugly and in worst case it leaks some memory. */
+		if (setjmp(msg->jumpstore) == 0) {
+			msg->ret = msg->func(msg->arg);
+		} else {
+			KPutStr("[Child] Returned to main()\n");
+		}
+	}
+
+	/*  Quit the child, exec.library will reply the startup msg internally. */
+	KPutStr("[Child] Done.\n");
+}
+
+OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void *arg)
+{
+	OTTDThread *t;
+	struct Task *parent;
+
+	KPutStr("[OpenTTD] Create thread...\n");
+
+	t = (struct OTTDThread *)AllocVecTaskPooled(sizeof(struct OTTDThread));
+	if (t == NULL) return NULL;
+
+	parent = FindTask(NULL);
+
+	/* Make sure main thread runs with sane priority */
+	SetTaskPri(parent, 0);
+
+	/* Things we'll pass down to the child by utilizing NP_StartupMsg */
+	t->msg.func = function;
+	t->msg.arg  = arg;
+	t->msg.ret  = NULL;
+
+	t->replyport = CreateMsgPort();
+
+	if (t->replyport != NULL) {
+		struct Process *child;
+
+		t->msg.msg.mn_Node.ln_Type = NT_MESSAGE;
+		t->msg.msg.mn_ReplyPort    = t->replyport;
+		t->msg.msg.mn_Length       = sizeof(struct OTTDThreadStartupMessage);
+
+		child = CreateNewProcTags(
+			NP_CodeType,     CODETYPE_PPC,
+			NP_Entry,        Proxy,
+			NP_StartupMsg,   (ULONG)&t->msg,
+			NP_Priority,     5UL,
+			NP_Name,         (ULONG)"OpenTTD Thread",
+			NP_PPCStackSize, 131072UL,
+			TAG_DONE);
+
+		if (child != NULL) {
+			KPutStr("[OpenTTD] Child process launched.\n");
+			return t;
+		}
+		DeleteMsgPort(t->replyport);
+	}
+	FreeVecTaskPooled(t);
+
+	return NULL;
+}
+
+void* OTTDJoinThread(OTTDThread *t)
+{
+	struct OTTDThreadStartupMessage *reply;
+	void *ret;
+
+	KPutStr("[OpenTTD] Join threads...\n");
+
+	if (t == NULL) return NULL;
+
+	KPutStr("[OpenTTD] Wait for child to quit...\n");
+	WaitPort(t->replyport);
+
+	reply = (struct OTTDThreadStartupMessage *)GetMsg(t->replyport);
+	ret   = reply->ret;
+
+	DeleteMsgPort(t->replyport);
+	FreeVecTaskPooled(t);
+
+	return ret;
+}
+
+void OTTDExitThread()
+{
+	struct OTTDThreadStartupMessage *msg;
+
+	KPutStr("[Child] Aborting...\n");
+
+	if (NewGetTaskAttrs(NULL, &msg, sizeof(struct OTTDThreadStartupMessage *), TASKINFOTYPE_STARTUPMSG, TAG_DONE) && msg != NULL) {
+		KPutStr("[Child] Jumping back...\n");
+		longjmp(msg->jumpstore, 0xBEAFCAFE);
+	}
+
+	NOT_REACHED();
+}
+
+#endif
--- a/src/thread.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/thread.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file thread.h */
+
 #ifndef THREAD_H
 #define THREAD_H
 
--- a/src/tile.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tile.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file tile.cpp */
+
 #include "stdafx.h"
 #include "tile.h"
 
--- a/src/tile.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tile.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file tile.h */
+
 #ifndef TILE_H
 #define TILE_H
 
--- a/src/town.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/town.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file town.h */
+
 #ifndef TOWN_H
 #define TOWN_H
 
@@ -76,34 +78,34 @@
 struct Town {
 	TileIndex xy;
 
-	// Current population of people and amount of houses.
+	/* Current population of people and amount of houses. */
 	uint16 num_houses;
 	uint32 population;
 
-	// Town name
+	/* Town name */
 	uint16 townnametype;
 	uint32 townnameparts;
 
-	// NOSAVE: Location of name sign, UpdateTownVirtCoord updates this.
+	/* NOSAVE: Location of name sign, UpdateTownVirtCoord updates this. */
 	ViewportSign sign;
 
-	// Makes sure we don't build certain house types twice.
-	// bit 0 = Building funds received
-	// bit 1 = CHURCH
-	// bit 2 = STADIUM
+	/* Makes sure we don't build certain house types twice.
+	 * bit 0 = Building funds received
+	 * bit 1 = CHURCH
+	 * bit 2 = STADIUM */
 	byte flags12;
 
-	// Which players have a statue?
+	/* Which players have a statue? */
 	byte statues;
 
-	// Player ratings as well as a mask that determines which players have a rating.
+	/* Player ratings as well as a mask that determines which players have a rating. */
 	byte have_ratings;
-	uint8 unwanted[MAX_PLAYERS]; // how many months companies aren't wanted by towns (bribe)
-	PlayerByte exclusivity;        // which player has exslusivity
-	uint8 exclusive_counter;     // months till the exclusivity expires
+	uint8 unwanted[MAX_PLAYERS]; ///< how many months companies aren't wanted by towns (bribe)
+	PlayerByte exclusivity;      ///< which player has exslusivity
+	uint8 exclusive_counter;     ///< months till the exclusivity expires
 	int16 ratings[MAX_PLAYERS];
 
-	// Maximum amount of passengers and mail that can be transported.
+	/* Maximum amount of passengers and mail that can be transported. */
 	uint32 max_pass;
 	uint32 max_mail;
 	uint32 new_max_pass;
@@ -113,36 +115,39 @@
 	uint32 new_act_pass;
 	uint32 new_act_mail;
 
-	// Amount of passengers that were transported.
+	/* Amount of passengers that were transported. */
 	byte pct_pass_transported;
 	byte pct_mail_transported;
 
-	// Amount of food and paper that was transported. Actually a bit mask would be enough.
+	/* Amount of food and paper that was transported. Actually a bit mask would be enough. */
 	uint16 act_food;
 	uint16 act_water;
 	uint16 new_act_food;
 	uint16 new_act_water;
 
-	// Time until we rebuild a house.
-	byte time_until_rebuild;
+	/* Time until we rebuild a house. */
+	uint16 time_until_rebuild;
 
-	// When to grow town next time.
-	byte grow_counter;
-	byte growth_rate;
+	/* When to grow town next time. */
+	uint16 grow_counter;
+	int16 growth_rate;
 
-	// Fund buildings program in action?
+	/* Fund buildings program in action? */
 	byte fund_buildings_months;
 
-	// Fund road reconstruction in action?
+	/* Fund road reconstruction in action? */
 	byte road_build_months;
 
-	// Index in town array
+	/* Index in town array */
 	TownID index;
 
-	// NOSAVE: UpdateTownRadius updates this given the house count.
+	/* If this is a larger town, and should grow more quickly. */
+	bool larger_town;
+
+	/* NOSAVE: UpdateTownRadius updates this given the house count. */
 	uint16 radius[5];
 
-	// NOSAVE: The number of each type of building in the town.
+	/* NOSAVE: The number of each type of building in the town. */
 	BuildingCounts building_counts;
 };
 
@@ -159,10 +164,10 @@
 	CargoID accepts_cargo[3];          ///< 3 input cargo slots
 	BuildingFlags building_flags;      ///< some flags that describe the house (size, stadium etc...)
 	HouseZones building_availability;  ///< where can it be built (climates, zones)
-	bool enabled;                      ///< the house is still avaible (by default, true.newgrf can disable it, though)
+	bool enabled;                      ///< the house is available to build (true by default, but can be disabled by newgrf)
 
 	/* NewHouses properties */
-	HouseID substitute_id;             ///< which house this one is based on
+	HouseID substitute_id;             ///< which original house this one is based on
 	struct SpriteGroup *spritegroup;   ///< pointer to the different sprites of the house
 	HouseID override;                  ///< which house this one replaces
 	uint16 callback_mask;              ///< House callback flags
@@ -173,12 +178,19 @@
 	byte animation_frames;             ///< number of animation frames
 	byte animation_speed;              ///< amount of time between each of those frames
 	byte processing_time;              ///< Periodic refresh multiplier
+	byte minimum_life;                 ///< The minimum number of years this house will survive before the town rebuilds it
 
 	/* grf file related properties*/
 	uint8 local_id;                    ///< id defined by the grf file for this house
 	const struct GRFFile *grffile;     ///< grf file that introduced this house
 };
 
+enum TownSizeMode {
+	TSM_RANDOM,
+	TSM_FIXED,
+	TSM_CITY
+};
+
 VARDEF HouseSpec _house_specs[HOUSE_MAX];
 
 uint32 GetWorldPopulation();
@@ -187,7 +199,7 @@
 void InitializeTown();
 void ShowTownViewWindow(TownID town);
 void ExpandTown(Town *t);
-Town *CreateRandomTown(uint attempts, uint size_mode);
+Town *CreateRandomTown(uint attempts, TownSizeMode mode, uint size);
 
 enum {
 	ROAD_REMOVE = 0,
@@ -197,8 +209,8 @@
 };
 
 enum {
-	// These refer to the maximums, so Appalling is -1000 to -400
-	// MAXIMUM RATINGS BOUNDARIES
+	/* These refer to the maximums, so Appalling is -1000 to -400
+	 * MAXIMUM RATINGS BOUNDARIES */
 	RATING_MINIMUM     = -1000,
 	RATING_APPALLING   =  -400,
 	RATING_VERYPOOR    =  -200,
@@ -207,11 +219,11 @@
 	RATING_GOOD        =   400,
 	RATING_VERYGOOD    =   600,
 	RATING_EXCELLENT   =   800,
-	RATING_OUTSTANDING =  1000,         // OUTSTANDING
+	RATING_OUTSTANDING =  1000,         ///< OUTSTANDING
 
 	RATING_MAXIMUM = RATING_OUTSTANDING,
 
-	// RATINGS AFFECTING NUMBERS
+	/* RATINGS AFFECTING NUMBERS */
 	RATING_TREE_DOWN_STEP = -35,
 	RATING_TREE_MINIMUM   = RATING_MINIMUM,
 	RATING_TREE_UP_STEP   = 7,
@@ -232,25 +244,25 @@
 	RATING_BRIBE_DOWN_TO = -50        // XXX SHOULD BE SOMETHING LOWER?
 };
 
-enum {
-/* This is the base "normal" number of towns on the 8x8 map, when
- * one town should get grown per tick. The other numbers of towns
- * are then scaled based on that. */
-	TOWN_GROWTH_FREQUENCY = 23,
-/* Simple value that indicates the house has reached final stage of construction*/
-	TOWN_HOUSE_COMPLETED  =  3,
-};
+/** This is the number of ticks between towns being processed for building new
+ * houses or roads. This value originally came from the size of the town array
+ * in TTD. */
+static const byte TOWN_GROWTH_FREQUENCY = 70;
 
-/* This enum is used in conjonction with town->flags12.
+/** Simple value that indicates the house has reached the final stage of
+ * construction. */
+static const byte TOWN_HOUSE_COMPLETED = 3;
+
+/** This enum is used in conjonction with town->flags12.
  * IT simply states what bit is used for.
  * It is pretty unrealistic (IMHO) to only have one church/stadium
  * per town, NO MATTER the population of it.
  * And there are 5 more bits available on flags12...
  */
 enum {
-	TOWN_IS_FUNDED      = 0,   // Town has received some funds for
-	TOWN_HAS_CHURCH     = 1,   // There can be only one church by town.
-	TOWN_HAS_STADIUM    = 2    // There can be only one stadium by town.
+	TOWN_IS_FUNDED      = 0,   ///< Town has received some funds for
+	TOWN_HAS_CHURCH     = 1,   ///< There can be only one church by town.
+	TOWN_HAS_STADIUM    = 2    ///< There can be only one stadium by town.
 };
 
 bool CheckforTownRating(uint32 flags, Town *t, byte type);
@@ -267,12 +279,19 @@
 
 /**
  * Check if a Town really exists.
+ * @param town to inquiry
+ * @return true if it exists
  */
 static inline bool IsValidTown(const Town* town)
 {
 	return town->xy != 0;
 }
 
+/**
+ * Check if a TownID is valid.
+ * @param index to inquiry in the pool of town
+ * @return true if it exists
+ */
 static inline bool IsValidTownID(TownID index)
 {
 	return index < GetTownPoolSize() && IsValidTown(GetTown(index));
--- a/src/town_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/town_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -38,6 +38,7 @@
 #include "newgrf.h"
 #include "newgrf_callbacks.h"
 #include "newgrf_house.h"
+#include "newgrf_commons.h"
 
 /**
  * Called if a new block is added to the town-pool
@@ -54,6 +55,11 @@
 /* Initialize the town-pool */
 DEFINE_OLD_POOL(Town, Town, TownPoolNewBlock, NULL)
 
+/**
+ * Removes a specific town as well as all industries
+ * under its "juridiction"
+ * @param t Town to remove
+ */
 void DestroyTown(Town *t)
 {
 	Industry *i;
@@ -120,6 +126,11 @@
 	return variant;
 }
 
+/**
+ * House Tile drawing handler.
+ * Part of the tile loop process
+ * @param ti TileInfo of the tile to draw
+ */
 static void DrawTile_Town(TileInfo *ti)
 {
 	const DrawBuildingsTileStruct *dcts;
@@ -151,7 +162,7 @@
 	/* Add a house on top of the ground? */
 	image = dcts->building.sprite;
 	if (image != 0) {
-		if (_display_opt & DO_TRANS_BUILDINGS) {
+		if (HASBIT(_transparent_opt, TO_HOUSES)) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
 		} else {
@@ -167,7 +178,7 @@
 			ti->z
 		);
 
-		if (_display_opt & DO_TRANS_BUILDINGS) return;
+		if (HASBIT(_transparent_opt, TO_HOUSES)) return;
 	}
 
 	{
@@ -187,6 +198,12 @@
 	return SLOPE_FLAT;
 }
 
+/**
+ * Animate a tile for a town
+ * Only certain houses can be animated
+ * The newhouses animation superseeds regular ones
+ * @param tile TileIndex of the house to animate
+ */
 static void AnimateTile_Town(TileIndex tile)
 {
 	int pos, dest;
@@ -198,10 +215,10 @@
 
 	if (_tick_counter & 3) return;
 
-	// If the house is not one with a lift anymore, then stop this animating.
-	// Not exactly sure when this happens, but probably when a house changes.
-	// Before this was just a return...so it'd leak animated tiles..
-	// That bug seems to have been here since day 1??
+	/* If the house is not one with a lift anymore, then stop this animating.
+	 * Not exactly sure when this happens, but probably when a house changes.
+	 * Before this was just a return...so it'd leak animated tiles..
+	 * That bug seems to have been here since day 1?? */
 	if (!(GetHouseSpecs(GetHouseType(tile))->building_flags & BUILDING_IS_ANIMATED)) {
 		DeleteAnimatedTile(tile);
 		return;
@@ -210,7 +227,7 @@
 	if (!LiftHasDestination(tile)) {
 		int i;
 
-		/** Building has 6 floors, number 0 .. 6, where 1 is illegal.
+		/*  Building has 6 floors, number 0 .. 6, where 1 is illegal.
 		 *  This is due to the fact that the first floor is, in the graphics,
 		 *  the height of 2 'normal' floors.
 		 *  Furthermore, there are 6 lift positions from floor N (incl) to floor N + 1 (excl) */
@@ -233,6 +250,12 @@
 
 static void UpdateTownRadius(Town *t);
 
+/**
+ * Determines if a town is close to a tile
+ * @param tile TileIndex of the tile to query
+ * @param dist maximum distance to be accepted
+ * @returns true if the tile correspond to the distance criteria
+ */
 static bool IsCloseToTown(TileIndex tile, uint dist)
 {
 	const Town* t;
@@ -243,16 +266,25 @@
 	return false;
 }
 
+/**
+ * Marks the town sign as needing a repaint
+ * @param t Town requesting repaint
+ */
 static void MarkTownSignDirty(Town *t)
 {
 	MarkAllViewportsDirty(
-		t->sign.left-6,
-		t->sign.top-3,
-		t->sign.left+t->sign.width_1*4+12,
+		t->sign.left - 6,
+		t->sign.top - 3,
+		t->sign.left + t->sign.width_1 * 4 + 12,
 		t->sign.top + 45
 	);
 }
 
+/**
+ * Resize the sign(label) of the town after changes in
+ * population (creation or growth or else)
+ * @param t Town to update
+ */
 void UpdateTownVirtCoord(Town *t)
 {
 	Point pt;
@@ -266,6 +298,11 @@
 	MarkTownSignDirty(t);
 }
 
+/**
+ * Change the towns population
+ * @param t Town which polulation has changed
+ * @param mod polulation change (can be positive or negative)
+ */
 static void ChangePopulation(Town *t, int mod)
 {
 	t->population += mod;
@@ -275,6 +312,11 @@
 	if (_town_sort_order & 2) _town_sort_dirty = true;
 }
 
+/**
+ * Determines the world population
+ * Basically, count population of all towns, one by one
+ * @return uint32 the calculated population of the world
+ */
 uint32 GetWorldPopulation()
 {
 	uint32 pop;
@@ -285,17 +327,24 @@
 	return pop;
 }
 
+/**
+ * Helper function for house completion stages progression
+ * @param tile TileIndex of the house (or parts of it) to "grow"
+ */
 static void MakeSingleHouseBigger(TileIndex tile)
 {
 	assert(IsTileType(tile, MP_HOUSE));
 
+	/* means it is completed, get out. */
 	if (LiftHasDestination(tile)) return;
 
+	/* progress in construction stages */
 	IncHouseConstructionTick(tile);
 	if (GetHouseConstructionTick(tile) != 0) return;
 
+	/* Check and/or  */
 	if (HASBIT(GetHouseSpecs(GetHouseType(tile))->callback_mask, CBM_CONSTRUCTION_STATE_CHANGE)) {
-		uint16 callback_res = GetHouseCallback(CBID_CONSTRUCTION_STATE_CHANGE, 0, GetHouseType(tile), GetTownByTile(tile), tile);
+		uint16 callback_res = GetHouseCallback(CBID_CONSTRUCTION_STATE_CHANGE, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
 		if (callback_res != CALLBACK_FAILED) ChangeHouseAnimationFrame(tile, callback_res);
 	}
 
@@ -307,6 +356,9 @@
 	MarkTileDirtyByTile(tile);
 }
 
+/** Make the house advances in its construction stages until completion
+ * @param tile TileIndex of house
+ */
 static void MakeTownHouseBigger(TileIndex tile)
 {
 	uint flags = GetHouseSpecs(GetHouseType(tile))->building_flags;
@@ -316,6 +368,10 @@
 	if (flags & BUILDING_HAS_4_TILES) MakeSingleHouseBigger(TILE_ADDXY(tile, 1, 1));
 }
 
+/**
+ * Periodic tic handler for houses and town
+ * @param tile been asked to do its stuff
+ */
 static void TileLoop_Town(TileIndex tile)
 {
 	Town *t;
@@ -328,52 +384,95 @@
 	if (house_id >= NEW_HOUSE_OFFSET && !NewHouseTileLoop(tile)) return;
 
 	if (!IsHouseCompleted(tile)) {
-		/*Construction is not completed. See if we can go further in construction*/
+		/* Construction is not completed. See if we can go further in construction*/
 		MakeTownHouseBigger(tile);
 		return;
 	}
 
 	/* If the lift has a destination, it is already an animated tile. */
-	if ((hs->building_flags & BUILDING_IS_ANIMATED) && house_id < NEW_HOUSE_OFFSET && !LiftHasDestination(tile) && CHANCE16(1, 2)) AddAnimatedTile(tile);
+	if ((hs->building_flags & BUILDING_IS_ANIMATED) &&
+			house_id < NEW_HOUSE_OFFSET &&
+			!LiftHasDestination(tile) &&
+			CHANCE16(1, 2))
+		AddAnimatedTile(tile);
 
 	t = GetTownByTile(tile);
 
 	r = Random();
 
-	if (GB(r, 0, 8) < hs->population) {
-		uint amt = GB(r, 0, 8) / 8 + 1;
-		uint moved;
-
-		if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
-		t->new_max_pass += amt;
-		moved = MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt);
-		t->new_act_pass += moved;
-	}
-
-	if (GB(r, 8, 8) < hs->mail_generation) {
-		uint amt = GB(r, 8, 8) / 8 + 1;
-		uint moved;
-
-		if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
-		t->new_max_mail += amt;
-		moved = MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt);
-		t->new_act_mail += moved;
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_PRODUCE_CARGO)) {
+		for (uint i = 0; i < 256; i++) {
+			uint16 callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, r, house_id, t, tile);
+
+			if (callback == CALLBACK_FAILED) break;
+			if (callback == 0x20FF) break;
+
+			CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grffile);
+			if (cargo == CT_INVALID) continue;
+
+			uint amt = GB(callback, 0, 8);
+			uint moved = MoveGoodsToStation(tile, 1, 1, cargo, amt);
+
+			const CargoSpec *cs = GetCargo(cargo);
+			switch (cs->town_effect) {
+				case TE_PASSENGERS:
+					t->new_max_pass += amt;
+					t->new_act_pass += moved;
+					break;
+
+				case TE_MAIL:
+					t->new_max_mail += amt;
+					t->new_act_mail += moved;
+					break;
+
+				default:
+					break;
+			}
+		}
+	} else {
+		if (GB(r, 0, 8) < hs->population) {
+			uint amt = GB(r, 0, 8) / 8 + 1;
+			uint moved;
+
+			if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
+			t->new_max_pass += amt;
+			moved = MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt);
+			t->new_act_pass += moved;
+		}
+
+		if (GB(r, 8, 8) < hs->mail_generation) {
+			uint amt = GB(r, 8, 8) / 8 + 1;
+			uint moved;
+
+			if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
+			t->new_max_mail += amt;
+			moved = MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt);
+			t->new_act_mail += moved;
+		}
 	}
 
 	_current_player = OWNER_TOWN;
 
-	if (hs->building_flags & BUILDING_HAS_1_TILE && HASBIT(t->flags12, TOWN_IS_FUNDED) && CanDeleteHouse(tile) && --t->time_until_rebuild == 0) {
-		t->time_until_rebuild = GB(r, 16, 6) + 130;
+	if (hs->building_flags & BUILDING_HAS_1_TILE &&
+			HASBIT(t->flags12, TOWN_IS_FUNDED) &&
+			CanDeleteHouse(tile) &&
+			max(_cur_year - GetHouseConstructionYear(tile), 0) >= hs->minimum_life &&
+			--t->time_until_rebuild == 0) {
+		t->time_until_rebuild = GB(r, 16, 8) + 192;
 
 		ClearTownHouse(t, tile);
 
-		// rebuild with another house?
+		/* Rebuild with another house? */
 		if (GB(r, 24, 8) >= 12) DoBuildTownHouse(t, tile);
 	}
 
 	_current_player = OWNER_NONE;
 }
 
+/**
+ * Unused handler
+ * @param tile unused
+ */
 static void ClickTile_Town(TileIndex tile)
 {
 	/* not used */
@@ -413,8 +512,44 @@
 static void GetAcceptedCargo_Town(TileIndex tile, AcceptedCargo ac)
 {
 	HouseSpec *hs = GetHouseSpecs(GetHouseType(tile));
-
-	for (uint8 i = 0; i < 3; i++) ac[hs->accepts_cargo[i]] = hs->cargo_acceptance[i];
+	CargoID accepts[3];
+
+	/* Set the initial accepted cargo types */
+	for (uint8 i = 0; i < lengthof(accepts); i++) {
+		accepts[i] = hs->accepts_cargo[i];
+	}
+
+	/* Check for custom accepted cargo types */
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_ACCEPT_CARGO)) {
+		uint16 callback = GetHouseCallback(CBID_HOUSE_ACCEPT_CARGO, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
+		if (callback != CALLBACK_FAILED) {
+			/* Replace accepted cargo types with translated values from callback */
+			accepts[0] = GetCargoTranslation(GB(callback,  0, 5), hs->grffile);
+			accepts[1] = GetCargoTranslation(GB(callback,  5, 5), hs->grffile);
+			accepts[2] = GetCargoTranslation(GB(callback, 10, 5), hs->grffile);
+		}
+	}
+
+	/* Check for custom cargo acceptance */
+	if (HASBIT(hs->callback_mask, CBM_CARGO_ACCEPTANCE)) {
+		uint16 callback = GetHouseCallback(CBID_HOUSE_CARGO_ACCEPTANCE, 0, 0, GetHouseType(tile), GetTownByTile(tile), tile);
+		if (callback != CALLBACK_FAILED) {
+			if (accepts[0] != CT_INVALID) ac[accepts[0]] = GB(callback, 0, 4);
+			if (accepts[1] != CT_INVALID) ac[accepts[1]] = GB(callback, 4, 4);
+			if (_opt.landscape != LT_TEMPERATE && HASBIT(callback, 12)) {
+				/* The 'S' bit indicates food instead of goods */
+				ac[CT_FOOD] = GB(callback, 8, 4);
+			} else {
+				if (accepts[2] != CT_INVALID) ac[accepts[2]] = GB(callback, 8, 4);
+			}
+			return;
+		}
+	}
+
+	/* No custom acceptance, so fill in with the default values */
+	for (uint8 i = 0; i < lengthof(accepts); i++) {
+		if (accepts[i] != CT_INVALID) ac[accepts[i]] = hs->cargo_acceptance[i];
+	}
 }
 
 static void GetTileDesc_Town(TileIndex tile, TileDesc *td)
@@ -428,7 +563,7 @@
 	td->owner = OWNER_TOWN;
 }
 
-static uint32 GetTileTrackStatus_Town(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Town(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	/* not used */
 	return 0;
@@ -446,13 +581,21 @@
 	{ 0,  1},
 	{-1,  0},
 
-	// Store the first 3 elements again.
-	// Lets us rotate without using &3.
+	/* Store the first 3 elements again.
+	 * Lets us rotate without using &3. */
 	{ 0, -1},
 	{ 1,  0},
 	{ 0,  1}
 };
 
+/**
+ * Distance multiplyer
+ * Defines the possible distances between 2 road tiles
+ */
+enum RoadBlockTitleDistance {
+	RB_TILE_DIST1 = 1, ///< 1 tile between
+	RB_TILE_DIST2,     ///< 2 tiles between
+};
 
 static bool GrowTown(Town *t);
 
@@ -493,7 +636,7 @@
 
 static RoadBits GetTownRoadMask(TileIndex tile)
 {
-	TrackBits b = GetAnyRoadTrackBits(tile);
+	TrackBits b = GetAnyRoadTrackBits(tile, ROADTYPE_ROAD);
 	RoadBits r = ROAD_NONE;
 
 	if (b & TRACK_BIT_X)     r |= ROAD_X;
@@ -505,21 +648,38 @@
 	return r;
 }
 
+/**
+ * Check if a neighboring tile has a road
+ *
+ * @param tile curent tile
+ * @param dir target direction
+ * @param dist_multi distance multiplyer
+ * @return true if one of the neighboring tiles at the
+ *  given distance is a road tile else
+ */
+static bool NeighborIsRoadTile(TileIndex tile, int dir, RoadBlockTitleDistance dist_multi)
+{
+	return (HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * ToTileIndexDiff(_roadblock_tileadd[dir + 1]))), dir ^ 2) ||
+			HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * ToTileIndexDiff(_roadblock_tileadd[dir + 3]))), dir ^ 2) ||
+			HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * (ToTileIndexDiff(_roadblock_tileadd[dir + 1]) + ToTileIndexDiff(_roadblock_tileadd[dir + 2])))), dir) ||
+			HASBIT(GetTownRoadMask(TILE_ADD(tile, dist_multi * (ToTileIndexDiff(_roadblock_tileadd[dir + 3]) + ToTileIndexDiff(_roadblock_tileadd[dir + 2])))), dir));
+}
+
 static bool IsRoadAllowedHere(TileIndex tile, int dir)
 {
 	Slope k;
 	Slope slope;
 
-	// If this assertion fails, it might be because the world contains
-	//  land at the edges. This is not ok.
+	/* If this assertion fails, it might be because the world contains
+	 *  land at the edges. This is not ok. */
 	TILE_ASSERT(tile);
 
 	for (;;) {
-		// Check if there already is a road at this point?
-		if (GetAnyRoadTrackBits(tile) == 0) {
-			// No, try to build one in the direction.
-			// if that fails clear the land, and if that fails exit.
-			// This is to make sure that we can build a road here later.
+		/* Check if there already is a road at this point? */
+		if (GetAnyRoadTrackBits(tile, ROADTYPE_ROAD) == 0) {
+			/* No, try to build one in the direction.
+			 * if that fails clear the land, and if that fails exit.
+			 * This is to make sure that we can build a road here later. */
 			if (CmdFailed(DoCommand(tile, (dir & 1 ? ROAD_X : ROAD_Y), 0, DC_AUTO, CMD_BUILD_ROAD)) &&
 					CmdFailed(DoCommand(tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR)))
 				return false;
@@ -528,20 +688,21 @@
 		slope = GetTileSlope(tile, NULL);
 		if (slope == SLOPE_FLAT) {
 no_slope:
-			// Tile has no slope
-			// Disallow the road if any neighboring tile has a road.
-			if (HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+1]))), dir^2) ||
-					HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+3]))), dir^2) ||
-					HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+1]) + ToTileIndexDiff(_roadblock_tileadd[dir+2]))), dir) ||
-					HASBIT(GetTownRoadMask(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[dir+3]) + ToTileIndexDiff(_roadblock_tileadd[dir+2]))), dir))
-				return false;
-
-			// Otherwise allow
-			return true;
+			/* Tile has no slope */
+			switch (_patches.town_layout) {
+				default: NOT_REACHED();
+
+				case TL_ORIGINAL: /* Disallow the road if any neighboring tile has a road (distance: 1) */
+					return !NeighborIsRoadTile(tile, dir, RB_TILE_DIST1);
+
+				case TL_BETTER_ROADS: /* Disallow the road if any neighboring tile has a road (distance: 1 and 2). */
+					return !(NeighborIsRoadTile(tile, dir, RB_TILE_DIST1) ||
+							NeighborIsRoadTile(tile, dir, RB_TILE_DIST2));
+			}
 		}
 
-		// If the tile is not a slope in the right direction, then
-		// maybe terraform some.
+		/* If the tile is not a slope in the right direction, then
+		 * maybe terraform some. */
 		k = (dir & 1) ? SLOPE_NE : SLOPE_NW;
 		if (k != slope && ComplementSlope(k) != slope) {
 			uint32 r = Random();
@@ -557,7 +718,7 @@
 					                      CMD_TERRAFORM_LAND);
 				}
 				if (CmdFailed(res) && CHANCE16I(1, 3, r)) {
-					// We can consider building on the slope, though.
+					/* We can consider building on the slope, though. */
 					goto no_slope;
 				}
 			}
@@ -585,17 +746,138 @@
 
 	TILE_ASSERT(tile);
 
-	// Don't terraform if land is plain or if there's a house there.
+	/* Don't terraform if land is plain or if there's a house there. */
 	if (IsTileType(tile, MP_HOUSE)) return;
 	tileh = GetTileSlope(tile, NULL);
 	if (tileh == SLOPE_FLAT) return;
 
-	// First try up, then down
+	/* First try up, then down */
 	if (!TerraformTownTile(tile, ~tileh & 0xF, 1)) {
 		TerraformTownTile(tile, tileh & 0xF, 0);
 	}
 }
 
+/**
+ * Generate the RoadBits of a grid tile
+ *
+ * @param t current town
+ * @param tile tile in reference to the town
+ * @return the RoadBit of the current tile regarding
+ *  the selected town layout
+ */
+static RoadBits GetTownRoadGridElement(Town* t, TileIndex tile)
+{
+	/* align the grid to the downtown */
+	TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile); ///< Vector from downtown to the tile
+
+	/* lx, ly description:
+	 * @li lx and ly are true  if the tile is a crossing tile.
+	 * @li lx xor ly are true  if the tile is a straight road tile.
+	 * @li lx and ly are false if the tile is a house tile.
+	 */
+	bool lx, ly;
+
+	switch (_patches.town_layout) {
+		default: NOT_REACHED();
+
+		case TL_2X2_GRID:
+			lx = ((grid_pos.x % 3) == 0);
+			ly = ((grid_pos.y % 3) == 0);
+			break;
+
+		case TL_3X3_GRID:
+			lx = ((grid_pos.x % 4) == 0);
+			ly = ((grid_pos.y % 4) == 0);
+			break;
+	}
+
+	/* generate the basic grid structure */
+	if (!lx && !ly) {         ///< It is a house tile
+		return ROAD_NONE;
+	} else if (lx && !ly) {   ///< It is a Y-dir road tile
+		return ROAD_Y;
+	} else if (!lx && ly) {   ///< It is a X-dir road tile
+		return ROAD_X;
+	} else {                  ///< It is a crossing tile
+		/* Presets for junctions on slopes
+		 * not nice :( */
+		switch (GetTileSlope(tile, NULL)) {
+			case SLOPE_W:
+				return ROAD_NW | ROAD_SW;
+			case SLOPE_S:
+				return ROAD_SE | ROAD_SW;
+			case SLOPE_SW:
+				return ROAD_Y | ROAD_SW;
+			case SLOPE_E:
+				return ROAD_NE | ROAD_SE;
+			case SLOPE_SE:
+				return ROAD_X | ROAD_SE;
+			case SLOPE_N:
+				return ROAD_NW | ROAD_NE;
+			case SLOPE_NW:
+				return ROAD_X | ROAD_NW;
+			case SLOPE_NE:
+				return ROAD_Y | ROAD_NE;
+			case SLOPE_STEEP_W:
+			case SLOPE_STEEP_N:
+				return ROAD_X;
+			case SLOPE_STEEP_S:
+			case SLOPE_STEEP_E:
+				return ROAD_Y;
+			default:
+				return ROAD_ALL;
+		}
+	}
+}
+
+/**
+ * Check there are enougth neighbor house tiles next to the current tile
+ *
+ * @param tile current tile
+ * @return true if there are more than 2 house tiles next
+ *  to the current one
+ */
+static bool NeighborsAreHouseTiles(TileIndex tile)
+{
+	uint counter = 0; ///< counts the house neighbor tiles
+
+	/* We can't look further than that. */
+	if (TileX(tile) < 1 || TileY(tile) < 1) {
+		return false;
+	}
+
+	/* Check the tiles E,N,W and S of the current tile. */
+	for (uint i = 0; i < 4; i++) {
+		if (IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[i])), MP_HOUSE)) {
+			counter++;
+		}
+
+		/* If there are enougth neighbor's stop it here */
+		if (counter >= 3) {
+			return true;
+		}
+	}
+	return false;
+}
+
+/**
+ * Grows the given town.
+ * There are at the moment 3 possible way's for
+ * the town expansion:
+ * @li Generate a random tile and check if there is a road allowed
+ * 	@li TL_ORIGINAL
+ * 	@li TL_BETTER_ROADS
+ * @li Check if the town geometry allows a road and which one
+ * 	@li TL_2X2_GRID
+ * 	@li TL_3X3_GRID
+ * @li Forbid roads, only build houses
+ * 	@li TL_NO_ROADS
+ *
+ * @param tile_ptr current tile
+ * @param mask current tiles RoadBits
+ * @param block road block
+ * @param t1 current town
+ */
 static void GrowTownInTile(TileIndex* tile_ptr, RoadBits mask, int block, Town* t1)
 {
 	RoadBits rcmd;
@@ -610,49 +892,91 @@
 		int a;
 		int b;
 
-		// Tile has no road. First reset the status counter
-		// to say that this is the last iteration.
+		/* Tile has no road. First reset the status counter
+		 * to say that this is the last iteration. */
 		_grow_town_result = 0;
 
-		// Remove hills etc
+		/* Remove hills etc */
 		LevelTownLand(tile);
 
-		// Is a road allowed here?
-		if (!IsRoadAllowedHere(tile, block)) return;
-
-		// Randomize new road block numbers
-		a = block;
-		b = block ^ 2;
-		if (CHANCE16(1, 4)) {
-			do {
-				a = GB(Random(), 0, 2);
-			} while (a == b);
+		/* Is a road allowed here? */
+		switch (_patches.town_layout) {
+			default: NOT_REACHED();
+
+			case TL_NO_ROADS: /* Disallow Roads */
+				return;
+
+			case TL_3X3_GRID:
+			case TL_2X2_GRID:
+				rcmd = GetTownRoadGridElement(t1, tile);
+				if (rcmd == ROAD_NONE) {
+					return;
+				}
+				break;
+
+			case TL_BETTER_ROADS:
+			case TL_ORIGINAL:
+				if (!IsRoadAllowedHere(tile, block)) {
+					return;
+				}
+
+				/* Randomize new road block numbers */
+				a = block;
+				b = block ^ 2;
+				if (CHANCE16(1, 4)) {
+					do {
+						a = GB(Random(), 0, 2);
+					} while (a == b);
+				}
+
+				if (!IsRoadAllowedHere(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a])), a)) {
+					/* A road is not allowed to continue the randomized road,
+					 *   return if the road we're trying to build is curved. */
+					if (a != (b ^ 2)) {
+						return;
+					}
+
+					/* Return if neither side of the new road is a house */
+					if (!IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 1])), MP_HOUSE) &&
+							!IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 3])), MP_HOUSE)) {
+						return;
+					}
+
+					/* That means that the road is only allowed if there is a house
+					 *  at any side of the new road. */
+				}
+
+				rcmd = (RoadBits)((1 << a) + (1 << b));
+				break;
 		}
 
-		if (!IsRoadAllowedHere(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a])), a)) {
-			// A road is not allowed to continue the randomized road,
-			//   return if the road we're trying to build is curved.
-			if (a != (b ^ 2)) return;
-
-			// Return if neither side of the new road is a house
-			if (!IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 1])), MP_HOUSE) &&
-					!IsTileType(TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[a + 3])), MP_HOUSE))
+	} else if (block < 5 && !HASBIT(mask, block ^ 2)) {
+		/* Continue building on a partial road.
+		 * Always OK. */
+		_grow_town_result = 0;
+
+		switch (_patches.town_layout) {
+			default: NOT_REACHED();
+
+			case TL_NO_ROADS: /* Disallow Roads */
 				return;
 
-			// That means that the road is only allowed if there is a house
-			//  at any side of the new road.
+			case TL_3X3_GRID:
+			case TL_2X2_GRID:
+			 	rcmd = GetTownRoadGridElement(t1, tile);
+				break;
+
+			case TL_BETTER_ROADS:
+			case TL_ORIGINAL:
+				rcmd = (RoadBits)(1 << (block ^ 2));
+				break;
 		}
-		rcmd = (RoadBits)((1 << a) + (1 << b));
-
-	} else if (block < 5 && !HASBIT(mask,block^2)) {
-		// Continue building on a partial road.
-		// Always OK.
-		_grow_town_result = 0;
-		rcmd = (RoadBits)(1 << (block ^ 2));
 	} else {
 		int i;
-
-		// Reached a tunnel/bridge? Then continue at the other side of it.
+		bool allow_house = false;
+		TileIndex tmptile2;
+
+		/* Reached a tunnel/bridge? Then continue at the other side of it. */
 		if (IsTileType(tile, MP_TUNNELBRIDGE)) {
 			if (IsTunnel(tile) && GetTunnelTransportType(tile) == TRANSPORT_ROAD) {
 				*tile_ptr = GetOtherTunnelEnd(tile);
@@ -662,28 +986,62 @@
 			return;
 		}
 
-		// Possibly extend the road in a direction.
-		// Randomize a direction and if it has a road, bail out.
+		/* Possibly extend the road in a direction.
+		 * Randomize a direction and if it has a road, bail out. */
 		i = GB(Random(), 0, 2);
 		if (HASBIT(mask, i)) return;
 
-		// This is the tile we will reach if we extend to this direction.
+		/* This is the tile we will reach if we extend to this direction. */
 		tmptile = TILE_ADD(tile, ToTileIndexDiff(_roadblock_tileadd[i]));
 
-		// Don't do it if it reaches to water.
+		/* Don't do it if it reaches to water. */
 		if (IsClearWaterTile(tmptile)) return;
 
-		// Build a house at the edge. 60% chance or
-		//  always ok if no road allowed.
-		if (!IsRoadAllowedHere(tmptile, i) || CHANCE16(6, 10)) {
-			// But not if there already is a house there.
+		switch (_patches.town_layout) {
+			default: NOT_REACHED();
+
+			case TL_NO_ROADS:
+				allow_house = true;
+				break;
+
+			case TL_3X3_GRID: /* Use 2x2 grid afterwards! */
+				/* Fill gap if house has enougth neighbors */
+				tmptile2 = TILE_ADD(tmptile, ToTileIndexDiff(_roadblock_tileadd[i]));
+				if (NeighborsAreHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) {
+					_grow_town_result = -1;
+				}
+
+			case TL_2X2_GRID:
+				rcmd = GetTownRoadGridElement(t1, tmptile);
+				allow_house = (rcmd == ROAD_NONE);
+				break;
+
+			case TL_BETTER_ROADS: /* Use original afterwards! */
+				/* Fill gap if house has enougth neighbors */
+				tmptile2 = TILE_ADD(tmptile, ToTileIndexDiff(_roadblock_tileadd[i]));
+				if (NeighborsAreHouseTiles(tmptile2) && BuildTownHouse(t1, tmptile2)) {
+					_grow_town_result = -1;
+				}
+
+			case TL_ORIGINAL:
+				 /* Allow a house at the edge. 60% chance or
+				  * always ok if no road allowed. */
+				allow_house = (!IsRoadAllowedHere(tmptile, i) || CHANCE16(6, 10));
+				break;
+		}
+
+
+		if (allow_house) {
+			/* Build a house, but not if there already is a house there. */
 			if (!IsTileType(tmptile, MP_HOUSE)) {
-				// Level the land if possible
+				/* Level the land if possible */
 				LevelTownLand(tmptile);
 
-				// And build a house.
-				// Set result to -1 if we managed to build it.
-				if (BuildTownHouse(t1, tmptile)) _grow_town_result = -1;
+				/* And build a house.
+				 * Set result to -1 if we managed to build it. */
+				if (BuildTownHouse(t1, tmptile)) {
+					_grow_town_result = -1;
+				}
 			}
 			return;
 		}
@@ -692,11 +1050,11 @@
 		rcmd = (RoadBits)(1 << i);
 	}
 
-	// Return if a water tile
+	/* Return if a water tile */
 	if (IsClearWaterTile(tile)) return;
 
-	// Determine direction of slope,
-	//  and build a road if not a special slope.
+	/* Determine direction of slope,
+	 *  and build a road if not a special slope. */
 	switch (GetTileSlope(tile, NULL)) {
 		case SLOPE_SW: i = DIAGDIR_NE; break;
 		case SLOPE_SE: i = DIAGDIR_NW; break;
@@ -711,9 +1069,15 @@
 			return;
 	}
 
+	/* Check if the bridge is in the right direction */
+	if ((rcmd == ROAD_X && (i == DIAGDIR_NW || i == DIAGDIR_SE)) ||
+			(rcmd == ROAD_Y && (i == DIAGDIR_NE || i == DIAGDIR_SW))) {
+		goto build_road_and_exit;
+	}
+
 	tmptile = tile;
 
-	// Now it contains the direction of the slope
+	/* Now it contains the direction of the slope */
 	j = -11; // max 11 tile long bridges
 	do {
 		if (++j == 0)
@@ -721,11 +1085,11 @@
 		tmptile = TILE_MASK(tmptile + TileOffsByDiagDir(i));
 	} while (IsClearWaterTile(tmptile));
 
-	// no water tiles in between?
+	/* no water tiles in between? */
 	if (j == -10)
 		goto build_road_and_exit;
 
-	// Quit if it selecting an appropiate bridge type fails a large number of times.
+	/* Quit if it selecting an appropiate bridge type fails a large number of times. */
 	j = 22;
 	{
 		int32 bridge_len = GetBridgeLength(tile, tmptile);
@@ -735,39 +1099,58 @@
 				if (!CmdFailed(DoCommand(tile, tmptile, 0x8000 + bridge_type, DC_EXEC | DC_AUTO, CMD_BUILD_BRIDGE)))
 					_grow_town_result = -1;
 
-				// obviously, if building any bridge would fail, there is no need to try other bridge-types
+				/* obviously, if building any bridge would fail, there is no need to try other bridge-types */
 				return;
 			}
 		} while (--j != 0);
 	}
 }
 
-// Returns true if a house was built, or no if the build failed.
+/** Returns "growth" if a house was built, or no if the build failed.
+ * @param t town to inquiry
+ * @param tile to inquiry
+ * @return something other than zero(0)if town expansion was possible
+ */
 static int GrowTownAtRoad(Town *t, TileIndex tile)
 {
 	int block = 5; // special case
 
 	TILE_ASSERT(tile);
 
-	// Number of times to search.
-	_grow_town_result = 10 + t->num_houses * 4 / 9;
+	/* Number of times to search.
+	 * Better roads, 2X2 and 3X3 grid grow quite fast so we give
+	 * them a little handicap. */
+	switch (_patches.town_layout) {
+		case TL_BETTER_ROADS:
+			_grow_town_result = 10 + t->num_houses * 2 / 9;
+			break;
+
+		case TL_3X3_GRID:
+		case TL_2X2_GRID:
+			_grow_town_result = 10 + t->num_houses * 1 / 9;
+			break;
+
+		default:
+			_grow_town_result = 10 + t->num_houses * 4 / 9;
+			break;
+	}
 
 	do {
-		// Get a bitmask of the road blocks on a tile
+		/* Get a bitmask of the road blocks on a tile */
 		RoadBits mask = GetTownRoadMask(tile);
 
-		// Try to grow the town from this point
-		GrowTownInTile(&tile,mask,block,t);
-
-		// Exclude the source position from the bitmask
-		// and return if no more road blocks available
+		/* Try to grow the town from this point */
+		GrowTownInTile(&tile, mask, block, t);
+
+		/* Exclude the source position from the bitmask
+		 * and return if no more road blocks available */
 		ClrBitT(mask, (block ^ 2));
 		if (mask == 0)
 			return _grow_town_result;
 
-		// Select a random bit from the blockmask, walk a step
-		// and continue the search from there.
-		do block = Random() & 3; while (!HASBIT(mask,block));
+		/* Select a random bit from the blockmask, walk a step
+		 * and continue the search from there. */
+		do block = Random() & 3; while (!HASBIT(mask, block));
 		tile += ToTileIndexDiff(_roadblock_tileadd[block]);
 
 		if (IsTileType(tile, MP_STREET)) {
@@ -782,15 +1165,15 @@
 			}
 		}
 
-		// Max number of times is checked.
+		/* Max number of times is checked. */
 	} while (--_grow_town_result >= 0);
 
 	return (_grow_town_result == -2);
 }
 
-// Generate a random road block
-// The probability of a straight road
-// is somewhat higher than a curved.
+/** Generate a random road block
+ * The probability of a straight road
+ * is somewhat higher than a curved. */
 static RoadBits GenRandomRoadBits()
 {
 	uint32 r = Random();
@@ -800,8 +1183,8 @@
 	return (RoadBits)((1 << a) + (1 << b));
 }
 
-// Grow the town
-// Returns true if a house was built, or no if the build failed.
+/** Grow the town
+ * @Return true if a house was built, or no if the build failed. */
 static bool GrowTown(Town *t)
 {
 	TileIndex tile;
@@ -824,14 +1207,21 @@
 		{ 0,  0}
 	};
 
-	// Current player is a town
+	/* Let the town be a ghost town
+	 * The player wanted it in such a way. Thus there he has it. ;)
+	 * Never reached in editor mode. */
+	if (_patches.town_layout == TL_NO_ROADS && _generating_world) {
+		return false;
+	}
+
+	/* Current player is a town */
 	old_player = _current_player;
 	_current_player = OWNER_TOWN;
 
-	// Find a road that we can base the construction on.
+	/* Find a road that we can base the construction on. */
 	tile = t->xy;
 	for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
-		if (GetAnyRoadTrackBits(tile) != 0) {
+		if (GetAnyRoadTrackBits(tile, ROADTYPE_ROAD) != 0) {
 			int r = GrowTownAtRoad(t, tile);
 			_current_player = old_player;
 			return r != 0;
@@ -839,13 +1229,13 @@
 		tile = TILE_ADD(tile, ToTileIndexDiff(*ptr));
 	}
 
-	// No road available, try to build a random road block by
-	// clearing some land and then building a road there.
+	/* No road available, try to build a random road block by
+	 * clearing some land and then building a road there. */
 	tile = t->xy;
 	for (ptr = _town_coord_mod; ptr != endof(_town_coord_mod); ++ptr) {
 		/* Only work with plain land that not already has a house */
 		if (!IsTileType(tile, MP_HOUSE) && GetTileSlope(tile, NULL) == SLOPE_FLAT) {
-			if (!CmdFailed(DoCommand(tile, 0, 0, DC_AUTO, CMD_LANDSCAPE_CLEAR))) {
+			if (!CmdFailed(DoCommand(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_LANDSCAPE_CLEAR))) {
 				DoCommand(tile, GenRandomRoadBits(), t->index, DC_EXEC | DC_AUTO, CMD_BUILD_ROAD);
 				_current_player = old_player;
 				return true;
@@ -890,11 +1280,11 @@
 		memcpy(t->radius, _town_radius_data[t->num_houses / 4], sizeof(t->radius));
 	} else {
 		int mass = t->num_houses / 8;
-		// At least very roughly extrapolate. Empirical numbers dancing between
-		// overwhelming by cottages and skyscrapers outskirts.
+		/* At least very roughly extrapolate. Empirical numbers dancing between
+		 * overwhelming by cottages and skyscrapers outskirts. */
 		t->radius[0] = mass * mass;
-		// Actually we are proportional to sqrt() but that's right because
-		// we are covering an area.
+		/* Actually we are proportional to sqrt() but that's right because
+		 * we are covering an area. */
 		t->radius[1] = mass * 7;
 		t->radius[2] = 0;
 		t->radius[3] = mass * 4;
@@ -926,12 +1316,12 @@
 		SetDParam(0, r);
 		GetString(buf1, townnametype, lastof(buf1));
 
-		// Check size and width
+		/* Check size and width */
 		if (strlen(buf1) >= 31 || GetStringBoundingBox(buf1).width > 130) continue;
 
 		FOR_ALL_TOWNS(t2) {
-			// We can't just compare the numbers since
-			// several numbers may map to a single name.
+			/* We can't just compare the numbers since
+			 * several numbers may map to a single name. */
 			SetDParam(0, t2->index);
 			GetString(buf2, STR_TOWN, lastof(buf2));
 			if (strcmp(buf1, buf2) == 0) {
@@ -950,11 +1340,20 @@
 	t->max_mail = t->population >> 4;
 }
 
-static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, uint size_mode)
+/**
+ * Does the actual town creation.
+ *
+ * @param t The town
+ * @param tile Where to put it
+ * @param townnameparts The town name
+ * @param size_mode How the size should be determined
+ * @param size Parameter for size determination
+ */
+static void DoCreateTown(Town *t, TileIndex tile, uint32 townnameparts, TownSizeMode size_mode, uint size)
 {
 	int x, i;
 
-	// clear the town struct
+	/* clear the town struct */
 	i = t->index;
 	memset(t, 0, sizeof(Town));
 	t->index = i;
@@ -999,10 +1398,25 @@
 	UpdateTownVirtCoord(t);
 	_town_sort_dirty = true;
 
-	if (size_mode == 0) {
-		x = (Random() & 0xF) + 8;
-	} else {
-		x = (size_mode - 1) * 16 + 3;
+	/* Random town size. */
+	x = (Random() & 0xF) + 8;
+
+	switch (size_mode) {
+		default: NOT_REACHED();
+
+		case TSM_RANDOM:
+			t->larger_town = false;
+			break;
+
+		case TSM_FIXED:
+			x = size * 16 + 3;
+			t->larger_town = false;
+			break;
+
+		case TSM_CITY:
+			x *= _patches.initial_city_size;
+			t->larger_town = true;
+			break;
 	}
 
 	t->num_houses += x;
@@ -1046,8 +1460,9 @@
  * This obviously only works in the scenario editor. Function not removed
  * as it might be possible in the future to fund your own town :)
  * @param tile coordinates where town is built
- * @param p1 size of the town (0 = random, 1 = small, 2 = medium, 3 = large)
- * @param p2 unused
+ * @param flags type of operation
+ * @param p1 size of the town (0 = small, 1 = medium, 2 = large)
+ * @param p2 size mode (@see TownSizeMode)
  */
 int32 CmdBuildTown(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -1056,86 +1471,90 @@
 
 	/* Only in the scenario editor */
 	if (_game_mode != GM_EDITOR) return CMD_ERROR;
+	if (p2 > TSM_CITY) return CMD_ERROR;
 
 	SET_EXPENSES_TYPE(EXPENSES_OTHER);
 
-	// Check if too close to the edge of map
+	/* Check if too close to the edge of map */
 	if (DistanceFromEdge(tile) < 12)
 		return_cmd_error(STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP);
 
-	// Can only build on clear flat areas, possibly with trees.
+	/* Can only build on clear flat areas, possibly with trees. */
 	if ((!IsTileType(tile, MP_CLEAR) && !IsTileType(tile, MP_TREES)) || GetTileSlope(tile, NULL) != SLOPE_FLAT) {
 		return_cmd_error(STR_0239_SITE_UNSUITABLE);
 	}
 
-	// Check distance to all other towns.
+	/* Check distance to all other towns. */
 	if (IsCloseToTown(tile, 20))
 		return_cmd_error(STR_0238_TOO_CLOSE_TO_ANOTHER_TOWN);
 
-	// Get a unique name for the town.
+	/* Get a unique name for the town. */
 	if (!CreateTownName(&townnameparts))
 		return_cmd_error(STR_023A_TOO_MANY_TOWNS);
 
-	// Allocate town struct
+	/* Allocate town struct */
 	t = AllocateTown();
 	if (t == NULL) return_cmd_error(STR_023A_TOO_MANY_TOWNS);
 
-	// Create the town
+	/* Create the town */
 	if (flags & DC_EXEC) {
 		_generating_world = true;
-		DoCreateTown(t, tile, townnameparts, p1);
+		DoCreateTown(t, tile, townnameparts, (TownSizeMode)p2, p1);
 		_generating_world = false;
 	}
 	return 0;
 }
 
-Town *CreateRandomTown(uint attempts, uint size_mode)
+Town *CreateRandomTown(uint attempts, TownSizeMode mode, uint size)
 {
 	TileIndex tile;
 	Town *t;
 	uint32 townnameparts;
 
 	do {
-		// Generate a tile index not too close from the edge
+		/* Generate a tile index not too close from the edge */
 		tile = RandomTile();
 		if (DistanceFromEdge(tile) < 20) continue;
 
-		// Make sure the tile is plain
+		/* Make sure the tile is plain */
 		if (!IsTileType(tile, MP_CLEAR) || GetTileSlope(tile, NULL) != SLOPE_FLAT) continue;
 
-		// Check not too close to a town
+		/* Check not too close to a town */
 		if (IsCloseToTown(tile, 20)) continue;
 
-		// Get a unique name for the town.
+		/* Get a unique name for the town. */
 		if (!CreateTownName(&townnameparts)) break;
 
-		// Allocate a town struct
+		/* Allocate a town struct */
 		t = AllocateTown();
 		if (t == NULL) break;
 
-		DoCreateTown(t, tile, townnameparts, size_mode);
+		DoCreateTown(t, tile, townnameparts, mode, size);
 		return t;
 	} while (--attempts);
 	return NULL;
 }
 
-static const byte _num_initial_towns[3] = {11, 23, 46};
+static const byte _num_initial_towns[4] = {5, 11, 23, 46};
 
 bool GenerateTowns()
 {
 	uint num = 0;
 	uint n = ScaleByMapSize(_num_initial_towns[_opt.diff.number_towns] + (Random() & 7));
+	uint num_cities = _patches.larger_towns == 0 ? 0 : n / _patches.larger_towns;
 
 	SetGeneratingWorldProgress(GWP_TOWN, n);
 
 	do {
 		IncreaseGeneratingWorldProgress(GWP_TOWN);
-		// try 20 times to create a random-sized town for the first loop.
-		if (CreateRandomTown(20, 0) != NULL) num++;
+		/* try 20 times to create a random-sized town for the first loop. */
+		TownSizeMode mode = num_cities > 0 ? TSM_CITY : TSM_RANDOM;
+		if (CreateRandomTown(20, mode, _patches.initial_city_size) != NULL) num++;
+		if (num_cities > 0) num_cities--;
 	} while (--n);
 
-	// give it a last try, but now more aggressive
-	if (num == 0 && CreateRandomTown(10000, 0) == NULL) {
+	/* give it a last try, but now more aggressive */
+	if (num == 0 && CreateRandomTown(10000, TSM_RANDOM, 0) == NULL) {
 		if (GetNumTowns() == 0) {
 			/* XXX - can we handle that more gracefully? */
 			if (_game_mode != GM_EDITOR) error("Could not generate any town");
@@ -1223,10 +1642,10 @@
 	uint oneof = 0;
 	HouseSpec *hs;
 
-	// Above snow?
+	/* Above snow? */
 	slope = GetTileSlope(tile, &z);
 
-	// Get the town zone type
+	/* Get the town zone type */
 	{
 		uint rad = GetTownRadiusGroup(t, tile);
 
@@ -1236,20 +1655,20 @@
 		bitmask = (1 << rad) + (1 << (land + 12));
 	}
 
-	// bits 0-4 are used
-	// bits 11-15 are used
-	// bits 5-10 are not used.
+	/* bits 0-4 are used
+	 * bits 11-15 are used
+	 * bits 5-10 are not used. */
 	{
 		HouseID houses[HOUSE_MAX];
 		int num = 0;
 		uint cumulative_probs[HOUSE_MAX];
 		uint probability_max = 0;
 
-		// Generate a list of all possible houses that can be built.
+		/* Generate a list of all possible houses that can be built. */
 		for (i = 0; i < HOUSE_MAX; i++) {
 			hs = GetHouseSpecs(i);
 			if ((~hs->building_availability & bitmask) == 0 && hs->enabled) {
-				if (_have_newhouses) {
+				if (HASBIT(_loaded_newgrf_features, GRFLOADED_NEWHOUSES)) {
 					probability_max += hs->probability;
 					cumulative_probs[num] = probability_max;
 				}
@@ -1258,7 +1677,7 @@
 		}
 
 		for (;;) {
-			if (_have_newhouses) {
+			if (HASBIT(_loaded_newgrf_features, GRFLOADED_NEWHOUSES)) {
 				uint r = RandomRange(probability_max);
 				for (i = 0; i < num; i++) if (cumulative_probs[i] >= r) break;
 
@@ -1269,20 +1688,20 @@
 
 			hs = GetHouseSpecs(house);
 
-			if (_have_newhouses) {
+			if (HASBIT(_loaded_newgrf_features, GRFLOADED_NEWHOUSES)) {
 				if (hs->override != 0) hs = GetHouseSpecs(hs->override);
 
 				if ((hs->extra_flags & BUILDING_IS_HISTORICAL) && !_generating_world) continue;
 
 				if (HASBIT(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) {
-					uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, house, t, tile);
+					uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile);
 					if (callback_res != CALLBACK_FAILED && callback_res == 0) continue;
 				}
 			}
 
 			if (_cur_year < hs->min_date || _cur_year > hs->max_date) continue;
 
-			// Special houses that there can be only one of.
+			/* Special houses that there can be only one of. */
 			if (hs->building_flags & BUILDING_IS_CHURCH) {
 				SETBIT(oneof, TOWN_HAS_CHURCH);
 			} else if (hs->building_flags & BUILDING_IS_STADIUM) {
@@ -1293,7 +1712,7 @@
 
 			if (HASBITS(t->flags12 , oneof)) continue;
 
-			// Make sure there is no slope?
+			/* Make sure there is no slope? */
 			if (hs->building_flags & TILE_NOT_SLOPED && slope != SLOPE_FLAT) continue;
 
 			if (hs->building_flags & TILE_SIZE_2x2) {
@@ -1327,7 +1746,7 @@
 	t->num_houses++;
 	IncreaseBuildingCount(t, house);
 
-	// Special houses that there can be only one of.
+	/* Special houses that there can be only one of. */
 	t->flags12 |= oneof;
 
 	{
@@ -1379,7 +1798,7 @@
 
 	assert(IsTileType(tile, MP_HOUSE));
 
-	// need to align the tile to point to the upper left corner of the house
+	/* need to align the tile to point to the upper left corner of the house */
 	if (house >= 3) { // house id 0,1,2 MUST be single tile houses, or this code breaks.
 		if (GetHouseSpecs(house-1)->building_flags & TILE_SIZE_2x1) {
 			house--;
@@ -1398,7 +1817,7 @@
 
 	hs = GetHouseSpecs(house);
 
-	// Remove population from the town if the house is finished.
+	/* Remove population from the town if the house is finished. */
 	if (IsHouseCompleted(tile)) {
 		ChangePopulation(t, -hs->population);
 	}
@@ -1406,14 +1825,14 @@
 	t->num_houses--;
 	DecreaseBuildingCount(t, house);
 
-	// Clear flags for houses that only may exist once/town.
+	/* Clear flags for houses that only may exist once/town. */
 	if (hs->building_flags & BUILDING_IS_CHURCH) {
 		CLRBIT(t->flags12, TOWN_HAS_CHURCH);
 	} else if (hs->building_flags & BUILDING_IS_STADIUM) {
 		CLRBIT(t->flags12, TOWN_HAS_STADIUM);
 	}
 
-	// Do the actual clearing of tiles
+	/* Do the actual clearing of tiles */
 	eflags = hs->building_flags;
 	DoClearTownHouseHelper(tile);
 	if (eflags & BUILDING_2_TILES_X)   DoClearTownHouseHelper(tile + TileDiffXY(1, 0));
@@ -1423,6 +1842,7 @@
 
 /** Rename a town (server-only).
  * @param tile unused
+ * @param flags type of operation
  * @param p1 town ID to rename
  * @param p2 unused
  */
@@ -1452,7 +1872,7 @@
 	return 0;
 }
 
-// Called from GUI
+/** Called from GUI */
 void ExpandTown(Town *t)
 {
 	int amount, n;
@@ -1537,6 +1957,7 @@
 
 /**
  * Search callback function for TownActionBuildStatue
+ * @param tile on which to perform the search
  * @param town_id The town_id for which we want a statue
  * @return the result of the test
  */
@@ -1555,16 +1976,16 @@
 	TileIndex tile = t->xy;
 
 	if (CircularTileSearch(tile, 9, SearchTileForStatue, t->index))
-		SETBIT(t->statues, _current_player); ///< Once found and built, "inform" the Town
+		SETBIT(t->statues, _current_player); // Once found and built, "inform" the Town
 }
 
 static void TownActionFundBuildings(Town* t)
 {
-	// Build next tick
+	/* Build next tick */
 	t->grow_counter = 1;
-	// If we were not already growing
+	/* If we were not already growing */
 	SETBIT(t->flags12, TOWN_IS_FUNDED);
-	// And grow for 3 months
+	/* And grow for 3 months */
 	t->fund_buildings_months = 3;
 }
 
@@ -1581,18 +2002,18 @@
 	if (!RandomRange(15)) {
 		Station *st;
 
-		// set as unwanted for 6 months
+		/* set as unwanted for 6 months */
 		t->unwanted[_current_player] = 6;
 
-		// set all close by station ratings to 0
+		/* set all close by station ratings to 0 */
 		FOR_ALL_STATIONS(st) {
 			if (st->town == t && st->owner == _current_player) {
 				for (CargoID i = 0; i < NUM_CARGO; i++) st->goods[i].rating = 0;
 			}
 		}
 
-		// only show errormessage to the executing player. All errors are handled command.c
-		// but this is special, because it can only 'fail' on a DC_EXEC
+		/* only show errormessage to the executing player. All errors are handled command.c
+		 * but this is special, because it can only 'fail' on a DC_EXEC */
 		if (IsLocalPlayer()) ShowErrorMessage(STR_BRIBE_FAILED_2, STR_BRIBE_FAILED, 0, 0);
 
 		/* decrease by a lot!
@@ -1625,6 +2046,7 @@
  * This performs an action such as advertising, building a statue, funding buildings,
  * but also bribing the town-council
  * @param tile unused
+ * @param flags type of operation
  * @param p1 town to do the action at
  * @param p2 action to perform, @see _town_action_proc for the list of available actions
  */
@@ -1655,10 +2077,10 @@
 {
 	int n;
 	Station *st;
-	byte m;
+	uint16 m;
 	Player *p;
 
-	// Reset player ratings if they're low
+	/* Reset player ratings if they're low */
 	FOR_ALL_PLAYERS(p) {
 		if (p->is_active && t->ratings[p->index] <= 200) {
 			t->ratings[p->index] += 5;
@@ -1680,22 +2102,21 @@
 	}
 
 	CLRBIT(t->flags12, TOWN_IS_FUNDED);
+	if (_patches.town_growth_rate == 0 && t->fund_buildings_months == 0) return;
+
+	/** Towns are processed every TOWN_GROWTH_FREQUENCY ticks, and this is the
+	 * number of times towns are processed before a new building is built. */
+	static const uint16 _grow_count_values[2][6] = {
+		{ 120, 120, 120, 100,  80,  60 }, ///< Fund new buildings has been activated
+		{ 320, 420, 300, 220, 160, 100 }  ///< Normal values
+	};
 
 	if (t->fund_buildings_months != 0) {
-		static const byte _grow_count_values[6] = {
-			60, 60, 60, 50, 40, 30
-		};
-		m = _grow_count_values[min(n, 5)];
+		m = _grow_count_values[0][min(n, 5)];
 		t->fund_buildings_months--;
-	} else if (n == 0) {
-		m = 160;
-		if (!CHANCE16(1, 12))
-			return;
 	} else {
-		static const byte _grow_count_values[5] = {
-			210, 150, 110, 80, 50
-		};
-		m = _grow_count_values[min(n, 5) - 1];
+		m = _grow_count_values[1][min(n, 5)];
+		if (n == 0 && !CHANCE16(1, 12)) return;
 	}
 
 	if (_opt.landscape == LT_ARCTIC) {
@@ -1706,6 +2127,13 @@
 			return;
 	}
 
+	/* Use the normal growth rate values if new buildings have been funded in
+	 * this town and the growth rate is set to none. */
+	uint growth_multiplier = _patches.town_growth_rate != 0 ? _patches.town_growth_rate - 1 : 1;
+
+	m >>= growth_multiplier;
+	if (t->larger_town) m /= 2;
+
 	t->growth_rate = m / (t->num_houses / 50 + 1);
 	if (m <= t->grow_counter)
 		t->grow_counter = m;
@@ -1715,7 +2143,7 @@
 
 static void UpdateTownAmounts(Town *t)
 {
-	// Using +1 here to prevent overflow and division by zero
+	/* Using +1 here to prevent overflow and division by zero */
 	t->pct_pass_transported = t->new_act_pass * 256 / (t->new_max_pass + 1);
 
 	t->max_pass = t->new_max_pass; t->new_max_pass = 0;
@@ -1723,7 +2151,7 @@
 	t->act_food = t->new_act_food; t->new_act_food = 0;
 	t->act_water = t->new_act_water; t->new_act_water = 0;
 
-	// Using +1 here to prevent overflow and division by zero
+	/* Using +1 here to prevent overflow and division by zero */
 	t->pct_mail_transported = t->new_act_mail * 256 / (t->new_max_mail + 1);
 	t->max_mail = t->new_max_mail; t->new_max_mail = 0;
 	t->act_mail = t->new_act_mail; t->new_act_mail = 0;
@@ -1780,7 +2208,7 @@
 {
 	if (IsTileType(tile, MP_HOUSE) || (
 				IsTileType(tile, MP_STREET) &&
-				(IsLevelCrossing(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile)) == OWNER_TOWN
+				GetRoadOwner(tile, ROADTYPE_ROAD) == OWNER_TOWN
 			)) {
 		return GetTownByTile(tile);
 	} else {
@@ -1793,7 +2221,7 @@
 {
 	int rating;
 
-	// if magic_bulldozer cheat is active, town doesn't penaltize for removing stuff
+	/* if magic_bulldozer cheat is active, town doesn't penaltize for removing stuff */
 	if (t == NULL ||
 			!IsValidPlayer(_current_player) ||
 			(_cheats.magic_bulldozer.value && add < 0)) {
@@ -1820,17 +2248,17 @@
 
 /* penalty for removing town-owned stuff */
 static const int _default_rating_settings [3][3] = {
-	// ROAD_REMOVE, TUNNELBRIDGE_REMOVE, INDUSTRY_REMOVE
-	{  0, 128, 384}, // Permissive
-	{ 48, 192, 480}, // Neutral
-	{ 96, 384, 768}, // Hostile
+	/* ROAD_REMOVE, TUNNELBRIDGE_REMOVE, INDUSTRY_REMOVE */
+	{  0, 128, 384}, ///< Permissive
+	{ 48, 192, 480}, ///< Neutral
+	{ 96, 384, 768}, ///< Hostile
 };
 
 bool CheckforTownRating(uint32 flags, Town *t, byte type)
 {
 	int modemod;
 
-	// if magic_bulldozer cheat is active, town doesn't restrict your destructive actions
+	/* if magic_bulldozer cheat is active, town doesn't restrict your destructive actions */
 	if (t == NULL || !IsValidPlayer(_current_player) || _cheats.magic_bulldozer.value)
 		return true;
 
@@ -1900,7 +2328,7 @@
 };
 
 
-// Save and load of towns.
+/** Save and load of towns. */
 static const SaveLoad _town_desc[] = {
 	SLE_CONDVAR(Town, xy,                    SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
 	SLE_CONDVAR(Town, xy,                    SLE_UINT32,                 6, SL_MAX_VERSION),
@@ -1916,12 +2344,12 @@
 	    SLE_VAR(Town, flags12,               SLE_UINT8),
 	    SLE_VAR(Town, statues,               SLE_UINT8),
 
-	// sort_index_obsolete was stored here in savegame format 0 - 1
+	/* sort_index_obsolete was stored here in savegame format 0 - 1 */
 	SLE_CONDNULL(1, 0, 1),
 
 	    SLE_VAR(Town, have_ratings,          SLE_UINT8),
 	    SLE_ARR(Town, ratings,               SLE_INT16, 8),
-	// failed bribe attempts are stored since savegame format 4
+	/* failed bribe attempts are stored since savegame format 4 */
 	SLE_CONDARR(Town, unwanted,              SLE_INT8, 8, 4,SL_MAX_VERSION),
 
 	SLE_CONDVAR(Town, max_pass,              SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
@@ -1950,15 +2378,23 @@
 	    SLE_VAR(Town, new_act_food,          SLE_UINT16),
 	    SLE_VAR(Town, new_act_water,         SLE_UINT16),
 
-	    SLE_VAR(Town, time_until_rebuild,    SLE_UINT8),
-	    SLE_VAR(Town, grow_counter,          SLE_UINT8),
-	    SLE_VAR(Town, growth_rate,           SLE_UINT8),
+	SLE_CONDVAR(Town, time_until_rebuild,    SLE_UINT8,                  0, 53),
+	SLE_CONDVAR(Town, grow_counter,          SLE_UINT8,                  0, 53),
+	SLE_CONDVAR(Town, growth_rate,           SLE_UINT8,                  0, 53),
+
+	SLE_CONDVAR(Town, time_until_rebuild,    SLE_UINT16,                 54, SL_MAX_VERSION),
+	SLE_CONDVAR(Town, grow_counter,          SLE_UINT16,                 54, SL_MAX_VERSION),
+	SLE_CONDVAR(Town, growth_rate,           SLE_INT16,                  54, SL_MAX_VERSION),
+
 	    SLE_VAR(Town, fund_buildings_months, SLE_UINT8),
 	    SLE_VAR(Town, road_build_months,     SLE_UINT8),
 
 	    SLE_VAR(Town, exclusivity,           SLE_UINT8),
 	    SLE_VAR(Town, exclusive_counter,     SLE_UINT8),
-	// reserve extra space in savegame here. (currently 30 bytes)
+
+	SLE_CONDVAR(Town, larger_town,           SLE_BOOL,                  56, SL_MAX_VERSION),
+
+	/* reserve extra space in savegame here. (currently 30 bytes) */
 	SLE_CONDNULL(30, 2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -1967,19 +2403,19 @@
 /* Save and load the mapping between the house id on the map, and the grf file
  * it came from. */
 static const SaveLoad _house_id_mapping_desc[] = {
-	SLE_VAR(HouseIDMapping, grfid,         SLE_UINT32),
-	SLE_VAR(HouseIDMapping, house_id,      SLE_UINT8),
-	SLE_VAR(HouseIDMapping, substitute_id, SLE_UINT8),
+	SLE_VAR(EntityIDMapping, grfid,         SLE_UINT32),
+	SLE_VAR(EntityIDMapping, entity_id,     SLE_UINT8),
+	SLE_VAR(EntityIDMapping, substitute_id, SLE_UINT8),
 	SLE_END()
 };
 
 static void Save_HOUSEIDS()
 {
-	uint i;
-
-	for (i = 0; i != lengthof(_house_id_mapping); i++) {
+	uint j = _house_mngr.GetMaxMapping();
+
+	for (uint i = 0; i < j; i++) {
 		SlSetArrayIndex(i);
-		SlObject(&_house_id_mapping[i], _house_id_mapping_desc);
+		SlObject(&_house_mngr.mapping_ID[i], _house_id_mapping_desc);
 	}
 }
 
@@ -1987,11 +2423,12 @@
 {
 	int index;
 
-	ResetHouseIDMapping();
+	_house_mngr.ResetMapping();
+	uint max_id = _house_mngr.GetMaxMapping();
 
 	while ((index = SlIterateArray()) != -1) {
-		if ((uint)index >= lengthof(_house_id_mapping)) break;
-		SlObject(&_house_id_mapping[index], _house_id_mapping_desc);
+		if ((uint)index >= max_id) break;
+		SlObject(&_house_mngr.mapping_ID[index], _house_id_mapping_desc);
 	}
 }
 
--- a/src/town_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/town_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file town_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -32,9 +34,9 @@
 extern const byte _town_action_costs[8];
 
 /** Get a list of available actions to do at a town.
- * @param *nump if not NULL add put the number of available actions in it
+ * @param nump if not NULL add put the number of available actions in it
  * @param pid the player that is querying the town
- * @param *t the town that is queried
+ * @param t the town that is queried
  * @return bitmasked value of enabled actions
  */
 uint GetMaskOfTownActions(int *nump, PlayerID pid, const Town *t)
@@ -47,9 +49,9 @@
 	if (pid != PLAYER_SPECTATOR) {
 		uint i;
 
-		// bribe option enabled?
+		/* bribe option enabled? */
 		if (_patches.bribe) {
-			// if unwanted, disable everything.
+			/* if unwanted, disable everything. */
 			if (t->unwanted[pid]) {
 				avail_buttons = 0;
 			} else if (t->ratings[pid] < RATING_BRIBE_MAXIMUM) {
@@ -57,7 +59,7 @@
 			}
 		}
 
-		// Things worth more than this are not shown
+		/* Things worth more than this are not shown */
 		avail = GetPlayer(pid)->player_money + _price.station_value * 200;
 		ref = _price.build_industry >> 8;
 
@@ -119,7 +121,7 @@
 
 			DrawString(2, 15, STR_2023_TRANSPORT_COMPANY_RATINGS, 0);
 
-			// Draw list of players
+			/* Draw list of players */
 			y = 25;
 			FOR_ALL_PLAYERS(p) {
 				if (p->is_active && (HASBIT(t->have_ratings, p->index) || t->exclusivity == p->index)) {
@@ -150,7 +152,7 @@
 			}
 		}
 
-		// Draw actions list
+		/* Draw actions list */
 		{
 			int y = 107, i;
 			int pos = w->vscroll.pos;
@@ -234,7 +236,7 @@
 
 	switch (e->event) {
 	case WE_PAINT:
-		// disable renaming town in network games if you are not the server
+		/* disable renaming town in network games if you are not the server */
 		SetWindowWidgetDisabledState(w, 8, _networking && !_network_server);
 
 		SetDParam(0, t->index);
@@ -347,7 +349,7 @@
 
 	if (w != NULL) {
 		w->flags4 |= WF_DISABLE_VP_SCROLL;
-		AssignWindowViewport(w, 3, 17, 0xFE, 0x56, GetTown(town)->xy, 1);
+		AssignWindowViewport(w, 3, 17, 0xFE, 0x56, GetTown(town)->xy, ZOOM_LVL_TOWN);
 	}
 }
 
@@ -365,7 +367,7 @@
 };
 
 
-// used to get a sorted list of the towns
+/* used to get a sorted list of the towns */
 static uint _num_town_sort;
 
 static char _bufcache[64];
--- a/src/town_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/town_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -127,7 +127,7 @@
 /**
  * Set the position of the lift on this animated house
  * @param t the tile
- * @param pos, from 0 to 36
+ * @param pos position, from 0 to 36
  */
 static inline void SetLiftPosition(TileIndex t, byte pos)
 {
@@ -315,7 +315,8 @@
 /**
  * Set the activated triggers bits for this house.
  * This is required for newgrf house
- * @param t the tile of this house
+ * @param t        the tile of this house
+ * @param triggers the activated triggers
  * @pre IsTileType(t, MP_HOUSE)
  */
 static inline void SetHouseTriggers(TileIndex t, byte triggers)
--- a/src/train.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/train.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file train.h */
+
 #ifndef TRAIN_H
 #define TRAIN_H
 
@@ -14,12 +16,12 @@
  */
 
 enum TrainSubtype {
-	Train_Front             = 0, // Leading engine of a train
-	Train_Articulated_Part  = 1, // Articulated part of an engine
-	Train_Wagon             = 2, // Wagon
-	Train_Engine            = 3, // Engine, that can be front engines, but might be placed behind another engine
-	Train_Free_Wagon        = 4, // First in a wagon chain (in depot)
-	Train_Multiheaded       = 5, // Engine is a multiheaded
+	Train_Front             = 0, ///< Leading engine of a train
+	Train_Articulated_Part  = 1, ///< Articulated part of an engine
+	Train_Wagon             = 2, ///< Wagon
+	Train_Engine            = 3, ///< Engine, that can be front engines, but might be placed behind another engine
+	Train_Free_Wagon        = 4, ///< First in a wagon chain (in depot)
+	Train_Multiheaded       = 5, ///< Engine is a multiheaded
 };
 
 
@@ -29,6 +31,7 @@
  */
 static inline bool IsFrontEngine(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	return HASBIT(v->subtype, Train_Front);
 }
 
@@ -37,6 +40,7 @@
  */
 static inline void SetFrontEngine(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	SETBIT(v->subtype, Train_Front);
 }
 
@@ -45,6 +49,7 @@
  */
 static inline void ClearFrontEngine(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	CLRBIT(v->subtype, Train_Front);
 }
 
@@ -54,6 +59,7 @@
  */
 static inline bool IsArticulatedPart(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	return HASBIT(v->subtype, Train_Articulated_Part);
 }
 
@@ -62,6 +68,7 @@
  */
 static inline void SetArticulatedPart(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	SETBIT(v->subtype, Train_Articulated_Part);
 }
 
@@ -70,6 +77,7 @@
  */
 static inline void ClearArticulatedPart(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	CLRBIT(v->subtype, Train_Articulated_Part);
 }
 
@@ -79,6 +87,7 @@
  */
 static inline bool IsTrainWagon(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	return HASBIT(v->subtype, Train_Wagon);
 }
 
@@ -87,6 +96,7 @@
  */
 static inline void SetTrainWagon(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	SETBIT(v->subtype, Train_Wagon);
 }
 
@@ -95,6 +105,7 @@
  */
 static inline void ClearTrainWagon(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	CLRBIT(v->subtype, Train_Wagon);
 }
 
@@ -104,6 +115,7 @@
  */
 static inline bool IsTrainEngine(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	return HASBIT(v->subtype, Train_Engine);
 }
 
@@ -112,6 +124,7 @@
  */
 static inline void SetTrainEngine(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	SETBIT(v->subtype, Train_Engine);
 }
 
@@ -120,6 +133,7 @@
  */
 static inline void ClearTrainEngine(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	CLRBIT(v->subtype, Train_Engine);
 }
 
@@ -129,6 +143,7 @@
  */
 static inline bool IsFreeWagon(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	return HASBIT(v->subtype, Train_Free_Wagon);
 }
 
@@ -137,6 +152,7 @@
  */
 static inline void SetFreeWagon(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	SETBIT(v->subtype, Train_Free_Wagon);
 }
 
@@ -145,6 +161,7 @@
  */
 static inline void ClearFreeWagon(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	CLRBIT(v->subtype, Train_Free_Wagon);
 }
 
@@ -154,6 +171,7 @@
  */
 static inline bool IsMultiheaded(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	return HASBIT(v->subtype, Train_Multiheaded);
 }
 
@@ -162,6 +180,7 @@
  */
 static inline void SetMultiheaded(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	SETBIT(v->subtype, Train_Multiheaded);
 }
 
@@ -170,6 +189,7 @@
  */
 static inline void ClearMultiheaded(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	CLRBIT(v->subtype, Train_Multiheaded);
 }
 
@@ -179,6 +199,7 @@
  */
 static inline bool EngineHasArticPart(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	return (v->next != NULL && IsArticulatedPart(v->next));
 }
 
@@ -199,6 +220,7 @@
  */
 static inline Vehicle *GetLastEnginePart(Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	while (EngineHasArticPart(v)) v = GetNextArticPart(v);
 	return v;
 }
@@ -209,6 +231,7 @@
  */
 static inline Vehicle *GetNextVehicle(const Vehicle *v)
 {
+	assert(v->type == VEH_TRAIN);
 	while (EngineHasArticPart(v)) v = GetNextArticPart(v);
 
 	/* v now contains the last artic part in the engine */
@@ -226,4 +249,29 @@
 
 byte FreightWagonMult(CargoID cargo);
 
+/**
+ * This class 'wraps' Vehicle; you do not actually instantiate this class.
+ * You create a Vehicle using AllocateVehicle, so it is added to the pool
+ * and you reinitialize that to a Train using:
+ *   v = new (v) Train();
+ *
+ * As side-effect the vehicle type is set correctly.
+ */
+struct Train : public Vehicle {
+	/** Initializes the Vehicle to a train */
+	Train() { this->type = VEH_TRAIN; }
+
+	/** We want to 'destruct' the right class. */
+	virtual ~Train() {}
+
+	const char *GetTypeString() const { return "train"; }
+	void MarkDirty();
+	void UpdateDeltaXY(Direction direction);
+	ExpensesType GetExpenseType(bool income) const { return income ? EXPENSES_TRAIN_INC : EXPENSES_TRAIN_RUN; }
+	WindowClass GetVehicleListWindowClass() const { return WC_TRAINS_LIST; }
+	void PlayLeaveStationSound() const;
+	bool IsPrimaryVehicle() const { return IsFrontEngine(this); }
+	bool HasFront() const { return true; }
+};
+
 #endif /* TRAIN_H */
--- a/src/train_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/train_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,13 @@
 /* $Id$ */
 
+/** @file train_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
 #include "debug.h"
 #include "functions.h"
+#include "landscape.h"
 #include "gui.h"
 #include "station_map.h"
 #include "table/strings.h"
@@ -12,6 +15,7 @@
 #include "tile.h"
 #include "tunnel_map.h"
 #include "vehicle.h"
+#include "articulated_vehicles.h"
 #include "command.h"
 #include "pathfind.h"
 #include "npf.h"
@@ -34,6 +38,7 @@
 #include "yapf/yapf.h"
 #include "date.h"
 #include "cargotype.h"
+#include "group.h"
 
 static bool TrainCheckIfLineEnds(Vehicle *v);
 static void TrainController(Vehicle *v, bool update_image);
@@ -60,7 +65,7 @@
  */
 void TrainPowerChanged(Vehicle* v)
 {
-	uint32 power = 0;
+	uint32 total_power = 0;
 	uint32 max_te = 0;
 
 	for (const Vehicle *u = v; u != NULL; u = u->next) {
@@ -73,19 +78,22 @@
 
 		const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);
 
-		if (engine_has_power && rvi_u->power != 0) {
-			power += rvi_u->power;
-			/* Tractive effort in (tonnes * 1000 * 10 =) N */
-			max_te += (u->u.rail.cached_veh_weight * 10000 * rvi_u->tractive_effort) / 256;
+		if (engine_has_power) {
+			uint16 power = GetVehicleProperty(u, 0x0B, rvi_u->power);
+			if (power != 0) {
+				total_power += power;
+				/* Tractive effort in (tonnes * 1000 * 10 =) N */
+				max_te += (u->u.rail.cached_veh_weight * 10000 * GetVehicleProperty(u, 0x1F, rvi_u->tractive_effort)) / 256;
+			}
 		}
 
 		if (HASBIT(u->u.rail.flags, VRF_POWEREDWAGON) && (wagon_has_power)) {
-			power += RailVehInfo(u->u.rail.first_engine)->pow_wag_power;
+			total_power += RailVehInfo(u->u.rail.first_engine)->pow_wag_power;
 		}
 	}
 
-	if (v->u.rail.cached_power != power || v->u.rail.cached_max_te != max_te) {
-		v->u.rail.cached_power = power;
+	if (v->u.rail.cached_power != total_power || v->u.rail.cached_max_te != max_te) {
+		v->u.rail.cached_power = total_power;
 		v->u.rail.cached_max_te = max_te;
 		InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
@@ -105,24 +113,24 @@
 	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.
+		/* 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 += RailVehInfo(u->engine_type)->weight;
-
-			// powered wagons have extra weight added
+			/* vehicle weight is the sum of the weight of the vehicle and the weight of its cargo */
+			vweight += GetVehicleProperty(u, 0x16, RailVehInfo(u->engine_type)->weight);
+
+			/* powered wagons have extra weight added */
 			if (HASBIT(u->u.rail.flags, VRF_POWEREDWAGON))
 				vweight += RailVehInfo(u->u.rail.first_engine)->pow_wag_weight;
 		}
 
-		// consist weight is the sum of the weight of all vehicles in the consist
+		/* consist weight is the sum of the weight of all vehicles in the consist */
 		weight += vweight;
 
-		// store vehicle weight in cache
+		/* store vehicle weight in cache */
 		u->u.rail.cached_veh_weight = vweight;
 	}
 
-	// store consist weight in cache
+	/* store consist weight in cache */
 	v->u.rail.cached_weight = weight;
 
 	/* Now update train power (tractive effort is dependent on weight) */
@@ -151,26 +159,29 @@
 	for (Vehicle *u = v; u != NULL; u = u->next) {
 		const RailVehicleInfo *rvi_u = RailVehInfo(u->engine_type);
 
-		// Update the v->first cache. This is faster than having to brute force it later.
+		/* 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'
+		/* update the '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;
 
+		/* Cache wagon override sprite group. NULL is returned if there is none */
+		u->u.rail.cached_override = GetWagonOverrideSpriteSet(u->engine_type, u->cargo_type, u->u.rail.first_engine);
+
 		if (rvi_u->visual_effect != 0) {
 			u->u.rail.cached_vis_effect = rvi_u->visual_effect;
 		} else {
 			if (IsTrainWagon(u) || IsArticulatedPart(u)) {
-				// Wagons and articulated parts have no effect by default
+				/* Wagons and articulated parts have no effect by default */
 				u->u.rail.cached_vis_effect = 0x40;
 			} else if (rvi_u->engclass == 0) {
-				// Steam is offset by -4 units
+				/* Steam is offset by -4 units */
 				u->u.rail.cached_vis_effect = 4;
 			} else {
-				// Diesel fumes and sparks come from the centre
+				/* Diesel fumes and sparks come from the centre */
 				u->u.rail.cached_vis_effect = 8;
 			}
 		}
@@ -184,7 +195,7 @@
 			}
 
 			if (rvi_v->pow_wag_power != 0 && rvi_u->railveh_type == RAILVEH_WAGON &&
-				UsesWagonOverride(u) && (u->u.rail.cached_vis_effect < 0x40)) {
+				UsesWagonOverride(u) && !HASBIT(u->u.rail.cached_vis_effect, 7)) {
 				/* wagon is powered */
 				SETBIT(u->u.rail.flags, VRF_POWEREDWAGON); // cache 'powered' status
 			} else {
@@ -204,13 +215,19 @@
 				u->u.rail.compatible_railtypes |= (1 << RAILTYPE_RAIL);
 			}
 
-			// max speed is the minimum of the speed limits of all vehicles in the consist
-			if ((rvi_u->railveh_type != RAILVEH_WAGON || _patches.wagon_speed_limits) &&
-				rvi_u->max_speed != 0 && !UsesWagonOverride(u))
-				max_speed = min(rvi_u->max_speed, max_speed);
+			/* max speed is the minimum of the speed limits of all vehicles in the consist */
+			if ((rvi_u->railveh_type != RAILVEH_WAGON || _patches.wagon_speed_limits) && !UsesWagonOverride(u)) {
+				uint16 speed = GetVehicleProperty(u, 0x09, rvi_u->max_speed);
+				if (speed != 0) max_speed = min(speed, max_speed);
+			}
 		}
 
-		// check the vehicle length (callback)
+		if (u->cargo_type == rvi_u->cargo_type && u->cargo_subtype == 0) {
+			/* Set cargo capacity if we've not been refitted */
+			u->cargo_cap = GetVehicleProperty(u, 0x14, rvi_u->capacity);
+		}
+
+		/* check the vehicle length (callback) */
 		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);
@@ -221,10 +238,10 @@
 		v->u.rail.cached_total_length += u->u.rail.cached_veh_length;
 	}
 
-	// store consist weight/max speed in cache
+	/* store consist weight/max speed in cache */
 	v->u.rail.cached_max_speed = max_speed;
 
-	// recalculate cached weights and power too (we do this *after* the rest, so it is known which wagons are powered and need extra weight added)
+	/* recalculate cached weights and power too (we do this *after* the rest, so it is known which wagons are powered and need extra weight added) */
 	TrainCargoChanged(v);
 }
 
@@ -263,8 +280,8 @@
 	StationID sid = GetStationIndex(tile);
 
 	assert(v->type == VEH_TRAIN);
-	//When does a train drive through a station
-	//first we deal with the "new nonstop handling"
+	/* When does a train drive through a station
+	 * first we deal with the "new nonstop handling" */
 	if (_patches.new_nonstop && o->flags & OF_NON_STOP && sid == o->dest) {
 		return false;
 	}
@@ -278,14 +295,14 @@
 	return true;
 }
 
-//new acceleration
+/** new acceleration*/
 static int GetTrainAcceleration(Vehicle *v, bool mode)
 {
 	int max_speed = 2000;
 	int speed = v->cur_speed * 10 / 16; //[mph]
 	int curvecount[2] = {0, 0};
 
-	//first find the curve speed limit
+	/*first find the curve speed limit */
 	int numcurve = 0;
 	int sum = 0;
 	int pos = 0;
@@ -309,7 +326,7 @@
 			}
 		}
 
-		//if we have a 90 degree turn, fix the speed limit to 60
+		/*if we have a 90 degree turn, fix the speed limit to 60 */
 		if (_curve_neighbours90[dir][0] == ndir ||
 				_curve_neighbours90[dir][1] == ndir) {
 			max_speed = 61;
@@ -402,7 +419,7 @@
 				break;
 		}
 	} else {
-		//"kickoff" acceleration
+		/* "kickoff" acceleration */
 		force = (mode == AM_ACCEL && v->u.rail.railtype != RAILTYPE_MAGLEV) ? min(max_te, power) : power;
 		force = max(force, (mass * 8) + resistance);
 	}
@@ -485,82 +502,12 @@
 	DrawSprite(image, pal, x, y);
 }
 
-uint CountArticulatedParts(EngineID engine_type)
-{
-	if (!HASBIT(EngInfo(engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return 0;
-
-	uint i;
-	for (i = 1; i < 10; i++) {
-		uint16 callback = GetVehicleCallback(CBID_TRAIN_ARTIC_ENGINE, i, 0, engine_type, NULL);
-		if (callback == CALLBACK_FAILED || callback == 0xFF) break;
-	}
-
-	return i - 1;
-}
-
-static void AddArticulatedParts(Vehicle **vl)
-{
-	const Vehicle *v = vl[0];
-	Vehicle *u = vl[0];
-
-	if (!HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) return;
-
-	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
-		 * if the callback returns different values depending on the cargo type. */
-		u->next = vl[i];
-		if (u->next == NULL) u->next = AllocateVehicle();
-		if (u->next == NULL) return;
-
-		u = u->next;
-
-		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;
-		u->owner = v->owner;
-		u->tile = v->tile;
-		u->x_pos = v->x_pos;
-		u->y_pos = v->y_pos;
-		u->z_pos = v->z_pos;
-		u->z_height = v->z_height;
-		u->u.rail.track = v->u.rail.track;
-		u->u.rail.railtype = v->u.rail.railtype;
-		u->build_year = v->build_year;
-		u->vehstatus = v->vehstatus & ~VS_STOPPED;
-		u->u.rail.first_engine = v->engine_type;
-
-		// get more settings from rail vehicle info
-		u->spritenum = rvi_artic->image_index;
-		if (flip_image) u->spritenum++;
-		u->cargo_type = rvi_artic->cargo_type;
-		u->cargo_subtype = 0;
-		u->cargo_cap = rvi_artic->capacity;
-		u->max_speed = 0;
-		u->max_age = 0;
-		u->engine_type = engine_type;
-		u->value = 0;
-		u->type = VEH_TRAIN;
-		u->subtype = 0;
-		SetArticulatedPart(u);
-		u->cur_image = 0xAC2;
-		u->random_bits = VehicleRandomBits();
-
-		VehiclePositionChanged(u);
-	}
-}
-
 static int32 CmdBuildRailWagon(EngineID engine, TileIndex tile, uint32 flags)
 {
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
 
 	const RailVehicleInfo *rvi = RailVehInfo(engine);
-	int32 value = (rvi->base_cost * _price.build_railwagon) >> 8;
+	int32 value = (GetEngineProperty(engine, 0x17, rvi->base_cost) * _price.build_railwagon) >> 8;
 
 	uint num_vehicles = 1 + CountArticulatedParts(engine);
 
@@ -601,12 +548,13 @@
 			v->y_pos = y;
 			v->z_pos = GetSlopeZ(x, y);
 			v->owner = _current_player;
-			v->z_height = 6;
 			v->u.rail.track = TRACK_BIT_DEPOT;
 			v->vehstatus = VS_HIDDEN | VS_DEFPAL;
 
+			v = new (v) Train();
 			v->subtype = 0;
 			SetTrainWagon(v);
+
 			if (u != NULL) {
 				u->next = v;
 			} else {
@@ -623,16 +571,18 @@
 			v->u.rail.railtype = rvi->railtype;
 
 			v->build_year = _cur_year;
-			v->type = VEH_TRAIN;
 			v->cur_image = 0xAC2;
 			v->random_bits = VehicleRandomBits();
 
+			v->group_id = DEFAULT_GROUP;
+
 			AddArticulatedParts(vl);
 
 			_new_vehicle_id = v->index;
 
 			VehiclePositionChanged(v);
 			TrainConsistChanged(GetFirstVehicleInChain(v));
+			UpdateTrainGroupID(GetFirstVehicleInChain(v));
 
 			InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
 			if (IsLocalPlayer()) {
@@ -645,7 +595,7 @@
 	return value;
 }
 
-// Move all free vehicles in the depot to the train
+/** Move all free vehicles in the depot to the train */
 static void NormalizeTrainVehInDepot(const Vehicle* u)
 {
 	const Vehicle* v;
@@ -661,9 +611,9 @@
 	}
 }
 
-static int32 EstimateTrainCost(const RailVehicleInfo* rvi)
+static int32 EstimateTrainCost(EngineID engine, const RailVehicleInfo* rvi)
 {
-	return rvi->base_cost * (_price.build_railvehicle >> 3) >> 5;
+	return GetEngineProperty(engine, 0x17, rvi->base_cost) * (_price.build_railvehicle >> 3) >> 5;
 }
 
 static void AddRearEngineToMultiheadedTrain(Vehicle* v, Vehicle* u, bool building)
@@ -674,9 +624,9 @@
 	u->x_pos = v->x_pos;
 	u->y_pos = v->y_pos;
 	u->z_pos = v->z_pos;
-	u->z_height = 6;
 	u->u.rail.track = TRACK_BIT_DEPOT;
 	u->vehstatus = v->vehstatus & ~VS_STOPPED;
+	u = new (u) Train();
 	u->subtype = 0;
 	SetMultiheaded(u);
 	u->spritenum = v->spritenum + 1;
@@ -689,7 +639,6 @@
 	u->build_year = v->build_year;
 	if (building) v->value >>= 1;
 	u->value = v->value;
-	u->type = VEH_TRAIN;
 	u->cur_image = 0xAC2;
 	u->random_bits = VehicleRandomBits();
 	VehiclePositionChanged(u);
@@ -697,6 +646,7 @@
 
 /** Build a railroad vehicle.
  * @param tile tile of the depot where rail-vehicle is built
+ * @param flags type of operation
  * @param p1 engine type id
  * @param p2 bit 0 when set, the train will get number 0, otherwise it will get a free number
  *           bit 1 prevents any free cars from being added to the train
@@ -704,7 +654,7 @@
 int32 CmdBuildRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	/* Check if the engine-type is valid (for the player) */
-	if (!IsEngineBuildable(p1, VEH_TRAIN, _current_player)) return_cmd_error(STR_ENGINE_NOT_BUILDABLE);
+	if (!IsEngineBuildable(p1, VEH_TRAIN, _current_player)) return_cmd_error(STR_RAIL_VEHICLE_NOT_AVAILABLE);
 
 	/* Check if the train is actually being built in a depot belonging
 	 * to the player. Doesn't matter if only the cost is queried */
@@ -723,7 +673,7 @@
 
 	if (rvi->railveh_type == RAILVEH_WAGON) return CmdBuildRailWagon(p1, tile, flags);
 
-	int32 value = EstimateTrainCost(rvi);
+	int32 value = EstimateTrainCost(p1, rvi);
 
 	uint num_vehicles =
 		(rvi->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1) +
@@ -755,7 +705,6 @@
 			v->x_pos = x;
 			v->y_pos = 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;
 			v->spritenum = rvi->image_index;
@@ -781,13 +730,15 @@
 			v->service_interval = _patches.servint_trains;
 			v->date_of_last_service = _date;
 			v->build_year = _cur_year;
-			v->type = VEH_TRAIN;
+			v = new (v) Train();
 			v->cur_image = 0xAC2;
 			v->random_bits = VehicleRandomBits();
 
 			v->vehicle_flags = 0;
 			if (e->flags & ENGINE_EXCLUSIVE_PREVIEW) SETBIT(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE);
 
+			v->group_id = DEFAULT_GROUP;
+
 			v->subtype = 0;
 			SetFrontEngine(v);
 			SetTrainEngine(v);
@@ -809,6 +760,7 @@
 
 			TrainConsistChanged(v);
 			UpdateTrainAcceleration(v);
+			UpdateTrainGroupID(v);
 
 			if (!HASBIT(p2, 1)) { // check if the cars should be added to the new vehicle
 				NormalizeTrainVehInDepot(v);
@@ -874,7 +826,7 @@
  */
 static Vehicle *UnlinkWagon(Vehicle *v, Vehicle *first)
 {
-	// unlinking the first vehicle of the chain?
+	/* unlinking the first vehicle of the chain? */
 	if (v == first) {
 		v = GetNextVehicle(v);
 		if (v == NULL) return NULL;
@@ -887,6 +839,7 @@
 	Vehicle *u;
 	for (u = first; GetNextVehicle(u) != v; u = GetNextVehicle(u)) {}
 	GetLastEnginePart(u)->next = GetNextVehicle(v);
+	v->first = NULL; // we shouldn't point to the old first, since the vehicle isn't in that chain anymore
 	return first;
 }
 
@@ -898,7 +851,7 @@
 
 	FOR_ALL_VEHICLES(dst) {
 		if (dst->type == VEH_TRAIN && IsFreeWagon(dst) && dst->tile == tile) {
-			// check so all vehicles in the line have the same engine.
+			/* check so all vehicles in the line have the same engine. */
 			Vehicle *v = dst;
 
 			while (v->engine_type == eng) {
@@ -950,6 +903,7 @@
 
 /** Move a rail vehicle around inside the depot.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 various bitstuffed elements
  * - p1 (bit  0 - 15) source vehicle index
  * - p1 (bit 16 - 31) what wagon to put the source wagon AFTER, XXX - INVALID_VEHICLE to make a new line
@@ -966,7 +920,7 @@
 
 	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.
+	/* 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);
@@ -976,13 +930,13 @@
 		if (dst->type != VEH_TRAIN || !CheckOwnership(dst->owner)) return CMD_ERROR;
 	}
 
-	// if an articulated part is being handled, deal with its parent vehicle
+	/* if an articulated part is being handled, deal with its parent vehicle */
 	while (IsArticulatedPart(src)) src = GetPrevVehicleInChain(src);
 	if (dst != NULL) {
 		while (IsArticulatedPart(dst)) dst = GetPrevVehicleInChain(dst);
 	}
 
-	// don't move the same vehicle..
+	/* don't move the same vehicle.. */
 	if (src == dst) return 0;
 
 	/* locate the head of the two chains */
@@ -991,92 +945,59 @@
 	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
+		/* Now deal with articulated part of destination wagon */
 		dst = GetLastEnginePart(dst);
 	} else {
 		dst_head = NULL;
 	}
 
-	if (dst != NULL && IsMultiheaded(dst) && !IsTrainEngine(dst) && IsTrainWagon(src)) {
-		/* We are moving a wagon to the rear part of a multiheaded engine */
-		if (dst->next == NULL) {
-			/* It's the last one, so we will add the wagon just before the rear engine */
-			dst = GetPrevVehicleInChain(dst);
-			/* Now if the vehicle we want to link to is the vehicle itself, drop out */
-			if (dst == src) return CMD_ERROR;
-			// if dst is NULL, it means that dst got a rear multiheaded engine as first engine. We can't use that
-			if (dst == NULL) return CMD_ERROR;
-		} else {
-			/* there are more units on this train, so we will add the wagon after the next one*/
-			dst = dst->next;
-		}
-	}
-
-	if (IsTrainEngine(src) && dst_head != NULL) {
-		/* we need to make sure that we didn't place it between a pair of multiheaded engines */
-		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;
-			}
-			if (engine != NULL && engine->u.rail.other_multiheaded_part == u) {
-				engine = NULL;
-			}
-			if (u == dst) {
-				if (engine != NULL) dst = engine->u.rail.other_multiheaded_part;
-				break;
-			}
-		}
-	}
-
 	if (IsMultiheaded(src) && !IsTrainEngine(src)) return_cmd_error(STR_REAR_ENGINE_FOLLOW_FRONT_ERROR);
 
-	// when moving all wagons, we can't have the same src_head and dst_head
+	/* when moving all wagons, we can't have the same src_head and dst_head */
 	if (HASBIT(p2, 0) && src_head == dst_head) return 0;
 
 	{
 		int max_len = _patches.mammoth_trains ? 100 : 9;
 
-		// check if all vehicles in the source train are stopped inside a depot.
+		/* check if all vehicles in the source train are stopped inside a depot. */
 		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.
+		/* check the destination row if the source and destination aren't the same. */
 		if (src_head != dst_head) {
 			int dst_len = 0;
 
 			if (dst_head != NULL) {
-				// check if all vehicles in the dest train are stopped.
+				/* 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);
 			}
 
-			// We are moving between rows, so only count the wagons from the source
-			// row that are being moved.
+			/* We are moving between rows, so only count the wagons from the source
+			 * row that are being moved. */
 			if (HASBIT(p2, 0)) {
 				const Vehicle *u;
 				for (u = src_head; u != src && u != NULL; u = GetNextVehicle(u))
 					src_len--;
 			} else {
-				// If moving only one vehicle, just count that.
+				/* If moving only one vehicle, just count that. */
 				src_len = 1;
 			}
 
 			if (src_len + dst_len > max_len) {
-				// Abort if we're adding too many wagons to a train.
+				/* Abort if we're adding too many wagons to a train. */
 				if (dst_head != NULL && IsFrontEngine(dst_head)) return_cmd_error(STR_8819_TRAIN_TOO_LONG);
-				// Abort if we're making a train on a new row.
+				/* Abort if we're making a train on a new row. */
 				if (dst_head == NULL && IsTrainEngine(src)) return_cmd_error(STR_8819_TRAIN_TOO_LONG);
 			}
 		} else {
-			// Abort if we're creating a new train on an existing row.
+			/* Abort if we're creating a new train on an existing row. */
 			if (src_len > max_len && src == src_head && IsTrainEngine(GetNextVehicle(src_head)))
 				return_cmd_error(STR_8819_TRAIN_TOO_LONG);
 		}
 	}
 
-	// moving a loco to a new line?, then we need to assign a unitnumber.
+	/* moving a loco to a new line?, then we need to assign a unitnumber. */
 	if (dst == NULL && !IsFrontEngine(src) && IsTrainEngine(src)) {
 		UnitID unit_num = GetFreeUnitNumber(VEH_TRAIN);
 		if (unit_num > _patches.max_trains)
@@ -1103,8 +1024,18 @@
 		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 we move the front Engine and if the second vehicle is not an engine
+		   add the whole vehicle to the DEFAULT_GROUP */
+		if (IsFrontEngine(src) && !IsDefaultGroupID(src->group_id)) {
+			const Vehicle *v = GetNextVehicle(src);
+
+			if (v != NULL && !IsTrainEngine(v)) {
+				DoCommand(tile, DEFAULT_GROUP, v->index, flags, CMD_ADD_VEHICLE_GROUP);
+			}
+		}
+
 		if (HASBIT(p2, 0)) {
-			// unlink ALL wagons
+			/* unlink ALL wagons */
 			if (src != src_head) {
 				Vehicle *v = src_head;
 				while (GetNextVehicle(v) != src) v = GetNextVehicle(v);
@@ -1114,9 +1045,9 @@
 				src_head = NULL;
 			}
 		} else {
-			// if moving within the same chain, dont use dst_head as it may get invalidated
+			/* if moving within the same chain, dont use dst_head as it may get invalidated */
 			if (src_head == dst_head) dst_head = NULL;
-			// unlink single wagon from linked list
+			/* unlink single wagon from linked list */
 			src_head = UnlinkWagon(src, src_head);
 			GetLastEnginePart(src)->next = NULL;
 		}
@@ -1125,13 +1056,21 @@
 			/* We make a new line in the depot, so we know already that we invalidate the window data */
 			InvalidateWindowData(WC_VEHICLE_DEPOT, src->tile);
 
-			// move the train to an empty line. for locomotives, we set the type to TS_Front. for wagons, 4.
+			/* move the train to an empty line. for locomotives, we set the type to TS_Front. for wagons, 4. */
 			if (IsTrainEngine(src)) {
 				if (!IsFrontEngine(src)) {
-					// setting the type to 0 also involves setting up the orders field.
+					/* setting the type to 0 also involves setting up the orders field. */
 					SetFrontEngine(src);
 					assert(src->orders == NULL);
 					src->num_orders = 0;
+
+					// Decrease the engines number of the src engine_type
+					if (!IsDefaultGroupID(src->group_id) && IsValidGroupID(src->group_id)) {
+						GetGroup(src->group_id)->num_engines[src->engine_type]--;
+					}
+
+					// If we move an engine to a new line affect it to the DEFAULT_GROUP
+					src->group_id = DEFAULT_GROUP;
 				}
 			} else {
 				SetFreeWagon(src);
@@ -1139,7 +1078,7 @@
 			dst_head = src;
 		} else {
 			if (IsFrontEngine(src)) {
-				// the vehicle was previously a loco. need to free the order list and delete vehicle windows etc.
+				/* the vehicle was previously a loco. need to free the order list and delete vehicle windows etc. */
 				DeleteWindowById(WC_VEHICLE_VIEW, src->index);
 				DeleteVehicleOrders(src);
 			}
@@ -1151,7 +1090,7 @@
 				src->unitnumber = 0; // doesn't occupy a unitnumber anymore.
 			}
 
-			// link in the wagon(s) in the chain.
+			/* link in the wagon(s) in the chain. */
 			{
 				Vehicle *v;
 
@@ -1165,41 +1104,26 @@
 				src_head = src_head->next;
 			}
 			AddWagonToConsist(src->u.rail.other_multiheaded_part, src);
-			// previous line set the front engine to the old front. We need to clear that
+			/* previous line set the front engine to the old front. We need to clear that */
 			src->u.rail.other_multiheaded_part->first = NULL;
 		}
 
-		if (HASBIT(p2, 0) && src_head != NULL && src_head != src) {
-			/* if we stole a rear multiheaded engine, we better give it back to the front end */
-			Vehicle *engine = NULL, *u;
-			for (u = src_head; u != NULL; u = u->next) {
-				if (IsMultiheaded(u)) {
-					if (IsTrainEngine(u)) {
-						engine = u;
-						continue;
-					}
-					/* we got the rear engine to match with the front one */
-					engine = NULL;
-				}
-			}
-			if (engine != NULL && engine->u.rail.other_multiheaded_part != NULL) {
-				AddWagonToConsist(engine->u.rail.other_multiheaded_part, engine);
-				// previous line set the front engine to the old front. We need to clear that
-				engine->u.rail.other_multiheaded_part->first = NULL;
-			}
-		}
-
 		/* If there is an engine behind first_engine we moved away, it should become new first_engine
 		 * To do this, CmdMoveRailVehicle must be called once more
 		 * we can't loop forever here because next time we reach this line we will have a front engine */
 		if (src_head != NULL && !IsFrontEngine(src_head) && IsTrainEngine(src_head)) {
+			/* As in CmdMoveRailVehicle src_head->group_id will be equal to DEFAULT_GROUP
+			 * we need to save the group and reaffect it to src_head */
+			const GroupID tmp_g = src_head->group_id;
 			CmdMoveRailVehicle(0, flags, src_head->index | (INVALID_VEHICLE << 16), 1);
+			SetTrainGroupID(src_head, tmp_g);
 			src_head = NULL; // don't do anything more to this train since the new call will do it
 		}
 
 		if (src_head != NULL) {
 			NormaliseTrainConsist(src_head);
 			TrainConsistChanged(src_head);
+			UpdateTrainGroupID(src_head);
 			if (IsFrontEngine(src_head)) {
 				UpdateTrainAcceleration(src_head);
 				InvalidateWindow(WC_VEHICLE_DETAILS, src_head->index);
@@ -1214,6 +1138,7 @@
 		if (dst_head != NULL) {
 			NormaliseTrainConsist(dst_head);
 			TrainConsistChanged(dst_head);
+			UpdateTrainGroupID(dst_head);
 			if (IsFrontEngine(dst_head)) {
 				UpdateTrainAcceleration(dst_head);
 				InvalidateWindow(WC_VEHICLE_DETAILS, dst_head->index);
@@ -1233,6 +1158,7 @@
 
 /** Start/Stop a train.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 train to start/stop
  * @param p2 unused
  */
@@ -1259,7 +1185,6 @@
 			DeleteVehicleNews(p1, STR_8814_TRAIN_IS_WAITING_IN_DEPOT);
 		}
 
-		v->u.rail.days_since_order_progr = 0;
 		v->vehstatus ^= VS_STOPPED;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
@@ -1269,6 +1194,7 @@
 
 /** Sell a (single) train wagon/engine.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 the wagon/engine index
  * @param p2 the selling mode
  * - p2 = 0: only sell the single dragged wagon/engine (and any belonging rear-engines)
@@ -1290,7 +1216,7 @@
 	while (IsArticulatedPart(v)) v = GetPrevVehicleInChain(v);
 	Vehicle *first = GetFirstVehicleInChain(v);
 
-	// make sure the vehicle is stopped in the depot
+	/* make sure the vehicle is stopped in the depot */
 	if (CheckTrainStoppedInDepot(first) < 0) {
 		return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
 	}
@@ -1353,6 +1279,8 @@
 					if (first->next_shared != NULL) {
 						first->next_shared->prev_shared = new_f;
 						new_f->next_shared = first->next_shared;
+					} else {
+						RemoveVehicleFromGroup(v);
 					}
 
 					/*
@@ -1383,6 +1311,7 @@
 				if (first != NULL) {
 					NormaliseTrainConsist(first);
 					TrainConsistChanged(first);
+					UpdateTrainGroupID(first);
 					if (IsFrontEngine(first)) {
 						InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
 						InvalidateWindow(WC_VEHICLE_REFIT, first->index);
@@ -1419,6 +1348,15 @@
 
 						if (rear != NULL) {
 							cost -= rear->value;
+
+							/* If this is a multiheaded vehicle with nothing
+							 * between the parts, tmp will be pointing to the
+							 * rear part, which is unlinked from the train and
+							 * deleted here. However, because tmp has already
+							 * been set it needs to be updated now so that the
+							 * loop never sees the rear part. */
+							if (tmp == rear) tmp = GetNextVehicle(tmp);
+
 							if (flags & DC_EXEC) {
 								first = UnlinkWagon(rear, first);
 								DeleteDepotHighlightOfVehicle(rear);
@@ -1436,6 +1374,7 @@
 					first = UnlinkWagon(v, first);
 					DeleteDepotHighlightOfVehicle(v);
 					DeleteVehicle(v);
+					RemoveVehicleFromGroup(v);
 				}
 			}
 
@@ -1443,6 +1382,7 @@
 			if (flags & DC_EXEC && first != NULL) {
 				NormaliseTrainConsist(first);
 				TrainConsistChanged(first);
+				UpdateTrainGroupID(first);
 				if (IsFrontEngine(first)) UpdateTrainAcceleration(first);
 				InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
 				InvalidateWindow(WC_VEHICLE_REFIT, first->index);
@@ -1452,9 +1392,9 @@
 	return cost;
 }
 
-static void UpdateTrainDeltaXY(Vehicle *v, Direction direction)
+void Train::UpdateDeltaXY(Direction direction)
 {
-#define MKIT(a,b,c,d) ((a&0xFF)<<24) | ((b&0xFF)<<16) | ((c&0xFF)<<8) | ((d&0xFF)<<0)
+#define MKIT(a, b, c, d) ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | ((d & 0xFF) << 0)
 	static const uint32 _delta_xy_table[8] = {
 		MKIT(3, 3, -1, -1),
 		MKIT(3, 7, -1, -3),
@@ -1468,16 +1408,16 @@
 #undef MKIT
 
 	uint32 x = _delta_xy_table[direction];
-
-	v->x_offs        = GB(x,  0, 8);
-	v->y_offs        = GB(x,  8, 8);
-	v->sprite_width  = GB(x, 16, 8);
-	v->sprite_height = GB(x, 24, 8);
+	this->x_offs        = GB(x,  0, 8);
+	this->y_offs        = GB(x,  8, 8);
+	this->sprite_width  = GB(x, 16, 8);
+	this->sprite_height = GB(x, 24, 8);
+	this->z_height      = 6;
 }
 
 static void UpdateVarsAfterSwap(Vehicle *v)
 {
-	UpdateTrainDeltaXY(v, v->direction);
+	v->UpdateDeltaXY(v->direction);
 	v->cur_image = GetTrainImage(v, v->direction);
 	BeginVehicleMove(v);
 	VehiclePositionChanged(v);
@@ -1596,8 +1536,8 @@
 	uint length = CountVehiclesInChain(v);
 
 	while (length > 2) {
-		// find pairwise matching wagon
-		// start<>end, start+1<>end-1, ...
+		/* find pairwise matching wagon
+		 * start<>end, start+1<>end-1, ... */
 		Vehicle *last = first;
 		for (uint i = length - 3; i > 0; i--) last = last->next;
 
@@ -1605,7 +1545,7 @@
 		if (before) differential *= -1;
 
 		if (differential > 0) {
-			// disconnect last car to make sure only this subset moves
+			/* disconnect last car to make sure only this subset moves */
 			Vehicle *tempnext = last->next;
 			last->next = NULL;
 
@@ -1643,7 +1583,7 @@
 		DisableTrainCrossing(tile);
 	}
 
-	// count number of vehicles
+	/* count number of vehicles */
 	int r = -1;
 	const Vehicle *u = v;
 	do r++; while ( (u = u->next) != NULL );
@@ -1667,6 +1607,7 @@
 
 /** Reverse train.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 train to reverse
  * @param p2 if true, reverse a unit in a train (needs to be in a depot)
  */
@@ -1679,14 +1620,14 @@
 	if (v->type != VEH_TRAIN || !CheckOwnership(v->owner)) return CMD_ERROR;
 
 	if (p2) {
-		// turn a single unit around
+		/* turn a single unit around */
 
 		if (IsMultiheaded(v) || HASBIT(EngInfo(v->engine_type)->callbackmask, CBM_ARTIC_ENGINE)) {
 			return_cmd_error(STR_ONLY_TURN_SINGLE_UNIT);
 		}
 
 		Vehicle *front = GetFirstVehicleInChain(v);
-		// make sure the vehicle is stopped in the depot
+		/* make sure the vehicle is stopped in the depot */
 		if (CheckTrainStoppedInDepot(front) < 0) {
 			return_cmd_error(STR_881A_TRAINS_CAN_ONLY_BE_ALTERED);
 		}
@@ -1697,7 +1638,7 @@
 			InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
 		}
 	} else {
-		//turn the whole train around
+		/*turn the whole train around */
 		if (v->u.rail.crash_anim_pos != 0 || v->breakdown_ctr != 0) return CMD_ERROR;
 
 		if (flags & DC_EXEC) {
@@ -1715,6 +1656,7 @@
 
 /** Force a train through a red signal
  * @param tile unused
+ * @param flags type of operation
  * @param p1 train to ignore the red signal
  * @param p2 unused
  */
@@ -1733,15 +1675,19 @@
 
 /** Refits a train to the specified cargo type.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 vehicle ID of the train 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
+ * - p2 = (bit 16) - refit only this vehicle
+ * @return cost of refit or error
  */
 int32 CmdRefitRailVehicle(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	CargoID new_cid = GB(p2, 0, 8);
 	byte new_subtype = GB(p2, 8, 8);
+	bool only_this = HASBIT(p2, 16);
 
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
 
@@ -1819,7 +1765,7 @@
 				}
 			}
 		}
-	} while ((v = v->next) != NULL);
+	} while ((v = v->next) != NULL && !only_this);
 
 	_returned_refit_capacity = num;
 
@@ -1854,8 +1800,8 @@
 	return false;
 }
 
-// returns the tile of a depot to goto to. The given vehicle must not be
-// crashed!
+/** returns the tile of a depot to goto to. The given vehicle must not be
+ * crashed! */
 static TrainFindDepotData FindClosestTrainDepot(Vehicle *v, int max_distance)
 {
 	assert(!(v->vehstatus & VS_CRASHED));
@@ -1881,7 +1827,7 @@
 		Trackdir trackdir_rev = ReverseTrackdir(GetVehicleTrackdir(last));
 
 		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);
+		NPFFoundTargetData ftd = NPFRouteToDepotBreadthFirstTwoWay(v->tile, trackdir, last->tile, trackdir_rev, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes, NPF_INFINITE_PENALTY);
 		if (ftd.best_bird_dist == 0) {
 			/* Found target */
 			tfdd.tile = ftd.node.tile;
@@ -1893,7 +1839,7 @@
 			if (NPFGetFlag(&ftd.node, NPF_FLAG_REVERSE)) tfdd.reverse = true;
 		}
 	} else {
-		// search in the forward direction first.
+		/* search in the forward direction first. */
 		DiagDirection i = DirToDiagDir(v->direction);
 		if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) {
 			i = ChangeDiagDir(i, DIAGDIRDIFF_90LEFT);
@@ -1901,7 +1847,7 @@
 		NewTrainPathfind(tile, 0, v->u.rail.compatible_railtypes, i, (NTPEnumProc*)NtpCallbFindDepot, &tfdd);
 		if (tfdd.best_length == (uint)-1){
 			tfdd.reverse = true;
-			// search in backwards direction
+			/* search in backwards direction */
 			i = ReverseDiagDir(DirToDiagDir(v->direction));
 			if (!(v->direction & 1) && v->u.rail.track != _state_dir_table[i]) {
 				i = ChangeDiagDir(i, DIAGDIRDIFF_90LEFT);
@@ -1915,6 +1861,7 @@
 
 /** Send a train to a depot
  * @param tile unused
+ * @param flags type of operation
  * @param p1 train to send to the depot
  * @param p2 various bitmasked elements
  * - p2 bit 0-3 - DEPOT_ flags (see vehicle.h)
@@ -1951,7 +1898,6 @@
 		if (p2 & DEPOT_DONT_CANCEL) return CMD_ERROR; // Requested no cancelation of depot orders
 		if (flags & DC_EXEC) {
 			if (HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS)) {
-				v->u.rail.days_since_order_progr = 0;
 				v->cur_order_index++;
 			}
 
@@ -1970,6 +1916,8 @@
 	if (tfdd.best_length == (uint)-1) return_cmd_error(STR_883A_UNABLE_TO_FIND_ROUTE_TO);
 
 	if (flags & DC_EXEC) {
+		if (v->current_order.type == OT_LOADING) v->LeaveStation();
+
 		v->dest_tile = tfdd.tile;
 		v->current_order.type = OT_GOTO_DEPOT;
 		v->current_order.flags = OF_NON_STOP;
@@ -1978,8 +1926,7 @@
 		v->current_order.refit_cargo = CT_INVALID;
 		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 		/* If there is no depot in front, reverse automatically */
-		if (tfdd.reverse)
-			DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_REVERSE_TRAIN_DIRECTION);
+		if (tfdd.reverse) DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_REVERSE_TRAIN_DIRECTION);
 	}
 
 	return 0;
@@ -2010,22 +1957,21 @@
 		byte effect_type = GB(v->u.rail.cached_vis_effect, 4, 2);
 		bool disable_effect = HASBIT(v->u.rail.cached_vis_effect, 6);
 
-		// no smoke?
+		/* no smoke? */
 		if ((rvi->railveh_type == RAILVEH_WAGON && effect_type == 0) ||
 				disable_effect ||
-				rvi->railtype > RAILTYPE_ELECTRIC ||
 				v->vehstatus & VS_HIDDEN) {
 			continue;
 		}
 
-		// No smoke in depots or tunnels
+		/* No smoke in depots or tunnels */
 		if (IsTileDepotType(v->tile, TRANSPORT_RAIL) || IsTunnelTile(v->tile)) continue;
 
-		// No sparks for electric vehicles on nonelectrified tracks
+		/* No sparks for electric vehicles on nonelectrified tracks */
 		if (!HasPowerOnRail(v->u.rail.railtype, GetTileRailType(v->tile))) continue;
 
 		if (effect_type == 0) {
-			// Use default effect type for engine class.
+			/* Use default effect type for engine class. */
 			effect_type = rvi->engclass;
 		} else {
 			effect_type--;
@@ -2041,7 +1987,7 @@
 
 		switch (effect_type) {
 		case 0:
-			// steam smoke.
+			/* steam smoke. */
 			if (GB(v->tick_counter, 0, 4) == 0) {
 				CreateEffectVehicleRel(v, x, y, 10, EV_STEAM_SMOKE);
 				sound = true;
@@ -2049,7 +1995,7 @@
 			break;
 
 		case 1:
-			// diesel smoke
+			/* diesel smoke */
 			if (u->cur_speed <= 40 && CHANCE16(15, 128)) {
 				CreateEffectVehicleRel(v, 0, 0, 10, EV_DIESEL_SMOKE);
 				sound = true;
@@ -2057,7 +2003,7 @@
 			break;
 
 		case 2:
-			// blue spark
+			/* blue spark */
 			if (GB(v->tick_counter, 0, 2) == 0 && CHANCE16(1, 45)) {
 				CreateEffectVehicleRel(v, 0, 0, 10, EV_ELECTRIC_SPARK);
 				sound = true;
@@ -2074,32 +2020,30 @@
 	static const SoundFx sfx[] = {
 		SND_04_TRAIN,
 		SND_0A_TRAIN_HORN,
-		SND_0A_TRAIN_HORN
+		SND_0A_TRAIN_HORN,
+		SND_47_MAGLEV_2,
+		SND_41_MAGLEV
 	};
 
 	if (PlayVehicleSound(v, VSE_START)) return;
 
 	EngineID engtype = v->engine_type;
-	switch (RailVehInfo(engtype)->railtype) {
-		case RAILTYPE_RAIL:
-		case RAILTYPE_ELECTRIC:
-			SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], v);
-			break;
-
-		case RAILTYPE_MONO: SndPlayVehicleFx(SND_47_MAGLEV_2, v); break;
-		case RAILTYPE_MAGLEV: SndPlayVehicleFx(SND_41_MAGLEV, v); break;
-		default: NOT_REACHED();
-	}
+	SndPlayVehicleFx(sfx[RailVehInfo(engtype)->engclass], v);
+}
+
+void Train::PlayLeaveStationSound() const
+{
+	TrainPlayLeaveStationSound(this);
 }
 
 static bool CheckTrainStayInDepot(Vehicle *v)
 {
-	// bail out if not all wagons are in the same depot or not in a depot at all
+	/* bail out if not all wagons are in the same depot or not in a depot at all */
 	for (const Vehicle *u = v; u != NULL; u = u->next) {
 		if (u->u.rail.track != TRACK_BIT_DEPOT || u->tile != v->tile) return false;
 	}
 
-	// if the train got no power, then keep it in the depot
+	/* if the train got no power, then keep it in the depot */
 	if (v->u.rail.cached_power == 0) {
 		v->vehstatus |= VS_STOPPED;
 		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
@@ -2130,7 +2074,7 @@
 	v->vehstatus &= ~VS_HIDDEN;
 	v->cur_speed = 0;
 
-	UpdateTrainDeltaXY(v, v->direction);
+	v->UpdateDeltaXY(v->direction);
 	v->cur_image = GetTrainImage(v, v->direction);
 	VehiclePositionChanged(v);
 	UpdateSignalsOnSegment(v->tile, DirToDiagDir(v->direction));
@@ -2151,10 +2095,10 @@
 
 static bool NtpCallbFindStation(TileIndex tile, TrainTrackFollowerData *ttfd, Trackdir track, uint length)
 {
-	// heading for nowhere?
+	/* heading for nowhere? */
 	if (ttfd->dest_coords == 0) return false;
 
-	// did we reach the final station?
+	/* did we reach the final station? */
 	if ((ttfd->station_index == INVALID_STATION && tile == ttfd->dest_coords) || (
 				IsTileType(tile, MP_STATION) &&
 				IsRailwayStation(tile) &&
@@ -2163,12 +2107,13 @@
 		/* We do not check for dest_coords if we have a station_index,
 		 * because in that case the dest_coords are just an
 		 * approximation of where the station is */
-		// found station
+
+		/* found station */
 		ttfd->best_track = track;
 		ttfd->best_bird_dist = 0;
 		return true;
 	} else {
-		// didn't find station, keep track of the best path so far.
+		/* didn't find station, keep track of the best path so far. */
 		uint dist = DistanceManhattan(tile, ttfd->dest_coords);
 		if (dist < ttfd->best_bird_dist) {
 			ttfd->best_bird_dist = dist;
@@ -2205,12 +2150,12 @@
 };
 
 static const byte _search_directions[6][4] = {
-	{ 0, 9, 2, 9 }, // track 1
-	{ 9, 1, 9, 3 }, // track 2
-	{ 9, 0, 3, 9 }, // track upper
-	{ 1, 9, 9, 2 }, // track lower
-	{ 3, 2, 9, 9 }, // track left
-	{ 9, 9, 1, 0 }, // track right
+	{ 0, 9, 2, 9 }, ///< track 1
+	{ 9, 1, 9, 3 }, ///< track 2
+	{ 9, 0, 3, 9 }, ///< track upper
+	{ 1, 9, 9, 2 }, ///< track lower
+	{ 3, 2, 9, 9 }, ///< track left
+	{ 9, 9, 1, 0 }, ///< track right
 };
 
 static const byte _pick_track_table[6] = {1, 3, 2, 2, 0, 0};
@@ -2219,7 +2164,7 @@
 static Track ChooseTrainTrack(Vehicle* v, TileIndex tile, DiagDirection enterdir, TrackBits tracks)
 {
 	Track best_track;
-	// pathfinders are able to tell that route was only 'guessed'
+	/* pathfinders are able to tell that route was only 'guessed' */
 	bool path_not_found = false;
 
 #ifdef PF_BENCHMARK
@@ -2247,12 +2192,12 @@
 		Trackdir trackdir = GetVehicleTrackdir(v);
 		assert(trackdir != 0xff);
 
-		NPFFoundTargetData 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, 0, v->owner, v->u.rail.compatible_railtypes);
 
 		if (ftd.best_trackdir == 0xff) {
-			/* We are already at our target. Just do something */
-			//TODO: maybe display error?
-			//TODO: go straight ahead if possible?
+			/* We are already at our target. Just do something
+			 * @todo maybe display error?
+			 * @todo: go straight ahead if possible? */
 			best_track = FindFirstTrack(tracks);
 		} else {
 			/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
@@ -2280,11 +2225,11 @@
 		NewTrainPathfind(tile - TileOffsByDiagDir(enterdir), v->dest_tile,
 			v->u.rail.compatible_railtypes, enterdir, (NTPEnumProc*)NtpCallbFindStation, &fd);
 
-		// check whether the path was found or only 'guessed'
+		/* check whether the path was found or only 'guessed' */
 		if (fd.best_bird_dist != 0) path_not_found = true;
 
 		if (fd.best_track == 0xff) {
-			// blaha
+			/* blaha */
 			best_track = FindFirstTrack(tracks);
 		} else {
 			best_track = TrackdirToTrack(fd.best_track);
@@ -2293,13 +2238,13 @@
 		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
+	/* handle "path not found" state */
 	if (path_not_found) {
-		// PF didn't find the route
+		/* PF didn't find the route */
 		if (!HASBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION)) {
-			// it is first time the problem occurred, set the "path not found" flag
+			/* it is first time the problem occurred, set the "path not found" flag */
 			SETBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION);
-			// and notify user about the event
+			/* and notify user about the event */
 			if (_patches.lost_train_warn && v->owner == _local_player) {
 				SetDParam(0, v->unitnumber);
 				AddNewsItem(
@@ -2310,11 +2255,11 @@
 			}
 		}
 	} else {
-		// route found, is the train marked with "path not found" flag?
+		/* route found, is the train marked with "path not found" flag? */
 		if (HASBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION)) {
-			// clear the flag as the PF's problem was solved
+			/* clear the flag as the PF's problem was solved */
 			CLRBIT(v->u.rail.flags, VRF_NO_PATH_TO_DESTINATION);
-			// can we also delete the "News" item somehow?
+			/* can we also delete the "News" item somehow? */
 		}
 	}
 
@@ -2357,7 +2302,7 @@
 		assert(trackdir != 0xff);
 		assert(trackdir_rev != 0xff);
 
-		ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, last->tile, trackdir_rev, &fstd, TRANSPORT_RAIL, v->owner, v->u.rail.compatible_railtypes);
+		ftd = NPFRouteToStationOrTileTwoWay(v->tile, trackdir, last->tile, trackdir_rev, &fstd, TRANSPORT_RAIL, 0, v->owner, v->u.rail.compatible_railtypes);
 		if (ftd.best_bird_dist != 0) {
 			/* We didn't find anything, just keep on going straight ahead */
 			reverse_best = false;
@@ -2440,14 +2385,14 @@
 		default: break;
 	}
 
-	// check if we've reached the waypoint?
+	/* 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;
 	}
 
-	// check if we've reached a non-stop station while TTDPatch nonstop is enabled..
+	/* check if we've reached a non-stop station while TTDPatch nonstop is enabled.. */
 	if (_patches.new_nonstop &&
 			v->current_order.flags & OF_NON_STOP &&
 			IsTileType(v->tile, MP_STATION) &&
@@ -2455,25 +2400,25 @@
 		v->cur_order_index++;
 	}
 
-	// Get the current order
+	/* Get the current order */
 	if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0;
 
 	const Order *order = GetVehicleOrder(v, v->cur_order_index);
 
-	// If no order, do nothing.
+	/* If no order, do nothing. */
 	if (order == NULL) {
 		v->current_order.Free();
 		v->dest_tile = 0;
 		return false;
 	}
 
-	// If it is unchanged, keep it.
+	/* If it is unchanged, keep it. */
 	if (order->type  == v->current_order.type &&
 			order->flags == v->current_order.flags &&
 			order->dest  == v->current_order.dest)
 		return false;
 
-	// Otherwise set it, and determine the destination tile.
+	/* Otherwise set it, and determine the destination tile. */
 	v->current_order = *order;
 
 	v->dest_tile = 0;
@@ -2502,62 +2447,17 @@
 	return !at_waypoint && CheckReverseTrain(v);
 }
 
-static void MarkTrainDirty(Vehicle *v)
+void Train::MarkDirty()
 {
+	Vehicle *v = this;
 	do {
 		v->cur_image = GetTrainImage(v, v->direction);
 		MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1);
 	} while ((v = v->next) != NULL);
-}
-
-static void HandleTrainLoading(Vehicle *v, bool mode)
-{
-	switch (v->current_order.type) {
-		case OT_LOADING: {
-			if (mode) return;
-
-			// don't mark the train as lost if we're loading on the final station.
-			if (v->current_order.flags & OF_NON_STOP) {
-				v->u.rail.days_since_order_progr = 0;
-			}
-
-			if (--v->load_unload_time_rem) return;
-
-			if (CanFillVehicle(v) && (
-						v->current_order.flags & OF_FULL_LOAD ||
-						(_patches.gradual_loading && !HASBIT(v->vehicle_flags, VF_LOADING_FINISHED))
-					)) {
-				v->u.rail.days_since_order_progr = 0; /* Prevent a train lost message for full loading trains */
-				SET_EXPENSES_TYPE(EXPENSES_TRAIN_INC);
-				if (LoadUnloadVehicle(v, false)) {
-					InvalidateWindow(WC_TRAINS_LIST, v->owner);
-					MarkTrainDirty(v);
-
-					// need to update acceleration and cached values since the goods on the train changed.
-					TrainCargoChanged(v);
-					UpdateTrainAcceleration(v);
-				}
-				return;
-			}
-
-			TrainPlayLeaveStationSound(v);
-
-			Order b = v->current_order;
-			v->LeaveStation();
-
-			// If this was not the final order, don't remove it from the list.
-			if (!(b.flags & OF_NON_STOP)) return;
-			break;
-		}
-
-		case OT_DUMMY: break;
-
-		default: return;
-	}
-
-	v->u.rail.days_since_order_progr = 0;
-	v->cur_order_index++;
-	InvalidateVehicleOrder(v);
+
+	/* need to update acceleration and cached values since the goods on the train changed. */
+	TrainCargoChanged(this);
+	UpdateTrainAcceleration(this);
 }
 
 static int UpdateTrainSpeed(Vehicle *v)
@@ -2614,34 +2514,13 @@
 		);
 	}
 
-	// Did we reach the final destination?
-	if (v->current_order.type == OT_GOTO_STATION &&
-			v->current_order.dest == station) {
-		// Yeah, keep the load/unload flags
-		// Non Stop now means if the order should be increased.
-		v->BeginLoading();
-		v->current_order.flags &= OF_FULL_LOAD | OF_UNLOAD | OF_TRANSFER;
-		v->current_order.flags |= OF_NON_STOP;
-	} else {
-		// No, just do a simple load
-		v->BeginLoading();
-		v->current_order.flags = 0;
-	}
+	v->BeginLoading();
 	v->current_order.dest = 0;
-
-	SET_EXPENSES_TYPE(EXPENSES_TRAIN_INC);
-	if (LoadUnloadVehicle(v, true) != 0) {
-		InvalidateWindow(WC_TRAINS_LIST, v->owner);
-		TrainCargoChanged(v);
-		UpdateTrainAcceleration(v);
-	}
-	MarkTrainDirty(v);
-	InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR);
 }
 
 static byte AfterSetTrainPos(Vehicle *v, bool new_tile)
 {
-	// need this hint so it returns the right z coordinate on bridges.
+	/* need this hint so it returns the right z coordinate on bridges. */
 	byte new_z = GetSlopeZ(v->x_pos, v->y_pos);
 
 	byte old_z = v->z_pos;
@@ -2654,7 +2533,7 @@
 		if (new_z != old_z) {
 			TileIndex tile = TileVirtXY(v->x_pos, v->y_pos);
 
-			// XXX workaround, whole UP/DOWN detection needs overhaul
+			/* XXX workaround, whole UP/DOWN detection needs overhaul */
 			if (!IsTunnelTile(tile)) {
 				SETBIT(v->u.rail.flags, (new_z > old_z) ? VRF_GOINGUP : VRF_GOINGDOWN);
 			}
@@ -2727,13 +2606,13 @@
 
 static const RailtypeSlowdownParams _railtype_slowdown[] = {
 	// normal accel
-	{256 / 4, 256 / 2, 256 / 4, 2}, // normal
-	{256 / 4, 256 / 2, 256 / 4, 2}, // electrified
-	{256 / 4, 256 / 2, 256 / 4, 2}, // monorail
-	{0,       256 / 2, 256 / 4, 2}, // maglev
+	{256 / 4, 256 / 2, 256 / 4, 2}, ///< normal
+	{256 / 4, 256 / 2, 256 / 4, 2}, ///< electrified
+	{256 / 4, 256 / 2, 256 / 4, 2}, ///< monorail
+	{0,       256 / 2, 256 / 4, 2}, ///< maglev
 };
 
-/* Modify the speed of the vehicle due to a turn */
+/** Modify the speed of the vehicle due to a turn */
 static void AffectSpeedByDirChange(Vehicle* v, Direction new_dir)
 {
 	if (_patches.realistic_acceleration) return;
@@ -2745,7 +2624,7 @@
 	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 */
+/** Modify the speed of the vehicle due to a change in altitude */
 static void AffectSpeedByZChange(Vehicle *v, byte old_z)
 {
 	if (old_z == v->z_pos || _patches.realistic_acceleration) return;
@@ -2788,7 +2667,7 @@
 			v != tcc->v_skip &&
 			v->type == VEH_TRAIN &&
 			v->u.rail.track != TRACK_BIT_DEPOT &&
-			myabs(v->z_pos - tcc->v->z_pos) <= 6 &&
+			myabs(v->z_pos - tcc->v->z_pos) < 6 &&
 			myabs(v->x_pos - tcc->v->x_pos) < 6 &&
 			myabs(v->y_pos - tcc->v->y_pos) < 6) {
 		return v;
@@ -2820,7 +2699,7 @@
 	return num;
 }
 
-/*
+/**
  * Checks whether the specified train has a collision with another vehicle. If
  * so, destroys this vehicle, and the other vehicle if its subtype has TS_Front.
  * Reports the incident in a flashy news item, modifies station ratings and
@@ -2848,10 +2727,10 @@
 			(v->u.rail.track == TRACK_BIT_WORMHOLE && (v->direction & 2) != (realcoll->direction & 2)))
 		return;
 
-	//two drivers + passangers killed in train v
+	/* two drivers + passangers killed in train v */
 	uint num = 2 + CountPassengersInTrain(v);
 	if (!(coll->vehstatus & VS_CRASHED))
-		//two drivers + passangers killed in train coll (if it was not crashed already)
+		/* two drivers + passangers killed in train coll (if it was not crashed already) */
 		num += 2 + CountPassengersInTrain(coll);
 
 	SetVehicleCrashed(v);
@@ -2931,7 +2810,7 @@
 
 				/* Get the status of the tracks in the new tile and mask
 				 * away the bits that aren't reachable. */
-				uint32 ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL) & _reachable_tracks[enterdir];
+				uint32 ts = GetTileTrackStatus(gp.new_tile, TRANSPORT_RAIL, 0) & _reachable_tracks[enterdir];
 
 				/* Combine the from & to directions.
 				 * Now, the lower byte contains the track status, and the byte at bit 16 contains
@@ -2959,8 +2838,8 @@
 
 					/* 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) {
-						// In front of a red signal
-						/* find the first set bit in ts. need to do it in 2 steps, since
+						/* 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);
 
@@ -2972,7 +2851,7 @@
 						} else if (HasSignalOnTrackdir(gp.new_tile, i)) {
 							v->cur_speed = 0;
 							v->subspeed = 0;
-							v->progress = 255-10;
+							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;
@@ -3061,7 +2940,7 @@
 
 		/* update image of train, as well as delta XY */
 		Direction newdir = GetNewVehicleDirection(v, gp.x, gp.y);
-		UpdateTrainDeltaXY(v, newdir);
+		v->UpdateDeltaXY(newdir);
 		if (update_image) v->cur_image = GetTrainImage(v, newdir);
 
 		v->x_pos = gp.x;
@@ -3095,7 +2974,7 @@
  * train, then goes to the last wagon and deletes that. Each call to this function
  * will remove the last wagon of a crashed train. If this wagon was on a crossing,
  * or inside a tunnel, recalculate the signals as they might need updating
- * @param v the @Vehicle of which last wagon is to be removed
+ * @param v the Vehicle of which last wagon is to be removed
  */
 static void DeleteLastWagon(Vehicle *v)
 {
@@ -3113,6 +2992,9 @@
 
 	BeginVehicleMove(v);
 	EndVehicleMove(v);
+
+	if (IsFrontEngine(v)) RemoveVehicleFromGroup(v);
+
 	DeleteVehicle(v);
 
 	if (v->u.rail.track != TRACK_BIT_DEPOT && v->u.rail.track != TRACK_BIT_WORMHOLE)
@@ -3157,7 +3039,7 @@
 		if (!(v->vehstatus & VS_HIDDEN)) {
 			v->direction = ChangeDir(v->direction, delta[GB(Random(), 0, 2)]);
 			BeginVehicleMove(v);
-			UpdateTrainDeltaXY(v, v->direction);
+			v->UpdateDeltaXY(v->direction);
 			v->cur_image = GetTrainImage(v, v->direction);
 			/* Refrain from updating the z position of the vehicle when on
 			   a bridge, because AfterSetTrainPos will put the vehicle under
@@ -3198,6 +3080,7 @@
 
 	if (state >= 4440 && !(v->tick_counter&0x1F)) {
 		DeleteLastWagon(v);
+		InvalidateWindow(WC_REPLACE_VEHICLE, (v->group_id << 16) | VEH_TRAIN);
 	}
 }
 
@@ -3272,7 +3155,7 @@
 	/* Calculate next tile */
 	tile += TileOffsByDiagDir(dir);
 	// determine the track status on the next tile.
-	uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL) & _reachable_tracks[dir];
+	uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0) & _reachable_tracks[dir];
 
 	/* Calc position within the current tile ?? */
 	uint x = v->x_pos & 0xF;
@@ -3300,7 +3183,7 @@
 			return false;
 		}
 		if ((ts &= (ts >> 16)) == 0) {
-			// make a rail/road crossing red
+			/* make a rail/road crossing red */
 			if (IsLevelCrossingTile(tile)) {
 				if (!IsCrossingBarred(tile)) {
 					BarCrossing(tile);
@@ -3316,7 +3199,7 @@
 		return false;
 	}
 
-	// slow down
+	/* slow down */
 	v->vehstatus |= VS_TRAIN_SLOWING;
 	uint16 break_speed = _breakdown_speeds[x & 0xF];
 	if (!(v->direction & 1)) break_speed >>= 1;
@@ -3359,7 +3242,7 @@
 		return;
 	}
 
-	HandleTrainLoading(v, mode);
+	v->HandleLoading(mode);
 
 	if (v->current_order.type == OT_LOADING) return;
 
@@ -3369,7 +3252,7 @@
 
 	int j = UpdateTrainSpeed(v);
 	if (j == 0) {
-		// if the vehicle has speed 0, update the last_speed field.
+		/* if the vehicle has speed 0, update the last_speed field. */
 		if (v->cur_speed != 0) return;
 	} else {
 		TrainCheckIfLineEnds(v);
@@ -3396,11 +3279,11 @@
 	if (IsFrontEngine(v)) {
 		TrainLocoHandler(v, false);
 
-		// make sure vehicle wasn't deleted.
+		/* make sure vehicle wasn't deleted. */
 		if (v->type == VEH_TRAIN && IsFrontEngine(v))
 			TrainLocoHandler(v, true);
 	} else if (IsFreeWagon(v) && HASBITS(v->vehstatus, VS_CRASHED)) {
-		// Delete flooded standalone wagon
+		/* Delete flooded standalone wagon */
 		if (++v->u.rail.crash_anim_pos >= 4400)
 			DeleteVehicle(v);
 	}
@@ -3415,8 +3298,8 @@
 	if (v->vehstatus & VS_STOPPED)                      return;
 	if (_patches.gotodepot && VehicleHasDepotOrders(v)) return;
 
-	// Don't interfere with a depot visit scheduled by the user, or a
-	// depot visit by the order list.
+	/* Don't interfere with a depot visit scheduled by the user, or a
+	 * depot visit by the order list. */
 	if (v->current_order.type == OT_GOTO_DEPOT &&
 			(v->current_order.flags & (OF_HALT_IN_DEPOT | OF_PART_OF_ORDERS)) != 0)
 		return;
@@ -3448,6 +3331,8 @@
 		return;
 	}
 
+	if (v->current_order.type == OT_LOADING) v->LeaveStation();
+
 	v->current_order.type = OT_GOTO_DEPOT;
 	v->current_order.flags = OF_NON_STOP;
 	v->current_order.dest = depot->index;
@@ -3461,8 +3346,11 @@
 
 	do {
 		const RailVehicleInfo *rvi = RailVehInfo(v->engine_type);
-		if (rvi->running_cost_base > 0)
-			cost += rvi->running_cost_base * _price.running_rail[rvi->running_cost_class];
+
+		byte cost_factor = GetVehicleProperty(v, 0x0D, rvi->running_cost_base);
+		if (cost_factor == 0) continue;
+
+		cost += cost_factor * _price.running_rail[rvi->running_cost_class];
 	} while ((v = GetNextVehicle(v)) != NULL);
 
 	return cost;
@@ -3507,7 +3395,7 @@
 
 	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)
+			/* 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);
 				SetDParam(0, v->unitnumber);
@@ -3579,7 +3467,7 @@
 	}
 }
 
-/*
+/**
  *  Converts all trains to the new subtype format introduced in savegame 16.2
  *  It also links multiheaded engines or make them forget they are multiheaded if no suitable partner is found
  */
--- a/src/train_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/train_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file train_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -22,7 +24,7 @@
 
 	if (!success) return;
 
-	// find a locomotive in the depot.
+	/* find a locomotive in the depot. */
 	found = NULL;
 	FOR_ALL_VEHICLES(v) {
 		if (v->type == VEH_TRAIN && IsFrontEngine(v) &&
@@ -33,10 +35,10 @@
 		}
 	}
 
-	// if we found a loco,
+	/* if we found a loco, */
 	if (found != NULL) {
 		found = GetLastVehicleInChain(found);
-		// put the new wagon at the end of the loco.
+		/* put the new wagon at the end of the loco. */
 		DoCommandP(0, _new_vehicle_id | (found->index << 16), 0, NULL, CMD_MOVE_RAIL_VEHICLE);
 		RebuildVehicleLists();
 	}
@@ -232,7 +234,7 @@
 		DrawSprite(v->vehstatus & VS_STOPPED ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, 2, w->widget[5].top + 1);
 		DrawStringCenteredTruncated(w->widget[5].left + 8, w->widget[5].right, w->widget[5].top + 1, str, 0);
 		DrawWindowViewport(w);
-	}	break;
+	} break;
 
 	case WE_CLICK: {
 		int wid = e->we.click.widget;
@@ -318,7 +320,7 @@
 
 	if (w != NULL) {
 		w->caption_color = v->owner;
-		AssignWindowViewport(w, 3, 17, 0xE2, 0x66, w->window_number | (1 << 31), 0);
+		AssignWindowViewport(w, 3, 17, 0xE2, 0x66, w->window_number | (1 << 31), ZOOM_LVL_TRAIN);
 	}
 }
 
@@ -447,7 +449,7 @@
 	y = 57;
 	sel = w->vscroll.pos;
 
-	// draw the first 3 details tabs
+	/* draw the first 3 details tabs */
 	if (det_tab != 3) {
 		x = 1;
 		for (;;) {
@@ -470,7 +472,7 @@
 					default: NOT_REACHED();
 					case 0: TrainDetailsCargoTab(   v, px, py); break;
 					case 1:
-						// Only show name and value for the 'real' part
+						/* Only show name and value for the 'real' part */
 						if (!IsArticulatedPart(v)) {
 							TrainDetailsInfoTab(v, px, py);
 						}
@@ -481,7 +483,7 @@
 
 				v = u;
 			} else {
-				// Move to the next line
+				/* Move to the next line */
 				do {
 					v = v->next;
 				} while (v != NULL && IsArticulatedPart(v) && v->cargo_cap == 0);
@@ -489,7 +491,7 @@
 			if (v == NULL) return;
 		}
 	} else {
-		// draw total cargo tab
+		/* draw total cargo tab */
 		DrawString(x, y + 2, STR_013F_TOTAL_CAPACITY_TEXT, 0);
 		for (CargoID i = 0; i < NUM_CARGO; i++) {
 			if (max_cargo[i] > 0 && --sel < 0 && sel > -w->vscroll.cap) {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/transparency_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,89 @@
+/* $Id$ */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "table/sprites.h"
+#include "table/strings.h"
+#include "functions.h"
+#include "window.h"
+#include "gui.h"
+#include "viewport.h"
+#include "gfx.h"
+#include "sound.h"
+#include "variables.h"
+
+enum TransparencyToolbarWidgets{
+	/* Widgets not toggled when pressing the X key */
+	TTW_WIDGET_SIGNS = 3,    ///< Make signs background transparent
+
+	/* Widgets toggled when pressing the X key */
+	TTW_WIDGET_TREES,        ///< Make trees transparent
+	TTW_WIDGET_HOUSES,       ///< Make houses transparent
+	TTW_WIDGET_INDUSTRIES,   ///< Make Industries transparent
+	TTW_WIDGET_BUILDINGS,    ///< Make player buildings and structures transparent
+	TTW_WIDGET_BRIDGES,      ///< Make bridges transparent
+	TTW_WIDGET_STRUCTURES,   ///< Make unmovable structures transparent
+	TTW_WIDGET_END,          ///< End of toggle buttons
+};
+
+/** Toggle the bits of the transparencies variable
+ * when clicking on a widget, and play a sound
+ * @param widget been clicked.
+ */
+static void Transparent_Click(byte widget)
+{
+	TOGGLEBIT(_transparent_opt, widget);
+	SndPlayFx(SND_15_BEEP);
+}
+
+static void TransparencyToolbWndProc(Window *w, WindowEvent *e)
+{
+	switch (e->event) {
+		case WE_PAINT:
+			/* must be sure that the widgets show the transparency variable changes
+			 * also when we use shortcuts */
+			for (uint i = TTW_WIDGET_SIGNS; i < TTW_WIDGET_END; i++) {
+				SetWindowWidgetLoweredState(w, i, HASBIT(_transparent_opt, i - TTW_WIDGET_SIGNS));
+			}
+			DrawWindowWidgets(w);
+			break;
+
+		case WE_CLICK:
+			if (e->we.click.widget >= TTW_WIDGET_SIGNS) {
+				Transparent_Click(e->we.click.widget - TTW_WIDGET_SIGNS);
+				MarkWholeScreenDirty();
+			}
+			break;
+	}
+}
+
+static const Widget _transparency_widgets[] = {
+{ WWT_CLOSEBOX,   RESIZE_NONE,  7,   0,  10,   0,  13, STR_00C5,                 STR_018B_CLOSE_WINDOW},
+{  WWT_CAPTION,   RESIZE_NONE,  7,  11, 162,   0,  13, STR_TRANSPARENCY_TOOLB,   STR_018C_WINDOW_TITLE_DRAG_THIS},
+{WWT_STICKYBOX,   RESIZE_NONE,  7, 163, 174,   0,  13, STR_NULL,                 STR_STICKY_BUTTON},
+
+/* transparency widgets:
+ * transparent signs, trees, houses, industries, player's buildings, bridges and unmovable structures */
+{   WWT_IMGBTN,   RESIZE_NONE,  7,   0,  21,  14,  35, SPR_IMG_SIGN,         STR_TRANSPARENT_SIGNS_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7,  22,  43,  14,  35, SPR_IMG_PLANTTREES,   STR_TRANSPARENT_TREES_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7,  44,  65,  14,  35, SPR_IMG_TOWN,         STR_TRANSPARENT_HOUSES_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7,  66,  87,  14,  35, SPR_IMG_INDUSTRY,     STR_TRANSPARENT_INDUSTRIES_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7,  88, 109,  14,  35, SPR_IMG_COMPANY_LIST, STR_TRANSPARENT_BUILDINGS_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7, 110, 152,  14,  35, SPR_IMG_BRIDGE,       STR_TRANSPARENT_BRIDGES_DESC},
+{   WWT_IMGBTN,   RESIZE_NONE,  7, 153, 174,  14,  35, SPR_IMG_TRANSMITTER,  STR_TRANSPARENT_STRUCTURES_DESC},
+
+{   WIDGETS_END},
+};
+
+static const WindowDesc _transparency_desc = {
+	WDP_ALIGN_TBR, 58+36, 175, 36,
+	WC_TRANSPARENCY_TOOLBAR, WC_NONE,
+	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
+	_transparency_widgets,
+	TransparencyToolbWndProc
+};
+
+void ShowTransparencyToolbar(void)
+{
+	AllocateWindowDescFront(&_transparency_desc, 0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/transparency_gui.h	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,8 @@
+/* $Id$ */
+
+#ifndef TRANSPARENCY_GUI_H
+#define TRANSPARENCY_GUI_H
+
+void ShowTransparencyToolbar();
+
+#endif /* TRANSPARENCY_GUI_H */
--- a/src/tree_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tree_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file tree_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
@@ -53,7 +55,7 @@
 	if (tree != TREE_INVALID) {
 		MakeTree(tile, tree, GB(r, 22, 2), min(GB(r, 16, 3), 6), TREE_GROUND_GRASS, 0);
 
-		// above snowline?
+		/* above snowline? */
 		if (_opt.landscape == LT_ARCTIC && GetTileZ(tile) > GetSnowLine()) {
 			SetTreeGroundDensity(tile, TREE_GROUND_SNOW_DESERT, 3);
 			SetTreeCounter(tile, (TreeGround)GB(r, 24, 3));
@@ -207,6 +209,7 @@
 
 /** Plant a tree.
  * @param tile start tile of area-drag of tree plantation
+ * @param flags type of operation
  * @param p1 tree type, -1 means random.
  * @param p2 end tile of area-drag
  */
@@ -240,7 +243,7 @@
 
 			switch (GetTileType(tile)) {
 				case MP_TREES:
-					// no more space for trees?
+					/* no more space for trees? */
 					if (_game_mode != GM_EDITOR && GetTreeCount(tile) == 3) {
 						msg = STR_2803_TREE_ALREADY_HERE;
 						continue;
@@ -250,7 +253,7 @@
 						AddTreeCount(tile, 1);
 						MarkTileDirtyByTile(tile);
 					}
-					// 2x as expensive to add more trees to an existing tile
+					/* 2x as expensive to add more trees to an existing tile */
 					cost += _price.build_trees * 2;
 					break;
 
@@ -314,7 +317,7 @@
 struct TreeListEnt {
 	SpriteID image;
 	SpriteID pal;
-	byte x,y;
+	byte x, y;
 };
 
 static void DrawTile_Trees(TileInfo *ti)
@@ -365,7 +368,7 @@
 
 	StartSpriteCombine();
 
-	if (!(_display_opt & DO_TRANS_BUILDINGS) || !_patches.invisible_trees) {
+	if (!HASBIT(_transparent_opt, TO_TREES) || !_patches.invisible_trees) {
 		TreeListEnt te[4];
 		uint i;
 
@@ -374,7 +377,7 @@
 		do {
 			SpriteID image = s[0].sprite + (--i == 0 ? GetTreeGrowth(ti->tile) : 3);
 			SpriteID pal;
-			if (_display_opt & DO_TRANS_BUILDINGS) {
+			if (HASBIT(_transparent_opt, TO_TREES)) {
 				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 				pal = PALETTE_TO_TRANSPARENT;
 			} else {
@@ -622,7 +625,7 @@
 		MakeTree(tile, tree, 0, 0, ct == CLEAR_ROUGH ? TREE_GROUND_ROUGH : TREE_GROUND_GRASS, 0);
 	}
 
-	// byte underflow
+	/* byte underflow */
 	if (--_trees_tick_ctr != 0) return;
 
 	/* place a tree at a random spot */
@@ -645,7 +648,7 @@
 	/* not used */
 }
 
-static uint32 GetTileTrackStatus_Trees(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Trees(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	return 0;
 }
--- a/src/tree_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tree_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file tree_map.h */
+
 #ifndef TREE_MAP_H
 #define TREE_MAP_H
 
@@ -26,9 +28,9 @@
 /* ground type, m2 bits 4...5
  * valid densities (bits 6...7) in comments after the enum */
 enum TreeGround {
-	TREE_GROUND_GRASS       = 0, // 0
-	TREE_GROUND_ROUGH       = 1, // 0
-	TREE_GROUND_SNOW_DESERT = 2  // 0-3 for snow, 3 for desert
+	TREE_GROUND_GRASS       = 0, ///< 0
+	TREE_GROUND_ROUGH       = 1, ///< 0
+	TREE_GROUND_SNOW_DESERT = 2  ///< 0-3 for snow, 3 for desert
 };
 
 
--- a/src/tunnel_map.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tunnel_map.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,18 @@
 /* $Id$ */
 
+/** @file tunnel_map.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "tile.h"
 #include "tunnel_map.h"
 
+/**
+ * Gets the other end of the tunnel. Where a vehicle would reappear when it
+ * enters at the given tile.
+ * @param tile the tile to search from.
+ * @return the tile of the other end of the tunnel.
+ */
 TileIndex GetOtherTunnelEnd(TileIndex tile)
 {
 	DiagDirection dir = GetTunnelDirection(tile);
@@ -24,6 +32,13 @@
 }
 
 
+/**
+ * Is there a tunnel in the way in the given direction?
+ * @param tile the tile to search from.
+ * @param z    the 'z' to search on.
+ * @param dir  the direction to start searching to.
+ * @return true if and only if there is a tunnel.
+ */
 static bool IsTunnelInWayDir(TileIndex tile, uint z, DiagDirection dir)
 {
 	TileIndexDiff delta = TileOffsByDiagDir(dir);
@@ -40,6 +55,12 @@
 		GetTunnelDirection(tile) == dir;
 }
 
+/**
+ * Is there a tunnel in the way in any direction?
+ * @param tile the tile to search from.
+ * @param z the 'z' to search on.
+ * @return true if and only if there is a tunnel.
+ */
 bool IsTunnelInWay(TileIndex tile, uint z)
 {
 	return
--- a/src/tunnel_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tunnel_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file tunnel_map.h */
+
 #ifndef TUNNEL_MAP_H
 #define TUNNEL_MAP_H
 
@@ -7,8 +9,14 @@
 #include "macros.h"
 #include "map.h"
 #include "rail.h"
+#include "road.h"
 
-
+/**
+ * Is this a tunnel (entrance)?
+ * @param t the tile that might be a tunnel
+ * @pre IsTileType(t, MP_TUNNELBRIDGE)
+ * @return true if and only if this tile is a tunnel (entrance)
+ */
 static inline bool IsTunnel(TileIndex t)
 {
 	assert(IsTileType(t, MP_TUNNELBRIDGE));
@@ -16,31 +24,60 @@
 }
 
 
+/**
+ * Is this a tunnel (entrance)?
+ * @param t the tile that might be a tunnel
+ * @return true if and only if this tile is a tunnel (entrance)
+ */
 static inline bool IsTunnelTile(TileIndex t)
 {
 	return IsTileType(t, MP_TUNNELBRIDGE) && IsTunnel(t);
 }
 
-
+/**
+ * Gets the direction facing out of the tunnel
+ * @param t the tile to get the tunnel facing direction of
+ * @pre IsTunnelTile(t)
+ * @return the direction the tunnel is facing
+ */
 static inline DiagDirection GetTunnelDirection(TileIndex t)
 {
 	assert(IsTunnelTile(t));
 	return (DiagDirection)GB(_m[t].m5, 0, 2);
 }
 
-
+/**
+ * Gets the transport type of the tunnel (road or rail)
+ * @param t the tunnel entrance tile to get the type of
+ * @pre IsTunnelTile(t)
+ * @return the transport type in the tunnel
+ */
 static inline TransportType GetTunnelTransportType(TileIndex t)
 {
 	assert(IsTunnelTile(t));
 	return (TransportType)GB(_m[t].m5, 2, 2);
 }
 
+/**
+ * Is this tunnel entrance in a snowy or desert area?
+ * @param t the tunnel entrance tile
+ * @pre IsTunnelTile(t)
+ * @return true if and only if the tunnel entrance is in a snowy/desert area
+ */
 static inline bool HasTunnelSnowOrDesert(TileIndex t)
 {
 	assert(IsTunnelTile(t));
 	return HASBIT(_m[t].m4, 7);
 }
 
+/**
+ * Places this tunnel entrance in a snowy or desert area,
+ * or takes it out of there.
+ * @param t the tunnel entrance tile
+ * @param snow_or_desert is the entrance in snow or desert (true), when
+ *                       not in snow and not in desert false
+ * @pre IsTunnelTile(t)
+ */
 static inline void SetTunnelSnowOrDesert(TileIndex t, bool snow_or_desert)
 {
 	assert(IsTunnelTile(t));
@@ -52,16 +89,30 @@
 bool IsTunnelInWay(TileIndex, uint z);
 
 
-static inline void MakeRoadTunnel(TileIndex t, Owner o, DiagDirection d)
+/**
+ * Makes a road tunnel entrance
+ * @param t the entrance of the tunnel
+ * @param o the owner of the entrance
+ * @param d the direction facing out of the tunnel
+ * @param r the road type used in the tunnel
+ */
+static inline void MakeRoadTunnel(TileIndex t, Owner o, DiagDirection d, RoadTypes r)
 {
 	SetTileType(t, MP_TUNNELBRIDGE);
 	SetTileOwner(t, o);
 	_m[t].m2 = 0;
-	_m[t].m3 = 0;
+	_m[t].m3 = r;
 	_m[t].m4 = 0;
 	_m[t].m5 = TRANSPORT_ROAD << 2 | d;
 }
 
+/**
+ * Makes a rail tunnel entrance
+ * @param t the entrance of the tunnel
+ * @param o the owner of the entrance
+ * @param d the direction facing out of the tunnel
+ * @param r the rail type used in the tunnel
+ */
 static inline void MakeRailTunnel(TileIndex t, Owner o, DiagDirection d, RailType r)
 {
 	SetTileType(t, MP_TUNNELBRIDGE);
--- a/src/tunnelbridge_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/tunnelbridge_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -61,8 +61,9 @@
 Bridge _bridge[MAX_BRIDGES];
 
 
-// calculate the price factor for building a long bridge.
-// basically the cost delta is 1,1, 1, 2,2, 3,3,3, 4,4,4,4, 5,5,5,5,5, 6,6,6,6,6,6,  7,7,7,7,7,7,7,  8,8,8,8,8,8,8,8,
+/** calculate the price factor for building a long bridge.
+ * basically the cost delta is 1,1, 1, 2,2, 3,3,3, 4,4,4,4, 5,5,5,5,5, 6,6,6,6,6,6,  7,7,7,7,7,7,7,  8,8,8,8,8,8,8,8,
+ */
 int CalcBridgeLenCostFactor(int x)
 {
 	int n;
@@ -79,11 +80,11 @@
 
 #define M(x) (1 << (x))
 enum BridgeFoundation {
-	// foundation, whole tile is leveled up --> 3 corners raised
+	/* foundation, whole tile is leveled up --> 3 corners raised */
 	BRIDGE_FULL_LEVELED_FOUNDATION = M(SLOPE_WSE) | M(SLOPE_NWS) | M(SLOPE_ENW) | M(SLOPE_SEN),
-	// foundation, tile is partly leveled up --> 1 corner raised
+	/* foundation, tile is partly leveled up --> 1 corner raised */
 	BRIDGE_PARTLY_LEVELED_FOUNDATION = M(SLOPE_W) | M(SLOPE_S) | M(SLOPE_E) | M(SLOPE_N),
-	// no foundations (X,Y direction)
+	/* no foundations (X,Y direction) */
 	BRIDGE_NO_FOUNDATION = M(SLOPE_FLAT) | M(SLOPE_SW) | M(SLOPE_SE) | M(SLOPE_NW) | M(SLOPE_NE),
 	BRIDGE_HORZ_RAMP = (BRIDGE_PARTLY_LEVELED_FOUNDATION | BRIDGE_NO_FOUNDATION) & ~M(SLOPE_FLAT)
 };
@@ -167,15 +168,18 @@
 
 /** Build a Bridge
  * @param end_tile end tile
+ * @param flags type of operation
  * @param p1 packed start tile coords (~ dx)
  * @param p2 various bitstuffed elements
  * - p2 = (bit 0- 7) - bridge type (hi bh)
- * - p2 = (bit 8-..) - rail type. bit15 ((x>>8)&0x80) means road bridge.
+ * - p2 = (bit 8-..) - rail type or road types.
+ * - p2 = (bit 15  ) - set means road bridge.
  */
 int32 CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	uint bridge_type;
 	RailType railtype;
+	RoadTypes roadtypes;
 	uint x;
 	uint y;
 	uint sx;
@@ -202,12 +206,15 @@
 
 	if (p1 >= MapSize()) return CMD_ERROR;
 
-	// type of bridge
+	/* type of bridge */
 	if (HASBIT(p2, 15)) {
 		railtype = INVALID_RAILTYPE; // road bridge
+		roadtypes = (RoadTypes)GB(p2, 8, 3);
+		if (!AreValidRoadTypes(roadtypes)) return CMD_ERROR;
 	} else {
 		if (!ValParamRailtype(GB(p2, 8, 8))) return CMD_ERROR;
 		railtype = (RailType)GB(p2, 8, 8);
+		roadtypes = ROADTYPES_NONE;
 	}
 
 	x = TileX(end_tile);
@@ -255,7 +262,7 @@
 
 	if (z_start != z_end) return_cmd_error(STR_5009_LEVEL_LAND_OR_WATER_REQUIRED);
 
-	// Towns are not allowed to use bridges on slopes.
+	/* Towns are not allowed to use bridges on slopes. */
 	allow_on_slopes = (!_is_old_ai_player
 	                   && _current_player != OWNER_TOWN && _patches.build_on_slopes);
 
@@ -297,6 +304,9 @@
 		cost = (bridge_len + 1) * _price.clear_bridge; // The cost of clearing the current bridge.
 		replace_bridge = true;
 		replaced_bridge_type = GetBridgeType(tile_start);
+
+		/* Do not remove road types when upgrading a bridge */
+		roadtypes |= GetRoadTypes(tile_start);
 	} else {
 		/* Build a new bridge. */
 
@@ -315,7 +325,7 @@
 		if (CmdFailed(ret)) return ret;
 		cost += ret;
 
-		// false - end tile slope check
+		/* false - end tile slope check */
 		terraformcost = CheckBridgeSlopeSouth(direction, tileh_end);
 		if (CmdFailed(terraformcost) || (terraformcost != 0 && !allow_on_slopes))
 			return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
@@ -350,8 +360,8 @@
 			MakeRailBridgeRamp(tile_start, owner, bridge_type, dir, railtype);
 			MakeRailBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), railtype);
 		} else {
-			MakeRoadBridgeRamp(tile_start, owner, bridge_type, dir);
-			MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir));
+			MakeRoadBridgeRamp(tile_start, owner, bridge_type, dir, roadtypes);
+			MakeRoadBridgeRamp(tile_end,   owner, bridge_type, ReverseDiagDir(dir), roadtypes);
 		}
 		MarkTileDirtyByTile(tile_start);
 		MarkTileDirtyByTile(tile_end);
@@ -438,8 +448,9 @@
 
 
 /** Build Tunnel.
- * @param tile start tile of tunnel
- * @param p1 railtype, 0x200 for road tunnel
+ * @param start_tile start tile of tunnel
+ * @param flags type of operation
+ * @param p1 railtype or roadtypes. bit 9 set means road tunnel
  * @param p2 unused
  */
 int32 CmdBuildTunnel(TileIndex start_tile, uint32 flags, uint32 p1, uint32 p2)
@@ -455,8 +466,11 @@
 	int32 ret;
 
 	_build_tunnel_endtile = 0;
-
-	if (p1 != 0x200 && !ValParamRailtype(p1)) return CMD_ERROR;
+	if (!HASBIT(p1, 9)) {
+		if (!ValParamRailtype(p1)) return CMD_ERROR;
+	} else if (!AreValidRoadTypes((RoadTypes)GB(p1, 0, 3))) {
+		return CMD_ERROR;
+	}
 
 	start_tileh = GetTileSlope(start_tile, &start_z);
 
@@ -496,10 +510,10 @@
 	/* Add the cost of the entrance */
 	cost += _price.build_tunnel + ret;
 
-	// if the command fails from here on we want the end tile to be highlighted
+	/* if the command fails from here on we want the end tile to be highlighted */
 	_build_tunnel_endtile = end_tile;
 
-	// slope of end tile must be complementary to the slope of the start tile
+	/* slope of end tile must be complementary to the slope of the start tile */
 	if (end_tileh != ComplementSlope(start_tileh)) {
 		ret = DoCommand(end_tile, end_tileh & start_tileh, 0, flags, CMD_TERRAFORM_LAND);
 		if (CmdFailed(ret)) return_cmd_error(STR_5005_UNABLE_TO_EXCAVATE_LAND);
@@ -516,8 +530,8 @@
 			UpdateSignalsOnSegment(start_tile, direction);
 			YapfNotifyTrackLayoutChange(start_tile, AxisToTrack(DiagDirToAxis(direction)));
 		} else {
-			MakeRoadTunnel(start_tile, _current_player, direction);
-			MakeRoadTunnel(end_tile,   _current_player, ReverseDiagDir(direction));
+			MakeRoadTunnel(start_tile, _current_player, direction,                 (RoadTypes)GB(p1, 0, 3));
+			MakeRoadTunnel(end_tile,   _current_player, ReverseDiagDir(direction), (RoadTypes)GB(p1, 0, 3));
 		}
 	}
 
@@ -591,12 +605,12 @@
 	}
 
 	if (flags & DC_EXEC) {
-		// We first need to request the direction before calling DoClearSquare
-		//  else the direction is always 0.. dah!! ;)
+		/* We first need to request the direction before calling DoClearSquare
+		 *  else the direction is always 0.. dah!! ;) */
 		DiagDirection dir = GetTunnelDirection(tile);
 		Track track;
 
-		// Adjust the town's player rating. Do this before removing the tile owner info.
+		/* Adjust the town's player rating. Do this before removing the tile owner info. */
 		if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
 			ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
 
@@ -636,10 +650,11 @@
 	if (!CheckAllowRemoveTunnelBridge(tile)) return CMD_ERROR;
 
 	endtile = GetOtherBridgeEnd(tile);
+	byte bridge_height = GetBridgeHeight(tile);
 
-	if (!EnsureNoVehicle(tile) ||
-			!EnsureNoVehicle(endtile) ||
-			IsVehicleOnBridge(tile, endtile, GetBridgeHeight(tile))) {
+	if (FindVehicleOnTileZ(tile, bridge_height) != NULL ||
+			FindVehicleOnTileZ(endtile, bridge_height) != NULL ||
+			IsVehicleOnBridge(tile, endtile, bridge_height)) {
 		return CMD_ERROR;
 	}
 
@@ -661,8 +676,8 @@
 		TileIndex c;
 		Track track;
 
-		//checks if the owner is town then decrease town rating by RATING_TUNNEL_BRIDGE_DOWN_STEP until
-		// you have a "Poor" (0) town rating
+		/* checks if the owner is town then decrease town rating by RATING_TUNNEL_BRIDGE_DOWN_STEP until
+		 * you have a "Poor" (0) town rating */
 		if (IsTileOwner(tile, OWNER_TOWN) && _game_mode != GM_EDITOR)
 			ChangeTownRating(t, RATING_TUNNEL_BRIDGE_DOWN_STEP, RATING_TUNNEL_BRIDGE_MINIMUM);
 
@@ -717,7 +732,7 @@
 
 		if (GetRailType(tile) == totype) return CMD_ERROR;
 
-		// 'hidden' elrails can't be downgraded to normal rail when elrails are disabled
+		/* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
 		if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
 
 		endtile = CheckTunnelBusy(tile, &length);
@@ -740,10 +755,11 @@
 		if (!CheckTileOwnership(tile)) return CMD_ERROR;
 
 		endtile = GetOtherBridgeEnd(tile);
+		byte bridge_height = GetBridgeHeight(tile);
 
-		if (!EnsureNoVehicle(tile) ||
-				!EnsureNoVehicle(endtile) ||
-				IsVehicleOnBridge(tile, endtile, GetBridgeHeight(tile))) {
+		if (FindVehicleOnTileZ(tile, bridge_height) != NULL ||
+				FindVehicleOnTileZ(endtile, bridge_height) != NULL ||
+				IsVehicleOnBridge(tile, endtile, bridge_height)) {
 			return CMD_ERROR;
 		}
 
@@ -792,7 +808,7 @@
 			{ 2, 4, 8, 1,   2, 16, 9, 0 }
 		};
 
-		if (_display_opt & DO_TRANS_BUILDINGS) {
+		if (HASBIT(_transparent_opt, TO_BRIDGES)) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
 		} else {
@@ -829,7 +845,7 @@
 
 	if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION, tileh)) return tileh;
 
-	// inclined sloped building
+	/* inclined sloped building */
 	switch (tileh) {
 		case SLOPE_W:
 		case SLOPE_STEEP_W: i = 0; break;
@@ -846,10 +862,44 @@
 }
 
 /**
+ * Draws the trambits over an already drawn (lower end) of a bridge.
+ * @param x       the x of the bridge
+ * @param y       the y of the bridge
+ * @param z       the z of the bridge
+ * @param offset  number representing whether to level or sloped and the direction
+ * @param overlay do we want to still see the road?
+ */
+static void DrawBridgeTramBits(int x, int y, byte z, int offset, bool overlay)
+{
+	static const SpriteID tram_offsets[2][6] = { { 107, 108, 109, 110, 111, 112 }, { 4, 5, 15, 16, 17, 18 } };
+	static const SpriteID back_offsets[6]    =   {  95,  95,  99, 102, 100, 101 };
+	static const SpriteID front_offsets[6]   =   {  97,  98, 103, 106, 104, 105 };
+
+	static const uint size_x[6] = { 11, 16, 16, 16, 16, 16 };
+	static const uint size_y[6] = { 16, 11, 16, 16, 16, 16 };
+
+	AddSortableSpriteToDraw(SPR_TRAMWAY_BASE + tram_offsets[overlay][offset], PAL_NONE, x, y, size_x[offset], size_y[offset], offset >= 2 ? 1 : 0, z);
+
+	SpriteID front = SPR_TRAMWAY_BASE + front_offsets[offset];
+	SpriteID back  = SPR_TRAMWAY_BASE + back_offsets[offset];
+	SpriteID pal   = PAL_NONE;
+	if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
+		SETBIT(front, PALETTE_MODIFIER_TRANSPARENT);
+		SETBIT(back,  PALETTE_MODIFIER_TRANSPARENT);
+		pal = PALETTE_TO_TRANSPARENT;
+	}
+
+	AddSortableSpriteToDraw(back,  pal, x, y, size_x[offset], size_y[offset], 0, z);
+	/* For sloped sprites the bounding box needs to be higher, as the pylons stop on a higher point */
+	AddSortableSpriteToDraw(front, pal, x, y, size_x[offset], size_y[offset], offset >= 2 ? 0x30 : 0x10, z);
+}
+
+/**
  * Draws a tunnel of bridge tile.
  * For tunnels, this is rather simple, as you only needa draw the entrance.
  * Bridges are a bit more complex. base_offset is where the sprite selection comes into play
  * and it works a bit like a bitmask.<p> For bridge heads:
+ * @param ti TileInfo of the structure to draw
  * <ul><li>Bit 0: direction</li>
  * <li>Bit 1: northern or southern heads</li>
  * <li>Bit 2: Set if the bridge head is sloped</li>
@@ -873,9 +923,21 @@
 
 		image += GetTunnelDirection(ti->tile) * 2;
 		DrawGroundSprite(image, PAL_NONE);
-		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
+		if (GetTunnelTransportType(ti->tile) == TRANSPORT_ROAD) {
+			DiagDirection dir = GetTunnelDirection(ti->tile);
+			RoadTypes rts = GetRoadTypes(ti->tile);
 
-		AddSortableSpriteToDraw(image+1, PAL_NONE, ti->x + TILE_SIZE - 1, ti->y + TILE_SIZE - 1, 1, 1, 8, (byte)ti->z);
+			if (HASBIT(rts, ROADTYPE_TRAM)) {
+				static const SpriteID tunnel_sprites[2][4] = { { 28, 78, 79, 27 }, {  5, 76, 77,  4 } };
+
+				DrawGroundSprite(SPR_TRAMWAY_BASE + tunnel_sprites[rts - ROADTYPES_TRAM][dir], PAL_NONE);
+				AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + dir, PAL_NONE, ti->x, ti->y, 16, 16, 16, (byte)ti->z);
+			}
+		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
+			DrawCatenary(ti);
+		}
+
+		AddSortableSpriteToDraw(image + 1, PAL_NONE, ti->x + TILE_SIZE - 1, ti->y + TILE_SIZE - 1, 1, 1, 8, (byte)ti->z);
 		DrawBridgeMiddle(ti);
 	} else if (IsBridge(ti->tile)) { // XXX is this necessary?
 		const PalSpriteID *psid;
@@ -884,7 +946,7 @@
 
 		if (GetBridgeTransportType(ti->tile) == TRANSPORT_RAIL) {
 			base_offset = GetRailTypeInfo(GetRailType(ti->tile))->bridge_offset;
-			assert(base_offset != 8); /* This one is used for roads */
+			assert(base_offset != 8); // This one is used for roads
 		} else {
 			base_offset = 8;
 		}
@@ -897,7 +959,7 @@
 			if (f != 0) DrawFoundation(ti, f);
 		}
 
-		// HACK Wizardry to convert the bridge ramp direction into a sprite offset
+		/* HACK Wizardry to convert the bridge ramp direction into a sprite offset */
 		base_offset += (6 - GetBridgeRampDirection(ti->tile)) % 4;
 
 		if (ti->tileh == SLOPE_FLAT) base_offset += 4; // sloped bridge head
@@ -911,12 +973,10 @@
 			DrawGroundSprite(SPR_FLAT_SNOWY_TILE + _tileh_to_sprite[ti->tileh], PAL_NONE);
 		}
 
-		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
-
 		image = psid->sprite;
 
-		// draw ramp
-		if (_display_opt & DO_TRANS_BUILDINGS) {
+		/* draw ramp */
+		if (HASBIT(_transparent_opt, TO_BRIDGES)) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
 		} else {
@@ -927,9 +987,27 @@
 		 * it doesn't disappear behind it
 		 */
 		AddSortableSpriteToDraw(
-			image, pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 1 : 8, ti->z
+			image, pal, ti->x, ti->y, 16, 16, ti->tileh == SLOPE_FLAT ? 0 : 8, ti->z
 		);
 
+		if (GetBridgeTransportType(ti->tile) == TRANSPORT_ROAD) {
+			RoadTypes rts = GetRoadTypes(ti->tile);
+
+			if (HASBIT(rts, ROADTYPE_TRAM)) {
+				uint offset = GetBridgeRampDirection(ti->tile);
+				uint z = ti->z;
+				if (ti->tileh != SLOPE_FLAT) {
+					offset = (offset + 1) & 1;
+					z += TILE_HEIGHT;
+				} else {
+					offset += 2;
+				}
+				DrawBridgeTramBits(ti->x, ti->y, z, offset, HASBIT(rts, ROADTYPE_ROAD));
+			}
+		} else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
+			DrawCatenary(ti);
+		}
+
 		DrawBridgeMiddle(ti);
 	}
 }
@@ -1005,10 +1083,11 @@
 
 	x = ti->x;
 	y = ti->y;
-	z = GetBridgeHeight(rampsouth) - 3;
+	uint bridge_z = GetBridgeHeight(rampsouth);
+	z = bridge_z - 3;
 
 	image = psid->sprite;
-	if (_display_opt & DO_TRANS_BUILDINGS) {
+	if (HASBIT(_transparent_opt, TO_BRIDGES)) {
 		SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 		pal = PALETTE_TO_TRANSPARENT;
 	} else {
@@ -1023,14 +1102,24 @@
 
 	psid++;
 	image = psid->sprite;
-	if (_display_opt & DO_TRANS_BUILDINGS) {
+	if (HASBIT(_transparent_opt, TO_BRIDGES)) {
 		SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 		pal = PALETTE_TO_TRANSPARENT;
 	} else {
 		pal = psid->pal;
 	}
 
-	// draw roof, the component of the bridge which is logically between the vehicle and the camera
+	if (GetBridgeTransportType(rampsouth) == TRANSPORT_ROAD) {
+		RoadTypes rts = GetRoadTypes(rampsouth);
+
+		if (HASBIT(rts, ROADTYPE_TRAM)) {
+			DrawBridgeTramBits(x, y, bridge_z, axis ^ 1, HASBIT(rts, ROADTYPE_ROAD));
+		}
+	} else if (GetRailType(rampsouth) == RAILTYPE_ELECTRIC) {
+		DrawCatenary(ti);
+	}
+
+	/* draw roof, the component of the bridge which is logically between the vehicle and the camera */
 	if (axis == AXIS_X) {
 		y += 12;
 		if (image & SPRITE_MASK) AddSortableSpriteToDraw(image, pal, x, y, 16, 1, 0x28, z);
@@ -1039,14 +1128,12 @@
 		if (image & SPRITE_MASK) AddSortableSpriteToDraw(image, pal, x, y, 1, 16, 0x28, z);
 	}
 
-	if (GetRailType(rampsouth) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
-
 	psid++;
 	if (ti->z + 5 == z) {
-		// draw poles below for small bridges
+		/* draw poles below for small bridges */
 		if (psid->sprite != 0) {
 			image = psid->sprite;
-			if (_display_opt & DO_TRANS_BUILDINGS) {
+			if (HASBIT(_transparent_opt, TO_BRIDGES)) {
 				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 				pal = PALETTE_TO_TRANSPARENT;
 			} else {
@@ -1056,7 +1143,7 @@
 			DrawGroundSpriteAt(image, pal, x, y, z);
 		}
 	} else if (_patches.bridge_pillars) {
-		// draw pillars below for high bridges
+		/* draw pillars below for high bridges */
 		DrawBridgePillars(psid, ti, axis, type, x, y, z);
 	}
 }
@@ -1073,13 +1160,13 @@
 	if (IsTunnel(tile)) {
 		uint pos = (DiagDirToAxis(GetTunnelDirection(tile)) == AXIS_X ? y : x);
 
-		// In the tunnel entrance?
+		/* In the tunnel entrance? */
 		if (5 <= pos && pos <= 10) return z;
 	} else {
 		DiagDirection dir = GetBridgeRampDirection(tile);
 		uint pos = (DiagDirToAxis(dir) == AXIS_X ? y : x);
 
-		// On the bridge ramp?
+		/* On the bridge ramp? */
 		if (5 <= pos && pos <= 10) {
 			uint delta;
 
@@ -1218,13 +1305,15 @@
 }
 
 
-static uint32 GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_TunnelBridge(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	if (IsTunnel(tile)) {
 		if (GetTunnelTransportType(tile) != mode) return 0;
+		if (GetTunnelTransportType(tile) == TRANSPORT_ROAD && (GetRoadTypes(tile) & sub_mode) == 0) return 0;
 		return AxisToTrackBits(DiagDirToAxis(GetTunnelDirection(tile))) * 0x101;
 	} else {
 		if (GetBridgeTransportType(tile) != mode) return 0;
+		if (GetBridgeTransportType(tile) == TRANSPORT_ROAD && (GetRoadTypes(tile) & sub_mode) == 0) return 0;
 		return AxisToTrackBits(DiagDirToAxis(GetBridgeRampDirection(tile))) * 0x101;
 	}
 }
@@ -1236,7 +1325,14 @@
 	if (new_player != PLAYER_SPECTATOR) {
 		SetTileOwner(tile, new_player);
 	} else {
-		DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
+		if (CmdFailed(DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
+			/* When clearing the bridge/tunnel failed there are still vehicles on/in
+			 * the bridge/tunnel. As all *our* vehicles are already removed, they
+			 * must be of another owner. Therefor this must be a road bridge/tunnel.
+			 * In that case we can safely reassign the ownership to OWNER_NONE. */
+			assert((IsTunnel(tile) ? GetTunnelTransportType(tile) : GetBridgeTransportType(tile)) == TRANSPORT_ROAD);
+			SetTileOwner(tile, OWNER_NONE);
+		}
 	}
 }
 
@@ -1302,7 +1398,7 @@
 			dir = GetTunnelDirection(tile);
 			vdir = DirToDiagDir(v->direction);
 
-			// Enter tunnel?
+			/* Enter tunnel? */
 			if (v->u.road.state != RVSB_WORMHOLE && dir == vdir) {
 				if (fc == _tunnel_fractcoord_4[dir] ||
 						fc == _tunnel_fractcoord_5[dir]) {
--- a/src/unix.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/unix.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file unix.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
@@ -27,7 +29,7 @@
 #include <exec/types.h>
 ULONG __stack = (1024*1024)*2; // maybe not that much is needed actually ;)
 
-// The system supplied definition of SIG_IGN does not match
+/* The system supplied definition of SIG_IGN does not match */
 #undef SIG_IGN
 #define SIG_IGN (void (*)(int))1
 #endif /* __MORPHOS__ */
@@ -39,7 +41,7 @@
 
 #if defined(__APPLE__)
 	#if defined(WITH_SDL)
-		//the mac implementation needs this file included in the same file as main()
+		/*the mac implementation needs this file included in the same file as main() */
 		#include <SDL.h>
 	#endif
 #endif
@@ -51,7 +53,7 @@
 #else
 	/* On MorphOS or AmigaOS paths look like: "Volume:directory/subdirectory" */
 	const char *s = strchr(path, ':');
-	return s[1] == '\0';
+	return s != NULL && s[1] == '\0';
 #endif
 }
 
@@ -85,8 +87,11 @@
 	if (FiosIsRoot(path)) {
 		snprintf(filename, lengthof(filename), "%s:%s", path, ent->d_name);
 	} else // XXX - only next line!
+#else
+	assert(path[strlen(path) - 1] == PATHSEPCHAR);
+	if (strlen(path) > 2) assert(path[strlen(path) - 2] != PATHSEPCHAR);
 #endif
-	snprintf(filename, lengthof(filename), "%s" PATHSEP "%s", path, ent->d_name);
+	snprintf(filename, lengthof(filename), "%s%s", path, ent->d_name);
 
 	return stat(filename, sb) == 0;
 }
@@ -104,11 +109,11 @@
 void ShowOSErrorBox(const char *buf)
 {
 #if defined(__APPLE__)
-	// this creates an NSAlertPanel with the contents of 'buf'
-	// this is the native and nicest way to do this on OSX
+	/* this creates an NSAlertPanel with the contents of 'buf'
+	 * this is the native and nicest way to do this on OSX */
 	ShowMacDialog( buf, "See readme for more info\nMost likely you are missing files from the original TTD", "Quit" );
 #else
-	// all systems, but OSX
+	/* all systems, but OSX */
 	fprintf(stderr, "\033[1;31mError: %s\033[0;39m\n", buf);
 #endif
 }
@@ -151,10 +156,10 @@
 }
 
 
-// multi os compatible sleep function
+/* multi os compatible sleep function */
 
 #ifdef __AMIGA__
-// usleep() implementation
+/* usleep() implementation */
 #	include <devices/timer.h>
 #	include <dos/dos.h>
 
@@ -174,7 +179,7 @@
 		ULONG signals;
 		ULONG TimerSigBit = 1 << TimerPort->mp_SigBit;
 
-		// send IORequest
+		/* send IORequest */
 		TimerRequest->tr_node.io_Command = TR_ADDREQUEST;
 		TimerRequest->tr_time.tv_secs    = (milliseconds * 1000) / 1000000;
 		TimerRequest->tr_time.tv_micro   = (milliseconds * 1000) % 1000000;
@@ -243,7 +248,7 @@
 	}
 
 	*outbuf = '\0';
-	// FIX: invalid characters will abort conversion, but they shouldn't occur?
+	/* FIX: invalid characters will abort conversion, but they shouldn't occur? */
 	return buf;
 }
 
--- a/src/unmovable.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/unmovable.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file unmovable.h */
+
 #ifndef UNMOVABLE_H
 #define UNMOVABLE_H
 
--- a/src/unmovable_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/unmovable_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,10 +1,13 @@
 /* $Id$ */
 
+/** @file unmovable_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "table/strings.h"
 #include "table/sprites.h"
 #include "functions.h"
+#include "landscape.h"
 #include "map.h"
 #include "tile.h"
 #include "command.h"
@@ -24,8 +27,9 @@
 /** Destroy a HQ.
  * During normal gameplay you can only implicitely destroy a HQ when you are
  * rebuilding it. Otherwise, only water can destroy it.
- * @param tile tile coordinates where HQ is located to destroy
+ * @param pid Player requesting the destruction of his HQ
  * @param flags docommand flags of calling function
+ * @return cost of the operation
  */
 static int32 DestroyCompanyHQ(PlayerID pid, uint32 flags)
 {
@@ -44,7 +48,7 @@
 		InvalidateWindow(WC_COMPANY, pid);
 	}
 
-	// cost of relocating company is 1% of company value
+	/* cost of relocating company is 1% of company value */
 	return CalculateCompanyValue(p) / 100;
 }
 
@@ -69,12 +73,14 @@
 	MarkTileDirtyByTile(tile + TileDiffXY(1, 1));
 }
 
+extern int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID* station, bool check_clear = true);
+
 /** Build or relocate the HQ. This depends if the HQ is already built or not
  * @param tile tile where the HQ will be built or relocated to
+ * @param flags type of operation
  * @param p1 unused
  * @param p2 unused
  */
-extern int32 CheckFlatLandBelow(TileIndex tile, uint w, uint h, uint flags, uint invalid_dirs, StationID* station);
 int32 CmdBuildCompanyHQ(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Player *p = GetPlayer(_current_player);
@@ -87,7 +93,7 @@
 	if (CmdFailed(ret)) return ret;
 	cost = ret;
 
-	if (p->location_of_house != 0) { /* Moving HQ */
+	if (p->location_of_house != 0) { // Moving HQ
 		cost += DestroyCompanyHQ(_current_player, flags);
 	}
 
@@ -121,7 +127,7 @@
 			dtus = &_draw_tile_unmovable_data[GetUnmovableType(ti->tile)];
 
 			image = dtus->image;
-			if (_display_opt & DO_TRANS_BUILDINGS) {
+			if (HASBIT(_transparent_opt, TO_STRUCTURES)) {
 				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 				pal = PALETTE_TO_TRANSPARENT;
 			} else {
@@ -139,7 +145,7 @@
 			DrawGroundSprite(SPR_CONCRETE_GROUND, PAL_NONE);
 
 			image = SPR_STATUE_COMPANY;
-			if (_display_opt & DO_TRANS_BUILDINGS) {
+			if (HASBIT(_transparent_opt, TO_STRUCTURES)) {
 				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 				pal = PALETTE_TO_TRANSPARENT;
 			} else {
@@ -175,7 +181,7 @@
 
 			foreach_draw_tile_seq(dtss, t->seq) {
 				image = dtss->image;
-				if (_display_opt & DO_TRANS_BUILDINGS) {
+				if (HASBIT(_transparent_opt, TO_STRUCTURES)) {
 					SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 					pal = PALETTE_TO_TRANSPARENT;
 				} else {
@@ -224,7 +230,7 @@
 		return DoCommand(tile, 0, 0, flags, CMD_SELL_LAND_AREA);
 	}
 
-	// checks if you're allowed to remove unmovable things
+	/* checks if you're allowed to remove unmovable things */
 	if (_game_mode != GM_EDITOR && _current_player != OWNER_WATER && ((flags & DC_AUTO || !_cheats.magic_bulldozer.value)) )
 		return_cmd_error(STR_5800_OBJECT_IN_THE_WAY);
 
@@ -252,14 +258,14 @@
 
 	level = GetCompanyHQSize(tile) + 1;
 
-	// Top town building generates 10, so to make HQ interesting, the top
-	// type makes 20.
+	/* Top town building generates 10, so to make HQ interesting, the top
+	 * type makes 20. */
 	ac[CT_PASSENGERS] = max(1U, level);
 
-	// Top town building generates 4, HQ can make up to 8. The
-	// proportion passengers:mail is different because such a huge
-	// commercial building generates unusually high amount of mail
-	// correspondence per physical visitor.
+	/* Top town building generates 4, HQ can make up to 8. The
+	 * proportion passengers:mail is different because such a huge
+	 * commercial building generates unusually high amount of mail
+	 * correspondence per physical visitor. */
 	ac[CT_MAIL] = max(1U, level / 2);
 }
 
@@ -295,16 +301,16 @@
 	assert(level < 6);
 
 	r = Random();
-	// Top town buildings generate 250, so the top HQ type makes 256.
+	/* Top town buildings generate 250, so the top HQ type makes 256. */
 	if (GB(r, 0, 8) < (256 / 4 / (6 - level))) {
 		uint amt = GB(r, 0, 8) / 8 / 4 + 1;
 		if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
 		MoveGoodsToStation(tile, 2, 2, CT_PASSENGERS, amt);
 	}
 
-	// Top town building generates 90, HQ can make up to 196. The
-	// proportion passengers:mail is about the same as in the acceptance
-	// equations.
+	/* Top town building generates 90, HQ can make up to 196. The
+	 * proportion passengers:mail is about the same as in the acceptance
+	 * equations. */
 	if (GB(r, 8, 8) < (196 / 4 / (6 - level))) {
 		uint amt = GB(r, 8, 8) / 8 / 4 + 1;
 		if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
@@ -313,7 +319,7 @@
 }
 
 
-static uint32 GetTileTrackStatus_Unmovable(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Unmovable(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	return 0;
 }
--- a/src/unmovable_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/unmovable_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,91 +1,157 @@
 /* $Id$ */
 
+/** @file unmovable_map.h */
+
 #ifndef UNMOVABLE_MAP_H
 #define UNMOVABLE_MAP_H
 
 enum {
-	HQ_NUM_TILE = 4,
-	HQ_NUM_SIZE = 5
+	HQ_NUM_TILE = 4, ///< Number of HQ tiles
+	HQ_NUM_SIZE = 5  ///< Number of stages of an HQ
 };
 
+/** Types of unmovable structure */
 enum UnmovableType {
-	UNMOVABLE_TRANSMITTER = 0,
-	UNMOVABLE_LIGHTHOUSE  = 1,
-	UNMOVABLE_STATUE      = 2,
-	UNMOVABLE_OWNED_LAND  = 3,
-	UNMOVABLE_HQ_NORTH    = 0x80,
-	UNMOVABLE_HQ_WEST     = 0x81,
-	UNMOVABLE_HQ_EAST     = 0x82,
-	UNMOVABLE_HQ_SOUTH    = 0x83,
+	UNMOVABLE_TRANSMITTER = 0,    ///< The large antenna
+	UNMOVABLE_LIGHTHOUSE  = 1,    ///< The nice lighthouse
+	UNMOVABLE_STATUE      = 2,    ///< Statue in towns
+	UNMOVABLE_OWNED_LAND  = 3,    ///< Owned land 'flag'
+	UNMOVABLE_HQ_NORTH    = 0x80, ///< Offset for the northern HQ tile
+	UNMOVABLE_HQ_WEST     = 0x81, ///< Offset for the western HQ tile
+	UNMOVABLE_HQ_EAST     = 0x82, ///< Offset for the eastern HQ tile
+	UNMOVABLE_HQ_SOUTH    = 0x83, ///< Offset for the southern HQ tile
 
+	/** End of the HQ (rather end + 1 for IS_INT_INSIDE) */
 	UNMOVABLE_HQ_END      = UNMOVABLE_HQ_NORTH + HQ_NUM_SIZE * HQ_NUM_TILE
 };
 
 
 
+/**
+ * Gets the UnmovableType of the given unmovable tile
+ * @param t the tile to get the type from.
+ * @pre IsTileType(t, MP_UNMOVABLE)
+ * @return the type.
+ */
 static inline UnmovableType GetUnmovableType(TileIndex t)
 {
 	assert(IsTileType(t, MP_UNMOVABLE));
 	return (UnmovableType)_m[t].m5;
 }
 
-
+/**
+ * Does the given tile have a transmitter?
+ * @param t the tile to inspect.
+ * @return true if and only if the tile has a transmitter.
+ */
 static inline bool IsTransmitterTile(TileIndex t)
 {
-	return
-		IsTileType(t, MP_UNMOVABLE) &&
-		GetUnmovableType(t) == UNMOVABLE_TRANSMITTER;
+	return IsTileType(t, MP_UNMOVABLE) && GetUnmovableType(t) == UNMOVABLE_TRANSMITTER;
 }
 
-
+/**
+ * Is this unmovable tile an 'owned land' tile?
+ * @param t the tile to inspect.
+ * @pre IsTileType(t, MP_UNMOVABLE)
+ * @return true if and only if the tile is an 'owned land' tile.
+ */
 static inline bool IsOwnedLand(TileIndex t)
 {
 	assert(IsTileType(t, MP_UNMOVABLE));
 	return GetUnmovableType(t) == UNMOVABLE_OWNED_LAND;
 }
 
+/**
+ * Is the given tile (pre-)owned by someone (the little flags)?
+ * @param t the tile to inspect.
+ * @return true if and only if the tile is an 'owned land' tile.
+ */
 static inline bool IsOwnedLandTile(TileIndex t)
 {
 	return IsTileType(t, MP_UNMOVABLE) && IsOwnedLand(t);
 }
 
+/**
+ * Is this unmovable tile a HQ tile?
+ * @param t the tile to inspect.
+ * @pre IsTileType(t, MP_UNMOVABLE)
+ * @return true if and only if the tile is a HQ tile.
+ */
 static inline bool IsCompanyHQ(TileIndex t)
 {
+	assert(IsTileType(t, MP_UNMOVABLE));
 	return IS_INT_INSIDE(GetUnmovableType(t), UNMOVABLE_HQ_NORTH, UNMOVABLE_HQ_END);
 }
 
+/**
+ * Is this unmovable tile a statue?
+ * @param t the tile to inspect.
+ * @pre IsTileType(t, MP_UNMOVABLE)
+ * @return true if and only if the tile is a statue.
+ */
 static inline bool IsStatue(TileIndex t)
 {
 	assert(IsTileType(t, MP_UNMOVABLE));
 	return GetUnmovableType(t) == UNMOVABLE_STATUE;
 }
 
+/**
+ * Is the given tile a statue?
+ * @param t the tile to inspect.
+ * @return true if and only if the tile is a statue.
+ */
 static inline bool IsStatueTile(TileIndex t)
 {
 	return IsTileType(t, MP_UNMOVABLE) && IsStatue(t);
 }
 
+/**
+ * Get the town of the given statue tile.
+ * @param t the tile of the statue.
+ * @pre IsStatueTile(t)
+ * @return the town the given statue is in.
+ */
 static inline TownID GetStatueTownID(TileIndex t)
 {
-	assert(IsStatue(t));
+	assert(IsStatueTile(t));
 	return _m[t].m2;
 }
 
+/**
+ * Get the 'stage' of the HQ.
+ * @param t a tile of the HQ.
+ * @pre IsTileType(t, MP_UNMOVABLE) && IsCompanyHQ(t)
+ * @return the 'stage' of the HQ.
+ */
 static inline byte GetCompanyHQSize(TileIndex t)
 {
 	assert(IsTileType(t, MP_UNMOVABLE) && IsCompanyHQ(t));
 	return GB(_m[t].m5, 2, 3);
 }
 
+/**
+ * Get the 'section' (including stage) of the HQ.
+ * @param t a tile of the HQ.
+ * @pre IsTileType(t, MP_UNMOVABLE) && IsCompanyHQ(t)
+ * @return the 'section' of the HQ.
+ */
 static inline byte GetCompanyHQSection(TileIndex t)
 {
 	assert(IsTileType(t, MP_UNMOVABLE) && IsCompanyHQ(t));
 	return GB(_m[t].m5, 0, 5);
 }
 
-
+/**
+ * Enlarge the given HQ to the given size. If the new size
+ * is larger than the current size, nothing happens.
+ * @param t the tile of the HQ.
+ * @param size the new size of the HQ.
+ * @pre t is the northern tile of the HQ
+ */
 static inline void EnlargeCompanyHQ(TileIndex t, byte size)
 {
+	assert(GB(GetCompanyHQSection(t), 0, 2) == 0);
+
 	size *= 4;
 	if (size <= _m[t].m5 - UNMOVABLE_HQ_NORTH) return;
 
@@ -96,6 +162,13 @@
 }
 
 
+/**
+ * Make an Unmovable tile.
+ * @note do not use this function directly. Use one of the other Make* functions.
+ * @param t the tile to make unmovable.
+ * @param u the unmovable type of the tile.
+ * @param o the new owner of the tile.
+ */
 static inline void MakeUnmovable(TileIndex t, UnmovableType u, Owner o)
 {
 	SetTileType(t, MP_UNMOVABLE);
@@ -107,27 +180,51 @@
 }
 
 
+/**
+ * Make a transmitter tile.
+ * @param t the tile to make a transmitter.
+ */
 static inline void MakeTransmitter(TileIndex t)
 {
 	MakeUnmovable(t, UNMOVABLE_TRANSMITTER, OWNER_NONE);
 }
 
+/**
+ * Make a lighthouse tile.
+ * @param t the tile to make a transmitter.
+ */
 static inline void MakeLighthouse(TileIndex t)
 {
 	MakeUnmovable(t, UNMOVABLE_LIGHTHOUSE, OWNER_NONE);
 }
 
+/**
+ * Make a statue tile.
+ * @param t the tile to make a statue.
+ * @param o the owner of the statue.
+ * @param town_id the town the statue was built in.
+ */
 static inline void MakeStatue(TileIndex t, Owner o, TownID town_id)
 {
 	MakeUnmovable(t, UNMOVABLE_STATUE, o);
 	_m[t].m2 = town_id;
 }
 
+/**
+ * Make an 'owned land' tile.
+ * @param t the tile to make an 'owned land' tile.
+ * @param o the owner of the land.
+ */
 static inline void MakeOwnedLand(TileIndex t, Owner o)
 {
 	MakeUnmovable(t, UNMOVABLE_OWNED_LAND, o);
 }
 
+/**
+ * Make an HQ with the give tile as it's northern tile.
+ * @param t the tile to make the northern tile of a HQ.
+ * @param o the owner of the HQ.
+ */
 static inline void MakeCompanyHQ(TileIndex t, Owner o)
 {
 	MakeUnmovable(t + TileDiffXY(0, 0), UNMOVABLE_HQ_NORTH, o);
--- a/src/variables.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/variables.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,18 +1,20 @@
 /* $Id$ */
 
+/** @file variables.h */
+
 #ifndef VARIABLES_H
 #define VARIABLES_H
 
 #include "yapf/yapf_settings.h"
 
-// ********* START OF SAVE REGION
+/* ********* START OF SAVE REGION */
 #if !defined(MAX_PATH)
 # define MAX_PATH 260
 #endif
 
 #include "gfx.h"
 
-// Prices and also the fractional part.
+/* Prices and also the fractional part. */
 VARDEF Prices _price;
 VARDEF uint16 _price_frac[NUM_PRICES];
 
@@ -38,47 +40,46 @@
 /* These are the default options for a new game */
 VARDEF GameOptions _opt_newgame;
 
-// Pointer to one of the two _opt OR _opt_newgame structs
+/* Pointer to one of the two _opt OR _opt_newgame structs */
 VARDEF GameOptions *_opt_ptr;
 
-// Amount of game ticks
+/* Amount of game ticks */
 VARDEF uint16 _tick_counter;
 
-// This one is not used anymore.
+/* This one is not used anymore. */
 VARDEF VehicleID _vehicle_id_ctr_day;
 
-// Skip aging of cargo?
+/* Skip aging of cargo? */
 VARDEF byte _age_cargo_skip_counter;
 
-// Position in tile loop
+/* Position in tile loop */
 VARDEF TileIndex _cur_tileloop_tile;
 
-// Also save scrollpos_x, scrollpos_y and zoom
+/* Also save scrollpos_x, scrollpos_y and zoom */
 VARDEF uint16 _disaster_delay;
 
-// Determines what station to operate on in the
-//  tick handler.
+/* Determines what station to operate on in the
+ *  tick handler. */
 VARDEF uint16 _station_tick_ctr;
 
 VARDEF uint32 _random_seeds[2][2];
 
-// Iterator through all towns in OnTick_Town
+/* Iterator through all towns in OnTick_Town */
 VARDEF uint32 _cur_town_ctr;
-// Frequency iterator at the same place
+/* Frequency iterator at the same place */
 VARDEF uint32 _cur_town_iter;
 
 VARDEF uint _cur_player_tick_index;
 VARDEF uint _next_competitor_start;
 
-// Determines how often to run the tree loop
+/* Determines how often to run the tree loop */
 VARDEF byte _trees_tick_ctr;
 
-// Keep track of current game position
+/* Keep track of current game position */
 VARDEF int _saved_scrollpos_x;
 VARDEF int _saved_scrollpos_y;
-VARDEF byte _saved_scrollpos_zoom;
 
-// ********* END OF SAVE REGION
+/* ********* END OF SAVE REGION */
 
 struct Patches {
 	bool modified_catchment;            // different-size catchment areas
@@ -117,6 +118,7 @@
 	byte se_flat_world_height;          // land height a flat world gets in SE
 	bool bribe;                         // enable bribing the local authority
 	bool nonuniform_stations;           // allow nonuniform train stations
+	bool adjacent_stations;             // allow stations to be built directly adjacent to other stations
 	bool always_small_airport;          // always allow small airports
 	bool realistic_acceleration;        // realistic acceleration for trains
 	bool wagon_speed_limits;            // enable wagon speed limits
@@ -125,10 +127,12 @@
 	bool no_servicing_if_no_breakdowns; // dont send vehicles to depot when breakdowns are disabled
 	bool link_terraform_toolbar;        // display terraform toolbar when displaying rail, road, water and airport toolbars
 	bool reverse_scroll;                // Right-Click-Scrolling scrolls in the opposite direction
+	bool smooth_scroll;                 ///< Smooth scroll viewports
 	bool disable_elrails;               // when true, the elrails are disabled
 	bool measure_tooltip;               // Show a permanent tooltip when dragging tools
 	byte liveries;                      // Options for displaying company liveries, 0=none, 1=self, 2=all
 	bool prefer_teamchat;               // Choose the chat message target with <ENTER>, true=all players, false=your team
+	bool advanced_vehicle_list;         // Use the "advanced" vehicle list
 
 	uint8 toolbar_pos;                  // position of toolbars, 0=left, 1=center, 2=right
 	uint8 window_snap_radius;           // Windows snap at each other if closer than this
@@ -201,28 +205,36 @@
 	 */
 	uint32 npf_max_search_nodes;
 
-	uint32 npf_rail_firstred_penalty;      /* The penalty for when the first signal is red (and it is not an exit or combo signal) */
-	uint32 npf_rail_firstred_exit_penalty; /* The penalty for when the first signal is red (and it is an exit or combo signal) */
-	uint32 npf_rail_lastred_penalty;       /* The penalty for when the last signal is red */
-	uint32 npf_rail_station_penalty;       /* The penalty for station tiles */
-	uint32 npf_rail_slope_penalty;         /* The penalty for sloping upwards */
-	uint32 npf_rail_curve_penalty;         /* The penalty for curves */
-	uint32 npf_rail_depot_reverse_penalty; /* The penalty for reversing in depots */
-	uint32 npf_buoy_penalty;               /* The penalty for going over (through) a buoy */
-	uint32 npf_water_curve_penalty;        /* The penalty for curves */
-	uint32 npf_road_curve_penalty;         /* The penalty for curves */
-	uint32 npf_crossing_penalty;           /* The penalty for level crossings */
-	uint32 npf_road_drive_through_penalty; /* The penalty for going through a drive-through road stop */
+	uint32 npf_rail_firstred_penalty;      // The penalty for when the first signal is red (and it is not an exit or combo signal)
+	uint32 npf_rail_firstred_exit_penalty; // The penalty for when the first signal is red (and it is an exit or combo signal)
+	uint32 npf_rail_lastred_penalty;       // The penalty for when the last signal is red
+	uint32 npf_rail_station_penalty;       // The penalty for station tiles
+	uint32 npf_rail_slope_penalty;         // The penalty for sloping upwards
+	uint32 npf_rail_curve_penalty;         // The penalty for curves
+	uint32 npf_rail_depot_reverse_penalty; // The penalty for reversing in depots
+	uint32 npf_buoy_penalty;               // The penalty for going over (through) a buoy
+	uint32 npf_water_curve_penalty;        // The penalty for curves
+	uint32 npf_road_curve_penalty;         // The penalty for curves
+	uint32 npf_crossing_penalty;           // The penalty for level crossings
+	uint32 npf_road_drive_through_penalty; // The penalty for going through a drive-through road stop
 
 	bool population_in_label; // Show the population of a town in his label?
 
-	uint8 freight_trains; ///< Value to multiply the weight of cargo by
+	uint8 freight_trains; // Value to multiply the weight of cargo by
 
 	/** YAPF settings */
 	YapfSettings  yapf;
 
 	uint8 scrollwheel_scrolling;
 	uint8 scrollwheel_multiplier;
+
+	uint8 town_growth_rate;  ///< Town growth rate
+	uint8 larger_towns;      ///< The number of cities to build. These start off larger and grow twice as fast
+	uint8 initial_city_size; ///< Multiplier for the initial size of the cities compared to towns
+
+	bool pause_on_newgame;   ///< Whether to start new games paused or not.
+
+	TownLayoutByte town_layout;  ///< Select town layout
 };
 
 VARDEF Patches _patches;
@@ -234,9 +246,9 @@
 };
 
 
-// WARNING! Do _not_ remove entries in Cheats struct or change the order
-// of the existing ones! Would break downward compatibility.
-// Only add new entries at the end of the struct!
+/* WARNING! Do _not_ remove entries in Cheats struct or change the order
+ * of the existing ones! Would break downward compatibility.
+ * Only add new entries at the end of the struct! */
 
 struct Cheats {
 	Cheat magic_bulldozer;  // dynamite industries, unmovables
@@ -268,7 +280,7 @@
 
 VARDEF Paths _paths;
 
-// NOSAVE: Used in palette animations only, not really important.
+/* NOSAVE: Used in palette animations only, not really important. */
 VARDEF int _timer_counter;
 
 
@@ -280,6 +292,7 @@
 VARDEF int _autosave_ctr;
 
 VARDEF byte _display_opt;
+VARDEF byte _transparent_opt;
 VARDEF int _caret_timer;
 VARDEF uint32 _news_display_opt;
 VARDEF bool _news_ticker_sound;
@@ -291,20 +304,20 @@
 
 VARDEF bool _rightclick_emulate;
 
-// IN/OUT parameters to commands
+/* IN/OUT parameters to commands */
 VARDEF byte _yearly_expenses_type;
 VARDEF TileIndex _terraform_err_tile;
 VARDEF TileIndex _build_tunnel_endtile;
 VARDEF bool _generating_world;
 
-// Deals with the type of the savegame, independent of extension
+/* Deals with the type of the savegame, independent of extension */
 struct SmallFiosItem {
 	int mode;             // savegame/scenario type (old, new)
 	char name[MAX_PATH];  // name
 	char title[255];      // internal name of the game
 };
 
-// Used when switching from the intro menu.
+/* Used when switching from the intro menu. */
 VARDEF byte _switch_mode;
 VARDEF StringID _switch_mode_errorstr;
 VARDEF SmallFiosItem _file_to_saveload;
@@ -372,24 +385,24 @@
 	return _decode_parameters[n];
 }
 
-// Used to bind a C string name to a dparam number.
-// NOTE: This has a short lifetime. You can't
-//       use this string much later or it will be gone.
+/* Used to bind a C string name to a dparam number.
+ * NOTE: This has a short lifetime. You can't
+ *       use this string much later or it will be gone. */
 void SetDParamStr(uint n, const char *str);
 
-// This function takes a C-string and allocates a temporary string ID.
-// The duration of the bound string is valid only until the next acll to GetString,
-// so be careful.
+/** This function takes a C-string and allocates a temporary string ID.
+ * The duration of the bound string is valid only until the next acll to GetString,
+ * so be careful. */
 StringID BindCString(const char *str);
 
 
-#define COPY_IN_DPARAM(offs,src,num) memcpy(_decode_parameters + offs, src, sizeof(uint32) * (num))
-#define COPY_OUT_DPARAM(dst,offs,num) memcpy(dst,_decode_parameters + offs, sizeof(uint32) * (num))
+#define COPY_IN_DPARAM(offs, src, num) memcpy(_decode_parameters + offs, src, sizeof(uint32) * (num))
+#define COPY_OUT_DPARAM(dst, offs, num) memcpy(dst, _decode_parameters + offs, sizeof(uint32) * (num))
 
 
 #define SET_EXPENSES_TYPE(x) _yearly_expenses_type = x;
 
-/* landscape.c */
+/* landscape.cpp */
 extern const byte _tileh_to_sprite[32];
 extern const Slope _inclined_tileh[16];
 
--- a/src/vehicle.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/vehicle.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file vehicle.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "road_map.h"
@@ -9,6 +11,7 @@
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "functions.h"
+#include "landscape.h"
 #include "map.h"
 #include "tile.h"
 #include "vehicle.h"
@@ -37,6 +40,8 @@
 #include "newgrf_engine.h"
 #include "newgrf_sound.h"
 #include "helpers.hpp"
+#include "group.h"
+#include "economy.h"
 
 #define INVALID_COORD (-0x8000)
 #define GEN_HASH(x, y) ((GB((y), 6, 6) << 6) + GB((x), 7, 6))
@@ -86,7 +91,7 @@
 	 * TODO - This is just a temporary stage, this will be removed. */
 	for (v = GetVehicle(start_item); v != NULL; v = (v->index + 1U < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) {
 		v->index = start_item++;
-		v->type  = VEH_INVALID;
+		v = new (v) InvalidVehicle();
 	}
 }
 
@@ -104,10 +109,10 @@
 bool VehicleNeedsService(const Vehicle *v)
 {
 	if (v->vehstatus & VS_CRASHED)
-		return false; /* Crashed vehicles don't need service anymore */
+		return false; // Crashed vehicles don't need service anymore
 
 	if (_patches.no_servicing_if_no_breakdowns && _opt.diff.vehicle_breakdowns == 0) {
-		return EngineHasReplacementForPlayer(GetPlayer(v->owner), v->engine_type);  /* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off */
+		return EngineHasReplacementForPlayer(GetPlayer(v->owner), v->engine_type, v->group_id);  /* Vehicles set for autoreplacing needs to go to a depot even if breakdowns are turned off */
 	}
 
 	return _patches.servint_ispercent ?
@@ -185,9 +190,9 @@
 	}
 	FOR_ALL_VEHICLES(veh) {
 		if (without_crashed && (veh->vehstatus & VS_CRASHED) != 0) continue;
-		if ((veh->type == VEH_TRAIN || veh->type == VEH_ROAD) && (z==0xFF || veh->z_pos == z)) {
-			if ((veh->x_pos>>4) >= x1 && (veh->x_pos>>4) <= x2 &&
-					(veh->y_pos>>4) >= y1 && (veh->y_pos>>4) <= y2) {
+		if ((veh->type == VEH_TRAIN || veh->type == VEH_ROAD) && (z == 0xFF || veh->z_pos == z)) {
+			if ((veh->x_pos >> 4) >= x1 && (veh->x_pos >> 4) <= x2 &&
+					(veh->y_pos >> 4) >= y1 && (veh->y_pos >> 4) <= y2) {
 				return veh;
 			}
 		}
@@ -215,12 +220,14 @@
 	v->bottom_coord = pt.y + spr->height + 2;
 }
 
-// Called after load to update coordinates
+/** Called after load to update coordinates */
 void AfterLoadVehicles()
 {
 	Vehicle *v;
 
 	FOR_ALL_VEHICLES(v) {
+		v->UpdateDeltaXY(v->direction);
+
 		v->first = NULL;
 		if (v->type == VEH_TRAIN) v->u.rail.first_engine = INVALID_ENGINE;
 	}
@@ -232,8 +239,13 @@
 
 	FOR_ALL_VEHICLES(v) {
 		switch (v->type) {
+			case VEH_ROAD:
+				v->cur_image = GetRoadVehImage(v, v->direction);
+				v->u.road.roadtype = HASBIT(EngInfo(v->engine_type)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD;
+				v->u.road.compatible_roadtypes = RoadTypeToRoadTypes(v->u.road.roadtype);
+				break;
+
 			case VEH_TRAIN: v->cur_image = GetTrainImage(v, v->direction); break;
-			case VEH_ROAD: v->cur_image = GetRoadVehImage(v, v->direction); break;
 			case VEH_SHIP: v->cur_image = GetShipImage(v, v->direction); break;
 			case VEH_AIRCRAFT:
 				if (IsNormalAircraft(v)) {
@@ -248,6 +260,8 @@
 						Vehicle *rotor = shadow->next;
 						rotor->cur_image = GetRotorImage(v);
 					}
+
+					UpdateAircraftCache(v);
 				}
 				break;
 			default: break;
@@ -266,7 +280,7 @@
 
 	assert(v->orders == NULL);
 
-	v->type = VEH_INVALID;
+	v = new (v) InvalidVehicle();
 	v->left_coord = INVALID_COORD;
 	v->first = NULL;
 	v->next = NULL;
@@ -276,6 +290,8 @@
 	v->prev_shared = NULL;
 	v->depot_list  = NULL;
 	v->random_bits = 0;
+	v->group_id = DEFAULT_GROUP;
+
 	return v;
 }
 
@@ -311,7 +327,7 @@
 	return NULL;
 }
 
-/*
+/**
  * finds a free vehicle in the memory or allocates a new one
  * returns a pointer to the first free vehicle or NULL if all vehicles are in use
  * *skip_vehicles is an offset to where in the array we should begin looking
@@ -327,7 +343,7 @@
 	const int offset = (1 << Vehicle_POOL_BLOCK_SIZE_BITS) * BLOCKS_FOR_SPECIAL_VEHICLES;
 
 	/* We don't use FOR_ALL here, because FOR_ALL skips invalid items.
-	 * TODO - This is just a temporary stage, this will be removed. */
+	 * @todo - This is just a temporary stage, this will be removed. */
 	if (*skip_vehicles < (_Vehicle_pool.total_items - offset)) { // make sure the offset in the array is not larger than the array itself
 		for (v = GetVehicle(offset + *skip_vehicles); v != NULL; v = (v->index + 1U < GetVehiclePoolSize()) ? GetVehicle(v->index + 1) : NULL) {
 			(*skip_vehicles)++;
@@ -381,7 +397,7 @@
 {
 	Point pt = RemapCoords(TileX(tile) * TILE_SIZE, TileY(tile) * TILE_SIZE, 0);
 
-	// The hash area to scan
+	/* The hash area to scan */
 	const int xl = GB(pt.x - 174, 7, 6);
 	const int xu = GB(pt.x + 104, 7, 6);
 	const int yl = GB(pt.y - 294, 6, 6) << 6;
@@ -416,7 +432,7 @@
 	int old_x = v->left_coord;
 	int old_y = v->top_coord;
 
-	new_hash = (x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(x,y)];
+	new_hash = (x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(x, y)];
 	old_hash = (old_x == INVALID_COORD) ? NULL : &_vehicle_position_hash[GEN_HASH(old_x, old_y)];
 
 	if (old_hash == new_hash) return;
@@ -498,7 +514,7 @@
 
 	u = GetFirstVehicleInChain(v);
 
-	// Check to see if this is the first
+	/* Check to see if this is the first */
 	if (v == u) return NULL;
 
 	for (; u->next != v; u = u->next) assert(u->next != NULL);
@@ -565,9 +581,16 @@
 
 void DestroyVehicle(Vehicle *v)
 {
+	if (IsValidStationID(v->last_station_visited)) {
+		GetStation(v->last_station_visited)->loading_vehicles.remove(v);
+	}
+
 	if (IsEngineCountable(v)) {
 		GetPlayer(v->owner)->num_engines[v->engine_type]--;
 		if (v->owner == _local_player) InvalidateAutoreplaceWindow(v->engine_type);
+
+		if (IsValidGroupID(v->group_id)) GetGroup(v->group_id)->num_engines[v->engine_type]--;
+		if (v->IsPrimaryVehicle()) DecreaseGroupNumVehicle(v->group_id);
 	}
 
 	DeleteVehicleNews(v->index, INVALID_STRING_ID);
@@ -586,14 +609,23 @@
 	/* Now remove any artic part. This will trigger an other
 	 *  destroy vehicle, which on his turn can remove any
 	 *  other artic parts. */
-	if (EngineHasArticPart(v)) DeleteVehicle(v->next);
+	if (v->type == VEH_TRAIN && EngineHasArticPart(v)) DeleteVehicle(v->next);
 }
 
+/**
+ * Deletes all vehicles in a chain.
+ * @param v The first vehicle in the chain.
+ *
+ * @warning This function is not valid for any vehicle containing articulated
+ * parts.
+ */
 void DeleteVehicleChain(Vehicle *v)
 {
+	assert(v->type != VEH_TRAIN);
+
 	do {
 		Vehicle *u = v;
-		v = GetNextVehicle(v);
+		v = v->next;
 		DeleteVehicle(u);
 	} while (v != NULL);
 }
@@ -606,7 +638,7 @@
 static void EffectVehicle_Tick(Vehicle *v);
 void DisasterVehicle_Tick(Vehicle *v);
 
-// head of the linked list to tell what vehicles that visited a depot in a tick
+/** head of the linked list to tell what vehicles that visited a depot in a tick */
 static Vehicle* _first_veh_in_depot_list;
 
 /** Adds a vehicle to the list of vehicles, that visited a depot this tick
@@ -614,14 +646,14 @@
  */
 void VehicleEnteredDepotThisTick(Vehicle *v)
 {
-	// we need to set v->leave_depot_instantly as we have no control of it's contents at this time
+	/* we need to set v->leave_depot_instantly as we have no control of it's contents at this time */
 	if (HASBIT(v->current_order.flags, OFB_HALT_IN_DEPOT) && !HASBIT(v->current_order.flags, OFB_PART_OF_ORDERS) && v->current_order.type == OT_GOTO_DEPOT) {
-		// we keep the vehicle in the depot since the user ordered it to stay
+		/* we keep the vehicle in the depot since the user ordered it to stay */
 		v->leave_depot_instantly = false;
 	} else {
-		// the vehicle do not plan on stopping in the depot, so we stop it to ensure that it will not reserve the path
-		// out of the depot before we might autoreplace it to a different engine. The new engine would not own the reserved path
-		// we store that we stopped the vehicle, so autoreplace can start it again
+		/* the vehicle do not plan on stopping in the depot, so we stop it to ensure that it will not reserve the path
+		 * out of the depot before we might autoreplace it to a different engine. The new engine would not own the reserved path
+		 * we store that we stopped the vehicle, so autoreplace can start it again */
 		v->vehstatus |= VS_STOPPED;
 		v->leave_depot_instantly = true;
 	}
@@ -647,11 +679,9 @@
 
 void CallVehicleTicks()
 {
-	Vehicle *v;
-
 #ifdef ENABLE_NETWORK
-	// hotfix for desync problem:
-	//  for MP games invalidate the YAPF cache every tick to keep it exactly the same on the server and all clients
+	/* hotfix for desync problem:
+	 *  for MP games invalidate the YAPF cache every tick to keep it exactly the same on the server and all clients */
 	if (_networking) {
 		YapfNotifyTrackLayoutChange(INVALID_TILE, INVALID_TRACK);
 	}
@@ -659,10 +689,16 @@
 
 	_first_veh_in_depot_list = NULL; // now we are sure it's initialized at the start of each tick
 
+	Station *st;
+	FOR_ALL_STATIONS(st) LoadUnloadStation(st);
+
+	Vehicle *v;
 	FOR_ALL_VEHICLES(v) {
 		_vehicle_tick_procs[v->type](v);
 
 		switch (v->type) {
+			default: break;
+
 			case VEH_TRAIN:
 			case VEH_ROAD:
 			case VEH_AIRCRAFT:
@@ -679,7 +715,7 @@
 		}
 	}
 
-	// now we handle all the vehicles that entered a depot this tick
+	/* now we handle all the vehicles that entered a depot this tick */
 	v = _first_veh_in_depot_list;
 	while (v != NULL) {
 		Vehicle *w = v->depot_list;
@@ -689,70 +725,6 @@
 	}
 }
 
-static bool CanFillVehicle_FullLoadAny(Vehicle *v)
-{
-	uint32 full = 0, not_full = 0;
-	bool keep_loading = false;
-	const GoodsEntry *ge = GetStation(v->last_station_visited)->goods;
-
-	//special handling of aircraft
-
-	//if the aircraft carries passengers and is NOT full, then
-	//continue loading, no matter how much mail is in
-	if (v->type == VEH_AIRCRAFT &&
-			IsCargoInClass(v->cargo_type, CC_PASSENGERS) &&
-			v->cargo_cap != v->cargo_count) {
-		return true;
-	}
-
-	// patch should return "true" to continue loading, i.e. when there is no cargo type that is fully loaded.
-	do {
-		//Should never happen, but just in case future additions change this
-		assert(v->cargo_type<32);
-
-		if (v->cargo_cap != 0) {
-			uint32 mask = 1 << v->cargo_type;
-
-			if (v->cargo_cap == v->cargo_count) {
-				full |= mask;
-			} else if (GB(ge[v->cargo_type].waiting_acceptance, 0, 12) > 0 ||
-					(HASBIT(v->vehicle_flags, VF_CARGO_UNLOADING) && (ge[v->cargo_type].waiting_acceptance & 0x8000))) {
-				/* If there is any cargo waiting, or this vehicle is still unloading
-				 * and the station accepts the cargo, don't leave the station. */
-				keep_loading = true;
-			} else {
-				not_full |= mask;
-			}
-		}
-	} while ((v = v->next) != NULL);
-
-	// continue loading if there is a non full cargo type and no cargo type that is full
-	return keep_loading || (not_full && (full & ~not_full) == 0);
-}
-
-bool CanFillVehicle(Vehicle *v)
-{
-	TileIndex tile = v->tile;
-
-	if (IsTileType(tile, MP_STATION) ||
-			(v->type == VEH_SHIP && (
-				IsTileType(TILE_ADDXY(tile,  1,  0), MP_STATION) ||
-				IsTileType(TILE_ADDXY(tile, -1,  0), MP_STATION) ||
-				IsTileType(TILE_ADDXY(tile,  0,  1), MP_STATION) ||
-				IsTileType(TILE_ADDXY(tile,  0, -1), MP_STATION) ||
-				IsTileType(TILE_ADDXY(tile, -2,  0), MP_STATION)
-			))) {
-
-		// If patch is active, use alternative CanFillVehicle-function
-		if (_patches.full_load_any && v->current_order.flags & OF_FULL_LOAD) return CanFillVehicle_FullLoadAny(v);
-
-		do {
-			if (v->cargo_count != v->cargo_cap) return true;
-		} while ((v = v->next) != NULL);
-	}
-	return false;
-}
-
 /** Check if a given engine type can be refitted to a given cargo
  * @param engine_type Engine type to check
  * @param cid_to check refit to this cargo-type
@@ -764,7 +736,7 @@
 }
 
 /** Find the first cargo type that an engine can be refitted to.
- * @param engine Which engine to find cargo for.
+ * @param engine_type Which engine to find cargo for.
  * @return A climate dependent cargo type. CT_INVALID is returned if not refittable.
  */
 CargoID FindFirstRefittableCargo(EngineID engine_type)
@@ -781,7 +753,7 @@
 }
 
 /** Learn the price of refitting a certain engine
-* @param engine Which engine to refit
+* @param engine_type Which engine to refit
 * @return Price for refitting
 */
 int32 GetRefitCost(EngineID engine_type)
@@ -821,13 +793,13 @@
 
 void ViewportAddVehicles(DrawPixelInfo *dpi)
 {
-	// The bounding rectangle
+	/* The bounding rectangle */
 	const int l = dpi->left;
 	const int r = dpi->left + dpi->width;
 	const int t = dpi->top;
 	const int b = dpi->top + dpi->height;
 
-	// The hash area to scan
+	/* The hash area to scan */
 	const int xl = GB(l - 70, 7, 6);
 	const int xu = GB(r,      7, 6);
 	const int yl = GB(t - 70, 6, 6) << 6;
@@ -1429,14 +1401,13 @@
 
 	v = ForceAllocateSpecialVehicle();
 	if (v != NULL) {
-		v->type = VEH_SPECIAL;
+		v = new (v) SpecialVehicle();
 		v->subtype = type;
 		v->x_pos = x;
 		v->y_pos = y;
 		v->z_pos = z;
-		v->z_height = v->sprite_width = v->sprite_height = 1;
-		v->x_offs = v->y_offs = 0;
 		v->tile = 0;
+		v->UpdateDeltaXY(INVALID_DIR);
 		v->vehstatus = VS_UNCLICKABLE;
 
 		_effect_init_procs[type](v);
@@ -1474,8 +1445,8 @@
 			 (uint)(y -= vp->top) >= (uint)vp->height)
 				return NULL;
 
-	x = (x << vp->zoom) + vp->virtual_left;
-	y = (y << vp->zoom) + vp->virtual_top;
+	x = ScaleByZoom(x, vp->zoom) + vp->virtual_left;
+	y = ScaleByZoom(y, vp->zoom) + vp->virtual_top;
 
 	FOR_ALL_VEHICLES(v) {
 		if ((v->vehstatus & (VS_HIDDEN|VS_UNCLICKABLE)) == 0 &&
@@ -1567,7 +1538,7 @@
 {
 	if (v->owner != _local_player) return;
 
-	// Do not show getting-old message if autorenew is active
+	/* Do not show getting-old message if autorenew is active */
 	if (GetPlayer(v->owner)->engine_renew) return;
 
 	SetDParam(0, _vehicle_type_names[v->type]);
@@ -1599,6 +1570,7 @@
 
 /** Starts or stops a lot of vehicles
  * @param tile Tile of the depot where the vehicles are started/stopped (only used for depots)
+ * @param flags type of operation
  * @param p1 Station/Order/Depot ID (only used for vehicle list windows)
  * @param p2 bitmask
  *   - bit 0-4 Vehicle type
@@ -1614,7 +1586,7 @@
 	int32 return_value = CMD_ERROR;
 	uint i;
 	uint stop_command;
-	byte vehicle_type = GB(p2, 0, 5);
+	VehicleType vehicle_type = (VehicleType)GB(p2, 0, 5);
 	bool start_stop = HASBIT(p2, 5);
 	bool vehicle_list_window = HASBIT(p2, 6);
 
@@ -1665,10 +1637,11 @@
 }
 
 /** Sells all vehicles in a depot
-* @param tile Tile of the depot where the depot is
-* @param p1 Vehicle type
-* @param p2 unused
-*/
+ * @param tile Tile of the depot where the depot is
+ * @param flags type of operation
+ * @param p1 Vehicle type
+ * @param p2 unused
+ */
 int32 CmdDepotSellAllVehicles(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle **engines = NULL;
@@ -1680,7 +1653,7 @@
 
 	int32 cost = 0;
 	uint i, sell_command, total_number_vehicles;
-	byte vehicle_type = GB(p1, 0, 8);
+	VehicleType vehicle_type = (VehicleType)GB(p1, 0, 8);
 
 	switch (vehicle_type) {
 		case VEH_TRAIN:    sell_command = CMD_SELL_RAIL_WAGON; break;
@@ -1717,10 +1690,11 @@
 }
 
 /** Autoreplace all vehicles in the depot
-* @param tile Tile of the depot where the vehicles are
-* @param p1 Type of vehicle
-* @param p2 Unused
-*/
+ * @param tile Tile of the depot where the vehicles are
+ * @param flags type of operation
+ * @param p1 Type of vehicle
+ * @param p2 Unused
+ */
 int32 CmdDepotMassAutoReplace(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
 	Vehicle **vl = NULL;
@@ -1728,8 +1702,7 @@
 	uint16 engine_count = 0;
 	uint i, x = 0, y = 0, z = 0;
 	int32 cost = 0;
-	byte vehicle_type = GB(p1, 0, 8);
-
+	VehicleType vehicle_type = (VehicleType)GB(p1, 0, 8);
 
 	if (!IsTileOwner(tile, _current_player)) return CMD_ERROR;
 
@@ -1784,6 +1757,7 @@
 
 /** Clone a vehicle. If it is a train, it will clone all the cars too
  * @param tile tile of the depot where the cloned vehicle is build
+ * @param flags type of operation
  * @param p1 the original vehicle's index
  * @param p2 1 = shared orders, else copied orders
  */
@@ -1791,7 +1765,7 @@
 {
 	Vehicle *v_front, *v;
 	Vehicle *w_front, *w, *w_rear;
-	int cost, total_cost = 0;
+	int32 cost, total_cost = 0;
 	uint32 build_argument = 2;
 
 	if (!IsValidVehicleID(p1)) return CMD_ERROR;
@@ -1814,7 +1788,7 @@
 
 	if (v->type == VEH_TRAIN && (!IsFrontEngine(v) || v->u.rail.crash_anim_pos >= 4400)) return CMD_ERROR;
 
-	// check that we can allocate enough vehicles
+	/* check that we can allocate enough vehicles */
 	if (!(flags & DC_EXEC)) {
 		int veh_counter = 0;
 		do {
@@ -1829,8 +1803,7 @@
 	v = v_front;
 
 	do {
-
-		if (IsMultiheaded(v) && !IsTrainEngine(v)) {
+		if (v->type == VEH_TRAIN && IsMultiheaded(v) && !IsTrainEngine(v)) {
 			/* we build the rear ends of multiheaded trains with the front ones */
 			continue;
 		}
@@ -1845,28 +1818,16 @@
 		if (flags & DC_EXEC) {
 			w = GetVehicle(_new_vehicle_id);
 
-			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);
 			}
 
 			if (v->type == VEH_TRAIN && !IsFrontEngine(v)) {
-				// this s a train car
-				// add this unit to the end of the train
+				/* this s a train car
+				 * add this unit to the end of the train */
 				DoCommand(0, (w_rear->index << 16) | w->index, 1, flags, CMD_MOVE_RAIL_VEHICLE);
 			} else {
-				// this is a front engine or not a train. It need orders
+				/* this is a front engine or not a train. It need orders */
 				w_front = w;
 				w->service_interval = v->service_interval;
 				DoCommand(0, (v->index << 16) | w->index, p2 & 1 ? CO_SHARE : CO_COPY, flags, CMD_CLONE_ORDER);
@@ -1876,10 +1837,63 @@
 	} while (v->type == VEH_TRAIN && (v = GetNextVehicle(v)) != NULL);
 
 	if (flags & DC_EXEC && v_front->type == VEH_TRAIN) {
-		// for trains this needs to be the front engine due to the callback function
+		/* for trains this needs to be the front engine due to the callback function */
 		_new_vehicle_id = w_front->index;
 	}
 
+	if (flags & DC_EXEC) {
+		/* Cloned vehicles belong to the same group */
+		DoCommand(0, v_front->group_id, w_front->index, flags, CMD_ADD_VEHICLE_GROUP);
+	}
+
+
+	/* Take care of refitting. */
+	w = w_front;
+	v = v_front;
+
+	/* Both building and refitting are influenced by newgrf callbacks, which
+	 * makes it impossible to accurately estimate the cloning costs. In
+	 * particular, it is possible for engines of the same type to be built with
+	 * different numbers of articulated parts, so when refitting we have to
+	 * loop over real vehicles first, and then the articulated parts of those
+	 * vehicles in a different loop. */
+	do {
+		do {
+			if (flags & DC_EXEC) {
+				assert(w != NULL);
+
+				if (w->cargo_type != v->cargo_type || w->cargo_subtype != v->cargo_type) {
+					cost = DoCommand(0, w->index, v->cargo_type | (v->cargo_subtype << 8) | 1U << 16 , flags, GetCmdRefitVeh(v));
+					if (!CmdFailed(cost)) total_cost += cost;
+				}
+
+				if (w->type == VEH_TRAIN && EngineHasArticPart(w)) {
+					w = GetNextArticPart(w);
+				} else {
+					break;
+				}
+			} else {
+				CargoID initial_cargo = GetEngineCargoType(v->engine_type);
+
+				if (v->cargo_type != initial_cargo && initial_cargo != CT_INVALID) {
+					total_cost += GetRefitCost(v->engine_type);
+				}
+			}
+		} while (v->type == VEH_TRAIN && EngineHasArticPart(v) && (v = GetNextArticPart(v)) != NULL);
+
+		if ((flags & DC_EXEC) && v->type == VEH_TRAIN) w = GetNextVehicle(w);
+	} while (v->type == VEH_TRAIN && (v = GetNextVehicle(v)) != NULL);
+
+	/* Since we can't estimate the cost of cloning a vehicle accurately we must
+	 * check whether the player has enough money manually. */
+	if (!CheckPlayerHasMoney(total_cost)) {
+		if (flags & DC_EXEC) {
+			/* The vehicle has already been bought, so now it must be sold again. */
+			DoCommand(w_front->tile, w_front->index, 1, flags, GetCmdSellVeh(w_front));
+		}
+		return CMD_ERROR;
+	}
+
 	/* Set the expense type last as refitting will make the cost go towards
 	 * running costs... */
 	SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
@@ -1897,7 +1911,7 @@
 /** Generates a list of vehicles inside a depot
  * Will enlarge allocated space for the list if they are too small, so it's ok to call with (pointer to NULL array, pointer to uninitised uint16, pointer to 0)
  * If one of the lists is not needed (say wagons when finding ships), all the pointers regarding that list should be set to NULL
- * @param Type type of vehicle
+ * @param type Type of vehicle
  * @param tile The tile the depot is located in
  * @param ***engine_list Pointer to a pointer to an array of vehicles in the depot (old list is freed and a new one is malloced)
  * @param *engine_list_length Allocated size of engine_list. Needs to be set to 0 when engine_list points to a NULL array
@@ -1906,7 +1920,7 @@
  * @param *wagon_list_length Allocated size of wagon_list. Needs to be set to 0 when wagon_list points to a NULL array
  * @param *wagon_count The number of engines stored in the list
  */
-void BuildDepotVehicleList(byte type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count)
+void BuildDepotVehicleList(VehicleType type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count)
 {
 	Vehicle *v;
 
@@ -1979,26 +1993,26 @@
 * @param length_of_array informs the length allocated for sort_list. This is not the same as the number of vehicles in the list. Needs to be 0 when sort_list is NULL
 * @param type type of vehicle
 * @param owner PlayerID of owner to generate a list for
-* @param index This parameter got different meanings depending on window_type
-			VLW_STATION_LIST:  index of station to generate a list for
-			VLW_SHARED_ORDERS: index of order to generate a list for
-			VLW_STANDARD: not used
-			VLW_DEPOT_LIST: TileIndex of the depot/hangar to make the list for
+* @param index This parameter has different meanings depending on window_type
+    <ul>
+      <li>VLW_STATION_LIST:  index of station to generate a list for</li>
+      <li>VLW_SHARED_ORDERS: index of order to generate a list for<li>
+      <li>VLW_STANDARD: not used<li>
+      <li>VLW_DEPOT_LIST: TileIndex of the depot/hangar to make the list for</li>
+      <li>VLW_GROUP_LIST: index of group to generate a list for</li>
+    </ul>
 * @param window_type tells what kind of window the list is for. Use the VLW flags in vehicle_gui.h
 * @return the number of vehicles added to the list
 */
-uint GenerateVehicleSortList(const Vehicle ***sort_list, uint16 *length_of_array, byte type, PlayerID owner, uint32 index, uint16 window_type)
+uint GenerateVehicleSortList(const Vehicle ***sort_list, uint16 *length_of_array, VehicleType type, PlayerID owner, uint32 index, uint16 window_type)
 {
-	const byte subtype = (type != VEH_AIRCRAFT) ? (byte)Train_Front : (byte)AIR_AIRCRAFT;
 	uint n = 0;
 	const Vehicle *v;
 
 	switch (window_type) {
 		case VLW_STATION_LIST: {
 			FOR_ALL_VEHICLES(v) {
-				if (v->type == type && (
-					(type == VEH_TRAIN && IsFrontEngine(v)) ||
-					(type != VEH_TRAIN && v->subtype <= subtype))) {
+				if (v->type == type && v->IsPrimaryVehicle()) {
 					const Order *order;
 
 					FOR_VEHICLE_ORDERS(v, order) {
@@ -2031,9 +2045,7 @@
 
 		case VLW_STANDARD: {
 			FOR_ALL_VEHICLES(v) {
-				if (v->type == type && v->owner == owner && (
-					(type == VEH_TRAIN && IsFrontEngine(v)) ||
-					(type != VEH_TRAIN && v->subtype <= subtype))) {
+				if (v->type == type && v->owner == owner && v->IsPrimaryVehicle()) {
 					/* TODO find a better estimate on the total number of vehicles for current player */
 					if (n == *length_of_array) ExtendVehicleListSize(sort_list, length_of_array, GetNumVehicles()/4);
 					(*sort_list)[n++] = v;
@@ -2044,9 +2056,7 @@
 
 		case VLW_DEPOT_LIST: {
 			FOR_ALL_VEHICLES(v) {
-				if (v->type == type && (
-					(type == VEH_TRAIN && IsFrontEngine(v)) ||
-					(type != VEH_TRAIN && v->subtype <= subtype))) {
+				if (v->type == type && v->IsPrimaryVehicle()) {
 					const Order *order;
 
 					FOR_VEHICLE_ORDERS(v, order) {
@@ -2061,6 +2071,17 @@
 			break;
 		}
 
+ 		case VLW_GROUP_LIST:
+			FOR_ALL_VEHICLES(v) {
+				if (v->type == type && v->IsPrimaryVehicle() &&
+						v->owner == owner && v->group_id == index) {
+					if (n == *length_of_array) ExtendVehicleListSize(sort_list, length_of_array, GetNumVehicles() / 4);
+
+					(*sort_list)[n++] = v;
+				}
+			}
+			break;
+
 		default: NOT_REACHED(); break;
 	}
 
@@ -2081,10 +2102,10 @@
  * @param flags the flags used for DoCommand()
  * @param service should the vehicles only get service in the depots
  * @param owner PlayerID of owner of the vehicles to send
- * @param VLW_flag tells what kind of list requested the goto depot
+ * @param vlw_flag tells what kind of list requested the goto depot
  * @return 0 for success and CMD_ERROR if no vehicle is able to go to depot
  */
-int32 SendAllVehiclesToDepot(byte type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id)
+int32 SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id)
 {
 	const Vehicle **sort_list = NULL;
 	uint n, i;
@@ -2195,7 +2216,6 @@
 
 		if (HASBIT(t.flags, OFB_PART_OF_ORDERS)) {
 			/* Part of orders */
-			if (v->type == VEH_TRAIN) v->u.rail.days_since_order_progr = 0;
 			v->cur_order_index++;
 		} else if (HASBIT(t.flags, OFB_HALT_IN_DEPOT)) {
 			/* Force depot visit */
@@ -2212,7 +2232,7 @@
 				}
 
 				SetDParam(0, v->unitnumber);
-				AddNewsItem(string, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0),	v->index, 0);
+				AddNewsItem(string, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
 			}
 		}
 	}
@@ -2220,6 +2240,7 @@
 
 /** Give a custom name to your vehicle
  * @param tile unused
+ * @param flags type of operation
  * @param p1 vehicle ID to name
  * @param p2 unused
  */
@@ -2253,6 +2274,7 @@
 
 /** Change the service interval of a vehicle
  * @param tile unused
+ * @param flags type of operation
  * @param p1 vehicle ID that is being service-interval-changed
  * @param p2 new service interval
  */
@@ -2349,27 +2371,27 @@
 
 	switch (v->type) {
 		case VEH_TRAIN:
-			if (v->u.rail.track == TRACK_BIT_DEPOT) /* We'll assume the train is facing outwards */
-				return DiagdirToDiagTrackdir(GetRailDepotDirection(v->tile)); /* Train in depot */
-
-			if (v->u.rail.track == TRACK_BIT_WORMHOLE) /* train in tunnel, so just use his direction and assume a diagonal track */
+			if (v->u.rail.track == TRACK_BIT_DEPOT) // We'll assume the train is facing outwards
+				return DiagdirToDiagTrackdir(GetRailDepotDirection(v->tile)); // Train in depot
+
+			if (v->u.rail.track == TRACK_BIT_WORMHOLE) // train in tunnel, so just use his direction and assume a diagonal track
 				return DiagdirToDiagTrackdir(DirToDiagDir(v->direction));
 
 			return TrackDirectionToTrackdir(FindFirstTrack(v->u.rail.track), v->direction);
 
 		case VEH_SHIP:
 			if (IsShipInDepot(v))
-				/* We'll assume the ship is facing outwards */
+				// We'll assume the ship is facing outwards
 				return DiagdirToDiagTrackdir(GetShipDepotDirection(v->tile));
 
 			return TrackDirectionToTrackdir(FindFirstTrack(v->u.ship.state), v->direction);
 
 		case VEH_ROAD:
-			if (IsRoadVehInDepot(v)) /* We'll assume the road vehicle is facing outwards */
+			if (IsRoadVehInDepot(v)) // We'll assume the road vehicle is facing outwards
 				return DiagdirToDiagTrackdir(GetRoadDepotDirection(v->tile));
 
-			if (IsStandardRoadStopTile(v->tile)) /* We'll assume the road vehicle is facing outwards */
-				return DiagdirToDiagTrackdir(GetRoadStopDir(v->tile)); /* Road vehicle in a station */
+			if (IsStandardRoadStopTile(v->tile)) // We'll assume the road vehicle is facing outwards
+				return DiagdirToDiagTrackdir(GetRoadStopDir(v->tile)); // Road vehicle in a station
 
 			if (IsDriveThroughStopTile(v->tile)) return DiagdirToDiagTrackdir(DirToDiagDir(v->direction));
 
@@ -2393,7 +2415,7 @@
 	return _tile_type_procs[GetTileType(tile)]->vehicle_enter_tile_proc(v, tile, x, y);
 }
 
-UnitID GetFreeUnitNumber(byte type)
+UnitID GetFreeUnitNumber(VehicleType type)
 {
 	UnitID unit, max = 0;
 	const Vehicle *u;
@@ -2422,16 +2444,16 @@
 		cache = MallocT<bool>(max + 1);
 	}
 
-	// Clear the cache
+	/* Clear the cache */
 	memset(cache, 0, (max + 1) * sizeof(*cache));
 
-	// Fill the cache
+	/* Fill the cache */
 	FOR_ALL_VEHICLES(u) {
 		if (u->type == type && u->owner == _current_player && u->unitnumber != 0 && u->unitnumber <= max)
 			cache[u->unitnumber] = true;
 	}
 
-	// Find the first unused unit number
+	/* Find the first unused unit number */
 	for (unit = 1; unit <= max; unit++) {
 		if (!cache[unit]) break;
 	}
@@ -2439,31 +2461,19 @@
 	return unit;
 }
 
-static SpriteID GetEngineColourMap(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v)
+
+const Livery *GetEngineLivery(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v)
 {
-	SpriteID map = PAL_NONE;
 	const Player *p = GetPlayer(player);
 	LiveryScheme scheme = LS_DEFAULT;
 	CargoID cargo_type = v == NULL ? (CargoID)CT_INVALID : v->cargo_type;
 
-	/* Check if we should use the colour map callback */
-	if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_COLOUR_REMAP)) {
-		uint16 callback = GetVehicleCallback(CBID_VEHICLE_COLOUR_MAPPING, 0, 0, engine_type, v);
-		/* A return value of 0xC000 is stated to "use the default two-color
-		 * maps" which happens to be the failure action too... */
-		if (callback != CALLBACK_FAILED && callback != 0xC000) {
-			map = GB(callback, 0, 14);
-			/* If bit 14 is set, then the company colours are applied to the
-			 * map else it's returned as-is. */
-			if (!HASBIT(callback, 14)) return map;
-		}
-	}
-
 	/* The default livery is always available for use, but its in_use flag determines
 	 * whether any _other_ liveries are in use. */
 	if (p->livery[LS_DEFAULT].in_use && (_patches.liveries == 2 || (_patches.liveries == 1 && player == _local_player))) {
 		/* Determine the livery scheme to use */
 		switch (GetEngine(engine_type)->type) {
+			default: NOT_REACHED();
 			case VEH_TRAIN: {
 				const RailVehicleInfo *rvi = RailVehInfo(engine_type);
 
@@ -2474,14 +2484,15 @@
 					{
 						if (cargo_type == CT_INVALID) cargo_type = rvi->cargo_type;
 						if (rvi->railveh_type == RAILVEH_WAGON) {
-							if (cargo_type == CT_PASSENGERS || cargo_type == CT_MAIL || cargo_type == CT_VALUABLES) {
+							if (!GetCargo(cargo_type)->is_freight) {
 								if (parent_engine_type == INVALID_ENGINE) {
 									scheme = LS_PASSENGER_WAGON_STEAM;
 								} else {
 									switch (RailVehInfo(parent_engine_type)->engclass) {
-										case 0: scheme = LS_PASSENGER_WAGON_STEAM; break;
-										case 1: scheme = LS_PASSENGER_WAGON_DIESEL; break;
-										case 2: scheme = LS_PASSENGER_WAGON_ELECTRIC; break;
+										default: NOT_REACHED();
+										case EC_STEAM:    scheme = LS_PASSENGER_WAGON_STEAM;    break;
+										case EC_DIESEL:   scheme = LS_PASSENGER_WAGON_DIESEL;   break;
+										case EC_ELECTRIC: scheme = LS_PASSENGER_WAGON_ELECTRIC; break;
 									}
 								}
 							} else {
@@ -2491,9 +2502,10 @@
 							bool is_mu = HASBIT(_engine_info[engine_type].misc_flags, EF_RAIL_IS_MU);
 
 							switch (rvi->engclass) {
-								case 0: scheme = LS_STEAM; break;
-								case 1: scheme = is_mu ? LS_DMU : LS_DIESEL; break;
-								case 2: scheme = is_mu ? LS_EMU : LS_ELECTRIC; break;
+								default: NOT_REACHED();
+								case EC_STEAM:    scheme = LS_STEAM; break;
+								case EC_DIESEL:   scheme = is_mu ? LS_DMU : LS_DIESEL;   break;
+								case EC_ELECTRIC: scheme = is_mu ? LS_EMU : LS_ELECTRIC; break;
 							}
 						}
 						break;
@@ -2508,7 +2520,13 @@
 			case VEH_ROAD: {
 				const RoadVehicleInfo *rvi = RoadVehInfo(engine_type);
 				if (cargo_type == CT_INVALID) cargo_type = rvi->cargo_type;
-				scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_BUS : LS_TRUCK;
+				if (HASBIT(EngInfo(engine_type)->misc_flags, EF_ROAD_TRAM)) {
+					/* Tram */
+					scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_PASSENGER_TRAM : LS_FREIGHT_TRAM;
+				} else {
+					/* Bus or truck */
+					scheme = IsCargoInClass(cargo_type, CC_PASSENGERS) ? LS_BUS : LS_TRUCK;
+				}
 				break;
 			}
 
@@ -2535,12 +2553,35 @@
 		if (!p->livery[scheme].in_use) scheme = LS_DEFAULT;
 	}
 
+	return &p->livery[scheme];
+}
+
+
+static SpriteID GetEngineColourMap(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v)
+{
+	SpriteID map = PAL_NONE;
+
+	/* Check if we should use the colour map callback */
+	if (HASBIT(EngInfo(engine_type)->callbackmask, CBM_COLOUR_REMAP)) {
+		uint16 callback = GetVehicleCallback(CBID_VEHICLE_COLOUR_MAPPING, 0, 0, engine_type, v);
+		/* A return value of 0xC000 is stated to "use the default two-color
+		 * maps" which happens to be the failure action too... */
+		if (callback != CALLBACK_FAILED && callback != 0xC000) {
+			map = GB(callback, 0, 14);
+			/* If bit 14 is set, then the company colours are applied to the
+			 * map else it's returned as-is. */
+			if (!HASBIT(callback, 14)) return map;
+		}
+	}
+
 	bool twocc = HASBIT(EngInfo(engine_type)->misc_flags, EF_USES_2CC);
 
 	if (map == PAL_NONE) map = twocc ? (SpriteID)SPR_2CCMAP_BASE : (SpriteID)PALETTE_RECOLOR_START;
 
-	map += p->livery[scheme].colour1;
-	if (twocc) map += p->livery[scheme].colour2 * 16;
+	const Livery *livery = GetEngineLivery(engine_type, player, parent_engine_type, v);
+
+	map += livery->colour1;
+	if (twocc) map += livery->colour2 * 16;
 
 	return map;
 }
@@ -2562,7 +2603,7 @@
 	return GetEngineColourMap(v->engine_type, v->owner, INVALID_ENGINE, v);
 }
 
-// Save and load of vehicles
+/** Save and load of vehicles */
 extern const SaveLoad _common_veh_desc[] = {
 	    SLE_VAR(Vehicle, subtype,              SLE_UINT8),
 
@@ -2583,13 +2624,9 @@
 	    SLE_VAR(Vehicle, z_pos,                SLE_UINT8),
 	    SLE_VAR(Vehicle, direction,            SLE_UINT8),
 
-	    SLE_VAR(Vehicle, cur_image,            SLE_UINT16),
+	SLE_CONDNULL(2,                                                         0, 57),
 	    SLE_VAR(Vehicle, spritenum,            SLE_UINT8),
-	    SLE_VAR(Vehicle, sprite_width,         SLE_UINT8),
-	    SLE_VAR(Vehicle, sprite_height,        SLE_UINT8),
-	    SLE_VAR(Vehicle, z_height,             SLE_UINT8),
-	    SLE_VAR(Vehicle, x_offs,               SLE_INT8),
-	    SLE_VAR(Vehicle, y_offs,               SLE_INT8),
+	SLE_CONDNULL(5,                                                         0, 57),
 	    SLE_VAR(Vehicle, engine_type,          SLE_UINT16),
 
 	    SLE_VAR(Vehicle, max_speed,            SLE_UINT16),
@@ -2620,17 +2657,17 @@
 	/* This next line is for version 4 and prior compatibility.. it temporarily reads
 	    type and flags (which were both 4 bits) into type. Later on this is
 	    converted correctly */
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, type), SLE_UINT8,                 0, 4),
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, dest), SLE_FILE_U8 | SLE_VAR_U16, 0, 4),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, type), SLE_UINT8,                 0, 4),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, dest), SLE_FILE_U8 | SLE_VAR_U16, 0, 4),
 
 	/* Orders for version 5 and on */
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, type),  SLE_UINT8,  5, SL_MAX_VERSION),
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, flags), SLE_UINT8,  5, SL_MAX_VERSION),
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, dest),  SLE_UINT16, 5, SL_MAX_VERSION),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, type),  SLE_UINT8,  5, SL_MAX_VERSION),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, flags), SLE_UINT8,  5, SL_MAX_VERSION),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, dest),  SLE_UINT16, 5, SL_MAX_VERSION),
 
 	/* Refit in current order */
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, refit_cargo),    SLE_UINT8, 36, SL_MAX_VERSION),
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, refit_subtype),  SLE_UINT8, 36, SL_MAX_VERSION),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, refit_cargo),    SLE_UINT8, 36, SL_MAX_VERSION),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, refit_subtype),  SLE_UINT8, 36, SL_MAX_VERSION),
 
 	    SLE_REF(Vehicle, orders,               REF_ORDER),
 
@@ -2667,7 +2704,9 @@
 	    SLE_REF(Vehicle, next_shared,          REF_VEHICLE),
 	    SLE_REF(Vehicle, prev_shared,          REF_VEHICLE),
 
-	// reserve extra space in savegame here. (currently 10 bytes)
+	SLE_CONDVAR(Vehicle, group_id,             SLE_UINT16,                60, SL_MAX_VERSION),
+
+	/* reserve extra space in savegame here. (currently 10 bytes) */
 	SLE_CONDNULL(10,                                                       2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -2677,16 +2716,16 @@
 static const SaveLoad _train_desc[] = {
 	SLE_WRITEBYTE(Vehicle, type, VEH_TRAIN, 0), // Train type. VEH_TRAIN in mem, 0 in file.
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRail, crash_anim_pos),         SLE_UINT16),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRail, force_proceed),          SLE_UINT8),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRail, railtype),               SLE_UINT8),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRail, track),                  SLE_UINT8),
-
-	SLE_CONDVARX(offsetof(Vehicle, u) + offsetof(VehicleRail, flags),                  SLE_UINT8,  2, SL_MAX_VERSION),
-	SLE_CONDVARX(offsetof(Vehicle, u) + offsetof(VehicleRail, days_since_order_progr), SLE_UINT16, 2, SL_MAX_VERSION),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRail, crash_anim_pos),         SLE_UINT16),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRail, force_proceed),          SLE_UINT8),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRail, railtype),               SLE_UINT8),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRail, track),                  SLE_UINT8),
+
+	SLE_CONDVARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRail, flags),                  SLE_UINT8,  2, SL_MAX_VERSION),
+	SLE_CONDNULL(2, 2, 59),
 
 	SLE_CONDNULL(2, 2, 19),
-	// reserve extra space in savegame here. (currently 11 bytes)
+	/* reserve extra space in savegame here. (currently 11 bytes) */
 	SLE_CONDNULL(11, 2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -2695,18 +2734,18 @@
 static const SaveLoad _roadveh_desc[] = {
 	SLE_WRITEBYTE(Vehicle, type, VEH_ROAD, 1), // Road type. VEH_ROAD in mem, 1 in file.
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, state),          SLE_UINT8),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, frame),          SLE_UINT8),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, blocked_ctr),    SLE_UINT16),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, overtaking),     SLE_UINT8),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, overtaking_ctr), SLE_UINT8),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, crashed_ctr),    SLE_UINT16),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, reverse_ctr),    SLE_UINT8),
-
-	SLE_CONDREFX(offsetof(Vehicle, u) + offsetof(VehicleRoad, slot),     REF_ROADSTOPS, 6, SL_MAX_VERSION),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, state),          SLE_UINT8),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, frame),          SLE_UINT8),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, blocked_ctr),    SLE_UINT16),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, overtaking),     SLE_UINT8),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, overtaking_ctr), SLE_UINT8),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, crashed_ctr),    SLE_UINT16),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, reverse_ctr),    SLE_UINT8),
+
+	SLE_CONDREFX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, slot),     REF_ROADSTOPS, 6, SL_MAX_VERSION),
 	SLE_CONDNULL(1,                                                                     6, SL_MAX_VERSION),
-	SLE_CONDVARX(offsetof(Vehicle, u) + offsetof(VehicleRoad, slot_age), SLE_UINT8,     6, SL_MAX_VERSION),
-	// reserve extra space in savegame here. (currently 16 bytes)
+	SLE_CONDVARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleRoad, slot_age), SLE_UINT8,     6, SL_MAX_VERSION),
+	/* reserve extra space in savegame here. (currently 16 bytes) */
 	SLE_CONDNULL(16,                                                                    2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -2715,9 +2754,9 @@
 static const SaveLoad _ship_desc[] = {
 	SLE_WRITEBYTE(Vehicle, type, VEH_SHIP, 2), // Ship type. VEH_SHIP in mem, 2 in file.
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
-	SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleShip, state), SLE_UINT8),
-
-	// reserve extra space in savegame here. (currently 16 bytes)
+	SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleShip, state), SLE_UINT8),
+
+	/* reserve extra space in savegame here. (currently 16 bytes) */
 	SLE_CONDNULL(16, 2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -2726,17 +2765,17 @@
 static const SaveLoad _aircraft_desc[] = {
 	SLE_WRITEBYTE(Vehicle, type, VEH_AIRCRAFT, 3), // Aircraft type. VEH_AIRCRAFT in mem, 3 in file.
 	SLE_INCLUDEX(0, INC_VEHICLE_COMMON),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleAir, crashed_counter), SLE_UINT16),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleAir, pos),             SLE_UINT8),
-
-	SLE_CONDVARX(offsetof(Vehicle, u) + offsetof(VehicleAir, targetairport),   SLE_FILE_U8 | SLE_VAR_U16, 0, 4),
-	SLE_CONDVARX(offsetof(Vehicle, u) + offsetof(VehicleAir, targetairport),   SLE_UINT16,                5, SL_MAX_VERSION),
-
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleAir, state),           SLE_UINT8),
-
-	SLE_CONDVARX(offsetof(Vehicle, u) + offsetof(VehicleAir, previous_pos),    SLE_UINT8,                 2, SL_MAX_VERSION),
-
-	// reserve extra space in savegame here. (currently 15 bytes)
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, crashed_counter), SLE_UINT16),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, pos),             SLE_UINT8),
+
+	SLE_CONDVARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, targetairport),   SLE_FILE_U8 | SLE_VAR_U16, 0, 4),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, targetairport),   SLE_UINT16,                5, SL_MAX_VERSION),
+
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, state),           SLE_UINT8),
+
+	SLE_CONDVARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleAir, previous_pos),    SLE_UINT8,                 2, SL_MAX_VERSION),
+
+	/* reserve extra space in savegame here. (currently 15 bytes) */
 	SLE_CONDNULL(15,                                                                                      2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -2757,18 +2796,14 @@
 	    SLE_VAR(Vehicle, z_pos,         SLE_UINT8),
 
 	    SLE_VAR(Vehicle, cur_image,     SLE_UINT16),
-	    SLE_VAR(Vehicle, sprite_width,  SLE_UINT8),
-	    SLE_VAR(Vehicle, sprite_height, SLE_UINT8),
-	    SLE_VAR(Vehicle, z_height,      SLE_UINT8),
-	    SLE_VAR(Vehicle, x_offs,        SLE_INT8),
-	    SLE_VAR(Vehicle, y_offs,        SLE_INT8),
+	SLE_CONDNULL(5,                                                 0, 57),
 	    SLE_VAR(Vehicle, progress,      SLE_UINT8),
 	    SLE_VAR(Vehicle, vehstatus,     SLE_UINT8),
 
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleSpecial, unk0), SLE_UINT16),
-	    SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleSpecial, unk2), SLE_UINT8),
-
-	// reserve extra space in savegame here. (currently 16 bytes)
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleSpecial, unk0), SLE_UINT16),
+	    SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleSpecial, unk2), SLE_UINT8),
+
+	/* reserve extra space in savegame here. (currently 16 bytes) */
 	SLE_CONDNULL(16, 2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -2792,25 +2827,21 @@
 	    SLE_VAR(Vehicle, z_pos,         SLE_UINT8),
 	    SLE_VAR(Vehicle, direction,     SLE_UINT8),
 
-	    SLE_VAR(Vehicle, x_offs,        SLE_INT8),
-	    SLE_VAR(Vehicle, y_offs,        SLE_INT8),
-	    SLE_VAR(Vehicle, sprite_width,  SLE_UINT8),
-	    SLE_VAR(Vehicle, sprite_height, SLE_UINT8),
-	    SLE_VAR(Vehicle, z_height,      SLE_UINT8),
+	SLE_CONDNULL(5,                                                  0, 57),
 	    SLE_VAR(Vehicle, owner,         SLE_UINT8),
 	    SLE_VAR(Vehicle, vehstatus,     SLE_UINT8),
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, dest), SLE_FILE_U8 | SLE_VAR_U16, 0, 4),
-	SLE_CONDVARX(offsetof(Vehicle, current_order) + offsetof(Order, dest), SLE_UINT16,                5, SL_MAX_VERSION),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, dest), SLE_FILE_U8 | SLE_VAR_U16, 0, 4),
+	SLE_CONDVARX(cpp_offsetof(Vehicle, current_order) + cpp_offsetof(Order, dest), SLE_UINT16,                5, SL_MAX_VERSION),
 
 	    SLE_VAR(Vehicle, cur_image,     SLE_UINT16),
 	SLE_CONDVAR(Vehicle, age,           SLE_FILE_U16 | SLE_VAR_I32,  0, 30),
 	SLE_CONDVAR(Vehicle, age,           SLE_INT32,                  31, SL_MAX_VERSION),
 	    SLE_VAR(Vehicle, tick_counter,  SLE_UINT8),
 
-	   SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleDisaster, image_override), SLE_UINT16),
-	   SLE_VARX(offsetof(Vehicle, u) + offsetof(VehicleDisaster, unk2),           SLE_UINT16),
-
-	// reserve extra space in savegame here. (currently 16 bytes)
+	   SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, image_override), SLE_UINT16),
+	   SLE_VARX(cpp_offsetof(Vehicle, u) + cpp_offsetof(VehicleDisaster, unk2),           SLE_UINT16),
+
+	/* reserve extra space in savegame here. (currently 16 bytes) */
 	SLE_CONDNULL(16,                                                 2, SL_MAX_VERSION),
 
 	SLE_END()
@@ -2826,18 +2857,18 @@
 	_disaster_desc,
 };
 
-// Will be called when the vehicles need to be saved.
+/** Will be called when the vehicles need to be saved. */
 static void Save_VEHS()
 {
 	Vehicle *v;
-	// Write the vehicles
+	/* Write the vehicles */
 	FOR_ALL_VEHICLES(v) {
 		SlSetArrayIndex(v->index);
 		SlObject(v, (SaveLoad*)_veh_descs[v->type]);
 	}
 }
 
-// Will be called when vehicles need to be loaded.
+/** Will be called when vehicles need to be loaded. */
 static void Load_VEHS()
 {
 	int index;
@@ -2852,6 +2883,17 @@
 		v = GetVehicle(index);
 		SlObject(v, (SaveLoad*)_veh_descs[SlReadByte()]);
 
+		switch (v->type) {
+			case VEH_TRAIN:    v = new (v) Train();           break;
+			case VEH_ROAD:     v = new (v) RoadVehicle();     break;
+			case VEH_SHIP:     v = new (v) Ship();            break;
+			case VEH_AIRCRAFT: v = new (v) Aircraft();        break;
+			case VEH_SPECIAL:  v = new (v) SpecialVehicle();  break;
+			case VEH_DISASTER: v = new (v) DisasterVehicle(); break;
+			case VEH_INVALID:  v = new (v) InvalidVehicle();  break;
+			default: NOT_REACHED();
+		}
+
 		/* Old savegames used 'last_station_visited = 0xFF' */
 		if (CheckSavegameVersion(5) && v->last_station_visited == 0xFF)
 			v->last_station_visited = INVALID_STATION;
@@ -2862,6 +2904,9 @@
 			v->current_order.flags = (v->current_order.type & 0xF0) >> 4;
 			v->current_order.type.m_val &= 0x0F;
 		}
+
+		/* Advanced vehicle lists got added */
+		if (CheckSavegameVersion(60)) v->group_id = DEFAULT_GROUP;
 	}
 
 	/* Check for shared order-lists (we now use pointers for that) */
@@ -2889,13 +2934,80 @@
 void Vehicle::BeginLoading()
 {
 	assert(IsTileType(tile, MP_STATION) || type == VEH_SHIP);
+
+	if (this->current_order.type == OT_GOTO_STATION &&
+			this->current_order.dest == this->last_station_visited) {
+		/* Arriving at the ordered station.
+		 * Keep the load/unload flags, as we (obviously) still need them. */
+		this->current_order.flags &= OF_FULL_LOAD | OF_UNLOAD | OF_TRANSFER;
+
+		/* Furthermore add the Non Stop flag to mark that this station
+		 * is the actual destination of the vehicle, which is (for example)
+		 * necessary to be known for HandleTrainLoading to determine
+		 * whether the train is lost or not; not marking a train lost
+		 * that arrives at random stations is bad. */
+		this->current_order.flags |= OF_NON_STOP;
+	} else {
+		/* This is just an unordered intermediate stop */
+		this->current_order.flags = 0;
+	}
+
 	current_order.type = OT_LOADING;
+	GetStation(this->last_station_visited)->loading_vehicles.push_back(this);
+
+	SET_EXPENSES_TYPE(this->GetExpenseType(true));
+	VehiclePayment(this);
+
+	InvalidateWindow(this->GetVehicleListWindowClass(), this->owner);
+	InvalidateWindowWidget(WC_VEHICLE_VIEW, this->index, STATUS_BAR);
+	InvalidateWindow(WC_VEHICLE_DETAILS, this->index);
+	InvalidateWindow(WC_STATION_VIEW, this->last_station_visited);
+
+	GetStation(this->last_station_visited)->MarkTilesDirty();
+	this->MarkDirty();
 }
 
 void Vehicle::LeaveStation()
 {
-	assert(IsTileType(tile, MP_STATION) || type == VEH_SHIP);
 	assert(current_order.type == OT_LOADING);
 	current_order.type = OT_LEAVESTATION;
 	current_order.flags = 0;
+	GetStation(this->last_station_visited)->loading_vehicles.remove(this);
 }
+
+
+void Vehicle::HandleLoading(bool mode)
+{
+	switch (this->current_order.type) {
+		case OT_LOADING: {
+			/* Not the first call for this tick, or still loading */
+			if (mode || !HASBIT(this->vehicle_flags, VF_LOADING_FINISHED)) return;
+
+			this->PlayLeaveStationSound();
+
+			Order b = this->current_order;
+			this->LeaveStation();
+
+			/* If this was not the final order, don't remove it from the list. */
+			if (!(b.flags & OF_NON_STOP)) return;
+			break;
+		}
+
+		case OT_DUMMY: break;
+
+		default: return;
+	}
+
+	this->cur_order_index++;
+	InvalidateVehicleOrder(this);
+}
+
+
+void SpecialVehicle::UpdateDeltaXY(Direction direction)
+{
+	this->x_offs        = 0;
+	this->y_offs        = 0;
+	this->sprite_width  = 1;
+	this->sprite_height = 1;
+	this->z_height      = 1;
+}
--- a/src/vehicle.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/vehicle.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,11 +1,14 @@
 /* $Id$ */
 
+/** @vehicle.h */
+
 #ifndef VEHICLE_H
 #define VEHICLE_H
 
 #include "oldpool.h"
 #include "order.h"
 #include "rail.h"
+#include "road.h"
 
 /** The returned bits of VehicleEnterTile. */
 enum VehicleEnterTileStatus {
@@ -62,15 +65,18 @@
 	RVSB_ROAD_STOP_TRACKDIR_MASK = 0x09                       ///< Only bits 0 and 3 are used to encode the trackdir for road stops
 };
 
-enum {
+enum VehicleType {
 	VEH_TRAIN,
 	VEH_ROAD,
 	VEH_SHIP,
 	VEH_AIRCRAFT,
 	VEH_SPECIAL,
 	VEH_DISASTER,
+	VEH_END,
 	VEH_INVALID = 0xFF,
-} ;
+};
+template <> struct EnumPropsT<VehicleType> : MakeEnumPropsT<VehicleType, byte, VEH_TRAIN, VEH_END, VEH_INVALID> {};
+typedef TinyEnumT<VehicleType> VehicleTypeByte;
 
 enum VehStatus {
 	VS_HIDDEN          = 0x01,
@@ -106,15 +112,14 @@
 struct VehicleRail {
 	uint16 last_speed; // NOSAVE: only used in UI
 	uint16 crash_anim_pos;
-	uint16 days_since_order_progr;
 
-	// cached values, recalculated on load and each time a vehicle is added to/removed from the consist.
+	/* cached values, recalculated on load and each time a vehicle is added to/removed from the consist. */
 	uint16 cached_max_speed;  // max speed of the consist. (minimum of the max speed of all vehicles in the consist)
 	uint32 cached_power;      // total power of the consist.
 	uint8 cached_veh_length;  // length of this vehicle in units of 1/8 of normal length, cached because this can be set by a callback
 	uint16 cached_total_length; ///< Length of the whole train, valid only for first engine.
 
-	// cached values, recalculated when the cargo on a train changes (in addition to the conditions above)
+	/* cached values, recalculated when the cargo on a train changes (in addition to the conditions above) */
 	uint32 cached_weight;     // total weight of the consist.
 	uint32 cached_veh_weight; // weight of the vehicle.
 	uint32 cached_max_te;     // max tractive effort of consist
@@ -127,8 +132,8 @@
 	 */
 	byte cached_vis_effect;
 
-	// NOSAVE: for wagon override - id of the first engine in train
-	// 0xffff == not in train
+	/* NOSAVE: for wagon override - id of the first engine in train
+	 * 0xffff == not in train */
 	EngineID first_engine;
 
 	TrackBitsByte track;
@@ -138,32 +143,36 @@
 
 	byte flags;
 
-	// Link between the two ends of a multiheaded engine
+	/* Link between the two ends of a multiheaded engine */
 	Vehicle *other_multiheaded_part;
+
+	/* Cached wagon override spritegroup */
+	const struct SpriteGroup *cached_override;
 };
 
 enum {
 	VRF_REVERSING         = 0,
 
-	// used to calculate if train is going up or down
+	/* used to calculate if train is going up or down */
 	VRF_GOINGUP           = 1,
 	VRF_GOINGDOWN         = 2,
 
-	// used to store if a wagon is powered or not
+	/* used to store if a wagon is powered or not */
 	VRF_POWEREDWAGON      = 3,
 
-	// used to reverse the visible direction of the vehicle
+	/* used to reverse the visible direction of the vehicle */
 	VRF_REVERSE_DIRECTION = 4,
 
-	// used to mark train as lost because PF can't find the route
+	/* used to mark train as lost because PF can't find the route */
 	VRF_NO_PATH_TO_DESTINATION = 5,
 
-	// used to mark that electric train engine is allowed to run on normal rail
+	/* used to mark that electric train engine is allowed to run on normal rail */
 	VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL = 6,
 };
 
 struct VehicleAir {
 	uint16 crashed_counter;
+	uint16 cached_max_speed;
 	byte pos;
 	byte previous_pos;
 	StationID targetairport;
@@ -171,7 +180,7 @@
 };
 
 struct VehicleRoad {
-	byte state;             /// @see RoadVehicleStates
+	byte state;             ///< @see RoadVehicleStates
 	byte frame;
 	uint16 blocked_ctr;
 	byte overtaking;
@@ -180,6 +189,9 @@
 	byte reverse_ctr;
 	struct RoadStop *slot;
 	byte slot_age;
+
+	RoadType roadtype;
+	RoadTypes compatible_roadtypes;
 };
 
 struct VehicleSpecial {
@@ -198,7 +210,7 @@
 
 
 struct Vehicle {
-	byte type;               // type, ie roadven,train,ship,aircraft,special
+	VehicleTypeByte type;    ///< Type of vehicle
 	byte subtype;            // subtype (Filled with values from EffectVehicles/TrainSubTypes/AircraftSubTypes)
 
 	VehicleID index;         // NOSAVE: Index in vehicle array
@@ -210,7 +222,7 @@
 	StringID string_id;      // Displayed string
 
 	UnitID unitnumber;       // unit number, for display purposes only
-	PlayerByte owner;          // which player owns the vehicle?
+	PlayerByte owner;        // which player owns the vehicle?
 
 	TileIndex tile;          // Current tile index
 	TileIndex dest_tile;     // Heading for this tile
@@ -231,9 +243,9 @@
 	int8 y_offs;             // y offset for vehicle sprite
 	EngineID engine_type;
 
-	// for randomized variational spritegroups
-	// bitmask used to resolve them; parts of it get reseeded when triggers
-	// of corresponding spritegroups get matched
+	/* for randomized variational spritegroups
+	 * bitmask used to resolve them; parts of it get reseeded when triggers
+	 * of corresponding spritegroups get matched */
 	byte random_bits;
 	byte waiting_triggers;   // triggers to be yet matched
 
@@ -269,15 +281,15 @@
 	Vehicle *prev_shared;    ///< If not NULL, this points to the prev vehicle that shared the order
 	/* End Order-stuff */
 
-	// Boundaries for the current position in the world and a next hash link.
-	// NOSAVE: All of those can be updated with VehiclePositionChanged()
+	/* Boundaries for the current position in the world and a next hash link.
+	 * NOSAVE: All of those can be updated with VehiclePositionChanged() */
 	int32 left_coord;
 	int32 top_coord;
 	int32 right_coord;
 	int32 bottom_coord;
 	Vehicle *next_hash;
 
-	// Related to age and service time
+	/* Related to age and service time */
 	Date age;     // Age in days
 	Date max_age; // Maximum age
 	Date date_of_last_service;
@@ -302,6 +314,8 @@
 	TileIndex cargo_loaded_at_xy;  ///< tile index where feeder cargo was loaded
 	uint32 value;
 
+	GroupID group_id;              ///< Index of group Pool array
+
 	union {
 		VehicleRail rail;
 		VehicleAir air;
@@ -313,6 +327,152 @@
 
 	void BeginLoading();
 	void LeaveStation();
+
+	/**
+	 * Handle the loading of the vehicle; when not it skips through dummy
+	 * orders and does nothing in all other cases.
+	 * @param mode is the non-first call for this vehicle in this tick?
+	 */
+	void HandleLoading(bool mode = false);
+
+	/**
+	 * An overriden version of new, so you can use the vehicle instance
+	 * instead of a newly allocated piece of memory.
+	 * @param size the size of the variable (unused)
+	 * @param v    the vehicle to use as 'storage' backend
+	 * @return the memory that is 'allocated'
+	 */
+	void* operator new(size_t size, Vehicle *v) { return v; }
+
+	/**
+	 * 'Free' the memory allocated by the overriden new.
+	 * @param p the memory to 'free'
+	 * @param v the vehicle that was given to 'new' on creation.
+	 * @note This function isn't used (at the moment) and only added
+	 *       to please some compiler.
+	 */
+	void operator delete(void *p, Vehicle *v) {}
+
+	/**
+	 * 'Free' the memory allocated by the overriden new.
+	 * @param p the memory to 'free'
+	 * @note This function isn't used (at the moment) and only added
+	 *       as the above function was needed to please some compiler
+	 *       which made it necessary to add this to please yet
+	 *       another compiler...
+	 */
+	void operator delete(void *p) {}
+
+	/** We want to 'destruct' the right class. */
+	virtual ~Vehicle() {}
+
+	/**
+	 * Get a string 'representation' of the vehicle type.
+	 * @return the string representation.
+	 */
+	virtual const char* GetTypeString() const = 0;
+
+	/**
+	 * Marks the vehicles to be redrawn and updates cached variables
+	 */
+	virtual void MarkDirty() {}
+
+	/**
+	 * Updates the x and y offsets and the size of the sprite used
+	 * for this vehicle.
+	 * @param direction the direction the vehicle is facing
+	 */
+	virtual void UpdateDeltaXY(Direction direction) {}
+
+	/**
+	 * Sets the expense type associated to this vehicle type
+	 * @param income whether this is income or (running) expenses of the vehicle
+	 */
+	virtual ExpensesType GetExpenseType(bool income) const { return EXPENSES_OTHER; }
+
+	/**
+	 * Invalidates the vehicle list window of this type of vehicle
+	 */
+	virtual WindowClass GetVehicleListWindowClass() const { return WC_NONE; }
+
+	/**
+	 * Play the sound associated with leaving the station
+	 */
+	virtual void PlayLeaveStationSound() const {}
+
+	/**
+	 * Whether this is the primary vehicle in the chain.
+	 */
+	virtual bool IsPrimaryVehicle() const { return false; }
+
+	/**
+	 * Whether this vehicle understands the concept of a front engine, so
+	 * basically, if GetFirstVehicleInChain() can be called for it.
+	 */
+	virtual bool HasFront() const { return false; }
+};
+
+/**
+ * This class 'wraps' Vehicle; you do not actually instantiate this class.
+ * You create a Vehicle using AllocateVehicle, so it is added to the pool
+ * and you reinitialize that to a Train using:
+ *   v = new (v) Train();
+ *
+ * As side-effect the vehicle type is set correctly.
+ *
+ * A special vehicle is one of the following:
+ *  - smoke
+ *  - electric sparks for trains
+ *  - explosions
+ *  - bulldozer (road works)
+ *  - bubbles (industry)
+ */
+struct SpecialVehicle : public Vehicle {
+	/** Initializes the Vehicle to a special vehicle */
+	SpecialVehicle() { this->type = VEH_SPECIAL; }
+
+	/** We want to 'destruct' the right class. */
+	virtual ~SpecialVehicle() {}
+
+	const char *GetTypeString() const { return "special vehicle"; }
+	void UpdateDeltaXY(Direction direction);
+};
+
+/**
+ * This class 'wraps' Vehicle; you do not actually instantiate this class.
+ * You create a Vehicle using AllocateVehicle, so it is added to the pool
+ * and you reinitialize that to a Train using:
+ *   v = new (v) Train();
+ *
+ * As side-effect the vehicle type is set correctly.
+ */
+struct DisasterVehicle : public Vehicle {
+	/** Initializes the Vehicle to a disaster vehicle */
+	DisasterVehicle() { this->type = VEH_DISASTER; }
+
+	/** We want to 'destruct' the right class. */
+	virtual ~DisasterVehicle() {}
+
+	const char *GetTypeString() const { return "disaster vehicle"; }
+	void UpdateDeltaXY(Direction direction);
+};
+
+/**
+ * This class 'wraps' Vehicle; you do not actually instantiate this class.
+ * You create a Vehicle using AllocateVehicle, so it is added to the pool
+ * and you reinitialize that to a Train using:
+ *   v = new (v) Train();
+ *
+ * As side-effect the vehicle type is set correctly.
+ */
+struct InvalidVehicle : public Vehicle {
+	/** Initializes the Vehicle to a invalid vehicle */
+	InvalidVehicle() { this->type = VEH_INVALID; }
+
+	/** We want to 'destruct' the right class. */
+	virtual ~InvalidVehicle() {}
+
+	const char *GetTypeString() const { return "invalid vehicle"; }
 };
 
 #define is_custom_sprite(x) (x >= 0xFD)
@@ -342,7 +502,6 @@
 byte VehicleRandomBits();
 void ResetVehiclePosHash();
 
-bool CanFillVehicle(Vehicle *v);
 bool CanRefitTo(EngineID engine_type, CargoID cid_to);
 CargoID FindFirstRefittableCargo(EngineID engine_type);
 int32 GetRefitCost(EngineID engine_type);
@@ -380,9 +539,7 @@
 
 void ShowAircraftViewWindow(const Vehicle* v);
 
-UnitID GetFreeUnitNumber(byte type);
-
-int LoadUnloadVehicle(Vehicle *v, bool just_arrived);
+UnitID GetFreeUnitNumber(VehicleType type);
 
 void TrainConsistChanged(Vehicle *v);
 void TrainPowerChanged(Vehicle *v);
@@ -392,9 +549,9 @@
 
 bool VehicleNeedsService(const Vehicle *v);
 
-uint GenerateVehicleSortList(const Vehicle*** sort_list, uint16 *length_of_array, byte type, PlayerID owner, uint32 index, uint16 window_type);
-void BuildDepotVehicleList(byte type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count);
-int32 SendAllVehiclesToDepot(byte type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id);
+uint GenerateVehicleSortList(const Vehicle*** sort_list, uint16 *length_of_array, VehicleType type, PlayerID owner, uint32 index, uint16 window_type);
+void BuildDepotVehicleList(VehicleType type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count);
+int32 SendAllVehiclesToDepot(VehicleType type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id);
 bool IsVehicleInDepot(const Vehicle *v);
 void VehicleEnterDepot(Vehicle *v);
 
@@ -405,7 +562,7 @@
 /* Flags to add to p2 for goto depot commands */
 /* Note: bits 8-10 are used for VLW flags */
 enum {
-	DEPOT_SERVICE       = (1 << 0),	// The vehicle will leave the depot right after arrival (serivce only)
+	DEPOT_SERVICE       = (1 << 0), // The vehicle will leave the depot right after arrival (serivce only)
 	DEPOT_MASS_SEND     = (1 << 1), // Tells that it's a mass send to depot command (type in VLW flag)
 	DEPOT_DONT_CANCEL   = (1 << 2), // Don't cancel current goto depot command if any
 	DEPOT_LOCATE_HANGAR = (1 << 3), // Find another airport if the target one lacks a hangar
@@ -467,10 +624,10 @@
 static inline void DeleteVehicle(Vehicle *v)
 {
 	DestroyVehicle(v);
-	v->type = VEH_INVALID;
+	v = new (v) InvalidVehicle();
 }
 
-static inline bool IsPlayerBuildableVehicleType(byte type)
+static inline bool IsPlayerBuildableVehicleType(VehicleType type)
 {
 	switch (type) {
 		case VEH_TRAIN:
@@ -478,8 +635,9 @@
 		case VEH_SHIP:
 		case VEH_AIRCRAFT:
 			return true;
+
+		default: return false;
 	}
-	return false;
 }
 
 static inline bool IsPlayerBuildableVehicleType(const Vehicle *v)
@@ -492,7 +650,7 @@
 
 /**
  * Check if an index is a vehicle-index (so between 0 and max-vehicles)
- *
+ * @param index of the vehicle to query
  * @return Returns true if the vehicle-id is in range
  */
 static inline bool IsValidVehicleID(uint index)
@@ -513,7 +671,11 @@
 	return order;
 }
 
-/* Returns the last order of a vehicle, or NULL if it doesn't exists */
+/**
+ * Returns the last order of a vehicle, or NULL if it doesn't exists
+ * @param v Vehicle to query
+ * @return last order of a vehicle, if available
+ */
 static inline Order *GetLastVehicleOrder(const Vehicle *v)
 {
 	Order *order = v->orders;
@@ -526,7 +688,10 @@
 	return order;
 }
 
-/* Get the first vehicle of a shared-list, so we only have to walk forwards */
+/** Get the first vehicle of a shared-list, so we only have to walk forwards
+ * @param v Vehicle to query
+ * @return first vehicle of a shared-list
+ */
 static inline Vehicle *GetFirstVehicleFromSharedList(const Vehicle *v)
 {
 	Vehicle *u = (Vehicle *)v;
@@ -535,12 +700,14 @@
 	return u;
 }
 
-// NOSAVE: Return values from various commands.
+/* NOSAVE: Return values from various commands. */
 VARDEF VehicleID _new_vehicle_id;
 VARDEF uint16 _returned_refit_capacity;
 
 static const VehicleID INVALID_VEHICLE = 0xFFFF;
 
+const struct Livery *GetEngineLivery(EngineID engine_type, PlayerID player, EngineID parent_engine_type, const Vehicle *v);
+
 /**
  * Get the colour map for an engine. This used for unbuilt engines in the user interface.
  * @param engine_type ID of engine
@@ -566,7 +733,7 @@
 extern const uint32 _send_to_depot_proc_table[];
 
 /* Functions to find the right command for certain vehicle type */
-static inline uint32 GetCmdBuildVeh(byte type)
+static inline uint32 GetCmdBuildVeh(VehicleType type)
 {
 	return _veh_build_proc_table[type];
 }
@@ -576,7 +743,7 @@
 	return GetCmdBuildVeh(v->type);
 }
 
-static inline uint32 GetCmdSellVeh(byte type)
+static inline uint32 GetCmdSellVeh(VehicleType type)
 {
 	return _veh_sell_proc_table[type];
 }
@@ -586,7 +753,7 @@
 	return GetCmdSellVeh(v->type);
 }
 
-static inline uint32 GetCmdRefitVeh(byte type)
+static inline uint32 GetCmdRefitVeh(VehicleType type)
 {
 	return _veh_refit_proc_table[type];
 }
@@ -596,7 +763,7 @@
 	return GetCmdRefitVeh(v->type);
 }
 
-static inline uint32 GetCmdSendToDepot(byte type)
+static inline uint32 GetCmdSendToDepot(VehicleType type)
 {
 	return _send_to_depot_proc_table[type];
 }
--- a/src/vehicle_gui.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/vehicle_gui.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file vehicle_gui.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "debug.h"
@@ -29,6 +31,7 @@
 #include "depot.h"
 #include "helpers.hpp"
 #include "cargotype.h"
+#include "group.h"
 
 struct Sorting {
 	Listing aircraft;
@@ -39,15 +42,6 @@
 
 static Sorting _sorting;
 
-struct vehiclelist_d {
-	const Vehicle** sort_list;  // List of vehicles (sorted)
-	Listing *_sorting;          // pointer to the appropiate subcategory of _sorting
-	uint16 length_of_sort_list; // Keeps track of how many vehicle pointers sort list got space for
-	byte vehicle_type;          // The vehicle type that is sorted
-	list_d l;                   // General list struct
-};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vehiclelist_d));
-
 static bool   _internal_sort_order;     // descending/ascending
 
 typedef int CDECL VehicleSortListingTypeFunction(const void*, const void*);
@@ -76,7 +70,7 @@
 	&VehicleValueSorter,
 };
 
-static const StringID _vehicle_sort_listing[] = {
+const StringID _vehicle_sort_listing[] = {
 	STR_SORT_BY_NUMBER,
 	STR_SORT_BY_DROPDOWN_NAME,
 	STR_SORT_BY_AGE,
@@ -132,7 +126,7 @@
 	}
 }
 
-static void BuildVehicleList(vehiclelist_d* vl, PlayerID owner, uint16 index, uint16 window_type)
+void BuildVehicleList(vehiclelist_d *vl, PlayerID owner, uint16 index, uint16 window_type)
 {
 	if (!(vl->l.flags & VL_REBUILD)) return;
 
@@ -144,7 +138,7 @@
 	vl->l.flags |= VL_RESORT;
 }
 
-static void SortVehicleList(vehiclelist_d *vl)
+void SortVehicleList(vehiclelist_d *vl)
 {
 	if (!(vl->l.flags & VL_RESORT)) return;
 
@@ -162,12 +156,12 @@
 	qsort((void*)v, length, sizeof(v[0]), _vehicle_sorter[0]);
 }
 
-// draw the vehicle profit button in the vehicle list window.
+/** draw the vehicle profit button in the vehicle list window. */
 void DrawVehicleProfitButton(const Vehicle *v, int x, int y)
 {
 	SpriteID pal;
 
-	// draw profit-based colored icons
+	/* draw profit-based colored icons */
 	if (v->age <= 365 * 2) {
 		pal = PALETTE_TO_GREY;
 	} else if (v->profit_last_year < 0) {
@@ -277,8 +271,11 @@
 
 /** Draw the list of available refit options for a consist.
  * Draw the list and highlight the selected refit option (if any)
- * @param *v first vehicle in consist to get the refit-options of
+ * @param *list first vehicle in consist to get the refit-options of
  * @param sel selected refit cargo-type in the window
+ * @param pos position of the selected item in caller widow
+ * @param rows number of rows(capacity) in caller window
+ * @param delta step height in caller window
  * @return the refit option that is hightlighted, NULL if none
  */
 static RefitOption *DrawVehicleRefitWindow(const RefitList *list, int sel, uint pos, uint rows, uint delta)
@@ -338,48 +335,49 @@
 			SetDParam(1, v->unitnumber);
 			DrawWindowWidgets(w);
 
-			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);
+			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) {
+			if (WP(w, refit_d).cargo != NULL) {
 				int32 cost;
 
-				cost = DoCommand(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8,
+				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(0, WP(w, refit_d).cargo->cargo);
 					SetDParam(1, _returned_refit_capacity);
 					SetDParam(2, cost);
 					DrawString(2, w->widget[5].top + 1, STR_9840_NEW_CAPACITY_COST_OF_REFIT, 0);
 				}
 			}
-		}	break;
+		} break;
 
 		case WE_CLICK:
 			switch (e->we.click.widget) {
 				case 3: { // listbox
 					int y = e->we.click.pt.y - w->widget[3].top;
 					if (y >= 0) {
-						WP(w,refit_d).sel = (y / (int)w->resize.step_height) + w->vscroll.pos;
+						WP(w, refit_d).sel = (y / (int)w->resize.step_height) + w->vscroll.pos;
 						SetWindowDirty(w);
 					}
 				} break;
 				case 6: // refit button
-					if (WP(w,refit_d).cargo != NULL) {
+					if (WP(w, refit_d).cargo != NULL) {
 						const Vehicle *v = GetVehicle(w->window_number);
 
 						if (WP(w, refit_d).order == INVALID_VEH_ORDER_ID) {
 							int command = 0;
 
 							switch (v->type) {
+								default: NOT_REACHED();
 								case VEH_TRAIN:    command = CMD_REFIT_RAIL_VEHICLE | CMD_MSG(STR_RAIL_CAN_T_REFIT_VEHICLE);  break;
 								case VEH_ROAD:     command = CMD_REFIT_ROAD_VEH     | CMD_MSG(STR_REFIT_ROAD_VEHICLE_CAN_T);  break;
 								case VEH_SHIP:     command = CMD_REFIT_SHIP         | CMD_MSG(STR_9841_CAN_T_REFIT_SHIP);     break;
 								case VEH_AIRCRAFT: command = CMD_REFIT_AIRCRAFT     | CMD_MSG(STR_A042_CAN_T_REFIT_AIRCRAFT); break;
 							}
-							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8, NULL, command)) DeleteWindow(w);
+							if (DoCommandP(v->tile, v->index, WP(w, refit_d).cargo->cargo | WP(w, refit_d).cargo->subtype << 8, NULL, command)) DeleteWindow(w);
 						} else {
-							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8 | WP(w, refit_d).order << 16, NULL, CMD_ORDER_REFIT)) DeleteWindow(w);
+							if (DoCommandP(v->tile, v->index, WP(w, refit_d).cargo->cargo | WP(w, refit_d).cargo->subtype << 8 | WP(w, refit_d).order << 16, NULL, CMD_ORDER_REFIT)) DeleteWindow(w);
 						}
 					}
 					break;
@@ -413,7 +411,7 @@
 
 static const WindowDesc _vehicle_refit_desc = {
 	WDP_AUTO, WDP_AUTO, 240, 174,
-	WC_VEHICLE_REFIT,WC_VEHICLE_VIEW,
+	WC_VEHICLE_REFIT, WC_VEHICLE_VIEW,
 	WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
 	_vehicle_refit_widgets,
 	VehicleRefitWndProc,
@@ -421,6 +419,7 @@
 
 /** Show the refit window for a vehicle
 * @param *v The vehicle to show the refit window for
+* @param order of the vehicle ( ? )
 */
 void ShowVehicleRefitWindow(const Vehicle *v, VehicleOrderID order)
 {
@@ -466,18 +465,18 @@
 	}
 }
 
-/* Display additional text from NewGRF in the purchase information window */
+/** Display additional text from NewGRF in the purchase information window */
 uint ShowAdditionalText(int x, int y, uint w, EngineID engine)
 {
 	uint16 callback = GetVehicleCallback(CBID_VEHICLE_ADDITIONAL_TEXT, 0, 0, engine, NULL);
 	if (callback == CALLBACK_FAILED) return 0;
 
-	// STR_02BD is used to start the string with {BLACK}
+	/* STR_02BD is used to start the string with {BLACK} */
 	SetDParam(0, GetGRFStringID(GetEngineGRFID(engine), 0xD000 + callback));
 	return DrawStringMultiLine(x, y, STR_02BD, w);
 }
 
-/* Count the number of bits that are set in a mask */
+/** Count the number of bits that are set in a mask */
 static uint CountBits(uint32 mask)
 {
 	uint c = 0;
@@ -485,7 +484,7 @@
 	return c;
 }
 
-/* Display list of cargo types of the engine, for the purchase information window */
+/** Display list of cargo types of the engine, for the purchase information window */
 uint ShowRefitOptionsList(int x, int y, uint w, EngineID engine)
 {
 	/* List of cargo types of this engine */
@@ -529,7 +528,7 @@
 }
 
 
-// if the sorting criteria had the same value, sort vehicle by unitnumber
+/* if the sorting criteria had the same value, sort vehicle by unitnumber */
 #define VEHICLEUNITNUMBERSORTER(r, a, b) {if (r == 0) {r = a->unitnumber - b->unitnumber;}}
 
 static int CDECL VehicleNumberSorter(const void *a, const void *b)
@@ -742,16 +741,6 @@
 	}
 }
 
-/*
- * Start of functions regarding vehicle list windows
- */
-
-enum {
-	PLY_WND_PRC__OFFSET_TOP_WIDGET = 26,
-	PLY_WND_PRC__SIZE_OF_ROW_SMALL = 26,
-	PLY_WND_PRC__SIZE_OF_ROW_BIG   = 36,
-};
-
 enum VehicleListWindowWidgets {
 	VLW_WIDGET_CLOSEBOX = 0,
 	VLW_WIDGET_CAPTION,
@@ -802,7 +791,7 @@
 	uint16 window_type = w->window_number & VLW_MASK;
 	PlayerID player = (PlayerID)GB(w->window_number, 0, 8);
 
-	vl->vehicle_type = GB(w->window_number, 11, 5);
+	vl->vehicle_type = (VehicleType)GB(w->window_number, 11, 5);
 	vl->length_of_sort_list = 0;
 	vl->sort_list = NULL;
 	w->caption_color = player;
@@ -916,10 +905,10 @@
 	vl->l.flags = VL_REBUILD | (vl->_sorting->order ? VL_DESC : VL_NONE);
 	vl->l.sort_type = vl->_sorting->criteria;
 	vl->sort_list = NULL;
-	vl->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS;	// Set up resort timer
+	vl->l.resort_timer = DAY_TICKS * PERIODIC_RESORT_DAYS; // Set up resort timer
 }
 
-static void DrawSmallOrderList(const Vehicle *v, int x, int y)
+void DrawSmallOrderList(const Vehicle *v, int x, int y)
 {
 	const Order *order;
 	int sel, i = 0;
@@ -1134,13 +1123,13 @@
 					DoCommandP(0, GB(w->window_number, 16, 16), (w->window_number & VLW_MASK) | (1 << 6) | (e->we.click.widget == VLW_WIDGET_START_ALL ? (1 << 5) : 0) | vl->vehicle_type, NULL, CMD_MASS_START_STOP);
 					break;
 			}
-		}	break;
+		} break;
 
 		case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
 			switch (e->we.dropdown.button) {
 				case VLW_WIDGET_SORT_BY_PULLDOWN:
 					if (vl->l.sort_type != e->we.dropdown.index) {
-						// value has changed -> resort
+						/* value has changed -> resort */
 						vl->l.flags |= VL_RESORT;
 						vl->l.sort_type = e->we.dropdown.index;
 						vl->_sorting->criteria = vl->l.sort_type;
@@ -1229,7 +1218,7 @@
 	PlayerVehWndProc
 };
 
-static void ShowVehicleListWindowLocal(PlayerID player, uint16 VLW_flag, byte vehicle_type, uint16 unique_number)
+static void ShowVehicleListWindowLocal(PlayerID player, uint16 VLW_flag, VehicleType vehicle_type, uint16 unique_number)
 {
 	Window *w;
 	WindowNumber num;
@@ -1266,9 +1255,13 @@
 	}
 }
 
-void ShowVehicleListWindow(PlayerID player, byte vehicle_type)
+void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type)
 {
-	ShowVehicleListWindowLocal(player, VLW_STANDARD, vehicle_type, 0);
+	if (player == _local_player && _patches.advanced_vehicle_list) {
+		ShowPlayerGroup(player, vehicle_type);
+	} else {
+		ShowVehicleListWindowLocal(player, VLW_STANDARD, vehicle_type, 0);
+	}
 }
 
 void ShowVehicleListWindow(const Vehicle *v)
@@ -1277,12 +1270,12 @@
 	ShowVehicleListWindowLocal(v->owner, VLW_SHARED_ORDERS, v->type, v->orders->index);
 }
 
-void ShowVehicleListWindow(PlayerID player, byte vehicle_type, StationID station)
+void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type, StationID station)
 {
 	ShowVehicleListWindowLocal(player, VLW_STATION_LIST, vehicle_type, station);
 }
 
-void ShowVehicleListWindow(PlayerID player, byte vehicle_type, TileIndex depot_tile)
+void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type, TileIndex depot_tile)
 {
 	uint16 depot_airport_index;
 
--- a/src/vehicle_gui.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/vehicle_gui.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file vehicle_gui.h */
+
 #ifndef VEHICLE_GUI_H
 #define VEHICLE_GUI_H
 
@@ -13,21 +15,35 @@
 /* sorter stuff */
 void RebuildVehicleLists();
 void ResortVehicleLists();
+void SortVehicleList(vehiclelist_d *vl);
+void BuildVehicleList(vehiclelist_d *vl, PlayerID owner, uint16 index, uint16 window_type);
 
 #define PERIODIC_RESORT_DAYS 10
 
+extern const StringID _vehicle_sort_listing[];
+
+/* Start of functions regarding vehicle list windows */
+enum {
+	PLY_WND_PRC__OFFSET_TOP_WIDGET = 26,
+	PLY_WND_PRC__SIZE_OF_ROW_TINY  = 13,
+	PLY_WND_PRC__SIZE_OF_ROW_SMALL = 26,
+	PLY_WND_PRC__SIZE_OF_ROW_BIG   = 36,
+	PLY_WND_PRC__SIZE_OF_ROW_BIG2  = 39,
+};
+
 /* Vehicle List Window type flags */
 enum {
 	VLW_STANDARD      = 0 << 8,
 	VLW_SHARED_ORDERS = 1 << 8,
 	VLW_STATION_LIST  = 2 << 8,
 	VLW_DEPOT_LIST    = 3 << 8,
+	VLW_GROUP_LIST    = 4 << 8,
 	VLW_MASK          = 0x700,
 };
 
 static inline bool ValidVLWFlags(uint16 flags)
 {
-	return (flags == VLW_STANDARD || flags == VLW_SHARED_ORDERS || flags == VLW_STATION_LIST || flags == VLW_DEPOT_LIST);
+	return (flags == VLW_STANDARD || flags == VLW_SHARED_ORDERS || flags == VLW_STATION_LIST || flags == VLW_DEPOT_LIST || flags == VLW_GROUP_LIST);
 }
 
 void PlayerVehWndProc(Window *w, WindowEvent *e);
@@ -39,7 +55,7 @@
 void DrawShipImage(const Vehicle *v, int x, int y, VehicleID selection);
 void DrawAircraftImage(const Vehicle *v, int x, int y, VehicleID selection);
 
-void ShowBuildVehicleWindow(TileIndex tile, byte type);
+void ShowBuildVehicleWindow(TileIndex tile, VehicleType type);
 
 void ChangeVehicleViewWindow(const Vehicle *from_v, const Vehicle *to_v);
 
@@ -47,11 +63,13 @@
 uint ShowRefitOptionsList(int x, int y, uint w, EngineID engine);
 
 void ShowVehicleListWindow(const Vehicle *v);
-void ShowVehicleListWindow(PlayerID player, byte vehicle_type);
-void ShowVehicleListWindow(PlayerID player, byte vehicle_type, StationID station);
-void ShowVehicleListWindow(PlayerID player, byte vehicle_type, TileIndex depot_tile);
+void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type);
+void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type, StationID station);
+void ShowVehicleListWindow(PlayerID player, VehicleType vehicle_type, TileIndex depot_tile);
 
-void ShowReplaceVehicleWindow(byte vehicletype);
+void ShowReplaceVehicleWindow(VehicleType vehicletype);
+void DrawSmallOrderList(const Vehicle *v, int x, int y);
+void ShowReplaceGroupVehicleWindow(GroupID group, VehicleType veh);
 
 static inline void DrawVehicleImage(const Vehicle *v, int x, int y, int count, int skip, VehicleID selection)
 {
@@ -64,7 +82,7 @@
 	}
 }
 
-static inline uint GetVehicleListHeight(byte type)
+static inline uint GetVehicleListHeight(VehicleType type)
 {
 	return (type == VEH_TRAIN || type == VEH_ROAD) ? 14 : 24;
 }
--- a/src/video/dedicated_v.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/video/dedicated_v.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -112,7 +112,7 @@
 #endif
 
 
-static void *_dedicated_video_mem;
+static Pixel *_dedicated_video_mem;
 
 extern bool SafeSaveOrLoad(const char *filename, int mode, int newgm);
 extern void SwitchMode(int new_mode);
@@ -122,7 +122,7 @@
 {
 	_screen.width = _screen.pitch = _cur_resolution[0];
 	_screen.height = _cur_resolution[1];
-	_dedicated_video_mem = malloc(_cur_resolution[0]*_cur_resolution[1]);
+	_dedicated_video_mem = (Pixel *)malloc(_cur_resolution[0] * _cur_resolution[1] * sizeof(Pixel));
 
 	SetDebugString("net=6");
 
@@ -283,7 +283,7 @@
 			next_tick = cur_ticks + 30;
 
 			GameLoop();
-			_screen.dst_ptr = (Pixel*)_dedicated_video_mem;
+			_screen.dst_ptr = _dedicated_video_mem;
 			UpdateWindows();
 		}
 		CSleep(1);
--- a/src/video/null_v.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/video/null_v.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -7,13 +7,13 @@
 #include "../window.h"
 #include "null_v.h"
 
-static void* _null_video_mem = NULL;
+static Pixel *_null_video_mem = NULL;
 
 static const char* NullVideoStart(const char* const* parm)
 {
 	_screen.width = _screen.pitch = _cur_resolution[0];
 	_screen.height = _cur_resolution[1];
-	_null_video_mem = malloc(_cur_resolution[0] * _cur_resolution[1]);
+	_null_video_mem = (Pixel *)malloc(_cur_resolution[0] * _cur_resolution[1] * sizeof(Pixel));
 	return NULL;
 }
 
@@ -27,7 +27,7 @@
 
 	for (i = 0; i < 1000; i++) {
 		GameLoop();
-		_screen.dst_ptr = (Pixel*)_null_video_mem;
+		_screen.dst_ptr = _null_video_mem;
 		UpdateWindows();
 	}
 }
--- a/src/video/sdl_v.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/video/sdl_v.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -195,7 +195,7 @@
 
 	_screen.width = newscreen->w;
 	_screen.height = newscreen->h;
-	_screen.pitch = newscreen->pitch;
+	_screen.pitch = newscreen->pitch / sizeof(Pixel);
 
 	_sdl_screen = newscreen;
 	InitPalette();
--- a/src/video/win32_v.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/video/win32_v.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -45,7 +45,7 @@
 	LOGPALETTE *pal;
 	uint i;
 
-	pal = (LOGPALETTE*)alloca(sizeof(LOGPALETTE) + (256-1) * sizeof(PALETTEENTRY));
+	pal = (LOGPALETTE*)alloca(sizeof(LOGPALETTE) + (256 - 1) * sizeof(PALETTEENTRY));
 
 	pal->palVersion = 0x300;
 	pal->palNumEntries = 256;
@@ -212,6 +212,7 @@
 static LRESULT CALLBACK WndProcGdi(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
 	static uint32 keycode = 0;
+	static bool console = false;
 
 	switch (msg) {
 		case WM_CREATE:
@@ -363,12 +364,23 @@
 		}
 #endif /* UNICODE */
 
+		case WM_DEADCHAR:
+			console = GB(lParam, 16, 8) == 41;
+			return 0;
+
 		case WM_CHAR: {
 			/* Silently drop all non-text messages as those were handled by WM_KEYDOWN */
 			if (wParam < VK_SPACE) return 0;
 			uint scancode = GB(lParam, 16, 8);
 			uint charcode = wParam;
 
+			/* If the console key is a dead-key, we need to press it twice to get a WM_CHAR message.
+			 * But we then get two WM_CHAR messages, so ignore the first one */
+			if (console && scancode == 41) {
+				console = false;
+				return 0;
+			}
+
 #if !defined(UNICODE)
 			wchar_t w;
 			int len = MultiByteToWideChar(_codepage, 0, (char*)&charcode, 1, &w, 1);
@@ -653,13 +665,13 @@
 		_wnd.alloced_bits = NULL;
 	}
 
-	bi = (BITMAPINFO*)alloca(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
-	memset(bi, 0, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
+	bi = (BITMAPINFO*)alloca(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
+	memset(bi, 0, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256);
 	bi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 
 	if (_wnd.double_size) {
 		w = ALIGN(w, 4);
-		_wnd.alloced_bits = _wnd.buffer_bits = (Pixel*)malloc(w * h);
+		_wnd.alloced_bits = _wnd.buffer_bits = (Pixel *)malloc(w * h * sizeof(Pixel));
 		w *= 2;
 		h *= 2;
 	}
--- a/src/viewport.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/viewport.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -11,6 +11,7 @@
 #include "strings.h"
 #include "table/sprites.h"
 #include "table/strings.h"
+#include "landscape.h"
 #include "map.h"
 #include "viewport.h"
 #include "window.h"
@@ -26,7 +27,9 @@
 
 #define VIEWPORT_DRAW_MEM (65536 * 2)
 
-// XXX - maximum viewports is maximum windows - 2 (main toolbar + status bar)
+ZoomLevel _saved_scrollpos_zoom;
+
+/* 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
 assert_compile(lengthof(_viewports) < sizeof(_active_viewports) * 8);
@@ -92,8 +95,8 @@
 	byte zmax;
 };
 
-// Quick hack to know how much memory to reserve when allocating from the spritelist
-// to prevent a buffer overflow.
+/* Quick hack to know how much memory to reserve when allocating from the spritelist
+ * to prevent a buffer overflow. */
 #define LARGEST_SPRITELIST_STRUCT ParentSpriteToDraw
 
 struct ViewportDrawer {
@@ -143,7 +146,7 @@
 }
 
 void AssignWindowViewport(Window *w, int x, int y,
-	int width, int height, uint32 follow_flags, byte zoom)
+	int width, int height, uint32 follow_flags, ZoomLevel zoom)
 {
 	ViewPort *vp;
 	Point pt;
@@ -162,8 +165,8 @@
 
 	vp->zoom = zoom;
 
-	vp->virtual_width = width << zoom;
-	vp->virtual_height = height << zoom;
+	vp->virtual_width = ScaleByZoom(width, zoom);
+	vp->virtual_height = ScaleByZoom(height, zoom);
 
 	if (follow_flags & 0x80000000) {
 		const Vehicle *veh;
@@ -181,6 +184,9 @@
 
 	WP(w, vp_d).scrollpos_x = pt.x;
 	WP(w, vp_d).scrollpos_y = pt.y;
+	WP(w, vp_d).dest_scrollpos_x = pt.x;
+	WP(w, vp_d).dest_scrollpos_y = pt.y;
+
 	w->viewport = vp;
 	vp->virtual_left = 0;//pt.x;
 	vp->virtual_top = 0;//pt.y;
@@ -267,10 +273,10 @@
 	vp->virtual_left = x;
 	vp->virtual_top = y;
 
-	old_left >>= vp->zoom;
-	old_top >>= vp->zoom;
-	x >>= vp->zoom;
-	y >>= vp->zoom;
+	old_left = UnScaleByZoom(old_left, vp->zoom);
+	old_top = UnScaleByZoom(old_top, vp->zoom);
+	x = UnScaleByZoom(x, vp->zoom);
+	y = UnScaleByZoom(y, vp->zoom);
 
 	old_left -= x;
 	old_top -= y;
@@ -331,8 +337,8 @@
 				return pt;
 	}
 
-	x = ((x << vp->zoom) + vp->virtual_left) >> 2;
-	y = ((y << vp->zoom) + vp->virtual_top) >> 1;
+	x = (ScaleByZoom(x, vp->zoom) + vp->virtual_left) >> 2;
+	y = (ScaleByZoom(y, vp->zoom) + vp->virtual_top) >> 1;
 
 	a = y-x;
 	b = y+x;
@@ -398,16 +404,16 @@
 
 /** Update the status of the zoom-buttons according to the zoom-level
  * of the viewport. This will update their status and invalidate accordingly
- * @param window pointer to the window that has the zoom buttons
+ * @param w Window pointer to the window that has the zoom buttons
  * @param vp pointer to the viewport whose zoom-level the buttons represent
  * @param widget_zoom_in widget index for window with zoom-in button
  * @param widget_zoom_out widget index for window with zoom-out button */
 void HandleZoomMessage(Window *w, const ViewPort *vp, byte widget_zoom_in, byte widget_zoom_out)
 {
-	SetWindowWidgetDisabledState(w, widget_zoom_in, vp->zoom == 0);
+	SetWindowWidgetDisabledState(w, widget_zoom_in, vp->zoom == ZOOM_LVL_MIN);
 	InvalidateWidget(w, widget_zoom_in);
 
-	SetWindowWidgetDisabledState(w, widget_zoom_out, vp->zoom == 2);
+	SetWindowWidgetDisabledState(w, widget_zoom_out, vp->zoom == ZOOM_LVL_MAX);
 	InvalidateWidget(w, widget_zoom_out);
 }
 
@@ -439,7 +445,7 @@
 void DrawGroundSprite(SpriteID image, SpriteID pal)
 {
 	if (_offset_ground_sprites) {
-		// offset ground sprite because of foundation?
+		/* offset ground sprite because of foundation? */
 		AddChildSpriteScreen(image, pal, _cur_vd->offs_x, _cur_vd->offs_y);
 	} else {
 		_added_tile_sprite = true;
@@ -494,12 +500,12 @@
 	ps = (ParentSpriteToDraw*)vd->spritelist_mem;
 
 	if (vd->parent_list >= vd->eof_parent_list) {
-		// This can happen rarely, mostly when you zoom out completely
-		//  and have a lot of stuff that moves (and is added to the
-		//  sort-list, this function). To solve it, increase
-		//  parent_list somewhere below to a higher number.
-		// This can not really hurt you, it just gives some black
-		//  spots on the screen ;)
+		/* This can happen rarely, mostly when you zoom out completely
+		 *  and have a lot of stuff that moves (and is added to the
+		 *  sort-list, this function). To solve it, increase
+		 *  parent_list somewhere below to a higher number.
+		 * This can not really hurt you, it just gives some black
+		 *  spots on the screen ;) */
 		DEBUG(sprite, 0, "Out of sprite memory (parent_list)");
 		return;
 	}
@@ -647,16 +653,16 @@
 	SpriteID image;
 	SpriteID pal;
 
-	// Draw a red error square?
+	/* Draw a red error square? */
 	if (_thd.redsq != 0 && _thd.redsq == ti->tile) {
 		DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], PALETTE_TILE_RED_PULSATING, ti);
 		return;
 	}
 
-	// no selection active?
+	/* no selection active? */
 	if (_thd.drawstyle == 0) return;
 
-	// Inside the inner area?
+	/* Inside the inner area? */
 	if (IS_INSIDE_1D(ti->x, _thd.pos.x, _thd.size.x) &&
 			IS_INSIDE_1D(ti->y, _thd.pos.y, _thd.size.y)) {
 		if (_thd.drawstyle & HT_RECT) {
@@ -669,15 +675,15 @@
 				DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE, ti);
 			}
 		} else if (_thd.drawstyle & HT_POINT) {
-			// Figure out the Z coordinate for the single dot.
+			/* Figure out the Z coordinate for the single dot. */
 			byte z = ti->z;
 			if (ti->tileh & SLOPE_N) {
 				z += TILE_HEIGHT;
 				if (ti->tileh == SLOPE_STEEP_N) z += TILE_HEIGHT;
 			}
-			DrawGroundSpriteAt(_cur_dpi->zoom != 2 ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti->x, ti->y, z);
+			DrawGroundSpriteAt(_cur_dpi->zoom <= ZOOM_LVL_DETAIL ? SPR_DOT : SPR_DOT_SMALL, PAL_NONE, ti->x, ti->y, z);
 		} else if (_thd.drawstyle & HT_RAIL /*&& _thd.place_mode == VHM_RAIL*/) {
-			// autorail highlight piece under cursor
+			/* autorail highlight piece under cursor */
 			uint type = _thd.drawstyle & 0xF;
 			int offset;
 
@@ -695,7 +701,7 @@
 			DrawSelectionSprite(image, _thd.make_square_red ? PALETTE_SEL_TILE_RED : pal, ti);
 
 		} else if (IsPartOfAutoLine(ti->x, ti->y)) {
-			// autorail highlighting long line
+			/* autorail highlighting long line */
 			int dir = _thd.drawstyle & ~0xF0;
 			int offset;
 			uint side;
@@ -721,12 +727,12 @@
 		return;
 	}
 
-	// Check if it's inside the outer area?
+	/* Check if it's inside the outer area? */
 	if (_thd.outersize.x &&
 			_thd.size.x < _thd.size.x + _thd.outersize.x &&
 			IS_INSIDE_1D(ti->x, _thd.pos.x + _thd.offs.x, _thd.size.x + _thd.outersize.x) &&
 			IS_INSIDE_1D(ti->y, _thd.pos.y + _thd.offs.y, _thd.size.y + _thd.outersize.y)) {
-		// Draw a blue rect.
+		/* Draw a blue rect. */
 		DrawSelectionSprite(SPR_SELECT_TILE + _tileh_to_sprite[ti->tileh], PALETTE_SEL_TILE_BLUE, ti);
 		return;
 	}
@@ -741,11 +747,11 @@
 
 	_cur_ti = &ti;
 
-	// Transform into tile coordinates and round to closest full tile
+	/* Transform into tile coordinates and round to closest full tile */
 	x = ((vd->dpi.top >> 1) - (vd->dpi.left >> 2)) & ~0xF;
 	y = ((vd->dpi.top >> 1) + (vd->dpi.left >> 2) - 0x10) & ~0xF;
 
-	// determine size of area
+	/* determine size of area */
 	{
 		Point pt = RemapCoords(x, y, 241);
 		width = (vd->dpi.left + vd->dpi.width - pt.x + 95) >> 6;
@@ -805,7 +811,7 @@
 	Town *t;
 	int left, top, right, bottom;
 
-	if (!(_display_opt & DO_SHOW_TOWN_NAMES) || _game_mode == GM_MENU)
+	if (!HASBIT(_display_opt, DO_SHOW_TOWN_NAMES) || _game_mode == GM_MENU)
 		return;
 
 	left = dpi->left;
@@ -814,7 +820,7 @@
 	bottom = top + dpi->height;
 
 	switch (dpi->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			FOR_ALL_TOWNS(t) {
 				if (bottom > t->sign.top &&
 						top    < t->sign.top + 12 &&
@@ -827,7 +833,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			right += 2;
 			bottom += 2;
 
@@ -843,21 +849,26 @@
 			}
 			break;
 
-		default: NOT_REACHED();
-		case 2:
-			right += 4;
-			bottom += 5;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			right += ScaleByZoom(1, dpi->zoom);
+			bottom += ScaleByZoom(1, dpi->zoom) + 1;
 
 			FOR_ALL_TOWNS(t) {
 				if (bottom > t->sign.top &&
-						top    < t->sign.top + 24 &&
+						top    < t->sign.top + ScaleByZoom(12, dpi->zoom) &&
 						right  > t->sign.left &&
-						left   < t->sign.left + t->sign.width_2*4) {
+						left   < t->sign.left + ScaleByZoom(t->sign.width_2, dpi->zoom)) {
 					AddStringToDraw(t->sign.left + 5, t->sign.top + 1, STR_TOWN_LABEL_TINY_BLACK, t->index, 0);
 					AddStringToDraw(t->sign.left + 1, t->sign.top - 3, STR_TOWN_LABEL_TINY_WHITE, t->index, 0);
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 }
 
@@ -879,7 +890,7 @@
 	int left, top, right, bottom;
 	const Station *st;
 
-	if (!(_display_opt & DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
+	if (!HASBIT(_display_opt, DO_SHOW_STATION_NAMES) || _game_mode == GM_MENU)
 		return;
 
 	left = dpi->left;
@@ -888,7 +899,7 @@
 	bottom = top + dpi->height;
 
 	switch (dpi->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			FOR_ALL_STATIONS(st) {
 				if (bottom > st->sign.top &&
 						top    < st->sign.top + 12 &&
@@ -899,7 +910,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			right += 2;
 			bottom += 2;
 			FOR_ALL_STATIONS(st) {
@@ -912,19 +923,25 @@
 			}
 			break;
 
-		default: NOT_REACHED();
-		case 2:
-			right += 4;
-			bottom += 5;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			right += ScaleByZoom(1, dpi->zoom);
+			bottom += ScaleByZoom(1, dpi->zoom) + 1;
+
 			FOR_ALL_STATIONS(st) {
 				if (bottom > st->sign.top &&
-						top    < st->sign.top + 24 &&
+						top    < st->sign.top + ScaleByZoom(12, dpi->zoom) &&
 						right  > st->sign.left &&
-						left   < st->sign.left + st->sign.width_2*4) {
+						left   < st->sign.left + ScaleByZoom(st->sign.width_2, dpi->zoom)) {
 					AddStation(st, STR_STATION_SIGN_TINY, st->sign.width_2 | 0x8000);
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 }
 
@@ -946,7 +963,7 @@
 	const Sign *si;
 	int left, top, right, bottom;
 
-	if (!(_display_opt & DO_SHOW_SIGNS))
+	if (!HASBIT(_display_opt, DO_SHOW_SIGNS))
 		return;
 
 	left = dpi->left;
@@ -955,7 +972,7 @@
 	bottom = top + dpi->height;
 
 	switch (dpi->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			FOR_ALL_SIGNS(si) {
 				if (bottom > si->sign.top &&
 						top    < si->sign.top + 12 &&
@@ -966,7 +983,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			right += 2;
 			bottom += 2;
 			FOR_ALL_SIGNS(si) {
@@ -979,19 +996,25 @@
 			}
 			break;
 
-		default: NOT_REACHED();
-		case 2:
-			right += 4;
-			bottom += 5;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			right += ScaleByZoom(1, dpi->zoom);
+			bottom += ScaleByZoom(1, dpi->zoom) + 1;
+
 			FOR_ALL_SIGNS(si) {
 				if (bottom > si->sign.top &&
-						top    < si->sign.top + 24 &&
+						top    < si->sign.top + ScaleByZoom(12, dpi->zoom) &&
 						right  > si->sign.left &&
-						left   < si->sign.left + si->sign.width_2 * 4) {
+						left   < si->sign.left + ScaleByZoom(si->sign.width_2, dpi->zoom)) {
 					AddSign(si, STR_2002, si->sign.width_2 | 0x8000);
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 }
 
@@ -1013,7 +1036,7 @@
 	const Waypoint *wp;
 	int left, top, right, bottom;
 
-	if (!(_display_opt & DO_WAYPOINTS))
+	if (!HASBIT(_display_opt, DO_WAYPOINTS))
 		return;
 
 	left = dpi->left;
@@ -1022,7 +1045,7 @@
 	bottom = top + dpi->height;
 
 	switch (dpi->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			FOR_ALL_WAYPOINTS(wp) {
 				if (bottom > wp->sign.top &&
 						top    < wp->sign.top + 12 &&
@@ -1033,7 +1056,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			right += 2;
 			bottom += 2;
 			FOR_ALL_WAYPOINTS(wp) {
@@ -1046,19 +1069,25 @@
 			}
 			break;
 
-		default: NOT_REACHED();
-		case 2:
-			right += 4;
-			bottom += 5;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			right += ScaleByZoom(1, dpi->zoom);
+			bottom += ScaleByZoom(1, dpi->zoom) + 1;
+
 			FOR_ALL_WAYPOINTS(wp) {
 				if (bottom > wp->sign.top &&
-						top    < wp->sign.top + 24 &&
+						top    < wp->sign.top + ScaleByZoom(12, dpi->zoom) &&
 						right  > wp->sign.left &&
-						left   < wp->sign.left + wp->sign.width_2*4) {
+						left   < wp->sign.left + ScaleByZoom(wp->sign.width_2, dpi->zoom)) {
 					AddWaypoint(wp, STR_WAYPOINT_VIEWPORT_TINY, wp->sign.width_2 | 0x8000);
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 }
 
@@ -1135,7 +1164,7 @@
 					}
 				}
 
-				// Swap the two sprites ps and ps2 using bubble-sort algorithm.
+				/* Swap the two sprites ps and ps2 using bubble-sort algorithm. */
 				psd3 = psd;
 				do {
 					ParentSpriteToDraw* temp = *psd3;
@@ -1169,25 +1198,25 @@
 static void ViewportDrawStrings(DrawPixelInfo *dpi, const StringSpriteToDraw *ss)
 {
 	DrawPixelInfo dp;
-	byte zoom;
+	ZoomLevel zoom;
 
 	_cur_dpi = &dp;
 	dp = *dpi;
 
 	zoom = dp.zoom;
-	dp.zoom = 0;
-
-	dp.left >>= zoom;
-	dp.top >>= zoom;
-	dp.width >>= zoom;
-	dp.height >>= zoom;
+	dp.zoom = ZOOM_LVL_NORMAL;
+
+	dp.left   = UnScaleByZoom(dp.left,   zoom);
+	dp.top    = UnScaleByZoom(dp.top,    zoom);
+	dp.width  = UnScaleByZoom(dp.width,  zoom);
+	dp.height = UnScaleByZoom(dp.height, zoom);
 
 	do {
 		uint16 colour;
 
 		if (ss->width != 0) {
-			int x = (ss->x >> zoom) - 1;
-			int y = (ss->y >> zoom) - 1;
+			int x = UnScaleByZoom(ss->x, zoom) - 1;
+			int y = UnScaleByZoom(ss->y, zoom) - 1;
 			int bottom = y + 11;
 			int w = ss->width;
 
@@ -1200,21 +1229,19 @@
 
 		/* Draw the rectangle if 'tranparent station signs' is off,
 		 * or if we are drawing a general text sign (STR_2806) */
-			if (!(_display_opt & DO_TRANS_SIGNS) || ss->string == STR_2806)
+			if (!HASBIT(_transparent_opt, TO_SIGNS) || ss->string == STR_2806) {
 				DrawFrameRect(
 					x, y, x + w, bottom, ss->color,
-					(_display_opt & DO_TRANS_BUILDINGS) ? FR_TRANSPARENT : FR_NONE
+					HASBIT(_transparent_opt, TO_SIGNS) ? FR_TRANSPARENT : FR_NONE
 				);
+			}
 		}
 
 		SetDParam(0, ss->params[0]);
 		SetDParam(1, ss->params[1]);
 		/* if we didn't draw a rectangle, or if transparant building is on,
 		 * draw the text in the color the rectangle would have */
-		if ((
-					(_display_opt & DO_TRANS_BUILDINGS) ||
-					(_display_opt & DO_TRANS_SIGNS && ss->string != STR_2806)
-				) && ss->width != 0) {
+		if (HASBIT(_transparent_opt, TO_SIGNS) && ss->string != STR_2806 && ss->width != 0) {
 			/* Real colors need the IS_PALETTE_COLOR flag
 			 * otherwise colors from _string_colormap are assumed. */
 			colour = _colour_gradient[ss->color][6] | IS_PALETTE_COLOR;
@@ -1222,7 +1249,7 @@
 			colour = 16;
 		}
 		DrawString(
-			ss->x >> zoom, (ss->y >> zoom) - (ss->width & 0x8000 ? 2 : 0),
+			UnScaleByZoom(ss->x, zoom), UnScaleByZoom(ss->y, zoom) - (ss->width & 0x8000 ? 2 : 0),
 			ss->string, colour
 		);
 
@@ -1247,7 +1274,7 @@
 	_cur_dpi = &vd.dpi;
 
 	vd.dpi.zoom = vp->zoom;
-	mask = (-1) << vp->zoom;
+	mask = ScaleByZoom(-1, vp->zoom);
 
 	vd.combine_sprites = 0;
 
@@ -1257,8 +1284,8 @@
 	vd.dpi.top = top & mask;
 	vd.dpi.pitch = old_dpi->pitch;
 
-	x = ((vd.dpi.left - (vp->virtual_left&mask)) >> vp->zoom) + vp->left;
-	y = ((vd.dpi.top - (vp->virtual_top&mask)) >> vp->zoom) + vp->top;
+	x = UnScaleByZoom(vd.dpi.left - (vp->virtual_left & mask), vp->zoom) + vp->left;
+	y = UnScaleByZoom(vd.dpi.top - (vp->virtual_top & mask), vp->zoom) + vp->top;
 
 	vd.dpi.dst_ptr = old_dpi->dst_ptr + x - old_dpi->left + (y - old_dpi->top) * old_dpi->pitch;
 
@@ -1280,8 +1307,8 @@
 	ViewportAddSigns(&vd.dpi);
 	ViewportAddWaypoints(&vd.dpi);
 
-	// This assert should never happen (because the length of the parent_list
-	//  is checked)
+	/* This assert should never happen (because the length of the parent_list
+	 *  is checked) */
 	assert(vd.parent_list <= endof(parent_list));
 
 	if (vd.first_tile != NULL) ViewportDrawTileSprites(vd.first_tile);
@@ -1297,11 +1324,11 @@
 	_cur_dpi = old_dpi;
 }
 
-// Make sure we don't draw a too big area at a time.
-// If we do, the sprite memory will overflow.
+/** Make sure we don't draw a too big area at a time.
+ * If we do, the sprite memory will overflow. */
 static void ViewportDrawChk(const ViewPort *vp, int left, int top, int right, int bottom)
 {
-	if (((bottom - top) * (right - left) << (2 * vp->zoom)) > 180000) {
+	if (ScaleByZoom(bottom - top, vp->zoom) * ScaleByZoom(right - left, vp->zoom) > 180000) {
 		if ((bottom - top) > (right - left)) {
 			int t = (top + bottom) >> 1;
 			ViewportDrawChk(vp, left, top, right, t);
@@ -1313,10 +1340,10 @@
 		}
 	} else {
 		ViewportDoDraw(vp,
-			((left - vp->left) << vp->zoom) + vp->virtual_left,
-			((top - vp->top) << vp->zoom) + vp->virtual_top,
-			((right - vp->left) << vp->zoom) + vp->virtual_left,
-			((bottom - vp->top) << vp->zoom) + vp->virtual_top
+			ScaleByZoom(left - vp->left, vp->zoom) + vp->virtual_left,
+			ScaleByZoom(top - vp->top, vp->zoom) + vp->virtual_top,
+			ScaleByZoom(right - vp->left, vp->zoom) + vp->virtual_left,
+			ScaleByZoom(bottom - vp->top, vp->zoom) + vp->virtual_top
 		);
 	}
 }
@@ -1366,20 +1393,39 @@
 		int vx;
 		int vy;
 
-		// Center of the viewport is hot spot
+		/* Center of the viewport is hot spot */
 		x = WP(w,vp_d).scrollpos_x + vp->virtual_width / 2;
 		y = WP(w,vp_d).scrollpos_y + vp->virtual_height / 2;
-		// Convert viewport coordinates to map coordinates
-		// Calculation is scaled by 4 to avoid rounding errors
+
+		int dest_x = WP(w,vp_d).dest_scrollpos_x + vp->virtual_width / 2;
+		int dest_y = WP(w,vp_d).dest_scrollpos_y + vp->virtual_height / 2;
+
+		int delta_x = dest_x - x;
+		int delta_y = dest_y - y;
+
+		if (delta_x != 0 || delta_y != 0) {
+			if (_patches.smooth_scroll) {
+				int max_scroll = ScaleByMapSize1D(512);
+				/* Not at our desired positon yet... */
+				x += clamp(delta_x / 8, -max_scroll, max_scroll);
+				y += clamp(delta_y / 8, -max_scroll, max_scroll);
+			} else {
+				x = dest_x;
+				y = dest_y;
+			}
+		}
+
+		/* Convert viewport coordinates to map coordinates
+		 * Calculation is scaled by 4 to avoid rounding errors */
 		vx = -x + y * 2;
 		vy =  x + y * 2;
-		// clamp to size of map
+		/* clamp to size of map */
 		vx = clamp(vx, 0 * 4, MapMaxX() * TILE_SIZE * 4);
 		vy = clamp(vy, 0 * 4, MapMaxY() * TILE_SIZE * 4);
-		// Convert map coordinates to viewport coordinates
+		/* Convert map coordinates to viewport coordinates */
 		x = (-vx + vy) / 2;
 		y = ( vx + vy) / 4;
-		// Set position
+		/* Set position */
 		WP(w, vp_d).scrollpos_x = x - vp->virtual_width / 2;
 		WP(w, vp_d).scrollpos_y = y - vp->virtual_height / 2;
 
@@ -1404,10 +1450,10 @@
 	if (top >= vp->virtual_height) return;
 
 	SetDirtyBlocks(
-		(left >> vp->zoom) + vp->left,
-		(top >> vp->zoom) + vp->top,
-		(right >> vp->zoom) + vp->left,
-		(bottom >> vp->zoom) + vp->top
+		UnScaleByZoom(left, vp->zoom) + vp->left,
+		UnScaleByZoom(top, vp->zoom) + vp->top,
+		UnScaleByZoom(right, vp->zoom) + vp->left,
+		UnScaleByZoom(bottom, vp->zoom) + vp->top
 	);
 }
 
@@ -1495,10 +1541,10 @@
 {
 	const Town *t;
 
-	if (!(_display_opt & DO_SHOW_TOWN_NAMES)) return false;
+	if (!HASBIT(_display_opt, DO_SHOW_TOWN_NAMES)) return false;
 
 	switch (vp->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			x = x - vp->left + vp->virtual_left;
 			y = y - vp->top  + vp->virtual_top;
 			FOR_ALL_TOWNS(t) {
@@ -1512,7 +1558,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			x = (x - vp->left + 1) * 2 + vp->virtual_left;
 			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
 			FOR_ALL_TOWNS(t) {
@@ -1526,19 +1572,26 @@
 			}
 			break;
 
-		default:
-			x = (x - vp->left + 3) * 4 + vp->virtual_left;
-			y = (y - vp->top  + 3) * 4 + vp->virtual_top;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
 			FOR_ALL_TOWNS(t) {
 				if (y >= t->sign.top &&
-						y < t->sign.top + 24 &&
+						y < t->sign.top + ScaleByZoom(12, vp->zoom) &&
 						x >= t->sign.left &&
-						x < t->sign.left + t->sign.width_2 * 4) {
+						x < t->sign.left + ScaleByZoom(t->sign.width_2, vp->zoom)) {
 					ShowTownViewWindow(t->index);
 					return true;
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 
 	return false;
@@ -1549,10 +1602,10 @@
 {
 	const Station *st;
 
-	if (!(_display_opt & DO_SHOW_STATION_NAMES)) return false;
+	if (!HASBIT(_display_opt, DO_SHOW_STATION_NAMES)) return false;
 
 	switch (vp->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			x = x - vp->left + vp->virtual_left;
 			y = y - vp->top  + vp->virtual_top;
 			FOR_ALL_STATIONS(st) {
@@ -1566,7 +1619,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			x = (x - vp->left + 1) * 2 + vp->virtual_left;
 			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
 			FOR_ALL_STATIONS(st) {
@@ -1580,19 +1633,26 @@
 			}
 			break;
 
-		default:
-			x = (x - vp->left + 3) * 4 + vp->virtual_left;
-			y = (y - vp->top  + 3) * 4 + vp->virtual_top;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
 			FOR_ALL_STATIONS(st) {
 				if (y >= st->sign.top &&
-						y < st->sign.top + 24 &&
+						y < st->sign.top + ScaleByZoom(12, vp->zoom) &&
 						x >= st->sign.left &&
-						x < st->sign.left + st->sign.width_2 * 4) {
+						x < st->sign.left + ScaleByZoom(st->sign.width_2, vp->zoom)) {
 					ShowStationViewWindow(st->index);
 					return true;
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 
 	return false;
@@ -1603,10 +1663,10 @@
 {
 	const Sign *si;
 
-	if (!(_display_opt & DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
+	if (!HASBIT(_display_opt, DO_SHOW_SIGNS) || _current_player == PLAYER_SPECTATOR) return false;
 
 	switch (vp->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			x = x - vp->left + vp->virtual_left;
 			y = y - vp->top  + vp->virtual_top;
 			FOR_ALL_SIGNS(si) {
@@ -1620,7 +1680,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			x = (x - vp->left + 1) * 2 + vp->virtual_left;
 			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
 			FOR_ALL_SIGNS(si) {
@@ -1634,19 +1694,26 @@
 			}
 			break;
 
-		default:
-			x = (x - vp->left + 3) * 4 + vp->virtual_left;
-			y = (y - vp->top  + 3) * 4 + vp->virtual_top;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
 			FOR_ALL_SIGNS(si) {
 				if (y >= si->sign.top &&
-						y <  si->sign.top + 24 &&
+						y <  si->sign.top + ScaleByZoom(12, vp->zoom) &&
 						x >= si->sign.left &&
-						x <  si->sign.left + si->sign.width_2 * 4) {
+						x <  si->sign.left + ScaleByZoom(si->sign.width_2, vp->zoom)) {
 					ShowRenameSignWindow(si);
 					return true;
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 
 	return false;
@@ -1657,10 +1724,10 @@
 {
 	const Waypoint *wp;
 
-	if (!(_display_opt & DO_WAYPOINTS)) return false;
+	if (!HASBIT(_display_opt, DO_WAYPOINTS)) return false;
 
 	switch (vp->zoom) {
-		case 0:
+		case ZOOM_LVL_NORMAL:
 			x = x - vp->left + vp->virtual_left;
 			y = y - vp->top  + vp->virtual_top;
 			FOR_ALL_WAYPOINTS(wp) {
@@ -1674,7 +1741,7 @@
 			}
 			break;
 
-		case 1:
+		case ZOOM_LVL_OUT_2X:
 			x = (x - vp->left + 1) * 2 + vp->virtual_left;
 			y = (y - vp->top  + 1) * 2 + vp->virtual_top;
 			FOR_ALL_WAYPOINTS(wp) {
@@ -1688,19 +1755,26 @@
 			}
 			break;
 
-		default:
-			x = (x - vp->left + 3) * 4 + vp->virtual_left;
-			y = (y - vp->top  + 3) * 4 + vp->virtual_top;
+		case ZOOM_LVL_OUT_4X:
+		case ZOOM_LVL_OUT_8X:
+			x = ScaleByZoom(x - vp->left + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_left;
+			y = ScaleByZoom(y - vp->top  + ScaleByZoom(1, vp->zoom) - 1, vp->zoom) + vp->virtual_top;
+
 			FOR_ALL_WAYPOINTS(wp) {
 				if (y >= wp->sign.top &&
-						y < wp->sign.top + 24 &&
+						y < wp->sign.top + ScaleByZoom(12, vp->zoom) &&
 						x >= wp->sign.left &&
-						x < wp->sign.left + wp->sign.width_2 * 4) {
+						x < wp->sign.left + ScaleByZoom(wp->sign.width_2, vp->zoom)) {
 					ShowRenameWaypointWindow(wp);
 					return true;
 				}
 			}
 			break;
+
+		case ZOOM_LVL_OUT_16X:
+			break;
+
+		default: NOT_REACHED();
 	}
 
 	return false;
@@ -1796,26 +1870,31 @@
 
 
 /* scrolls the viewport in a window to a given location */
-bool ScrollWindowTo(int x , int y, Window *w)
+bool ScrollWindowTo(int x , int y, Window *w, bool instant)
 {
 	Point pt;
 
 	pt = MapXYZToViewport(w->viewport, x, y, GetSlopeZ(x, y));
 	WP(w, vp_d).follow_vehicle = INVALID_VEHICLE;
 
-	if (WP(w, vp_d).scrollpos_x == pt.x && WP(w, vp_d).scrollpos_y == pt.y)
+	if (WP(w, vp_d).dest_scrollpos_x == pt.x && WP(w, vp_d).dest_scrollpos_y == pt.y)
 		return false;
 
-	WP(w, vp_d).scrollpos_x = pt.x;
-	WP(w, vp_d).scrollpos_y = pt.y;
+	if (instant) {
+		WP(w, vp_d).scrollpos_x = pt.x;
+		WP(w, vp_d).scrollpos_y = pt.y;
+	}
+
+	WP(w, vp_d).dest_scrollpos_x = pt.x;
+	WP(w, vp_d).dest_scrollpos_y = pt.y;
 	return true;
 }
 
 
-bool ScrollMainWindowTo(int x, int y)
+bool ScrollMainWindowTo(int x, int y, bool instant)
 {
 	Window *w;
-	bool res = ScrollWindowTo(x, y, FindWindowById(WC_MAIN_WINDOW, 0));
+	bool res = ScrollWindowTo(x, y, FindWindowById(WC_MAIN_WINDOW, 0), instant);
 
 	/* If a user scrolls to a tile (via what way what so ever) and already is on
 	 *  that tile (e.g.: pressed twice), move the smallmap to that location,
@@ -1832,9 +1911,9 @@
 }
 
 
-bool ScrollMainWindowToTile(TileIndex tile)
+bool ScrollMainWindowToTile(TileIndex tile, bool instant)
 {
-	return ScrollMainWindowTo(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2);
+	return ScrollMainWindowTo(TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, instant);
 }
 
 void SetRedErrorSquare(TileIndex tile)
@@ -1866,13 +1945,13 @@
 	_thd.new_outersize.y = sy * TILE_SIZE;
 }
 
-/* returns the best autorail highlight type from map coordinates */
+/** returns the best autorail highlight type from map coordinates */
 static byte GetAutorailHT(int x, int y)
 {
 	return HT_RAIL | _AutorailPiece[x & 0xF][y & 0xF];
 }
 
-// called regular to update tile highlighting in all cases
+/** called regular to update tile highlighting in all cases */
 void UpdateTileSelection()
 {
 	int x1;
@@ -1919,13 +1998,13 @@
 		}
 	}
 
-	// redraw selection
+	/* redraw selection */
 	if (_thd.drawstyle != _thd.new_drawstyle ||
 			_thd.pos.x != _thd.new_pos.x || _thd.pos.y != _thd.new_pos.y ||
 			_thd.size.x != _thd.new_size.x || _thd.size.y != _thd.new_size.y ||
 	    _thd.outersize.x != _thd.new_outersize.x ||
 	    _thd.outersize.y != _thd.new_outersize.y) {
-		// clear the old selection?
+		/* clear the old selection? */
 		if (_thd.drawstyle) SetSelectionTilesDirty();
 
 		_thd.drawstyle = _thd.new_drawstyle;
@@ -1934,15 +2013,16 @@
 		_thd.outersize = _thd.new_outersize;
 		_thd.dirty = 0xff;
 
-		// draw the new selection?
+		/* draw the new selection? */
 		if (_thd.new_drawstyle) SetSelectionTilesDirty();
 	}
 }
 
-// highlighting tiles while only going over them with the mouse
-void VpStartPlaceSizing(TileIndex tile, int user)
+/** highlighting tiles while only going over them with the mouse */
+void VpStartPlaceSizing(TileIndex tile, byte method, byte process)
 {
-	_thd.userdata = user;
+	_thd.select_method = method;
+	_thd.select_proc   = process;
 	_thd.selend.x = TileX(tile) * TILE_SIZE;
 	_thd.selstart.x = TileX(tile) * TILE_SIZE;
 	_thd.selend.y = TileY(tile) * TILE_SIZE;
@@ -1989,7 +2069,7 @@
 	_special_mouse_mode = WSM_PRESIZE;
 }
 
-/* returns information about the 2x1 piece to be build.
+/** returns information about the 2x1 piece to be build.
  * The lower bits (0-3) are the track type. */
 static byte Check2x1AutoRail(int mode)
 {
@@ -2031,8 +2111,9 @@
  * north-south (DIR_S) to obtain the same results with less code. This is what
  * the return value signifies.
  * @param style HighLightStyle dragging style
- * @param start_tile, end_tile start and end tile of drag
- * @param boolean value which when true means start/end should be swapped */
+ * @param start_tile start tile of drag
+ * @param end_tile end tile of drag
+ * @return boolean value which when true means start/end should be swapped */
 static bool SwapDirection(HighLightStyle style, TileIndex start_tile, TileIndex end_tile)
 {
 	uint start_x = TileX(start_tile);
@@ -2057,7 +2138,7 @@
 * To correctly get the height difference we need the direction we are dragging
 * in, as well as with what kind of tool we are dragging. For example a horizontal
 * autorail tool that starts in bottom and ends at the top of a tile will need the
-* maximum of SW,S and SE,N corners respectively. This is handled by the lookup table below
+* maximum of SW, S and SE, N corners respectively. This is handled by the lookup table below
 * See _tileoffs_by_dir in map.c for the direction enums if you can't figure out
 * the values yourself.
 * @param style HightlightStyle of drag. This includes direction and style (autorail, rect, etc.)
@@ -2140,7 +2221,7 @@
 
 static const StringID measure_strings_length[] = {STR_NULL, STR_MEASURE_LENGTH, STR_MEASURE_LENGTH_HEIGHTDIFF};
 
-// while dragging
+/** while dragging */
 static void CalcRaildirsDrawstyle(TileHighlightData *thd, int x, int y, int method)
 {
 	HighLightStyle b;
@@ -2391,7 +2472,7 @@
 	_thd.selend.y = y;
 }
 
-// while dragging
+/** while dragging */
 bool VpHandlePlaceSizingDrag()
 {
 	Window *w;
@@ -2399,16 +2480,17 @@
 
 	if (_special_mouse_mode != WSM_SIZING) return true;
 
-	e.we.place.userdata = _thd.userdata;
-
-	// stop drag mode if the window has been closed
-	w = FindWindowById(_thd.window_class,_thd.window_number);
+	e.we.place.select_method = _thd.select_method;
+	e.we.place.select_proc   = _thd.select_proc;
+
+	/* stop drag mode if the window has been closed */
+	w = FindWindowById(_thd.window_class, _thd.window_number);
 	if (w == NULL) {
 		ResetObjectToPlace();
 		return false;
 	}
 
-	// while dragging execute the drag procedure of the corresponding window (mostly VpSelectTilesWithMethod() )
+	/* while dragging execute the drag procedure of the corresponding window (mostly VpSelectTilesWithMethod() ) */
 	if (_left_button_down) {
 		e.event = WE_PLACE_DRAG;
 		e.we.place.pt = GetTileBelowCursor();
@@ -2416,12 +2498,12 @@
 		return false;
 	}
 
-	// mouse button released..
-	// keep the selected tool, but reset it to the original mode.
+	/* mouse button released..
+	 * keep the selected tool, but reset it to the original mode. */
 	_special_mouse_mode = WSM_NONE;
 	if (_thd.next_drawstyle == HT_RECT) {
 		_thd.place_mode = VHM_RECT;
-	} else if ((e.we.place.userdata & 0xF) == VPM_SIGNALDIRS) { // some might call this a hack... -- Dominik
+	} else if (e.we.place.select_method == VPM_SIGNALDIRS) { // some might call this a hack... -- Dominik
 		_thd.place_mode = VHM_RECT;
 	} else if (_thd.next_drawstyle & HT_LINE) {
 		_thd.place_mode = VHM_RAIL;
@@ -2432,7 +2514,7 @@
 	}
 	SetTileSelectSize(1, 1);
 
-	// and call the mouseup event.
+	/* and call the mouseup event. */
 	e.event = WE_PLACE_MOUSEUP;
 	e.we.place.pt = _thd.selend;
 	e.we.place.tile = TileVirtXY(e.we.place.pt.x, e.we.place.pt.y);
@@ -2453,7 +2535,7 @@
 {
 	Window *w;
 
-	// undo clicking on button
+	/* undo clicking on button */
 	if (_thd.place_mode != 0) {
 		_thd.place_mode = 0;
 		w = FindWindowById(_thd.window_class, _thd.window_number);
--- a/src/viewport.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/viewport.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,8 +1,12 @@
 /* $Id$ */
 
+/** @file viewport.h */
+
 #ifndef VIEWPORT_H
 #define VIEWPORT_H
 
+#include "zoom.hpp"
+
 struct ViewPort {
 	int left,top;                       // screen coordinates for the viewport
 	int width, height;                  // screen width/height for the viewport
@@ -10,16 +14,16 @@
 	int virtual_left, virtual_top;      // virtual coordinates
 	int virtual_width, virtual_height;  // these are just width << zoom, height << zoom
 
-	byte zoom;
+	ZoomLevel zoom;
 };
 
 void SetSelectionRed(bool);
 
-/* viewport.c */
+/* viewport.cpp */
 void InitViewports();
 void DeleteWindowViewport(Window *w);
 void AssignWindowViewport(Window *w, int x, int y,
-	int width, int height, uint32 follow_flags, byte zoom);
+	int width, int height, uint32 follow_flags, ZoomLevel zoom);
 ViewPort *IsPtInWindowViewport(const Window *w, int x, int y);
 Point GetTileBelowCursor();
 void UpdateViewportPosition(Window *w);
@@ -58,7 +62,7 @@
 void SetTileSelectSize(int w, int h);
 void SetTileSelectBigSize(int ox, int oy, int sx, int sy);
 
-void VpStartPlaceSizing(TileIndex tile, int user);
+void VpStartPlaceSizing(TileIndex tile, byte method, byte process);
 void VpSetPresizeRange(uint from, uint to);
 void VpSetPlaceSizingLimit(int limit);
 
@@ -74,28 +78,28 @@
 	VPM_SIGNALDIRS      = 6
 };
 
-// viewport highlight mode (for highlighting tiles below cursor)
+/* viewport highlight mode (for highlighting tiles below cursor) */
 enum {
-	VHM_NONE    = 0, // default
-	VHM_RECT    = 1, // rectangle (stations, depots, ...)
-	VHM_POINT   = 2, // point (lower land, raise land, level land, ...)
-	VHM_SPECIAL = 3, // special mode used for highlighting while dragging (and for tunnels/docks)
-	VHM_DRAG    = 4, // dragging items in the depot windows
-	VHM_RAIL    = 5, // rail pieces
+	VHM_NONE    = 0, ///< default
+	VHM_RECT    = 1, ///< rectangle (stations, depots, ...)
+	VHM_POINT   = 2, ///< point (lower land, raise land, level land, ...)
+	VHM_SPECIAL = 3, ///< special mode used for highlighting while dragging (and for tunnels/docks)
+	VHM_DRAG    = 4, ///< dragging items in the depot windows
+	VHM_RAIL    = 5, ///< rail pieces
 };
 
 void VpSelectTilesWithMethod(int x, int y, int method);
 
-// highlighting draw styles
+/* highlighting draw styles */
 typedef byte HighLightStyle;
 enum HighLightStyles {
 	HT_NONE   = 0x00,
 	HT_RECT   = 0x80,
 	HT_POINT  = 0x40,
-	HT_LINE   = 0x20, /* used for autorail highlighting (longer streches)
-	                   * (uses lower bits to indicate direction) */
-	HT_RAIL   = 0x10, /* autorail (one piece)
-	                  * (uses lower bits to indicate direction) */
+	HT_LINE   = 0x20,    ///< used for autorail highlighting (longer streches)
+	                     ///< (uses lower bits to indicate direction)
+	HT_RAIL   = 0x10,    ///< autorail (one piece)
+	                     ///< (uses lower bits to indicate direction)
 	HT_DRAG_MASK = 0xF0, ///< masks the drag-type
 
 	/* lower bits (used with HT_LINE and HT_RAIL):
@@ -136,12 +140,14 @@
 	WindowClass window_class;
 	WindowNumber window_number;
 
-	int userdata;
+	byte select_method;
+	byte select_proc;
+
 	TileIndex redsq;
 };
 
 
-// common button handler
+/* common button handler */
 bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, int mode, PlaceProc *placeproc);
 
 VARDEF Point _tile_fract_coords;
--- a/src/void_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/void_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,8 +1,14 @@
 /* $Id$ */
 
+/** @file void_map.h */
+
 #ifndef VOID_MAP_H
 #define VOID_MAP_H
 
+/**
+ * Make a nice void tile ;)
+ * @param t the tile to make void
+ */
 static inline void MakeVoid(TileIndex t)
 {
 	SetTileType(t, MP_VOID);
--- a/src/water_cmd.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/water_cmd.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file water_cmd.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "bridge_map.h"
@@ -9,6 +11,7 @@
 #include "table/sprites.h"
 #include "table/strings.h"
 #include "functions.h"
+#include "landscape.h"
 #include "map.h"
 #include "tile.h"
 #include "vehicle.h"
@@ -22,6 +25,7 @@
 #include "train.h"
 #include "water_map.h"
 #include "newgrf.h"
+#include "newgrf_canal.h"
 
 static const SpriteID _water_shore_sprites[] = {
 	0,
@@ -47,6 +51,7 @@
 
 /** Build a ship depot.
  * @param tile tile where ship depot is built
+ * @param flags type of operation
  * @param p1 bit 0 depot orientation (Axis)
  * @param p2 unused
  */
@@ -76,7 +81,7 @@
 	ret = DoCommand(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(ret)) return CMD_ERROR;
 
-	// pretend that we're not making land from the water even though we actually are.
+	/* pretend that we're not making land from the water even though we actually are. */
 	cost = 0;
 
 	depot = AllocateDepot();
@@ -120,25 +125,25 @@
 	return _price.remove_ship_depot;
 }
 
-// build a shiplift
+/** build a shiplift */
 static int32 DoBuildShiplift(TileIndex tile, DiagDirection dir, uint32 flags)
 {
 	int32 ret;
 	int delta;
 
-	// middle tile
+	/* middle tile */
 	ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(ret)) return CMD_ERROR;
 
 	delta = TileOffsByDiagDir(dir);
-	// lower tile
+	/* lower tile */
 	ret = DoCommand(tile - delta, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(ret)) return CMD_ERROR;
 	if (GetTileSlope(tile - delta, NULL) != SLOPE_FLAT) {
 		return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
 	}
 
-	// upper tile
+	/* upper tile */
 	ret = DoCommand(tile + delta, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
 	if (CmdFailed(ret)) return CMD_ERROR;
 	if (GetTileSlope(tile + delta, NULL) != SLOPE_FLAT) {
@@ -167,7 +172,7 @@
 
 	if (!CheckTileOwnership(tile)) return CMD_ERROR;
 
-	// make sure no vehicle is on the tile.
+	/* make sure no vehicle is on the tile. */
 	if (!EnsureNoVehicle(tile) || !EnsureNoVehicle(tile + delta) || !EnsureNoVehicle(tile - delta))
 		return CMD_ERROR;
 
@@ -190,6 +195,7 @@
 
 /** Builds a lock (ship-lift)
  * @param tile tile where to place the lock
+ * @param flags type of operation
  * @param p1 unused
  * @param p2 unused
  */
@@ -211,6 +217,7 @@
 
 /** Build a piece of canal.
  * @param tile end tile of stretch-dragging
+ * @param flags type of operation
  * @param p1 start tile of stretch-dragging
  * @param p2 ctrl pressed - toggles ocean / canals at sealevel (ocean only allowed in the scenario editor)
  */
@@ -249,7 +256,7 @@
 			return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
 		}
 
-		// can't make water of water!
+		/* can't make water of water! */
 		if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || HASBIT(p2, 0))) continue;
 
 		ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
@@ -282,10 +289,10 @@
 		case WATER_TILE_CLEAR:
 			if (flags & DC_NO_WATER) return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
 
-			// Make sure no vehicle is on the tile
+			/* Make sure no vehicle is on the tile */
 			if (!EnsureNoVehicle(tile)) return CMD_ERROR;
 
-			// Make sure it's not an edge tile.
+			/* Make sure it's not an edge tile. */
 			if (!IS_INT_INSIDE(TileX(tile), 1, MapMaxX() - 1) ||
 					!IS_INT_INSIDE(TileY(tile), 1, MapMaxY() - 1)) {
 				return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
@@ -299,10 +306,10 @@
 		case WATER_TILE_COAST: {
 			Slope slope = GetTileSlope(tile, NULL);
 
-			// Make sure no vehicle is on the tile
+			/* Make sure no vehicle is on the tile */
 			if (!EnsureNoVehicle(tile)) return CMD_ERROR;
 
-			// Make sure it's not an edge tile.
+			/* Make sure it's not an edge tile. */
 			if (!IS_INT_INSIDE(TileX(tile), 1, MapMaxX() - 1) ||
 					!IS_INT_INSIDE(TileY(tile), 1, MapMaxY() - 1)) {
 				return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
@@ -325,7 +332,7 @@
 
 			if (flags & DC_AUTO) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
 			if (_current_player == OWNER_WATER) return CMD_ERROR;
-			// move to the middle tile..
+			/* move to the middle tile.. */
 			return RemoveShiplift(tile + ToTileIndexDiff(_shiplift_tomiddle_offs[GetSection(tile)]), flags);
 		}
 
@@ -339,7 +346,7 @@
 	}
 }
 
-// return true if a tile is a water tile.
+/** return true if a tile is a water tile. */
 static bool IsWateredTile(TileIndex tile)
 {
 	switch (GetTileType(tile)) {
@@ -362,44 +369,48 @@
 	}
 }
 
-// draw a canal styled water tile with dikes around
+/** draw a canal styled water tile with dikes around */
 void DrawCanalWater(TileIndex tile)
 {
 	uint wa;
 
-	// determine the edges around with water.
+	/* Test for custom graphics, else use the default */
+	SpriteID dikes_base = GetCanalSprite(CF_DIKES, tile);
+	if (dikes_base == 0) dikes_base = SPR_CANALS_BASE + 57;
+
+	/* determine the edges around with water. */
 	wa = IsWateredTile(TILE_ADDXY(tile, -1, 0)) << 0;
 	wa += IsWateredTile(TILE_ADDXY(tile, 0, 1)) << 1;
 	wa += IsWateredTile(TILE_ADDXY(tile, 1, 0)) << 2;
 	wa += IsWateredTile(TILE_ADDXY(tile, 0, -1)) << 3;
 
-	if (!(wa & 1)) DrawGroundSprite(SPR_CANALS_BASE + 57, PAL_NONE);
-	if (!(wa & 2)) DrawGroundSprite(SPR_CANALS_BASE + 58, PAL_NONE);
-	if (!(wa & 4)) DrawGroundSprite(SPR_CANALS_BASE + 59, PAL_NONE);
-	if (!(wa & 8)) DrawGroundSprite(SPR_CANALS_BASE + 60, PAL_NONE);
+	if (!(wa & 1)) DrawGroundSprite(dikes_base,     PAL_NONE);
+	if (!(wa & 2)) DrawGroundSprite(dikes_base + 1, PAL_NONE);
+	if (!(wa & 4)) DrawGroundSprite(dikes_base + 2, PAL_NONE);
+	if (!(wa & 8)) DrawGroundSprite(dikes_base + 3, PAL_NONE);
 
-	// right corner
+	/* right corner */
 	switch (wa & 0x03) {
-		case 0: DrawGroundSprite(SPR_CANALS_BASE + 57 + 4, PAL_NONE); break;
-		case 3: if (!IsWateredTile(TILE_ADDXY(tile, -1, 1))) DrawGroundSprite(SPR_CANALS_BASE + 57 + 8, PAL_NONE); break;
+		case 0: DrawGroundSprite(dikes_base + 4, PAL_NONE); break;
+		case 3: if (!IsWateredTile(TILE_ADDXY(tile, -1, 1))) DrawGroundSprite(dikes_base + 8, PAL_NONE); break;
 	}
 
-	// bottom corner
+	/* bottom corner */
 	switch (wa & 0x06) {
-		case 0: DrawGroundSprite(SPR_CANALS_BASE + 57 + 5, PAL_NONE); break;
-		case 6: if (!IsWateredTile(TILE_ADDXY(tile, 1, 1))) DrawGroundSprite(SPR_CANALS_BASE + 57 + 9, PAL_NONE); break;
+		case 0: DrawGroundSprite(dikes_base + 5, PAL_NONE); break;
+		case 6: if (!IsWateredTile(TILE_ADDXY(tile, 1, 1))) DrawGroundSprite(dikes_base + 9, PAL_NONE); break;
 	}
 
-	// left corner
+	/* left corner */
 	switch (wa & 0x0C) {
-		case  0: DrawGroundSprite(SPR_CANALS_BASE + 57 + 6, PAL_NONE); break;
-		case 12: if (!IsWateredTile(TILE_ADDXY(tile, 1, -1))) DrawGroundSprite(SPR_CANALS_BASE + 57 + 10, PAL_NONE); break;
+		case  0: DrawGroundSprite(dikes_base + 6, PAL_NONE); break;
+		case 12: if (!IsWateredTile(TILE_ADDXY(tile, 1, -1))) DrawGroundSprite(dikes_base + 10, PAL_NONE); break;
 	}
 
-	// upper corner
+	/* upper corner */
 	switch (wa & 0x09) {
-		case 0: DrawGroundSprite(SPR_CANALS_BASE + 57 + 7, PAL_NONE); break;
-		case 9: if (!IsWateredTile(TILE_ADDXY(tile, -1, -1))) DrawGroundSprite(SPR_CANALS_BASE + 57 + 11, PAL_NONE); break;
+		case 0: DrawGroundSprite(dikes_base + 7, PAL_NONE); break;
+		case 9: if (!IsWateredTile(TILE_ADDXY(tile, -1, -1))) DrawGroundSprite(dikes_base + 11, PAL_NONE); break;
 	}
 }
 
@@ -415,13 +426,31 @@
 	SpriteID palette, uint base
 )
 {
-	DrawGroundSprite(wdts++->image, PAL_NONE);
+	SpriteID image;
+	SpriteID water_base = GetCanalSprite(CF_WATERSLOPE, ti->tile);
+	SpriteID locks_base = GetCanalSprite(CF_LOCKS, ti->tile);
+
+	/* If no custom graphics, use defaults */
+	if (water_base == 0) water_base = SPR_CANALS_BASE + 5;
+	if (locks_base == 0) {
+		locks_base = SPR_CANALS_BASE + 9;
+	} else {
+		/* If using custom graphics, ignore the variation on height */
+		base = 0;
+	}
+
+	image = wdts++->image;
+	if (image < 4) image += water_base;
+	DrawGroundSprite(image, PAL_NONE);
 
 	for (; wdts->delta_x != 0x80; wdts++) {
-		SpriteID image = wdts->image + base;
+		SpriteID image = wdts->image;
 		SpriteID pal;
 
-		if (_display_opt & DO_TRANS_BUILDINGS) {
+		if (image < 24) image += locks_base;
+		image += base;
+
+		if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
 			SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
 			pal = PALETTE_TO_TRANSPARENT;
 		} else {
@@ -524,7 +553,7 @@
 {
 	TileIndex target = TILE_ADD(tile, ToTileIndexDiff(offs[0]));
 
-	// type of this tile mustn't be water already.
+	/* type of this tile mustn't be water already. */
 	if (IsTileType(target, MP_WATER)) return;
 
 	if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[1]))) != 0 ||
@@ -534,7 +563,7 @@
 
 	if (TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[3]))) != 0 ||
 			TileHeight(TILE_ADD(tile, ToTileIndexDiff(offs[4]))) != 0) {
-		// make coast..
+		/* make coast.. */
 		switch (GetTileType(target)) {
 			case MP_RAILWAY: {
 				TrackBits tracks;
@@ -626,7 +655,7 @@
 			u = v;
 			if (IsFrontEngine(v)) pass = 4; // driver
 
-			// crash all wagons, and count passangers
+			/* crash all wagons, and count passangers */
 			BEGIN_ENUM_WAGONS(v)
 				if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) pass += v->cargo_count;
 				v->vehstatus |= VS_CRASHED;
@@ -645,7 +674,7 @@
 
 		SetDParam(0, pass);
 		AddNewsItem(STR_B006_FLOOD_VEHICLE_DESTROYED,
-			NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
+			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
 			v->index,
 			0);
 		CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
@@ -653,7 +682,7 @@
 	}
 }
 
-// called from tunnelbridge_cmd, and by TileLoop_Industry()
+/** called from tunnelbridge_cmd, and by TileLoop_Industry() */
 void TileLoop_Water(TileIndex tile)
 {
 	static const TileIndexDiffC _tile_loop_offs_array[][5] = {
@@ -675,11 +704,10 @@
 			TileLoopWaterHelper(tile, _tile_loop_offs_array[i]);
 		}
 	}
-	// _current_player can be changed by TileLoopWaterHelper.. reset it back
-	//   here
+	/* _current_player can be changed by TileLoopWaterHelper.. reset it back here */
 	_current_player = OWNER_NONE;
 
-	// edges
+	/* edges */
 	if (TileX(tile) == 0 && IS_INT_INSIDE(TileY(tile), 1, MapSizeY() - 3 + 1)) { //NE
 		TileLoopWaterHelper(tile, _tile_loop_offs_array[2]);
 	}
@@ -697,7 +725,7 @@
 	}
 }
 
-static uint32 GetTileTrackStatus_Water(TileIndex tile, TransportType mode)
+static uint32 GetTileTrackStatus_Water(TileIndex tile, TransportType mode, uint sub_mode)
 {
 	static const byte coast_tracks[] = {0, 32, 4, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0};
 
@@ -713,11 +741,11 @@
 		default: return 0;
 	}
 	if (TileX(tile) == 0) {
-		// NE border: remove tracks that connects NE tile edge
+		/* NE border: remove tracks that connects NE tile edge */
 		ts &= ~(TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT);
 	}
 	if (TileY(tile) == 0) {
-		// NW border: remove tracks that connects NW tile edge
+		/* NW border: remove tracks that connects NW tile edge */
 		ts &= ~(TRACK_BIT_Y | TRACK_BIT_LEFT | TRACK_BIT_UPPER);
 	}
 	return ts * 0x101;
--- a/src/water_map.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/water_map.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file water_map.h */
+
 #ifndef WATER_MAP_H
 #define WATER_MAP_H
 
--- a/src/waypoint.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/waypoint.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,11 +1,14 @@
 /* $Id$ */
 
+/** @file waypoint.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 
 #include "command.h"
 #include "functions.h"
 #include "gfx.h"
+#include "landscape.h"
 #include "map.h"
 #include "order.h"
 #include "rail_map.h"
@@ -20,6 +23,7 @@
 #include "vehicle.h"
 #include "yapf/yapf.h"
 #include "date.h"
+#include "newgrf.h"
 
 enum {
 	MAX_WAYPOINTS_PER_TOWN = 64,
@@ -39,7 +43,9 @@
 
 DEFINE_OLD_POOL(Waypoint, Waypoint, WaypointPoolNewBlock, NULL)
 
-/* Create a new waypoint */
+/**
+ * Create a new waypoint
+ * @return a pointer to the newly created Waypoint */
 static Waypoint* AllocateWaypoint()
 {
 	Waypoint *wp;
@@ -63,7 +69,9 @@
 	return NULL;
 }
 
-/* Update the sign for the waypoint */
+/**
+ * Update the sign for the waypoint
+ * @param wp Waypoint to update sign */
 static void UpdateWaypointSign(Waypoint* wp)
 {
 	Point pt = RemapCoords2(TileX(wp->xy) * TILE_SIZE, TileY(wp->xy) * TILE_SIZE);
@@ -71,7 +79,9 @@
 	UpdateViewportSignPos(&wp->sign, pt.x, pt.y - 0x20, STR_WAYPOINT_VIEWPORT);
 }
 
-/* Redraw the sign of a waypoint */
+/**
+ * Redraw the sign of a waypoint
+ * @param wp Waypoint to redraw sign */
 static void RedrawWaypointSign(const Waypoint* wp)
 {
 	MarkAllViewportsDirty(
@@ -81,7 +91,9 @@
 		wp->sign.top + 48);
 }
 
-/* Update all signs */
+/**
+ * Update all signs
+ */
 void UpdateAllWaypointSigns()
 {
 	Waypoint *wp;
@@ -91,7 +103,10 @@
 	}
 }
 
-/* Internal handler to delete a waypoint */
+/**
+ * Internal handler to delete a waypoint
+ * @param wp Waypoint to delete
+ */
 void DestroyWaypoint(Waypoint *wp)
 {
 	RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, wp->index);
@@ -101,7 +116,10 @@
 	RedrawWaypointSign(wp);
 }
 
-/* Set the default name for a waypoint */
+/**
+ * Set the default name for a waypoint
+ * @param wp Waypoint to work on
+ */
 static void MakeDefaultWaypointName(Waypoint* wp)
 {
 	Waypoint *local_wp;
@@ -127,7 +145,10 @@
 	wp->town_cn = i;
 }
 
-/* Find a deleted waypoint close to a tile. */
+/**
+ * Find a deleted waypoint close to a tile.
+ * @param tile to search from
+ */
 static Waypoint *FindDeletedWaypointCloseTo(TileIndex tile)
 {
 	Waypoint *wp, *best = NULL;
@@ -162,7 +183,7 @@
 
 		for (i = 0; i < GetNumCustomStations(STAT_CLASS_WAYP); i++) {
 			const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, i);
-			if (statspec != NULL && statspec->grfid == wp->grfid && statspec->localidx == wp->localidx) {
+			if (statspec != NULL && statspec->grffile->grfid == wp->grfid && statspec->localidx == wp->localidx) {
 				wp->stat_id = i;
 				break;
 			}
@@ -173,6 +194,7 @@
 /** Convert existing rail to waypoint. Eg build a waypoint station over
  * piece of rail
  * @param tile tile where waypoint will be built
+ * @param flags type of operation
  * @param p1 graphics for waypoint type, 0 indicates standard graphics
  * @param p2 unused
  *
@@ -230,10 +252,10 @@
 
 		if (statspec != NULL) {
 			wp->stat_id = p1;
-			wp->grfid = statspec->grfid;
+			wp->grfid = statspec->grffile->grfid;
 			wp->localidx = statspec->localidx;
 		} else {
-			// Specified custom graphics do not exist, so use default.
+			/* Specified custom graphics do not exist, so use default. */
 			wp->stat_id = 0;
 			wp->grfid = 0;
 			wp->localidx = 0;
@@ -253,7 +275,9 @@
 	return _price.build_train_depot;
 }
 
-/* Daily loop for waypoints */
+/**
+ * Daily loop for waypoints
+ */
 void WaypointsDailyLoop()
 {
 	Waypoint *wp;
@@ -264,7 +288,13 @@
 	}
 }
 
-/* Remove a waypoint */
+/**
+ * Remove a waypoint
+ * @param tile from which to remove waypoint
+ * @param flags type of operation
+ * @param justremove will indicate if it is removed from rail or if rails are removed too
+ * @return cost of operation or error
+ */
 int32 RemoveTrainWaypoint(TileIndex tile, uint32 flags, bool justremove)
 {
 	Waypoint *wp;
@@ -297,10 +327,13 @@
 	return _price.remove_train_depot;
 }
 
-/** Delete a waypoint
+/**
+ * Delete a waypoint
  * @param tile tile where waypoint is to be deleted
+ * @param flags type of operation
  * @param p1 unused
  * @param p2 unused
+ * @return cost of operation or error
  */
 int32 CmdRemoveTrainWaypoint(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -308,10 +341,13 @@
 	return RemoveTrainWaypoint(tile, flags, true);
 }
 
-/** Rename a waypoint.
+/**
+ * Rename a waypoint.
  * @param tile unused
+ * @param flags type of operation
  * @param p1 id of waypoint
  * @param p2 unused
+ * @return cost of operation or error
  */
 int32 CmdRenameWaypoint(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
 {
@@ -349,7 +385,11 @@
 	return 0;
 }
 
-/* This hacks together some dummy one-shot Station structure for a waypoint. */
+/**
+ * This hacks together some dummy one-shot Station structure for a waypoint.
+ * @param tile on which to work
+ * @return pointer to a Station
+ */
 Station *ComposeWaypointStation(TileIndex tile)
 {
 	Waypoint *wp = GetWaypointByTile(tile);
@@ -367,7 +407,13 @@
 	return &stat;
 }
 
-/* Draw a waypoint */
+/**
+ * Draw a waypoint
+ * @param x coordinate
+ * @param y coordinate
+ * @param stat_id station id
+ * @param railtype RailType to use for
+ */
 void DrawWaypointSprite(int x, int y, int stat_id, RailType railtype)
 {
 	x += 33;
@@ -378,7 +424,9 @@
 	}
 }
 
-/* Fix savegames which stored waypoints in their old format */
+/**
+ * Fix savegames which stored waypoints in their old format
+ */
 void FixOldWaypoints()
 {
 	Waypoint *wp;
--- a/src/waypoint.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/waypoint.h	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file waypoint.h */
+
 #ifndef WAYPOINT_H
 #define WAYPOINT_H
 
@@ -28,6 +30,8 @@
 
 /**
  * Check if a Waypoint really exists.
+ * @param wp Waypoint to query
+ * @return the validity of the waypoint
  */
 static inline bool IsValidWaypoint(const Waypoint *wp)
 {
--- a/src/widget.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/widget.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -1,5 +1,7 @@
 /* $Id$ */
 
+/** @file widget.cpp */
+
 #include "stdafx.h"
 #include "openttd.h"
 #include "functions.h"
@@ -34,17 +36,13 @@
 	return pt;
 }
 
-/*****************************************************
- * Special handling for the scrollbar widget type.
+/** Special handling for the scrollbar widget type.
  * Handles the special scrolling buttons and other
  * scrolling.
- * Parameters:
- *   w   - Window.
- *   wi  - Pointer to the scrollbar widget.
- *   x   - The X coordinate of the mouse click.
- *   y   - The Y coordinate of the mouse click.
- */
-
+ * @param w Window on which a scroll was performed.
+ * @param wi Pointer to the scrollbar widget.
+ * @param x The X coordinate of the mouse click.
+ * @param y The Y coordinate of the mouse click. */
 void ScrollbarClickHandler(Window *w, const Widget *wi, int x, int y)
 {
 	int mi, ma, pos;
@@ -52,7 +50,7 @@
 
 	switch (wi->type) {
 		case WWT_SCROLLBAR: {
-			// vertical scroller
+			/* vertical scroller */
 			w->flags4 &= ~WF_HSCROLL;
 			w->flags4 &= ~WF_SCROLL2;
 			mi = wi->top;
@@ -62,7 +60,7 @@
 			break;
 		}
 		case WWT_SCROLL2BAR: {
-			// 2nd vertical scroller
+			/* 2nd vertical scroller */
 			w->flags4 &= ~WF_HSCROLL;
 			w->flags4 |= WF_SCROLL2;
 			mi = wi->top;
@@ -72,7 +70,7 @@
 			break;
 		}
 		case  WWT_HSCROLLBAR: {
-			// horizontal scroller
+			/* horizontal scroller */
 			w->flags4 &= ~WF_SCROLL2;
 			w->flags4 |= WF_HSCROLL;
 			mi = wi->left;
@@ -84,7 +82,7 @@
 		default: return; //this should never happen
 	}
 	if (pos <= mi+9) {
-		// Pressing the upper button?
+		/* Pressing the upper button? */
 		w->flags4 |= WF_SCROLL_UP;
 		if (_scroller_click_timeout == 0) {
 			_scroller_click_timeout = 6;
@@ -92,7 +90,7 @@
 		}
 		_left_button_clicked = false;
 	} else if (pos >= ma-10) {
-		// Pressing the lower button?
+		/* Pressing the lower button? */
 		w->flags4 |= WF_SCROLL_DOWN;
 
 		if (_scroller_click_timeout == 0) {
@@ -102,7 +100,6 @@
 		}
 		_left_button_clicked = false;
 	} else {
-		//
 		Point pt = HandleScrollbarHittest(sb, mi, ma);
 
 		if (pos < pt.x) {
@@ -127,7 +124,8 @@
 /** Returns the index for the widget located at the given position
  * relative to the window. It includes all widget-corner pixels as well.
  * @param *w Window to look inside
- * @param  x,y Window client coordinates
+ * @param  x The Window client X coordinate
+ * @param  y The Window client y coordinate
  * @return A widget index, or -1 if no widget was found.
  */
 int GetWidgetFromPos(const Window *w, int x, int y)
@@ -135,8 +133,8 @@
 	uint index;
 	int found_index = -1;
 
-	// Go through the widgets and check if we find the widget that the coordinate is
-	// inside.
+	/* Go through the widgets and check if we find the widget that the coordinate is
+	 * inside. */
 	for (index = 0; index < w->widget_count; index++) {
 		const Widget *wi = &w->widget[index];
 		if (wi->type == WWT_EMPTY || wi->type == WWT_FRAME) continue;
@@ -294,14 +292,14 @@
 			goto draw_default;
 		}
 
-		// vertical scrollbar
+		/* vertical scrollbar */
 		case WWT_SCROLLBAR: {
 			Point pt;
 			int c1,c2;
 
 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
 
-			// draw up/down buttons
+			/* draw up/down buttons */
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_UP);
 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
 			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, 0x10);
@@ -313,11 +311,11 @@
 			c1 = _colour_gradient[wi->color&0xF][3];
 			c2 = _colour_gradient[wi->color&0xF][7];
 
-			// draw "shaded" background
+			/* draw "shaded" background */
 			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c2);
 			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
 
-			// draw shaded lines
+			/* draw shaded lines */
 			GfxFillRect(r.left+2, r.top+10, r.left+2, r.bottom-10, c1);
 			GfxFillRect(r.left+3, r.top+10, r.left+3, r.bottom-10, c2);
 			GfxFillRect(r.left+7, r.top+10, r.left+7, r.bottom-10, c1);
@@ -333,7 +331,7 @@
 
 			assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
 
-			// draw up/down buttons
+			/* draw up/down buttons */
 			clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_UP | WF_SCROLL2));
 			DrawFrameRect(r.left, r.top, r.right, r.top + 9, wi->color,  (clicked) ? FR_LOWERED : FR_NONE);
 			DoDrawString(UPARROW, r.left + 2 + clicked, r.top + clicked, 0x10);
@@ -345,11 +343,11 @@
 			c1 = _colour_gradient[wi->color&0xF][3];
 			c2 = _colour_gradient[wi->color&0xF][7];
 
-			// draw "shaded" background
+			/* draw "shaded" background */
 			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c2);
 			GfxFillRect(r.left, r.top+10, r.right, r.bottom-10, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
 
-			// draw shaded lines
+			/* draw shaded lines */
 			GfxFillRect(r.left+2, r.top+10, r.left+2, r.bottom-10, c1);
 			GfxFillRect(r.left+3, r.top+10, r.left+3, r.bottom-10, c2);
 			GfxFillRect(r.left+7, r.top+10, r.left+7, r.bottom-10, c1);
@@ -360,7 +358,7 @@
 			break;
 		}
 
-		// horizontal scrollbar
+		/* horizontal scrollbar */
 		case WWT_HSCROLLBAR: {
 			Point pt;
 			int c1,c2;
@@ -378,17 +376,17 @@
 			c1 = _colour_gradient[wi->color&0xF][3];
 			c2 = _colour_gradient[wi->color&0xF][7];
 
-			// draw "shaded" background
+			/* draw "shaded" background */
 			GfxFillRect(r.left+10, r.top, r.right-10, r.bottom, c2);
 			GfxFillRect(r.left+10, r.top, r.right-10, r.bottom, c1 | (1 << PALETTE_MODIFIER_GREYOUT));
 
-			// draw shaded lines
+			/* draw shaded lines */
 			GfxFillRect(r.left+10, r.top+2, r.right-10, r.top+2, c1);
 			GfxFillRect(r.left+10, r.top+3, r.right-10, r.top+3, c2);
 			GfxFillRect(r.left+10, r.top+7, r.right-10, r.top+7, c1);
 			GfxFillRect(r.left+10, r.top+8, r.right-10, r.top+8, c2);
 
-			// draw actual scrollbar
+			/* draw actual scrollbar */
 			pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
 			DrawFrameRect(pt.x, r.top, pt.y, r.bottom, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == (WF_SCROLL_MIDDLE | WF_HSCROLL) ? FR_LOWERED : FR_NONE);
 
@@ -404,19 +402,19 @@
 			c1 = _colour_gradient[wi->color][3];
 			c2 = _colour_gradient[wi->color][7];
 
-			//Line from upper left corner to start of text
+			/*Line from upper left corner to start of text */
 			GfxFillRect(r.left, r.top+4, r.left+4,r.top+4, c1);
 			GfxFillRect(r.left+1, r.top+5, r.left+4,r.top+5, c2);
 
-			// Line from end of text to upper right corner
+			/* Line from end of text to upper right corner */
 			GfxFillRect(x2, r.top+4, r.right-1,r.top+4,c1);
 			GfxFillRect(x2, r.top+5, r.right-2,r.top+5,c2);
 
-			// Line from upper left corner to bottom left corner
+			/* Line from upper left corner to bottom left corner */
 			GfxFillRect(r.left, r.top+5, r.left, r.bottom-1, c1);
 			GfxFillRect(r.left+1, r.top+6, r.left+1, r.bottom-2, c2);
 
-			//Line from upper right corner to bottom right corner
+			/*Line from upper right corner to bottom right corner */
 			GfxFillRect(r.right-1, r.top+5, r.right-1, r.bottom-2, c1);
 			GfxFillRect(r.right, r.top+4, r.right, r.bottom-1, c2);
 
@@ -501,7 +499,7 @@
 	if (item >= WP(w,dropdown_d).num_items || (HASBIT(WP(w,dropdown_d).disabled_state, item) && !HASBIT(WP(w,dropdown_d).hidden_state, item)) || WP(w,dropdown_d).items[item] == 0)
 		return - 1;
 
-	// Skip hidden items -- +1 for each hidden item before the clicked item.
+	/* Skip hidden items -- +1 for each hidden item before the clicked item. */
 	for (counter = 0; item >= counter; ++counter)
 		if (HASBIT(WP(w,dropdown_d).hidden_state, counter)) item++;
 
@@ -735,7 +733,7 @@
 
 /** Evenly distribute some widgets when resizing horizontally (often a button row)
  *  When only two arguments are given, the widgets are presumed to be on a line and only the ends are given
- * @param w widow to modify
+ * @param w Window to modify
  * @param left The leftmost widget to resize
  * @param right The rightmost widget to resize. Since right side of it is used, remember to set it to RESIZE_RIGHT
  */
--- a/src/win32.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/win32.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -84,7 +84,7 @@
 	MyShowCursor(true);
 	MessageBox(GetActiveWindow(), MB_TO_WIDE(buf), _T("Error!"), MB_ICONSTOP);
 
-// if exception tracker is enabled, we crash here to let the exception handler handle it.
+/* if exception tracker is enabled, we crash here to let the exception handler handle it. */
 #if defined(WIN32_EXCEPTION_TRACKER) && !defined(_DEBUG)
 	if (*buf == '!') {
 		_exception_string = buf;
@@ -335,7 +335,7 @@
 
 static void SetWndSize(HWND wnd, int mode)
 {
-	RECT r,r2;
+	RECT r, r2;
 	int offs;
 
 	GetWindowRect(wnd, &r);
@@ -368,7 +368,7 @@
 	return b;
 }
 
-static INT_PTR CALLBACK CrashDialogFunc(HWND wnd,UINT msg,WPARAM wParam,LPARAM lParam)
+static INT_PTR CALLBACK CrashDialogFunc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
 	switch (msg) {
 		case WM_INITDIALOG: {
@@ -418,7 +418,7 @@
 					EnableWindow(GetDlgItem(wnd, 14), FALSE);
 					SetCursor(LoadCursor(NULL, IDC_ARROW));
 					MessageBox(wnd, _T("Crash report submitted. Thank you."), _T("Crash Report"), MB_ICONINFORMATION);
-				}	break;
+				} break;
 #endif /* Disabled crash-submit procedures */
 				case 15: /* Expand window to show crash-message */
 					_expanded ^= 1;
@@ -549,7 +549,7 @@
 	}
 
 	{
-		int i,j;
+		int i, j;
 #ifdef _M_AMD64
 		uint32 *b = (uint32*)ep->ContextRecord->Rsp;
 #else
@@ -557,7 +557,7 @@
 #endif
 		for (j = 0; j != 24; j++) {
 			for (i = 0; i != 8; i++) {
-				if (IsBadReadPtr(b,sizeof(uint32))) {
+				if (IsBadReadPtr(b, sizeof(uint32))) {
 					output += sprintf(output, " ????????"); //OCR: WAS - , 0);
 				} else {
 					output += sprintf(output, " %.8X", *b);
@@ -747,7 +747,7 @@
 
 bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb)
 {
-	// hectonanoseconds between Windows and POSIX epoch
+	/* hectonanoseconds between Windows and POSIX epoch */
 	static const int64 posix_epoch_hns = 0x019DB1DED53E8000LL;
 	const WIN32_FIND_DATA *fd = &ent->dir->fd;
 
@@ -790,13 +790,13 @@
 	int n = 0;
 
 	do {
-		// skip whitespace
+		/* skip whitespace */
 		while (*line == ' ' || *line == '\t') line++;
 
-		// end?
+		/* end? */
 		if (*line == '\0') break;
 
-		// special handling when quoted
+		/* special handling when quoted */
 		if (*line == '"') {
 			argv[n++] = ++line;
 			while (*line != '"') {
@@ -831,13 +831,13 @@
 	coninfo.dwSize.Y = 500;
 	SetConsoleScreenBufferSize(hand, coninfo.dwSize);
 
-	// redirect unbuffered STDIN, STDOUT, STDERR to the console
+	/* redirect unbuffered STDIN, STDOUT, STDERR to the console */
 #if !defined(__CYGWIN__)
 	*stdout = *_fdopen( _open_osfhandle((intptr_t)hand, _O_TEXT), "w" );
 	*stdin = *_fdopen(_open_osfhandle((intptr_t)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT), "r" );
 	*stderr = *_fdopen(_open_osfhandle((intptr_t)GetStdHandle(STD_ERROR_HANDLE), _O_TEXT), "w" );
 #else
-	// open_osfhandle is not in cygwin
+	/* open_osfhandle is not in cygwin */
 	*stdout = *fdopen(1, "w" );
 	*stdin = *fdopen(0, "r" );
 	*stderr = *fdopen(2, "w" );
@@ -890,6 +890,9 @@
 #endif /* UNICODE */
 
 #if defined(UNICODE)
+	/* Check if a win9x user started the win32 version */
+	if (HASBIT(GetVersion(), 31)) error("This version of OpenTTD doesn't run on windows 95/98/ME.\nPlease download the win9x binary and try again.");
+
 	/* For UNICODE we need to convert the commandline to char* _AND_
 	 * save it because argv[] points into this buffer and thus needs to
 	 * be available between subsequent calls to FS2OTTD() */
@@ -946,6 +949,7 @@
 void DetermineBasePaths(const char *exe)
 {
 	_paths.personal_dir = _paths.game_data_dir = MallocT<char>(MAX_PATH);
+	_paths.second_data_dir = NULL;
 #if defined(UNICODE)
 	TCHAR path[MAX_PATH];
 	GetCurrentDirectory(MAX_PATH - 1, path);
@@ -962,8 +966,8 @@
  * Insert a chunk of text from the clipboard onto the textbuffer. Get TEXT clipboard
  * and append this up to the maximum length (either absolute or screenlength). If maxlength
  * is zero, we don't care about the screenlength but only about the physical length of the string
- * @param tb @Textbuf type to be changed
- * @return Return true on successfull change of Textbuf, or false otherwise
+ * @param tb Textbuf type to be changed
+ * @return true on successfull change of Textbuf, or false otherwise
  */
 bool InsertTextBufferClipboard(Textbuf *tb)
 {
@@ -1036,8 +1040,8 @@
 }
 
 
-// Utility function to get the current timestamp in milliseconds
-// Useful for profiling
+/** Utility function to get the current timestamp in milliseconds
+ * Useful for profiling */
 int64 GetTS()
 {
 	static double freq;
--- a/src/window.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/window.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -18,7 +18,7 @@
 #include "genworld.h"
 #include "helpers.hpp"
 
-// delta between mouse cursor and upper left corner of dragged window
+/* delta between mouse cursor and upper left corner of dragged window */
 static Point _drag_delta;
 
 static Window _windows[25];
@@ -101,7 +101,7 @@
 
 	if (w->desc_flags & WDF_DEF_WIDGET) {
 		e.we.click.widget = GetWidgetFromPos(w, x, y);
-		if (e.we.click.widget < 0) return; /* exit if clicked outside of widgets */
+		if (e.we.click.widget < 0) return; // exit if clicked outside of widgets
 
 		/* don't allow any interaction if the button has been disabled */
 		if (IsWindowWidgetDisabled(w, e.we.click.widget)) return;
@@ -157,7 +157,7 @@
 	if (w->desc_flags & WDF_STD_TOOLTIPS) {
 		e.we.click.widget = GetWidgetFromPos(w, x, y);
 		if (e.we.click.widget < 0)
-			return; /* exit if clicked outside of widgets */
+			return; // exit if clicked outside of widgets
 
 		if (w->widget[e.we.click.widget].tooltips != 0) {
 			GuiShowTooltips(w->widget[e.we.click.widget].tooltips);
@@ -235,25 +235,25 @@
 				bottom > v->top &&
 				left < v->left + v->width &&
 				top < v->top + v->height) {
-			if (left < (x=v->left)) {
+			if (left < (x = v->left)) {
 				DrawOverlappedWindow(wz, left, top, x, bottom);
 				DrawOverlappedWindow(wz, x, top, right, bottom);
 				return;
 			}
 
-			if (right > (x=v->left + v->width)) {
+			if (right > (x = v->left + v->width)) {
 				DrawOverlappedWindow(wz, left, top, x, bottom);
 				DrawOverlappedWindow(wz, x, top, right, bottom);
 				return;
 			}
 
-			if (top < (x=v->top)) {
+			if (top < (x = v->top)) {
 				DrawOverlappedWindow(wz, left, top, right, x);
 				DrawOverlappedWindow(wz, left, x, right, bottom);
 				return;
 			}
 
-			if (bottom > (x=v->top + v->height)) {
+			if (bottom > (x = v->top + v->height)) {
 				DrawOverlappedWindow(wz, left, top, right, x);
 				DrawOverlappedWindow(wz, left, x, right, bottom);
 				return;
@@ -271,7 +271,7 @@
 		dp->top = top - (*wz)->top;
 		dp->pitch = _screen.pitch;
 		dp->dst_ptr = _screen.dst_ptr + top * _screen.pitch + left;
-		dp->zoom = 0;
+		dp->zoom = ZOOM_LVL_NORMAL;
 		CallWindowEventNP(*wz, WE_PAINT);
 	}
 }
@@ -291,8 +291,8 @@
 }
 
 /** Find the Window whose parent pointer points to this window
- * @parent w Window to find child of
- * @return return a Window pointer that is the child of w, or NULL otherwise */
+ * @param w parent Window to find child of
+ * @return a Window pointer that is the child of w, or NULL otherwise */
 static Window *FindChildWindow(const Window *w)
 {
 	Window* const *wz;
@@ -306,7 +306,9 @@
 }
 
 /** Find the z-value of a window. A window must already be open
- * or the behaviour is undefined but function should never fail */
+ * or the behaviour is undefined but function should never fail
+ * @param w window to query Z Position
+ * @return the window that matches it */
 Window **FindWindowZPosition(const Window *w)
 {
 	Window **wz;
@@ -441,8 +443,9 @@
 static void BringWindowToFront(const Window *w);
 
 /** Find a window and make it the top-window on the screen. The window
- * gets a white border for a brief period of time to visualize its
- * "activation"
+ * gets a white border for a brief period of time to visualize its "activation"
+ * @param cls WindowClass of the window to activate
+ * @param number WindowNumber of the window to activate
  * @return a pointer to the window thus activated */
 Window *BringWindowToFrontById(WindowClass cls, WindowNumber number)
 {
@@ -535,7 +538,9 @@
 	return (w->original_widget == widget);
 }
 
-/* Copies 'widget' to 'w->widget' to allow for resizable windows */
+/** Copies 'widget' to 'w->widget' to allow for resizable windows
+ * @param w Window on which to attach the widget array
+ * @param widget pointer of widget array to fill the window with */
 void AssignWidgetToWindow(Window *w, const Widget *widget)
 {
 	w->original_widget = widget;
@@ -577,12 +582,20 @@
 	return NULL;
 }
 
-/* Open a new window.
+/** Open a new window.
  * This function is called from AllocateWindow() or AllocateWindowDesc()
  * See descriptions for those functions for usage
  * See AllocateWindow() for description of arguments.
  * Only addition here is window_number, which is the window_number being assigned to the new window
- */
+ * @param x offset in pixels from the left of the screen
+ * @param y offset in pixels from the top of the screen
+ * @param width width in pixels of the window
+ * @param height height in pixels of the window
+ * @param *proc see WindowProc function to call when any messages/updates happen to the window
+ * @param cls see WindowClass class of the window, used for identification and grouping
+ * @param *widget see Widget pointer to the window layout and various elements
+ * @param window_number number being assigned to the new window
+ * @return Window pointer of the newly created window */
 static Window *LocalAllocateWindow(
 							int x, int y, int width, int height,
 							WindowProc *proc, WindowClass cls, const Widget *widget, int window_number)
@@ -596,7 +609,7 @@
 		DeleteWindow(w);
 	}
 
-	// Set up window properties
+	/* Set up window properties */
 	memset(w, 0, sizeof(*w));
 	w->window_class = cls;
 	w->flags4 = WF_WHITE_BORDER_MASK; // just opened windows have a white border
@@ -653,11 +666,10 @@
  * @param y offset in pixels from the top of the screen
  * @param width width in pixels of the window
  * @param height height in pixels of the window
- * @param *proc @see WindowProc function to call when any messages/updates happen to the window
- * @param cls @see WindowClass class of the window, used for identification and grouping
- * @param *widget @see Widget pointer to the window layout and various elements
- * @return @see Window pointer of the newly created window
- */
+ * @param *proc see WindowProc function to call when any messages/updates happen to the window
+ * @param cls see WindowClass class of the window, used for identification and grouping
+ * @param *widget see Widget pointer to the window layout and various elements
+ * @return Window pointer of the newly created window */
 Window *AllocateWindow(
 							int x, int y, int width, int height,
 							WindowProc *proc, WindowClass cls, const Widget *widget)
@@ -670,22 +682,17 @@
 };
 
 
-static SizeRect _awap_r;
-
-static bool IsGoodAutoPlace1(int left, int top)
+static bool IsGoodAutoPlace1(int left, int top, int width, int height, Point &pos)
 {
-	int right,bottom;
 	Window* const *wz;
 
-	_awap_r.left= left;
-	_awap_r.top = top;
-	right = _awap_r.width + left;
-	bottom = _awap_r.height + top;
+	int right  = width + left;
+	int bottom = height + top;
 
 	if (left < 0 || top < 22 || right > _screen.width || bottom > _screen.height)
 		return false;
 
-	// Make sure it is not obscured by any window.
+	/* Make sure it is not obscured by any window. */
 	FOR_ALL_WINDOWS(wz) {
 		const Window *w = *wz;
 		if (w->window_class == WC_MAIN_WINDOW) continue;
@@ -698,23 +705,19 @@
 		}
 	}
 
+	pos.x = left;
+	pos.y = top;
 	return true;
 }
 
-static bool IsGoodAutoPlace2(int left, int top)
+static bool IsGoodAutoPlace2(int left, int top, int width, int height, Point &pos)
 {
-	int width,height;
 	Window* const *wz;
 
-	_awap_r.left= left;
-	_awap_r.top = top;
-	width = _awap_r.width;
-	height = _awap_r.height;
-
 	if (left < -(width>>2) || left > _screen.width - (width>>1)) return false;
 	if (top < 22 || top > _screen.height - (height>>2)) return false;
 
-	// Make sure it is not obscured by any window.
+	/* Make sure it is not obscured by any window. */
 	FOR_ALL_WINDOWS(wz) {
 		const Window *w = *wz;
 		if (w->window_class == WC_MAIN_WINDOW) continue;
@@ -727,6 +730,8 @@
 		}
 	}
 
+	pos.x = left;
+	pos.y = top;
 	return true;
 }
 
@@ -735,39 +740,36 @@
 	Window* const *wz;
 	Point pt;
 
-	_awap_r.width = width;
-	_awap_r.height = height;
-
-	if (IsGoodAutoPlace1(0, 24)) goto ok_pos;
+	if (IsGoodAutoPlace1(0, 24, width, height, pt)) return pt;
 
 	FOR_ALL_WINDOWS(wz) {
 		const Window *w = *wz;
 		if (w->window_class == WC_MAIN_WINDOW) continue;
 
-		if (IsGoodAutoPlace1(w->left+w->width+2,w->top)) goto ok_pos;
-		if (IsGoodAutoPlace1(w->left-   width-2,w->top)) goto ok_pos;
-		if (IsGoodAutoPlace1(w->left,w->top+w->height+2)) goto ok_pos;
-		if (IsGoodAutoPlace1(w->left,w->top-   height-2)) goto ok_pos;
-		if (IsGoodAutoPlace1(w->left+w->width+2,w->top+w->height-height)) goto ok_pos;
-		if (IsGoodAutoPlace1(w->left-   width-2,w->top+w->height-height)) goto ok_pos;
-		if (IsGoodAutoPlace1(w->left+w->width-width,w->top+w->height+2)) goto ok_pos;
-		if (IsGoodAutoPlace1(w->left+w->width-width,w->top-   height-2)) goto ok_pos;
+		if (IsGoodAutoPlace1(w->left + w->width + 2, w->top, width, height, pt)) return pt;
+		if (IsGoodAutoPlace1(w->left - width - 2,    w->top, width, height, pt)) return pt;
+		if (IsGoodAutoPlace1(w->left, w->top + w->height + 2, width, height, pt)) return pt;
+		if (IsGoodAutoPlace1(w->left, w->top - height - 2,    width, height, pt)) return pt;
+		if (IsGoodAutoPlace1(w->left + w->width + 2, w->top + w->height - height, width, height, pt)) return pt;
+		if (IsGoodAutoPlace1(w->left - width - 2,    w->top + w->height - height, width, height, pt)) return pt;
+		if (IsGoodAutoPlace1(w->left + w->width - width, w->top + w->height + 2, width, height, pt)) return pt;
+		if (IsGoodAutoPlace1(w->left + w->width - width, w->top - height - 2,    width, height, pt)) return pt;
 	}
 
 	FOR_ALL_WINDOWS(wz) {
 		const Window *w = *wz;
 		if (w->window_class == WC_MAIN_WINDOW) continue;
 
-		if (IsGoodAutoPlace2(w->left+w->width+2,w->top)) goto ok_pos;
-		if (IsGoodAutoPlace2(w->left-   width-2,w->top)) goto ok_pos;
-		if (IsGoodAutoPlace2(w->left,w->top+w->height+2)) goto ok_pos;
-		if (IsGoodAutoPlace2(w->left,w->top-   height-2)) goto ok_pos;
+		if (IsGoodAutoPlace2(w->left + w->width + 2, w->top, width, height, pt)) return pt;
+		if (IsGoodAutoPlace2(w->left - width - 2,    w->top, width, height, pt)) return pt;
+		if (IsGoodAutoPlace2(w->left, w->top + w->height + 2, width, height, pt)) return pt;
+		if (IsGoodAutoPlace2(w->left, w->top - height - 2,    width, height, pt)) return pt;
 	}
 
 	{
-		int left=0,top=24;
+		int left = 0, top = 24;
 
-restart:;
+restart:
 		FOR_ALL_WINDOWS(wz) {
 			const Window *w = *wz;
 
@@ -782,11 +784,6 @@
 		pt.y = top;
 		return pt;
 	}
-
-ok_pos:;
-	pt.x = _awap_r.left;
-	pt.y = _awap_r.top;
-	return pt;
 }
 
 static Window *LocalAllocateWindowDesc(const WindowDesc *desc, int window_number)
@@ -811,7 +808,7 @@
 			case WDP_ALIGN_TBR: { /* Align the right side with the top toolbar */
 				w = FindWindowById(WC_MAIN_TOOLBAR, 0);
 				pt.x = (w->left + w->width) - desc->width;
-			}	break;
+			} break;
 			case WDP_ALIGN_TBL: /* Align the left side with the top toolbar */
 				pt.x = FindWindowById(WC_MAIN_TOOLBAR, 0)->left;
 				break;
@@ -852,7 +849,7 @@
 /**
  * Open a new window.
  * @param *desc The pointer to the WindowDesc to be created
- * @return @see Window pointer of the newly created window
+ * @return Window pointer of the newly created window
  */
 Window *AllocateWindowDesc(const WindowDesc *desc)
 {
@@ -863,7 +860,7 @@
  * Open a new window.
  * @param *desc The pointer to the WindowDesc to be created
  * @param window_number the window number of the new window
- * @return @see Window pointer of the newly created window
+ * @return see Window pointer of the newly created window
  */
 Window *AllocateWindowDescFront(const WindowDesc *desc, int window_number)
 {
@@ -876,6 +873,8 @@
 
 /** Do a search for a window at specific coordinates. For this we start
  * at the topmost window, obviously and work our way down to the bottom
+ * @param x position x to query
+ * @param y position y to query
  * @return a pointer to the found window if any, NULL otherwise */
 Window *FindWindowFromPt(int x, int y)
 {
@@ -936,7 +935,7 @@
 
 	for (wz = _last_z_window; wz != _z_windows;) {
 		w = *--wz;
-		// Unclick scrollbar buttons if they are pressed.
+		/* Unclick scrollbar buttons if they are pressed. */
 		if (w->flags4 & (WF_SCROLL_DOWN | WF_SCROLL_UP)) {
 			w->flags4 &= ~(WF_SCROLL_DOWN | WF_SCROLL_UP);
 			SetWindowDirty(w);
@@ -993,7 +992,7 @@
 	ResetObjectToPlace();
 
 	if (w != NULL) {
-		// send an event in client coordinates.
+		/* send an event in client coordinates. */
 		e.event = WE_DRAGDROP;
 		e.we.dragdrop.pt.x = _cursor.pos.x - w->left;
 		e.we.dragdrop.pt.y = _cursor.pos.y - w->top;
@@ -1038,7 +1037,7 @@
 
 	w = FindWindowFromPt(_cursor.pos.x, _cursor.pos.y);
 
-	// We changed window, put a MOUSEOVER event to the last window
+	/* We changed window, put a MOUSEOVER event to the last window */
 	if (last_w != NULL && last_w != w) {
 		e.event = WE_MOUSEOVER;
 		e.we.mouseover.pt.x = -1;
@@ -1048,7 +1047,7 @@
 	last_w = w;
 
 	if (w != NULL) {
-		// send an event in client coordinates.
+		/* send an event in client coordinates. */
 		e.event = WE_MOUSEOVER;
 		e.we.mouseover.pt.x = _cursor.pos.x - w->left;
 		e.we.mouseover.pt.y = _cursor.pos.y - w->top;
@@ -1058,7 +1057,7 @@
 		w->wndproc(w, &e);
 	}
 
-	// Mouseover never stops execution
+	/* Mouseover never stops execution */
 	return true;
 }
 
@@ -1066,7 +1065,7 @@
  * Both the areas of the old window and the new sized window are set dirty
  * ensuring proper redrawal.
  * @param w Window to resize
- * @param x delta x-size of changed window (positive if larger, etc.(
+ * @param x delta x-size of changed window (positive if larger, etc.)
  * @param y delta y-size of changed window */
 void ResizeWindow(Window *w, int x, int y)
 {
@@ -1117,10 +1116,10 @@
 static bool HandleWindowDragging()
 {
 	Window* const *wz;
-	// Get out immediately if no window is being dragged at all.
+	/* Get out immediately if no window is being dragged at all. */
 	if (!_dragging_window) return true;
 
-	// Otherwise find the window...
+	/* Otherwise find the window... */
 	FOR_ALL_WINDOWS(wz) {
 		Window *w = *wz;
 
@@ -1132,7 +1131,7 @@
 			int nx;
 			int ny;
 
-			// Stop the dragging if the left mouse button was released
+			/* Stop the dragging if the left mouse button was released */
 			if (!_left_button_down) {
 				w->flags4 &= ~WF_DRAGGING;
 				break;
@@ -1158,14 +1157,14 @@
 					if (v == w) continue; // Don't snap at yourself
 
 					if (y + w->height > v->top && y < v->top + v->height) {
-						// Your left border <-> other right border
+						/* Your left border <-> other right border */
 						delta = abs(v->left + v->width - x);
 						if (delta <= hsnap) {
 							nx = v->left + v->width;
 							hsnap = delta;
 						}
 
-						// Your right border <-> other left border
+						/* Your right border <-> other left border */
 						delta = abs(v->left - x - w->width);
 						if (delta <= hsnap) {
 							nx = v->left - w->width;
@@ -1174,14 +1173,14 @@
 					}
 
 					if (w->top + w->height >= v->top && w->top <= v->top + v->height) {
-						// Your left border <-> other left border
+						/* Your left border <-> other left border */
 						delta = abs(v->left - x);
 						if (delta <= hsnap) {
 							nx = v->left;
 							hsnap = delta;
 						}
 
-						// Your right border <-> other right border
+						/* Your right border <-> other right border */
 						delta = abs(v->left + v->width - x - w->width);
 						if (delta <= hsnap) {
 							nx = v->left + v->width - w->width;
@@ -1190,14 +1189,14 @@
 					}
 
 					if (x + w->width > v->left && x < v->left + v->width) {
-						// Your top border <-> other bottom border
+						/* Your top border <-> other bottom border */
 						delta = abs(v->top + v->height - y);
 						if (delta <= vsnap) {
 							ny = v->top + v->height;
 							vsnap = delta;
 						}
 
-						// Your bottom border <-> other top border
+						/* Your bottom border <-> other top border */
 						delta = abs(v->top - y - w->height);
 						if (delta <= vsnap) {
 							ny = v->top - w->height;
@@ -1206,14 +1205,14 @@
 					}
 
 					if (w->left + w->width >= v->left && w->left <= v->left + v->width) {
-						// Your top border <-> other top border
+						/* Your top border <-> other top border */
 						delta = abs(v->top - y);
 						if (delta <= vsnap) {
 							ny = v->top;
 							vsnap = delta;
 						}
 
-						// Your bottom border <-> other bottom border
+						/* Your bottom border <-> other bottom border */
 						delta = abs(v->top + v->height - y - w->height);
 						if (delta <= vsnap) {
 							ny = v->top + v->height - w->height;
@@ -1223,12 +1222,12 @@
 				}
 			}
 
-			// Make sure the window doesn't leave the screen
-			// 13 is the height of the title bar
+			/* Make sure the window doesn't leave the screen
+			 * 13 is the height of the title bar */
 			nx = clamp(nx, 13 - t->right, _screen.width - 13 - t->left);
 			ny = clamp(ny, 0, _screen.height - 13);
 
-			// Make sure the title bar isn't hidden by behind the main tool bar
+			/* Make sure the title bar isn't hidden by behind the main tool bar */
 			v = FindWindowById(WC_MAIN_TOOLBAR, 0);
 			if (v != NULL) {
 				int v_bottom = v->top + v->height;
@@ -1345,15 +1344,15 @@
 	int pos;
 	Scrollbar *sb;
 
-	// Get out quickly if no item is being scrolled
+	/* Get out quickly if no item is being scrolled */
 	if (!_scrolling_scrollbar) return true;
 
-	// Find the scrolling window
+	/* Find the scrolling window */
 	FOR_ALL_WINDOWS(wz) {
 		Window *w = *wz;
 
 		if (w->flags4 & WF_SCROLL_MIDDLE) {
-			// Abort if no button is clicked any more.
+			/* Abort if no button is clicked any more. */
 			if (!_left_button_down) {
 				w->flags4 &= ~WF_SCROLL_MIDDLE;
 				SetWindowDirty(w);
@@ -1371,7 +1370,7 @@
 				i = _cursor.pos.y - _cursorpos_drag_start.y;
 			}
 
-			// Find the item we want to move to and make sure it's inside bounds.
+			/* Find the item we want to move to and make sure it's inside bounds. */
 			pos = min(max(0, i + _scrollbar_start_pos) * sb->count / _scrollbar_size, max(0, sb->count - sb->cap));
 			if (pos != sb->pos) {
 				sb->pos = pos;
@@ -1482,7 +1481,7 @@
 }
 
 /** Send a message from one window to another. The receiving window is found by
- * @param w @see Window pointer pointing to the other window
+ * @param w Window pointer pointing to the other window
  * @param msg Specifies the message to be sent
  * @param wparam Specifies additional message-specific information
  * @param lparam Specifies additional message-specific information
@@ -1500,8 +1499,8 @@
 }
 
 /** Send a message from one window to another. The receiving window is found by
- * @param wnd_class @see WindowClass class AND
- * @param wnd_num @see WindowNumber number, mostly 0
+ * @param wnd_class see WindowClass class AND
+ * @param wnd_num see WindowNumber number, mostly 0
  * @param msg Specifies the message to be sent
  * @param wparam Specifies additional message-specific information
  * @param lparam Specifies additional message-specific information
@@ -1514,7 +1513,7 @@
 
 /** Send a message from one window to another. The message will be sent
  * to ALL windows of the windowclass specified in the first parameter
- * @param wnd_class @see WindowClass class
+ * @param wnd_class see WindowClass class
  * @param msg Specifies the message to be sent
  * @param wparam Specifies additional message-specific information
  * @param lparam Specifies additional message-specific information
@@ -1551,13 +1550,13 @@
 	*/
 	if (!IsGeneratingWorld()) _current_player = _local_player;
 
-	// Setup event
+	/* Setup event */
 	e.event = WE_KEYPRESS;
 	e.we.keypress.key     = GB(key,  0, 16);
 	e.we.keypress.keycode = GB(key, 16, 16);
 	e.we.keypress.cont = true;
 
-	// check if we have a query string window open before allowing hotkeys
+	/* check if we have a query string window open before allowing hotkeys */
 	if (FindWindowById(WC_QUERY_STRING,       0) != NULL ||
 			FindWindowById(WC_SEND_NETWORK_MSG,   0) != NULL ||
 			FindWindowById(WC_GENERATE_LANDSCAPE, 0) != NULL ||
@@ -1566,11 +1565,11 @@
 		query_open = true;
 	}
 
-	// Call the event, start with the uppermost window.
+	/* Call the event, start with the uppermost window. */
 	for (wz = _last_z_window; wz != _z_windows;) {
 		Window *w = *--wz;
 
-		// if a query window is open, only call the event for certain window types
+		/* if a query window is open, only call the event for certain window types */
 		if (query_open &&
 				w->window_class != WC_QUERY_STRING &&
 				w->window_class != WC_SEND_NETWORK_MSG &&
@@ -1585,7 +1584,7 @@
 
 	if (e.we.keypress.cont) {
 		Window *w = FindWindowById(WC_MAIN_TOOLBAR, 0);
-		// When there is no toolbar w is null, check for that
+		/* When there is no toolbar w is null, check for that */
 		if (w != NULL) w->wndproc(w, &e);
 	}
 }
@@ -1616,17 +1615,17 @@
 		if (vp != NULL) {
 			x -= vp->left;
 			y -= vp->top;
-			//here allows scrolling in both x and y axis
+			/* here allows scrolling in both x and y axis */
 #define scrollspeed 3
 			if (x - 15 < 0) {
-				WP(w, vp_d).scrollpos_x += (x - 15) * scrollspeed << vp->zoom;
+				WP(w, vp_d).scrollpos_x += ScaleByZoom((x - 15) * scrollspeed, vp->zoom);
 			} else if (15 - (vp->width - x) > 0) {
-				WP(w, vp_d).scrollpos_x += (15 - (vp->width - x)) * scrollspeed << vp->zoom;
+				WP(w, vp_d).scrollpos_x += ScaleByZoom((15 - (vp->width - x)) * scrollspeed, vp->zoom);
 			}
 			if (y - 15 < 0) {
-				WP(w, vp_d).scrollpos_y += (y - 15) * scrollspeed << vp->zoom;
+				WP(w, vp_d).scrollpos_y += ScaleByZoom((y - 15) * scrollspeed, vp->zoom);
 			} else if (15 - (vp->height - y) > 0) {
-				WP(w,vp_d).scrollpos_y += (15 - (vp->height - y)) * scrollspeed << vp->zoom;
+				WP(w,vp_d).scrollpos_y += ScaleByZoom((15 - (vp->height - y)) * scrollspeed, vp->zoom);
 			}
 #undef scrollspeed
 		}
@@ -1685,7 +1684,7 @@
 			case 1:
 				DEBUG(misc, 2, "Cursor: 0x%X (%d)", _cursor.sprite, _cursor.sprite);
 				if (_thd.place_mode != 0 &&
-						// query button and place sign button work in pause mode
+						/* query button and place sign button work in pause mode */
 						_cursor.sprite != SPR_CURSOR_QUERY &&
 						_cursor.sprite != SPR_CURSOR_SIGN &&
 						_pause_game != 0 &&
@@ -1736,7 +1735,7 @@
 	 */
 	if (!IsGeneratingWorld()) _current_player = _local_player;
 
-	// Mouse event?
+	/* Mouse event? */
 	click = 0;
 	if (_left_button_down && !_left_button_clicked) {
 		_left_button_clicked = true;
@@ -1793,7 +1792,7 @@
 		if ((*wz)->viewport != NULL) UpdateViewportPosition(*wz);
 	}
 	DrawTextMessage();
-	// Redraw mouse cursor in case it was hidden
+	/* Redraw mouse cursor in case it was hidden */
 	DrawMouseCursor();
 }
 
@@ -1910,7 +1909,7 @@
 	}
 }
 
-/* It is possible that a stickied window gets to a position where the
+/** It is possible that a stickied window gets to a position where the
  * 'close' button is outside the gaming area. You cannot close it then; except
  * with this function. It closes all windows calling the standard function,
  * then, does a little hacked loop of closing all stickied windows. Note
@@ -1934,7 +1933,7 @@
 	}
 }
 
-/* Delete all always on-top windows to get an empty screen */
+/** Delete all always on-top windows to get an empty screen */
 void HideVitalWindows()
 {
 	DeleteWindowById(WC_TOOLBAR_MENU, 0);
@@ -1971,8 +1970,8 @@
 			ViewPort *vp = w->viewport;
 			vp->width = w->width = neww;
 			vp->height = w->height = newh;
-			vp->virtual_width = neww << vp->zoom;
-			vp->virtual_height = newh << vp->zoom;
+			vp->virtual_width = ScaleByZoom(neww, vp->zoom);
+			vp->virtual_height = ScaleByZoom(newh, vp->zoom);
 			continue; // don't modify top,left
 		}
 
--- a/src/window.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/window.h	Sat Jun 02 19:59:29 2007 +0000
@@ -9,7 +9,9 @@
 #include "string.h"
 #include "order.h"
 #include "rail.h"
+#include "road.h"
 #include "airport.h"
+#include "vehicle.h"
 
 struct WindowEvent;
 
@@ -133,7 +135,8 @@
 			Point pt;
 			TileIndex tile;
 			TileIndex starttile;
-			int userdata;
+			byte select_method;
+			byte select_proc;
 		} place;
 
 		struct {
@@ -280,6 +283,11 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(querystr_d));
 
+struct chatquerystr_d : public querystr_d {
+	int dest;
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(chatquerystr_d));
+
 struct menu_d {
 	byte item_count;      ///< follow_vehicle
 	byte sel_index;       ///< scrollpos_x
@@ -318,10 +326,11 @@
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(tooltips_d));
 
 struct buildvehicle_d {
-	byte vehicle_type;
+	VehicleType vehicle_type;
 	union {
 		RailTypeByte railtype;
 		AirportFTAClass::Flags flags;
+		RoadTypes roadtypes;
 	} filter;
 	byte sel_index;  ///< deprecated value, used for 'unified' ship and road
 	bool descending_sort_order;
@@ -342,12 +351,13 @@
 	bool update_left;
 	bool update_right;
 	bool init_lists;
+	GroupID sel_group;
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(replaceveh_d));
 
 struct depot_d {
 	VehicleID sel;
-	byte type;
+	VehicleType type;
 	bool generate_list;
 	uint16 engine_list_length;
 	uint16 wagon_list_length;
@@ -394,6 +404,8 @@
 	VehicleID follow_vehicle;
 	int32 scrollpos_x;
 	int32 scrollpos_y;
+	int32 dest_scrollpos_x;
+	int32 dest_scrollpos_y;
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vp_d));
 
@@ -402,6 +414,8 @@
 	VehicleID follow_vehicle;
 	int32 scrollpos_x;
 	int32 scrollpos_y;
+	int32 dest_scrollpos_x;
+	int32 dest_scrollpos_y;
 	byte data_1;
 	byte data_2;
 	byte data_3;
@@ -412,6 +426,8 @@
 	uint16 follow_vehicle;
 	int32 scrollpos_x;
 	int32 scrollpos_y;
+	int32 dest_scrollpos_x;
+	int32 dest_scrollpos_y;
 	NewsItem *ni;
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(news_d));
@@ -472,6 +488,28 @@
 };
 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(dropdown_d));
 
+struct vehiclelist_d {
+	const Vehicle** sort_list;  // List of vehicles (sorted)
+	Listing *_sorting;          // pointer to the appropiate subcategory of _sorting
+	uint16 length_of_sort_list; // Keeps track of how many vehicle pointers sort list got space for
+	VehicleType vehicle_type;   // The vehicle type that is sorted
+	list_d l;                   // General list struct
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vehiclelist_d));
+
+struct grouplist_d {
+	const Group **sort_list;
+	list_d l;                   // General list struct
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(grouplist_d));
+
+struct groupveh_d : vehiclelist_d {
+	GroupID group_sel;
+	VehicleID vehicle_sel;
+
+	grouplist_d gl;
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(groupveh_d));
 
 /****************** THESE ARE NOT WIDGET TYPES!!!!! *******************/
 enum WindowWidgetBehaviours {
@@ -659,7 +697,7 @@
  * Sets the lowered/raised status of a widget.
  * @param w : Window on which the widget is located
  * @param widget_index : index of this widget in the window
- * @param hidden_stat : status to use ie: lowered = true, raised = false
+ * @param lowered_stat : status to use ie: lowered = true, raised = false
  */
 static inline void SetWindowWidgetLoweredState(Window *w, byte widget_index, bool lowered_stat)
 {
--- a/src/yapf/follow_track.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/follow_track.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -45,7 +45,7 @@
 	{
 		m_old_tile = old_tile;
 		m_old_td = old_td;
-		assert((GetTileTrackStatus(m_old_tile, TT()) & TrackdirToTrackdirBits(m_old_td)) != 0);
+		assert((GetTileTrackStatus(m_old_tile, TT(), m_veh->u.road.compatible_roadtypes) & TrackdirToTrackdirBits(m_old_td)) != 0);
 		m_exitdir = TrackdirToExitdir(m_old_td);
 		if (EnteredDepot()) return true;
 		if (!CanExitOldTile()) return false;
@@ -114,7 +114,7 @@
 		if (IsRailTT() && GetTileType(m_new_tile) == MP_RAILWAY && IsPlainRailTile(m_new_tile)) {
 			m_new_td_bits = (TrackdirBits)(GetTrackBits(m_new_tile) * 0x101);
 		} else {
-			uint32 ts = GetTileTrackStatus(m_new_tile, TT());
+			uint32 ts = GetTileTrackStatus(m_new_tile, TT(), m_veh->u.road.compatible_roadtypes);
 			m_new_td_bits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
 		}
 		return (m_new_td_bits != TRACKDIR_BIT_NONE);
--- a/src/yapf/yapf.h	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf.h	Sat Jun 02 19:59:29 2007 +0000
@@ -20,7 +20,6 @@
  * @param v        the RV that needs to find a path
  * @param tile     the tile to find the path from (should be next tile the RV is about to enter)
  * @param enterdir diagonal direction which the RV will enter this new tile from
- * @param tracks   available tracks on the new tile (to choose from)
  * @return         the best trackdir for next turn or INVALID_TRACKDIR if the path could not be found
  */
 Trackdir YapfChooseRoadTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir);
@@ -29,8 +28,8 @@
  * @param v        the train that needs to find a path
  * @param tile     the tile to find the path from (should be next tile the train is about to enter)
  * @param enterdir diagonal direction which the RV will enter this new tile from
- * @param trackdirs available trackdirs on the new tile (to choose from)
- * @param no_path_found [out] true is returned if no path can be found (returned Trackdir is only a 'guess')
+ * @param tracks   available trackdirs on the new tile (to choose from)
+ * @param path_not_found [out] true is returned if no path can be found (returned Trackdir is only a 'guess')
  * @return         the best trackdir for next turn or INVALID_TRACKDIR if the path could not be found
  */
 Trackdir YapfChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool *path_not_found);
@@ -48,13 +47,13 @@
 Depot* YapfFindNearestRoadDepot(const Vehicle *v);
 
 /** Used when user sends train to the nearest depot or if train needs servicing.
- * @v            train that needs to go to some depot
- * @max_distance max distance (number of track tiles) from the current train position
+ * @param v            train that needs to go to some depot
+ * @param max_distance max distance (number of track tiles) from the current train position
  *                  (used also as optimization - the pathfinder can stop path finding if max_distance
  *                  was reached and no depot was seen)
- * @reverse_penalty penalty that should be added for the path that requires reversing the train first
- * @depot_tile   receives the depot tile if depot was found
- * @reversed     receives true if train needs to reversed first
+ * @param reverse_penalty penalty that should be added for the path that requires reversing the train first
+ * @param depot_tile   receives the depot tile if depot was found
+ * @param reversed     receives true if train needs to reversed first
  * @return       the true if depot was found.
  */
 bool YapfFindNearestRailDepotTwoWay(Vehicle *v, int max_distance, int reverse_penalty, TileIndex* depot_tile, bool* reversed);
--- a/src/yapf/yapf.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -7,6 +7,7 @@
 
 #include "track_dir.hpp"
 
+#include "../vehicle.h"
 #include "../depot.h"
 #include "../road_map.h"
 #include "../tunnel_map.h"
@@ -14,9 +15,9 @@
 #include "../bridge.h"
 #include "../station.h"
 #include "../station_map.h"
-#include "../vehicle.h"
 #include "../date.h"
 #include "../functions.h"
+#include "../landscape.h"
 #include "yapf.h"
 #include "../pathfind.h"
 #include "../waypoint.h"
--- a/src/yapf/yapf_base.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf_base.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -117,7 +117,8 @@
 		while (true) {
 			m_num_steps++;
 			Node *n = m_nodes.GetBestOpenNode();
-			if (n == NULL) break;
+			if (n == NULL)
+				break;
 
 			// if the best open node was worse than the best path found, we can finish
 			if (m_pBestDestNode != NULL && m_pBestDestNode->GetCost() < n->GetCostEstimate())
@@ -160,9 +161,9 @@
 	/** If path was found return the best node that has reached the destination. Otherwise
 	 *  return the best visited node (which was nearest to the destination).
 	 */
-	FORCEINLINE Node& GetBestNode()
+	FORCEINLINE Node* GetBestNode()
 	{
-		return (m_pBestDestNode != NULL) ? *m_pBestDestNode : *m_pBestIntermediateNode;
+		return (m_pBestDestNode != NULL) ? m_pBestDestNode : m_pBestIntermediateNode;
 	}
 
 	/** Calls NodeList::CreateNewNode() - allocates new node that can be filled and used
--- a/src/yapf/yapf_costrail.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf_costrail.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -121,7 +121,7 @@
 						Yapf().m_stopped_on_first_two_way_signal = true;
 						return -1;
 					}
-					SignalType sig_type = GetSignalType(tile);
+					SignalType sig_type = GetSignalType(tile, TrackdirToTrack(trackdir));
 					n.m_last_red_signal_type = sig_type;
 					n.flags_u.flags_s.m_last_signal_was_red = true;
 
--- a/src/yapf/yapf_destrail.hpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf_destrail.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -86,14 +86,35 @@
 public:
 	void SetDestination(Vehicle* v)
 	{
-		if (v->current_order.type == OT_GOTO_STATION) {
-			m_destTile = CalcStationCenterTile(v->current_order.dest);
-			m_dest_station_id = v->current_order.dest;
-			m_destTrackdirs = INVALID_TRACKDIR_BIT;
-		} else {
-			m_destTile = v->dest_tile;
-			m_dest_station_id = INVALID_STATION;
-			m_destTrackdirs = (TrackdirBits)(GetTileTrackStatus(v->dest_tile, TRANSPORT_RAIL) & TRACKDIR_BIT_MASK);
+		switch (v->current_order.type) {
+			case OT_GOTO_STATION:
+				m_destTile = CalcStationCenterTile(v->current_order.dest);
+				m_dest_station_id = v->current_order.dest;
+				m_destTrackdirs = INVALID_TRACKDIR_BIT;
+				break;
+
+			case OT_GOTO_WAYPOINT: {
+				Waypoint *wp = GetWaypoint(v->current_order.dest);
+				if (wp == NULL) {
+					/* Invalid waypoint in orders! */
+					DEBUG(yapf, 0, "Invalid waypoint in orders == 0x%04X (train %d, player %d)", v->current_order.dest, v->unitnumber, (PlayerID)v->owner);
+					break;
+				}
+				m_destTile = wp->xy;
+				if (m_destTile != v->dest_tile) {
+					/* Something is wrong with orders! */
+					DEBUG(yapf, 0, "Invalid v->dest_tile == 0x%04X (train %d, player %d)", v->dest_tile, v->unitnumber, (PlayerID)v->owner);
+				}
+				m_dest_station_id = INVALID_STATION;
+				m_destTrackdirs = TrackToTrackdirBits(AxisToTrack(GetWaypointAxis(wp->xy)));
+				break;
+			}
+
+			default:
+				m_destTile = v->dest_tile;
+				m_dest_station_id = INVALID_STATION;
+				m_destTrackdirs = (TrackdirBits)(GetTileTrackStatus(v->dest_tile, TRANSPORT_RAIL, 0) & TRACKDIR_BIT_MASK);
+				break;
 		}
 		CYapfDestinationRailBase::SetDestination(v);
 	}
--- a/src/yapf/yapf_rail.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf_rail.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -61,11 +61,11 @@
 
 		// some path found
 		// get found depot tile
-		Node& n = Yapf().GetBestNode();
-		*depot_tile = n.GetLastTile();
+		Node *n = Yapf().GetBestNode();
+		*depot_tile = n->GetLastTile();
 
 		// walk through the path back to the origin
-		Node* pNode = &n;
+		Node *pNode = n;
 		while (pNode->m_parent != NULL) {
 			pNode = pNode->m_parent;
 		}
@@ -128,7 +128,7 @@
 
 		// if path not found - return INVALID_TRACKDIR
 		Trackdir next_trackdir = INVALID_TRACKDIR;
-		Node* pNode = &Yapf().GetBestNode();
+		Node *pNode = Yapf().GetBestNode();
 		if (pNode != NULL) {
 			// path was found or at least suggested
 			// walk through the path back to the origin
@@ -165,7 +165,7 @@
 
 		// path was found
 		// walk through the path back to the origin
-		Node* pNode = &Yapf().GetBestNode();
+		Node *pNode = Yapf().GetBestNode();
 		while (pNode->m_parent != NULL) {
 			pNode = pNode->m_parent;
 		}
--- a/src/yapf/yapf_road.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf_road.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -268,14 +268,14 @@
 		// our source tile will be the next vehicle tile (should be the given one)
 		TileIndex src_tile = tile;
 		// get available trackdirs on the start tile
-		uint ts = GetTileTrackStatus(tile, TRANSPORT_ROAD);
+		uint ts = GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
 		TrackdirBits src_trackdirs = (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
 		// select reachable trackdirs only
 		src_trackdirs &= DiagdirReachesTrackdirs(enterdir);
 
 		// get available trackdirs on the destination tile
 		TileIndex dest_tile = v->dest_tile;
-		uint dest_ts = GetTileTrackStatus(dest_tile, TRANSPORT_ROAD);
+		uint dest_ts = GetTileTrackStatus(dest_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
 		TrackdirBits dest_trackdirs = (TrackdirBits)(dest_ts & TRACKDIR_BIT_MASK);
 
 		// set origin and destination nodes
@@ -287,7 +287,7 @@
 
 		// if path not found - return INVALID_TRACKDIR
 		Trackdir next_trackdir = INVALID_TRACKDIR;
-		Node* pNode = &Yapf().GetBestNode();
+		Node *pNode = Yapf().GetBestNode();
 		if (pNode != NULL) {
 			// path was found or at least suggested
 			// walk through the path back to its origin
@@ -320,7 +320,7 @@
 
 		// set destination tile, trackdir
 		//   get available trackdirs on the destination tile
-		uint dest_ts = GetTileTrackStatus(dst_tile, TRANSPORT_ROAD);
+		uint dest_ts = GetTileTrackStatus(dst_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
 		TrackdirBits dst_td_bits = (TrackdirBits)(dest_ts & TRACKDIR_BIT_MASK);
 		Yapf().SetDestination(dst_tile, dst_td_bits);
 
@@ -329,7 +329,7 @@
 
 		// if path not found - return distance = UINT_MAX
 		uint dist = UINT_MAX;
-		Node* pNode = &Yapf().GetBestNode();
+		Node *pNode = Yapf().GetBestNode();
 		if (pNode != NULL) {
 			// path was found or at least suggested
 			// get the path cost estimate
@@ -345,7 +345,7 @@
 		// set origin (tile, trackdir)
 		TileIndex src_tile = v->tile;
 		Trackdir src_td = GetVehicleTrackdir(v);
-		if ((GetTileTrackStatus(src_tile, TRANSPORT_ROAD) & TrackdirToTrackdirBits(src_td)) == 0) {
+		if ((GetTileTrackStatus(src_tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes) & TrackdirToTrackdirBits(src_td)) == 0) {
 			// sometimes the roadveh is not on the road (it resides on non-existing track)
 			// how should we handle that situation?
 			return false;
@@ -371,8 +371,8 @@
 
 		// some path found
 		// get found depot tile
-		Node& n = Yapf().GetBestNode();
-		TileIndex depot_tile = n.m_segment_last_tile;
+		Node *n = Yapf().GetBestNode();
+		TileIndex depot_tile = n->m_segment_last_tile;
 		assert(IsTileDepotType(depot_tile, TRANSPORT_ROAD));
 		Depot* ret = GetDepotByTile(depot_tile);
 		return ret;
@@ -438,7 +438,7 @@
 {
 	TileIndex tile = v->tile;
 	Trackdir trackdir = GetVehicleTrackdir(v);
-	if ((GetTileTrackStatus(tile, TRANSPORT_ROAD) & TrackdirToTrackdirBits(trackdir)) == 0)
+	if ((GetTileTrackStatus(tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes) & TrackdirToTrackdirBits(trackdir)) == 0)
 		return NULL;
 
 	// handle the case when our vehicle is already in the depot tile
--- a/src/yapf/yapf_ship.cpp	Tue Mar 27 23:27:27 2007 +0000
+++ b/src/yapf/yapf_ship.cpp	Sat Jun 02 19:59:29 2007 +0000
@@ -26,7 +26,7 @@
 	 *  and adds it to the open list by calling Yapf().AddNewNode(n) */
 	inline void PfFollowNode(Node& old_node)
 	{
-		TrackFollower F;
+		TrackFollower F(Yapf().GetVehicle());
 		if (F.Follow(old_node.m_key.m_tile, old_node.m_key.m_td))
 			Yapf().AddMultipleNodes(&old_node, F);
 	}
@@ -53,7 +53,7 @@
 		// convert origin trackdir to TrackdirBits
 		TrackdirBits trackdirs = TrackdirToTrackdirBits(trackdir);
 		// get available trackdirs on the destination tile
-		TrackdirBits dest_trackdirs = (TrackdirBits)(GetTileTrackStatus(v->dest_tile, TRANSPORT_WATER) & TRACKDIR_BIT_MASK);
+		TrackdirBits dest_trackdirs = (TrackdirBits)(GetTileTrackStatus(v->dest_tile, TRANSPORT_WATER, 0) & TRACKDIR_BIT_MASK);
 
 		// create pathfinder instance
 		Tpf pf;
@@ -61,13 +61,13 @@
 		pf.SetOrigin(src_tile, trackdirs);
 		pf.SetDestination(v->dest_tile, dest_trackdirs);
 		// find best path
-		bool bFound = pf.FindPath(v);
+		pf.FindPath(v);
 
 		Trackdir next_trackdir = INVALID_TRACKDIR; // this would mean "path not found"
-		if (bFound) {
-			// path was found
+
+		Node* pNode = pf.GetBestNode();
+		if (pNode != NULL) {
 			// walk through the path back to the origin
-			Node* pNode = &pf.GetBestNode();
 			Node* pPrevNode = NULL;
 			while (pNode->m_parent != NULL) {
 				pPrevNode = pNode;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/zoom.hpp	Sat Jun 02 19:59:29 2007 +0000
@@ -0,0 +1,50 @@
+/* $Id$ */
+
+/** @file zoom.hpp */
+
+#ifndef ZOOM_HPP
+#define ZOOM_HPP
+
+enum ZoomLevel {
+	/* Our possible zoom-levels */
+	ZOOM_LVL_NORMAL = 0,
+	ZOOM_LVL_OUT_2X,
+	ZOOM_LVL_OUT_4X,
+	ZOOM_LVL_OUT_8X,
+	ZOOM_LVL_OUT_16X,
+	ZOOM_LVL_END,
+
+	/* Here we define in which zoom viewports are */
+	ZOOM_LVL_VIEWPORT = ZOOM_LVL_NORMAL,
+	ZOOM_LVL_NEWS     = ZOOM_LVL_NORMAL,
+	ZOOM_LVL_INDUSTRY = ZOOM_LVL_OUT_2X,
+	ZOOM_LVL_TOWN     = ZOOM_LVL_OUT_2X,
+	ZOOM_LVL_AIRCRAFT = ZOOM_LVL_NORMAL,
+	ZOOM_LVL_SHIP     = ZOOM_LVL_NORMAL,
+	ZOOM_LVL_TRAIN    = ZOOM_LVL_NORMAL,
+	ZOOM_LVL_ROADVEH  = ZOOM_LVL_NORMAL,
+	ZOOM_LVL_WORLD_SCREENSHOT = ZOOM_LVL_NORMAL,
+
+	ZOOM_LVL_DETAIL   = ZOOM_LVL_OUT_2X, //! All zoomlevels below or equal to this, will result in details on the screen, like road-work, ...
+
+	ZOOM_LVL_MIN      = ZOOM_LVL_NORMAL,
+	ZOOM_LVL_MAX      = ZOOM_LVL_OUT_16X,
+};
+
+extern ZoomLevel _saved_scrollpos_zoom;
+
+static inline int ScaleByZoom(int value, ZoomLevel zoom)
+{
+	if (zoom == ZOOM_LVL_NORMAL) return value;
+	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
+	return (zoom > ZOOM_LVL_NORMAL) ? value << izoom : value >> -izoom;
+}
+
+static inline int UnScaleByZoom(int value, ZoomLevel zoom)
+{
+	if (zoom == ZOOM_LVL_NORMAL) return value;
+	int izoom = (int)zoom - (int)ZOOM_LVL_NORMAL;
+	return (zoom > ZOOM_LVL_NORMAL) ? value >> izoom : value << -izoom;
+}
+
+#endif /* ZOOM_HPP */